diff --git a/design/FY2019/Li_ion_battery_model_images/Simple_vs_SAM.png b/design/FY2019/Li_ion_battery_model_images/Simple_vs_SAM.png new file mode 100644 index 00000000000..3e3d267d460 Binary files /dev/null and b/design/FY2019/Li_ion_battery_model_images/Simple_vs_SAM.png differ diff --git a/design/FY2019/Li_ion_battery_model_images/battery_temp_degradation.png b/design/FY2019/Li_ion_battery_model_images/battery_temp_degradation.png new file mode 100644 index 00000000000..6e97043b207 Binary files /dev/null and b/design/FY2019/Li_ion_battery_model_images/battery_temp_degradation.png differ diff --git a/design/FY2020/NFP Li_ion battery model.md b/design/FY2020/NFP Li_ion battery model.md new file mode 100644 index 00000000000..32a428354f4 --- /dev/null +++ b/design/FY2020/NFP Li_ion battery model.md @@ -0,0 +1,157 @@ +# Addition of Lithium-ion Battery Chemistry to the Energy Storage Module + +**Rohit Chintala**
+**Ben Polly**
+**Noel Merket** + +Original Date: July 2019
+Updated: August 2020 + +## Introduction + +The increasing need for decarbonization has resulted in a proliferation of buildings that have incorporated decentralized power production such as photovoltaic (PV) systems to meet their energy needs. Energy storage is a crucial element to consider for such buildings as storage makes it possible to balance energy generation and consumption, in addition to improving the interaction with the electricity grid. An accurate energy storage model thus becomes essential for several research and development activities pertaining to these buildings such as battery design and capacity, sizing of PV systems, building operation control strategies, load flexibility analysis, etc. [1]. EnergyPlus can serve as a valuable tool in this regard. However, there are key limitations in the current electrical storage model which need to be addressed. This document proposes a new feature that would enhance the capabilities of the storage model by improving its accuracy, and furthermore would make it applicable to a wider range of battery chemistries. + +## Justification for New Feature Proposal +From among the battery chemistries, Lithium-ion is becoming increasingly popular for use in storing renewable energy. Although, the initial costs are higher, lithium-ion batteries outperform competing technologies such as lead (Pb)-acid in terms of energy delivered and specific power. Furthermore, lithium-ion batteries may be more economical in the long run as they have longer cycle life and lower life cycle costs [2]. EnergyPlus doesn't have a storage model that can accurately simulate Li-ion battery chemistry. Having accurate models that predict various aggregate properties of the battery state allows energy modelers to make more informed decisions about selecting the right storage size and chemistry for the building under consideration. A brief summary of the limitation that exist in the current energy storage model and a description of the proposed model developed by SAM [3] is provided below. + +### Constant Charging and Discharging Efficiencies +The electrical storage module in EnergyPlus currently has two models – a Simple Energy Balance model and a Kinetic Battery model. The simple energy model treats the battery as a black-box and counts the energy that is added or removed from it using constant charging and discharging efficiencies. The state of charge $$(Q_{stor})$$ at time step $$t+\Delta t$$ can be written as follows: +$$Q_{stor}^{t+\Delta t} = Q_{stor}^t+P_{chg}\cdot \epsilon_{chg} \cdot \Delta t$$ +where $$P_{chg}$$ is the charging power, and $$\epsilon_{chg}$$ is the charging efficiency. In a more accurate model of a Li-ion battery, however, the charging efficiency is not constant but is dependent on its current state of charge and terminal voltage. Not accurately modeling the battery states or efficiencies results in discrepancies while computing the battery charging and discharging power. A comparison of the charging power required to charge the battery at a constant rate as computed by the simple energy balance model, and the proposed SAM model is shown in Figure 1. +![](Li_ion_battery_model_images/Simple_vs_SAM.png) +Figure 1: Charging power comparison between Simple Energy Model and SAM at constant C-rate. + + +### Kinetic Battery Model is not Suited for Li-ion +There are certain characteristics that are exhibited by batteries with Pb-acid chemistries that make them significantly different than others. One such property which makes them unique is the fact that a fraction of the total charge remains chemically bounded at any time. The bound charge must become available before it can be used [3]. The kinetic battery model which is employed by the EnergyPlus storage module assumes that the charge stored in the battery is divided into two tanks, an available charge tank and a bound-charge tank. Not all the charge that is currently stored in the battery is directly available to the load. The portion of the charge that is present in the bound-charge tank can supply electrons only to the available charge tank. +The kinetic battery model described above is more suitable for battery chemistries such as Pb-acid with slow chemical kinetics. Li-ion have batteries have much faster dynamics enabling them to be charged and discharged much more rapidly. The proposed model treats the battery as a single tank of charge, thereby representing Li-ion chemistry more accurately. + +### Battery Thermal Model + +The electrical storage module in EnergyPlus doesn't model the battery temperature. The thermal model captures the impact of the ambient conditions not only on the battery temperature, but also the amount of heat dissipated by the battery to the surroundings. Furthermore, battery temperature has a big impact on the charge capacity and the calendar degradation. The lifecylce of a battery can be maximized by maintaining the battery temperature at room temperature. There is a significant reduction in the battery lifetime when the temperature instead is much higher or lower than the room temperature. For example, Figure 2 below shows how the capacity degradation of a typical Li-ion cell under different ambient temperatures. The figures were generated using the Li-ion capacity degradation model developed by Smith et al. in [4]. In order to determine the best dispatch strategy that also maximizes the battery's lifespan, an accurate model of both the capacity and cycle degradation is required. But as is evident from the figure, not modeling the thermal effects causes significant discrepancies in the estimation of these battery states. +![](Li_ion_battery_model_images/battery_temp_degradation.png) +Figure 2: Charge degradation at various ambient temperatures. + +### Calendar and Cycle Degradation +There are two main mechanisms by which the battery capacity is reduced over its lifetime as listed below. +* Loss in cyclable Lithium due to the development of a solid-electrolyte interface (SEI) with time +* Mechanical damage to the negative electrode due to cycling + +The actual battery capacity can be modeled as the limiting value of these competing mechanisms [5] as shown in the equation below +$$Q_{max} = min(Q_{max}^{Li},Q_{max}^{neg})$$ +where $$Q_{max}$$ is the modeled battery capacity, and $$Q_{max}^{Li}$$ and $$Q_{max}^{neg}$$ are the capacities modeled due to the two mechanisms listed above. Each of the two mechanisms depend on several factors such as Depth of Discharge (DoD), number of cycles, battery temperature, calendar time, State of Charge (SoC) etc. The current cycle life model in EnergyPlus, however, does not take into consideration the different mechanisms by which the battery capacity fades. + +## Method and Approach + +This section briefly describes the theory of the proposed battery model, and the programming approach that can be used to implement it in EnergyPlus. + +### Battery Performance and Lifetime Model +The battery performance model is used to describe its aggregate properties which include terminal voltage, state of charge, and temperature at every time step of the simulation. The parameters of the model can be extracted from battery data-sheets. The terminal voltage $V_{term}$ is expressed as shown in the equation below. +$$V_{term} = V_0 - I_{bat}\cdot R - K(Q_{max}/Q - \int I_{bat}\cdot dt ) +a\cdot e^{-BI_{bat}dt}$$ +A description of the variables, and the constants and their values corresponding to a Li-ion cell in the equation above are shown in Tables 1 and 2. + +Table 1: Description of variables in the terminal voltage equation. +| Parameter (symbol) | Value | +| ------ | ------ | +| $$V_{term} (V)$$ | Terminal Voltage | +| $$Q_{max} (Ah)$$ | Battery Capacity | +| $$Q (Ah)$$ | Battery Charge| +| $$I_{bat}(A)$$ | Battery current | +| $$dt (hr)$$ | Time Step | + +Table 2: Parameters of the terminal voltage equation. +| Parameter (symbol) | Description |Value| +| ------ | ------ |------ | +| $$V_0$$ |Open Circuit Voltage |3.7348| +| $$R(\omega)$$ | Internal Resistance |0.09| +| $$K(V)$$ | Polarization Voltage|0.00876| +| $$a(V)$$ | Exponential Zone Amplitude |0.468| +| $$B(Ah)^{-1}$$ | Exponential Zone Time Constant Inverse |3.5294| + +The state of charge of the battery $Q_{bat}$ at time step $$k$$ is updated using the equation below +$$Q_{bat}(k) = Q_{bat}(k-1) + \left((I_{bat}\cdot V_{term})\cdot (1/1000)/E_{max} \right)$$ +where $$E_{max}$$ is the maximum capacity of the battery in $$kWh$$. + +The thermal model is generated by using an energy balance which takes into consideration the heat generated due to the internal resistance, the heat transferred to and from the surrounding, and the thermal storage of the battery and the casing. The output of interest is the battery temperature $$T_{bat}$$ and the equation governing its evolution with time is expressed in the equation below +$$dT_{bat}/dt = (hA(T_{out} - T_{bat}) + I_{bat}^2R)/(m\cdot C_p)$$ +where $$T_{out}$$ is the ambient temperature, and $m$ and $C_p$ are the mass and specific heat capacity of the battery. + +The lifetime model is adopted from the paper by Smith et.al [4]. The model predicts the battery capacity degradation with time and use. The maximum capacity is computed by taking into consideration two mechanisms as was described in the previous section, the loss of cyclable Lithium due to formation of SEI $$(Q_{max}^{Li}$$, and the mechanical damage of the negative electrode due to the charge/discharge cycles $$(Q_{max}^{neg})$$. The battery capacity due to each of the mechanisms is shown in the equations below. +$$Q_{max}^{Li} = d_0 \left[b_0 - b_1t^{1/2} - b_2N - b_3(1-exp(-t/\tau_{b_3})\right]$$ + +$$Q_{max}^{neg} = d_0 \left[c_0^2 - 2c_2c_0N\right]^{1/2}$$ +The parameters $d_0,b_1, b_2, b_3, c_0, c_2$ depend on several factors such as depth of discharge, state of charge, number of cycles etc. These relationships were determined by Smith et.al in [4]. The capacity at any point in time is the limiting value of the estimates from the two mechanisms as shown in the equation below. +$$Q_{max} = min(Q_{max}^{Li}, Q_{max}^{neg})$$ + +### Programming Approach +The System Advisor Model (SAM) already has a battery module based on the models described in the previous section. In order to incorporate this module in EnergyPlus, the battery model in SAM and all its dependencies can be imported into the third party library in EnergyPlus. The battery model and its dependencies are contained in two folders of the SAM repository, the 'ssc' folder and the 'shared' folder. The link to the github repository of the SAM model is below. + +https://github.com/nrel/ssc + +The following libraries from the SAM repository would be imported into EnergyPlus. +1. cmod_battery.h +2. common.h +3. core.h +4. lib_battery.h +5. lib_battery_dispatch.h +6. lib_battery_powerflow.h +7. lib_power_electronics.h +8. lib_resilience.h +9. lib_shared_inverter.h +10. lib_time.h +11. lib_util.h +12. lib_utility_rate.h +13. lib_weatherfile.h +14. 6par_newton.h + +A new class lifetime_calendar_t::runLithiumIonLifetimeModel has been programmed in the lib_battery module of SAM to model the capacity degradation of a lithium-ion battery based on the model described above by Smith et.al. [4]. The model outputs the updated capacity of the battery at every timestep taking into consideration the cycling history, state of charge, depth of discharge, and the ambient temperature to which the battery is exposed. + +The electrical storage model in EnergyPlus is present in the file ElectricPowerServiceManager.cc. The storage model in this file currently has just two cases corresponding to the simple battery model (simpleBucketStorage) and the Kinetic Battery Model (kiBaMBattery). By importing the aforementioned libraries from SAM, a more detailed and accurate capacity degaradation model for Lithium ion can be incorporated into EnergyPlus. + +## Inputs and Outputs +The inputs and outputs that would be required to incorporate the Li-ion battery performance and lifetime degradation models are shown below. + +### Inputs + +* Field: Name +* Availability schedule name +* Zone name +* Mass +* Effective specific heat capacity +* Effective conduction coefficient +* Number of battery modules in series +* Number of battery modules in parallel +* Initial fractional state of charge +* Module cut-off voltage +* Battery nominal capacity +* Battery usable capacity +* Real power max continuous +* Real power peak charging +* Real power peak discharging +* Nominal voltage + +### Outputs + +* Electric storage charge state +* Electric storage charge fraction +* Electric storage charge power +* Electric storage charge energy +* Electric storage discharge power +* Electric storage discharge energy +* Electric storage total current +* Electric storage total voltage +* Electric storage thermal loss rate +* Electric storage Thermal loss energy +* Electric storage temperature +* Electric storage degradation fraction +* Electric storage charge capacity +* Electric storage internal resistance + +## References + +- [1] Berrueta, Alberto, et al. "A comprehensive model for lithium-ion batteries: From the physical principles to an electrical model." Energy 144 (2018): 286-300. +- [2] Diouf, Boucar, and Ramchandra Pode. "Potential of lithium-ion batteries in renewable energy." Renewable Energy 76 (2015): 375-380 +- [3] DiOrio, Nicholas, et al. Technoeconomic modeling of battery energy storage in SAM. No. NREL/TP-6A20-64641. National Renewable Energy Lab.(NREL), Golden, CO (United States), 2015. +- [4] Smith, Kandler, et al. "Life prediction model for grid-connected Li-ion battery energy storage system." 2017 American Control Conference (ACC). IEEE, 2017 +- [5] Santhanagopalan, Shriram, et al. Design and analysis of large lithium-ion battery systems. Artech House, 2014. + diff --git a/design/FY2020/NFP-EnhancedOutdoorAirReporting.md b/design/FY2020/NFP-EnhancedOutdoorAirReporting.md new file mode 100644 index 00000000000..fd64c8053cc --- /dev/null +++ b/design/FY2020/NFP-EnhancedOutdoorAirReporting.md @@ -0,0 +1,732 @@ +Enhance Outdoor Air Reporting +================ + +**Jason Glazer and Mike Witte, GARD Analytics** + + - November 20, 2019 + - December 30, 2019 - added Outdoor Air Limiting Factor tables, new output variables, shortened some table title names, added at and above + minimum to Total Outdoor Air by Airloop table, added "time at minimum" and "time above minimum" and moved "time below minimum" to + a single table. + - January 23, 2020 - remove ACH (air changes per hour) tables and columns, remove minimum outdoor air during occupancy tables, + move and rename the required airflow rate based on 62.1 computed each timestep to Voz-dyn and the associated times, + added Time Above Zero When Unoccupied + - January 27, 2020 - changed "Dynamic Zone Outdoor Airflow - Voz-dyn" to "Dynamic Target Ventilation - Voz-dyn" + - April 16, 2020 - added Design Document portion + + +## Justification for New Feature ## + +Currently, users seeking to use EnergyPlus for LEED work need to document the use of Outdoor Air (OA) in their models. While +the current Outdoor Air Summary in EnergyPlus provides some information to help these users, it does not provide enough information. +Users often find it difficult to compare the OA delivered for proposed vs. baseline simulations, especially with economizers +and zone equipment. + +## Overview ## + +Specific tasks for this include: + +- Expand the scope of the OA Summary to include zone heating, ventilation and air conditioning (HVAC) equipment. + +- Add tracking and table outputs for the minimum requested OA flow in addition to the existing output for actual OA flow. + +- Track times when the delivered OA is less than the minimum requirement, and + +- Provide outputs at standard air density. + +An issue was started to gather further input on this topic: + +https://github.com/NREL/EnergyPlus/issues/5298 + +Which stated: + +> Users often find it difficult to compare the outdoor air delivered for proposed vs baseline simulations. The logical place to look +> is the Outdoor Air Summary Report and the component sizing report. The component sizing report shows the minimum outdoor air flow +> rates for Controller:OutdoorAir objects that have autosized OA flow rates, but there is no building total. But this would only +> cover air handlers, not zone equipment. OA flow rates show up in some other tables as well, but again, no building totals. +> The Outdoor Air Summary report has average and minimum OA flow rates during occupied hours listed by zone, reported as ACH. It +> would be helpful to add flow in CFM or m3/s to these tables, and to add a total row for the entire building. Economizers can +> cloud the issue as well. Is it useful to report what the minimum flows would be if the economizer was not operating? + +More than a dozen people who were known to regularly submit projects under LEED using EnergyPlus were specifically asked to comment on +the issue and provided comments: + +- The total minimum OA for the building needs to be compared between the Baseline and Proposed Case models. + +- The Controller:OutdoorAir component sizing summary only shows values if the min/max were autosized. If the user enters a hard value +the table is empty. The hard value should be reported as well when not autosized. + +- Include design (not including the economizer mode where OA may equal SA) and minimum (to check that area ventilation requirement is +modeled correctly if DCV is included) occupied ventilation by system (both zone level and air handlers) and a total for the building +in the Outdoor Air Summary report. + +- If it would make more sense, this information could be included in a new report. You could label the new report as ASHRAE 62 +Ventilation Summary, Mechanical Ventilation Summary, etc. + +- Thinking about tabular reports (hence forgetting about tables of hour versus month (weekends v weekends too) showing OA numbers), +I would say that two metrics would be useful: "total outdoor air volume (m3) for the run period, per zone and building" and "total +outdoor air volume when economizer is off." That would help see whether the deviation in absolute numbers are off because of economizer +or not. It would require setting a new output variable to keep track of OA only when econ isn't running, so annoying and probably +tedious but doable. + + + +## E-mail and Conference Call Conclusions ## + +No call yet + +## Approach ## + +The current report is shown below + +### Current Existing Report ### + +

Report: Outdoor Air Summary

+

For: Entire Facility

+

Timestamp: 2019-11-13 + 07:52:15

+Average Outdoor Air During Occupied Hours

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Average Number of OccupantsNominal Number of OccupantsZone Volume [ft3]Mechanical Ventilation [ACH]Infiltration [ACH]AFN Infiltration [ACH]Simple Ventilation [ACH]
SPACE1-1 9.50 11.00 8450.18 1.591 0.057 0.000 0.000
SPACE2-1 4.32 5.00 3648.94 2.921 0.057 0.000 0.000
SPACE3-1 9.50 11.00 8450.18 1.484 0.057 0.000 0.000
SPACE4-1 4.32 5.00 3648.94 3.098 0.057 0.000 0.000
SPACE5-1 17.27 20.00 15812.07 0.882 0.059 0.000 0.000
+Values shown for a single zone without multipliers +

+Minimum Outdoor Air During Occupied Hours

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Average Number of OccupantsNominal Number of OccupantsZone Volume [ft3]Mechanical Ventilation [ACH]Infiltration [ACH]AFN Infiltration [ACH]Simple Ventilation [ACH]
SPACE1-1 9.50 11.00 8450.18 0.030 0.000 0.000 0.000
SPACE2-1 4.32 5.00 3648.94 0.058 0.000 0.000 0.000
SPACE3-1 9.50 11.00 8450.18 0.028 0.000 0.000 0.000
SPACE4-1 4.32 5.00 3648.94 0.068 0.000 0.000 0.000
SPACE5-1 17.27 20.00 15812.07 0.016 0.000 0.000 0.000
+Values shown for a single zone without multipliers +

+ +After reviewing the original task as well as the input received issue #5298, the proposed updated Outdoor Air Summary report +will appear as shown below. + +### Proposed New Report ### + +

Report: Outdoor Air Summary

+

For: Entire Facility

+

Timestamp: 2019-11-13 + 07:52:15

+ +Mechanical Ventilation Parameters by Zone

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AirLoop NameAverage Number of OccupantsNominal Number of OccupantsZone Volume [ft3]Zone Area [ft2]Design Zone Outdoor Airflow - Voz [ft3/min]Minimum Dynamic Target Ventilation - Voz-dyn-min [ft3/min]
SPACE1-1Loop-1 0.00 0.00 0.00 0.00 0.00 0.00
SPACE2-1Loop-1 0.00 0.00 0.00 0.00 0.00 0.00
SPACE3-1Loop-1 0.00 0.00 0.00 0.00 0.00 0.00
SPACE4-1Loop-2 0.00 0.00 0.00 0.00 0.00 0.00
SPACE5-1Loop-2 0.00 0.00 0.00 0.00 0.00 0.00
Totals 0.00 0.00 0.00 0.00 0.00 0.00
+Zone values shown for a single zone without multipliers at standard air density. The Totals row includes zone multipliers. +

+ + +Total Outdoor Air by Zone

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Mechanical Ventilation [ft3]Natural Ventilation [ft3]Total Ventilation [ft3]Infiltration [ft3]Total Ventilation and Infiltration [ft3]Dynamic Target Ventilation - Voz-dyn [ft3]Time Below Voz-dyn [Hours]Time At Voz-dyn [Hours]Time Above Voz-dyn [Hours]Time Above Zero When Unoccupied [Hours]
SPACE1-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
SPACE2-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
SPACE3-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
SPACE4-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
SPACE5-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Totals 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
+Zone values shown for a single zone without multipliers at standard air density. The Totals row includes zone multipliers. +

+ +Average Outdoor Air During Occupancy by Zone - Flow Rates

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Mechanical Ventilation [ft3/min]Natural Ventilation [ft3/min]Total Ventilation [ft3/min]Infiltration [ft3/min]Total Ventilation and Infiltration [ft3/min]Dynamic Target Ventilation - Voz-dyn [ft3/min]Time Below Voz-dyn [Hours]Time At Voz-dyn [Hours]Time Above Voz-dyn [Hours]
SPACE1-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
SPACE2-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
SPACE3-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
SPACE4-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
SPACE5-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Totals 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
+Zone values shown for a single zone without multipliers at standard air density. The Totals row includes zone multipliers. +

+ + +Total Outdoor Air by Airloop

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Mechanical Ventilation [ft3]Sum Zone Dynamic Target Ventilation - Voz-sum-dyn [ft3]Time Below Voz-sum-dyn [Hours]Time At Voz-sum-dyn [Hours]Time Above Voz-sum-dyn [Hours]Time Above Zero When Unoccupied [Hours]
Loop-1 0.00 0.00 0.00 0.00 0.00 0.00
Loop-2 0.00 0.00 0.00 0.00 0.00 0.00
Totals 0.00 0.00 0.00 0.00 0.00 0.00
+Values shown at standard air density. Infiltration and natural ventilation are not included. +

+ + +Average Outdoor Air During Occupancy by Airloop

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Mechanical Ventilation [ft3/min]Sum Zone Dynamic Zone Outdoor Airflow - Voz-sum-dyn [ft3/min]Time Below Voz-sum-dyn [Hours]Time At Voz-sum-dyn [Hours]Time Above Voz-sum-dyn [Hours]
Loop-1 0.00 0.00 0.00 0.00 0.00
Loop-2 0.00 0.00 0.00 0.00 0.00
Totals 0.00 0.00 0.00 0.00 0.00
+Values shown at standard air density. Infiltration and natural ventilation are not included. +

+ + + +Times for Outdoor Air Limiting Factors During Occupancy

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
No Limiting Factor [hours]High Humidity [hours]Night Ventilation [hours]Economizer [hours]Demand Controlled Ventilation [hours]Exhaust Flow [hours]Limits and Scheduled Limits [hours]Demand Limiting [hours]Energy Management System [hours]
Loop-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Loop-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Totals 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
+

+ +Average Outdoor Air For Each Outdoor Air Limiting Factors During Occupancy

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
No Limiting Factor [ft3/min]High Humidity [ft3/min]Night Ventilation [ft3/min]Economizer [ft3/min]Demand Controlled Ventilation [ft3/min]Exhaust Flow [ft3/min]Limits and Scheduled Limits [ft3/min]Demand Limiting [ft3/min]Energy Management System [ft3/min]
Loop-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Loop-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Totals 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
+Values shown at standard air density. +

+ +## Testing/Validation/Data Sources ## + +Compare current outputs including the sum of timestep results to annual results shown in the new reports. + +## Input Output Reference Documentation ## + +Add a paragraph for each table describing the contents of the table as part of the section on Output:Table:SummaryReports. + +## Input Description ## + +No changes to input. + +## Outputs Description ## + +New output variables would include: + +- Zone time below minimum outdoor air +- Zone time at minimum outdoor air +- Zone time above minimum outdoor air +- Airloop limiting factor for outdoor air (0 to 9 corresponding to that table) + +Additional output varibles will be included that correspond to columns not already defined. + +The OutputDetailsAndExamples documentation includes a section on eplustbl.htm containing a +description and example of the Outdoor Air Summary which would be updated. + +## Engineering Reference ## + +No changes to the engineering reference are expected. + +## Example File and Transition Changes ## + +No changes to example files or transition files are expected. + +## References ## + +None. + +## Design Document ## + +To implement the updated outdoor air summary report the following will be done: + +- Update OutputReportPredefined::SetPredefinedTables() to remove unused portions of the old report, move the columns +from the old report to the new report, and add subtables and new columns to support the new version of the report. + +- Update OutputReportTabular::FillRemainingPredefinedEntries() to support the new report columns and remove unused columns +of results from the old report. + +- Update SystemReports::ReportMaxVentilationLoads() which calculates the OA mass flow rate for each zone for both zone +equipment and air loops. + +- Update DataZoneEquipment::CalcDesignSpecificationOutdoorAir() which is called by SingleDuct.cc::CalcOAMassFlow() +to support the new output columns. + +- Update MixedAir::CalcOAController to support the new output columns. + +Additional changes may be required to create the data needed for all the columns for the revised outdoor air summary +report subtables. + diff --git a/design/FY2020/NFP-ZoneAirTransferModel.md b/design/FY2020/NFP-ZoneAirTransferModel.md new file mode 100644 index 00000000000..cc7678294f7 --- /dev/null +++ b/design/FY2020/NFP-ZoneAirTransferModel.md @@ -0,0 +1,193 @@ +Zone Air Mass Flow Balance Improvement +===================================== + +**Bereket Nigusse, FSEC/UCF** + + - Original Date: January 19, 2021 + - Revision Date: January 22, 2021 + + +## Justification for New Feature ## + +ZoneAirMassFlowConservation is intended to balance airflows but current design is that the procedure adjusts zone mixing and/or infiltration flow rates. User that have complex air transfer models like grocery stores, restaurants, and some big box retailers need the ability to model actual air transfer and account for ventilation movement between spaces. In these cases, users want the infiltration, zone mixing, and exhaust fan flow rates to stay fixed at user specified flows, instead adjust the system return air to balance zone air flow. + +This new feature provides an alternative air flow balancing method that maintains the ZoneMixing flows at user specified flow rate to allow user preferred inter-zone air flows by adjusting the zone return air flows and in some cases by modifying user specified zone infiltration air flows. + +## E-mail and Conference Call Conclusions ## + +NA + +###Review comments and responses on Github####: + +@rraustad, Comment: +How are constant volume HVAC systems going to respond to these 2 cases? I assume OA will make up the difference between supply and return flow rates. What happens when there is no OA system? In that case the supply and return flows should match +@Nigusse, Response: +I am assuming that the two cases should work for constant volume and VAV systems and have to confirmed through testing. +Regarding "What happens when there is no OA system?", I have not thought enough if it needs a special treatment. One issue is that supply and return flows may not match for zones that has exhaust fan flow, ZoneMixing and Infiltration flows. You have to adjust either the supply, infiltration, or the return flows as needed. + +@mjwitte, Comment: +(1) For systems with no outdoor air, the existing return flow calculations force the return to match the corresponding supply flow for a given zone. This balance must be maintained. +(2) For constant volume systems, are you suggesting that the system flow could be increased by this? That's going to run up against the terminal unit max flow rate. +(3) For VAV systems, increasing the supply flow could cause temperature control problems. +@Nigusse, Response: +I suspected I may run into control problem when the supply air flow rates is altered. In some cases return air can be zero and we may not have other variable to change unless infiltration air flow rate is adjusted instead of supply air. In fact my original NFP draft was to adjust return air and infiltration to balance the flow while keeping the ZoneMixing object flow as specified and letting the control system deal with supply air flow rate. +I would rather adjust return and infiltration air flow rates to balance the system and let the control system determine the supply air flow rate. What do you think? @mjwitte +@mjwitte, Response: +That seems safer, but that question should be answered by those who are requesting this feature and the specific use cases that it will be applied to. +@Nigusse, Response: +OK, I will seek input from those requested the feature. + +@mjwitte, Comment: +What determines "maximum return air flow rate"? +How will this work when there are multiple return nodes (more than one AHU serving a zone)? +@Nigusse, Response: +I am thinking the maximum will be determined based on the the Node's maximum Mass Flow Rate and will use the same logic for all return nodes connected to the same zone. Not sure if this causes any problem. +@mjwitte, Response: +I don't think return nodes have a defined maximum mass flow rate, but I may be wrong. The only value that might be used would be the overall airloop design flow rate, which will defeat the purpose of this feature when it wants to set return flow > supply. +@Nigusse, Response: +My thought is it allows to set zone return flow > zone supply flow but the AirLoop overall return cannot be set > the overall airloop design flow rate. + +@mjwitte, Comment: +How does the proposed method model or give user control over transfer air? +@Nigusse, Response: +Users will specify transfer air using ZoneMixing objects and these flow rates remain the same. +@mjwitte, Response: +OK, but with this method, the ZoneMixing flows will occur no matter what the system flows are. It will be up to the user to schedule the ZoneMixing flows to match the HVAC system operation. +@Nigusse, Response: +Yes, that is my plan. + +@Nigusse, final comment: +I will update the NFP based on the feedback and seek input from those requested the feature. @mjwitte and @rraustad Thank you for your review and feedback. + + +## Overview ## + +This work will implement code changes that allow alternative approach of the zone air mass flow balance calculation method that does not alter the simple flow objects mass flow. The fundamental zone mass balance equation remains the same but what this feature requesting is which zone air mass flow component needs to be adjusted to guarantee zone air mass flow conservation. + +The zone mixing object flows will always remain at user specified values such that inter-zone air transfer is modeled based on user's preference only. + +## Approach ## + +Current zone air mass flow conservation equation is formulated to solve the following equation by adjusting the Zone Mixing flow, and zone infiltration flow sequentially. + + 0.0 = [m_{sup} - m_{exh} - m_{ret} + m_{zmreceiving} - m_{zmsource} + m_{inf}] + +where, +m_{sup} = Zone Supply Air Mass Flow Rate, [kg/s] +m_{exh} = Zone Exhaust Air Mass Flow Rate, [kg/s] +m_{ret} = Zone Return Air Mass Flow Rate, [kg/s] +m_{zmreceiving} = Zone Mixing Receiving Air Mass Flow Rate, [kg/s] +m_{zmsource} = Zone Mixing Source Air Mass Flow Rate, [kg/s] +m_{inf} = Zone Infiltration Air Mass Flow Rate, [kg/s] + +The existing procedure first attempts to solve the above equation by adjusting the Zone Mixing flow only and if that does not satisfy the above equation, then the user specified zone infiltration air flow rate is adjusted as needed. The zone infiltration air flow can be adjusted using two different methods depending user preference. The zone infiltration air flow adjusting method is a choice input field in the ZoneAirMassFlowConservation object. + +The requested feature will be implemented by adjusting the return air mass flow but the return air mass flow rate can be varied between the minimum value of zero and a maximum flow rate limited by the airloop design supply flow rate. Since varying the return air mass flow provides limited flexibility in achieving balanced flow for the range of practical applications, the zone air flow mass balance requires two different solution scenarios: one when the zone is under positive pressure and when the zone is under negative pressure. When the zone is under positive pressure, then the zone return air flow will be adjusted to balance the zone flow; whereas when the zone is under negative pressure zone infiltration air flow will be adjusted or increased. + +Solving the zone air flow mass balance equation for zone return air mass flow: + +m_{ret} = [m_{sup} - m_{exh} + m_{zmreceiving} - m_{zmsource} + m_{inf}] + +Depending on the sign of the value of return air mass flow rate calculated using the above equation two different cases that require different solution scheme are formulated: + +Case I: [m_{ret} >= 0.0] + + The zone is under positive pressure hence requires non-zero zone return air mass flow rate to balance the zone air flow. The return air flow rate will be adjusted within the bounds of 0 and a maximum zone return air flow rate that balance the zone air mass flow. The zone maximum return flow rate is determined by a check that the sum of zone return air flow of all the zones served does not exceed the design supply air flow rate of the air loop serving the zones. + +Case II: [m_{ret} < 0.0] + The zone is under negative pressure hence requires additional supply air or infiltration air is required to balance the zone air flow. There are two possibilities that can be considered: (A) increasing zone infiltration air flow or (B) increasing the zone supply air flow. + The preferred implementation approach is alternative IIA but both alternatives are presented for discussion. + + Alternative IIA: + In alternative IIA the infiltration air flow is increased proportionally and the return air mass flow rate will be reset to zero to balance zone air flow. + [m_{inf} += m_{ret};] + [m_{ret} = 0.0;] + + Alternative IIB: + In alternative IIB the supply air flow is increased proportionally and the return air mass flow rate will be reset to zero to balance zone air flow. + [m_{sup} += m_{ret};] + [m_{ret} = 0.0;] + + Alternative IIB may cause convergence problem that leads to exceeding maximum iteration limits or even missing the zone thermostat set-point because of fighting between the HVAC control and zone air mass balance flow adjustment. There could also be flow balancing problem when the HVAC system is scheduled off and the ZoneMixing or zone exhaust fan are active. + +The ZoneMixing objects air flows are always maintained at user specified values to allow user defined inter-zone air transfer. + + +## Testing/Validation/Data Sources ## + +(1) Any new subroutine(s) will have a unit test that validate that the subroutine is functioning properly. +(2) Verifies the zone air flow mass balance without altering user specified ZoneMixing object flows. + +## Input Output Reference Documentation ## + +This new feature will be implemented by adding a new choice key "AdjustZoneReturnFlow” to the existing input field "Adjust Zone Mixing For Zone Air Mass Flow Balance" in the ZoneAirMassFlowConservation object. + +The existing input field "Adjust Zone Mixing For Zone Air Mass Flow Balance" better be renamed to "Zone Air Mass Flow Balance Method" and the two existing choice keys needs to be renamed as well for clarity. For example the "Yes" choice key will be replaced with "AdjustZoneMixingFlow" and the "No" choice key with "None". See below modified ZoneAirMassFlowConservation object. + +## Input Description ## + +See modified "ZoneAirMassFlowConservation" object: + +ZoneAirMassFlowConservation, + \memo Enforces the zone air mass flow balance by adjusting zone mixing object and/or + \memo infiltration object mass flow rates. + \memo If either mixing or infiltration is active, then the zone air mass flow + \memo balance calculation will attempt to enforce conservation of mass for each zone. + \memo If mixing is "None" and infiltration is "None", then the zone air mass flow + \memo calculation defaults to assume self-balanced simple flow mixing and infiltration objects. + \unique-object + \min-fields 3 + A1, \field Zone Air Mass Flow Balance Method + \note If AdjutsZoneMixingFlow, Zone mixing object flow rates are adjusted to balance the zone air + \note mass flow and additional infiltration air flow may be added if required in order to balance + \note the zone air mass flow. + \note If AdjustZoneReturnFlow, zone return air mass flow is adjusted to balance the zone air flow + \note and additional infiltration air flow may be added if required in order to balance the zone + \note air mass flow. ZoneMixing objects air flow is always maintained at user specified value. + \type choice + \key AdjutsZoneMixingFlow + \key AdjustZoneReturnFlow + \key None + \default None + A2, \field Infiltration Balancing Method + \note This input field allows user to choose how zone infiltration flow is treated during + \note the zone air mass flow balance calculation. + \type choice + \key AddInfiltrationFlow + \key AdjustInfiltrationFlow + \key None + \default AddInfiltrationFlow + \note AddInfiltrationFlow may add infiltration to the base flow specified in the + \note infiltration object to balance the zone air mass flow. The additional infiltration + \note air mass flow is not self-balanced. The base flow is assumed to be self-balanced. + \note AdjustInfiltrationFlow may adjust the base flow calculated using + \note the base flow specified in the infiltration object to balance the zone air mass flow. If it + \note If no adjustment is required, then the base infiltration is assumed to be self-balanced. + \note None will make no changes to the base infiltration flow. + A3; \field Infiltration Balancing Zones + \note This input field allows user to choose which zones are included in infiltration balancing. + \note MixingSourceZonesOnly allows infiltration balancing only in zones which as source zones for mixing + \note which also have an infiltration object defined. + \note AllZones allows infiltration balancing in any zone which has an infiltration object defined. + \type choice + \key MixingSourceZonesOnly + \key AllZones + \default MixingSourceZonesOnly + +## Outputs Description ## + +No new output variables will be implemented. + +## Engineering Reference ## + +Will be updated as needed. + +## Example File and Transition Changes ## + +One new example file will be added to the test suite to demonstrate this feature is functioning properly. + +IDD change is required to add new choice key to an existing input field, and rename the input field and the key choices. Transition is required. + +## References ## + +NA diff --git a/design/FY2021/NFP-ZoneAirTransferModel.md b/design/FY2021/NFP-ZoneAirTransferModel.md new file mode 100644 index 00000000000..b7e354c3fb1 --- /dev/null +++ b/design/FY2021/NFP-ZoneAirTransferModel.md @@ -0,0 +1,446 @@ +Zone Air Mass Flow Balance Improvement +===================================== + +**Bereket Nigusse, FSEC/UCF** + + - Original Date: January 19, 2021 + - Revision Date: January 22, 2021 + - Revision Date: February 4, 2021 + - Revision Date: February 15, 2021 + +## Justification for New Feature ## + +ZoneAirMassFlowConservation is intended to balance airflows but current design is that the procedure adjusts zone mixing and/or infiltration flow rates. User that have complex air transfer models like grocery stores, restaurants, and some big box retailers need the ability to model actual air transfer and account for ventilation movement between spaces. In these cases, users want the infiltration, zone mixing, and exhaust fan flow rates to stay fixed at user specified flows, instead adjust the system return air to balance zone air flow. + +This new feature provides an alternative air flow balancing method that maintains the ZoneMixing flows at user specified flow rate to allow user preferred inter-zone air flows by adjusting the zone return air flows and in some cases by modifying user specified zone infiltration air flows. + +## E-mail and Conference Call Conclusions ## + +### E-mail Communication ### +Brent: +Here is my two cents to frame this. In the defect file, and the reference building restaurant example file there is a work-around that has been around for over a decade. I would like to see this project finally do the zone mass balancing needed to remove that work-around. There should be no need to add a dummy exhaust fan in the source zone, and no need to figure out a messy and confusing schedule for the balancing/unbalancing in the zone exhaust fan in the receiving zone. The input hack, which I developed way back in the day, doesn’t even work for VAV system, nor if the zone transfer air is larger than the exhaust fan flow. + +Bereket Response; +(1) The current zone air mass flow balance does not require dummy exhaust fan either in the source or receiving zone. What you need is specifying ZoneMixing object. +(2) The current zone air mass flow balance does not require schedule for the balancing/unbalancing in the zone exhaust fan in the receiving zone +(3) In general current zone air mass flow balance works better with VAV system but I have not tested the case with zone transfer air is larger than the exhaust fan flow. + +Mike: +Bereket, +Adjusting infiltration is one option, but what's really wanted here is reduced return flow from the dining room rather than increased infiltration to the dining room. + +Looking at the Engineering Ref section on Zone Air Mass Flow Conservation (see attached pages), +the last equation on the first page says that the dining return flow should be reduced to account for the mixing to the kitchen when ZoneAirmassFlowConservation is active. But it doesn't appear this is happening. mXR and mXS are the mixing flows for receiving and source. + +So, why isn't this happening? Looking at line 3979 in CalcZoneMassBalance there net mixing flow is included in the equation. +https://github.com/NREL/EnergyPlus/blob/0750c2009f67a3e05268b7ae7ab6cba8781826a7/src/EnergyPlus/ZoneEquipmentManager.cc#L3979-L3995 + + StdTotalReturnMassFlow = state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotInletAirMassFlowRate + ZoneMixingNetAirMassFlowRate - + (state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotExhaustAirMassFlowRate - state.dataZoneEquip->ZoneEquipConfig(ZoneNum).ZoneExhBalanced); + +So, maybe ZoneMixingNetAirMassFlowRate isn't getting set correctly? + +Yep, it's zero at this point, ZoneMixingNetAirMassFlowRate isn't set until line 4047 and only when +if (ZoneAirMassFlow.InfiltrationTreatment != NoInfiltrationFlow) is true + +If that's true, it should get set and then impact the return flow on the next time through the mass balance do loop? + +I'll stop here, but I think this needs to be fixed and/or new options added to ZoneAirmassFlowConservation to make this part work. And maybe getting this all to work correctly is "all" that's needed for this new feature. Not saying it will be easy . . . . + +Mike + +### Conference Call Conclusions ### +Bereket: +Presented the NFP. + +Mike: +Currently the infiltration treament method has three choices. But what is really needed in this feature is that balancing the zone air flow by adjusting the return air flow and also make sure that the current method is also working propoerly. + +Brent: +It would have been better if the zone air mass flow conservation control is applied zone by zone basis instead of global. + +Mike: +For now let's address current needs and only if budget allows zone by zone basis can be considered. + +Bereket: +I will update the NFP per toda's discussion and add design documentation as well. + + +###Review comments and responses on Github####: + +@rraustad, Comment: +How are constant volume HVAC systems going to respond to these 2 cases? I assume OA will make up the difference between supply and return flow rates. What happens when there is no OA system? In that case the supply and return flows should match +@Nigusse, Response: +I am assuming that the two cases should work for constant volume and VAV systems and have to confirmed through testing. +Regarding "What happens when there is no OA system?", I have not thought enough if it needs a special treatment. One issue is that supply and return flows may not match for zones that has exhaust fan flow, ZoneMixing and Infiltration flows. You have to adjust either the supply, infiltration, or the return flows as needed. + +@mjwitte, Comment: +(1) For systems with no outdoor air, the existing return flow calculations force the return to match the corresponding supply flow for a given zone. This balance must be maintained. +(2) For constant volume systems, are you suggesting that the system flow could be increased by this? That's going to run up against the terminal unit max flow rate. +(3) For VAV systems, increasing the supply flow could cause temperature control problems. +@Nigusse, Response: +I suspected I may run into control problem when the supply air flow rates is altered. In some cases return air can be zero and we may not have other variable to change unless infiltration air flow rate is adjusted instead of supply air. In fact my original NFP draft was to adjust return air and infiltration to balance the flow while keeping the ZoneMixing object flow as specified and letting the control system deal with supply air flow rate. +I would rather adjust return and infiltration air flow rates to balance the system and let the control system determine the supply air flow rate. What do you think? @mjwitte +@mjwitte, Response: +That seems safer, but that question should be answered by those who are requesting this feature and the specific use cases that it will be applied to. +@Nigusse, Response: +OK, I will seek input from those requested the feature. + +@mjwitte, Comment: +What determines "maximum return air flow rate"? +How will this work when there are multiple return nodes (more than one AHU serving a zone)? +@Nigusse, Response: +I am thinking the maximum will be determined based on the the Node's maximum Mass Flow Rate and will use the same logic for all return nodes connected to the same zone. Not sure if this causes any problem. +@mjwitte, Response: +I don't think return nodes have a defined maximum mass flow rate, but I may be wrong. The only value that might be used would be the overall airloop design flow rate, which will defeat the purpose of this feature when it wants to set return flow > supply. +@Nigusse, Response: +My thought is it allows to set zone return flow > zone supply flow but the AirLoop overall return cannot be set > the overall airloop design flow rate. + +@mjwitte, Comment: +How does the proposed method model or give user control over transfer air? +@Nigusse, Response: +Users will specify transfer air using ZoneMixing objects and these flow rates remain the same. +@mjwitte, Response: +OK, but with this method, the ZoneMixing flows will occur no matter what the system flows are. It will be up to the user to schedule the ZoneMixing flows to match the HVAC system operation. +@Nigusse, Response: +Yes, that is my plan. + +@Nigusse, final comment: +I will update the NFP based on the feedback and seek input from those requested the feature. @mjwitte and @rraustad Thank you for your review and feedback. + + +## Overview ## + +This work will implement code changes that allow alternative approach of the zone air mass flow balance calculation method that does not alter the simple flow objects mass flow. The fundamental zone mass balance equation remains the same but what this feature requesting is which zone air mass flow component needs to be adjusted to guarantee zone air mass flow conservation. + +The zone mixing object flows will always remain at user specified values such that inter-zone air transfer is modeled based on user's preference only. + +## Approach ## + +Current zone air mass flow conservation equation is formulated to solve the following equation by adjusting the Zone Mixing flow, and zone infiltration flow sequentially. + + 0.0 = [m_{sup} - m_{exh} - m_{ret} + m_{zmreceiving} - m_{zmsource} + m_{inf}] + +where, +m_{sup} = Zone Supply Air Mass Flow Rate, [kg/s] +m_{exh} = Zone Exhaust Air Mass Flow Rate, [kg/s] +m_{ret} = Zone Return Air Mass Flow Rate, [kg/s] +m_{zmreceiving} = Zone Mixing Receiving Air Mass Flow Rate, [kg/s] +m_{zmsource} = Zone Mixing Source Air Mass Flow Rate, [kg/s] +m_{inf} = Zone Infiltration Air Mass Flow Rate, [kg/s] + +The existing procedure first attempts to solve the above equation by adjusting the Zone Mixing flow only and if that does not satisfy the above equation, then the user specified zone infiltration air flow rate is adjusted as needed. The zone infiltration air flow can be adjusted using two different methods depending user preference. The zone infiltration air flow adjusting method is a choice input field in the ZoneAirMassFlowConservation object. + +The requested feature will be implemented by adjusting the return air mass flow but the return air mass flow rate can be varied between the minimum value of zero and a maximum flow rate limited by the airloop design supply flow rate. Since varying the return air mass flow provides limited flexibility in achieving balanced flow for the range of practical applications, the zone air flow mass balance requires two different solution scenarios: one when the zone is under positive pressure and when the zone is under negative pressure. When the zone is under positive pressure, then the zone return air flow will be adjusted to balance the zone flow; whereas when the zone is under negative pressure zone infiltration air flow will be adjusted or increased. + +Solving the zone air flow mass balance equation for zone return air mass flow: + +m_{ret} = [m_{sup} - m_{exh} + m_{zmreceiving} - m_{zmsource} + m_{inf}] + +Depending on the sign of the value of return air mass flow rate calculated using the above equation two different cases that require different solution scheme are formulated: + +Case I: [m_{ret} >= 0.0] + + The zone is under positive pressure hence requires non-zero zone return air mass flow rate to balance the zone air flow. The return air flow rate will be adjusted within the bounds of 0 and a maximum zone return air flow rate that balance the zone air mass flow. The zone maximum return flow rate is determined by the design supply air flow rate of the air loop serving the zones. + + For zone mixing objects serveing zones in a single airloop: + [m_{ret} <= min(m_{ret}, m_supply_design_airloop)] + + For zone mixing objects serveing zones in two or more airloops: + [m_{ret} <= min(m_{ret}, (m_{supply_design_airloop} - m_{airloopZoneMixingNetOutFlow}))] + + where, + [m_{airloopZoneMixingNetOutFlow}] = net outflow of zone mixing air flow from one airloop to another airloop, [kg/s]. + +Case II: [m_{ret} < 0.0] + The zone is under negative pressure hence requires additional supply air or infiltration air is required to balance the zone air flow. There are two possibilities that can be considered: (A) increasing zone infiltration air flow or (B) increasing the zone supply air flow. + The preferred implementation approach is alternative IIA but both alternatives are presented for discussion. + + Alternative IIA: + In alternative IIA the infiltration air flow is increased proportionally and the return air mass flow rate will be reset to zero to balance zone air flow. + [m_{inf} += m_{ret};] + [m_{ret} = 0.0;] + + The zone air infiltration rate will be determined based user selection from three infiltration treatment method available. + +The ZoneMixing objects air flows are always maintained at user specified values to allow user defined inter-zone air transfer. + +Furthermore, first the zone return air flow is estimated without the zone air infiltration term and then zone air infiltration terms is added to balance the zone air flow if needed as a second step. This approach gives the +option of balancing the zone air flow with return air flow adjustment only, or with little change to the user specified zone infiltration air flows. + +Proposed Approach Limitation: +For a case when a zone has exhaust fan flow, the zone has no user specified infiltration, and the HVAC system is off, then the zone air flow cannot be balanced unless the zone exhaust fan flow is less than the net zone mixing flow. + +## Testing/Validation/Data Sources ## + +(1) Any new subroutine(s) will have a unit test that validate that the subroutine is functioning properly. +(2) Verifies the zone air flow mass balance without altering user specified ZoneMixing object flows. + +## Input Output Reference Documentation ## + +This new feature will be implemented by adding a new choice key "AdjustZoneReturnFlow” to the existing input field "Adjust Zone Mixing For Zone Air Mass Flow Balance" in the ZoneAirMassFlowConservation object. + +The existing input field "Adjust Zone Mixing For Zone Air Mass Flow Balance" better be renamed to "Zone Air Mass Flow Balance Method" and the two existing choice keys needs to be renamed as well for clarity. For example the "Yes" choice key will be replaced with "AdjustZoneMixingFlow" and the "No" choice key with "None". See below modified ZoneAirMassFlowConservation object. + +## Input Description ## + +See modified "ZoneAirMassFlowConservation" object: + +ZoneAirMassFlowConservation, + \memo Enforces the zone air mass flow balance by either adjusting zone mixing object flow only, + \memo adjusting zone total return flow only, zone mixing and the zone total return flows, + \memo or adjusting the zone total return and zone mixing object flows. Zone infiltration flow air + \memo flow is increased or decreased depending user selection in the infiltration treatment method. + \memo If either of zone mixing or zone return flow adjusting methods or infiltration is active, + \memo then the zone air mass flow balance calculation will attempt to enforce conservation of + \memo mass for each zone. If flow balancing method is "None" and infiltration is "None", then the + \memo zone air mass flow calculation defaults to assume self-balanced simple flow mixing and + \memo infiltration objects. + \unique-object + \min-fields 3 + A1, \field Adjust Zone Mixing and Return For Air Mass Flow Balance + \note If "AdjustMixingOnly", zone mixing object flow rates are adjusted to balance the zone air mass + \note flow and zone infiltration air flow may be increased or decreased if required in order to balance + \note the zone air mass flow. If "AdjustReturnOnly", zone total return flow rate is adjusted to balance + \note the zone air mass flow and zone infiltration air flow may be increased or decreased if required + \note in order to balance the zone air mass flow. If "AdjustMixingThenReturn", first the zone mixing + \note objects flow rates are adjusted to balance the zone air flow, second zone total return flow rate + \note is adjusted and zone infiltration air flow may be increased or decreased if required in order to + \note balance the zone air mass flow. If "AdjustReturnThenMixing", first zone total return flow rate is + \note adjusted to balance the zone air flow, second the zone mixing object flow rates are adjusted and + \note infiltration air flow may be increased or decreased if required in order to balance the zone + \note air mass flow. + \type choice + \key AdjustMixingOnly + \key AdjustReturnOnly + \key AdjustMixingThenReturn + \key AdjustReturnThenMixing + \key None + \default None + A2, \field Infiltration Balancing Method + \note This input field allows user to choose how zone infiltration flow is treated during + \note the zone air mass flow balance calculation. + \type choice + \key AddInfiltrationFlow + \key AdjustInfiltrationFlow + \key None + \default AddInfiltrationFlow + \note AddInfiltrationFlow may add infiltration to the base flow specified in the + \note infiltration object to balance the zone air mass flow. The additional infiltration + \note air mass flow is not self-balanced. The base flow is assumed to be self-balanced. + \note AdjustInfiltrationFlow may adjust the base flow calculated using + \note the base flow specified in the infiltration object to balance the zone air mass flow. If it + \note If no adjustment is required, then the base infiltration is assumed to be self-balanced. + \note None will make no changes to the base infiltration flow. + A3; \field Infiltration Balancing Zones + \note This input field allows user to choose which zones are included in infiltration balancing. + \note MixingSourceZonesOnly allows infiltration balancing only in zones which as source zones for mixing + \note which also have an infiltration object defined. + \note AllZones allows infiltration balancing in any zone which has an infiltration object defined. + \type choice + \key MixingSourceZonesOnly + \key AllZones + \default MixingSourceZonesOnly + +## Outputs Description ## + +No new output variables will be implemented. + +## Engineering Reference ## + +Will be updated as needed. + +## Example File and Transition Changes ## + +One new example file will be added to the test suite to demonstrate this feature is functioning properly. + +IDD change is required to add new choice keys to an existing input field, and rename the input field and the key choices. Transition is required. + +## References ## + +NA + + +## Design Document ## + +This new feature revises modules: HeatBalanceManager, ZoneEquipmentManage, DataHeatBalance, and HeatBalanceAirManager. + + +### HeatBalanceManager ### + +The code change includes updating the GetProjectControlData() to allow new choice keys and renaming an existing input field and its choice keys. + + +#### Current Get Control Data: #### +{ + { + auto const SELECT_CASE_var(AlphaName(1)); + if (SELECT_CASE_var == "YES") { + ZoneAirMassFlow.BalanceMixing = true; + ZoneAirMassFlow.EnforceZoneMassBalance = true; + AlphaName(1) = "Yes"; + } else if (SELECT_CASE_var == "NO") { + ZoneAirMassFlow.BalanceMixing = false; + AlphaName(1) = "No"; + } else { + ZoneAirMassFlow.BalanceMixing = false; + AlphaName(1) = "No"; + ShowWarningError(state, CurrentModuleObject + ": Invalid input of " + cAlphaFieldNames(1) + ". The default choice is assigned = No"); + } + } + +} + +#### Proposed Get Control Data: #### + + - Replace choice key "Yes" with "AdjutsMixingOnly" + - Replace choice key "No" with "None" + - Add new choice key "AdjustReturnOnly" + - Add new choice key "AdjustMixingThenReturn" + - Add new choice key "AdjustReturnThenMixing" + + Sets the zone air mass flow conservation enforcing methods as follows: + +{ + auto const SELECT_CASE_var(AlphaName(1)); + if (SELECT_CASE_var == "ADJUSTMIXINGONLY") { + ZoneAirMassFlow.ZoneFlowAdjustment = AdjustMixingOnly; + ZoneAirMassFlow.EnforceZoneMassBalance = true; + AlphaName(1) = "AdjustMixingOnly"; + } else if (SELECT_CASE_var == "ADJUSTRETURNONLY") { + ZoneAirMassFlow.ZoneFlowAdjustment = AdjustReturnOnly; + ZoneAirMassFlow.EnforceZoneMassBalance = true; + AlphaName(1) = "AdjustReturnOnly"; + } else if (SELECT_CASE_var == "ADJUSTMIXINGTHENRETURN") { + ZoneAirMassFlow.ZoneFlowAdjustment = AdjustMixingThenReturn; + ZoneAirMassFlow.EnforceZoneMassBalance = true; + AlphaName(1) = "AdjustMixingThenReturn"; + } else if (SELECT_CASE_var == "ADJUSTRETURNTHENMIXING") { + ZoneAirMassFlow.ZoneFlowAdjustment = AdjustReturnThenMixing; + ZoneAirMassFlow.EnforceZoneMassBalance = true; + AlphaName(1) = "AdjustReturnThenMixing"; + } else if (SELECT_CASE_var == "NONE") { + ZoneAirMassFlow.ZoneFlowAdjustment = NoAdjustReturnAndMixing; + AlphaName(1) = "None"; + } else { + ZoneAirMassFlow.ZoneFlowAdjustment = NoAdjustReturnAndMixing; + AlphaName(1) = "None"; + ShowWarningError(state, CurrentModuleObject + ": Invalid input of " + cAlphaFieldNames(1) + ". The default choice is assigned = None"); + } +} + + +####DataHeatBalance### + +Add new member variable *ZoneFlowAdjustment* to ZoneAirMassFlowConservation struct. + +Added parameters for zone air flow mass balancing methods selection variables to DataHeatBalance module. + AdjustMixingOnly; + AdjustReturnOnly; + AdjustMixingThenReturn; + AdjustReturnThenMixing; + NoAdjustReturnAndMixing; + +### HeatBalanceAirManager ### + +The code revision includes updating the SetZoneMassConservationFlag() function to allow to reset flag variables for AdjustZoneReturnFlow method. + +The code revision includes updating allow zonemixing and infiltrtion flow report variables for the new method in GetSimpleAirModelInputs() function. + + +### ZoneEquipmentManage ### + +Most of code revisions are done in this module. The module code revision includes resetting either ZoneMassBalanceFlag() or AdjustZoneMassFlowFlag variable depending on the method for use with CalcAirFlowSimple() function. + +Do not allow the ZoneMixing object flow adjustment for the new method as shown in the proposed code snippet: + +##### Current Code: ##### + // Set zone mixing incoming mass flow rate + if ((Iteration == 0) || !ZoneAirMassFlow.BalanceMixing) { + ZoneMixingAirMassFlowRate = MixingMassFlowZone(ZoneNum); + } else { + ZoneMixingAirMassFlowRate = + max(0.0, + ZoneReturnAirMassFlowRate + state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotExhaustAirMassFlowRate - + state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotInletAirMassFlowRate + MassConservation(ZoneNum).MixingSourceMassFlowRate); + } + +##### Proposed Code: ##### + // Set zone mixing incoming mass flow rate + if ((Iteration == 0) || ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustReturnOnly || + ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustReturnThenMixing) { + ZoneMixingAirMassFlowRate = MixingMassFlowZone(ZoneNum); + } else { + ZoneMixingAirMassFlowRate = max(0.0, ZoneReturnAirMassFlowRate + TotExhaustAirMassFlowRate - + TotInletAirMassFlowRate + MassConservation(ZoneNum).MixingSourceMassFlowRate); + } + + + +##### Additional Proposed Code: ##### + if (ZoneAirMassFlow.EnforceZoneMassBalance) { + + if (ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustMixingOnly || + ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustMixingThenReturn) { + + if (ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustMixingThenReturn) { + + } + // Set zone infiltration air flow rate + CalcZoneInfiltrationFlows(state, ZoneNum, ZoneReturnAirMassFlowRate); + + } else if (ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustReturnOnly || + ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustReturnThenMixing) { + + if (ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustReturnThenMixing) { + + } + // Set zone infiltration air flow rate + CalcZoneInfiltrationFlows(state, ZoneNum, ZoneReturnAirMassFlowRate); + } else { + // if infiltration treatment method is not None + // Set zone infiltration air flow rate + CalcZoneInfiltrationFlows(state, ZoneNum, ZoneReturnAirMassFlowRate); + } + } + +##### Refactoring Current Code: ##### + +// this require refactoring the existing infiltration flow update code section in new function CalcZoneInfiltrationFlows() as follows: + + void CalcZoneInfiltrationFlows(EnergyPlusData &state, + int const ZoneNum, // current zone index + Real64 &ZoneReturnAirMassFlowRate // zone total zone return air mass flow rate + ) + { + + } + + +##### Modify CalcZoneReturnFlows() Code: ##### + +This function will be revised: + - reset the return air flow rate calculated using the air flow mass balance + + +##### Refactoring Current Code: ##### + +- add a check that the return air flow rate does not exceed the air loop supply design flow rate. +- adds a new function that returns the design supply of the airloop that contains the zone + + void ZoneReturnFlowsMaximum(EnergyPlusData &state, int const ZoneNum, + Real64 &MaximumZoneReturnMassFlow // maximum zone total return air mass flow rate + ) + { + MaximumZoneReturnMassFlow = 0.0; + // sets the zone return node maximum flow rate to the airloop design supply flow rate + for (int returnNum = 1; returnNum <= state.dataZoneEquip->ZoneEquipConfig(ZoneNum).NumReturnNodes; ++returnNum) { + int airLoop = state.dataZoneEquip->ZoneEquipConfig(ZoneNum).ReturnNodeAirLoopNum(returnNum); + if (airLoop > 0) { + auto &thisAirLoopFlow(state.dataAirLoop->AirLoopFlow(airLoop)); + MaximumZoneReturnMassFlow = thisAirLoopFlow.DesSupply; + } + } + } + + \ No newline at end of file diff --git a/doc/engineering-reference/src/integrated-solution-manager/zone-air-mass-flow-conservation.tex b/doc/engineering-reference/src/integrated-solution-manager/zone-air-mass-flow-conservation.tex index 0336388be5b..bb2a4b9ccf2 100644 --- a/doc/engineering-reference/src/integrated-solution-manager/zone-air-mass-flow-conservation.tex +++ b/doc/engineering-reference/src/integrated-solution-manager/zone-air-mass-flow-conservation.tex @@ -38,6 +38,8 @@ \subsubsection{Base Zone Total Return Flow}\label{base-zone-total-return-flow} {\dot m_{R}} = MAX\left( {0.0,\,{{\dot m}_S} - [{{\dot m}_{EX,tot}} - {\dot m_{EXF,bal}}] + [{{\dot m}_{XR}} - {{\dot m}_{XS}}]} \right) \end{equation} +Note that the exhaust fan balanced flow component is not required to enforce the zone air flow balance when ZoneAirMassFlowConservation is active. + \subsubsection{Zone Return Air Node 1}\label{zone-return-air-node1} The first return air node is treated differently to maintain backward compatibility. If one or more Zone Return Air Node 1 Flow Rate Basis Nodes are specified in the ZoneHVAC:EquipmentConnections object, then the mass flow rate for the first return air node is: @@ -52,6 +54,13 @@ \subsubsection{Zone Return Air Node 1}\label{zone-return-air-node1} {\dot m_{R,1}} = ReturnFlowSchedule*{\dot m_{R}} \end{equation} +The zone air mass flow conservation calculation limits the zone the return node air flow rate with air loop design supply to protect from large number the solution may throw as follows: + +\begin{equation} +{\dot m_{R,1}} = MIN\left( {{\dot m_{R,1}},\,{{\dot m}_{DesSupply,i}}} \right) +\end{equation} + + \subsubsection{Allocation to Multiple Return Nodes}\label{allocation-to-multiple-return-nodes} If there are multiple return air nodes in the zone, then each return air node is assumed to be paired with one supply air inlet node. The initial flow rate at a given return air node is based on the supply air inlet node for the same airloop and the AirloopHVAC Design Return Air Flow Fraction of Supply Air Flow: @@ -66,6 +75,12 @@ \subsubsection{Allocation to Multiple Return Nodes}\label{allocation-to-multiple {\dot m_{R,i}} = {\dot m_{R,i}} \end{equation} +The zone air mass flow conservation calculation limits the zone the return node air flow rate with air loop design supply to protect from large number the solution may throw as follows: + +\begin{equation} +{\dot m_{R,1}} = MIN\left( {{\dot m_{R,1}},\,{{\dot m}_{DesSupply, AirLoop}}} \right) +\end{equation} + \subsubsection{Overall Return Air Balance}\label{overall-return-air-balance} Once the initial allocation to multiple return air nodes is complete, the total return node flow is compared with the expected total zone return air mass flow rate. If the sum of the zone return node flows is greater than expected, then the surplus return flow is: @@ -138,6 +153,8 @@ \subsubsection{Allocation of Excess Exhaust Flow}\label{allocation-of-excess-exh \(\dot m_{AdjReturn,i}\) = total adjusted return flow for air loop i +\(\dot m_{DesSupply,i}\) = air loop design supply air flow for air loop i + \subsection{Zone Mixing Flow Rate Calculations}\label{zone-mixing-flow-rate-calculations} Figure~\ref{fig:illustration-of-zone-air-mass-flow-balance} illustrates the zone mass flow components for an air loop system providing conditioned air to the two zones connected with a zone mixing object. Since Zone 1 is a source zone only, infiltration object is defined for zone 1 only. The zone mixing object air flow rate depends on the user specified values and the zone air mass flow balance requirements. When required the zone mixing object flow rate is adjusted from the user specified value for balancing purpose. @@ -154,7 +171,18 @@ \subsection{Zone Mixing Flow Rate Calculations}\label{zone-mixing-flow-rate-calc {\dot m_{XS}} = \sum\nolimits_j {{{\dot m}_{XS,j}}} \end{equation} -Determine the zone return air mass flow rate as shown above, then adjust the zone mixing mass flow rates based on the current zone return air mass flow rate: +Similarly, the receiving zone mixing mass flow rate is calculated by tracking the mass flow rates of ZoneMixing objects connected to a receiving zone and is given by: + +\begin{equation} +{\dot m_{XR}} = \sum\nolimits_j {{{\dot m}_{XR,j}}} +\end{equation} + +Zone air mass flow balance can be enforced using four options: \textit{AdjustMixingOnly}, \textit{AdjustReturnOnly}, \textit{AdjustMixingThenReturn}, or \textit{AdjustReturnThenMixing}. These options involve either adjusting zone mixing objects flows, adjusting the zone total return air flows, or a +combination of both. The zone air mass flow balance equation formulation is described next for each of the four options. + +\textbf{AdjustMixingOnly:} adjusts the zone mixing object flows only to enforce zone air mass flow balance and the adjusted zone mixing mass flow rates are used to determine the zone total return air mass flow rate. Infiltration air flow can also adjusted if required depending on user preference as specified in Section \textit{Infiltration Flow rates Adjustments}. + +Determine the zone total return air mass flow rate as shown above, then adjust the zone mixing mass flow rates based on the zone total return air mass flow rate: \begin{equation} {\dot m_{XR,\,new}} = {\dot m_R} + {\dot m_{EX}} + {\dot m_{XS}} - {\dot m_S} @@ -166,6 +194,32 @@ \subsection{Zone Mixing Flow Rate Calculations}\label{zone-mixing-flow-rate-calc {\dot m_{XR,\,new,j}} = \left( {{{\dot m}_{XR,jDesign}}/{{\dot m}_{XR,Design}}} \right) \cdot {\dot m_{XR,\,new}} \end{equation} +\textbf{AdjustReturnOnly:} adjusts the zone total return air mass flow rate only to enforce zone air mass flow balance while the zone mixing object mass flow rate are kept at user specified values. Infiltration air flow can also adjusted if required depending on user preference as specified in Section \textit{Infiltration Flow rates Adjustments}. + +First, determine the user specified mixing object received and source air flow rates of the current zone, then determine the zone total return air flow rate as follows: + +\begin{equation} +{\dot m_{XS}} = \sum\nolimits_j {{{\dot m}_{XS,j}}} +\end{equation} + +\begin{equation} +{\dot m_{XR}} = \sum\nolimits_j {{{\dot m}_{XR,j}}} +\end{equation} + +If ZoneAirMassFlowConservation is active, then determine the total zone return air flow rate: +\begin{equation} +{\dot m_{R}} = MAX\left( {0.0,\,{{\dot m}_S} - {{\dot m}_{EX,tot}} + [{{\dot m}_{XR}} - {{\dot m}_{XS}}]} \right) +\end{equation} + +Also checks that the zone total return air mass flow rate does not exceed the airloop design supply flow rate as follows: +\begin{equation} +{\dot m_{R}} = MIN\left( {{\dot m_{R}},\,{{\dot m}_{DesSupply,i}}} \right) +\end{equation} + +\textbf{AdjustMixingThenReturn:} first adjusts the zone mixing air mass flow rates, then adjusts the zone total return air mass flow rate to enforce zone air mass flow balance. Infiltration air flow can also adjusted if required depending on user preference as specified in section \textit{Infiltration Flow rates Adjustments}. For adjusting the mixing mass flow rates the set of equations for \textit{AdjustMixingOnly} method described above are used and for adjusting the zone total return air mass flow rate the equation for \textit{AdjustReturnOnly} method is used. + +\textbf{AdjustReturnThenMixing:} first adjusts the zone total return air mass flow rate, then adjusts the zone mixing mass flow rates to enforce zone air mass flow balance. Infiltration air flow can also adjusted if required depending on user preference as specified in section \textit{Infiltration Flow rates Adjustments}. For adjusting the zone total return air mass flow rates the equations for \textit{AdjustReturnOnly} method described above is used and for adjusting the zone mixing mass flow rates the set of equations for \textit{AdjustMixingOnly} method are used. + \subsection{Infiltration Flow Rate Adjustments}\label{infiltration-flow-rate-adjustments} There are three options for the treatement of infiltration in the zone air mass balance: None, AddInfiltrationFlow, and AdjustInfiltrationFlow. There are also two options to specify which zones are included in the infiltration adjustments: AllZones or MixingSourceZonesOnly. @@ -175,7 +229,7 @@ \subsection{Infiltration Flow Rate Adjustments}\label{infiltration-flow-rate-adj If a zone is included in the infiltration adjustment, the infiltration air mass flow rate required to balance the zone is determined as follows: \begin{equation} -{\dot m_{Inf-required}} = MAX\left( {0.0,\,{{\dot m}_{XS}} + {{\dot m}_{EX}} + {{\dot m}_{R}} - {{\dot m}_S}} \right) +{\dot m_{Inf-required}} = MAX\left( {0.0,\,{{\dot m}_{XS}} + {{\dot m}_{EX}} + {{\dot m}_{R}} - {{\dot m}_S} - {\dot m_{XR,\,new}}} \right) \end{equation} This infiltration air mass flow rate calculated is either added to the base infiltration air flow, which is calculated from user inputs, or overrides the base infiltration air flow depending on user choice. For AddInfiltrationFlow, the zoneinfiltration flow rate is: diff --git a/doc/input-output-reference/src/overview/group-air-distribution.tex b/doc/input-output-reference/src/overview/group-air-distribution.tex index 8665c2c0388..26b136c29cd 100644 --- a/doc/input-output-reference/src/overview/group-air-distribution.tex +++ b/doc/input-output-reference/src/overview/group-air-distribution.tex @@ -160,6 +160,56 @@ \subsubsection{Outputs}\label{outputs-1-001} Reports the air changes per hour in the zone due to the outside fresh air supplied by mechanical ventilation system. +\paragraph{Zone Target Voz Ventilation Flow Rate {[}m3/s{]}}\label{zone-target-voz-ventilation-flow-rate} +The target ventilation flow rate \(V_{oz-dyn}\) at standard density at the current timestep as defined by the zone Design Specification Outdoor Air Object (\hyperref[designspecificationoutdoorair]{DesignSpecification:OutdoorAir}). + +\paragraph{Zone Ventilation Below Target Voz Time {[}hr{]}}\label{zone-ventilation-below-target-voz-time} +The time that the zone total ventilation rate (mechanical ventilation plus natural ventilation) is more than 1\% below the \emph{Zone Target Voz Ventilation Flow Rate}. + +\paragraph{Zone Ventilation At Target Voz Time {[}hr{]}}\label{zone-ventilation-at-target-voz-time} +The time that the zone total ventilation rate (mechanical ventilation plus natural ventilation) is within 1\% of the \emph{Zone Target Voz Ventilation Flow Rate}. + +\paragraph{Zone Ventilation Above Target Voz Time {[}hr{]}}\label{zone-ventilation-above-target-voz-time} +The time that the zone total ventilation rate (mechanical ventilation plus natural ventilation) is more than 1\% above the \emph{Zone Target Voz Ventilation Flow Rate}. + +\paragraph{Zone Ventilation When Unoccupied Time {[}hr{]}}\label{zone-ventilation-when-unoccupied-time} +The time that the zone total ventilation rate (mechanical ventilation plus natural ventilation) is greater than zero when the zone is unoccupied. + +\paragraph{Facility Any Zone Ventilation Below Target Voz Time {[}hr{]}}\label{facility-any-zone-ventilation-below-target-voz-time} +The time that any zone's total ventilation rate (mechanical ventilation plus natural ventilation) is more than 1\% below the \emph{Zone Target Voz Ventilation Flow Rate}. + +\paragraph{Facility All Zones Ventilation At Target Voz Time {[}hr{]}}\label{facility-all-zones-ventilation-at-target-voz-time} +The time that every zone's total ventilation rate (mechanical ventilation plus natural ventilation) is within 1\% of the \emph{Zone Target Voz Ventilation Flow Rate}. + +\paragraph{Facility Any Zone Ventilation Above Target Voz Time {[}hr{]}}\label{facility-any-zone-ventilation-above-target-voz-time} +The time that any zone's total ventilation rate (mechanical ventilation plus natural ventilation) is more than 1\% above the \emph{Zone Target Voz Ventilation Flow Rate}. + +\paragraph{Facility Any Zone Ventilation When Unoccupied Time {[}hr{]}}\label{facility-any-zone-ventilation-when-unoccupied-time} +The time that any zone's total ventilation rate (mechanical ventilation plus natural ventilation) is greater than zero when the zone is unoccupied. + +\paragraph{Air System Mechanical Ventilation Flow Rate {[}m3/s{]}}\label{air-system-mechanical-ventilation-flow-rate} +The current airloop mechanical ventilation flow rate at standard density. + +\paragraph{Air System Natural Ventilation Flow Rate {[}m3/s{]}}\label{air-system-natural-ventilation-flow-rate} +The sum of the natural ventilation flow rate at standard density at the current timestep for each zone on the airloop. If any zone terminal unit has a Design Specification Air Terminal Sizing Object (\hyperref[designspecificationairterminalsizing]{DesignSpecification:AirTerminal:Sizing}) then the natural ventilation rate for that zone is scaled by the Fraction of Minimum Outdoor Air Flow value. + +\paragraph{Air System Target Voz Ventilation Flow Rate {[}m3/s{]}}\label{air-system-target-voz-ventilation-flow-rate} +The sum of the target ventilation flow rates \(V_{oz-dyn}\) at standard density at the current timestep for each zone on the airloop. If any zone terminal unit has a Design Specification Air Terminal Sizing Object (\hyperref[designspecificationairterminalsizing]{DesignSpecification:AirTerminal:Sizing}) then the target ventilation rate for that zone is scaled by the Fraction of Minimum Outdoor Air Flow value. + +\paragraph{Air System Ventilation Below Target Voz Time {[}hr{]}}\label{air-system-ventilation-below-target-voz-time} +The time that the airloop total ventilation rate (mechanical ventilation plus natural ventilation) is more than 1\% below the \emph{Zone Target Voz Ventilation Flow Rate}. + +\paragraph{Air System Ventilation At Target Voz Time {[}hr{]}}\label{air-system-ventilation-at-target-voz-time} +The time that the airloop total ventilation rate (mechanical ventilation plus natural ventilation) is within 1\% of the \emph{Zone Target Voz Ventilation Flow Rate}. + +\paragraph{Air System Ventilation Above Target Voz Time {[}hr{]}}\label{air-system-ventilation-above-target-voz-time} +The time that the airloop total ventilation rate (mechanical ventilation plus natural ventilation) is more than 1\% above the \emph{Zone Target Voz Ventilation Flow Rate}. + +\paragraph{Air System Ventilation When Unoccupied Time {[}hr{]}}\label{air-system-ventilation-when-unoccupied-time} +The time that the airloop total ventilation rate (mechanical ventilation plus natural ventilation) is greater than zero when all of the zones on the airloop are unoccupied. + + + The example syntax below shows the basic ventilation flow variables reported on an hourly basis. \begin{itemize} @@ -177,6 +227,38 @@ \subsubsection{Outputs}\label{outputs-1-001} Output:Variable,*,Zone Mechanical Ventilation Current Density Volume,Hourly; \item Output:Variable,*, Zone Mechanical Ventilation Air Changes per Hour,Hourly; +\item + Output:Variable,*, Zone Target Voz Ventilation Flow Rate,Hourly; +\item + Output:Variable,*, Zone Ventilation Below Target Voz Time,Hourly; +\item + Output:Variable,*, Zone Ventilation At Target Voz Time,Hourly; +\item + Output:Variable,*, Zone Ventilation Above Target Voz Time,Hourly; +\item + Output:Variable,*, Zone Ventilation When Unoccupied Time,Hourly; +\item + Output:Variable,*, Facility Any Zone Ventilation Below Target Voz Time,Hourly; +\item + Output:Variable,*, Facility All Zones Ventilation At Target Voz Time,Hourly; +\item + Output:Variable,*, Facility Any Zone Ventilation Above Target Voz Time,Hourly; +\item + Output:Variable,*, Facility Any Zone Ventilation When Unoccupied Time,Hourly; +\item + Output:Variable,*, Air System Mechanical Ventilation Flow Rate,Hourly; +\item + Output:Variable,*, Air System Natural Ventilation Flow Rate,Hourly; +\item + Output:Variable,*, Air System Target Voz Ventilation Flow Rate,Hourly; +\item + Output:Variable,*, Air System Ventilation Below Target Voz Time,Hourly; +\item + Output:Variable,*, Air System Ventilation At Target Voz Time,Hourly; +\item + Output:Variable,*, Air System Ventilation Above Target Voz Time,Hourly; +\item + Output:Variable,*, Air System Ventilation When Unoccupied Time,Hourly; \end{itemize} \paragraph{Ventilation Load Reports}\label{ventilation-load-reports} diff --git a/doc/input-output-reference/src/overview/group-airflow-network.tex b/doc/input-output-reference/src/overview/group-airflow-network.tex index fe1275c0061..a1bd7d8d81f 100644 --- a/doc/input-output-reference/src/overview/group-airflow-network.tex +++ b/doc/input-output-reference/src/overview/group-airflow-network.tex @@ -326,6 +326,10 @@ \subsubsection{Inputs}\label{inputs-004} This is an optional field. Input is Yes or No. The default is No. Yes is that external node temperature is dependent on node height. No means that external node temperature is calculated with zero height. +\paragraph{Field: Allow Unsupported Zone Equipment}\label{allow-unsupported-zone-equipment} + +This is an optional field. Input is Yes or No. The default is No. Set this input to Yes to have zone equipment that are currently unsupported in the AirflowNetwork model allowed in the simulation. Setting this field to Yes, allows the following equipment to be modeled along an AirflowNetwork model: ZoneHVAC:Dehumidifier, ZoneHVAC:EnergyRecoveryVentilator, WaterHeater:HeatPump:*. The AirflowNetwork model will exclude mass balance in these equipment objects and assume the mass flows are self-balanced in the equipment objects. + An IDF example is shown below: \begin{lstlisting} diff --git a/doc/input-output-reference/src/overview/group-airflow.tex b/doc/input-output-reference/src/overview/group-airflow.tex index d4c3d6aa025..a7751c8f914 100644 --- a/doc/input-output-reference/src/overview/group-airflow.tex +++ b/doc/input-output-reference/src/overview/group-airflow.tex @@ -2287,19 +2287,23 @@ \subsubsection{Zone Thermal Chimney Outlet Temperature {[}C{]}}\label{zone-therm \subsection{ZoneAirMassFlowConservation}\label{zoneairmassflowconservation} -This global object allows users to trigger the zone air mass flow conservation calculation when desired. This object has three input fields; the first choice input field allows the user whether to adjust mixing flows to enforce the zone air mass flow conservation; and the other fields allows the user to specify how infiltration object mass flow rate is calculated for zone air mass flow balance calculation.~ If adjustments for either mixing or infiltration is specified then the zone air mass balance attempts to enforce conservation. If both mixing and infiltration adjustments are off, then the zone air mass flow calculation uses the default method which does not include zone mixing objects and assumes self-balanced simple infiltration. The default method may not necessarily enforce zone air mass flow conservation unless the user has specified a balanced flow to begin with. The zone air mass flow conservation primarily accounts for the zonemixing objects air flow in the zone air flow mass balance calculation. In addition to the zonemixing object flow, the procedure accounts for zone supply, exhaust, and return flows and adjusts infiltration air flows (up or down) when required in order to balance the zone air mass flow.~ Mixing and infiltration adjustments will only be made in zones which have zonemixing or infiltration objects defined in the input. For example, if a zone does not have any infiltration objects, then no infiltration adjustment will be made for that zone. +This global object allows users to trigger the zone air mass flow conservation calculation when desired. This object has three input fields; the first choice input field allows the user whether to adjust mixing flows, the return air flow, or a combination of mixing and return air flows to enforce the zone air mass flow conservation; and the other fields allows the user to specify how infiltration object mass flow rate is calculated for zone air mass flow balance calculation.~Currently supported options are: \textbf{AdjustMixingOnly}, \textbf{AdjustReturnOnly}, \textbf{AdjustMixingThenReturn}, \textbf{AdjustReturnThenMixing}, or \textbf{None}. If adjustments for either of mixing, return, or a combination of mixing and return or infiltration is specified then the zone air mass balance attempts to enforce conservation. If adjutement choice is None and infiltration adjustments are off, then the zone air mass flow calculation uses the default method which does not include zone mixing objects and assumes self-balanced simple infiltration. The default method may not necessarily enforce zone air mass flow conservation unless the user has specified a balanced flow to begin with. The zone air mass flow conservation primarily accounts for the zonemixing objects and return air flows in the zone air flow mass balance calculation. In addition to the zonemixing object and zone return air flows, the procedure accounts for zone supply, exhaust, and adjusts infiltration air flows (up or down) when required in order to balance the zone air mass flow.~ Mixing and infiltration adjustments will only be made in zones which have zonemixing or infiltration objects defined in the input. For example, if a zone does not have any infiltration objects, then no infiltration adjustment will be made for that zone. -First, the \hyperref[zonemixing]{ZoneMixing} object mass flow rate is adjusted or modified in order to balance zone air mass flow while assuming any zone infiltration objects are self-balanced. This step will always results in balanced zone air mass for receiving zones of \hyperref[zonemixing]{ZoneMixing} object but it may not necessarily result in a balanced air mass flow for source zones.~ +The zone mixing object and return flows adjusting options to enforce zone air mass flow conseravtion are defined as follows. \textbf{AdjustMixingOnly} adjusts the zone mixing object flow only to enforce zone air mass flow balance. \textbf{AdjustReturnOnly} adjusts the zone return air flow only to enforce zone air mass flow balance while the zone mixing object flow are kept at user specified values. \textbf{AdjustMixingThenReturn} adjusts the zone mixing object flow first, and followed with adjusting the return air flows to enforce zone air mass flow balance. \textbf{AdjustReturnThenMixing} adjusts the zone return air flow first, and followed with adjusting the zone mixing object flow to enforce zone air mass flow balance. \textbf{None} does not adjust either the zone mixing or the zone return air flow, and the zone air mass flow balance uses the default method. + +First, depending user choice either the \hyperref[zonemixing]{ZoneMixing} object mass flow rate, the zone total return air flow rate, or a combination zone mixing and zone total return flow rates are adjusted or modified in order to balance zone air mass flow while assuming any zone infiltration objects are self-balanced. -Second, infiltration flow rates are adjusted accoring to the options set. Infiltration flow will be increased or decreased to balance the net flow from supply, exhaust, mixing, and return air flows. If a negative infiltration rate (exfiltration) is required to balance a zone's airflow, then the infiltration rate will be set to zero. This can happen, for example, if the total supply flow exceeds the total exahust plus return flow. +This step will always results in balanced zone air mass for receiving zones of \hyperref[zonemixing]{ZoneMixing} object but it may not necessarily result in a balanced air mass flow for source zones.~ + +Second, infiltration flow rates are adjusted according to the options set. Infiltration flow will be increased or decreased to balance the net flow from supply, exhaust, mixing, and return air flows. If a negative infiltration rate (exfiltration) is required to balance a zone's airflow, then the infiltration rate will be set to zero. This can happen, for example, if the total supply flow exceeds the total exahust plus return flow. This object is optional. If it is not present in the input file, the default zone air mass flow calculastion are used which do not account for zonemixing and infiltration flows. \subsubsection{Inputs}\label{inputs-9-002} -\paragraph{Field: Adjust Zone Mixing For Zone Air Mass Flow Balance}\label{field-adjust-zone-mixing-for-zone-air-mass-flow-balance} +\paragraph{Field: Adjust Zone Mixing and Return For Air Mass Flow Balance}\label{field-adjust-zone-mixing-and-return-for-air-mass-flow-balance} -This field has two choices: \emph{Yes} or \emph{No}.~ When set to \emph{Yes}, the zone air mass flow balance attempts to enforce conservation by adjusting zone mixing flow rates. When set to \emph{No}, mixing flow rates are not adjusted; the mixing flows specified in \hyperref[zonemixing]{ZoneMixing} obects will be used.~ The default is \emph{No}. +This field has five choices: \emph{AdjustMixingOnly}, \emph{AdjustReturnOnly}, \emph{AdjustMixingThenReturn}, \emph{AdjustReturnThenMixing} or \emph{None}.~When set to \emph{AdjustMixingOnly}, the zone air mass flow balance attempts to enforce zone mass flow conservation by adjusting zone mixing flow rates and zone infiltration air flow may be increased or decreased if required in order to balance the zone air mass flow. When set to \emph{AdjustReturnOnly}, the zone air mass flow balance attempts to enforce zone mass flow conservation by adjusting zone total return air flow rates and zone infiltration air flow may be increased or decreased if required in order to balance the zone air mass flow. When set to \emph{AdjustMixingThenReturn}, first the zone air mass flow balance attempts to enforce zone mass flow conservation by adjusting zone mixing object flow rates, then the zone total return flow rates are adjusted and zone infiltration air flow may be increased or decreased if required in order to balance the zone air mass flow. When set to \emph{AdjustReturnThenMixing}, first the zone air mass flow balance attempts to enforce zone mass flow conservation by adjusting zone total return air flow rates, then the zone mixing flow rates are adjusted and zone infiltration air flow may be increased or decreased if required in order to balance the zone air mass flow. When set to \emph{None}, mixing flow rates are not adjusted; the mixing flows specified in \hyperref[zonemixing]{ZoneMixing} obects will be used.~ The default is \emph{None}. \paragraph{Field: Infiltration Balancing Method}\label{field-infiltration-balancing-method} diff --git a/doc/input-output-reference/src/overview/group-electric-load-center-generator.tex b/doc/input-output-reference/src/overview/group-electric-load-center-generator.tex index fcee3c9c5a3..5ea35ce232f 100644 --- a/doc/input-output-reference/src/overview/group-electric-load-center-generator.tex +++ b/doc/input-output-reference/src/overview/group-electric-load-center-generator.tex @@ -1406,6 +1406,209 @@ \subsubsection{Outputs}\label{electricloadcenter-storagebattery-outputs} This output reports the fractional battery life used up at a point of time. For example, a value of 0.4 at the end of one year simulation means that the 40\% of the battery life is used up, so the battery needs to be replaced every two and a half years. +\subsection{ElectricLoadCenter:Storage:LiIonNMCBattery}\label{electricloadcenterstorage-liionbattery} + +This object usses the Li-ion NMC battery model from the System Advisor Model (SAM) software. + +\subsubsection{Inputs} + +\paragraph{Field: Name}\label{liion-name} + +This alpha field contains the identifying name for the battery. + +\paragraph{Field: Availability Schedule Name}\label{liion-avail-sched-name} + +This alpha field contains the schedule name (ref. Schedule objects) that describes when the battery is available. A schedule value greater than 0 (usually 1 is used) indicates that electrical energy can be stored or drawn from the battery. A value less than or equal to 0 (usually 0 is used) denotes that the battery is not available. If this field is blank, the schedule has values of 1 for all time periods. + +\paragraph{Field: Zone Name}\label{liion-zone-name} + +This field contains the name of the thermal zone where the battery is located. Entering a valid name of zone here will direct EnergyPlus to include the energy storage losses as heat gains to the named thermal zone. If the battery is not within a thermal zone, this field can be left blank and the thermal energy associated with storage losses is removed from the building model. + +\paragraph{Field: Radiative Fraction}\label{liion-rad-frac} + +This field contains the fraction of storage losses that enter the zone as long-wave thermal radiation. This numeric filed should have a value between 0.0 and 1.0. The balance of the losses is convective. This field is not used if the previous field for zone name is left blank. + +\paragraph{Field: Lifetime Model}\label{liion-lifetime-model} + +Which lifetime model to use for the battery. Available choices are: + +\begin{itemize} + \item None: The battery doesn't degrade over time + \item KandlerSmith: Use the lifetime model developed by Kandler Smith. Details at \url{https://ieeexplore.ieee.org/abstract/document/7963578} +\end{itemize} + +\paragraph{Field: Number of Cells in Series}\label{liion-n-series} + +The number of cells in series. Increasing this number increases the voltage output of the battery. + +\paragraph{Field: Number of Strings in Parallel}\label{liion-n-parallel} + +The number of strings in parallel. + +\paragraph{Field: Initial Fractional State of Charge}\label{liion-init-soc} + +This field describes the initial state of charge in terms of the fraction of maximum capacity. + +\paragraph{Field: DC to DC Charging Efficiency}\label{liion-dc-dc-charg-eff} + +The charging loss coefficient. + +\paragraph{Field: Battery Mass}\label{liion-mass} + +Battery mass (kg) used in thermal calculation. + +\paragraph{Field: Battery Surface Area}\label{liion-surf-area} + +Battery surface area (m\textsuperscript{2}) used in thermal calculations. + +\paragraph{Field: Battery Specific Heat Capacity}\label{liion-cp} + +Specific heat of the battery (J/kg-K) used in the thermal calculation. + +\paragraph{Field: Heat Transfer Coefficient Between Battery and Ambient}\label{liion-h} + +Heat transfer coefficient (W/m\textsuperscript{2}-K)between battery and ambient. + +\paragraph{Field: Fully Charged Cell Voltage}\label{liion-vfull} + +This field is included for those who want to modify the battery chemistry. Most users should leave this field blank or omit it to use the defaults, which are typical of Lithium-ion batteries. + +\paragraph{Field: Cell Voltage at End of Exponential Zone}\label{liion-vexp} + +This field is included for those who want to modify the battery chemistry. Most users should leave this field blank or omit it to use the defaults, which are typical of Lithium-ion batteries. + +\paragraph{Field: Cell Voltage at End of Nominal Zone}\label{liion-vnom} + +This field is included for those who want to modify the battery chemistry. Most users should leave this field blank or omit it to use the defaults, which are typical of Lithium-ion batteries. + +\paragraph{Field: Default Nominal Cell Voltage}\label{liion-vnom-default} + +This field is included for those who want to modify the battery chemistry. Most users should leave this field blank or omit it to use the defaults, which are typical of Lithium-ion batteries. + +\paragraph{Field: Fully Charged Cell Capacity}\label{liion-qfull} + +This field is included for those who want to modify the battery chemistry. Most users should leave this field blank or omit it to use the defaults, which are typical of Lithium-ion batteries. + +\paragraph{Field: Fraction of Cell Capacity Removed at the End of Exponential Zone}\label{liion-qexp} + +This field is included for those who want to modify the battery chemistry. Most users should leave this field blank or omit it to use the defaults, which are typical of Lithium-ion batteries. + +\paragraph{Field: Fraction of Cell Capacity Removed at the End of Nominal Zone}\label{liion-qnom} + +This field is included for those who want to modify the battery chemistry. Most users should leave this field blank or omit it to use the defaults, which are typical of Lithium-ion batteries. + +\paragraph{Field: Charge Rate at Which Voltage vs Capacity Curve Was Generated}\label{liion-crate} + +This field is included for those who want to modify the battery chemistry. Most users should leave this field blank or omit it to use the defaults, which are typical of Lithium-ion batteries. + +\paragraph{Field: Battery Cell Internal Electrical Resistance}\label{liion-internal-r} + +This field is included for those who want to modify the battery chemistry. Most users should leave this field blank or omit it to use the defaults, which are typical of Lithium-ion batteries. + +An example input of the ElectricLoadCenter:Storage:LiIonNMCBattery is: + +\begin{lstlisting} + + ElectricLoadCenter:Storage:LiIonNMCBattery, + LiIonBattery, !- Name + ALWAYS_ON, !- Availability Schedule Name + , !- Zone Name + 0, !- Radiative Fraction + KandlerSmith, !- Lifetime Model + 139, !- Number of Cells in Series + 25, !- Number of Strings in Parallel + 0.7, !- Initial Fractional State of Charge + , !- DC to DC Charging Efficiency + 342, !- Battery Mass + 4.26, !- Battery Surface Area + , !- Battery Specific Heat Capacity + ; !- Heat Transfer Coefficient Between Battery and Ambient + +\end{lstlisting} + +\subsubsection{Outputs}\label{electricloadcenter-storageliionnmcbatttery-outputs} + +\begin{itemize} + \item + HVAC,Average, Electric Storage Operating Mode Index {[]} + \item + HVAC,Average,Electric Storage Charge State{[}Ah{]} + \item + HVAC,Average, Electric Storage Charge Fraction {[]} + \item + HVAC,Average,Electric Storage Charge Power{[}W{]} + \item + HVAC,Sum,Electric Storage Charge Energy {[}J{]} + \item + HVAC,Average,Electric Storage Discharge Power{[}W{]} + \item + HVAC,Sum,Electric Storage Discharge Energy {[}J{]} + \item + HVAC,Average,Electric Storage Total Current{[}A{]} + \item + HVAC,Average, Electric Storage Total Voltage {[}V{]} + \item + HVAC,Average,Electric Storage Thermal Loss Rate {[}W{]} + \item + HVAC,Average,Electric Storage Degradation Fraction {[]} + \item + HVAC,Sum,Electric Storage Production Decrement Energy {[}J{]} + \item + HVAC,Sum,Electric Storage Thermal Loss Energy {[}J{]} + \item + HVAC,Average,Electric Storage Battery Temperature {[}C{]} +\end{itemize} + +\paragraph{Electric Storage Operating Mode Index {[]}}\label{liion-operating-mode-index} + +This output reports the battery mode of operation: 0 for idle; 1 for discharging; 2 for charging. It is expected that more operation modes would be added when a smart and active power dispatch controller is used in future. + +\paragraph{Electric Storage Charge State {[}Ah{]}}\label{liion-charge-state-ah} + +The state of charge is expressed as the amount of charge stored in the battery at a point of time. It has the same unit as the maximum capacity. This value is given for an individual battery module + +\paragraph{Electric Storage Charge Fraction {[]}}\label{liion-charge-fraction} + +This output is the ratio between the electrical storage state of charge and the maximum capacity. + +\paragraph{Electric Storage Charge Power {[}W{]}}\label{liion-charge-power-w-1} + +\paragraph{Electric Storage Charge Energy {[}J{]}}\label{liion-charge-energy-j-1} + +These outputs are total electricity power or energy fed into the battery. This is the rate of amount of charging. + +\paragraph{Electric Storage Production Decrement Energy {[}J{]}}\label{liion-production-decrement-energy-j-1} + +This output is the total electricity energy decremented from electricity production because it has fed into the battery. This output has the opposite sign of Electric Storage Charge Energy but is otherwise similar. This decrement output variable is also a meter associated with the resource type ElectricityProduced that reduces the metered electricity production to account for power that went into storage after production. + +\paragraph{Electric Storage Discharge Power {[}W{]}}\label{liion-discharge-power-w-1} + +\paragraph{Electric Storage Discharge Energy {[}J{]}}\label{liion-discharge-energy-j-1} + +These outputs are total electricity power or energy drawn from the battery. This is the rate or amount of discharging. The energy from storage output variable is also a meter associated with the resource type ElectricityProduced that increases the metered electricity production to account for power that has come back out of storage. + +\paragraph{Electric Storage Total Current {[}A{]}}\label{liion-total-current-a} + +This output is the current to or from the battery bank depending on whether the battery is in the state of charging or discharging. The value is positive for discharging and negative for charging. + +\paragraph{Electric Storage Total Voltage {[}V{]}}\label{liion-total-voltage-v} + +This output is the total terminal voltage of the battery bank. + +\paragraph{Electric Storage Thermal Loss Rate {[}W{]}}\label{liion-thermal-loss-rate-w-1} + +\paragraph{Electric Storage Thermal Loss Energy {[}J{]}}\label{liion-thermal-loss-energy-j-1} + +These outputs are the thermal power or energy losses from both charging and drawing electrical power in or out of the storage device. These losses are due to the battery internal resistance in charging and discharging. + +\paragraph{Electric Storage Degradation Fraction {[]}}\label{liion-degradation-fraction} + +This output reports the fractional battery life used up at a point of time. For example, a value of 0.4 at the end of one year simulation means that 40\% of the battery life is used up. + +\paragraph{HVAC,Average,Electric Storage Battery Temperature {[}C{]}}\label{liion-battery-temperature} + +The internal temperature of the battery. + \subsection{Generator:InternalCombustionEngine}\label{generatorinternalcombustionengine} The Internal Combustion (IC) Engine generator uses a modified Otto cycle. This generator model uses the electrical load and rated engine generator size to compute part-load ratios (PLR). Fuel energy input and recoverable jacket and lube oil heat are then computed. Finally, the recoverable exhaust heat is calculated. diff --git a/doc/input-output-reference/src/standard-output-reports/output-table-summaryreports.tex b/doc/input-output-reference/src/standard-output-reports/output-table-summaryreports.tex index 9ffc9f7e0fe..717f4593127 100644 --- a/doc/input-output-reference/src/standard-output-reports/output-table-summaryreports.tex +++ b/doc/input-output-reference/src/standard-output-reports/output-table-summaryreports.tex @@ -172,6 +172,27 @@ \subsubsection{Predefined Annual Summary Reports}\label{predefined-annual-summar Minimum Outside Air During Occupied Hours table shows for each zone the average and nominal number of occupants, the zone volume, the minimum air change rate based on mechanical ventilation, infiltration and simple ventilation during occupied hours. \end{itemize} +\paragraph{Outdoor Air Details}\label{outdoor-air-details} + +The Outdoor Air Details report (key: OutdoorAirDetails) produces a report that includes the following tables: + +\begin{itemize} +\item + Mechanical Ventilation Parameters by Zone table shows for each zone the average and nominal number of occupants, the zone volume and area, the design outdoor air flow rate \(V_{oz}\) and the minimum dynamic target ventilation flow rate \(V_{oz-dyn-min}\). +\item + Total Outdoor Air by Zone table shows for each zone the total mechanical ventilation, natural ventilation, total ventilation (mechanical plus natural), infiltration, total ventilation plus infiltration, dynamic target ventilation \(V_{oz-dyn}\), the time when total ventilation is below, at, or above \(V_{oz-dyn}\), and the time ventilation is provided when the zone is unoccupied. +\item + Average Outdoor Air During Occupancy by Zone - Flow Rates table shows for each zone the average flow rates when the zone is occupied for mechanical ventilation, natural ventilation, total ventilation (mechanical plus natural), infiltration, total ventilation plus infiltration, dynamic target ventilation \(V_{oz-dyn}\) and the time when total ventilation is below, at, or above \(V_{oz-dyn}\). +\item + Total Outdoor Air by AirLoop table shows for each airloop the total mechanical ventilation, natural ventilation, total ventilation (mechanical plus natural), sum of the zone dynamic target ventilation \(V_{oz-dyn}\), the time when total ventilation is below, at, or above \(V_{oz-dyn}\), and the time ventilation is provided when all zones are unoccupied. +\item + Average Outdoor Air During Occupancy by AirLoop table shows for each airloop the average flow rates when any zone on the airloop is occupied for mechanical ventilation, natural ventilation, total ventilation (mechanical plus natural), sum of the zone dynamic target ventilation \(V_{oz-dyn}\), and the time when total ventilation is below, at, or above \(V_{oz-dyn}\). +\item + Times for Outdoor Air Limiting Factors During Occupancy table shows for each airloop the time when any zone on the airloop is occupied and various limiting factors control the mechanical ventilation flow rate: no limiting factor, economizer operation, demand controlled ventilation, exhaust flow, high humidity economizer control, night ventilation, limits and scheduled limits, demand limiting, and energy management system override. +\item + Average Outdoor Air For Each Outdoor Air Limiting Factors During Occupancy table shows for each airloop the average mechanical ventilation flow rates when any zone on the airloop is occupied and various limiting factors control the mechanical ventilation flow rate: no limiting factor, economizer operation, demand controlled ventilation, exhaust flow, high humidity economizer control, night ventilation, limits and scheduled limits, demand limiting, and energy management system override. +\end{itemize} + \paragraph{System Summary}\label{system-summary} The System Summary Report (key: SystemSummary) produces a report that includes the following tables: diff --git a/idd/Energy+.idd.in b/idd/Energy+.idd.in index df874ecf5ec..4fcf08cfc6e 100644 --- a/idd/Energy+.idd.in +++ b/idd/Energy+.idd.in @@ -791,22 +791,36 @@ ZoneAirContaminantBalance, \object-list ScheduleNames ZoneAirMassFlowConservation, - \memo Enforces the zone air mass flow balance by adjusting zone mixing object and/or - \memo infiltration object mass flow rates. - \memo If either mixing or infiltration is active, then the zone air mass flow - \memo balance calculation will attempt to enforce conservation of mass for each zone. - \memo If mixing is "No" and infiltration is "None", then the zone air mass flow - \memo calculation defaults to assume self-balanced simple flow mixing and infiltration objects. + \memo Enforces the zone air mass flow balance by either adjusting zone mixing object flow only, + \memo adjusting zone total return flow only, zone mixing and the zone total return flows, + \memo or adjusting the zone total return and zone mixing object flows. Zone infiltration flow air + \memo flow is increased or decreased depending user selection in the infiltration treatment method. + \memo If either of zone mixing or zone return flow adjusting methods or infiltration is active, + \memo then the zone air mass flow balance calculation will attempt to enforce conservation of + \memo mass for each zone. If flow balancing method is "None" and infiltration is "None", then the + \memo zone air mass flow calculation defaults to assume self-balanced simple flow mixing and + \memo infiltration objects. \unique-object \min-fields 3 - A1, \field Adjust Zone Mixing For Zone Air Mass Flow Balance - \note If Yes, Zone mixing object flow rates are adjusted to balance the zone air mass flow - \note and additional infiltration air flow may be added if required in order to balance the - \note zone air mass flow. - \type choice - \key Yes - \key No - \default No + A1, \field Adjust Zone Mixing and Return For Air Mass Flow Balance + \note If "AdjustMixingOnly", zone mixing object flow rates are adjusted to balance the zone air mass + \note flow and zone infiltration air flow may be increased or decreased if required in order to balance + \note the zone air mass flow. If "AdjustReturnOnly", zone total return flow rate is adjusted to balance + \note the zone air mass flow and zone infiltration air flow may be increased or decreased if required + \note in order to balance the zone air mass flow. If "AdjustMixingThenReturn", first the zone mixing + \note objects flow rates are adjusted to balance the zone air flow, second zone total return flow rate + \note is adjusted and zone infiltration air flow may be increased or decreased if required in order to + \note balance the zone air mass flow. If "AdjustReturnThenMixing", first zone total return flow rate is + \note adjusted to balance the zone air flow, second the zone mixing object flow rates are adjusted and + \note infiltration air flow may be increased or decreased if required in order to balance the zone + \note air mass flow. + \type choice + \key AdjustMixingOnly + \key AdjustReturnOnly + \key AdjustMixingThenReturn + \key AdjustReturnThenMixing + \key None + \default None A2, \field Infiltration Balancing Method \note This input field allows user to choose how zone infiltration flow is treated during \note the zone air mass flow balance calculation. @@ -20430,6 +20444,7 @@ RoomAir:Node:AirflowNetwork:InternalGains, \key ElectricLoadCenter:Inverter:Simple \key ElectricLoadCenter:Inverter:FunctionOfPower \key ElectricLoadCenter:Inverter:LookUpTable + \key ElectricLoadCenter:Storage:LiIonNMCBattery \key ElectricLoadCenter:Storage:Battery \key ElectricLoadCenter:Storage:Simple \key ElectricLoadCenter:Storage:Converter @@ -20484,6 +20499,7 @@ RoomAir:Node:AirflowNetwork:InternalGains, \key ElectricLoadCenter:Inverter:Simple \key ElectricLoadCenter:Inverter:FunctionOfPower \key ElectricLoadCenter:Inverter:LookUpTable + \key ElectricLoadCenter:Storage:LiIonNMCBattery \key ElectricLoadCenter:Storage:Battery \key ElectricLoadCenter:Storage:Simple \key ElectricLoadCenter:Storage:Converter @@ -20537,6 +20553,7 @@ RoomAir:Node:AirflowNetwork:InternalGains, \key ElectricLoadCenter:Inverter:Simple \key ElectricLoadCenter:Inverter:FunctionOfPower \key ElectricLoadCenter:Inverter:LookUpTable + \key ElectricLoadCenter:Storage:LiIonNMCBattery \key ElectricLoadCenter:Storage:Battery \key ElectricLoadCenter:Storage:Simple \key ElectricLoadCenter:Storage:Converter @@ -23844,12 +23861,21 @@ AirflowNetwork:SimulationControl, \key Yes \key No \default No - A8 ; \field Solver + A8 , \field Solver \note Select the solver to use for the pressure network solution \type choice \key SkylineLU \key ConjugateGradient \default SkylineLU + A9 ; \field Allow Unsupported Zone Equipment + \note Set this input to Yes to have zone equipment that are currently unsupported in the AirflowNetwork model + \note allowed in the simulation if present. Setting this field to Yes, allows the following equipments + \note to be modeled along an AirflowNetwork model: ZoneHVAC:Dehumidifier, ZoneHVAC:EnergyRecoveryVentilator, + \note WaterHeater:HeatPump:*. + \type choice + \key Yes + \key No + \default No AirflowNetwork:MultiZone:Zone, \min-fields 8 @@ -88702,6 +88728,138 @@ ElectricLoadCenter:Storage:Battery, \note Determines the number of cycles to failure in relation to cycle range. \note Only required when battery life calculation is activated. +ElectricLoadCenter:Storage:LiIonNMCBattery, + \memo Uses Lithium Ion NMC model to simulate rechargeable battery banks in an + \memo electrical load center. The battery bank is a collection of one or more individual + \memo battery modules. Given the surplus or deficit power from the electrical system and + \memo the state of charge from the previous time step, this object can model the voltage, + \memo current, and energy losses with charging and discharging during each time step. + \memo The cumulative battery damage can be also modeled and reported at the end of + \memo each simulation run. + \min-fields 11 + A1, \field Name + \required-field + \type alpha + \reference ElecStorageList + A2, \field Availability Schedule Name + \note Availability schedule name for this system. Schedule value > 0 means the system is available. + \note If this field is blank, the system is always available. + \type object-list + \object-list ScheduleNames + A3, \field Zone Name + \type object-list + \object-list ZoneNames + \note Enter name of zone to receive electrical storage losses as heat + \note if blank then electrical storage losses are dissipated to outdoors + N1, \field Radiative Fraction + \type real + \minimum 0 + \maximum 1.0 + \default 0 + A4, \field Lifetime Model + \type choice + \key None + \key KandlerSmith + \default KandlerSmith + N2, \field Number of Cells in Series + \type integer + \minimum 1 + \required-field + \note Battery voltage is calculated by multiplying this field + \note by the nominal cell voltage (N13, default 3.342V) + N3, \field Number of Strings in Parallel + \type integer + \minimum 1 + \required-field + \note Capacity (Ah) is determined by multiplying this field + \note by the cell capacity (N14, default 3.2 Ah) + N4, \field Initial Fractional State of Charge + \type real + \minimum 0 + \maximum 1.0 + \default 0.5 + \note The state of charge is evaluated based on the + \note maximum capacity defined in the next field. + N5, \field DC to DC Charging Efficiency + \type real + \minimum> 0 + \maximum 1 + \default 0.95 + N6, \field Battery Mass + \type real + \minimum> 0 + \units kg + \required-field + N7, \field Battery Surface Area + \type real + \minimum> 0 + \units m2 + \required-field + N8, \field Battery Specific Heat Capacity + \type real + \minimum> 0 + \units J/kg-K + \default 1500 + N9, \field Heat Transfer Coefficient Between Battery and Ambient + \type real + \minimum> 0 + \units W/m2-K + \default 7.5 + N10, \field Fully Charged Cell Voltage + \type real + \minimum> 0 + \units V + \default 4.2 + \note Most users should not need to change this value. + N11, \field Cell Voltage at End of Exponential Zone + \type real + \minimum> 0 + \units V + \default 3.53 + \note Most users should not need to change this value. + N12, \field Cell Voltage at End of Nominal Zone + \type real + \minimum> 0 + \units V + \default 3.342 + \note Most users should not need to change this value. + N13, \field Default Nominal Cell Voltage + \type real + \minimum> 0 + \units V + \default 3.342 + \note Most users should not need to change this value. + N14, \field Fully Charged Cell Capacity + \type real + \minimum> 0 + \units Ah + \default 3.2 + \note Most users should not need to change this value. + N15, \field Fraction of Cell Capacity Removed at the End of Exponential Zone + \type real + \minimum> 0.0 + \maximum< 1.0 + \default 0.8075 + \note Most users should not need to change this value. + N16, \field Fraction of Cell Capacity Removed at the End of Nominal Zone + \type real + \minimum> 0.0 + \maximum< 1.0 + \default 0.976875 + \note Most users should not need to change this value. + N17, \field Charge Rate at Which Voltage vs Capacity Curve Was Generated + \type real + \minimum> 0 + \default 1 + \note Most users should not need to change this value. + N18; \field Battery Cell Internal Electrical Resistance + \type real + \minimum 0 + \units ohms + \default 0.09 + \note for a single cell + \note Most users should not need to change this value. + ElectricLoadCenter:Transformer, \memo a list of meters that can be reported are available after a run on \memo the meter dictionary file (.mdd) if the Output:VariableDictionary has been requested. @@ -98601,8 +98759,6 @@ Output:Table:SummaryReports, \memo other tabular reports. These predefined reports are sensitive to the OutputControl:Table:Style object \memo and appear in the same files as the tabular reports. The entries for this object is a list \memo of the predefined reports that should appear in the tabular report output file. - \memo There should be as many fields (A) in this object as there are keys in the following (minus - \memo AllSummary+AllMonthly+AllSummaryAndMonthly) \unique-object A1, \field Report 1 Name \begin-extensible @@ -98627,6 +98783,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -98730,6 +98887,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -98833,6 +98991,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -98936,6 +99095,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -99039,6 +99199,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -99142,6 +99303,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -99245,6 +99407,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -99348,6 +99511,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -99451,6 +99615,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -99554,6 +99719,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -99657,6 +99823,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -99760,6 +99927,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -99863,6 +100031,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -99966,6 +100135,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -100069,6 +100239,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -100172,6 +100343,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -100275,6 +100447,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -100378,6 +100551,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -100481,6 +100655,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -100584,6 +100759,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -100687,6 +100863,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -100790,6 +100967,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -100893,6 +101071,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -100996,6 +101175,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary @@ -101077,5981 +101257,7 @@ Output:Table:SummaryReports, \key ThermalResilienceSummary \key CO2ResilienceSummary \key VisualResilienceSummary - A25, \field Report 25 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A26, \field Report 26 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A27, \field Report 27 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A28, \field Report 28 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A29, \field Report 29 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A30, \field Report 30 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A31, \field Report 31 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A32, \field Report 32 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A33, \field Report 33 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A34, \field Report 34 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A35, \field Report 35 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A36, \field Report 36 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A37, \field Report 37 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A38, \field Report 38 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A39, \field Report 39 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A40, \field Report 40 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A41, \field Report 41 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A42, \field Report 42 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A43, \field Report 43 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A44, \field Report 44 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A45, \field Report 45 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A46, \field Report 46 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A47, \field Report 47 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A48, \field Report 48 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A49, \field Report 49 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A50, \field Report 50 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A51, \field Report 51 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A52, \field Report 52 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A53, \field Report 53 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A54, \field Report 54 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A55, \field Report 55 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A56, \field Report 56 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A57, \field Report 57 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A58, \field Report 58 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A59, \field Report 59 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A60, \field Report 60 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A61, \field Report 61 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A62, \field Report 62 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A63, \field Report 63 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A64, \field Report 64 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A65, \field Report 65 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A66, \field Report 66 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A67, \field Report 67 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A68, \field Report 68 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A69, \field Report 69 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A70, \field Report 70 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A71, \field Report 71 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A72, \field Report 72 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A73, \field Report 73 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A74, \field Report 74 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A75, \field Report 75 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A76, \field Report 76 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A77, \field Report 77 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A78, \field Report 78 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A79, \field Report 79 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A80, \field Report 80 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A81, \field Report 81 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A82, \field Report 82 Name - \type choice - \key AllSummary - \key AllSummaryAndSizingPeriod - \key AllMonthly - \key AllSummaryAndMonthly - \key AllSummaryMonthlyAndSizingPeriod - \key AnnualBuildingUtilityPerformanceSummary - \key InputVerificationandResultsSummary - \key DemandEndUseComponentsSummary - \key SourceEnergyEndUseComponentsSummary - \key ClimaticDataSummary - \key EquipmentSummary - \key EnvelopeSummary - \key SurfaceShadowingSummary - \key ShadingSummary - \key LightingSummary - \key HVACSizingSummary - \key SystemSummary - \key ComponentSizingSummary - \key CoilSizingDetails - \key OutdoorAirSummary - \key ObjectCountSummary - \key ComponentCostEconomicsSummary - \key AdaptiveComfortSummary - \key SensibleHeatGainSummary - \key ZoneComponentLoadSummary - \key AirLoopComponentLoadSummary - \key FacilityComponentLoadSummary - \key Standard62.1Summary - \key EnergyMeters - \key InitializationSummary - \key LEEDSummary - \key LifeCycleCostReport - \key TariffReport - \key EconomicResultSummary - \key ZoneCoolingSummaryMonthly - \key ZoneHeatingSummaryMonthly - \key ZoneElectricSummaryMonthly - \key SpaceGainsMonthly - \key PeakSpaceGainsMonthly - \key SpaceGainComponentsAtCoolingPeakMonthly - \key EnergyConsumptionElectricityNaturalGasMonthly - \key EnergyConsumptionElectricityGeneratedPropaneMonthly - \key EnergyConsumptionDieselFuelOilMonthly - \key EnergyConsumptionDistrictHeatingCoolingMonthly - \key EnergyConsumptionCoalGasolineMonthly - \key EnergyConsumptionOtherFuelsMonthly - \key EndUseEnergyConsumptionElectricityMonthly - \key EndUseEnergyConsumptionNaturalGasMonthly - \key EndUseEnergyConsumptionDieselMonthly - \key EndUseEnergyConsumptionFuelOilMonthly - \key EndUseEnergyConsumptionCoalMonthly - \key EndUseEnergyConsumptionPropaneMonthly - \key EndUseEnergyConsumptionGasolineMonthly - \key EndUseEnergyConsumptionOtherFuelsMonthly - \key PeakEnergyEndUseElectricityPart1Monthly - \key PeakEnergyEndUseElectricityPart2Monthly - \key ElectricComponentsOfPeakDemandMonthly - \key PeakEnergyEndUseNaturalGasMonthly - \key PeakEnergyEndUseDieselMonthly - \key PeakEnergyEndUseFuelOilMonthly - \key PeakEnergyEndUseCoalMonthly - \key PeakEnergyEndUsePropaneMonthly - \key PeakEnergyEndUseGasolineMonthly - \key PeakEnergyEndUseOtherFuelsMonthly - \key SetpointsNotMetWithTemperaturesMonthly - \key ComfortReportSimple55Monthly - \key UnglazedTranspiredSolarCollectorSummaryMonthly - \key OccupantComfortDataSummaryMonthly - \key ChillerReportMonthly - \key TowerReportMonthly - \key BoilerReportMonthly - \key DXReportMonthly - \key WindowReportMonthly - \key WindowEnergyReportMonthly - \key WindowZoneSummaryMonthly - \key WindowEnergyZoneSummaryMonthly - \key AverageOutdoorConditionsMonthly - \key OutdoorConditionsMaximumDryBulbMonthly - \key OutdoorConditionsMinimumDryBulbMonthly - \key OutdoorConditionsMaximumWetBulbMonthly - \key OutdoorConditionsMaximumDewPointMonthly - \key OutdoorGroundConditionsMonthly - \key WindowACReportMonthly - \key WaterHeaterReportMonthly - \key GeneratorReportMonthly - \key DaylightingReportMonthly - \key CoilReportMonthly - \key PlantLoopDemandReportMonthly - \key FanReportMonthly - \key PumpReportMonthly - \key CondLoopDemandReportMonthly - \key ZoneTemperatureOscillationReportMonthly - \key AirLoopSystemEnergyAndWaterUseMonthly - \key AirLoopSystemComponentLoadsMonthly - \key AirLoopSystemComponentEnergyUseMonthly - \key MechanicalVentilationLoadsMonthly - \key HeatEmissionsSummary - \key HeatEmissionsReportMonthly - \key ThermalResilienceSummary - \key CO2ResilienceSummary - \key VisualResilienceSummary - A83; \field Report 83 Name + A25; \field Report 25 Name \type choice \key AllSummary \key AllSummaryAndSizingPeriod @@ -107073,6 +101279,7 @@ Output:Table:SummaryReports, \key ComponentSizingSummary \key CoilSizingDetails \key OutdoorAirSummary + \key OutdoorAirDetails \key ObjectCountSummary \key ComponentCostEconomicsSummary \key AdaptiveComfortSummary diff --git a/scripts/dev/find_byref_bool_override.py b/scripts/dev/find_byref_bool_override.py index 9d087e93713..1b637892c88 100755 --- a/scripts/dev/find_byref_bool_override.py +++ b/scripts/dev/find_byref_bool_override.py @@ -191,6 +191,10 @@ "simulateSimpleBucketModel": [ "charging", "discharging" + ], + "simulateLiIonNmcBatteryModel": [ + "charging", + "discharging" ] }, "EMSManager.cc": { diff --git a/src/EnergyPlus/AirflowNetwork/include/AirflowNetwork/Elements.hpp b/src/EnergyPlus/AirflowNetwork/include/AirflowNetwork/Elements.hpp index fcb2cd2f6b0..4cfb181506b 100644 --- a/src/EnergyPlus/AirflowNetwork/include/AirflowNetwork/Elements.hpp +++ b/src/EnergyPlus/AirflowNetwork/include/AirflowNetwork/Elements.hpp @@ -271,6 +271,7 @@ namespace AirflowNetwork { int OpenFactorErrIndex; // Large opening error error index at Open factor > 1.0 std::string InitType; // Initialization flag type: bool TExtHeightDep; // Choice of height dependence of external node temperature + bool AllowSupportZoneEqp; // Allow unsupported zone equipment // "ZeroNodePressures", or "LinearInitializationMethod" // Default Constructor diff --git a/src/EnergyPlus/AirflowNetworkBalanceManager.cc b/src/EnergyPlus/AirflowNetworkBalanceManager.cc index d8a5252da45..1c6e32d7b68 100644 --- a/src/EnergyPlus/AirflowNetworkBalanceManager.cc +++ b/src/EnergyPlus/AirflowNetworkBalanceManager.cc @@ -101,6 +101,8 @@ #include #include #include +#include +#include namespace EnergyPlus { @@ -1811,6 +1813,12 @@ namespace AirflowNetworkBalanceManager { AirflowNetworkSimu.HeightOption = Alphas(4); AirflowNetworkSimu.BldgType = Alphas(5); + // Retrieve flag allowing the support of zone equipment + AirflowNetworkSimu.AllowSupportZoneEqp = false; + if (UtilityRoutines::SameString(Alphas(9), "Yes")) { + AirflowNetworkSimu.AllowSupportZoneEqp = true; + } + // Find a flag for possible combination of vent and distribution system { auto const SELECT_CASE_var(UtilityRoutines::MakeUPPERCase(AirflowNetworkSimu.Control)); @@ -8510,8 +8518,15 @@ namespace AirflowNetworkBalanceManager { state.dataAirflowNetworkBalanceManager->AirflowNetworkZnRpt(i).MixVolume = (state.dataAirflowNetworkBalanceManager->exchangeData(i).SumMMCp / CpAir / AirDensity) * ReportingConstant; state.dataAirflowNetworkBalanceManager->AirflowNetworkZnRpt(i).MixMass = (state.dataAirflowNetworkBalanceManager->exchangeData(i).SumMMCp / CpAir) * ReportingConstant; // save values for predefined report + Real64 StdDensInfilVolume = (state.dataAirflowNetworkBalanceManager->exchangeData(i).SumMCp / CpAir / state.dataEnvrn->StdRhoAir) * + ReportingConstant; // compute volume using standard density air + // MJWToDo - Separate AFN Vent and InfilVolFlow + ZonePreDefRep(i).AFNVentVolTotalStdDen += 0.0; + ZonePreDefRep(i).AFNInfilVolTotalStdDen += StdDensInfilVolume; if (ZonePreDefRep(i).isOccupied) { - ZonePreDefRep(i).AFNInfilVolTotal += state.dataAirflowNetworkBalanceManager->AirflowNetworkZnRpt(i).InfilVolume * Zone(i).Multiplier * Zone(i).ListMultiplier; + ZonePreDefRep(i).AFNVentVolTotalOccStdDen += 0.0; + ZonePreDefRep(i).AFNInfilVolTotalOccStdDen += StdDensInfilVolume; + ZonePreDefRep(i).AFNInfilVolTotalOcc += state.dataAirflowNetworkBalanceManager->AirflowNetworkZnRpt(i).InfilVolume * Zone(i).Multiplier * Zone(i).ListMultiplier; if (state.dataAirflowNetworkBalanceManager->AirflowNetworkZnRpt(i).InfilVolume < ZonePreDefRep(i).AFNInfilVolMin) { ZonePreDefRep(i).AFNInfilVolMin = state.dataAirflowNetworkBalanceManager->AirflowNetworkZnRpt(i).InfilVolume * Zone(i).Multiplier * Zone(i).ListMultiplier; } @@ -9476,6 +9491,8 @@ namespace AirflowNetworkBalanceManager { using SplitterComponent::GetSplitterNodeNumbers; using SplitterComponent::GetSplitterOutletNumber; using ZoneDehumidifier::GetZoneDehumidifierNodeNumber; + using WaterThermalTanks::GetHeatPumpWaterHeaterNodeNumber; + using HVACStandAloneERV::GetStandAloneERVNodeNumber; // SUBROUTINE PARAMETER DEFINITIONS: static std::string const RoutineName("ValidateDistributionSystem: "); // include trailing blank space @@ -9498,6 +9515,9 @@ namespace AirflowNetworkBalanceManager { Array1D_int NodeConnectionType; // Specifies the type of node connection std::string CurrentModuleObject; + bool HPWHFound(false); // Flag for HPWH identification + bool StandaloneERVFound(false); // Flag for Standalone ERV (ZoneHVAC:EnergyRecoveryVentilator) identification + // Validate supply and return connections NodeFound.dimension(NumOfNodes, false); // Validate inlet and outlet nodes for zone exhaust fans @@ -9584,6 +9604,20 @@ namespace AirflowNetworkBalanceManager { // Skip the inlet and outlet nodes of zone dehumidifiers if (GetZoneDehumidifierNodeNumber(state, i)) NodeFound(i) = true; + if (AirflowNetworkSimu.AllowSupportZoneEqp) { + // Skip HPWH nodes that don't have to be included in the AFN + if (GetHeatPumpWaterHeaterNodeNumber(state, i)) { + NodeFound(i) = true; + HPWHFound = true; + } + + // Skip Standalone ERV nodes that don't have to be included in the AFN + if (GetStandAloneERVNodeNumber(state, i)) { + NodeFound(i) = true; + StandaloneERVFound = true; + } + } + for (j = 1; j <= state.dataGlobal->NumOfZones; ++j) { if (!state.dataZoneEquip->ZoneEquipConfig(j).IsControlled) continue; if (state.dataZoneEquip->ZoneEquipConfig(j).ZoneNode == i) { @@ -9694,6 +9728,12 @@ namespace AirflowNetworkBalanceManager { } } } + if (HPWHFound) { + ShowWarningError(state, "ValidateDistributionSystem: Heat pump water heater is simulated along with an AirflowNetwork but is not included in the AirflowNetwork."); + } + if (StandaloneERVFound) { + ShowWarningError(state, "ValidateDistributionSystem: A ZoneHVAC:EnergyRecoveryVentilator is simulated along with an AirflowNetwork but is not included in the AirflowNetwork."); + } NodeFound.deallocate(); // Assign AirLoop Number to every node and linkage diff --git a/src/EnergyPlus/ChilledCeilingPanelSimple.cc b/src/EnergyPlus/ChilledCeilingPanelSimple.cc index 0b3d3ea799d..2bd4f1ba79e 100644 --- a/src/EnergyPlus/ChilledCeilingPanelSimple.cc +++ b/src/EnergyPlus/ChilledCeilingPanelSimple.cc @@ -1696,8 +1696,7 @@ namespace CoolingPanelSimple { using DataHeatBalance::HConvIn; using DataHeatBalance::Zone; using DataHeatBalSurface::TempSurfInTmp; - using DataSurfaces::IntBlindOn; - using DataSurfaces::IntShadeOn; + using DataSurfaces::WinShadingType; using DataSurfaces::Surface; using DataSurfaces::SurfWinShadingFlag; using DataSurfaces::SurfWinFrameArea; @@ -1727,7 +1726,7 @@ namespace CoolingPanelSimple { if (ThisSurf.Class == DataSurfaces::SurfaceClass::Window) { - if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // The area is the shade or blind area = the sum of the glazing area and the divider area (which is zero if no divider) Area += DataSurfaces::SurfWinDividerArea(SurfNum); } @@ -1737,7 +1736,7 @@ namespace CoolingPanelSimple { SumHATsurf += HConvIn(SurfNum) * SurfWinFrameArea(SurfNum) * (1.0 + SurfWinProjCorrFrIn(SurfNum)) * SurfWinFrameTempSurfIn(SurfNum); } - if (SurfWinDividerArea(SurfNum) > 0.0 && SurfWinShadingFlag(SurfNum) != IntShadeOn && SurfWinShadingFlag(SurfNum) != IntBlindOn) { + if (SurfWinDividerArea(SurfNum) > 0.0 && !ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) SumHATsurf += HConvIn(SurfNum) * SurfWinDividerArea(SurfNum) * (1.0 + 2.0 * SurfWinProjCorrDivIn(SurfNum)) * SurfWinDividerTempSurfIn(SurfNum); diff --git a/src/EnergyPlus/ConvectionCoefficients.cc b/src/EnergyPlus/ConvectionCoefficients.cc index 0070ad3e1a2..ccbb802c392 100644 --- a/src/EnergyPlus/ConvectionCoefficients.cc +++ b/src/EnergyPlus/ConvectionCoefficients.cc @@ -401,7 +401,7 @@ namespace ConvectionCoefficients { if (!Surface(SurfNum).ExtWind) { SurfWindSpeed = 0.0; // No wind exposure - } else if (Surface(SurfNum).Class == SurfaceClass::Window && SurfWinShadingFlag(SurfNum) == ExtShadeOn) { + } else if (Surface(SurfNum).Class == SurfaceClass::Window && SurfWinShadingFlag(SurfNum) == WinShadingType::ExtShade) { SurfWindSpeed = 0.0; // Assume zero wind speed at outside glass surface of window with exterior shade } else { SurfWindSpeed = Surface(SurfNum).WindSpeed; @@ -4713,7 +4713,7 @@ namespace ConvectionCoefficients { if (!Surface(SurfNum).ExtWind) { SurfWindSpeed = 0.0; // No wind exposure - } else if (Surface(SurfNum).Class == SurfaceClass::Window && SurfWinShadingFlag(SurfNum) == ExtShadeOn) { + } else if (Surface(SurfNum).Class == SurfaceClass::Window && SurfWinShadingFlag(SurfNum) == WinShadingType::ExtShade) { SurfWindSpeed = 0.0; // Assume zero wind speed at outside glass surface of window with exterior shade } else { SurfWindSpeed = Surface(SurfNum).WindSpeed; diff --git a/src/EnergyPlus/DataHeatBalance.cc b/src/EnergyPlus/DataHeatBalance.cc index ac78df10a1d..9c28f631bbc 100644 --- a/src/EnergyPlus/DataHeatBalance.cc +++ b/src/EnergyPlus/DataHeatBalance.cc @@ -257,7 +257,15 @@ namespace DataHeatBalance { int const MixingSourceZonesOnly(1); int const AllZones(2); - int const NumZoneIntGainDeviceTypes(53); + // Parameter for zone air flow mass balancing method + int const AdjustMixingOnly(1); + int const AdjustReturnOnly(2); + int const AdjustMixingThenReturn(3); + int const AdjustReturnThenMixing(4); + int const NoAdjustReturnAndMixing(0); + // | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | + + int const NumZoneIntGainDeviceTypes(54); Array1D_string const ZoneIntGainDeviceTypes(NumZoneIntGainDeviceTypes, {"PEOPLE", "LIGHTS", @@ -280,6 +288,7 @@ namespace DataHeatBalance { "ELECTRICLOADCENTER:INVERTER:SIMPLE", "ELECTRICLOADCENTER:INVERTER:FUNCTIONOFPOWER", "ELECTRICLOADCENTER:INVERTER:LOOKUPTABLE", + "ELECTRICLOADCENTER:STORAGE:LIIONNMCBATTERY", "ELECTRICLOADCENTER:STORAGE:BATTERY", "ELECTRICLOADCENTER:STORAGE:SIMPLE", "PIPE:INDOOR", @@ -314,7 +323,7 @@ namespace DataHeatBalance { "FAN:SYSTEMMODEL"}); // 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 // | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | // 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 - // | 48 | 49 | 50 | 51 | 52 | 53 + // | 48 | 49 | 50 | 51 | 52 | 53 | 54 Array1D_string const ccZoneIntGainDeviceTypes(NumZoneIntGainDeviceTypes, {"People", @@ -338,6 +347,7 @@ namespace DataHeatBalance { "ElectricLoadCenter:Inverter:Simple", "ElectricLoadCenter:Inverter:FunctionOfPower", "ElectricLoadCenter:Inverter:LookUpTable", + "ElectricLoadCenter:Storage:LiIonNMCBattery", "ElectricLoadCenter:Storage:Battery", "ElectricLoadCenter:Storage:Simple", "Pipe:Indoor", @@ -372,7 +382,7 @@ namespace DataHeatBalance { "Fan:SystemModel"}); // 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | // 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | // 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | - // 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 + // 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 int const IntGainTypeOf_People(1); int const IntGainTypeOf_Lights(2); @@ -395,38 +405,39 @@ namespace DataHeatBalance { int const IntGainTypeOf_ElectricLoadCenterInverterSimple(19); int const IntGainTypeOf_ElectricLoadCenterInverterFunctionOfPower(20); int const IntGainTypeOf_ElectricLoadCenterInverterLookUpTable(21); - int const IntGainTypeOf_ElectricLoadCenterStorageBattery(22); - int const IntGainTypeOf_ElectricLoadCenterStorageSimple(23); - int const IntGainTypeOf_PipeIndoor(24); - int const IntGainTypeOf_RefrigerationCase(25); - int const IntGainTypeOf_RefrigerationCompressorRack(26); - int const IntGainTypeOf_RefrigerationSystemAirCooledCondenser(27); - int const IntGainTypeOf_RefrigerationTransSysAirCooledGasCooler(28); - int const IntGainTypeOf_RefrigerationSystemSuctionPipe(29); - int const IntGainTypeOf_RefrigerationTransSysSuctionPipeMT(30); - int const IntGainTypeOf_RefrigerationTransSysSuctionPipeLT(31); - int const IntGainTypeOf_RefrigerationSecondaryReceiver(32); - int const IntGainTypeOf_RefrigerationSecondaryPipe(33); - int const IntGainTypeOf_RefrigerationWalkIn(34); - int const IntGainTypeOf_Pump_VarSpeed(35); - int const IntGainTypeOf_Pump_ConSpeed(36); - int const IntGainTypeOf_Pump_Cond(37); - int const IntGainTypeOf_PumpBank_VarSpeed(38); - int const IntGainTypeOf_PumpBank_ConSpeed(39); - int const IntGainTypeOf_ZoneContaminantSourceAndSinkGenericContam(40); - int const IntGainTypeOf_PlantComponentUserDefined(41); - int const IntGainTypeOf_CoilUserDefined(42); - int const IntGainTypeOf_ZoneHVACForcedAirUserDefined(43); - int const IntGainTypeOf_AirTerminalUserDefined(44); - int const IntGainTypeOf_PackagedTESCoilTank(45); - int const IntGainTypeOf_ElectricEquipmentITEAirCooled(46); - int const IntGainTypeOf_SecCoolingDXCoilSingleSpeed(47); - int const IntGainTypeOf_SecHeatingDXCoilSingleSpeed(48); - int const IntGainTypeOf_SecCoolingDXCoilTwoSpeed(49); - int const IntGainTypeOf_SecCoolingDXCoilMultiSpeed(50); - int const IntGainTypeOf_SecHeatingDXCoilMultiSpeed(51); - int const IntGainTypeOf_ElectricLoadCenterConverter(52); - int const IntGainTypeOf_FanSystemModel(53); + int const IntGainTypeOf_ElectricLoadCenterStorageLiIonNmcBattery(22); + int const IntGainTypeOf_ElectricLoadCenterStorageBattery(23); + int const IntGainTypeOf_ElectricLoadCenterStorageSimple(24); + int const IntGainTypeOf_PipeIndoor(25); + int const IntGainTypeOf_RefrigerationCase(26); + int const IntGainTypeOf_RefrigerationCompressorRack(27); + int const IntGainTypeOf_RefrigerationSystemAirCooledCondenser(28); + int const IntGainTypeOf_RefrigerationTransSysAirCooledGasCooler(29); + int const IntGainTypeOf_RefrigerationSystemSuctionPipe(30); + int const IntGainTypeOf_RefrigerationTransSysSuctionPipeMT(31); + int const IntGainTypeOf_RefrigerationTransSysSuctionPipeLT(32); + int const IntGainTypeOf_RefrigerationSecondaryReceiver(33); + int const IntGainTypeOf_RefrigerationSecondaryPipe(34); + int const IntGainTypeOf_RefrigerationWalkIn(35); + int const IntGainTypeOf_Pump_VarSpeed(36); + int const IntGainTypeOf_Pump_ConSpeed(37); + int const IntGainTypeOf_Pump_Cond(38); + int const IntGainTypeOf_PumpBank_VarSpeed(39); + int const IntGainTypeOf_PumpBank_ConSpeed(40); + int const IntGainTypeOf_ZoneContaminantSourceAndSinkGenericContam(41); + int const IntGainTypeOf_PlantComponentUserDefined(42); + int const IntGainTypeOf_CoilUserDefined(43); + int const IntGainTypeOf_ZoneHVACForcedAirUserDefined(44); + int const IntGainTypeOf_AirTerminalUserDefined(45); + int const IntGainTypeOf_PackagedTESCoilTank(46); + int const IntGainTypeOf_ElectricEquipmentITEAirCooled(47); + int const IntGainTypeOf_SecCoolingDXCoilSingleSpeed(48); + int const IntGainTypeOf_SecHeatingDXCoilSingleSpeed(49); + int const IntGainTypeOf_SecCoolingDXCoilTwoSpeed(50); + int const IntGainTypeOf_SecCoolingDXCoilMultiSpeed(51); + int const IntGainTypeOf_SecHeatingDXCoilMultiSpeed(52); + int const IntGainTypeOf_ElectricLoadCenterConverter(53); + int const IntGainTypeOf_FanSystemModel(54); // Parameters for checking surface heat transfer models Real64 const HighDiffusivityThreshold(1.e-5); // used to check if Material properties are out of line. diff --git a/src/EnergyPlus/DataHeatBalance.hh b/src/EnergyPlus/DataHeatBalance.hh index 5801e9e0263..cc7918c15ab 100644 --- a/src/EnergyPlus/DataHeatBalance.hh +++ b/src/EnergyPlus/DataHeatBalance.hh @@ -215,6 +215,13 @@ namespace DataHeatBalance { extern int const MixingSourceZonesOnly; extern int const AllZones; + // Parameter for zone air flow mass balancing method + extern int const AdjustMixingOnly; + extern int const AdjustReturnOnly; + extern int const AdjustMixingThenReturn; + extern int const AdjustReturnThenMixing; + extern int const NoAdjustReturnAndMixing; + extern int const NumZoneIntGainDeviceTypes; extern Array1D_string const ZoneIntGainDeviceTypes; // 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | @@ -245,6 +252,7 @@ namespace DataHeatBalance { extern int const IntGainTypeOf_ElectricLoadCenterInverterSimple; extern int const IntGainTypeOf_ElectricLoadCenterInverterFunctionOfPower; extern int const IntGainTypeOf_ElectricLoadCenterInverterLookUpTable; + extern int const IntGainTypeOf_ElectricLoadCenterStorageLiIonNmcBattery; extern int const IntGainTypeOf_ElectricLoadCenterStorageBattery; extern int const IntGainTypeOf_ElectricLoadCenterStorageSimple; extern int const IntGainTypeOf_ElectricLoadCenterConverter; @@ -1366,13 +1374,14 @@ namespace DataHeatBalance { { // Members bool EnforceZoneMassBalance; // flag to enforce zone air mass conservation - bool BalanceMixing; // flag to allow mixing to be adjusted for zone mass balance + int ZoneFlowAdjustment; // specifies how zone air flow balance is determined (AdjustMixingOnly, AdjustReturnOnly, AdjustMixingThenReturn, AdjustReturnThenMixing, None) int InfiltrationTreatment; // determines how infiltration is treated for zone mass balance int InfiltrationZoneType; // specifies which types of zones allow infiltration to be changed // Note, unique global object // Default Constructor - ZoneAirMassFlowConservation() : EnforceZoneMassBalance(false), BalanceMixing(false), InfiltrationTreatment(0), InfiltrationZoneType(0) + ZoneAirMassFlowConservation() + : EnforceZoneMassBalance(false), ZoneFlowAdjustment(0), InfiltrationTreatment(0), InfiltrationZoneType(0) { } }; @@ -1860,19 +1869,44 @@ namespace DataHeatBalance { { // Members bool isOccupied; // occupied during the current time step + Real64 NumOcc; // number of occupants - used in calculating Vbz Real64 NumOccAccum; // number of occupants accumulating for entire simulation Real64 NumOccAccumTime; // time that the number of occupants is accumulating to compute average - // - zone time step + // - zone time step [hrs] Real64 TotTimeOcc; // time occupied (and the mechanical ventilation volume is accumulating) - // - system time step - Real64 MechVentVolTotal; // volume for mechanical ventilation of outside air for entire simulation - Real64 MechVentVolMin; // a large number since finding minimum volume - Real64 InfilVolTotal; // volume for infiltration of outside air for entire simulation - Real64 InfilVolMin; // a large number since finding minimum volume - Real64 AFNInfilVolTotal; // volume for infiltration of outside air for entire simulation - Real64 AFNInfilVolMin; // a large number since finding minimum volume - Real64 SimpVentVolTotal; // volume for simple 'ZoneVentilation' of outside air for entire simulation - Real64 SimpVentVolMin; // a large number since finding minimum volume + // - system time step [hrs] + + // OA Reports - accumulated values + // All Vol variables are in m3 + Real64 MechVentVolTotalOcc; // volume for mechanical ventilation of outside air for entire simulation during occupied at current + Real64 MechVentVolMin; // a large number since finding minimum volume at current zone air density + Real64 InfilVolTotalOcc; // volume for infiltration of outside air for entire simulation during occupied at current density + Real64 InfilVolMin; // a large number since finding minimum volume at current zone air density + Real64 AFNInfilVolTotalOcc; // volume for infiltration of outside air for entire simulation during occupied at zone air density + Real64 AFNInfilVolMin; // a large number since finding minimum volume at current zone air density + Real64 SimpVentVolTotalOcc; // volume for simple 'ZoneVentilation' of outside air for entire simulation during occupied current + Real64 SimpVentVolMin; // a large number since finding minimum volumeat current zone air density + Real64 MechVentVolTotalStdDen; // volume for mechanical ventilation of outside air for entire simulation at standard density + Real64 MechVentVolTotalOccStdDen; // volume for mechanical ventilation of outside air for entire simulation during occupied at std + Real64 InfilVolTotalStdDen; // volume for infiltration of outside air for entire simulation at standard density + Real64 InfilVolTotalOccStdDen; // volume for infiltration of outside air for entire simulation standard density + Real64 AFNInfilVolTotalStdDen; // volume for infiltration of outside air for entire simulation at standard density + Real64 AFNInfilVolTotalOccStdDen; // volume for infiltration of outside air for entire simulation during occupied at std density + Real64 AFNVentVolTotalStdDen; // current volume flow rate for natural ventilation at standard density + Real64 AFNVentVolTotalOccStdDen; // current volume flow rate for natural ventilation during occupied at standard density + Real64 SimpVentVolTotalStdDen; // volume for simple 'ZoneVentilation' of outside air for entire simulation at std density + Real64 SimpVentVolTotalOccStdDen; // volume for simple 'ZoneVentilation' of outside air for entire simulation during occupied std + Real64 VozMin; // minimum outdoor zone ventilation + Real64 VozTargetTotal; // volume for target Voz-dyn for entire simulation at std density + Real64 VozTargetTotalOcc; // volume for target Voz-dyn for entire simulation during occupied + Real64 VozTargetTimeBelow; // time [hrs] that mechanical+natural ventilation is < VozTarget - 1% + Real64 VozTargetTimeAt; // time [hrs] that mechanical+natural ventilation is = VozTarget within 1% and > zero + Real64 VozTargetTimeAbove; // time [hrs] that mechanical+natural ventilation is > VozTarget + 1% + Real64 VozTargetTimeBelowOcc; // time [hrs] that mechanical+natural ventilation is < VozTarget - 1% during occupied + Real64 VozTargetTimeAtOcc; // time [hrs] that mechanical+natural ventilation is = VozTarget within 1% and > zero during occupied + Real64 VozTargetTimeAboveOcc; // time [hrs] that mechanical+natural ventilation is > VozTarget + 1% during occupied + Real64 TotVentTimeNonZeroUnocc; // time [hrs] that mechanical+natural ventilation is > zero during UNoccupied + // for Sensible Heat Gas Component Report // annual Real64 SHGSAnZoneEqHt; // Zone Eq heating @@ -1946,19 +1980,23 @@ namespace DataHeatBalance { // Default Constructor ZonePreDefRepType() - : isOccupied(false), NumOccAccum(0.0), NumOccAccumTime(0.0), TotTimeOcc(0.0), MechVentVolTotal(0.0), MechVentVolMin(9.9e9), - InfilVolTotal(0.0), InfilVolMin(9.9e9), AFNInfilVolTotal(0.0), AFNInfilVolMin(9.9e9), SimpVentVolTotal(0.0), SimpVentVolMin(9.9e9), - SHGSAnZoneEqHt(0.0), SHGSAnZoneEqCl(0.0), SHGSAnHvacATUHt(0.0), SHGSAnHvacATUCl(0.0), SHGSAnSurfHt(0.0), SHGSAnSurfCl(0.0), - SHGSAnPeoplAdd(0.0), SHGSAnLiteAdd(0.0), SHGSAnEquipAdd(0.0), SHGSAnWindAdd(0.0), SHGSAnIzaAdd(0.0), SHGSAnInfilAdd(0.0), - SHGSAnOtherAdd(0.0), SHGSAnEquipRem(0.0), SHGSAnWindRem(0.0), SHGSAnIzaRem(0.0), SHGSAnInfilRem(0.0), SHGSAnOtherRem(0.0), - clPtTimeStamp(0), clPeak(0.0), SHGSClHvacHt(0.0), SHGSClHvacCl(0.0), SHGSClHvacATUHt(0.0), SHGSClHvacATUCl(0.0), SHGSClSurfHt(0.0), - SHGSClSurfCl(0.0), SHGSClPeoplAdd(0.0), SHGSClLiteAdd(0.0), SHGSClEquipAdd(0.0), SHGSClWindAdd(0.0), SHGSClIzaAdd(0.0), - SHGSClInfilAdd(0.0), SHGSClOtherAdd(0.0), SHGSClEquipRem(0.0), SHGSClWindRem(0.0), SHGSClIzaRem(0.0), SHGSClInfilRem(0.0), - SHGSClOtherRem(0.0), htPtTimeStamp(0), htPeak(0.0), SHGSHtHvacHt(0.0), SHGSHtHvacCl(0.0), SHGSHtHvacATUHt(0.0), SHGSHtHvacATUCl(0.0), - SHGSHtSurfHt(0.0), SHGSHtSurfCl(0.0), SHGSHtPeoplAdd(0.0), SHGSHtLiteAdd(0.0), SHGSHtEquipAdd(0.0), SHGSHtWindAdd(0.0), - SHGSHtIzaAdd(0.0), SHGSHtInfilAdd(0.0), SHGSHtOtherAdd(0.0), SHGSHtEquipRem(0.0), SHGSHtWindRem(0.0), SHGSHtIzaRem(0.0), - SHGSHtInfilRem(0.0), SHGSHtOtherRem(0.0), emiEnvelopConv(0.0), emiZoneExfiltration(0.0), emiZoneExhaust(0.0), emiHVACRelief(0.0), - emiHVACReject(0.0), emiTotHeat(0.0) + : isOccupied(false), NumOcc(0.0), NumOccAccum(0.0), NumOccAccumTime(0.0), TotTimeOcc(0.0), MechVentVolTotalOcc(0.0), + MechVentVolMin(9.9e9), InfilVolTotalOcc(0.0), InfilVolMin(9.9e9), AFNInfilVolTotalOcc(0.0), AFNInfilVolMin(9.9e9), + SimpVentVolTotalOcc(0.0), SimpVentVolMin(9.9e9), MechVentVolTotalStdDen(0.0), MechVentVolTotalOccStdDen(0.0), InfilVolTotalStdDen(0.0), + InfilVolTotalOccStdDen(0.0), AFNInfilVolTotalStdDen(0.0), AFNInfilVolTotalOccStdDen(0.0), AFNVentVolTotalStdDen(0.0), + AFNVentVolTotalOccStdDen(0.0), SimpVentVolTotalStdDen(0.0), SimpVentVolTotalOccStdDen(0.0), VozMin(0.0), VozTargetTotal(0.0), + VozTargetTotalOcc(0.0), VozTargetTimeBelow(0.0), VozTargetTimeAt(0.0), VozTargetTimeAbove(0.0), VozTargetTimeBelowOcc(0.0), + VozTargetTimeAtOcc(0.0), VozTargetTimeAboveOcc(0.0), TotVentTimeNonZeroUnocc(0.0), SHGSAnZoneEqHt(0.0), SHGSAnZoneEqCl(0.0), + SHGSAnHvacATUHt(0.0), SHGSAnHvacATUCl(0.0), SHGSAnSurfHt(0.0), SHGSAnSurfCl(0.0), SHGSAnPeoplAdd(0.0), SHGSAnLiteAdd(0.0), + SHGSAnEquipAdd(0.0), SHGSAnWindAdd(0.0), SHGSAnIzaAdd(0.0), SHGSAnInfilAdd(0.0), SHGSAnOtherAdd(0.0), SHGSAnEquipRem(0.0), + SHGSAnWindRem(0.0), SHGSAnIzaRem(0.0), SHGSAnInfilRem(0.0), SHGSAnOtherRem(0.0), clPtTimeStamp(0), clPeak(0.0), SHGSClHvacHt(0.0), + SHGSClHvacCl(0.0), SHGSClHvacATUHt(0.0), SHGSClHvacATUCl(0.0), SHGSClSurfHt(0.0), SHGSClSurfCl(0.0), SHGSClPeoplAdd(0.0), + SHGSClLiteAdd(0.0), SHGSClEquipAdd(0.0), SHGSClWindAdd(0.0), SHGSClIzaAdd(0.0), SHGSClInfilAdd(0.0), SHGSClOtherAdd(0.0), + SHGSClEquipRem(0.0), SHGSClWindRem(0.0), SHGSClIzaRem(0.0), SHGSClInfilRem(0.0), SHGSClOtherRem(0.0), htPtTimeStamp(0), htPeak(0.0), + SHGSHtHvacHt(0.0), SHGSHtHvacCl(0.0), SHGSHtHvacATUHt(0.0), SHGSHtHvacATUCl(0.0), SHGSHtSurfHt(0.0), SHGSHtSurfCl(0.0), + SHGSHtPeoplAdd(0.0), SHGSHtLiteAdd(0.0), SHGSHtEquipAdd(0.0), SHGSHtWindAdd(0.0), SHGSHtIzaAdd(0.0), SHGSHtInfilAdd(0.0), + SHGSHtOtherAdd(0.0), SHGSHtEquipRem(0.0), SHGSHtWindRem(0.0), SHGSHtIzaRem(0.0), SHGSHtInfilRem(0.0), SHGSHtOtherRem(0.0), + emiEnvelopConv(0.0), emiZoneExfiltration(0.0), emiZoneExhaust(0.0), emiHVACRelief(0.0), emiHVACReject(0.0), emiTotHeat(0.0) { } }; diff --git a/src/EnergyPlus/DataSizing.cc b/src/EnergyPlus/DataSizing.cc index b6d73c54bb0..3ccd5d8a5a8 100644 --- a/src/EnergyPlus/DataSizing.cc +++ b/src/EnergyPlus/DataSizing.cc @@ -50,6 +50,8 @@ #include #include #include +#include +#include namespace EnergyPlus { @@ -58,8 +60,6 @@ namespace DataSizing { // MODULE INFORMATION: // AUTHOR Fred Buhl // DATE WRITTEN December 2000 - // MODIFIED na - // RE-ENGINEERED na // PURPOSE OF THIS MODULE: // This data-only module contains type definitions and variables @@ -67,19 +67,6 @@ namespace DataSizing { // capacities. This data is available to the HVAC component modules // for their self sizing calculations. - // REFERENCES: - // na - - // OTHER NOTES: - // na - - // Using/Aliasing - // Data - // -only module should be available to other modules and routines. - // Thus, all variables in this module must be PUBLIC. - - // MODULE PARAMETER DEFINITIONS: - // parameters for outside air flow method int const NumOAFlowMethods(9); @@ -198,13 +185,6 @@ namespace DataSizing { int const GlobalCoolingSizingFactorMode(103); int const LoopComponentSizingFactorMode(104); - // DERIVED TYPE DEFINITIONS: - - // INTERFACE BLOCK SPECIFICATIONS - // na - - // MODULE VARIABLE DECLARATIONS: - // days; includes effects of user multiplier // and user set flows) // of user input multiplier and flows @@ -965,6 +945,31 @@ namespace DataSizing { } } + Real64 ZoneAirDistributionData::calculateEz(EnergyPlusData &state, int const ZoneNum) // Zone index + { + Real64 zoneEz = 1.0; + // Calc the zone supplied OA flow rate counting the zone air distribution effectiveness + // First check whether the zone air distribution effectiveness schedule exists, if yes uses it; + // otherwise uses the inputs of zone distribution effectiveness in cooling mode or heating mode + if (this->ZoneADEffSchPtr > 0) { + // Get schedule value for the zone air distribution effectiveness + zoneEz = ScheduleManager::GetCurrentScheduleValue(state, this->ZoneADEffSchPtr); + } else { + Real64 zoneLoad = state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ZoneNum).TotalOutputRequired; + + // Zone in cooling mode + if (zoneLoad < 0.0) zoneEz = this->ZoneADEffCooling; + + // Zone in heating mode + if (zoneLoad > 0.0) zoneEz = this->ZoneADEffHeating; + } + if (zoneEz <= 0.0) { + // Enforce defaults + zoneEz = 1.0; + } + return zoneEz; + } + } // namespace DataSizing } // namespace EnergyPlus diff --git a/src/EnergyPlus/DataSizing.hh b/src/EnergyPlus/DataSizing.hh index ce29154a20a..c5a3bfa1337 100644 --- a/src/EnergyPlus/DataSizing.hh +++ b/src/EnergyPlus/DataSizing.hh @@ -416,7 +416,9 @@ namespace DataSizing { Real64 HeatDesTempDiff; // zone design heating supply air temperature difference [deltaC] Real64 CoolDesHumRat; // zone design cooling supply air humidity ratio [kgWater/kgDryAir] Real64 HeatDesHumRat; // zone design heating supply air humidity ratio [kgWater/kgDryAir] - int ZoneDesignSpecOAIndex; // index to DesignSpecification:OutdoorAir object + int ZoneAirDistributionIndex; // index to DesignSpecification:ZoneAirDistribution object + int ZoneDesignSpecOAIndex; // index to DesignSpecification:OutdoorAir object + int OADesMethod; // choice of how to calculate minimum outside air; // 1 = m3/s per person; 2 = m3/s per zone; 3 = m3/s per zone area; // 4 = sum of flow from 3 OA input fields; @@ -588,7 +590,7 @@ namespace DataSizing { // Default Constructor ZoneSizingData() : ZnCoolDgnSAMethod(0), ZnHeatDgnSAMethod(0), CoolDesTemp(0.0), HeatDesTemp(0.0), CoolDesTempDiff(0.0), HeatDesTempDiff(0.0), - CoolDesHumRat(0.0), HeatDesHumRat(0.0), ZoneDesignSpecOAIndex(0), OADesMethod(0), DesOAFlowPPer(0.0), DesOAFlowPerArea(0.0), + CoolDesHumRat(0.0), HeatDesHumRat(0.0), ZoneAirDistributionIndex(0), ZoneDesignSpecOAIndex(0), OADesMethod(0), DesOAFlowPPer(0.0), DesOAFlowPerArea(0.0), DesOAFlow(0.0), CoolAirDesMethod(0), InpDesCoolAirFlow(0.0), DesCoolMinAirFlowPerArea(0.0), DesCoolMinAirFlow(0.0), DesCoolMinAirFlowFrac(0.0), HeatAirDesMethod(0), InpDesHeatAirFlow(0.0), DesHeatMaxAirFlowPerArea(0.0), DesHeatMaxAirFlow(0.0), DesHeatMaxAirFlowFrac(0.0), HeatSizingFactor(0.0), CoolSizingFactor(0.0), AccountForDOAS(false), DOASControlStrategy(0), @@ -1158,6 +1160,8 @@ namespace DataSizing { : ZoneADEffCooling(1.0), ZoneADEffHeating(1.0), ZoneSecondaryRecirculation(0.0), ZoneADEffSchPtr(0), ZoneVentilationEff(0.0) { } + + Real64 calculateEz(EnergyPlusData &state, int const ZoneNum); // Zone index }; // Object Data diff --git a/src/EnergyPlus/DataSurfaces.cc b/src/EnergyPlus/DataSurfaces.cc index 411a7ff7c0d..b905c74d5dd 100644 --- a/src/EnergyPlus/DataSurfaces.cc +++ b/src/EnergyPlus/DataSurfaces.cc @@ -237,57 +237,6 @@ namespace DataSurfaces { int const InConvWinLoc_WindowBelowThis(4); // this is a wall with window below it int const InConvWinLoc_LargePartOfExteriorWall(5); // this is a big window taking up most of wall - // Parameters for window shade status - int const NoShade(-1); - int const ShadeOff(0); - int const IntShadeOn(1); // Interior shade on - int const SwitchableGlazing(2); - int const ExtShadeOn(3); // Exterior shade on - int const ExtScreenOn(4); // Exterior screen on - int const IntBlindOn(6); // Interior blind on - int const ExtBlindOn(7); // Exterior blind on - int const BGShadeOn(8); // Between-glass shade on - int const BGBlindOn(9); // Between-glass blind on - int const IntShadeConditionallyOff(10); - int const GlassConditionallyLightened(20); - int const ExtShadeConditionallyOff(30); - int const IntBlindConditionallyOff(60); - int const ExtBlindConditionallyOff(70); - - // WindowShadingControl Shading Types - int const WSC_ST_NoShade(0); - int const WSC_ST_InteriorShade(1); - int const WSC_ST_SwitchableGlazing(2); - int const WSC_ST_ExteriorShade(3); - int const WSC_ST_InteriorBlind(4); - int const WSC_ST_ExteriorBlind(5); - int const WSC_ST_BetweenGlassShade(6); - int const WSC_ST_BetweenGlassBlind(7); - int const WSC_ST_ExteriorScreen(8); - - // WindowShadingControl Control Types - int const WSCT_AlwaysOn(1); // AlwaysOn - int const WSCT_AlwaysOff(2); // AlwaysOff - int const WSCT_OnIfScheduled(3); // OnIfScheduleAllows - int const WSCT_HiSolar(4); // OnIfHighSolarOnWindow - int const WSCT_HiHorzSolar(5); // OnIfHighHorizontalSolar - int const WSCT_HiOutAirTemp(6); // OnIfHighOutsideAirTemp - int const WSCT_HiZoneAirTemp(7); // OnIfHighZoneAirTemp - int const WSCT_HiZoneCooling(8); // OnIfHighZoneCooling - int const WSCT_HiGlare(9); // OnIfHighGlare - int const WSCT_MeetDaylIlumSetp(10); // MeetDaylightIlluminanceSetpoint - int const WSCT_OnNightLoOutTemp_OffDay(11); // OnNightIfLowOutsideTemp/OffDay - int const WSCT_OnNightLoInTemp_OffDay(12); // OnNightIfLowInsideTemp/OffDay - int const WSCT_OnNightIfHeating_OffDay(13); // OnNightIfHeating/OffDay - int const WSCT_OnNightLoOutTemp_OnDayCooling(14); // OnNightIfLowOutsideTemp/OnDayIfCooling - int const WSCT_OnNightIfHeating_OnDayCooling(15); // OnNightIfHeating/OnDayIfCooling - int const WSCT_OffNight_OnDay_HiSolarWindow(16); // OffNight/OnDayIfCoolingAndHighSolarOnWindow - int const WSCT_OnNight_OnDay_HiSolarWindow(17); // OnNight/OnDayIfCoolingAndHighSolarOnWindow - int const WSCT_OnHiOutTemp_HiSolarWindow(18); // OnIfHighOutsideAirTempAndHighSolarOnWindow - int const WSCT_OnHiOutTemp_HiHorzSolar(19); // OnIfHighOutsideAirTempAndHighHorizontalSolar - int const WSCT_OnHiZoneTemp_HiSolarWindow(20); // OnIfHighZoneAirTempAndHighSolarOnWindow - int const WSCT_OnHiZoneTemp_HiHorzSolar(21); // OnIfHighZoneAirTempAndHighHorizontalSolar - // WindowShadingControl Slat Angle Control for Blinds int const WSC_SAC_FixedSlatAngle(1); int const WSC_SAC_ScheduledSlatAngle(2); @@ -511,13 +460,13 @@ namespace DataSurfaces { Array1D SurfWinProfileAngHor; // Horizontal beam solar profile angle (degrees) Array1D SurfWinProfileAngVert; // Vertical beam solar profile angle (degrees) - Array1D SurfWinShadingFlag; // -1: window has no shading device + Array1D SurfWinShadingFlag; // -1: window has no shading device Array1D SurfWinShadingFlagEMSOn; // EMS control flag, true if EMS is controlling ShadingFlag with ShadingFlagEMSValue - Array1D SurfWinShadingFlagEMSValue; // EMS control value for Shading Flag + Array1D SurfWinShadingFlagEMSValue; // EMS control value for Shading Flag Array1D SurfWinStormWinFlag; // -1: Storm window not applicable; 0: Window has storm window but it is off 1: Window has storm window and it is on Array1D SurfWinStormWinFlagPrevDay; // Previous time step value of StormWinFlag Array1D SurfWinFracTimeShadingDeviceOn; // For a single time step, = 0.0 if no shading device or shading device is off = 1.0 if shading device is on; For time intervals longer than a time step, = fraction of time that shading device is on. - Array1D SurfWinExtIntShadePrevTS; // 1 if exterior or interior blind or shade in place previous time step;0 otherwise + Array1D SurfWinExtIntShadePrevTS; // 1 if exterior or interior blind or shade in place previous time step;0 otherwise Array1D SurfWinHasShadeOrBlindLayer; // mark as true if the window construction has a shade or a blind layer Array1D SurfWinSurfDayLightInit; // surface has been initialized for following 5 arrays Array1D SurfWinDaylFacPoint; // Pointer to daylight factors for the window @@ -608,6 +557,7 @@ namespace DataSurfaces { bool AnyHeatBalanceInsideSourceTerm(false); // True if any SurfaceProperty:HeatBalanceSourceTerm inside face used bool AnyHeatBalanceOutsideSourceTerm(false); // True if any SurfaceProperty:HeatBalanceSourceTerm outside face used + // SUBROUTINE SPECIFICATIONS FOR MODULE DataSurfaces: // Object Data diff --git a/src/EnergyPlus/DataSurfaces.hh b/src/EnergyPlus/DataSurfaces.hh index 322c36d8c7b..a579035c041 100644 --- a/src/EnergyPlus/DataSurfaces.hh +++ b/src/EnergyPlus/DataSurfaces.hh @@ -65,6 +65,33 @@ #include #include + +#define BITF(B) (1 << (int(B))) +#define BITF_TEST_ANY(V, B) (((V) & (B)) != 0) + +// IS_SHADED is the flag to indicate window has no shading device or shading device is off, and no daylight glare control +// original expression: SHADE_FLAG == ShadeOff || SHADE_FLAG == ShadeOff +#define NOT_SHADED(SHADE_FLAG) BITF_TEST_ANY(BITF(SHADE_FLAG), BITF(WinShadingType::NoShade) | BITF(WinShadingType::ShadeOff)) + +// IS_SHADED is the flag to indicate window has shade on or temporarily off but may be triggered on later to control daylight glare +// original expression: SHADE_FLAG > ShadeOff +#define IS_SHADED(SHADE_FLAG) !NOT_SHADED(SHADE_FLAG) + +// IS_SHADED_NO_GLARE is the flag to indicate window has shade and no daylight glare control +// original expression: IntShade <= SHADE_FLAG <= BGBlind +#define IS_SHADED_NO_GLARE_CTRL(SHADE_FLAG) BITF_TEST_ANY(BITF(SHADE_FLAG), \ + BITF(WinShadingType::IntShade) | BITF(WinShadingType::SwitchableGlazing) | BITF(WinShadingType::ExtShade) | BITF(WinShadingType::ExtScreen) |\ + BITF(WinShadingType::IntBlind) | BITF(WinShadingType::ExtBlind) | BITF(WinShadingType::BGShade) | BITF(WinShadingType::BGBlind)) + +// ANY_SHADE: if SHADE_FLAG is any of the shading types including interior, exterior or between glass shades +#define ANY_SHADE(SHADE_FLAG) BITF_TEST_ANY(BITF(SHADE_FLAG), BITF(WinShadingType::IntShade) | BITF(WinShadingType::ExtShade) | BITF(WinShadingType::BGShade)) +#define ANY_SHADE_SCREEN(SHADE_FLAG) BITF_TEST_ANY(BITF(SHADE_FLAG), BITF(WinShadingType::IntShade) | BITF(WinShadingType::ExtShade) | BITF(WinShadingType::BGShade) | BITF(WinShadingType::ExtScreen)) +#define ANY_BLIND(SHADE_FLAG) BITF_TEST_ANY(BITF(SHADE_FLAG), BITF(WinShadingType::IntBlind) | BITF(WinShadingType::ExtBlind) | BITF(WinShadingType::BGBlind)) +#define ANY_INTERIOR_SHADE_BLIND(SHADE_FLAG) BITF_TEST_ANY(BITF(SHADE_FLAG), BITF(WinShadingType::IntShade) | BITF(WinShadingType::IntBlind)) +#define ANY_EXTERIOR_SHADE_BLIND_SCREEN(SHADE_FLAG) BITF_TEST_ANY(BITF(SHADE_FLAG), BITF(WinShadingType::ExtShade) | BITF(WinShadingType::ExtBlind) | BITF(WinShadingType::ExtScreen)) +#define ANY_BETWEENGLASS_SHADE_BLIND(SHADE_FLAG) BITF_TEST_ANY(BITF(SHADE_FLAG), BITF(WinShadingType::BGShade) | BITF(WinShadingType::BGBlind)) + + namespace EnergyPlus { // Forward declarations @@ -122,6 +149,52 @@ namespace DataSurfaces { Count // The counter representing the total number of surface class, always stays at the bottom }; + enum class WinShadingType : int { + INVALID = -1, + NoShade = 0, + ShadeOff = 1, + IntShade = 2, + SwitchableGlazing = 3, + ExtShade = 4, + ExtScreen = 5, + IntBlind = 6, + ExtBlind = 7, + BGShade = 8, + BGBlind = 9, + IntShadeConditionallyOff = 10, + GlassConditionallyLightened = 11, + ExtShadeConditionallyOff = 12, + IntBlindConditionallyOff = 13, + ExtBlindConditionallyOff = 14, + BGShadeConditionallyOff = 15, + BGBlindConditionallyOff = 16 + }; // Valid window shading types: IntShade <= Type <= BGBlind; the rest are shading status + + enum class WindowShadingControlType : int{ + UnControlled = 0, + AlwaysOn = 1, + AlwaysOff = 2, + OnIfScheduled = 3, + HiSolar = 4, + HiHorzSolar = 5, + HiOutAirTemp = 6, + HiZoneAirTemp = 7, + HiZoneCooling = 8, + HiGlare = 9, + MeetDaylIlumSetp = 10, + OnNightLoOutTemp_OffDay = 11, + OnNightLoInTemp_OffDay = 12, + OnNightIfHeating_OffDay = 13, + OnNightLoOutTemp_OnDayCooling = 14, + OnNightIfHeating_OnDayCooling = 15, + OffNight_OnDay_HiSolarWindow = 16, + OnNight_OnDay_HiSolarWindow = 17, + OnHiOutTemp_HiSolarWindow = 18, + OnHiOutTemp_HiHorzSolar = 19, + OnHiZoneTemp_HiSolarWindow = 20, + OnHiZoneTemp_HiHorzSolar = 21 + }; + // Parameters to indicate exterior boundary conditions for use with // the Surface derived type (see below): // Note: Positive values correspond to an interzone adjacent surface @@ -241,57 +314,6 @@ namespace DataSurfaces { extern int const InConvWinLoc_WindowBelowThis; // this is a wall with window below it extern int const InConvWinLoc_LargePartOfExteriorWall; // this is a big window taking up most of wall - // Parameters for window shade status - extern int const NoShade; - extern int const ShadeOff; - extern int const IntShadeOn; // Interior shade on - extern int const SwitchableGlazing; - extern int const ExtShadeOn; // Exterior shade on - extern int const ExtScreenOn; // Exterior screen on - extern int const IntBlindOn; // Interior blind on - extern int const ExtBlindOn; // Exterior blind on - extern int const BGShadeOn; // Between-glass shade on - extern int const BGBlindOn; // Between-glass blind on - extern int const IntShadeConditionallyOff; - extern int const GlassConditionallyLightened; - extern int const ExtShadeConditionallyOff; - extern int const IntBlindConditionallyOff; - extern int const ExtBlindConditionallyOff; - - // WindowShadingControl Shading Types - extern int const WSC_ST_NoShade; - extern int const WSC_ST_InteriorShade; - extern int const WSC_ST_SwitchableGlazing; - extern int const WSC_ST_ExteriorShade; - extern int const WSC_ST_InteriorBlind; - extern int const WSC_ST_ExteriorBlind; - extern int const WSC_ST_BetweenGlassShade; - extern int const WSC_ST_BetweenGlassBlind; - extern int const WSC_ST_ExteriorScreen; - - // WindowShadingControl Control Types - extern int const WSCT_AlwaysOn; // AlwaysOn - extern int const WSCT_AlwaysOff; // AlwaysOff - extern int const WSCT_OnIfScheduled; // OnIfScheduleAllows - extern int const WSCT_HiSolar; // OnIfHighSolarOnWindow - extern int const WSCT_HiHorzSolar; // OnIfHighHorizontalSolar - extern int const WSCT_HiOutAirTemp; // OnIfHighOutsideAirTemp - extern int const WSCT_HiZoneAirTemp; // OnIfHighZoneAirTemp - extern int const WSCT_HiZoneCooling; // OnIfHighZoneCooling - extern int const WSCT_HiGlare; // OnIfHighGlare - extern int const WSCT_MeetDaylIlumSetp; // MeetDaylightIlluminanceSetpoint - extern int const WSCT_OnNightLoOutTemp_OffDay; // OnNightIfLowOutsideTemp/OffDay - extern int const WSCT_OnNightLoInTemp_OffDay; // OnNightIfLowInsideTemp/OffDay - extern int const WSCT_OnNightIfHeating_OffDay; // OnNightIfHeating/OffDay - extern int const WSCT_OnNightLoOutTemp_OnDayCooling; // OnNightIfLowOutsideTemp/OnDayIfCooling - extern int const WSCT_OnNightIfHeating_OnDayCooling; // OnNightIfHeating/OnDayIfCooling - extern int const WSCT_OffNight_OnDay_HiSolarWindow; // OffNight/OnDayIfCoolingAndHighSolarOnWindow - extern int const WSCT_OnNight_OnDay_HiSolarWindow; // OnNight/OnDayIfCoolingAndHighSolarOnWindow - extern int const WSCT_OnHiOutTemp_HiSolarWindow; // OnIfHighOutsideAirTempAndHighSolarOnWindow - extern int const WSCT_OnHiOutTemp_HiHorzSolar; // OnIfHighOutsideAirTempAndHighHorizontalSolar - extern int const WSCT_OnHiZoneTemp_HiSolarWindow; // OnIfHighZoneAirTempAndHighSolarOnWindow - extern int const WSCT_OnHiZoneTemp_HiHorzSolar; // OnIfHighZoneAirTempAndHighHorizontalSolar - // WindowShadingControl Slat Angle Control for Blinds extern int const WSC_SAC_FixedSlatAngle; extern int const WSC_SAC_ScheduledSlatAngle; @@ -492,6 +514,7 @@ namespace DataSurfaces { extern Array1D SurfWinConvHeatGainToZoneAir; // Convective heat gain to zone air from window gap airflow (W) extern Array1D SurfWinRetHeatGainToZoneAir; // Convective heat gain to return air sent to zone [W] extern Array1D SurfWinDividerHeatGain; + extern Array1D SurfWinBlTsolBmBm; // Time-step value of blind beam-beam solar transmittance (-) extern Array1D SurfWinBlTsolBmDif; // Time-step value of blind beam-diffuse solar transmittance (-) extern Array1D SurfWinBlTsolDifDif; // Time-step value of blind diffuse-diffuse solar transmittance (-) @@ -534,16 +557,16 @@ namespace DataSurfaces { extern Array1D SurfWinProfileAngHor; // Horizontal beam solar profile angle (degrees) extern Array1D SurfWinProfileAngVert; // Vertical beam solar profile angle (degrees) - extern Array1D SurfWinShadingFlag; // -1: window has no shading device + extern Array1D SurfWinShadingFlag; // -1: window has no shading device extern Array1D SurfWinShadingFlagEMSOn; // EMS control flag, true if EMS is controlling ShadingFlag with ShadingFlagEMSValue - extern Array1D SurfWinShadingFlagEMSValue; // EMS control value for Shading Flag + extern Array1D SurfWinShadingFlagEMSValue; // EMS control value for Shading Flag extern Array1D SurfWinStormWinFlag; // -1: Storm window not applicable; 0: Window has storm window but it is off 1: Window has storm window and it is on extern Array1D SurfWinStormWinFlagPrevDay; // Previous time step value of StormWinFlag extern Array1D SurfWinFracTimeShadingDeviceOn; // For a single time step, = 0.0 if no shading device or shading device is off = 1.0 if shading device is on; // For time intervals longer than a time step, = fraction of time that shading device is on. - extern Array1D SurfWinExtIntShadePrevTS; // 1 if exterior or interior blind or shade in place previous time step;0 otherwise + extern Array1D SurfWinExtIntShadePrevTS; // 1 if exterior or interior blind or shade in place previous time step;0 otherwise extern Array1D SurfWinHasShadeOrBlindLayer; // mark as true if the window construction has a shade or a blind layer extern Array1D SurfWinSurfDayLightInit; // surface has been initialized for following 5 arrays extern Array1D SurfWinDaylFacPoint; // Pointer to daylight factors for the window @@ -1137,7 +1160,7 @@ namespace DataSurfaces { std::string Name; // User supplied name of this set of shading control data int ZoneIndex; // number of the zone referenced int SequenceNumber; // Shading control sequence number - int ShadingType; // Shading type (InteriorShade, SwitchableGlazing, + WinShadingType ShadingType; // Shading type (InteriorShade, SwitchableGlazing, // CHARACTER(len=32) :: ShadingType = ' ' ! Shading type (InteriorShade, SwitchableGlazing, // ExteriorShade,InteriorBlind,ExteriorBlind,BetweenGlassShade, // BetweenGlassBlind, or ExteriorScreen) @@ -1149,7 +1172,7 @@ namespace DataSurfaces { // ExteriorShade,BetweenGlassShade,InteriorBlind,ExteriorBlind,BetweenGlassBlind, // ExteriorScreen; // this must be a Material:WindowShade, Material:WindowScreen, or Material:WindowBlind - int ShadingControlType; // Takes one of the following values that specifies type of shading control + WindowShadingControlType ShadingControlType; // Takes one of the following values that specifies type of shading control // CHARACTER(len=60) :: ShadingControlType =' ' ! Takes one of the following values that specifies type of shading control // (control is active only when schedule value = 1; if no schedule // specified, schedule value defaults to 1) @@ -1223,7 +1246,7 @@ namespace DataSurfaces { // Default Constructor WindowShadingControlData() - : ZoneIndex(0), SequenceNumber(0), ShadingType(WSC_ST_NoShade), getInputShadedConstruction(0), ShadingDevice(0), ShadingControlType(0), + : ZoneIndex(0), SequenceNumber(0), ShadingType(WinShadingType::NoShade), getInputShadedConstruction(0), ShadingDevice(0), ShadingControlType(WindowShadingControlType::UnControlled), Schedule(0), SetPoint(0.0), SetPoint2(0.0), ShadingControlIsScheduled(false), GlareControlIsActive(false), SlatAngleSchedule(0), SlatAngleControlForBlinds(0), DaylightControlIndex(0), MultiSurfaceCtrlIsGroup(false), FenestrationCount(0) { diff --git a/src/EnergyPlus/DataZoneEquipment.cc b/src/EnergyPlus/DataZoneEquipment.cc index dcf7f621b25..7639d978042 100644 --- a/src/EnergyPlus/DataZoneEquipment.cc +++ b/src/EnergyPlus/DataZoneEquipment.cc @@ -1282,8 +1282,6 @@ namespace EnergyPlus::DataZoneEquipment { // FUNCTION INFORMATION: // AUTHOR Richard Raustad, FSEC // DATE WRITTEN October 2012 - // MODIFIED na - // RE-ENGINEERED na // PURPOSE OF THIS FUNCTION: // This function returns the air volume flow rate based on DesignSpecification:OutdoorAir object. @@ -1293,7 +1291,6 @@ namespace EnergyPlus::DataZoneEquipment { // Sizing does not use occupancy or min OA schedule and will call with flags set to FALSE // Ventilation Rate Procedure uses occupancy schedule based on user input. - // Using/Aliasing using DataHeatBalance::People; using DataHeatBalance::TotPeople; using DataHeatBalance::Zone; @@ -1461,7 +1458,6 @@ namespace EnergyPlus::DataZoneEquipment { } } else if (SELECT_CASE_var == ZOAM_ProportionalControlSchOcc || SELECT_CASE_var == ZOAM_ProportionalControlDesOcc) { - Real64 ZoneEz = 1.0; ZoneOAPeople = 0.0; if (OARequirements(DSOAPtr).OAFlowMethod != ZOAM_ProportionalControlDesOcc) { ZoneOAPeople = ZoneIntGain(ActualZoneNum).NOFOCC * Zone(ActualZoneNum).Multiplier * Zone(ActualZoneNum).ListMultiplier * @@ -1481,8 +1477,8 @@ namespace EnergyPlus::DataZoneEquipment { } ZoneOAArea = Zone(ActualZoneNum).FloorArea * Zone(ActualZoneNum).Multiplier * Zone(ActualZoneNum).ListMultiplier * OARequirements(DSOAPtr).OAFlowPerArea; - ZoneOAMin = ZoneOAArea / ZoneEz; - ZoneOAMax = (ZoneOAArea + ZoneOAPeople) / ZoneEz; + ZoneOAMin = ZoneOAArea; + ZoneOAMax = (ZoneOAArea + ZoneOAPeople); if (Zone(ActualZoneNum).ZoneContamControllerSchedIndex > 0.0) { // Check the availability schedule value for ZoneControl:ContaminantController ZoneContamControllerSched = GetCurrentScheduleValue(state, Zone(ActualZoneNum).ZoneContamControllerSchedIndex); @@ -1553,7 +1549,7 @@ namespace EnergyPlus::DataZoneEquipment { } } - OAVolumeFlowRate = ZoneOAMax / ZoneEz; + OAVolumeFlowRate = ZoneOAMax; } else { if (state.dataContaminantBalance->ZoneAirCO2(ActualZoneNum) <= ZoneMinCO2) { @@ -1611,19 +1607,19 @@ namespace EnergyPlus::DataZoneEquipment { } } } - OAVolumeFlowRate = ZoneOAMax / ZoneEz; + OAVolumeFlowRate = ZoneOAMax; } } else { // ZoneOAPeople is less than or equal to zero - OAVolumeFlowRate = ZoneOAMax / ZoneEz; + OAVolumeFlowRate = ZoneOAMax; } } else { // ZoneControl:ContaminantController is scheduled off (not available) - OAVolumeFlowRate = ZoneOAMax / ZoneEz; + OAVolumeFlowRate = ZoneOAMax; } } else { // "Carbon Dioxide Control Availability Schedule" for ZoneControl:ContaminantController not found - OAVolumeFlowRate = ZoneOAMax / ZoneEz; + OAVolumeFlowRate = ZoneOAMax; } } else { diff --git a/src/EnergyPlus/DataZoneEquipment.hh b/src/EnergyPlus/DataZoneEquipment.hh index 7bc2c5e7411..d0fcde736f8 100644 --- a/src/EnergyPlus/DataZoneEquipment.hh +++ b/src/EnergyPlus/DataZoneEquipment.hh @@ -289,6 +289,8 @@ namespace DataZoneEquipment { // true when zone has in-ceiling HVAC bool ZoneHasAirFlowWindowReturn; // true if zone has an airflow window (WindowProperty:AirflowControl) with destination=ReturnAir bool ZoneHasAirLoopWithOASys; // true if zone is served by one or more airloops with an outdoor air system + int ZoneAirDistributionIndex; // index to DesignSpecification:ZoneAirDistribution object + int ZoneDesignSpecOAIndex; // index to DesignSpecification:OutdoorAir object // Default Constructor EquipConfiguration() @@ -296,7 +298,7 @@ namespace DataZoneEquipment { NumReturnNodes(0), NumReturnFlowBasisNodes(0), ReturnFlowSchedPtrNum(0), FlowError(false), ZonalSystemOnly(false), IsControlled(false), ZoneExh(0.0), ZoneExhBalanced(0.0), PlenumMassFlow(0.0), ExcessZoneExh(0.0), TotAvailAirLoopOA(0.0), TotInletAirMassFlowRate(0.0), TotExhaustAirMassFlowRate(0.0), InFloorActiveElement(false), InWallActiveElement(false), InCeilingActiveElement(false), - ZoneHasAirFlowWindowReturn(false), ZoneHasAirLoopWithOASys(false) + ZoneHasAirFlowWindowReturn(false), ZoneHasAirLoopWithOASys(false), ZoneAirDistributionIndex(0), ZoneDesignSpecOAIndex(0) { } }; diff --git a/src/EnergyPlus/DaylightingManager.cc b/src/EnergyPlus/DaylightingManager.cc index 43b14aa9728..e0f5393a3d5 100644 --- a/src/EnergyPlus/DaylightingManager.cc +++ b/src/EnergyPlus/DaylightingManager.cc @@ -863,7 +863,7 @@ namespace EnergyPlus::DaylightingManager { int IWin; // Window counter int IWin2; // Secondary window counter (for TDD:DOME object, if exists) int InShelfSurf; // Inside daylighting shelf surface number - int ShType; // Window shading type + WinShadingType ShType; // Window shading type int BlNum; // Window Blind Number int LSHCAL; // Interior shade calculation flag: 0=not yet // calculated, 1=already calculated @@ -1262,7 +1262,7 @@ namespace EnergyPlus::DaylightingManager { int IWin; // Window counter int IWin2; // Secondary window counter (for TDD:DOME object, if exists) int InShelfSurf; // Inside daylighting shelf surface number - int ShType; // Window shading type + WinShadingType ShType; // Window shading type int BlNum; // Window Blind Number int LSHCAL; // Interior shade calculation flag: 0=not yet // calculated, 1=already calculated @@ -1612,7 +1612,7 @@ namespace EnergyPlus::DaylightingManager { int &LSHCAL, // Interior shade calculation flag: 0=not yet calculated, 1=already calculated int &InShelfSurf, // Inside daylighting shelf surface number int &ICtrl, // Window control counter - int &ShType, // Window shading type + WinShadingType &ShType, // Window shading type int &BlNum, // Window blind number Vector3 &WNORM2, // Unit vector normal to window DataDaylighting::iExtWinType &ExtWinType, // Exterior window type (InZoneExtWin, AdjZoneExtWin, NotInOrAdjZoneExtWin) @@ -1740,7 +1740,7 @@ namespace EnergyPlus::DaylightingManager { } ICtrl = Surface(IWin).activeWindowShadingControl; - ShType = WSC_ST_NoShade; // 'NOSHADE' + ShType = WinShadingType::NoShade; // 'NOSHADE' BlNum = 0; // ScNum = 0; //Unused Set but never used if (Surface(IWin).HasShadeControl) ShType = WindowShadingControl(ICtrl).ShadingType; @@ -1781,7 +1781,7 @@ namespace EnergyPlus::DaylightingManager { // incidence for fully switched (dark) state to that of unswitched state SurfWinVisTransRatio(IWin) = 1.0; if (ICtrl > 0) { - if (ShType == WSC_ST_SwitchableGlazing) { + if (ShType == WinShadingType::SwitchableGlazing) { IConstShaded = Surface(IWin).activeShadedConstruction; SurfWinVisTransRatio(IWin) = SafeDivide(POLYF(1.0, state.dataConstruction->Construct(IConstShaded).TransVisBeamCoef), POLYF(1.0, state.dataConstruction->Construct(IConst).TransVisBeamCoef)); @@ -3246,7 +3246,7 @@ namespace EnergyPlus::DaylightingManager { Real64 const TVISB, // Visible transmittance of window for COSB angle of incidence (times light well efficiency, if appropriate) Real64 const DOMEGA, // Solid angle subtended by window element wrt reference point (steradians) int const ICtrl, // Window control counter - int const ShType, // Window shading type + WinShadingType const ShType, // Window shading type int const BlNum, // Window blind number Real64 const THRAY, // Azimuth of ray from reference point to window element (radians) Vector3 const &WNORM2, // Unit vector normal to window @@ -3675,7 +3675,7 @@ namespace EnergyPlus::DaylightingManager { state.dataDaylightingManager->EDIRSUdisk(iHour, 1) = RAYCOS(3) * TVISS * ObTransDisk; // Bare window TransBmBmMult = 0.0; - if (ShType == WSC_ST_ExteriorBlind || ShType == WSC_ST_InteriorBlind || ShType == WSC_ST_BetweenGlassBlind) { + if (ANY_BLIND(ShType)) { ProfileAngle(IWin, RAYCOS, Blind(BlNum).SlatOrientation, ProfAng); // Contribution of beam passing through slats and reaching reference point for (JB = 1; JB <= MaxSlatAngs; ++JB) { @@ -3692,7 +3692,7 @@ namespace EnergyPlus::DaylightingManager { // do this only once for fixed slat blinds if (!SurfWinMovableSlats(IWin)) break; } - } else if (ShType == WSC_ST_ExteriorScreen) { + } else if (ShType == WinShadingType::ExtScreen) { // pass angle from sun to window normal here using PHSUN and THSUN from above and surface angles // SunAltitudeToWindowNormalAngle = PHSUN - SurfaceWindow(IWin)%Phi // SunAzimuthToWindowNormalAngle = THSUN - SurfaceWindow(IWin)%Theta @@ -3729,13 +3729,13 @@ namespace EnergyPlus::DaylightingManager { XAVWL = 14700.0 * std::sqrt(0.000068 * POSFAC) * double(NWX * NWY) / std::pow(WindowSolidAngleDaylightPoint, 0.8); state.dataDaylightingManager->AVWLSUdisk(iHour, 1) = XAVWL * TVISS * ObTransDisk; // Bare window - if (ShType == WSC_ST_ExteriorBlind || ShType == WSC_ST_InteriorBlind || ShType == WSC_ST_BetweenGlassBlind) { + if (ANY_BLIND(ShType)) { for (JB = 1; JB <= MaxSlatAngs; ++JB) { // IF (.NOT. SurfaceWindow(IWin)%MovableSlats .AND. JB > 1) EXIT state.dataDaylightingManager->AVWLSUdisk(iHour, JB + 1) = XAVWL * TVISS * TransBmBmMult(JB) * ObTransDisk; if (!SurfWinMovableSlats(IWin)) break; } - } else if (ShType == WSC_ST_ExteriorScreen) { + } else if (ShType == WinShadingType::ExtScreen) { state.dataDaylightingManager->AVWLSUdisk(iHour, 2) = XAVWL * TVISS * TransBmBmMult(1) * ObTransDisk; } } // Position Factor @@ -3842,7 +3842,7 @@ namespace EnergyPlus::DaylightingManager { state.dataDaylightingManager->EDIRSUdisk(iHour, 1) += SunVecMir(3) * SpecReflectance * TVisRefl; // Bare window TransBmBmMultRefl = 0.0; - if (ShType == WSC_ST_ExteriorBlind || ShType == WSC_ST_InteriorBlind || ShType == WSC_ST_BetweenGlassBlind) { + if (ANY_BLIND(ShType)) { ProfileAngle(IWin, SunVecMir, Blind(BlNum).SlatOrientation, ProfAng); // Contribution of reflected beam passing through slats and reaching reference point Real64 const Pi_SlatAng_fac(DataGlobalConstants::Pi / (MaxSlatAngs - 1)); @@ -3859,7 +3859,7 @@ namespace EnergyPlus::DaylightingManager { if (!SurfWinMovableSlats(IWin)) break; } - } else if (ShType == WSC_ST_ExteriorScreen) { + } else if (ShType == WinShadingType::ExtScreen) { // pass angle from sun to window normal here using PHSUN and THSUN from above and // surface angles SunAltitudeToWindowNormalAngle = PHSUN - SurfaceWindow(IWin)%Phi // SunAzimuthToWindowNormalAngle = THSUN - SurfaceWindow(IWin)%Theta @@ -3879,13 +3879,13 @@ namespace EnergyPlus::DaylightingManager { XAVWL = 14700.0 * std::sqrt(0.000068 * POSFAC) * double(NWX * NWY) / std::pow(SurfaceWindow(IWin).SolidAngAtRefPtWtd(iRefPoint), 0.8); state.dataDaylightingManager->AVWLSUdisk(iHour, 1) += XAVWL * TVisRefl * SpecReflectance; // Bare window - if (ShType == WSC_ST_ExteriorBlind || ShType == WSC_ST_InteriorBlind || ShType == WSC_ST_BetweenGlassBlind) { + if (ANY_BLIND(ShType)) { for (JB = 1; JB <= MaxSlatAngs; ++JB) { // IF(.NOT. SurfaceWindow(IWin)%MovableSlats .AND. JB > 1) EXIT state.dataDaylightingManager->AVWLSUdisk(iHour, JB + 1) += XAVWL * TVisRefl * SpecReflectance * TransBmBmMultRefl(JB); if (!SurfWinMovableSlats(IWin)) break; } - } else if (ShType == WSC_ST_ExteriorScreen) { + } else if (ShType == WinShadingType::ExtScreen) { state.dataDaylightingManager->AVWLSUdisk(iHour, 2) += XAVWL * TVisRefl * SpecReflectance * TransBmBmMultRefl(1); } } @@ -3898,10 +3898,7 @@ namespace EnergyPlus::DaylightingManager { } // Last pass - if ((ICtrl > 0 && (ShType == WSC_ST_InteriorShade || ShType == WSC_ST_ExteriorShade || ShType == WSC_ST_BetweenGlassShade || - ShType == WSC_ST_InteriorBlind || ShType == WSC_ST_ExteriorBlind || ShType == WSC_ST_BetweenGlassBlind || - ShType == WSC_ST_ExteriorScreen)) || - SurfWinSolarDiffusing(IWin)) { + if ((ICtrl > 0 && (ANY_BLIND(ShType) || ANY_SHADE_SCREEN(ShType))) || SurfWinSolarDiffusing(IWin)) { // ----- CASE II -- WINDOW WITH SCREEN, SHADE, BLIND, OR DIFFUSING WINDOW @@ -4051,7 +4048,7 @@ namespace EnergyPlus::DaylightingManager { // For switchable glazing put daylighting factors for switched (dark) state in IS=2 location if (ICtrl > 0) { - if (WindowShadingControl(ICtrl).ShadingType == WSC_ST_SwitchableGlazing) { + if (WindowShadingControl(ICtrl).ShadingType == WinShadingType::SwitchableGlazing) { VTR = SurfWinVisTransRatio(IWin); state.dataDaylightingData->ZoneDaylight(ZoneNum).DaylIllFacSky(iHour, 2, ISky, iRefPoint, loopwin) = state.dataDaylightingData->ZoneDaylight(ZoneNum).DaylIllFacSky(iHour, 1, ISky, iRefPoint, loopwin) * VTR; @@ -4197,7 +4194,7 @@ namespace EnergyPlus::DaylightingManager { // For switchable glazing put daylighting factors for switched (dark) state in IS=2 location if (ICtrl > 0) { - if (WindowShadingControl(ICtrl).ShadingType == WSC_ST_SwitchableGlazing) { + if (WindowShadingControl(ICtrl).ShadingType == WinShadingType::SwitchableGlazing) { VTR = SurfWinVisTransRatio(IWin); state.dataDaylightingData->IllumMapCalc(MapNum).DaylIllFacSky(iHour, 2, ISky, iMapPoint, loopwin) = state.dataDaylightingData->IllumMapCalc(MapNum).DaylIllFacSky(iHour, 1, ISky, iMapPoint, loopwin) * VTR; @@ -4360,7 +4357,7 @@ namespace EnergyPlus::DaylightingManager { } } - if (WindowShadingControl(Surface(SurfNum).activeWindowShadingControl).ShadingControlType == WSCT_MeetDaylIlumSetp) { + if (WindowShadingControl(Surface(SurfNum).activeWindowShadingControl).ShadingControlType == WindowShadingControlType::MeetDaylIlumSetp) { // Error if window has ShadingControlType = MeetDaylightingIlluminanceSetpoint & // but is not in a Daylighting:Detailed zone if (thisSurfEnclosure.TotalEnclosureDaylRefPoints == 0) { @@ -5591,6 +5588,18 @@ namespace EnergyPlus::DaylightingManager { } // End of loop over light well objects } + inline int findWinShadingStatus(int const IWin) { + // Return the window shading status, 1=unshaded, 2=shaded + int WinShadingIndex = 1; + bool WinShadedNoGlareControl = IS_SHADED_NO_GLARE_CTRL(SurfWinShadingFlag(IWin)); + if ((SurfWinWindowModelType(IWin) != WindowBSDFModel) && + (WinShadedNoGlareControl || SurfWinSolarDiffusing(IWin))) { + WinShadingIndex = 2; + } + return WinShadingIndex; + } + + void DayltgGlare(EnergyPlusData &state, int &IL, // Reference point index: 1=first ref pt, 2=second ref pt Real64 &BLUM, // Window background (surround) luminance (cd/m2) @@ -5636,30 +5645,18 @@ namespace EnergyPlus::DaylightingManager { // na // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Real64 GTOT; // Glare constant - Real64 GTOT1; // Portion of glare constant - Real64 GTOT2; // Portion of glare constant - int IWin; // Window counter - int IS; // Window shading index: 1=unshaded, 2=shaded - int loop; // Loop index - - - // Initialize glare constant - GTOT = 0.0; + Real64 GTOT = 0.0; // Glare constant // Loop over exterior windows associated with zone - for (loop = 1; loop <= state.dataDaylightingData->ZoneDaylight(ZoneNum).NumOfDayltgExtWins; ++loop) { - IWin = state.dataDaylightingData->ZoneDaylight(ZoneNum).DayltgExtWinSurfNums(loop); - IS = 1; - if ((SurfWinWindowModelType(IWin) != WindowBSDFModel) && - ((SurfWinShadingFlag(IWin) >= 1 && SurfWinShadingFlag(IWin) <= 9) || SurfWinSolarDiffusing(IWin))) - IS = 2; + for (int loop = 1; loop <= state.dataDaylightingData->ZoneDaylight(ZoneNum).NumOfDayltgExtWins; ++loop) { + int IWin = state.dataDaylightingData->ZoneDaylight(ZoneNum).DayltgExtWinSurfNums(loop); + int WinShadingIndex = findWinShadingStatus(IWin); // Conversion from ft-L to cd/m2, with cd/m2 = 0.2936 ft-L, gives the 0.4794 factor // below, which is (0.2936)**0.6 - GTOT1 = 0.4794 * (std::pow(state.dataDaylightingData->ZoneDaylight(ZoneNum).SourceLumFromWinAtRefPt(loop, IS, IL), 1.6)) * + Real64 GTOT1 = 0.4794 * (std::pow(state.dataDaylightingData->ZoneDaylight(ZoneNum).SourceLumFromWinAtRefPt(loop, WinShadingIndex, IL), 1.6)) * std::pow(state.dataDaylightingData->ZoneDaylight(ZoneNum).SolidAngAtRefPtWtd(loop, IL), 0.8); - GTOT2 = BLUM + - 0.07 * (std::sqrt(state.dataDaylightingData->ZoneDaylight(ZoneNum).SolidAngAtRefPt(loop, IL))) * state.dataDaylightingData->ZoneDaylight(ZoneNum).SourceLumFromWinAtRefPt(loop, IS, IL); + Real64 GTOT2 = BLUM + + 0.07 * (std::sqrt(state.dataDaylightingData->ZoneDaylight(ZoneNum).SolidAngAtRefPt(loop, IL))) * state.dataDaylightingData->ZoneDaylight(ZoneNum).SourceLumFromWinAtRefPt(loop, WinShadingIndex, IL); GTOT += GTOT1 / (GTOT2 + 0.000001); } @@ -5702,42 +5699,26 @@ namespace EnergyPlus::DaylightingManager { // INTERFACE BLOCK SPECIFICATIONS: na // DERIVED TYPE DEFINITIONS: na - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int IL; // Reference point index: 1=first ref pt, 2=second ref pt - Real64 GTOT; // Glare constant - Real64 GTOT1; // Portion of glare constant - Real64 GTOT2; // Portion of glare constant - int IWin; // Window counter - int IS; // Window shading index: 1=unshaded, 2=shaded - Real64 BacLum; // Background luminance (cd/m2) - int loop; // Loop index - int RefPoints; // Number of daylighting reference points in zone - - // Initialize glare constant - - GTOT = 0.0; + Real64 GTOT = 0.0;; // Glare constant // Calculate background luminance including effect of inter-reflected illuminance from light // entering zone through its interior windows - RefPoints = state.dataDaylightingData->ZoneDaylight(ZoneNum).TotalDaylRefPoints; - for (IL = 1; IL <= RefPoints; ++IL) { - BacLum = state.dataDaylightingData->ZoneDaylight(ZoneNum).BacLum(IL) + state.dataDaylightingData->ZoneDaylight(ZoneNum).InterReflIllFrIntWins * state.dataDaylightingData->ZoneDaylight(ZoneNum).AveVisDiffReflect / DataGlobalConstants::Pi; - BacLum = max(state.dataDaylightingData->ZoneDaylight(ZoneNum).IllumSetPoint(IL) * state.dataDaylightingData->ZoneDaylight(ZoneNum).AveVisDiffReflect / DataGlobalConstants::Pi, BacLum); + int RefPoints = state.dataDaylightingData->ZoneDaylight(ZoneNum).TotalDaylRefPoints; // Number of daylighting reference points in zone + for (int IL = 1; IL <= RefPoints; ++IL) { + Real64 BackgroundLum = state.dataDaylightingData->ZoneDaylight(ZoneNum).BacLum(IL) + state.dataDaylightingData->ZoneDaylight(ZoneNum).InterReflIllFrIntWins * state.dataDaylightingData->ZoneDaylight(ZoneNum).AveVisDiffReflect / DataGlobalConstants::Pi; + BackgroundLum = max(state.dataDaylightingData->ZoneDaylight(ZoneNum).IllumSetPoint(IL) * state.dataDaylightingData->ZoneDaylight(ZoneNum).AveVisDiffReflect / DataGlobalConstants::Pi, BackgroundLum); // Loop over exterior windows associated with zone - for (loop = 1; loop <= state.dataDaylightingData->ZoneDaylight(ZoneNum).NumOfDayltgExtWins; ++loop) { - IWin = state.dataDaylightingData->ZoneDaylight(ZoneNum).DayltgExtWinSurfNums(loop); - IS = 1; - if ((SurfWinWindowModelType(IWin) != WindowBSDFModel) && - ((SurfWinShadingFlag(IWin) >= 1 && SurfWinShadingFlag(IWin) <= 9) || SurfWinSolarDiffusing(IWin))) - IS = 2; + for (int loop = 1; loop <= state.dataDaylightingData->ZoneDaylight(ZoneNum).NumOfDayltgExtWins; ++loop) { + int IWin = state.dataDaylightingData->ZoneDaylight(ZoneNum).DayltgExtWinSurfNums(loop); + int WinShadingIndex = findWinShadingStatus(IWin); // Conversion from ft-L to cd/m2, with cd/m2 = 0.2936 ft-L, gives the 0.4794 factor // below, which is (0.2936)**0.6 - GTOT1 = 0.4794 * (std::pow(state.dataDaylightingData->ZoneDaylight(ZoneNum).SourceLumFromWinAtRefPt(loop, IS, IL), 1.6)) * + Real64 GTOT1 = 0.4794 * (std::pow(state.dataDaylightingData->ZoneDaylight(ZoneNum).SourceLumFromWinAtRefPt(loop, WinShadingIndex, IL), 1.6)) * std::pow(state.dataDaylightingData->ZoneDaylight(ZoneNum).SolidAngAtRefPtWtd(loop, IL), 0.8); - GTOT2 = BacLum + 0.07 * (std::sqrt(state.dataDaylightingData->ZoneDaylight(ZoneNum).SolidAngAtRefPt(loop, IL))) * - state.dataDaylightingData->ZoneDaylight(ZoneNum).SourceLumFromWinAtRefPt(loop, IS, IL); + Real64 GTOT2 = BackgroundLum + 0.07 * (std::sqrt(state.dataDaylightingData->ZoneDaylight(ZoneNum).SolidAngAtRefPt(loop, IL))) * + state.dataDaylightingData->ZoneDaylight(ZoneNum).SourceLumFromWinAtRefPt(loop, WinShadingIndex, IL); GTOT += GTOT1 / (GTOT2 + 0.000001); } @@ -6193,9 +6174,6 @@ namespace EnergyPlus::DaylightingManager { static Vector2 SFSUHR; // Sun source luminance factor for bare/shaded window static Array1D GLRNDX; // Glare index at reference point static Array1D GLRNEW; // New glare index at reference point - int IL; // Reference point index - int IWin; // Window index - int IS; // IS=1 for unshaded window, =2 for shaded window int ISWFLG; // Switchable glazing flag: =1 if one or more windows in a zone // has switchable glazing that adjusts visible transmittance to just meet // daylighting setpoint; =0 otherwise. @@ -6262,7 +6240,7 @@ namespace EnergyPlus::DaylightingManager { // Initialize reference point illuminance and window background luminance - for (IL = 1; IL <= NREFPT; ++IL) { + for (int IL = 1; IL <= NREFPT; ++IL) { SetPnt(IL) = state.dataDaylightingData->ZoneDaylight(ZoneNum).IllumSetPoint(IL); state.dataDaylightingManager->DaylIllum(IL) = 0.0; state.dataDaylightingData->ZoneDaylight(ZoneNum).BacLum(IL) = 0.0; @@ -6287,7 +6265,7 @@ namespace EnergyPlus::DaylightingManager { // Find contribution of each window to the daylight illum and to the glare numerator at each reference point. // Use shading flags set in WindowShadingManager. for (loop = 1; loop <= state.dataDaylightingData->ZoneDaylight(ZoneNum).NumOfDayltgExtWins; ++loop) { - IWin = state.dataDaylightingData->ZoneDaylight(ZoneNum).DayltgExtWinSurfNums(loop); + int IWin = state.dataDaylightingData->ZoneDaylight(ZoneNum).DayltgExtWinSurfNums(loop); // Added TH 6/29/2009 for thermochromic windows VTRatio = 1.0; @@ -6304,8 +6282,11 @@ namespace EnergyPlus::DaylightingManager { } } + bool ShadedOrDiffusingGlassWin = SurfWinWindowModelType(IWin) != WindowBSDFModel && + (IS_SHADED(SurfWinShadingFlag(IWin)) || SurfWinSolarDiffusing(IWin)); + // Loop over reference points - for (IL = 1; IL <= NREFPT; ++IL) { + for (int IL = 1; IL <= NREFPT; ++IL) { // Daylight factors for current sun position for (ISky = 1; ISky <= 4; ++ISky) { @@ -6338,8 +6319,7 @@ namespace EnergyPlus::DaylightingManager { state.dataGlobal->WeightPreviousHour * (state.dataDaylightingData->ZoneDaylight(ZoneNum).DaylSourceFacSun(state.dataGlobal->PreviousHour, 1, IL, loop) + state.dataDaylightingData->ZoneDaylight(ZoneNum).DaylSourceFacSunDisk(state.dataGlobal->PreviousHour, 1, IL, loop))); - if ((SurfWinWindowModelType(IWin) != WindowBSDFModel) && - (SurfWinShadingFlag(IWin) >= 1 || SurfWinSolarDiffusing(IWin))) { + if (ShadedOrDiffusingGlassWin) { // ===Shaded window or window with diffusing glass=== if (!SurfWinMovableSlats(IWin)) { @@ -6509,9 +6489,8 @@ namespace EnergyPlus::DaylightingManager { HorIllSkyFac = state.dataEnvrn->HISKF / ((1 - SkyWeight) * HorIllSky(ISky2) + SkyWeight * HorIllSky(ISky1)); - for (IS = 1; IS <= 2; ++IS) { - if (IS == 2 && (SurfWinWindowModelType(IWin) == WindowBSDFModel)) break; - if (IS == 2 && SurfWinShadingFlag(IWin) <= 0 && !SurfWinSolarDiffusing(IWin)) break; + for (int IS = 1; IS <= 2; ++IS) { + if (IS == 2 && !ShadedOrDiffusingGlassWin) break; state.dataDaylightingData->ZoneDaylight(ZoneNum).IllumFromWinAtRefPt(loop, IS, IL) = DFSUHR(IS) * state.dataEnvrn->HISUNF + @@ -6548,11 +6527,11 @@ namespace EnergyPlus::DaylightingManager { // entering the zone through interior windows (which is calculated in DayltgInterReflIllFrIntWins. for (loop = 1; loop <= state.dataDaylightingData->ZoneDaylight(ZoneNum).NumOfDayltgExtWins; ++loop) { - IWin = state.dataDaylightingData->ZoneDaylight(ZoneNum).DayltgExtWinSurfNums(loop); + int IWin = state.dataDaylightingData->ZoneDaylight(ZoneNum).DayltgExtWinSurfNums(loop); ICtrl = Surface(IWin).activeWindowShadingControl; if (Surface(IWin).HasShadeControl && ISWFLG == 0) { - if (WindowShadingControl(ICtrl).ShadingControlType == WSCT_MeetDaylIlumSetp && - SurfWinShadingFlag(IWin) == GlassConditionallyLightened) + if (WindowShadingControl(ICtrl).ShadingControlType == WindowShadingControlType::MeetDaylIlumSetp && + SurfWinShadingFlag(IWin) == WinShadingType::GlassConditionallyLightened) ISWFLG = 1; } @@ -6561,12 +6540,9 @@ namespace EnergyPlus::DaylightingManager { // the shading flag is initialized at GlassConditionallyLightened (20), and // the window is initialized at clear state: IS = 1 // For other windows with glare control, the shading flag is initialized at >10, to be determined - IS = 1; - if ((SurfWinWindowModelType(IWin) != WindowBSDFModel) && - ((SurfWinShadingFlag(IWin) >= 1 && SurfWinShadingFlag(IWin) <= 9) || SurfWinSolarDiffusing(IWin))) - IS = 2; + int IS = findWinShadingStatus(IWin); - for (IL = 1; IL <= NREFPT; ++IL) { + for (int IL = 1; IL <= NREFPT; ++IL) { state.dataDaylightingManager->DaylIllum(IL) += state.dataDaylightingData->ZoneDaylight(ZoneNum).IllumFromWinAtRefPt(loop, IS, IL); state.dataDaylightingData->ZoneDaylight(ZoneNum).BacLum(IL) += state.dataDaylightingData->ZoneDaylight(ZoneNum).BackLumFromWinAtRefPt(loop, IS, IL); } @@ -6606,13 +6582,10 @@ namespace EnergyPlus::DaylightingManager { loop = state.dataDaylightingData->ZoneDaylight(ZoneNum).MapShdOrdToLoopNum(count); ICtrl = Surface(IWin).activeWindowShadingControl; - IS = 1; - if ((SurfWinWindowModelType(IWin) != WindowBSDFModel) && - ((SurfWinShadingFlag(IWin) >= 1 && SurfWinShadingFlag(IWin) <= 9) || SurfWinSolarDiffusing(IWin))) - IS = 2; + int IS = findWinShadingStatus(IWin); if (Surface(IWin).HasShadeControl) { - if (SurfWinShadingFlag(IWin) == GlassConditionallyLightened && - WindowShadingControl(ICtrl).ShadingControlType == WSCT_MeetDaylIlumSetp && !previously_shaded(loop)) { + if (SurfWinShadingFlag(IWin) == WinShadingType::GlassConditionallyLightened && + WindowShadingControl(ICtrl).ShadingControlType == WindowShadingControlType::MeetDaylIlumSetp && !previously_shaded(loop)) { DILLSW(igroup) += state.dataDaylightingData->ZoneDaylight(ZoneNum).IllumFromWinAtRefPt(loop, IS, 1); previously_shaded(loop) = true; } else { @@ -6656,8 +6629,8 @@ namespace EnergyPlus::DaylightingManager { continueOuterLoop = true; continue; } - if (SurfWinShadingFlag(IWin) != GlassConditionallyLightened || - WindowShadingControl(ICtrl).ShadingControlType != WSCT_MeetDaylIlumSetp) { + if (SurfWinShadingFlag(IWin) != WinShadingType::GlassConditionallyLightened || + WindowShadingControl(ICtrl).ShadingControlType != WindowShadingControlType::MeetDaylIlumSetp) { continueOuterLoop = true; continue; } @@ -6672,7 +6645,7 @@ namespace EnergyPlus::DaylightingManager { TVIS2(igroup) = POLYF(1.0, state.dataConstruction->Construct(IConstShaded).TransVisBeamCoef) * SurfWinGlazedFrac(IWin); // Reset shading flag to indicate that window is shaded by being partially or fully switched - SurfWinShadingFlag(IWin) = SwitchableGlazing; + SurfWinShadingFlag(IWin) = WinShadingType::SwitchableGlazing; // ASETIL < 0 means illuminance from non-daylight-switchable windows exceeds setpoint, // so completely switch all daylight-switchable windows to minimize solar gain @@ -6692,16 +6665,16 @@ namespace EnergyPlus::DaylightingManager { } // Adjust daylight quantities based on ratio between switched and unswitched visible transmittance - for (IL = 1; IL <= NREFPT; ++IL) { + for (int IL = 1; IL <= NREFPT; ++IL) { // DaylIllum(IL) and BacLum(IL) were calculated at the clear state: IS = 1, // and need to adjusted for intermediate switched state at VisTransSelected: IS = 2 - IS = 1; + int IS = 1; VTRAT = SurfWinVisTransSelected(IWin) / (TVIS1(igroup) + 0.000001); state.dataDaylightingManager->DaylIllum(IL) += (VTRAT - 1.0) * state.dataDaylightingData->ZoneDaylight(ZoneNum).IllumFromWinAtRefPt(loop, IS, IL); state.dataDaylightingData->ZoneDaylight(ZoneNum).BacLum(IL) += (VTRAT - 1.0) * state.dataDaylightingData->ZoneDaylight(ZoneNum).BackLumFromWinAtRefPt(loop, IS, IL); // Adjust illum, background illum and source luminance for this window in intermediate switched state - // for later use in the DayltgGlare calc because SurfaceWindow(IWin)%ShadingFlag = SwitchableGlazing = 2 + // for later use in the DayltgGlare calc because SurfaceWindow(IWin)%ShadingFlag = WinShadingType::SwitchableGlazing = 2 IS = 2; VTRAT = SurfWinVisTransSelected(IWin) / (TVIS2(igroup) + 0.000001); state.dataDaylightingData->ZoneDaylight(ZoneNum).IllumFromWinAtRefPt(loop, IS, IL) = VTRAT * tmpIllumFromWinAtRefPt(loop, IS, IL); @@ -6723,7 +6696,7 @@ namespace EnergyPlus::DaylightingManager { // Calculate glare index at each reference point assuming the daylight illuminance setpoint is // met at both reference points, either by daylight or electric lights - for (IL = 1; IL <= NREFPT; ++IL) { + for (int IL = 1; IL <= NREFPT; ++IL) { BACL = max(SetPnt(IL) * state.dataDaylightingData->ZoneDaylight(ZoneNum).AveVisDiffReflect / DataGlobalConstants::Pi, state.dataDaylightingData->ZoneDaylight(ZoneNum).BacLum(IL)); // DayltgGlare uses ZoneDaylight(ZoneNum)%SourceLumFromWinAtRefPt(IL,1,loop) for unshaded windows, and // ZoneDaylight(ZoneNum)%SourceLumFromWinAtRefPt(IL,2,loop) for shaded windows @@ -6734,7 +6707,7 @@ namespace EnergyPlus::DaylightingManager { // is exceeded at either ref pt, attempt to reduce glare to acceptable level by closing // shading device on windows that have shades that have not already been closed. GlareFlag = false; - for (IL = 1; IL <= NREFPT; ++IL) { + for (int IL = 1; IL <= NREFPT; ++IL) { if (GLRNDX(IL) > state.dataDaylightingData->ZoneDaylight(ZoneNum).MaxGlareallowed) { GlareFlag = true; break; @@ -6752,7 +6725,6 @@ namespace EnergyPlus::DaylightingManager { Array2D RBACLU( NREFPT, state.dataDaylightingData->ZoneDaylight(ZoneNum).ShadeDeployOrderExtWins.size()); // Background illuminance from window at reference point after closing shade - if (GlareFlag) { // Glare is too high at a ref pt. Loop through windows. int count = 0; @@ -6773,7 +6745,8 @@ namespace EnergyPlus::DaylightingManager { // Check if window is eligible for glare control // TH 1/21/2010. Switchable glazings already in partially switched state // should be allowed to further dim to control glare - if (SurfWinShadingFlag(IWin) < 10 && SurfWinShadingFlag(IWin) != SwitchableGlazing) { + // if (SurfWinShadingFlag(IWin) <= BGBlind && SurfWinShadingFlag(IWin) != SwitchableGlazing) { + if (NOT_SHADED(SurfWinShadingFlag(IWin)) || ANY_SHADE_SCREEN(SurfWinShadingFlag(IWin)) || ANY_BLIND(SurfWinShadingFlag(IWin))) { continueOuterLoop = false; continue; } @@ -6788,8 +6761,8 @@ namespace EnergyPlus::DaylightingManager { // Illuminance (WDAYIL) and background luminance (WBACLU) contribution from this // window without shading (IS=1) and with shading (IS=2) for each ref pt // For switchable windows, this may be partially switched rather than fully dark - for (IL = 1; IL <= NREFPT; ++IL) { - for (IS = 1; IS <= 2; ++IS) { + for (int IL = 1; IL <= NREFPT; ++IL) { + for (int IS = 1; IS <= 2; ++IS) { WDAYIL(IS, IL, igroup) = state.dataDaylightingData->ZoneDaylight(ZoneNum).IllumFromWinAtRefPt(loop, IS, IL); WBACLU(IS, IL, igroup) = state.dataDaylightingData->ZoneDaylight(ZoneNum).BackLumFromWinAtRefPt(loop, IS, IL); } @@ -6797,10 +6770,10 @@ namespace EnergyPlus::DaylightingManager { // Recalculate illuminance and glare with shading on this window. // For switchable glazings, this is the fully switched (dark) state - for (IL = 1; IL <= NREFPT; ++IL) { - if (SurfWinShadingFlag(IWin) != SwitchableGlazing) { + for (int IL = 1; IL <= NREFPT; ++IL) { + if (SurfWinShadingFlag(IWin) != WinShadingType::SwitchableGlazing) { // for non switchable glazings or switchable glazings not switched yet (still in clear state) - // SurfaceWindow(IWin)%ShadingFlag = GlassConditionallyLightened + // SurfaceWindow(IWin)%ShadingFlag = WinShadingFlag::GlassConditionallyLightened RDAYIL(IL, igroup) = state.dataDaylightingManager->DaylIllum(IL) - WDAYIL(1, IL, igroup) + WDAYIL(2, IL, igroup); RBACLU(IL, igroup) = state.dataDaylightingData->ZoneDaylight(ZoneNum).BacLum(IL) - WBACLU(1, IL, igroup) + WBACLU(2, IL, igroup); } else { @@ -6810,12 +6783,18 @@ namespace EnergyPlus::DaylightingManager { } } - if (SurfWinShadingFlag(IWin) != SwitchableGlazing) SurfWinShadingFlag(IWin) /= 10; + if (SurfWinShadingFlag(IWin) == WinShadingType::GlassConditionallyLightened) SurfWinShadingFlag(IWin) = WinShadingType::SwitchableGlazing; + else if (SurfWinShadingFlag(IWin) == WinShadingType::IntShadeConditionallyOff) SurfWinShadingFlag(IWin) = WinShadingType::IntShade; + else if (SurfWinShadingFlag(IWin) == WinShadingType::ExtShadeConditionallyOff) SurfWinShadingFlag(IWin) = WinShadingType::ExtShade; + else if (SurfWinShadingFlag(IWin) == WinShadingType::IntBlindConditionallyOff) SurfWinShadingFlag(IWin) = WinShadingType::IntBlind; + else if (SurfWinShadingFlag(IWin) == WinShadingType::ExtBlindConditionallyOff) SurfWinShadingFlag(IWin) = WinShadingType::ExtBlind; + else if (SurfWinShadingFlag(IWin) == WinShadingType::BGShadeConditionallyOff) SurfWinShadingFlag(IWin) = WinShadingType::BGShade; + else if (SurfWinShadingFlag(IWin) == WinShadingType::BGBlindConditionallyOff) SurfWinShadingFlag(IWin) = WinShadingType::BGBlind; // For switchable glazings, it is switched to fully dark state, // update ZoneDaylight(ZoneNum)%SourceLumFromWinAtRefPt(IL,2,loop) for use in DayltgGlare - if (SurfWinShadingFlag(IWin) == SwitchableGlazing) { - for (IL = 1; IL <= NREFPT; ++IL) { + if (SurfWinShadingFlag(IWin) == WinShadingType::SwitchableGlazing) { + for (int IL = 1; IL <= NREFPT; ++IL) { state.dataDaylightingData->ZoneDaylight(ZoneNum).SourceLumFromWinAtRefPt(loop, 2, IL) = tmpSourceLumFromWinAtRefPt(loop, 2, IL); state.dataDaylightingData->ZoneDaylight(ZoneNum).IllumFromWinAtRefPt(loop, 2, IL) = tmpIllumFromWinAtRefPt(loop, 2, IL); state.dataDaylightingData->ZoneDaylight(ZoneNum).BackLumFromWinAtRefPt(loop, 2, IL) = tmpBackLumFromWinAtRefPt(loop, 2, IL); @@ -6836,7 +6815,7 @@ namespace EnergyPlus::DaylightingManager { if (atLeastOneGlareControlIsActive) { // Re-calc daylight and glare at shaded state. For switchable glazings, it is the fully dark state. - for (IL = 1; IL <= NREFPT; ++IL) { + for (int IL = 1; IL <= NREFPT; ++IL) { BACL = max(SetPnt(IL) * state.dataDaylightingData->ZoneDaylight(ZoneNum).AveVisDiffReflect / DataGlobalConstants::Pi, RBACLU(IL, igroup)); // DayltgGlare uses ZoneDaylight(ZoneNum)%SourceLumFromWinAtRefPt(IL,2,loop) for shaded state DayltgGlare(state, IL, BACL, GLRNEW(IL), ZoneNum); @@ -6867,7 +6846,7 @@ namespace EnergyPlus::DaylightingManager { // covers all the reference points. int numRefPtOldAboveMaxNewBelowOld = 0; int numRefPtOldBelowMaxNewBelowMax = 0; - for (IL = 1; IL <= NREFPT; ++IL) { + for (int IL = 1; IL <= NREFPT; ++IL) { if (GLRNDX(IL) > state.dataDaylightingData->ZoneDaylight(ZoneNum).MaxGlareallowed && GLRNEW(IL) <= GLRNDX(IL)) ++numRefPtOldAboveMaxNewBelowOld; if (GLRNDX(IL) <= state.dataDaylightingData->ZoneDaylight(ZoneNum).MaxGlareallowed && GLRNEW(IL) <= state.dataDaylightingData->ZoneDaylight(ZoneNum).MaxGlareallowed) ++numRefPtOldBelowMaxNewBelowMax; @@ -6884,7 +6863,8 @@ namespace EnergyPlus::DaylightingManager { ++count; // need to map back to the original order of the "loop" to not change all the other data structures loop = state.dataDaylightingData->ZoneDaylight(ZoneNum).MapShdOrdToLoopNum(count); - if (SurfWinShadingFlag(IWin) < 10 && SurfWinShadingFlag(IWin) != SwitchableGlazing) continue; + // if (SurfWinShadingFlag(IWin) <= BGBlind && SurfWinShadingFlag(IWin) != SwitchableGlazing) { + if (NOT_SHADED(SurfWinShadingFlag(IWin)) || ANY_SHADE_SCREEN(SurfWinShadingFlag(IWin)) || ANY_BLIND(SurfWinShadingFlag(IWin))) continue; ICtrl = Surface(IWin).activeWindowShadingControl; if (!Surface(IWin).HasShadeControl) continue; @@ -6894,26 +6874,26 @@ namespace EnergyPlus::DaylightingManager { // Reset shading flag to no shading condition, go to next window. if (blnCycle) { // for switchable glazings, reset properties to clear state or partial switched state? - if (SurfWinShadingFlag(IWin) == SwitchableGlazing) { + if (SurfWinShadingFlag(IWin) == WinShadingType::SwitchableGlazing) { SurfWinSwitchingFactor(IWin) = 0.0; SurfWinVisTransSelected(IWin) = TVIS1(igroup); // RESET properties for fully dark state - for (IL = 1; IL <= NREFPT; ++IL) { + for (int IL = 1; IL <= NREFPT; ++IL) { state.dataDaylightingData->ZoneDaylight(ZoneNum).IllumFromWinAtRefPt(loop, 2, IL) = tmpIllumFromWinAtRefPt(loop, 2, IL); state.dataDaylightingData->ZoneDaylight(ZoneNum).BackLumFromWinAtRefPt(loop, 2, IL) = tmpBackLumFromWinAtRefPt(loop, 2, IL); state.dataDaylightingData->ZoneDaylight(ZoneNum).SourceLumFromWinAtRefPt(loop, 2, IL) = tmpSourceLumFromWinAtRefPt(loop, 2, IL); } } - SurfWinShadingFlag(IWin) = ShadeOff; + SurfWinShadingFlag(IWin) = WinShadingType::ShadeOff; continue; } // Shading this window has improved the glare situation. // Reset background luminance, glare index, and daylight illuminance at each ref pt. // For switchable glazings, this is fully switched, dark state - for (IL = 1; IL <= NREFPT; ++IL) { + for (int IL = 1; IL <= NREFPT; ++IL) { state.dataDaylightingData->ZoneDaylight(ZoneNum).BacLum(IL) = RBACLU(IL, igroup); GLRNDX(IL) = GLRNEW(IL); state.dataDaylightingManager->DaylIllum(IL) = RDAYIL(IL, igroup); @@ -6927,7 +6907,7 @@ namespace EnergyPlus::DaylightingManager { // This was addressed in CR 7984 for E+ 5.0. 1/19/2010 // If switchable glazing, set switching factor to 1: fully switched. - if (SurfWinShadingFlag(IWin) == SwitchableGlazing) { + if (SurfWinShadingFlag(IWin) == WinShadingType::SwitchableGlazing) { // tmpSWFactor0 = SurfaceWindow( IWin ).SwitchingFactor; // save original // switching factor ////Unused Set but never used @@ -6935,7 +6915,7 @@ namespace EnergyPlus::DaylightingManager { SurfWinVisTransSelected(IWin) = TVIS2(igroup); // restore fully dark values - for (IL = 1; IL <= NREFPT; ++IL) { + for (int IL = 1; IL <= NREFPT; ++IL) { WDAYIL(2, IL, igroup) = tmpIllumFromWinAtRefPt(loop, 2, IL); WBACLU(2, IL, igroup) = tmpBackLumFromWinAtRefPt(loop, 2, IL); state.dataDaylightingData->ZoneDaylight(ZoneNum).IllumFromWinAtRefPt(loop, 2, IL) = tmpIllumFromWinAtRefPt(loop, 2, IL); @@ -6954,8 +6934,8 @@ namespace EnergyPlus::DaylightingManager { } if (GlareOK) { - if (SurfWinShadingFlag(IWin) == SwitchableGlazing && - WindowShadingControl(ICtrl).ShadingControlType == WSCT_MeetDaylIlumSetp) { + if (SurfWinShadingFlag(IWin) == WinShadingType::SwitchableGlazing && + WindowShadingControl(ICtrl).ShadingControlType == WindowShadingControlType::MeetDaylIlumSetp) { // Added TH 1/14/2010 // Only for switchable glazings with MeetDaylightIlluminanceSetpoint control // The glazing is in fully dark state, it might lighten a bit to provide more daylight @@ -6970,7 +6950,7 @@ namespace EnergyPlus::DaylightingManager { tmpSWFactor = 1.0 - tmpSWIterStep; while (tmpSWFactor > 0) { // calc new glare at new switching state - for (IL = 1; IL <= NREFPT; ++IL) { + for (int IL = 1; IL <= NREFPT; ++IL) { RDAYIL(IL, igroup) = state.dataDaylightingManager->DaylIllum(IL) + (WDAYIL(1, IL, igroup) - WDAYIL(2, IL, igroup)) * (1.0 - tmpSWFactor); RBACLU(IL, igroup) = state.dataDaylightingData->ZoneDaylight(ZoneNum).BacLum(IL) + (WBACLU(1, IL, igroup) - WBACLU(2, IL, igroup)) * (1.0 - tmpSWFactor); @@ -7016,7 +6996,7 @@ namespace EnergyPlus::DaylightingManager { // Final re-calculation if needed if (!GlareOK) { // Glare too high, use previous state and re-calc - for (IL = 1; IL <= NREFPT; ++IL) { + for (int IL = 1; IL <= NREFPT; ++IL) { RDAYIL(IL, igroup) = state.dataDaylightingManager->DaylIllum(IL) + (WDAYIL(1, IL, igroup) - WDAYIL(2, IL, igroup)) * (1.0 - tmpSWFactor); RBACLU(IL, igroup) = state.dataDaylightingData->ZoneDaylight(ZoneNum).BacLum(IL) + (WBACLU(1, IL, igroup) - WBACLU(2, IL, igroup)) * (1.0 - tmpSWFactor); @@ -7034,7 +7014,7 @@ namespace EnergyPlus::DaylightingManager { } // Update final results - for (IL = 1; IL <= NREFPT; ++IL) { + for (int IL = 1; IL <= NREFPT; ++IL) { state.dataDaylightingData->ZoneDaylight(ZoneNum).BacLum(IL) = RBACLU(IL, igroup); GLRNDX(IL) = GLRNEW(IL); state.dataDaylightingManager->DaylIllum(IL) = RDAYIL(IL, igroup); @@ -7059,18 +7039,22 @@ namespace EnergyPlus::DaylightingManager { } // end of for(auto IWin : listOfExtWin) if (breakOuterLoop) break; } // for group - } // GlareFlag + } // GlareFlag // Loop again over windows and reset remaining shading flags that // are 10 or higher (i.e., conditionally off) to off - for (IWin = Zone(ZoneNum).SurfaceFirst; IWin <= Zone(ZoneNum).SurfaceLast; ++IWin) { + for (int IWin = Zone(ZoneNum).SurfaceFirst; IWin <= Zone(ZoneNum).SurfaceLast; ++IWin) { if (Surface(IWin).Class != SurfaceClass::Window) continue; if (Surface(IWin).ExtBoundCond != ExternalEnvironment) continue; - if (SurfWinShadingFlag(IWin) >= 10) SurfWinShadingFlag(IWin) = ShadeOff; + bool anyGlareControl = BITF_TEST_ANY(BITF(SurfWinShadingFlag(IWin)), BITF(WinShadingType::IntShadeConditionallyOff) | BITF(WinShadingType::GlassConditionallyLightened) |\ + BITF(WinShadingType::ExtShadeConditionallyOff) | BITF(WinShadingType::IntBlindConditionallyOff) | BITF(WinShadingType::ExtBlindConditionallyOff)); + if (anyGlareControl) { + SurfWinShadingFlag(IWin) = WinShadingType::ShadeOff; + } } // Variables for reporting - for (IL = 1; IL <= NREFPT; ++IL) { + for (int IL = 1; IL <= NREFPT; ++IL) { state.dataDaylightingData->ZoneDaylight(ZoneNum).DaylIllumAtRefPt(IL) = state.dataDaylightingManager->DaylIllum(IL); state.dataDaylightingData->ZoneDaylight(ZoneNum).GlareIndexAtRefPt(IL) = GLRNDX(IL); @@ -7092,9 +7076,9 @@ namespace EnergyPlus::DaylightingManager { // The following report variables are valid only for daylit zones without interior windows if (!Zone(ZoneNum).HasInterZoneWindow) { for (loop = 1; loop <= state.dataDaylightingData->ZoneDaylight(ZoneNum).NumOfDayltgExtWins; ++loop) { - IWin = state.dataDaylightingData->ZoneDaylight(ZoneNum).DayltgExtWinSurfNums(loop); - IS = 1; - if (SurfWinShadingFlag(IWin) > 0 || SurfWinSolarDiffusing(IWin)) IS = 2; + int IWin = state.dataDaylightingData->ZoneDaylight(ZoneNum).DayltgExtWinSurfNums(loop); + int IS = 1; + if (SurfWinWindowModelType(IWin) != WindowBSDFModel && (IS_SHADED(SurfWinShadingFlag(IWin)) || SurfWinSolarDiffusing(IWin))) IS = 2; if (state.dataDaylightingData->ZoneDaylight(ZoneNum).DaylightMethod == DataDaylighting::iDaylightingMethod::SplitFluxDaylighting) { int refPtCount = 0; for (int const enclZoneNum : DataViewFactorInformation::ZoneSolarInfo(Zone(ZoneNum).SolarEnclosureNum).ZoneNums) { @@ -7562,7 +7546,6 @@ namespace EnergyPlus::DaylightingManager { // (times light well efficiency, if appropriate) Real64 ZSU1; // Transmitted direct normal illuminance (lux) // CHARACTER(len=32) :: ShType ! Window shading device type - int ShType; // Window shading device type bool ShadeOn; // True if exterior or interior window shade present bool BlindOn; // True if exterior or interior window blind present bool ScreenOn; // True if exterior window screen present @@ -7636,6 +7619,8 @@ namespace EnergyPlus::DaylightingManager { int IntWinNum; // window index for interior windows associated with exterior windows Real64 COSBintWin; + WinShadingType ShType; + ZoneNumThisWin = Surface(Surface(IWin).BaseSurf).Zone; // The inside surface area, ZoneDaylight(ZoneNum)%TotInsSurfArea was calculated in subr DayltgAveInteriorReflectance @@ -7957,9 +7942,9 @@ namespace EnergyPlus::DaylightingManager { BlNum = SurfWinBlindNumber(IWin); // ScNum = SurfaceWindow( IWin ).ScreenNumber; //Unused Set but never used - ShadeOn = (ShType == WSC_ST_InteriorShade || ShType == WSC_ST_ExteriorShade || ShType == WSC_ST_BetweenGlassShade); - BlindOn = (ShType == WSC_ST_InteriorBlind || ShType == WSC_ST_ExteriorBlind || ShType == WSC_ST_BetweenGlassBlind); - ScreenOn = (ShType == WSC_ST_ExteriorScreen); + ShadeOn = ANY_SHADE(ShType); + BlindOn = ANY_BLIND(ShType); + ScreenOn = (ShType == WinShadingType::ExtScreen); } if (ShadeOn || BlindOn || ScreenOn || SurfWinSolarDiffusing(IWin)) { @@ -8021,7 +8006,7 @@ namespace EnergyPlus::DaylightingManager { TransBlBmDiffFront = InterpProfAng(ProfAng, Blind(BlNum).VisFrontBeamDiffTrans(JB, {1, 37})); - if (ShType == WSC_ST_InteriorBlind) { // Interior blind + if (ShType == WinShadingType::IntBlind) { // Interior blind ReflGlDiffDiffBack = state.dataConstruction->Construct(IConst).ReflectVisDiffBack; ReflBlBmDiffFront = InterpProfAng(ProfAng, Blind(BlNum).VisFrontBeamDiffRefl(JB, {1, 37})); ReflBlDiffDiffFront = Blind(BlNum).VisFrontDiffDiffRefl(JB); @@ -8029,7 +8014,7 @@ namespace EnergyPlus::DaylightingManager { TransMult(JB) = TVISBR * (TransBlBmDiffFront + ReflBlBmDiffFront * ReflGlDiffDiffBack * TransBlDiffDiffFront / (1.0 - ReflBlDiffDiffFront * ReflGlDiffDiffBack)); - } else if (ShType == WSC_ST_ExteriorBlind) { // Exterior blind + } else if (ShType == WinShadingType::ExtBlind) { // Exterior blind ReflGlDiffDiffFront = state.dataConstruction->Construct(IConst).ReflectVisDiffFront; ReflBlDiffDiffBack = Blind(BlNum).VisBackDiffDiffRefl(JB); TransMult(JB) = TransBlBmDiffFront * SurfWinGlazedFrac(IWin) * state.dataConstruction->Construct(IConst).TransDiffVis / @@ -8225,7 +8210,7 @@ namespace EnergyPlus::DaylightingManager { TransBlBmDiffFront = InterpProfAng(ProfAng, Blind(BlNum).VisFrontBeamDiffTrans(JB, {1, 37})); - if (ShType == WSC_ST_InteriorBlind) { // Interior blind + if (ShType == WinShadingType::IntBlind) { // Interior blind // TH CR 8121, 7/7/2010 // ReflBlBmDiffFront = InterpProfAng(ProfAng,Blind(BlNum)%VisFrontBeamDiffRefl) ReflBlBmDiffFront = InterpProfAng(ProfAng, Blind(BlNum).VisFrontBeamDiffRefl(JB, {1, 37})); @@ -8237,7 +8222,7 @@ namespace EnergyPlus::DaylightingManager { TransMult(JB) = TVISBSun * (TransBlBmDiffFront + ReflBlBmDiffFront * ReflGlDiffDiffBack * TransBlDiffDiffFront / (1.0 - ReflBlDiffDiffFront * ReflGlDiffDiffBack)); - } else if (ShType == WSC_ST_ExteriorBlind) { // Exterior blind + } else if (ShType == WinShadingType::ExtBlind) { // Exterior blind TransMult(JB) = TransBlBmDiffFront * (state.dataConstruction->Construct(IConst).TransDiffVis / (1.0 - ReflGlDiffDiffFront * Blind(BlNum).VisBackDiffDiffRefl(JB))) * @@ -8327,13 +8312,13 @@ namespace EnergyPlus::DaylightingManager { } else { // Blind on TransBlDiffDiffFront = Blind(BlNum).VisFrontDiffDiffTrans(JB); - if (ShType == WSC_ST_InteriorBlind) { // Interior blind + if (ShType == WinShadingType::IntBlind) { // Interior blind ReflBlDiffDiffFront = Blind(BlNum).VisFrontDiffDiffRefl(JB); TransMult(JB) = TVisSunRefl * (TransBlDiffDiffFront + ReflBlDiffDiffFront * ReflGlDiffDiffBack * TransBlDiffDiffFront / (1.0 - ReflBlDiffDiffFront * ReflGlDiffDiffBack)); - } else if (ShType == WSC_ST_ExteriorBlind) { // Exterior blind + } else if (ShType == WinShadingType::ExtBlind) { // Exterior blind TransMult(JB) = TransBlDiffDiffFront * (state.dataConstruction->Construct(IConst).TransDiffVis / (1.0 - ReflGlDiffDiffFront * Blind(BlNum).VisBackDiffDiffRefl(JB))) * @@ -9533,7 +9518,7 @@ namespace EnergyPlus::DaylightingManager { } if ((SurfWinWindowModelType(IWin) != WindowBSDFModel) && - (SurfWinShadingFlag(IWin) >= 1 || SurfWinSolarDiffusing(IWin))) { + (IS_SHADED(SurfWinShadingFlag(IWin)) || SurfWinSolarDiffusing(IWin))) { // ===Shaded window=== if (!SurfWinMovableSlats(IWin)) { @@ -9714,7 +9699,8 @@ namespace EnergyPlus::DaylightingManager { HorIllSkyFac = state.dataEnvrn->HISKF / ((1.0 - SkyWeight) * HorIllSky(ISky2) + SkyWeight * HorIllSky(ISky1)); for (IS = 1; IS <= 2; ++IS) { - if (IS == 2 && SurfWinShadingFlag(IWin) <= 0 && !SurfWinSolarDiffusing(IWin)) break; + if (IS == 2 && SurfWinWindowModelType(IWin) == WindowBSDFModel) break; + if (IS == 2 && NOT_SHADED(SurfWinShadingFlag(IWin)) && !SurfWinSolarDiffusing(IWin)) break; state.dataDaylightingData->IllumMapCalc(MapNum).IllumFromWinAtMapPt(loop, IS, ILB) = DFSUHR(IS) * state.dataEnvrn->HISUNF + HorIllSkyFac * (DFSKHR(IS, ISky1) * SkyWeight * HorIllSky(ISky1) + @@ -9741,10 +9727,7 @@ namespace EnergyPlus::DaylightingManager { for (loop = 1; loop <= state.dataDaylightingData->ZoneDaylight(ZoneNum).NumOfDayltgExtWins; ++loop) { IWin = state.dataDaylightingData->ZoneDaylight(ZoneNum).DayltgExtWinSurfNums(loop); - IS = 1; - if ((SurfWinWindowModelType(IWin) != WindowBSDFModel) && - ((SurfWinShadingFlag(IWin) >= 1 && SurfWinShadingFlag(IWin) <= 9) || SurfWinSolarDiffusing(IWin))) - IS = 2; + IS = findWinShadingStatus(IWin); // CR 8057. 3/17/2010. // Switchable windows may be in partially switched state rather than fully dark state @@ -9752,8 +9735,8 @@ namespace EnergyPlus::DaylightingManager { ICtrl = Surface(IWin).activeWindowShadingControl; if (Surface(IWin).HasShadeControl) { - if (WindowShadingControl(ICtrl).ShadingControlType == WSCT_MeetDaylIlumSetp && - SurfWinShadingFlag(IWin) == SwitchableGlazing) { + if (WindowShadingControl(ICtrl).ShadingControlType == WindowShadingControlType::MeetDaylIlumSetp && + SurfWinShadingFlag(IWin) == WinShadingType::SwitchableGlazing) { // switchable windows in partial or fully switched state, // get its intermediate VT calculated in DayltgInteriorIllum IConstShaded = Surface(IWin).activeShadedConstruction; @@ -9779,18 +9762,15 @@ namespace EnergyPlus::DaylightingManager { // Loop over exterior windows associated with zone for (loop = 1; loop <= state.dataDaylightingData->ZoneDaylight(ZoneNum).NumOfDayltgExtWins; ++loop) { IWin = state.dataDaylightingData->ZoneDaylight(ZoneNum).DayltgExtWinSurfNums(loop); - IS = 1; - if ((SurfWinWindowModelType(IWin) != WindowBSDFModel) && - ((SurfWinShadingFlag(IWin) >= 1 && SurfWinShadingFlag(IWin) <= 9) || SurfWinSolarDiffusing(IWin))) - IS = 2; + IS = findWinShadingStatus(IWin); // CR 8057. 3/17/2010 VTMULT = 1.0; ICtrl = Surface(IWin).activeWindowShadingControl; if (Surface(IWin).HasShadeControl) { - if (WindowShadingControl(ICtrl).ShadingControlType == WSCT_MeetDaylIlumSetp && - SurfWinShadingFlag(IWin) == SwitchableGlazing) { + if (WindowShadingControl(ICtrl).ShadingControlType == WindowShadingControlType::MeetDaylIlumSetp && + SurfWinShadingFlag(IWin) == WinShadingType::SwitchableGlazing) { // switchable windows in partial or fully switched state, // get its intermediate VT calculated in DayltgInteriorIllum IConstShaded = Surface(IWin).activeShadedConstruction; diff --git a/src/EnergyPlus/DaylightingManager.hh b/src/EnergyPlus/DaylightingManager.hh index e0826dae1ce..6c1d857b81a 100644 --- a/src/EnergyPlus/DaylightingManager.hh +++ b/src/EnergyPlus/DaylightingManager.hh @@ -110,7 +110,7 @@ namespace DaylightingManager { int &LSHCAL, // Interior shade calculation flag: 0=not yet calculated, 1=already calculated int &InShelfSurf, // Inside daylighting shelf surface number int &ICtrl, // Window control counter - int &ShType, // Window shading type + DataSurfaces::WinShadingType &ShType, // Window shading type int &BlNum, // Window blind number Vector3 &WNORM2, // Unit vector normal to window DataDaylighting::iExtWinType &ExtWinType, // Exterior window type (InZoneExtWin, AdjZoneExtWin, NotInOrAdjZoneExtWin) @@ -257,7 +257,7 @@ namespace DaylightingManager { Real64 const TVISB, // Visible transmittance of window for COSB angle of incidence (times light well efficiency, if appropriate) Real64 const DOMEGA, // Solid angle subtended by window element wrt reference point (steradians) int const ICtrl, // Window control counter - int const ShType, // Window shading type + DataSurfaces::WinShadingType const ShType, // Window shading type int const BlNum, // Window blind number Real64 const THRAY, // Azimuth of ray from reference point to window element (radians) Vector3 const &WNORM2, // Unit vector normal to window @@ -317,6 +317,8 @@ namespace DaylightingManager { void GetLightWellData(EnergyPlusData &state, bool &ErrorsFound); // If errors found in input + int findWinShadingStatus(int const IWin); + void DayltgGlare(EnergyPlusData &state, int &IL, // Reference point index: 1=first ref pt, 2=second ref pt Real64 &BLUM, // Window background (surround) luminance (cd/m2) diff --git a/src/EnergyPlus/DisplacementVentMgr.cc b/src/EnergyPlus/DisplacementVentMgr.cc index f5ad91698bd..d6e0e81a9bf 100644 --- a/src/EnergyPlus/DisplacementVentMgr.cc +++ b/src/EnergyPlus/DisplacementVentMgr.cc @@ -627,7 +627,7 @@ namespace DisplacementVentMgr { int FlagApertures; static Real64 TempDepCoef(0.0); // Formerly CoefSumha, coef in zone temp equation with dimensions of h*A static Real64 TempIndCoef(0.0); // Formerly CoefSumhat, coef in zone temp equation with dimensions of h*A(T1 - static Array1D_int IntGainTypesOccupied(29, + static Array1D_int IntGainTypesOccupied(30, {IntGainTypeOf_People, IntGainTypeOf_WaterHeaterMixed, IntGainTypeOf_WaterHeaterStratified, @@ -647,6 +647,7 @@ namespace DisplacementVentMgr { IntGainTypeOf_ElectricLoadCenterInverterSimple, IntGainTypeOf_ElectricLoadCenterInverterFunctionOfPower, IntGainTypeOf_ElectricLoadCenterInverterLookUpTable, + IntGainTypeOf_ElectricLoadCenterStorageLiIonNmcBattery, IntGainTypeOf_ElectricLoadCenterStorageBattery, IntGainTypeOf_ElectricLoadCenterStorageSimple, IntGainTypeOf_PipeIndoor, diff --git a/src/EnergyPlus/EMSManager.cc b/src/EnergyPlus/EMSManager.cc index e4df00f5da3..74d089892c4 100644 --- a/src/EnergyPlus/EMSManager.cc +++ b/src/EnergyPlus/EMSManager.cc @@ -1843,8 +1843,7 @@ namespace EMSManager { using DataSurfaces::Surface; using DataSurfaces::TotSurfaces; using DataSurfaces::WindowShadingControl; - using DataSurfaces::WSC_ST_SwitchableGlazing; - using DataSurfaces::WSC_ST_ExteriorScreen; + using DataSurfaces::WinShadingType; // Locals // SUBROUTINE ARGUMENT DEFINITIONS: @@ -1883,7 +1882,7 @@ namespace EMSManager { DataSurfaces::SurfWinSlatAngThisTSDegEMSon(loopSurfNum), DataSurfaces::SurfWinSlatAngThisTSDegEMSValue(loopSurfNum)); } - } else if (WindowShadingControl(Surface(loopSurfNum).activeWindowShadingControl).ShadingType == WSC_ST_ExteriorScreen) { + } else if (WindowShadingControl(Surface(loopSurfNum).activeWindowShadingControl).ShadingType == WinShadingType::ExtScreen) { SetupEMSActuator(state, "Window Shading Control", Surface(loopSurfNum).Name, "Control Status", @@ -1891,7 +1890,7 @@ namespace EMSManager { DataSurfaces::SurfWinShadingFlagEMSOn(loopSurfNum), DataSurfaces::SurfWinShadingFlagEMSValue(loopSurfNum)); } else { - if (WindowShadingControl(Surface(loopSurfNum).activeWindowShadingControl).ShadingType != WSC_ST_SwitchableGlazing) { + if (WindowShadingControl(Surface(loopSurfNum).activeWindowShadingControl).ShadingType != WinShadingType::SwitchableGlazing) { ShowSevereError(state, "Missing shade or blind layer in window construction name = '" + state.dataConstruction->Construct(Surface(loopSurfNum).activeShadedConstruction).Name + "', surface name = '" + Surface(loopSurfNum).Name + "'."); diff --git a/src/EnergyPlus/ElectricBaseboardRadiator.cc b/src/EnergyPlus/ElectricBaseboardRadiator.cc index 259dfa3fe22..2de4e2f7e6a 100644 --- a/src/EnergyPlus/ElectricBaseboardRadiator.cc +++ b/src/EnergyPlus/ElectricBaseboardRadiator.cc @@ -1147,7 +1147,7 @@ namespace ElectricBaseboardRadiator { Area = Surface(SurfNum).Area; if (Surface(SurfNum).Class == SurfaceClass::Window) { - if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // The area is the shade or blind area = the sum of the glazing area and the divider area (which is zero if no divider) Area += SurfWinDividerArea(SurfNum); } @@ -1158,8 +1158,7 @@ namespace ElectricBaseboardRadiator { SurfWinFrameTempSurfIn(SurfNum); } - if (SurfWinDividerArea(SurfNum) > 0.0 && SurfWinShadingFlag(SurfNum) != IntShadeOn && - SurfWinShadingFlag(SurfNum) != IntBlindOn) { + if (SurfWinDividerArea(SurfNum) > 0.0 && !ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) SumHATsurf += HConvIn(SurfNum) * SurfWinDividerArea(SurfNum) * (1.0 + 2.0 * SurfWinProjCorrDivIn(SurfNum)) * SurfWinDividerTempSurfIn(SurfNum); diff --git a/src/EnergyPlus/ElectricPowerServiceManager.cc b/src/EnergyPlus/ElectricPowerServiceManager.cc index 35985318a31..d40de1331cb 100644 --- a/src/EnergyPlus/ElectricPowerServiceManager.cc +++ b/src/EnergyPlus/ElectricPowerServiceManager.cc @@ -56,9 +56,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -2943,11 +2945,14 @@ ElectricStorage::ElectricStorage( // main constructor energeticEfficCharge_(0.0), energeticEfficDischarge_(0.0), maxPowerDraw_(0.0), maxPowerStore_(0.0), maxEnergyCapacity_(0.0), parallelNum_(0), seriesNum_(0), numBattery_(0), chargeCurveNum_(0), dischargeCurveNum_(0), cycleBinNum_(0), startingSOC_(0.0), maxAhCapacity_(0.0), availableFrac_(0.0), chargeConversionRate_(0.0), chargedOCV_(0.0), dischargedOCV_(0.0), internalR_(0.0), maxDischargeI_(0.0), cutoffV_(0.0), - maxChargeRate_(0.0), lifeCalculation_(BatteyDegredationModelType::degredationNotSet), lifeCurveNum_(0), thisTimeStepStateOfCharge_(0.0), - lastTimeStepStateOfCharge_(0.0), pelNeedFromStorage_(0.0), pelFromStorage_(0.0), pelIntoStorage_(0.0), qdotConvZone_(0.0), qdotRadZone_(0.0), - timeElapsed_(0.0), thisTimeStepAvailable_(0.0), thisTimeStepBound_(0.0), lastTimeStepAvailable_(0.0), lastTimeStepBound_(0.0), - lastTwoTimeStepAvailable_(0.0), lastTwoTimeStepBound_(0.0), count0_(0), electEnergyinStorage_(0.0), thermLossRate_(0.0), thermLossEnergy_(0.0), - storageMode_(0), absoluteSOC_(0.0), fractionSOC_(0.0), batteryCurrent_(0.0), batteryVoltage_(0.0), batteryDamage_(0.0) + maxChargeRate_(0.0), lifeCalculation_(BatteryDegradationModelType::degredationNotSet), lifeCurveNum_(0), + liIon_dcToDcChargingEff_(0.0), liIon_mass_(0.0), liIon_surfaceArea_(0.0), liIon_Cp_(0.0), liIon_heatTransferCoef_(0.0), liIon_Vfull_(0.0), + liIon_Vexp_(0.0), liIon_Vnom_(0.0), liIon_Vnom_default_(0.0), liIon_Qfull_(0.0), liIon_Qexp_(0.0), liIon_Qnom_(0.0), liIon_C_rate_(0.0), + thisTimeStepStateOfCharge_(0.0), lastTimeStepStateOfCharge_(0.0), pelNeedFromStorage_(0.0), pelFromStorage_(0.0), pelIntoStorage_(0.0), + qdotConvZone_(0.0), qdotRadZone_(0.0), timeElapsed_(0.0), thisTimeStepAvailable_(0.0), thisTimeStepBound_(0.0), lastTimeStepAvailable_(0.0), + lastTimeStepBound_(0.0), lastTwoTimeStepAvailable_(0.0), lastTwoTimeStepBound_(0.0), count0_(0), electEnergyinStorage_(0.0), + thermLossRate_(0.0), thermLossEnergy_(0.0), storageMode_(0), absoluteSOC_(0.0), fractionSOC_(0.0), batteryCurrent_(0.0), batteryVoltage_(0.0), + batteryDamage_(0.0), batteryTemperature_(0.0) { std::string const routineName = "ElectricStorage constructor "; @@ -2960,20 +2965,21 @@ ElectricStorage::ElectricStorage( // main constructor int testStorageIndex = 0; int storageIDFObjectNum = 0; - testStorageIndex = inputProcessor->getObjectItemNum(state, "ElectricLoadCenter:Storage:Simple", objectName); - if (testStorageIndex > 0) { - foundStorage = true; - storageIDFObjectNum = testStorageIndex; - DataIPShortCuts::cCurrentModuleObject = "ElectricLoadCenter:Storage:Simple"; - storageModelMode_ = StorageModelType::simpleBucketStorage; - } - - testStorageIndex = inputProcessor->getObjectItemNum(state, "ElectricLoadCenter:Storage:Battery", objectName); - if (testStorageIndex > 0) { - foundStorage = true; - storageIDFObjectNum = testStorageIndex; - DataIPShortCuts::cCurrentModuleObject = "ElectricLoadCenter:Storage:Battery"; - storageModelMode_ = StorageModelType::kiBaMBattery; + const std::array, 3> storageTypes{{ + {"ElectricLoadCenter:Storage:Simple", StorageModelType::simpleBucketStorage}, + {"ElectricLoadCenter:Storage:Battery", StorageModelType::kiBaMBattery}, + {"ElectricLoadCenter:Storage:LiIonNMCBattery", StorageModelType::liIonNmcBattery} + }}; + + for (auto &item : storageTypes) { + testStorageIndex = inputProcessor->getObjectItemNum(state, item.first, objectName); + if (testStorageIndex > 0) { + foundStorage = true; + storageIDFObjectNum = testStorageIndex; + DataIPShortCuts::cCurrentModuleObject = item.first; + storageModelMode_ = item.second; + break; + } } if (foundStorage) { @@ -3076,17 +3082,17 @@ ElectricStorage::ElectricStorage( // main constructor } if (UtilityRoutines::SameString(DataIPShortCuts::cAlphaArgs(6), "Yes")) { - lifeCalculation_ = BatteyDegredationModelType::lifeCalculationYes; + lifeCalculation_ = BatteryDegradationModelType::lifeCalculationYes; } else if (UtilityRoutines::SameString(DataIPShortCuts::cAlphaArgs(6), "No")) { - lifeCalculation_ = BatteyDegredationModelType::lifeCalculationNo; + lifeCalculation_ = BatteryDegradationModelType::lifeCalculationNo; } else { ShowWarningError(state, routineName + DataIPShortCuts::cCurrentModuleObject + "=\"" + DataIPShortCuts::cAlphaArgs(1) + "\", invalid entry."); ShowContinueError(state, "Invalid " + DataIPShortCuts::cAlphaFieldNames(6) + " = " + DataIPShortCuts::cAlphaArgs(6)); ShowContinueError(state, "Yes or No should be selected. Default value No is used to continue simulation"); - lifeCalculation_ = BatteyDegredationModelType::lifeCalculationNo; + lifeCalculation_ = BatteryDegradationModelType::lifeCalculationNo; } - if (lifeCalculation_ == BatteyDegredationModelType::lifeCalculationYes) { + if (lifeCalculation_ == BatteryDegradationModelType::lifeCalculationYes) { lifeCurveNum_ = CurveManager::GetCurveIndex(state, DataIPShortCuts::cAlphaArgs(7)); // Battery life calculation if (lifeCurveNum_ == 0 && !DataIPShortCuts::lAlphaFieldBlanks(7)) { ShowSevereError(state, routineName + DataIPShortCuts::cCurrentModuleObject + "=\"" + DataIPShortCuts::cAlphaArgs(1) + @@ -3134,6 +3140,119 @@ ElectricStorage::ElectricStorage( // main constructor cutoffV_ = DataIPShortCuts::rNumericArgs(12); maxChargeRate_ = DataIPShortCuts::rNumericArgs(13); + break; + } + case StorageModelType::liIonNmcBattery: { + if (UtilityRoutines::SameString(DataIPShortCuts::cAlphaArgs(4), "KandlerSmith") or DataIPShortCuts::lAlphaFieldBlanks(4)) { + lifeCalculation_ = BatteryDegradationModelType::lifeCalculationYes; + } else { + lifeCalculation_ = BatteryDegradationModelType::lifeCalculationNo; + } + seriesNum_ = static_cast(DataIPShortCuts::rNumericArgs(2)); + parallelNum_ = static_cast(DataIPShortCuts::rNumericArgs(3)); + startingSOC_ = DataIPShortCuts::lNumericFieldBlanks(4) ? 0.5 : DataIPShortCuts::rNumericArgs(4); + liIon_dcToDcChargingEff_ = DataIPShortCuts::lNumericFieldBlanks(5) ? 0.95 : DataIPShortCuts::rNumericArgs(5); + liIon_mass_ = DataIPShortCuts::rNumericArgs(6); + liIon_surfaceArea_ = DataIPShortCuts::rNumericArgs(7); + liIon_Cp_ = DataIPShortCuts::lNumericFieldBlanks(8) ? 1500.0 : DataIPShortCuts::rNumericArgs(8); + liIon_heatTransferCoef_ = DataIPShortCuts::lNumericFieldBlanks(9) ? 7.5 : DataIPShortCuts::rNumericArgs(9); + liIon_Vfull_ = DataIPShortCuts::lNumericFieldBlanks(10) ? 4.2 : DataIPShortCuts::rNumericArgs(10); + liIon_Vexp_ = DataIPShortCuts::lNumericFieldBlanks(11) ? 3.53 : DataIPShortCuts::rNumericArgs(11); + liIon_Vnom_ = DataIPShortCuts::lNumericFieldBlanks(12) ? 3.342 : DataIPShortCuts::rNumericArgs(12); + if (liIon_Vfull_ < liIon_Vexp_ or liIon_Vexp_ < liIon_Vnom_) { + ShowSevereError(state, routineName + DataIPShortCuts::cCurrentModuleObject + "=\"" + DataIPShortCuts::cAlphaArgs(1) + "\", invalid entry."); + ShowContinueError(state, DataIPShortCuts::cNumericFieldNames(10) + " must be greater than " + DataIPShortCuts::cNumericFieldNames(11) + ","); + ShowContinueError(state, "which must be greater than " + DataIPShortCuts::cNumericFieldNames(12) + "."); + for (int i = 10; i <= 12; ++i) { + ShowContinueError(state, format("{} = {:.3R}", DataIPShortCuts::cNumericFieldNames(i), DataIPShortCuts::rNumericArgs(i))); + } + errorsFound = true; + } + liIon_Vnom_default_ = DataIPShortCuts::lNumericFieldBlanks(13) ? 3.342 : DataIPShortCuts::rNumericArgs(13); + liIon_Qfull_ = DataIPShortCuts::lNumericFieldBlanks(14) ? 3.2 : DataIPShortCuts::rNumericArgs(14); + liIon_Qexp_ = DataIPShortCuts::lNumericFieldBlanks(15) ? 0.8075 * liIon_Qfull_ : DataIPShortCuts::rNumericArgs(15) * liIon_Qfull_; + liIon_Qnom_ = DataIPShortCuts::lNumericFieldBlanks(16) ? 0.976875 * liIon_Qfull_ : DataIPShortCuts::rNumericArgs(16) * liIon_Qfull_; + if (liIon_Qexp_ >= liIon_Qnom_) { + ShowSevereError(state, routineName + DataIPShortCuts::cCurrentModuleObject + "=\"" + DataIPShortCuts::cAlphaArgs(1) + "\", invalid entry."); + ShowContinueError(state, DataIPShortCuts::cNumericFieldNames(16) + " must be greater than " + DataIPShortCuts::cNumericFieldNames(15) + "."); + for (int i = 15; i <= 16; ++i) { + ShowContinueError(state, format("{} = {:.3R}", DataIPShortCuts::cNumericFieldNames(i), DataIPShortCuts::rNumericArgs(i))); + } + errorsFound = true; + } + liIon_C_rate_ = DataIPShortCuts::lNumericFieldBlanks(17) ? 1.0 : DataIPShortCuts::rNumericArgs(17); + internalR_ = DataIPShortCuts::lNumericFieldBlanks(18) ? 0.09 : DataIPShortCuts::rNumericArgs(18); + + maxAhCapacity_ = liIon_Qfull_ * parallelNum_; + + if (!errorsFound) { + // Set the Lifetime model in SSC + // I'm using a raw pointer here because the the battery_t constructor expects it. + // The pointer is then passed into the battery_t where it is converted into a unique_ptr and persists along with that object. + // Therefore I am not deleting this pointer here because that will be handled by the battery_t class. + lifetime_t* battLifetime; + if (lifeCalculation_ == BatteryDegradationModelType::lifeCalculationYes) { + battLifetime = new lifetime_nmc_t(DataHVACGlobals::TimeStepSys); + } else { + // This sets a lifetime model where the capacity is always 100%. + std::vector tblVals{{20, 0, 100, 20, 5000, 100, 20, 10000, 100, 80, 0, 100, 80, 1000, 100, 80, 2000, 100}}; + util::matrix_t battLifetimeMatrix(6, 3, &tblVals); + battLifetime = new lifetime_calendar_cycle_t(battLifetimeMatrix, DataHVACGlobals::TimeStepSys); + } + + // Create the SSC battery object + ssc_battery_ = std::unique_ptr( + new battery_t( + DataHVACGlobals::TimeStepSys, + battery_params::CHEM::LITHIUM_ION, + new capacity_lithium_ion_t( + maxAhCapacity_, // Capacity of the whole battery + startingSOC_ * 100.0, + 100.0, // Reset later + 0.0, // Reset later + DataHVACGlobals::TimeStepSys + ), + new voltage_dynamic_t( + seriesNum_, + parallelNum_, + liIon_Vnom_default_, + liIon_Vfull_, + liIon_Vexp_, + liIon_Vnom_, + liIon_Qfull_, // Capacity of one cell + liIon_Qexp_, + liIon_Qnom_, + liIon_C_rate_, + internalR_, + DataHVACGlobals::TimeStepSys + ), + battLifetime, + new thermal_t( + DataHVACGlobals::TimeStepSys, + liIon_mass_, + liIon_surfaceArea_, + internalR_ * seriesNum_ / parallelNum_, // Electric resistance of the whole battery + liIon_Cp_, + liIon_heatTransferCoef_, + 20.0 // Picking a temperature for now, will reset before each run. + ), + nullptr + ) + ); + ssc_lastBatteryState_ = std::unique_ptr(new battery_state(ssc_battery_->get_state())); + ssc_initBatteryState_ = std::unique_ptr(new battery_state(ssc_battery_->get_state())); + } + + break; + } + case StorageModelType::storageTypeNotSet: { + // do nothing + break; + } + + } // switch storage model type + + if (storageModelMode_ == StorageModelType::kiBaMBattery or storageModelMode_ == StorageModelType::liIonNmcBattery) { SetupOutputVariable(state, "Electric Storage Operating Mode Index", OutputProcessor::Unit::None, storageMode_, "System", "Average", name_); SetupOutputVariable(state, "Electric Storage Battery Charge State", OutputProcessor::Unit::Ah, @@ -3145,18 +3264,11 @@ ElectricStorage::ElectricStorage( // main constructor SetupOutputVariable(state, "Electric Storage Total Current", OutputProcessor::Unit::A, batteryCurrent_, "System", "Average", name_); SetupOutputVariable(state, "Electric Storage Total Voltage", OutputProcessor::Unit::V, batteryVoltage_, "System", "Average", name_); - if (lifeCalculation_ == BatteyDegredationModelType::lifeCalculationYes) { + if (lifeCalculation_ == BatteryDegradationModelType::lifeCalculationYes) { SetupOutputVariable(state, "Electric Storage Degradation Fraction", OutputProcessor::Unit::None, batteryDamage_, "System", "Average", name_); } - break; - } - case StorageModelType::storageTypeNotSet: { - // do nothing - break; } - } // switch storage model type - SetupOutputVariable(state, "Electric Storage Charge Power", OutputProcessor::Unit::W, storedPower_, "System", "Average", name_); SetupOutputVariable(state, "Electric Storage Charge Energy", OutputProcessor::Unit::J, storedEnergy_, "System", "Sum", name_); SetupOutputVariable(state, "Electric Storage Production Decrement Energy", @@ -3191,6 +3303,9 @@ ElectricStorage::ElectricStorage( // main constructor SetupEMSInternalVariable(state, "Electrical Storage Battery Maximum Capacity", name_, "[Ah]", maxAhCapacity_); } } + if (storageModelMode_ == StorageModelType::liIonNmcBattery) { + SetupOutputVariable(state, "Electric Storage Battery Temperature", OutputProcessor::Unit::C, batteryTemperature_, "System", "Average", name_); + } if (zoneNum_ > 0) { switch (storageModelMode_) { @@ -3214,6 +3329,16 @@ ElectricStorage::ElectricStorage( // main constructor &qdotRadZone_); break; } + case StorageModelType::liIonNmcBattery: { + SetupZoneInternalGain(state, zoneNum_, + "ElectricLoadCenter:Storage:LiIonNMCBattery", + name_, + DataHeatBalance::IntGainTypeOf_ElectricLoadCenterStorageLiIonNmcBattery, + &qdotConvZone_, + nullptr, + &qdotRadZone_); + break; + } case StorageModelType::storageTypeNotSet: { // do nothing break; @@ -3257,7 +3382,7 @@ void ElectricStorage::reinitAtBeginEnvironment() lastTimeStepBound_ = initialCharge * (1.0 - availableFrac_); thisTimeStepAvailable_ = initialCharge * availableFrac_; thisTimeStepBound_ = initialCharge * (1.0 - availableFrac_); - if (lifeCalculation_ == BatteyDegredationModelType::lifeCalculationYes) { + if (lifeCalculation_ == BatteryDegradationModelType::lifeCalculationYes) { count0_ = 1; // Index 0 is for initial SOC, so new input starts from index 1. b10_[0] = startingSOC_; // the initial fractional SOC is stored as the reference x0_[0] = 0.0; @@ -3271,6 +3396,10 @@ void ElectricStorage::reinitAtBeginEnvironment() } batteryDamage_ = 0.0; } + } else if (storageModelMode_ == StorageModelType::liIonNmcBattery) { + // Copy the initial battery state to the last battery state + *ssc_lastBatteryState_ = *ssc_initBatteryState_; + ssc_battery_->set_state(*ssc_lastBatteryState_); } myWarmUpFlag_ = true; } @@ -3294,7 +3423,7 @@ void ElectricStorage::reinitAtEndWarmup() lastTimeStepBound_ = initialCharge * (1.0 - availableFrac_); thisTimeStepAvailable_ = initialCharge * availableFrac_; thisTimeStepBound_ = initialCharge * (1.0 - availableFrac_); - if (lifeCalculation_ == BatteyDegredationModelType::lifeCalculationYes) { + if (lifeCalculation_ == BatteryDegradationModelType::lifeCalculationYes) { count0_ = 1; // Index 0 is for initial SOC, so new input starts from index 1. b10_[0] = startingSOC_; // the initial fractional SOC is stored as the reference x0_[0] = 0.0; @@ -3308,6 +3437,10 @@ void ElectricStorage::reinitAtEndWarmup() } batteryDamage_ = 0.0; } + } else if (storageModelMode_ == StorageModelType::liIonNmcBattery) { + // Copy the initial battery state to the last battery state + *ssc_lastBatteryState_ = *ssc_initBatteryState_; + ssc_battery_->set_state(*ssc_lastBatteryState_); } myWarmUpFlag_ = false; } @@ -3321,7 +3454,7 @@ void ElectricStorage::timeCheckAndUpdate(EnergyPlusData &state) Real64 timeElapsedLoc = state.dataGlobal->HourOfDay + state.dataGlobal->TimeStep * state.dataGlobal->TimeStepZone + DataHVACGlobals::SysTimeElapsed; if (timeElapsed_ != timeElapsedLoc) { // time changed, update last with "current" result from previous time - if (storageModelMode_ == StorageModelType::kiBaMBattery && lifeCalculation_ == BatteyDegredationModelType::lifeCalculationYes) { + if (storageModelMode_ == StorageModelType::kiBaMBattery && lifeCalculation_ == BatteryDegradationModelType::lifeCalculationYes) { // At this point, the current values, last time step values and last two time step values have not been updated, hence: // "ThisTimeStep*" actually points to the previous one time step // "LastTimeStep*" actually points to the previous two time steps @@ -3361,6 +3494,8 @@ void ElectricStorage::timeCheckAndUpdate(EnergyPlusData &state) batteryDamage_ += oneNmb0_[binNum] / CurveManager::CurveValue(state, lifeCurveNum_, (double(binNum) / double(cycleBinNum_))); } } + } else if ( storageModelMode_ == StorageModelType::liIonNmcBattery ) { + *ssc_lastBatteryState_ = ssc_battery_->get_state(); } lastTimeStepStateOfCharge_ = thisTimeStepStateOfCharge_; @@ -3392,7 +3527,9 @@ void ElectricStorage::simulate(EnergyPlusData &state, if (storageModelMode_ == StorageModelType::simpleBucketStorage) { simulateSimpleBucketModel(powerCharge, powerDischarge, charging, discharging, controlSOCMaxFracLimit, controlSOCMinFracLimit); } else if (storageModelMode_ == StorageModelType::kiBaMBattery) { - simulateKineticBatteryModel(state,powerCharge, powerDischarge, charging, discharging, controlSOCMaxFracLimit, controlSOCMinFracLimit); + simulateKineticBatteryModel(state, powerCharge, powerDischarge, charging, discharging, controlSOCMaxFracLimit, controlSOCMinFracLimit); + } else if (storageModelMode_ == StorageModelType::liIonNmcBattery) { + simulateLiIonNmcBatteryModel(state, powerCharge, powerDischarge, charging, discharging, controlSOCMaxFracLimit, controlSOCMinFracLimit); } } @@ -3705,6 +3842,88 @@ void ElectricStorage::simulateKineticBatteryModel(EnergyPlusData &state, powerDischarge = drawnPower_; } +void ElectricStorage::simulateLiIonNmcBatteryModel(EnergyPlusData &state, + Real64 &powerCharge, + Real64 &powerDischarge, + bool &charging, + bool &discharging, + Real64 const controlSOCMaxFracLimit, + Real64 const controlSOCMinFracLimit) +{ + + // Copy the battery state from the end of last timestep + battery_state battState = *ssc_lastBatteryState_; + + // Set the temperature the battery sees + if (zoneNum_ > 0) { + // If in a zone, use the zone temperature + battState.thermal->T_room = DataHeatBalFanSys::ZT(zoneNum_); + } else { + // If outside, use outdoor temperature + battState.thermal->T_room = state.dataEnvrn->OutDryBulbTemp; + } + ssc_battery_->set_state(battState); + + // Set the SOC limits + ssc_battery_->changeSOCLimits(controlSOCMinFracLimit * 100.0, controlSOCMaxFracLimit * 100.0); + + // Set the current timestep length + ssc_battery_->ChangeTimestep(DataHVACGlobals::TimeStepSys); + + // Run the battery + // SAM uses negative values for charging, positive for discharging + // E+ power/energy outputs are positive + double power{0.0}; // Using double instead of Real64 because SSC is expecting a double + if (charging) { + power = - powerCharge; + } else if (discharging) { + power = powerDischarge; + } + power *= 0.001; // Convert to kW + ssc_battery_->runPower(power); + + // Store outputs + const battery_state& battState2{ssc_battery_->get_state()}; + if (battState2.P < 0.0) { // negative for charging + storageMode_ = 2; + powerCharge = fabs(battState2.P) * 1000.0; // kW -> W + powerDischarge = 0.0; + charging = true; + discharging = false; + } else if (battState2.P > 0.0) { // positive for discharging + storageMode_ = 1; + powerCharge = 0.0; + powerDischarge = fabs(battState2.P) * 1000.0; // kW -> W + charging = false; + discharging = true; + } else { + storageMode_ = 0; + powerCharge = 0.0; + powerDischarge = 0.0; + charging = false; + discharging = false; + } + absoluteSOC_ = ssc_battery_->charge_total(); + fractionSOC_ = ssc_battery_->SOC() * 0.01; // % -> fraction + batteryCurrent_ = ssc_battery_->I(); + batteryVoltage_ = ssc_battery_->V(); + batteryDamage_ = 1.0 - (ssc_battery_->charge_maximum_lifetime() / maxAhCapacity_); + storedPower_ = powerCharge; + storedEnergy_ = storedPower_ * DataHVACGlobals::TimeStepSys * DataGlobalConstants::SecInHour; + drawnPower_ = powerDischarge; + drawnEnergy_ = drawnPower_ * DataHVACGlobals::TimeStepSys * DataGlobalConstants::SecInHour; + decrementedEnergyStored_ = - storedEnergy_; + thermLossRate_ = battState2.thermal->heat_dissipated * 1000.0; // kW -> W + thermLossEnergy_ = thermLossRate_ * DataHVACGlobals::TimeStepSys * DataGlobalConstants::SecInHour; + batteryTemperature_ = battState2.thermal->T_batt; + + // Zone Heat Gains + if (zoneNum_ > 0) { // set values for zone heat gains + qdotConvZone_ = (1.0 - zoneRadFract_) * thermLossRate_; + qdotRadZone_ = (zoneRadFract_) * thermLossRate_; + } +} + Real64 ElectricStorage::drawnPower() const { return drawnPower_; @@ -3725,6 +3944,17 @@ Real64 ElectricStorage::storedEnergy() const return storedEnergy_; } +Real64 ElectricStorage::stateOfChargeFraction() const +{ + return fractionSOC_; +} + +Real64 ElectricStorage::batteryTemperature() const +{ + assert(storageModelMode_ == StorageModelType::liIonNmcBattery); + return batteryTemperature_; +} + bool ElectricStorage::determineCurrentForBatteryDischarge(EnergyPlusData &state, Real64 &curI0, Real64 &curT0, diff --git a/src/EnergyPlus/ElectricPowerServiceManager.hh b/src/EnergyPlus/ElectricPowerServiceManager.hh index 8a968b6d9d0..4a0969fa36b 100644 --- a/src/EnergyPlus/ElectricPowerServiceManager.hh +++ b/src/EnergyPlus/ElectricPowerServiceManager.hh @@ -62,6 +62,9 @@ #include #include +// SSC Headers +#include <../third_party/ssc/shared/lib_battery.h> + namespace EnergyPlus { enum class ThermalLossDestination : int @@ -267,6 +270,10 @@ public: // methods Real64 storedEnergy() const; + Real64 stateOfChargeFraction() const; + + Real64 batteryTemperature() const; + bool determineCurrentForBatteryDischarge(EnergyPlusData &state, Real64 &curI0, Real64 &curT0, @@ -299,6 +306,14 @@ private: // methods Real64 const controlSOCMaxFracLimit, Real64 const controlSOCMinFracLimit); + void simulateLiIonNmcBatteryModel(EnergyPlusData &state, + Real64 &powerCharge, + Real64 &powerDischarge, + bool &charging, + bool &discharging, + Real64 const controlSOCMaxFracLimit, + Real64 const controlSOCMinFracLimit); + void rainflow(int const numbin, // numbin = constant value Real64 const input, // input = input value from other object (battery model) std::vector &B1, // stores values of points, calculated here - stored for next timestep @@ -318,10 +333,11 @@ private: // data { storageTypeNotSet = 0, simpleBucketStorage, - kiBaMBattery + kiBaMBattery, + liIonNmcBattery, }; - enum class BatteyDegredationModelType : int + enum class BatteryDegradationModelType : int { degredationNotSet = 0, lifeCalculationYes, @@ -356,16 +372,29 @@ private: // data int cycleBinNum_; // [ ] number of cycle bins Real64 startingSOC_; // [ ] initial fractional state of charge Real64 maxAhCapacity_; // [Ah]maximum capacity - Real64 availableFrac_; // [ ] fraction of available charge capacity + Real64 availableFrac_; // [ ] maximum fraction of available charge capacity Real64 chargeConversionRate_; // [1/h]change rate from bound charge energy to available charge Real64 chargedOCV_; // [V] fully charged open circuit voltage Real64 dischargedOCV_; // [V] fully discharged open circuit voltage Real64 internalR_; // [ohm]internal electric resistance Real64 maxDischargeI_; // [A] maximum discharging current Real64 cutoffV_; // [V] cut-off voltage - Real64 maxChargeRate_; // [1/h]charge rate limit - BatteyDegredationModelType lifeCalculation_; // [ ]battery life calculation: Yes or No - int lifeCurveNum_; // [ ]battery life curve name index number + Real64 maxChargeRate_; // [1/h] charge rate limit + BatteryDegradationModelType lifeCalculation_; // [ ] battery life calculation: Yes or No + int lifeCurveNum_; // [ ] battery life curve name index number + Real64 liIon_dcToDcChargingEff_; // [ ] DC to DC Charging Efficiency (Li-ion NMC model) + Real64 liIon_mass_; // [kg] mass of battery (Li-ion NMC model) + Real64 liIon_surfaceArea_; // [m2] battery surface area (Li-ion NMC model) + Real64 liIon_Cp_; // [J/kg-K] battery specific heat capacity (Li-ion NMC model) + Real64 liIon_heatTransferCoef_; // [W/m2-K] Heat Transfer Coefficient Between Battery and Ambient (Li-ion NMC model) + Real64 liIon_Vfull_; // [V] Fully charged cell voltage (Li-ion NMC model) + Real64 liIon_Vexp_; // [V] Cell Voltage at End of Exponential Zone (Li-ion NMC model) + Real64 liIon_Vnom_; // [V] Cell voltage at end of nominal zone (Li-ion NMC model) + Real64 liIon_Vnom_default_; // [V] Default nominal cell voltage (Li-ion NMC model) + Real64 liIon_Qfull_; // [A-h] Fully charged cell capacity (Li-ion NMC model) + Real64 liIon_Qexp_; // [A-h] Cell capacity at end of exponential zone (Li-ion NMC model) + Real64 liIon_Qnom_; // [A-h] Cell capacity at end of nominal zone (Li-ion NMC model) + Real64 liIon_C_rate_; // [ ] Rate at which voltage vs capacity curve input (Li-ion NMC model) // calculated and from elsewhere vars Real64 thisTimeStepStateOfCharge_; // [J] Real64 lastTimeStepStateOfCharge_; // [J] @@ -381,6 +410,10 @@ private: // data Real64 lastTimeStepBound_; // [Ah] bound charge at the previous timestep Real64 lastTwoTimeStepAvailable_; // [Ah] available charge at the previous two timesteps Real64 lastTwoTimeStepBound_; // [Ah] bound charge at the previous two timesteps + // Li-ion NMC battery objects from SAM Simulation Core lib_battery + std::unique_ptr ssc_battery_; + std::unique_ptr ssc_lastBatteryState_; + std::unique_ptr ssc_initBatteryState_; // battery life calculation variables int count0_; std::vector b10_; @@ -397,6 +430,7 @@ private: // data Real64 batteryCurrent_; // [A] total current Real64 batteryVoltage_; // [V] total voltage Real64 batteryDamage_; // [ ] fractional battery damage + Real64 batteryTemperature_; // [C] battery temperature (only used in Li-ion batteries) }; // ElectricStorage diff --git a/src/EnergyPlus/HVACStandAloneERV.cc b/src/EnergyPlus/HVACStandAloneERV.cc index 7d003a3a88d..45dcc9d985b 100644 --- a/src/EnergyPlus/HVACStandAloneERV.cc +++ b/src/EnergyPlus/HVACStandAloneERV.cc @@ -108,6 +108,7 @@ namespace EnergyPlus::HVACStandAloneERV { // Using/Aliasing using namespace DataLoopNode; using namespace DataHVACGlobals; + using Fans::GetFanVolFlow; using ScheduleManager::GetCurrentScheduleValue; using ScheduleManager::GetScheduleIndex; @@ -2047,4 +2048,91 @@ namespace EnergyPlus::HVACStandAloneERV { return GetStandAloneERVReturnAirNode; } + bool GetStandAloneERVNodeNumber(EnergyPlusData &state, int const NodeNumber) + { + // PURPOSE OF THIS FUNCTION: + // Check if a node is used by a stand alone ERV + // and can be excluded from an airflow network. + + // Return value + bool StandSloneERVAFNException; + + int StandAloneERVIndex; + + if (state.dataHVACStandAloneERV->GetERVInputFlag) { + GetStandAloneERV(state); + state.dataHVACStandAloneERV->GetERVInputFlag = false; + } + + StandSloneERVAFNException = false; + + for (StandAloneERVIndex = 1; StandAloneERVIndex <= state.dataHVACStandAloneERV->NumStandAloneERVs; ++StandAloneERVIndex) { + + auto StandAloneERV = state.dataHVACStandAloneERV->StandAloneERV(StandAloneERVIndex); + bool ErrorsFound{false}; + int SupplyFanInletNodeIndex(0); + int SupplyFanOutletNodeIndex(0); + int ExhaustFanInletNodeIndex(0); + int ExhaustFanOutletNodeIndex(0); + Real64 SupplyFanAirFlow; + Real64 ExhaustFanAirFlow; + + // Get supply air fan inlet and outlet node index and air flow + // ZoneHVAC:EnergyRecoveryVentilator only accepts Fan:SystemModel or Fan:OnOff + if (StandAloneERV.SupplyAirFanType_Num == DataHVACGlobals::FanType_SystemModelObject) { + // Fan:SystemModel + SupplyFanInletNodeIndex = HVACFan::fanObjs[StandAloneERV.SupplyAirFanIndex]->inletNodeNum; + SupplyFanOutletNodeIndex = HVACFan::fanObjs[StandAloneERV.SupplyAirFanIndex]->outletNodeNum; + SupplyFanAirFlow = HVACFan::fanObjs[StandAloneERV.SupplyAirFanIndex]->designAirVolFlowRate; + } else { + // Fan:OnOff + SupplyFanInletNodeIndex = Fans::GetFanInletNode(state, "Fan:OnOff", StandAloneERV.SupplyAirFanName, ErrorsFound); + SupplyFanOutletNodeIndex = Fans::GetFanOutletNode(state, "Fan:OnOff", StandAloneERV.SupplyAirFanName, ErrorsFound); + GetFanVolFlow(StandAloneERV.SupplyAirFanIndex, SupplyFanAirFlow); + if (ErrorsFound) { + ShowWarningError(state, "Could not retrieve fan outlet node for this unit=\"" + StandAloneERV.Name + "\"."); + ErrorsFound = true; + } + } + // Get exhaust air fan inlet and outlet node index and air flow + if (StandAloneERV.ExhaustAirFanType_Num == DataHVACGlobals::FanType_SystemModelObject) { + // Fan:SystemModel + ExhaustFanInletNodeIndex = HVACFan::fanObjs[StandAloneERV.ExhaustAirFanIndex]->inletNodeNum; + ExhaustFanOutletNodeIndex = HVACFan::fanObjs[StandAloneERV.ExhaustAirFanIndex]->outletNodeNum; + ExhaustFanAirFlow = HVACFan::fanObjs[StandAloneERV.ExhaustAirFanIndex]->designAirVolFlowRate; + } else { + // Fan:OnOff + ExhaustFanInletNodeIndex = Fans::GetFanInletNode(state, "Fan:OnOff", StandAloneERV.ExhaustAirFanName, ErrorsFound); + ExhaustFanOutletNodeIndex = Fans::GetFanOutletNode(state, "Fan:OnOff", StandAloneERV.ExhaustAirFanName, ErrorsFound); + GetFanVolFlow(StandAloneERV.ExhaustAirFanIndex, ExhaustFanAirFlow); + if (ErrorsFound) { + ShowWarningError(state, "Could not retrieve fan outlet node for this unit=\"" + StandAloneERV.Name + "\"."); + ErrorsFound = true; + } + } + + // If a standalone ERV's airflow is unbalanced it shouldn't be model along with an AFN + if (std::abs(SupplyFanAirFlow - ExhaustFanAirFlow) >= 1E-20 || + std::abs(StandAloneERV.DesignSAFanVolFlowRate - StandAloneERV.DesignEAFanVolFlowRate) >= 1E-20) { + break; + } + + // Supply air fan nodes + if (NodeNumber == SupplyFanInletNodeIndex || NodeNumber == SupplyFanOutletNodeIndex || NodeNumber == ExhaustFanInletNodeIndex || + NodeNumber == ExhaustFanOutletNodeIndex) { + StandSloneERVAFNException = true; + break; + } + + // Supply air inlet node + if (NodeNumber == StandAloneERV.SupplyAirInletNode) { + StandSloneERVAFNException = true; + break; + } + + } + + return StandSloneERVAFNException; + } + } // namespace EnergyPlus diff --git a/src/EnergyPlus/HVACStandAloneERV.hh b/src/EnergyPlus/HVACStandAloneERV.hh index 94c41596c98..66dca34f68c 100644 --- a/src/EnergyPlus/HVACStandAloneERV.hh +++ b/src/EnergyPlus/HVACStandAloneERV.hh @@ -192,6 +192,8 @@ namespace HVACStandAloneERV { int GetStandAloneERVReturnAirNode(EnergyPlusData &state, int const StandAloneERVNum); + bool GetStandAloneERVNodeNumber(EnergyPlusData &state, int const NodeNumber); + } // namespace HVACStandAloneERV struct HVACStandAloneERVData : BaseGlobalStruct { diff --git a/src/EnergyPlus/HWBaseboardRadiator.cc b/src/EnergyPlus/HWBaseboardRadiator.cc index b6892ffaaab..faac220a19d 100644 --- a/src/EnergyPlus/HWBaseboardRadiator.cc +++ b/src/EnergyPlus/HWBaseboardRadiator.cc @@ -1797,7 +1797,7 @@ namespace HWBaseboardRadiator { Area = Surface(SurfNum).Area; if (Surface(SurfNum).Class == SurfaceClass::Window) { - if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // The area is the shade or blind area = the sum of the glazing area and the divider area (which is zero if no divider) Area += SurfWinDividerArea(SurfNum); } @@ -1808,8 +1808,7 @@ namespace HWBaseboardRadiator { SurfWinFrameTempSurfIn(SurfNum); } - if (SurfWinDividerArea(SurfNum) > 0.0 && SurfWinShadingFlag(SurfNum) != IntShadeOn && - SurfWinShadingFlag(SurfNum) != IntBlindOn) { + if (SurfWinDividerArea(SurfNum) > 0.0 && !ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) SumHATsurf += HConvIn(SurfNum) * SurfWinDividerArea(SurfNum) * (1.0 + 2.0 * SurfWinProjCorrDivIn(SurfNum)) * SurfWinDividerTempSurfIn(SurfNum); diff --git a/src/EnergyPlus/HeatBalanceAirManager.cc b/src/EnergyPlus/HeatBalanceAirManager.cc index 1e7238d8ba6..09ba603d6f1 100644 --- a/src/EnergyPlus/HeatBalanceAirManager.cc +++ b/src/EnergyPlus/HeatBalanceAirManager.cc @@ -316,7 +316,7 @@ namespace HeatBalanceAirManager { // flow - if (ZoneAirMassFlow.EnforceZoneMassBalance && ZoneAirMassFlow.BalanceMixing) { + if (ZoneAirMassFlow.EnforceZoneMassBalance && ZoneAirMassFlow.ZoneFlowAdjustment != DataHeatBalance::NoAdjustReturnAndMixing) { for (Loop = 1; Loop <= TotMixing; ++Loop) { ZoneMassBalanceFlag(Mixing(Loop).ZonePtr) = true; ZoneMassBalanceFlag(Mixing(Loop).FromZone) = true; @@ -3860,7 +3860,7 @@ namespace HeatBalanceAirManager { if (ZoneAirMassFlow.EnforceZoneMassBalance) { // Check for infiltration in zone which are only a mixing source zone for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - if ((ZoneAirMassFlow.BalanceMixing && MassConservation(ZoneNum).IsOnlySourceZone) && + if ((ZoneAirMassFlow.ZoneFlowAdjustment != DataHeatBalance::NoAdjustReturnAndMixing && MassConservation(ZoneNum).IsOnlySourceZone) && (ZoneAirMassFlow.InfiltrationTreatment != NoInfiltrationFlow)) { if (MassConservation(ZoneNum).InfiltrationPtr == 0) { ShowSevereError(state, RoutineName + ": Infiltration object is not defined for zone = " + Zone(ZoneNum).Name); @@ -3888,7 +3888,7 @@ namespace HeatBalanceAirManager { "System", "Average", Zone(ZoneNum).Name); - if (ZoneAirMassFlow.BalanceMixing && + if ((ZoneAirMassFlow.ZoneFlowAdjustment != DataHeatBalance::NoAdjustReturnAndMixing) && ((MassConservation(ZoneNum).NumSourceZonesMixingObject + MassConservation(ZoneNum).NumReceivingZonesMixingObject) > 0)) { SetupOutputVariable(state, "Zone Air Mass Balance Mixing Receiving Mass Flow Rate", OutputProcessor::Unit::kg_s, diff --git a/src/EnergyPlus/HeatBalanceIntRadExchange.cc b/src/EnergyPlus/HeatBalanceIntRadExchange.cc index 25143285417..9c1b25a9707 100644 --- a/src/EnergyPlus/HeatBalanceIntRadExchange.cc +++ b/src/EnergyPlus/HeatBalanceIntRadExchange.cc @@ -171,8 +171,8 @@ namespace HeatBalanceIntRadExchange { bool IntShadeOrBlindStatusChanged; // True if status of interior shade or blind on at least // one window in a zone has changed from previous time step - int ShadeFlag; // Window shading status current time step - int ShadeFlagPrev; // Window shading status previous time step + WinShadingType ShadeFlag; // Window shading status current time step + WinShadingType ShadeFlagPrev; // Window shading status previous time step // variables added as part of strategy to reduce calculation time - Glazer 2011-04-22 static Array1D SurfaceTempRad; @@ -271,9 +271,7 @@ namespace HeatBalanceIntRadExchange { if (state.dataConstruction->Construct(Surface(SurfNum).Construction).TypeIsWindow) { ShadeFlag = SurfWinShadingFlag(SurfNum); ShadeFlagPrev = SurfWinExtIntShadePrevTS(SurfNum); - if ((ShadeFlagPrev != IntShadeOn && ShadeFlag == IntShadeOn) || - (ShadeFlagPrev != IntBlindOn && ShadeFlag == IntBlindOn) || - (ShadeFlagPrev == IntShadeOn && ShadeFlag != IntShadeOn) || (ShadeFlagPrev == IntBlindOn && ShadeFlag != IntBlindOn)) + if (ShadeFlagPrev != ShadeFlag && (ANY_INTERIOR_SHADE_BLIND(ShadeFlagPrev) || ANY_INTERIOR_SHADE_BLIND(ShadeFlag))) IntShadeOrBlindStatusChanged = true; if (SurfWinWindowModelType(SurfNum) == WindowEQLModel && DataWindowEquivalentLayer::CFS(state.dataConstruction->Construct(Surface(SurfNum).Construction).EQLConsPtr).ISControlled) { @@ -291,8 +289,7 @@ namespace HeatBalanceIntRadExchange { int const ConstrNum = Surface(SurfNum).Construction; zone_info.Emissivity(ZoneSurfNum) = state.dataConstruction->Construct(ConstrNum).InsideAbsorpThermal; auto const &surface_window(SurfaceWindow(SurfNum)); - if (state.dataConstruction->Construct(ConstrNum).TypeIsWindow && - (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn)) { + if (state.dataConstruction->Construct(ConstrNum).TypeIsWindow && ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { zone_info.Emissivity(ZoneSurfNum) = InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), surface_window.EffShBlindEmiss) + InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), surface_window.EffGlassEmiss); @@ -331,14 +328,14 @@ namespace HeatBalanceIntRadExchange { if (construct.WindowTypeEQL) { SurfaceTempRad[ZoneSurfNum] = SurfWinEffInsSurfTemp(SurfNum); SurfaceEmiss[ZoneSurfNum] = EQLWindowInsideEffectiveEmiss(state, ConstrNum); - } else if (construct.WindowTypeBSDF && SurfWinShadingFlag(SurfNum) == IntShadeOn) { + } else if (construct.WindowTypeBSDF && SurfWinShadingFlag(SurfNum) == WinShadingType::IntShade) { SurfaceTempRad[ZoneSurfNum] = SurfWinEffInsSurfTemp(SurfNum); SurfaceEmiss[ZoneSurfNum] = surface_window.EffShBlindEmiss[0] + surface_window.EffGlassEmiss[0]; } else if (construct.WindowTypeBSDF) { SurfaceTempRad[ZoneSurfNum] = SurfWinEffInsSurfTemp(SurfNum); SurfaceEmiss[ZoneSurfNum] = construct.InsideAbsorpThermal; } else if (construct.TypeIsWindow && SurfWinOriginalClass(SurfNum) != SurfaceClass::TDD_Diffuser) { - if (SurfIterations == 0 && SurfWinShadingFlag(SurfNum) <= 0) { + if (SurfIterations == 0 && NOT_SHADED(SurfWinShadingFlag(SurfNum))) { // If the window is bare this TS and it is the first time through we use the previous TS glass // temperature whether or not the window was shaded in the previous TS. If the window was shaded // the previous time step this temperature is a better starting value than the shade temperature. @@ -346,7 +343,7 @@ namespace HeatBalanceIntRadExchange { SurfaceEmiss[ZoneSurfNum] = construct.InsideAbsorpThermal; // For windows with an interior shade or blind an effective inside surface temp // and emiss is used here that is a weighted combination of shade/blind and glass temp and emiss. - } else if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn) { + } else if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { SurfaceTempRad[ZoneSurfNum] = SurfWinEffInsSurfTemp(SurfNum); SurfaceEmiss[ZoneSurfNum] = InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), surface_window.EffShBlindEmiss) + InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), surface_window.EffGlassEmiss); diff --git a/src/EnergyPlus/HeatBalanceManager.cc b/src/EnergyPlus/HeatBalanceManager.cc index a43ffdddca7..0258524b30a 100644 --- a/src/EnergyPlus/HeatBalanceManager.cc +++ b/src/EnergyPlus/HeatBalanceManager.cc @@ -1270,32 +1270,43 @@ namespace HeatBalanceManager { if (NumObjects > 0) { inputProcessor->getObjectItem(state, - CurrentModuleObject, - 1, - AlphaName, - NumAlpha, - BuildingNumbers, - NumNumber, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); + CurrentModuleObject, + 1, + AlphaName, + NumAlpha, + BuildingNumbers, + NumNumber, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); if (NumAlpha > 0) { { auto const SELECT_CASE_var(AlphaName(1)); - if (SELECT_CASE_var == "YES") { - ZoneAirMassFlow.BalanceMixing = true; + if (SELECT_CASE_var == "ADJUSTMIXINGONLY") { + ZoneAirMassFlow.ZoneFlowAdjustment = AdjustMixingOnly; ZoneAirMassFlow.EnforceZoneMassBalance = true; - AlphaName(1) = "Yes"; - } else if (SELECT_CASE_var == "NO") { - ZoneAirMassFlow.BalanceMixing = false; - AlphaName(1) = "No"; + AlphaName(1) = "AdjustMixingOnly"; + } else if (SELECT_CASE_var == "ADJUSTRETURNONLY") { + ZoneAirMassFlow.ZoneFlowAdjustment = AdjustReturnOnly; + ZoneAirMassFlow.EnforceZoneMassBalance = true; + AlphaName(1) = "AdjustReturnOnly"; + } else if (SELECT_CASE_var == "ADJUSTMIXINGTHENRETURN") { + ZoneAirMassFlow.ZoneFlowAdjustment = AdjustMixingThenReturn; + ZoneAirMassFlow.EnforceZoneMassBalance = true; + AlphaName(1) = "AdjustMixingThenReturn"; + } else if (SELECT_CASE_var == "ADJUSTRETURNTHENMIXING") { + ZoneAirMassFlow.ZoneFlowAdjustment = AdjustReturnThenMixing; + ZoneAirMassFlow.EnforceZoneMassBalance = true; + AlphaName(1) = "AdjustReturnThenMixing"; + } else if (SELECT_CASE_var == "NONE") { + ZoneAirMassFlow.ZoneFlowAdjustment = NoAdjustReturnAndMixing; + AlphaName(1) = "None"; } else { - ZoneAirMassFlow.BalanceMixing = false; - AlphaName(1) = "No"; - ShowWarningError(state, - CurrentModuleObject + ": Invalid input of " + cAlphaFieldNames(1) + ". The default choice is assigned = No"); + ZoneAirMassFlow.ZoneFlowAdjustment = NoAdjustReturnAndMixing; + AlphaName(1) = "None"; + ShowWarningError(state, CurrentModuleObject + ": Invalid input of " + cAlphaFieldNames(1) + ". The default choice is assigned = None"); } } } @@ -1306,14 +1317,12 @@ namespace HeatBalanceManager { ZoneAirMassFlow.InfiltrationTreatment = AddInfiltrationFlow; ZoneAirMassFlow.EnforceZoneMassBalance = true; AlphaName(2) = "AddInfiltrationFlow"; - if (!state.dataContaminantBalance->Contaminant.CO2Simulation) - state.dataContaminantBalance->Contaminant.SimulateContaminants = true; + if (!state.dataContaminantBalance->Contaminant.CO2Simulation) state.dataContaminantBalance->Contaminant.SimulateContaminants = true; } else if (SELECT_CASE_var == "ADJUSTINFILTRATIONFLOW") { ZoneAirMassFlow.InfiltrationTreatment = AdjustInfiltrationFlow; ZoneAirMassFlow.EnforceZoneMassBalance = true; AlphaName(2) = "AddInfiltrationFlow"; - if (!state.dataContaminantBalance->Contaminant.CO2Simulation) - state.dataContaminantBalance->Contaminant.SimulateContaminants = true; + if (!state.dataContaminantBalance->Contaminant.CO2Simulation) state.dataContaminantBalance->Contaminant.SimulateContaminants = true; } else if (SELECT_CASE_var == "NONE") { ZoneAirMassFlow.InfiltrationTreatment = NoInfiltrationFlow; AlphaName(2) = "None"; @@ -1321,9 +1330,8 @@ namespace HeatBalanceManager { ZoneAirMassFlow.InfiltrationTreatment = AddInfiltrationFlow; ZoneAirMassFlow.EnforceZoneMassBalance = true; AlphaName(2) = "AddInfiltrationFlow"; - ShowWarningError(state, - CurrentModuleObject + ": Invalid input of " + cAlphaFieldNames(2) + - ". The default choice is assigned = AddInfiltrationFlow"); + ShowWarningError(state, CurrentModuleObject + ": Invalid input of " + cAlphaFieldNames(2) + + ". The default choice is assigned = AddInfiltrationFlow"); } } } else { @@ -1346,9 +1354,8 @@ namespace HeatBalanceManager { } else { ZoneAirMassFlow.InfiltrationZoneType = MixingSourceZonesOnly; AlphaName(3) = "MixingSourceZonesOnly"; - ShowWarningError(state, - CurrentModuleObject + ": Invalid input of " + cAlphaFieldNames(3) + - ". The default choice is assigned = MixingSourceZonesOnly"); + ShowWarningError(state, CurrentModuleObject + ": Invalid input of " + cAlphaFieldNames(3) + + ". The default choice is assigned = MixingSourceZonesOnly"); } } } else { @@ -1361,7 +1368,7 @@ namespace HeatBalanceManager { } static constexpr auto Format_732( - "! , Enforce Mass Balance, Adjust Zone Mixing, Adjust Zone Infiltration " + "! , Enforce Mass Balance, Adjust Zone Mixing and Return {{AdjustMixingOnly | AdjustReturnOnly | AdjustMixingThenReturn | AdjustReturnThenMixing | None}}, Adjust Zone Infiltration " "{{AddInfiltration | AdjustInfiltration | None}}, Infiltration Zones {{MixingSourceZonesOnly | AllZones}}\n"); static constexpr auto Format_733(" Zone Air Mass Flow Balance Simulation, {},{},{},{}\n"); diff --git a/src/EnergyPlus/HeatBalanceSurfaceManager.cc b/src/EnergyPlus/HeatBalanceSurfaceManager.cc index 2a1765d610a..ef18f00cc7d 100644 --- a/src/EnergyPlus/HeatBalanceSurfaceManager.cc +++ b/src/EnergyPlus/HeatBalanceSurfaceManager.cc @@ -670,7 +670,7 @@ namespace HeatBalanceSurfaceManager { if (firstSurfWin == -1) continue; for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) { SurfWinFracTimeShadingDeviceOn(SurfNum) = 0.0; - if (SurfWinShadingFlag(SurfNum) > 0) { + if (IS_SHADED(SurfWinShadingFlag(SurfNum))) { SurfWinFracTimeShadingDeviceOn(SurfNum) = 1.0; } else { SurfWinFracTimeShadingDeviceOn(SurfNum) = 0.0; @@ -1051,76 +1051,46 @@ namespace HeatBalanceSurfaceManager { // shading if (Surface(iSurf).HasShadeControl) { PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenSwitchable, surfName, "Yes"); - // shading report PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscName, surfName, WindowShadingControl(curWSC).Name); - { - auto const SELECT_CASE_var1(WindowShadingControl(curWSC).ShadingType); - if (SELECT_CASE_var1 == WSC_ST_NoShade) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscShading, surfName, "No Shade"); - } else if (SELECT_CASE_var1 == WSC_ST_InteriorShade) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscShading, surfName, "Interior Shade"); - } else if (SELECT_CASE_var1 == WSC_ST_SwitchableGlazing) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscShading, surfName, "Switchable Glazing"); - } else if (SELECT_CASE_var1 == WSC_ST_ExteriorShade) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscShading, surfName, "Exterior Shade"); - } else if (SELECT_CASE_var1 == WSC_ST_InteriorBlind) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscShading, surfName, "Interior Blind"); - } else if (SELECT_CASE_var1 == WSC_ST_ExteriorBlind) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscShading, surfName, "Exterior Blind"); - } else if (SELECT_CASE_var1 == WSC_ST_BetweenGlassShade) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscShading, surfName, "Between Glass Shade"); - } else if (SELECT_CASE_var1 == WSC_ST_BetweenGlassBlind) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscShading, surfName, "Between Glass Blind"); - } else if (SELECT_CASE_var1 == WSC_ST_ExteriorScreen) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscShading, surfName, "Exterior Screen"); - } - } - { - auto const SELECT_CASE_var1(WindowShadingControl(curWSC).ShadingControlType); - if (SELECT_CASE_var1 == WSCT_AlwaysOn) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "AlwaysOn"); - } else if (SELECT_CASE_var1 == WSCT_AlwaysOff) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "AlwaysOff"); - } else if (SELECT_CASE_var1 == WSCT_OnIfScheduled) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnIfScheduleAllows"); - } else if (SELECT_CASE_var1 == WSCT_HiSolar) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnIfHighSolarOnWindow"); - } else if (SELECT_CASE_var1 == WSCT_HiHorzSolar) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnIfHighHorizontalSolar"); - } else if (SELECT_CASE_var1 == WSCT_HiOutAirTemp) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnIfHighOutdoorAirTemperature"); - } else if (SELECT_CASE_var1 == WSCT_HiZoneAirTemp) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnIfHighZoneAirTemperature"); - } else if (SELECT_CASE_var1 == WSCT_HiZoneCooling) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnIfHighZoneCooling"); - } else if (SELECT_CASE_var1 == WSCT_HiGlare) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnIfHighGlare"); - } else if (SELECT_CASE_var1 == WSCT_MeetDaylIlumSetp) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "MeetDaylightIlluminanceSetpoint"); - } else if (SELECT_CASE_var1 == WSCT_OnNightLoOutTemp_OffDay) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnNightIfLowOutdoorTempAndOffDay"); - } else if (SELECT_CASE_var1 == WSCT_OnNightLoInTemp_OffDay) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnNightIfLowInsideTempAndOffDay"); - } else if (SELECT_CASE_var1 == WSCT_OnNightIfHeating_OffDay) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnNightIfHeatingAndOffDay"); - } else if (SELECT_CASE_var1 == WSCT_OnNightLoOutTemp_OnDayCooling) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnNightIfLowOutdoorTempAndOnDayIfCooling"); - } else if (SELECT_CASE_var1 == WSCT_OnNightIfHeating_OnDayCooling) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnNightIfHeatingAndOnDayIfCooling"); - } else if (SELECT_CASE_var1 == WSCT_OffNight_OnDay_HiSolarWindow) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OffNightAndOnDayIfCoolingAndHighSolarOnWindow"); - } else if (SELECT_CASE_var1 == WSCT_OnNight_OnDay_HiSolarWindow) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnNightAndOnDayIfCoolingAndHighSolarOnWindow"); - } else if (SELECT_CASE_var1 == WSCT_OnHiOutTemp_HiSolarWindow) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnIfHighOutdoorAirTempAndHighSolarOnWindow"); - } else if (SELECT_CASE_var1 == WSCT_OnHiOutTemp_HiHorzSolar) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnIfHighOutdoorAirTempAndHighHorizontalSolar"); - } else if (SELECT_CASE_var1 == WSCT_OnHiZoneTemp_HiSolarWindow) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnIfHighZoneAirTempAndHighSolarOnWindow"); - } else if (SELECT_CASE_var1 == WSCT_OnHiZoneTemp_HiHorzSolar) { - PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, "OnIfHighZoneAirTempAndHighHorizontalSolar"); - } - } + // shading report + std::vector WindowShadingTypeStr = { + "No Shade", // 0 + "Shade Off", // 1 + "Interior Shade", + "Switchable Glazing", + "Exterior Shade", + "Exterior Screen", + "Interior Blind", + "Exterior Blind", + "Between Glass Shade", + "Between Glass Blind", + }; + std::vector WindowShadingControlTypeStr = { + "Uncontrolled", + "AlwaysOn", + "AlwaysOff", + "OnIfScheduleAllows", + "OnIfHighSolarOnWindow", + "OnIfHighHorizontalSolar", + "OnIfHighOutdoorAirTemperature", + "OnIfHighZoneAirTemperature", + "OnIfHighZoneCooling", + "OnIfHighGlare", + "MeetDaylightIlluminanceSetpoint", + "OnNightIfLowOutdoorTempAndOffDay", + "OnNightIfLowInsideTempAndOffDay", + "OnNightIfHeatingAndOffDay", + "OnNightIfLowOutdoorTempAndOnDayIfCooling", + "OnNightIfHeatingAndOnDayIfCooling", + "OffNightAndOnDayIfCoolingAndHighSolarOnWindow", + "OnNightAndOnDayIfCoolingAndHighSolarOnWindow", + "OnIfHighOutdoorAirTempAndHighSolarOnWindow", + "OnIfHighOutdoorAirTempAndHighHorizontalSolar", + "OnIfHighZoneAirTempAndHighSolarOnWindow", + "OnIfHighZoneAirTempAndHighHorizontalSolar" + }; + PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscShading, surfName, WindowShadingTypeStr[int(WindowShadingControl(curWSC).ShadingType)]); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscControl, surfName, WindowShadingControlTypeStr[int(WindowShadingControl(curWSC).ShadingControlType)]); // output list of all possible shading contructions for shaded windows including those with storms std::string names = ""; @@ -2195,8 +2165,8 @@ namespace HeatBalanceSurfaceManager { SurfWinDividerTempSurfOut(SurfNum) = 23.0; // Initialize previous-timestep shading indicators - SurfWinExtIntShadePrevTS(SurfNum) = 0; - SurfWinShadingFlag(SurfNum) = NoShade; + SurfWinExtIntShadePrevTS(SurfNum) = WinShadingType::NoShade; + SurfWinShadingFlag(SurfNum) = WinShadingType::NoShade; } // end of Zone Surf } } // end of Zone @@ -2879,33 +2849,27 @@ namespace HeatBalanceSurfaceManager { Real64 SkySolarInc = currSkySolarInc(SurfNum); // Sky diffuse solar incident on a surface Real64 GndSolarInc = currGndSolarInc(SurfNum); // Ground diffuse solar incident on a surface - int ShadeFlag = SurfWinShadingFlag(SurfNum); + WinShadingType ShadeFlag = SurfWinShadingFlag(SurfNum); - if (SurfWinWindowModelType(SurfNum) == Window5DetailedModel && - !state.dataWindowManager->inExtWindowModel->isExternalLibraryModel()) { + if (SurfWinWindowModelType(SurfNum) == Window5DetailedModel && !state.dataWindowManager->inExtWindowModel->isExternalLibraryModel()) { int TotGlassLay = state.dataConstruction->Construct(ConstrNum).TotGlassLayers; // Number of glass layers for (int Lay = 1; Lay <= TotGlassLay; ++Lay) { AbsDiffWin(Lay) = state.dataConstruction->Construct(ConstrNum).AbsDiff(Lay); } - if (ShadeFlag > 0) { // Shaded window + if (IS_SHADED(ShadeFlag)) { // Shaded window int ConstrNumSh = Surface(SurfNum).activeShadedConstruction; // Shaded window construction if (SurfWinStormWinFlag(SurfNum) == 1) ConstrNumSh = Surface(SurfNum).activeStormWinShadedConstruction; - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || - ShadeFlag == ExtScreenOn) { // Shade/screen on + if (ANY_SHADE_SCREEN(ShadeFlag)) { // Shade/screen on for (int Lay = 1; Lay <= TotGlassLay; ++Lay) { AbsDiffWin(Lay) = state.dataConstruction->Construct(ConstrNumSh).AbsDiff(Lay); } SurfWinExtDiffAbsByShade(SurfNum) = state.dataConstruction->Construct(ConstrNumSh).AbsDiffShade * (SkySolarInc + GndSolarInc); - - } - - if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || - ShadeFlag == BGBlindOn) { // Blind on + } else if (ANY_BLIND(ShadeFlag)) { // Blind on for (int Lay = 1; Lay <= TotGlassLay; ++Lay) { AbsDiffWin(Lay) = InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), @@ -2945,17 +2909,13 @@ namespace HeatBalanceSurfaceManager { // Correct for shadowing of divider onto interior shading device (note that dividers are // not allowed in windows with between-glass shade/blind) - if ((ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) && - SurfWinDividerArea(SurfNum) > 0.0) + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag) && SurfWinDividerArea(SurfNum) > 0.0) SurfWinExtDiffAbsByShade(SurfNum) *= SurfWinGlazedFrac(SurfNum); - if (ShadeFlag == SwitchableGlazing) { // Switchable glazing - Real64 SwitchFac = SurfWinSwitchingFactor( - SurfNum); // Switching factor for switchable glazing + if (ShadeFlag == WinShadingType::SwitchableGlazing) { // Switchable glazing + Real64 SwitchFac = SurfWinSwitchingFactor(SurfNum); // Switching factor for switchable glazing for (int Lay = 1; Lay <= TotGlassLay; ++Lay) { - AbsDiffWin(Lay) = InterpSw(SwitchFac, AbsDiffWin(Lay), - state.dataConstruction->Construct( - ConstrNumSh).AbsDiff(Lay)); + AbsDiffWin(Lay) = InterpSw(SwitchFac, AbsDiffWin(Lay), state.dataConstruction->Construct(ConstrNumSh).AbsDiff(Lay)); } } @@ -2966,8 +2926,7 @@ namespace HeatBalanceSurfaceManager { SurfWinQRadSWwinAbs(Lay, SurfNum) = AbsDiffWin(Lay) * (SkySolarInc + GndSolarInc) + SurfWinA(Lay, SurfNum) * BeamSolar; // SurfWinA is from InteriorSolarDistribution - if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || - ShadeFlag == BGBlindOn) { + if (ANY_BLIND(ShadeFlag)) { int ConstrNumSh = Surface(SurfNum).activeShadedConstruction; if (Blind(SurfWinBlindNumber(SurfNum)).SlatOrientation == Horizontal) { // AbsDiffGlassLayGnd - System glass layer ground diffuse solar absorptance with blind on @@ -2987,7 +2946,6 @@ namespace HeatBalanceSurfaceManager { SurfWinA(Lay, SurfNum) * BeamSolar; } } - // Total solar absorbed in solid layer (W), for reporting SurfWinQRadSWwinAbsLayer(Lay, SurfNum) = SurfWinQRadSWwinAbs(Lay, SurfNum) * Surface(SurfNum).Area; @@ -3169,7 +3127,7 @@ namespace HeatBalanceSurfaceManager { Real64 TransGl = POLYF(CosInc, state.dataConstruction->Construct( ConstrNum).TransSolBeamCoef); TransDiffGl = state.dataConstruction->Construct(ConstrNum).TransDiff; - if (ShadeFlag == SwitchableGlazing) { // Switchable glazing + if (ShadeFlag == WinShadingType::SwitchableGlazing) { // Switchable glazing Real64 SwitchFac = SurfWinSwitchingFactor(SurfNum); int ConstrNumSh = Surface(SurfNum).activeShadedConstruction; Real64 TransGlSh = POLYF(CosInc, state.dataConstruction->Construct( @@ -3223,7 +3181,7 @@ namespace HeatBalanceSurfaceManager { Real64 AbsGl = 1.0 - TransGl - ReflGl; Real64 SwitchFac = SurfWinSwitchingFactor(SurfNum); int ConstrNumSh = Surface(SurfNum).activeShadedConstruction; - if (ShadeFlag == SwitchableGlazing) { // Switchable glazing + if (ShadeFlag == WinShadingType::SwitchableGlazing) { // Switchable glazing Real64 MatNumGlSh = state.dataConstruction->Construct( ConstrNumSh).LayerPoint(1); Real64 TransGlSh = state.dataMaterial->Material(MatNumGlSh).Trans; @@ -3243,8 +3201,7 @@ namespace HeatBalanceSurfaceManager { Real64 BeamDivHorFaceInc = 0.0; // Beam solar on divider's horizontal outside projection faces (W/m2) Real64 BeamDivVertFaceInc = 0.0; // Beam solar on divider's vertical outside projection faces (W/m2) // Beam incident on horizontal and vertical projection faces of divider if no exterior shading - if (DivProjOut > 0.0 && ShadeFlag != ExtShadeOn && - ShadeFlag != ExtBlindOn && ShadeFlag != ExtScreenOn) { + if (DivProjOut > 0.0 && !ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) { BeamDivHorFaceInc = state.dataEnvrn->BeamSolarRad * CosIncAngHorProj * FrameDivider(FrDivNum).HorDividers * DivProjOut * (Surface(SurfNum).Width - @@ -3260,9 +3217,7 @@ namespace HeatBalanceSurfaceManager { Real64 DivIncSolarOutDif = 0.0; // Diffuse solar incident on outside of divider including diffuse on divider projection (W/m2) Real64 DivIncSolarInBm = 0.0; // Diffuse solar incident on inside of divider including beam on divider projection (W/m2) Real64 DivIncSolarInDif = 0.0; // Diffuse solar incident on inside of divider including diffuse on divider projection (W/m2) - if (ShadeFlag != ExtShadeOn && ShadeFlag != ExtBlindOn && - ShadeFlag != BGShadeOn && ShadeFlag != BGBlindOn && - ShadeFlag != ExtScreenOn) { // No exterior or between-glass shading + if (!ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag) && !ANY_BETWEENGLASS_SHADE_BLIND(ShadeFlag)) { // No exterior or between-glass shading DivIncSolarOutBm = BeamFaceInc + BeamDivHorFaceInc + BeamDivVertFaceInc; DivIncSolarOutDif = DifSolarFaceInc * (1.0 + SurfWinProjCorrDivOut(SurfNum)); @@ -3271,7 +3226,7 @@ namespace HeatBalanceSurfaceManager { ConstrNum).TransSolBeamCoef); Real64 TransDiffGl = state.dataConstruction->Construct( ConstrNum).TransDiff; // Diffuse solar transmittance - if (ShadeFlag == SwitchableGlazing) { // Switchable glazing + if (ShadeFlag == WinShadingType::SwitchableGlazing) { // Switchable glazing Real64 SwitchFac = SurfWinSwitchingFactor(SurfNum); int ConstrNumSh = Surface(SurfNum).activeShadedConstruction; Real64 TransGlSh = POLYF(CosInc, state.dataConstruction->Construct( @@ -3315,15 +3270,14 @@ namespace HeatBalanceSurfaceManager { DivIncSolarInDif = DifSolarFaceInc * SurfWinProjCorrDivIn(SurfNum) * state.dataConstruction->Construct(ConstrNum).TransDiff; } - if (ShadeFlag != ExtShadeOn && ShadeFlag != ExtBlindOn && - ShadeFlag != ExtScreenOn && ShadeFlag != BGShadeOn && ShadeFlag != BGBlindOn) { + if (!ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag) && !ANY_BETWEENGLASS_SHADE_BLIND(ShadeFlag)) { // No exterior or between-glass shade, screen or blind SurfWinDividerQRadOutAbs(SurfNum) = DividerAbs * (DivIncSolarOutBm + DivIncSolarOutDif); SurfWinDividerQRadInAbs(SurfNum) = DividerAbs * (DivIncSolarInBm + DivIncSolarInDif); // Exterior shade, screen or blind - } else if (ShadeFlag == ExtBlindOn) { // Exterior blind + } else if (ShadeFlag == WinShadingType::ExtBlind) { // Exterior blind int BlNum = SurfWinBlindNumber(SurfNum); Real64 ProfAng; // Solar profile angle (rad) ProfileAngle(SurfNum, state.dataEnvrn->SOLCOS, Blind(BlNum).SlatOrientation, ProfAng); @@ -3346,7 +3300,7 @@ namespace HeatBalanceSurfaceManager { DivIncSolarInDif * InterpSlatAng(SlatAng, SurfWinMovableSlats(SurfNum), Blind(BlNum).SolFrontDiffDiffTrans)); - } else if (ShadeFlag == ExtShadeOn) { // Exterior shade + } else if (ShadeFlag == WinShadingType::ExtShade) { // Exterior shade int ConstrNumSh = Surface(SurfNum).activeShadedConstruction; SurfWinDividerQRadOutAbs(SurfNum) = DividerAbs * state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNumSh).LayerPoint(1)).Trans * @@ -3355,7 +3309,7 @@ namespace HeatBalanceSurfaceManager { DividerAbs * state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNumSh).LayerPoint(1)).Trans * (DivIncSolarInBm +DivIncSolarInDif); - } else if (ShadeFlag == ExtScreenOn) { // Exterior screen + } else if (ShadeFlag == WinShadingType::ExtScreen) { // Exterior screen SurfWinDividerQRadOutAbs(SurfNum) = DividerAbs * (SurfaceScreens( SurfWinScreenNumber(SurfNum)).BmBmTrans + SurfaceScreens( SurfWinScreenNumber(SurfNum)).BmDifTrans) * @@ -3569,7 +3523,7 @@ namespace HeatBalanceSurfaceManager { ConstrNumSh = Surface(SurfNum).activeStormWinShadedConstruction; } int TotGlassLayers = state.dataConstruction->Construct(ConstrNum).TotGlassLayers; - int ShadeFlag = SurfWinShadingFlag(SurfNum); + WinShadingType ShadeFlag = SurfWinShadingFlag(SurfNum); // These calculations are repeated from InitInternalHeatGains for the Zone Component Loads Report Real64 pulseMultipler = 0.01; // use to create a pulse for the load component report computations, the W/sqft pulse for the zone @@ -3587,49 +3541,43 @@ namespace HeatBalanceSurfaceManager { SurfQRadThermInAbs(SurfNum) = adjQL * TMULT(radEnclosureNum) * ITABSF(SurfNum); } - if (ShadeFlag <= 0) { // No window shading + if (NOT_SHADED(ShadeFlag)) { // No window shading for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) { SurfWinQRadSWwinAbs(IGlass, SurfNum) += QS(solEnclosureNum) * state.dataConstruction->Construct(ConstrNum).AbsDiffBack(IGlass); } - } else if (ConstrNumSh != 0 && (ShadeFlag == IntShadeOn || ShadeFlag >= 3)) { + } else if (ConstrNumSh != 0 && ShadeFlag != WinShadingType::SwitchableGlazing) { // Interior, exterior or between-glass shade, screen or blind in place for (int IGlass = 1; IGlass <= state.dataConstruction->Construct(ConstrNumSh).TotGlassLayers; ++IGlass) { - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || - ShadeFlag == ExtScreenOn) - SurfWinQRadSWwinAbs(IGlass, SurfNum) += QS(solEnclosureNum) * - state.dataConstruction->Construct(ConstrNumSh).AbsDiffBack( - IGlass); - if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn) { + if (ANY_SHADE_SCREEN(ShadeFlag)) { + SurfWinQRadSWwinAbs(IGlass, SurfNum) += QS(solEnclosureNum) * state.dataConstruction->Construct(ConstrNumSh).AbsDiffBack(IGlass); + } else if (BITF_TEST_ANY(BITF(ShadeFlag), BITF(WinShadingType::IntBlind) | BITF(WinShadingType::ExtBlind))) { Real64 BlAbsDiffBk = InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), state.dataConstruction->Construct(ConstrNumSh).BlAbsDiffBack(_, IGlass)); // Glass layer back diffuse solar absorptance when blind in place SurfWinQRadSWwinAbs(IGlass, SurfNum) += QS(solEnclosureNum) * BlAbsDiffBk; } } - if (ShadeFlag == IntShadeOn) - SurfWinIntLWAbsByShade(SurfNum) = - QL(radEnclosureNum) * state.dataConstruction->Construct(ConstrNumSh).ShadeAbsorpThermal * - TMULT(radEnclosureNum); - if (ShadeFlag == IntBlindOn) { + if (ShadeFlag == WinShadingType::IntShade) { + SurfWinIntLWAbsByShade(SurfNum) = QL(radEnclosureNum) * state.dataConstruction->Construct(ConstrNumSh).ShadeAbsorpThermal * TMULT(radEnclosureNum); + } else if (ShadeFlag == WinShadingType::IntBlind) { Real64 EffBlEmiss = InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), SurfaceWindow(SurfNum).EffShBlindEmiss); // Blind emissivity (thermal absorptance) as part of glazing system SurfWinIntLWAbsByShade(SurfNum) = QL(radEnclosureNum) * EffBlEmiss * TMULT(radEnclosureNum); } - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || - ShadeFlag == ExtScreenOn) - SurfWinIntSWAbsByShade(SurfNum) = - QS(solEnclosureNum) * state.dataConstruction->Construct(ConstrNumSh).AbsDiffBackShade; - if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGBlindOn) { + if (ANY_SHADE_SCREEN(ShadeFlag)){ + SurfWinIntSWAbsByShade(SurfNum) = QS(solEnclosureNum) * state.dataConstruction->Construct(ConstrNumSh).AbsDiffBackShade; + } else if (ANY_BLIND(ShadeFlag)) { Real64 AbsDiffBkBl = InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), state.dataConstruction->Construct(ConstrNumSh).AbsDiffBackBlind); // Blind diffuse back solar absorptance as part of glazing system SurfWinIntSWAbsByShade(SurfNum) = QS(solEnclosureNum) * AbsDiffBkBl; } // Correct for divider shadowing - if (ShadeFlag == ExtShadeOn || ShadeFlag == ExtBlindOn || ShadeFlag == ExtScreenOn) + if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) { SurfWinIntSWAbsByShade(SurfNum) *= SurfWinGlazedFrac(SurfNum); + } - } else if (ShadeFlag == SwitchableGlazing) { // Switchable glazing + } else if (ShadeFlag == WinShadingType::SwitchableGlazing) { // Switchable glazing for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) { SurfWinQRadSWwinAbs(IGlass, SurfNum) += QS(solEnclosureNum) * @@ -3665,12 +3613,12 @@ namespace HeatBalanceSurfaceManager { DividerThermAbs = state.dataMaterial->Material(MatNumGl).AbsorpThermalBack; } // Correct for interior shade transmittance - if (ShadeFlag == IntShadeOn) { + if (ShadeFlag == WinShadingType::IntShade) { int MatNumSh = state.dataConstruction->Construct(ConstrNumSh).LayerPoint( state.dataConstruction->Construct(ConstrNumSh).TotLayers); // Shade layer material number DividerSolAbs *= state.dataMaterial->Material(MatNumSh).Trans; DividerThermAbs *= state.dataMaterial->Material(MatNumSh).TransThermal; - } else if (ShadeFlag == IntBlindOn) { + } else if (ShadeFlag == WinShadingType::IntBlind) { int BlNum = SurfWinBlindNumber(SurfNum); DividerSolAbs *= InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), Blind(BlNum).SolBackDiffDiffTrans); @@ -3747,26 +3695,25 @@ namespace HeatBalanceSurfaceManager { ConstrNumSh = Surface(SurfNum).activeStormWinShadedConstruction; } int TotGlassLayers = state.dataConstruction->Construct(ConstrNum).TotGlassLayers; - int ShadeFlag = SurfWinShadingFlag(SurfNum); - if (ShadeFlag <= 0) { // No window shading + WinShadingType ShadeFlag = SurfWinShadingFlag(SurfNum); + if (NOT_SHADED(ShadeFlag)) { // No window shading for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) { SurfWinQRadSWwinAbs(IGlass, SurfNum) += SurfWinInitialDifSolwinAbs(IGlass, SurfNum); } - } else if (ShadeFlag == IntShadeOn || ShadeFlag >= 3) { + } else if (ShadeFlag == WinShadingType::SwitchableGlazing) { // Switchable glazing + for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) { + SurfWinQRadSWwinAbs(IGlass, SurfNum) += SurfWinInitialDifSolwinAbs(IGlass, SurfNum); + } + } else { // Interior, exterior or between-glass shade, screen or blind in place for (int IGlass = 1; IGlass <= state.dataConstruction->Construct(ConstrNumSh).TotGlassLayers; ++IGlass) { SurfWinQRadSWwinAbs(IGlass, SurfNum) += SurfWinInitialDifSolwinAbs(IGlass, SurfNum); } - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || - ShadeFlag == ExtScreenOn) + if (ANY_SHADE_SCREEN(ShadeFlag)) { SurfWinIntSWAbsByShade(SurfNum) += SurfWinInitialDifSolAbsByShade(SurfNum); - if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGBlindOn) { + } else if (ANY_BLIND(ShadeFlag)) { SurfWinIntSWAbsByShade(SurfNum) += SurfWinInitialDifSolAbsByShade(SurfNum); } - } else if (ShadeFlag == SwitchableGlazing) { // Switchable glazing - for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) { - SurfWinQRadSWwinAbs(IGlass, SurfNum) += SurfWinInitialDifSolwinAbs(IGlass, SurfNum); - } } // End of shading flag check } else if (SurfWinWindowModelType(SurfNum) == WindowBSDFModel) { int TotGlassLayers = state.dataConstruction->Construct(ConstrNum).TotGlassLayers; @@ -3801,8 +3748,8 @@ namespace HeatBalanceSurfaceManager { } else { TotGlassLayers = state.dataConstruction->Construct(ConstrNum).TotGlassLayers; } - int ShadeFlag = SurfWinShadingFlag(SurfNum); - if (ShadeFlag <= 0 || SurfWinWindowModelType(SurfNum) == WindowBSDFModel) { // No window shading + WinShadingType ShadeFlag = SurfWinShadingFlag(SurfNum); + if (NOT_SHADED(ShadeFlag) || SurfWinWindowModelType(SurfNum) == WindowBSDFModel) { // No window shading for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) { // Initial Transmitted Diffuse Solar Absorbed on Inside of Surface[W] SurfInitialDifSolInAbsReport(SurfNum) += @@ -3812,9 +3759,8 @@ namespace HeatBalanceSurfaceManager { // Total Shortwave Absorbed:All Glass Layers[W] SurfWinSWwinAbsTotalReport(SurfNum) += SurfWinQRadSWwinAbs(IGlass, SurfNum) * Surface(SurfNum).Area; } - } else if (ShadeFlag == IntShadeOn || ShadeFlag >= 3) { - // Interior, exterior or between-glass shade, screen or blind in place - for (int IGlass = 1; IGlass <= state.dataConstruction->Construct(ConstrNumSh).TotGlassLayers; ++IGlass) { + } else if (ShadeFlag == WinShadingType::SwitchableGlazing) { // Switchable glazing + for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) { // Initial Transmitted Diffuse Solar Absorbed on Inside of Surface[W] SurfInitialDifSolInAbsReport(SurfNum) += SurfWinInitialDifSolwinAbs(IGlass, SurfNum) * Surface(SurfNum).Area; @@ -3823,8 +3769,9 @@ namespace HeatBalanceSurfaceManager { // Total Shortwave Absorbed:All Glass Layers[W] SurfWinSWwinAbsTotalReport(SurfNum) += SurfWinQRadSWwinAbs(IGlass, SurfNum) * Surface(SurfNum).Area; } - } else if (ShadeFlag == SwitchableGlazing) { // Switchable glazing - for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) { + } else { + // Interior, exterior or between-glass shade, screen or blind in place + for (int IGlass = 1; IGlass <= state.dataConstruction->Construct(ConstrNumSh).TotGlassLayers; ++IGlass) { // Initial Transmitted Diffuse Solar Absorbed on Inside of Surface[W] SurfInitialDifSolInAbsReport(SurfNum) += SurfWinInitialDifSolwinAbs(IGlass, SurfNum) * Surface(SurfNum).Area; @@ -3902,8 +3849,8 @@ namespace HeatBalanceSurfaceManager { if (firstSurfWin == -1) continue; for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) { // For window with an interior shade or blind, emissivity is a combination of glass and shade/blind emissivity - int ShadeFlag = SurfWinShadingFlag(SurfNum); - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) + WinShadingType ShadeFlag = SurfWinShadingFlag(SurfNum); + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) ITABSF(SurfNum) = InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), SurfaceWindow(SurfNum).EffShBlindEmiss) + InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), @@ -3921,8 +3868,8 @@ namespace HeatBalanceSurfaceManager { if (!Surface(SurfNum).HeatTransSurf) continue; int ConstrNum = Surface(SurfNum).Construction; - int ShadeFlag = SurfWinShadingFlag(SurfNum); - if (ShadeFlag != SwitchableGlazing) { + WinShadingType ShadeFlag = SurfWinShadingFlag(SurfNum); + if (ShadeFlag != WinShadingType::SwitchableGlazing) { SUM1 += Surface(SurfNum).Area * ITABSF(SurfNum); } else { // Switchable glazing SUM1 += Surface(SurfNum).Area * InterpSw(SurfWinSwitchingFactor(SurfNum), @@ -3937,7 +3884,7 @@ namespace HeatBalanceSurfaceManager { Real64 DividerThermAbs = SurfWinDividerEmis(SurfNum); // Window divider thermal absorptance // Suspended (between-glass) divider; relevant emissivity is inner glass emissivity if (SurfWinDividerType(SurfNum) == Suspended) DividerThermAbs = state.dataConstruction->Construct(ConstrNum).InsideAbsorpThermal; - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { // Interior shade or blind in place int ConstrNumSh = Surface(SurfNum).activeShadedConstruction; if (SurfWinHasShadeOrBlindLayer(SurfNum)) { @@ -3947,7 +3894,7 @@ namespace HeatBalanceSurfaceManager { Real64 TauShIR = state.dataMaterial->Material(MatNumSh).TransThermal; // Effective emissivity of shade or blind Real64 EffShDevEmiss = SurfaceWindow(SurfNum).EffShBlindEmiss(1); - if (ShadeFlag == IntBlindOn) { + if (ShadeFlag == WinShadingType::IntBlind) { TauShIR = InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), Blind(SurfWinBlindNumber(SurfNum)).IRBackTrans); @@ -4040,7 +3987,7 @@ namespace HeatBalanceSurfaceManager { // Window if (!state.dataConstruction->Construct(Surface(SurfNum).Construction).WindowTypeEQL) { - int ShadeFlag = SurfWinShadingFlag(SurfNum); + WinShadingType ShadeFlag = SurfWinShadingFlag(SurfNum); Real64 AbsDiffTotWin = 0.0; // Sum of window layer short-wave absorptances int ConstrNumSh = Surface(SurfNum).activeShadedConstruction; if (SurfWinStormWinFlag(SurfNum) == 1) { @@ -4055,9 +4002,9 @@ namespace HeatBalanceSurfaceManager { // Window with shade, screen or blind if (ConstrNumSh != 0) { - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || ShadeFlag == ExtScreenOn) { + if (ANY_SHADE_SCREEN(ShadeFlag)) { AbsDiffLayWin = state.dataConstruction->Construct(ConstrNumSh).AbsDiffBack(Lay); - } else if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGBlindOn) { + } else if (ANY_BLIND(ShadeFlag)) { AbsDiffLayWin = InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), state.dataConstruction->Construct(ConstrNumSh).BlAbsDiffBack(_, Lay)); @@ -4065,7 +4012,7 @@ namespace HeatBalanceSurfaceManager { } // Switchable glazing - if (ShadeFlag == SwitchableGlazing) + if (ShadeFlag == WinShadingType::SwitchableGlazing) AbsDiffLayWin = InterpSw(SwitchFac, AbsDiffLayWin, state.dataConstruction->Construct(ConstrNumSh).AbsDiffBack(Lay)); AbsDiffTotWin += AbsDiffLayWin; @@ -4077,10 +4024,10 @@ namespace HeatBalanceSurfaceManager { // Window with shade, screen or blind if (ConstrNumSh != 0) { - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || ShadeFlag == ExtScreenOn) { + if (ANY_SHADE_SCREEN(ShadeFlag)) { TransDiffWin = state.dataConstruction->Construct(ConstrNumSh).TransDiff; DiffAbsShade = state.dataConstruction->Construct(ConstrNumSh).AbsDiffBackShade; - } else if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGBlindOn) { + } else if (ANY_BLIND(ShadeFlag)) { TransDiffWin = InterpSlatAng( SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), state.dataConstruction->Construct(ConstrNumSh).BlTransDiff); DiffAbsShade = InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), @@ -4091,7 +4038,7 @@ namespace HeatBalanceSurfaceManager { // Switchable glazing - if (ShadeFlag == SwitchableGlazing) + if (ShadeFlag == WinShadingType::SwitchableGlazing) TransDiffWin = InterpSw(SwitchFac, TransDiffWin, state.dataConstruction->Construct(ConstrNumSh).TransDiff); SUM1 += Surface(SurfNum).Area * (TransDiffWin + AbsDiffTotWin + DiffAbsShade); @@ -4112,7 +4059,7 @@ namespace HeatBalanceSurfaceManager { Real64 DividerRefl = 1.0 - DividerAbs; // Window divider short-wave reflectance DividerAbs = AbsGl + TransGl * (DividerAbs + DividerRefl * AbsGl) / (1.0 - DividerRefl * ReflGl); } - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { SUM1 += SurfWinDividerArea(SurfNum) * (DividerAbs + DiffAbsShade); } else { SUM1 += SurfWinDividerArea(SurfNum) * (1.0 + SurfWinProjCorrDivIn(SurfNum)) * DividerAbs; @@ -6789,7 +6736,7 @@ namespace HeatBalanceSurfaceManager { int RoughSurf = state.dataMaterial->Material(construct.LayerPoint(1)).Roughness; // Outside surface roughness Real64 EmisOut = state.dataMaterial->Material(construct.LayerPoint(1)).AbsorpThermalFront; // Glass outside surface emissivity auto const shading_flag(SurfWinShadingFlag(SurfNum)); - if (shading_flag == ExtShadeOn || shading_flag == ExtBlindOn || shading_flag == ExtScreenOn) { + if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(shading_flag)) { // Exterior shade in place int ConstrNumSh = Surface(SurfNum).activeShadedConstruction; if (ConstrNumSh != 0) { @@ -7491,7 +7438,7 @@ namespace HeatBalanceSurfaceManager { Real64 EmisOut = state.dataMaterial->Material(construct.LayerPoint(1)).AbsorpThermalFront; // Glass outside surface emissivity auto const shading_flag(SurfWinShadingFlag(surfNum)); - if (shading_flag == ExtShadeOn || shading_flag == ExtBlindOn || shading_flag == ExtScreenOn) { + if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(shading_flag)) { // Exterior shade in place int ConstrNumSh = Surface(surfNum).activeShadedConstruction; if (ConstrNumSh != 0) { diff --git a/src/EnergyPlus/HighTempRadiantSystem.cc b/src/EnergyPlus/HighTempRadiantSystem.cc index 7336019735d..34f43ffa29f 100644 --- a/src/EnergyPlus/HighTempRadiantSystem.cc +++ b/src/EnergyPlus/HighTempRadiantSystem.cc @@ -1491,7 +1491,7 @@ namespace HighTempRadiantSystem { Area = Surface(SurfNum).Area; if (Surface(SurfNum).Class == SurfaceClass::Window) { - if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // The area is the shade or blind area = the sum of the glazing area and the divider area (which is zero if no divider) Area += SurfWinDividerArea(SurfNum); } @@ -1502,8 +1502,7 @@ namespace HighTempRadiantSystem { SurfWinFrameTempSurfIn(SurfNum); } - if (SurfWinDividerArea(SurfNum) > 0.0 && SurfWinShadingFlag(SurfNum) != IntShadeOn && - SurfWinShadingFlag(SurfNum) != IntBlindOn) { + if (SurfWinDividerArea(SurfNum) > 0.0 && !ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) SumHATsurf += HConvIn(SurfNum) * SurfWinDividerArea(SurfNum) * (1.0 + 2.0 * SurfWinProjCorrDivIn(SurfNum)) * SurfWinDividerTempSurfIn(SurfNum); diff --git a/src/EnergyPlus/InternalHeatGains.cc b/src/EnergyPlus/InternalHeatGains.cc index 3f0960a92a7..1674acb1b22 100644 --- a/src/EnergyPlus/InternalHeatGains.cc +++ b/src/EnergyPlus/InternalHeatGains.cc @@ -5386,6 +5386,10 @@ namespace InternalHeatGains { e.CO2Rate = 0.0; } + for (auto &e : DataHeatBalance::ZonePreDefRep) { + e.NumOcc = 0.0; + } + // QSA = 0.0 // Process Internal Heat Gains, People done below @@ -5433,10 +5437,11 @@ namespace InternalHeatGains { // For predefined tabular reports related to outside air ventilation ZonePreDefRep(NZ).isOccupied = true; // set flag to occupied to be used in tabular reporting for ventilation + ZonePreDefRep(NZ).NumOcc += NumberOccupants; ZonePreDefRep(NZ).NumOccAccum += NumberOccupants * state.dataGlobal->TimeStepZone; ZonePreDefRep(NZ).NumOccAccumTime += state.dataGlobal->TimeStepZone; } else { - ZonePreDefRep(NZ).isOccupied = false; // set flag to occupied to be used in tabular reporting for ventilation + DataHeatBalance::ZonePreDefRep(NZ).isOccupied = false; // set flag to occupied to be used in tabular reporting for ventilation } People(Loop).NumOcc = NumberOccupants; @@ -7113,13 +7118,14 @@ namespace InternalHeatGains { IntGainTypeOf_SecCoolingDXCoilTwoSpeed, IntGainTypeOf_SecCoolingDXCoilMultiSpeed, IntGainTypeOf_SecHeatingDXCoilMultiSpeed}); - static Array1D_int IntGainTypesPowerGen(9, + static Array1D_int IntGainTypesPowerGen(10, {IntGainTypeOf_GeneratorFuelCell, IntGainTypeOf_GeneratorMicroCHP, IntGainTypeOf_ElectricLoadCenterTransformer, IntGainTypeOf_ElectricLoadCenterInverterSimple, IntGainTypeOf_ElectricLoadCenterInverterFunctionOfPower, IntGainTypeOf_ElectricLoadCenterInverterLookUpTable, + IntGainTypeOf_ElectricLoadCenterStorageLiIonNmcBattery, IntGainTypeOf_ElectricLoadCenterStorageBattery, IntGainTypeOf_ElectricLoadCenterStorageSimple, IntGainTypeOf_ElectricLoadCenterConverter}); diff --git a/src/EnergyPlus/LowTempRadiantSystem.cc b/src/EnergyPlus/LowTempRadiantSystem.cc index 9319e21a09c..a9cd866549d 100644 --- a/src/EnergyPlus/LowTempRadiantSystem.cc +++ b/src/EnergyPlus/LowTempRadiantSystem.cc @@ -5806,7 +5806,7 @@ namespace LowTempRadiantSystem { Real64 Area = Surface(surfNum).Area; if (Surface(surfNum).Class == SurfaceClass::Window) { - if (SurfWinShadingFlag(surfNum) == IntShadeOn || SurfWinShadingFlag(surfNum) == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(surfNum))) { // The area is the shade or blind are = sum of the glazing area and the divider area (which is zero if no divider) Area += SurfWinDividerArea(surfNum); } @@ -5817,8 +5817,7 @@ namespace LowTempRadiantSystem { SurfWinFrameTempSurfIn(surfNum); } - if (SurfWinDividerArea(surfNum) > 0.0 && SurfWinShadingFlag(surfNum) != IntShadeOn && - SurfWinShadingFlag(surfNum) != IntBlindOn) { + if (SurfWinDividerArea(surfNum) > 0.0 && !ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(surfNum))) { // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) sumHATsurf += HConvIn(surfNum) * SurfWinDividerArea(surfNum) * (1.0 + 2.0 * SurfWinProjCorrDivIn(surfNum)) * SurfWinDividerTempSurfIn(surfNum); diff --git a/src/EnergyPlus/OutputReportPredefined.cc b/src/EnergyPlus/OutputReportPredefined.cc index bf3d12321f2..9d6ea554abe 100644 --- a/src/EnergyPlus/OutputReportPredefined.cc +++ b/src/EnergyPlus/OutputReportPredefined.cc @@ -643,7 +643,7 @@ namespace OutputReportPredefined { s->pdchULnotMetHeatOcc = newPreDefColumn(state, s->pdstUnmetLoads, "During Occupied Heating [hr]"); s->pdchULnotMetCoolOcc = newPreDefColumn(state, s->pdstUnmetLoads, "During Occupied Cooling [hr]"); - // Outside Air Report + // Outdoor Air Report s->pdrOutsideAir = newPreDefReport(state, "OutdoorAirSummary", "OA", "Outdoor Air Summary"); s->pdstOAavgOcc = newPreDefSubTable(state, s->pdrOutsideAir, "Average Outdoor Air During Occupied Hours"); @@ -671,6 +671,82 @@ namespace OutputReportPredefined { // s->pdchOaoMinTotVent = newPreDefColumn(state, s->pdstOAminOcc,'Total Ventilation [ach]') addFootNoteSubTable(state, s->pdstOAminOcc, "Values shown for a single zone without multipliers"); + // Outdoor Air Details Report + s->pdrOutsideAirDetails = newPreDefReport(state, "OutdoorAirDetails", "OAD", "Outdoor Air Details"); + + s->pdstOAmechVentParByZone = newPreDefSubTable(state, s->pdrOutsideAirDetails, "Mechanical Ventilation Parameters by Zone"); + s->pdchOaMvAirLpNm = newPreDefColumn(state, s->pdstOAmechVentParByZone, "AirLoop Name"); + s->pdchOaMvAvgNumOcc = newPreDefColumn(state, s->pdstOAmechVentParByZone, "Average Number of Occupants"); + s->pdchOaMvNomNumOcc = newPreDefColumn(state, s->pdstOAmechVentParByZone, "Nominal Number of Occupants"); + s->pdchOaMvZoneVol = newPreDefColumn(state, s->pdstOAmechVentParByZone, "Zone Volume [m3]"); + s->pdchOaMvZoneArea = newPreDefColumn(state, s->pdstOAmechVentParByZone, "Zone Area [m2]"); + s->pdchOaMvDesZnOa = newPreDefColumn(state, s->pdstOAmechVentParByZone, "Design Zone Outdoor Airflow - Voz [m3/s]"); + s->pdchOaMvMinDynTrgVent = newPreDefColumn(state, s->pdstOAmechVentParByZone, "Minimum Dynamic Target Ventilation - Voz-dyn-min [m3/s]"); + + s->pdstOAtotAirByZone = newPreDefSubTable(state, s->pdrOutsideAirDetails, "Total Outdoor Air by Zone"); + s->pdchOaTaBzMechVent = newPreDefColumn(state, s->pdstOAtotAirByZone, "Mechanical Ventilation [m3]"); + s->pdchOaTaBzNatVent = newPreDefColumn(state, s->pdstOAtotAirByZone, "Natural Ventilation [m3]"); + s->pdchOaTaBzTotVent = newPreDefColumn(state, s->pdstOAtotAirByZone, "Total Ventilation [m3]"); + s->pdchOaTaBzInfil = newPreDefColumn(state, s->pdstOAtotAirByZone, "Infiltration [m3]"); + s->pdchOaTaBzTotVentInfil = newPreDefColumn(state, s->pdstOAtotAirByZone, "Total Ventilation and Infiltration [m3]"); + s->pdchOaTaBzDynTrgVent = newPreDefColumn(state, s->pdstOAtotAirByZone, "Dynamic Target Ventilation - Voz-dyn [m3]"); + s->pdchOaTaBzTmBelow = newPreDefColumn(state, s->pdstOAtotAirByZone, "Time Below Voz-dyn [hr]"); + s->pdchOaTaBzTmAt = newPreDefColumn(state, s->pdstOAtotAirByZone, "Time At Voz-dyn [hr]"); + s->pdchOaTaBzTmAbove = newPreDefColumn(state, s->pdstOAtotAirByZone, "Time Above Voz-dyn [hr]"); + s->pdchOaTaBzTmAboveUnocc = newPreDefColumn(state, s->pdstOAtotAirByZone, "Time Above Zero When Unoccupied [hr]"); + + s->pdstOAavgOccByZone = newPreDefSubTable(state, s->pdrOutsideAirDetails, "Average Outdoor Air During Occupancy by Zone - Flow Rates"); + s->pdchOaOccBzMechVent = newPreDefColumn(state, s->pdstOAavgOccByZone, "Mechanical Ventilation [m3/s]"); + s->pdchOaOccBzNatVent = newPreDefColumn(state, s->pdstOAavgOccByZone, "Natural Ventilation [m3/s]"); + s->pdchOaOccBzTotVent = newPreDefColumn(state, s->pdstOAavgOccByZone, "Total Ventilation [m3/s]"); + s->pdchOaOccBzInfil = newPreDefColumn(state, s->pdstOAavgOccByZone, "Infiltration [m3/s]"); + s->pdchOaOccBzTotVentInfil = newPreDefColumn(state, s->pdstOAavgOccByZone, "Total Ventilation and Infiltration [m3/s]"); + s->pdchOaOccBzDynTrgVent = newPreDefColumn(state, s->pdstOAavgOccByZone, "Dynamic Target Ventilation - Voz-dyn [m3/s]"); + s->pdchOaOccBzTmBelow = newPreDefColumn(state, s->pdstOAavgOccByZone, "Time Below Voz-dyn [hr]"); + s->pdchOaOccBzTmAt = newPreDefColumn(state, s->pdstOAavgOccByZone, "Time At Voz-dyn [hr]"); + s->pdchOaOccBzTmAbove = newPreDefColumn(state, s->pdstOAavgOccByZone, "Time Above Voz-dyn [hr]"); + + s->pdstOAtotAirByLoop = newPreDefSubTable(state, s->pdrOutsideAirDetails, "Total Outdoor Air by AirLoop"); + s->pdchOaTaAlMechVent = newPreDefColumn(state, s->pdstOAtotAirByLoop, "Mechanical Ventilation [m3]"); + s->pdchOaTaAlNatVent = newPreDefColumn(state, s->pdstOAtotAirByLoop, "Natural Ventilation [m3/s]"); + s->pdchOaTaAlTotVent = newPreDefColumn(state, s->pdstOAtotAirByLoop, "Total Ventilation [m3/s]"); + s->pdchOaTaAlSumDynTrgVent = newPreDefColumn(state, s->pdstOAtotAirByLoop, "Sum Zone Dynamic Target Ventilation - Voz-sum-dyn [m3]"); + s->pdchOaTaAlTmBelow = newPreDefColumn(state, s->pdstOAtotAirByLoop, "Time Below Voz-sum-dyn [hr]"); + s->pdchOaTaAlTmAt = newPreDefColumn(state, s->pdstOAtotAirByLoop, "Time At Voz-sum-dyn [hr]"); + s->pdchOaTaAlTmAbove = newPreDefColumn(state, s->pdstOAtotAirByLoop, "Time Above Voz-sum-dyn [hr]"); + s->pdchOaTaAlTmAboveUnocc = newPreDefColumn(state, s->pdstOAtotAirByLoop, "Time Above Zero When Unoccupied [hr]"); + + s->pdstOAavgOccByLoop = newPreDefSubTable(state, s->pdrOutsideAirDetails, "Average Outdoor Air During Occupancy by AirLoop"); + s->pdchOaOccAlMechVent = newPreDefColumn(state, s->pdstOAavgOccByLoop, "Mechanical Ventilation [m3/s]"); + s->pdchOaOccAlNatVent = newPreDefColumn(state, s->pdstOAavgOccByLoop, "Natural Ventilation [m3/s]"); + s->pdchOaOccAlTotVent = newPreDefColumn(state, s->pdstOAavgOccByLoop, "Total Ventilation [m3/s]"); + s->pdchOaOccAlSumDynTrgVent = newPreDefColumn(state, s->pdstOAavgOccByLoop, "Sum Zone Dynamic Target Ventilation - Voz-sum-dyn [m3/s]"); + s->pdchOaOccAlTmBelow = newPreDefColumn(state, s->pdstOAavgOccByLoop, "Time Below Voz-sum-dyn [hr]"); + s->pdchOaOccAlTmAt = newPreDefColumn(state, s->pdstOAavgOccByLoop, "Time At Voz-sum-dyn [hr]"); + s->pdchOaOccAlTmAbove = newPreDefColumn(state, s->pdstOAavgOccByLoop, "Time Above Voz-sum-dyn [hr]"); + + s->pdstOAtimeFactorsDurOcc = newPreDefSubTable(state, s->pdrOutsideAirDetails, "Times for Outdoor Air Limiting Factors During Occupancy"); + s->pdchOaTmFctNoLimit = newPreDefColumn(state, s->pdstOAtimeFactorsDurOcc, "No Limiting Factor [hr]"); //todo + s->pdchOaTmFctHiHumid = newPreDefColumn(state, s->pdstOAtimeFactorsDurOcc, "High Humidity [hr]"); //todo + s->pdchOaTmFctNiteVent = newPreDefColumn(state, s->pdstOAtimeFactorsDurOcc, "Night Ventilation [hr]"); //todo + s->pdchOaTmFctEcono = newPreDefColumn(state, s->pdstOAtimeFactorsDurOcc, "Economizer [hr]"); //todo + s->pdchOaTmFctDCV = newPreDefColumn(state, s->pdstOAtimeFactorsDurOcc, "Demand Controlled Ventilation [hr]"); //todo + s->pdchOaTmFctExhaust = newPreDefColumn(state, s->pdstOAtimeFactorsDurOcc, "Exhaust Flow [hr]"); //todo + s->pdchOaTmFctLimit = newPreDefColumn(state, s->pdstOAtimeFactorsDurOcc, "Limits and Scheduled Limits [hr]"); //todo + s->pdchOaTmFctDemand = newPreDefColumn(state, s->pdstOAtimeFactorsDurOcc, "Demand Limiting [hr]"); //todo + s->pdchOaTmFctEMS = newPreDefColumn(state, s->pdstOAtimeFactorsDurOcc, "Energy Management System [hr]"); //todo + + s->pdstOAavgFactorsDurOcc = newPreDefSubTable(state, s->pdrOutsideAirDetails, "Average Outdoor Air for Outdoor Air Limiting Factors During Occupancy"); + s->pdchOaAvFctNoLimit = newPreDefColumn(state, s->pdstOAavgFactorsDurOcc, "No Limiting Factor [m3/s]"); //todo + s->pdchOaAvFctHiHumid = newPreDefColumn(state, s->pdstOAavgFactorsDurOcc, "High Humidity [m3/s]"); //todo + s->pdchOaAvFctNiteVent = newPreDefColumn(state, s->pdstOAavgFactorsDurOcc, "Night Ventilation [m3/s]"); //todo + s->pdchOaAvFctEcono = newPreDefColumn(state, s->pdstOAavgFactorsDurOcc, "Economizer [m3/s]"); //todo + s->pdchOaAvFctDCV = newPreDefColumn(state, s->pdstOAavgFactorsDurOcc, "Demand Controlled Ventilation [m3/s]"); //todo + s->pdchOaAvFctExhaust = newPreDefColumn(state, s->pdstOAavgFactorsDurOcc, "Exhaust Flow [m3/s]"); //todo + s->pdchOaAvFctLimit = newPreDefColumn(state, s->pdstOAavgFactorsDurOcc, "Limits and Scheduled Limits [m3/s]"); //todo + s->pdchOaAvFctDemand = newPreDefColumn(state, s->pdstOAavgFactorsDurOcc, "Demand Limiting [m3/s]"); //todo + s->pdchOaAvFctEMS = newPreDefColumn(state, s->pdstOAavgFactorsDurOcc, "Energy Management System [m3/s]"); //todo + // Object Count Report s->pdrObjCnt = newPreDefReport(state, "ObjectCountSummary", "Count", "Object Count Summary"); diff --git a/src/EnergyPlus/OutputReportPredefined.hh b/src/EnergyPlus/OutputReportPredefined.hh index a962fef25ac..68cf33a92e9 100644 --- a/src/EnergyPlus/OutputReportPredefined.hh +++ b/src/EnergyPlus/OutputReportPredefined.hh @@ -658,7 +658,7 @@ struct OutputReportPredefinedData : BaseGlobalStruct { int pdchULnotMetHeatOcc = 0; int pdchULnotMetCoolOcc = 0; - // Outside Air Report + // Outdoor Air Report int pdrOutsideAir = 0; int pdstOAavgOcc = 0; int pdchOaoAvgNumOcc1 = 0; @@ -679,6 +679,82 @@ struct OutputReportPredefinedData : BaseGlobalStruct { int pdchOaoMinSimpVent = 0; int pdchOaoMinTotVent = 0; + // Outdoor Air Details Report + int pdrOutsideAirDetails = 0; + + int pdstOAmechVentParByZone = 0; + int pdchOaMvAirLpNm = 0; + int pdchOaMvAvgNumOcc = 0; + int pdchOaMvNomNumOcc = 0; + int pdchOaMvZoneVol = 0; + int pdchOaMvZoneArea = 0; + int pdchOaMvDesZnOa = 0; + int pdchOaMvMinDynTrgVent = 0; + + int pdstOAtotAirByZone = 0; + int pdchOaTaBzMechVent = 0; + int pdchOaTaBzNatVent = 0; + int pdchOaTaBzTotVent = 0; + int pdchOaTaBzInfil = 0; + int pdchOaTaBzTotVentInfil = 0; + int pdchOaTaBzDynTrgVent = 0; + int pdchOaTaBzTmBelow = 0; + int pdchOaTaBzTmAt = 0; + int pdchOaTaBzTmAbove = 0; + int pdchOaTaBzTmAboveUnocc = 0; + + int pdstOAavgOccByZone = 0; + int pdchOaOccBzMechVent = 0; + int pdchOaOccBzNatVent = 0; + int pdchOaOccBzTotVent = 0; + int pdchOaOccBzInfil = 0; + int pdchOaOccBzTotVentInfil = 0; + int pdchOaOccBzDynTrgVent = 0; + int pdchOaOccBzTmBelow = 0; + int pdchOaOccBzTmAt = 0; + int pdchOaOccBzTmAbove = 0; + + int pdstOAtotAirByLoop = 0; + int pdchOaTaAlMechVent = 0; + int pdchOaTaAlNatVent = 0; + int pdchOaTaAlTotVent = 0; + int pdchOaTaAlSumDynTrgVent = 0; + int pdchOaTaAlTmBelow = 0; + int pdchOaTaAlTmAt = 0; + int pdchOaTaAlTmAbove = 0; + int pdchOaTaAlTmAboveUnocc = 0; + + int pdstOAavgOccByLoop = 0; + int pdchOaOccAlMechVent = 0; + int pdchOaOccAlNatVent = 0; + int pdchOaOccAlTotVent = 0; + int pdchOaOccAlSumDynTrgVent = 0; + int pdchOaOccAlTmBelow = 0; + int pdchOaOccAlTmAt = 0; + int pdchOaOccAlTmAbove = 0; + + int pdstOAtimeFactorsDurOcc = 0; + int pdchOaTmFctNoLimit = 0; + int pdchOaTmFctHiHumid = 0; + int pdchOaTmFctNiteVent = 0; + int pdchOaTmFctEcono = 0; + int pdchOaTmFctDCV = 0; + int pdchOaTmFctExhaust = 0; + int pdchOaTmFctLimit = 0; + int pdchOaTmFctDemand = 0; + int pdchOaTmFctEMS = 0; + + int pdstOAavgFactorsDurOcc = 0; + int pdchOaAvFctNoLimit = 0; + int pdchOaAvFctHiHumid = 0; + int pdchOaAvFctNiteVent = 0; + int pdchOaAvFctEcono = 0; + int pdchOaAvFctDCV = 0; + int pdchOaAvFctExhaust = 0; + int pdchOaAvFctLimit = 0; + int pdchOaAvFctDemand = 0; + int pdchOaAvFctEMS = 0; + // Object Count Report int pdrObjCnt = 0; int pdstSurfCnt = 0; @@ -1080,11 +1156,30 @@ struct OutputReportPredefinedData : BaseGlobalStruct { int sizeShadowRelate = 0; int numShadowRelate = 0; + // Totals for ABUPS report Real64 TotalNotMetHeatingOccupiedForABUPS = 0.0; Real64 TotalNotMetCoolingOccupiedForABUPS = 0.0; Real64 TotalNotMetOccupiedForABUPS = 0.0; Real64 TotalTimeNotSimpleASH55EitherForABUPS = 0.0; + // Totals for OA details report + Real64 TotalVozMax = 0.0; // total Voz (max of heating and cooling) + Real64 TotalAnyZoneBelowVozDynForOA = 0.0; // total time any zone below target Voz-Dyn + Real64 TotalAllZonesAtVozDynForOA = 0.0; // total time all zones at target Voz-Dyn + Real64 TotalAnyZoneAboveVozDynForOA = 0.0; // total time any zone above target Voz-Dyn + Real64 TotalAnyZoneBelowVozDynOccForOA = 0.0; // total time any zone below target Voz-Dyn + Real64 TotalAllZonesAtVozDynOccForOA = 0.0; // total time all zones at target Voz-Dyn + Real64 TotalAnyZoneAboveVozDynOccForOA = 0.0; // total time any zone above target Voz-Dyn + Real64 TotalAnyZoneVentUnoccForOA = 0.0; // total time any zone has ventilation when unoccupied + + Real64 TotalAnyAirLoopBelowVozDynForOA = 0.0; // total time any air loop below target Voz-Dyn + Real64 TotalAllAirLoopsAtVozDynForOA = 0.0; // total time all air loops at target Voz-Dyn + Real64 TotalAnyAirLoopAboveVozDynForOA = 0.0; // total time any air loop above target Voz-Dyn + Real64 TotalAnyAirLoopBelowVozDynOccForOA = 0.0; // total time any air loop below target Voz-Dyn + Real64 TotalAllAirLoopsAtVozDynOccForOA = 0.0; // total time all air loops at target Voz-Dyn + Real64 TotalAnyAirLoopAboveVozDynOccForOA = 0.0; // total time any air loop above target Voz-Dyn + Real64 TotalAnyAirLoopVentUnoccForOA = 0.0; // total time any air loop has ventilation when unoccupied + Array1D reportName; Array1D subTable; Array1D columnTag; @@ -1503,6 +1598,7 @@ struct OutputReportPredefinedData : BaseGlobalStruct { this->pdchULnotMetCool = 0; this->pdchULnotMetHeatOcc = 0; this->pdchULnotMetCoolOcc = 0; + this->pdrOutsideAir = 0; this->pdstOAavgOcc = 0; this->pdchOaoAvgNumOcc1 = 0; @@ -1522,6 +1618,81 @@ struct OutputReportPredefinedData : BaseGlobalStruct { this->pdchOaoMinAFNInfil = 0; this->pdchOaoMinSimpVent = 0; this->pdchOaoMinTotVent = 0; + + this->pdrOutsideAirDetails = 0; + this->pdstOAmechVentParByZone = 0; + this->pdchOaMvAirLpNm = 0; + this->pdchOaMvAvgNumOcc = 0; + this->pdchOaMvNomNumOcc = 0; + this->pdchOaMvZoneVol = 0; + this->pdchOaMvZoneArea = 0; + this->pdchOaMvDesZnOa = 0; + this->pdchOaMvMinDynTrgVent = 0; + + this->pdstOAtotAirByZone = 0; + this->pdchOaTaBzMechVent = 0; + this->pdchOaTaBzNatVent = 0; + this->pdchOaTaBzTotVent = 0; + this->pdchOaTaBzInfil = 0; + this->pdchOaTaBzTotVentInfil = 0; + this->pdchOaTaBzDynTrgVent = 0; + this->pdchOaTaBzTmBelow = 0; + this->pdchOaTaBzTmAt = 0; + this->pdchOaTaBzTmAbove = 0; + this->pdchOaTaBzTmAboveUnocc = 0; + + this->pdstOAavgOccByZone = 0; + this->pdchOaOccBzMechVent = 0; + this->pdchOaOccBzNatVent = 0; + this->pdchOaOccBzTotVent = 0; + this->pdchOaOccBzInfil = 0; + this->pdchOaOccBzTotVentInfil = 0; + this->pdchOaOccBzDynTrgVent = 0; + this->pdchOaOccBzTmBelow = 0; + this->pdchOaOccBzTmAt = 0; + this->pdchOaOccBzTmAbove = 0; + + this->pdstOAtotAirByLoop = 0; + this->pdchOaTaAlMechVent = 0; + this->pdchOaTaAlNatVent = 0; + this->pdchOaTaAlTotVent = 0; + this->pdchOaTaAlSumDynTrgVent = 0; + this->pdchOaTaAlTmBelow = 0; + this->pdchOaTaAlTmAt = 0; + this->pdchOaTaAlTmAbove = 0; + this->pdchOaTaAlTmAboveUnocc = 0; + + this->pdstOAavgOccByLoop = 0; + this->pdchOaOccAlMechVent = 0; + this->pdchOaOccAlNatVent = 0; + this->pdchOaOccAlTotVent = 0; + this->pdchOaOccAlSumDynTrgVent = 0; + this->pdchOaOccAlTmBelow = 0; + this->pdchOaOccAlTmAt = 0; + this->pdchOaOccAlTmAbove = 0; + + this->pdstOAtimeFactorsDurOcc = 0; + this->pdchOaTmFctNoLimit = 0; + this->pdchOaTmFctHiHumid = 0; + this->pdchOaTmFctNiteVent = 0; + this->pdchOaTmFctEcono = 0; + this->pdchOaTmFctDCV = 0; + this->pdchOaTmFctExhaust = 0; + this->pdchOaTmFctLimit = 0; + this->pdchOaTmFctDemand = 0; + this->pdchOaTmFctEMS = 0; + + this->pdstOAavgFactorsDurOcc = 0; + this->pdchOaAvFctNoLimit = 0; + this->pdchOaAvFctHiHumid = 0; + this->pdchOaAvFctNiteVent = 0; + this->pdchOaAvFctEcono = 0; + this->pdchOaAvFctDCV = 0; + this->pdchOaAvFctExhaust = 0; + this->pdchOaAvFctLimit = 0; + this->pdchOaAvFctDemand = 0; + this->pdchOaAvFctEMS = 0; + this->pdrObjCnt = 0; this->pdstSurfCnt = 0; this->pdchSurfCntTot = 0; @@ -1879,6 +2050,21 @@ struct OutputReportPredefinedData : BaseGlobalStruct { this->TotalNotMetCoolingOccupiedForABUPS = 0.0; this->TotalNotMetOccupiedForABUPS = 0.0; this->TotalTimeNotSimpleASH55EitherForABUPS = 0.0; + this->TotalVozMax = 0.0; + this->TotalAnyZoneBelowVozDynForOA = 0.0; + this->TotalAllZonesAtVozDynForOA = 0.0; + this->TotalAnyZoneAboveVozDynForOA = 0.0; + this->TotalAnyZoneBelowVozDynOccForOA = 0.0; + this->TotalAllZonesAtVozDynOccForOA = 0.0; + this->TotalAnyZoneAboveVozDynOccForOA = 0.0; + this->TotalAnyZoneVentUnoccForOA = 0.0; + this->TotalAnyAirLoopBelowVozDynForOA = 0.0; + this->TotalAllAirLoopsAtVozDynForOA = 0.0; + this->TotalAnyAirLoopAboveVozDynForOA = 0.0; + this->TotalAnyAirLoopBelowVozDynOccForOA = 0.0; + this->TotalAllAirLoopsAtVozDynOccForOA = 0.0; + this->TotalAnyAirLoopAboveVozDynOccForOA = 0.0; + this->TotalAnyAirLoopVentUnoccForOA = 0.0; this->reportName.deallocate(); this->subTable.deallocate(); this->columnTag.deallocate(); diff --git a/src/EnergyPlus/OutputReportTabular.cc b/src/EnergyPlus/OutputReportTabular.cc index 584bf86adab..45b8b6fdc57 100644 --- a/src/EnergyPlus/OutputReportTabular.cc +++ b/src/EnergyPlus/OutputReportTabular.cc @@ -76,6 +76,7 @@ #include #include #include +#include #include #include #include @@ -5983,56 +5984,124 @@ namespace EnergyPlus::OutputReportTabular { PreDefTableEntry(state, state.dataOutRptPredefined->pdchExLtConsump, "Exterior Lighting Total", consumptionTotal); // outside air ventilation + Real64 totalOccupants = 0.; + Real64 totalAverageOccupants = 0.; + Real64 totalArea = 0.; + Real64 totalVozMin = 0; + Real64 totalMechVentVol = 0; + Real64 totalNatVentVol = 0; + Real64 totalInfilVol = 0; + Real64 totalVozDyn = 0; + Real64 totalMechVentRateOcc = 0; + Real64 totalNatVentRateOcc = 0; + Real64 totalInfilRateOcc = 0; + Real64 totalVozDynOcc = 0; + + // Outdoor Air Summary and Outdoor Air Details for (iZone = 1; iZone <= state.dataGlobal->NumOfZones; ++iZone) { + int const zoneMult = Zone(iZone).Multiplier * Zone(iZone).ListMultiplier; if (Zone(iZone).SystemZoneNodeNumber >= 0) { // conditioned zones only - if (Zone(iZone).isNominalOccupied) { + + // AFN infiltration -- check that afn sim is being done. + if (!(AirflowNetwork::SimulateAirflowNetwork == AirflowNetwork::AirflowNetworkControlMultizone || + AirflowNetwork::SimulateAirflowNetwork == AirflowNetwork::AirflowNetworkControlMultiADS)) { + ZonePreDefRep(iZone).AFNInfilVolTotalStdDen = 0.0; + ZonePreDefRep(iZone).AFNInfilVolMin = 0.0; + ZonePreDefRep(iZone).AFNInfilVolTotalOcc = 0.0; + } + + // air loop name + std::string airLoopName = ""; + int ctrlZoneNum = DataHeatBalance::Zone(iZone).ZoneEqNum; + if (ctrlZoneNum > 0) { + for (int zoneInNode = 1; zoneInNode <= state.dataZoneEquip->ZoneEquipConfig(ctrlZoneNum).NumInletNodes; ++zoneInNode) { + int airLoopNumber = state.dataZoneEquip->ZoneEquipConfig(ctrlZoneNum).InletNodeAirLoopNum(zoneInNode); + if (airLoopNumber > 0) { + if (airLoopName.empty()) { + airLoopName = state.dataAirSystemsData->PrimaryAirSystems(airLoopNumber).Name; + } + else { + airLoopName += "; " + state.dataAirSystemsData->PrimaryAirSystems(airLoopNumber).Name; + } + } + } + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaMvAirLpNm, Zone(iZone).Name, airLoopName); + // occupants - if (ZonePreDefRep(iZone).NumOccAccumTime > 0) { - PreDefTableEntry(state, - state.dataOutRptPredefined->pdchOaoAvgNumOcc1, Zone(iZone).Name, ZonePreDefRep(iZone).NumOccAccum / ZonePreDefRep(iZone).NumOccAccumTime); - PreDefTableEntry(state, - state.dataOutRptPredefined->pdchOaoAvgNumOcc2, Zone(iZone).Name, ZonePreDefRep(iZone).NumOccAccum / ZonePreDefRep(iZone).NumOccAccumTime); + if (Zone(iZone).isNominalOccupied) { + if (ZonePreDefRep(iZone).NumOccAccumTime > 0) { + Real64 const avgOcc = ZonePreDefRep(iZone).NumOccAccum / ZonePreDefRep(iZone).NumOccAccumTime; + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaoAvgNumOcc1, Zone(iZone).Name, avgOcc); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaoAvgNumOcc2, Zone(iZone).Name, avgOcc); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaMvAvgNumOcc, Zone(iZone).Name, avgOcc); + totalAverageOccupants += avgOcc * zoneMult; + } } + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaMvNomNumOcc, Zone(iZone).Name, Zone(iZone).TotOccupants); + totalOccupants += Zone(iZone).TotOccupants * zoneMult; + + // Zone volume and area + + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaoZoneVol1, Zone(iZone).Name, Zone(iZone).Volume); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaoZoneVol2, Zone(iZone).Name, Zone(iZone).Volume); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaMvZoneVol, Zone(iZone).Name, Zone(iZone).Volume); + totalVolume += Zone(iZone).Volume * zoneMult; + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaMvZoneArea, Zone(iZone).Name, Zone(iZone).FloorArea); + totalArea += Zone(iZone).FloorArea * zoneMult; + + // minimum dynamic target ventilation Voz-dyn-min + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaMvMinDynTrgVent, Zone(iZone).Name, ZonePreDefRep(iZone).VozMin, 3); + totalVozMin += ZonePreDefRep(iZone).VozMin * zoneMult; + // Mechanical ventilation if (Zone(iZone).Volume > 0 && ZonePreDefRep(iZone).TotTimeOcc > 0) { PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaoAvgMechVent, - Zone(iZone).Name, - ZonePreDefRep(iZone).MechVentVolTotal / (ZonePreDefRep(iZone).TotTimeOcc * Zone(iZone).Volume * - Zone(iZone).Multiplier * Zone(iZone).ListMultiplier), - 3); + Zone(iZone).Name, + ZonePreDefRep(iZone).MechVentVolTotalOcc / (ZonePreDefRep(iZone).TotTimeOcc * Zone(iZone).Volume * + Zone(iZone).Multiplier * Zone(iZone).ListMultiplier), + 3); } if ((Zone(iZone).Volume > 0) && (ZonePreDefRep(iZone).TotTimeOcc > 0)) { PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaoMinMechVent, - Zone(iZone).Name, - ZonePreDefRep(iZone).MechVentVolMin / - (Zone(iZone).Volume * Zone(iZone).Multiplier * Zone(iZone).ListMultiplier), - 3); + Zone(iZone).Name, + ZonePreDefRep(iZone).MechVentVolMin / + (Zone(iZone).Volume * Zone(iZone).Multiplier * Zone(iZone).ListMultiplier), + 3); } + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaTaBzMechVent, Zone(iZone).Name, ZonePreDefRep(iZone).MechVentVolTotalStdDen, 0); + totalMechVentVol += ZonePreDefRep(iZone).MechVentVolTotalStdDen * zoneMult; + + // Natural ventilation + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaTaBzNatVent, + Zone(iZone).Name, + ZonePreDefRep(iZone).SimpVentVolTotalStdDen + ZonePreDefRep(iZone).AFNVentVolTotalStdDen, + 0); + totalNatVentVol += (ZonePreDefRep(iZone).SimpVentVolTotalStdDen + ZonePreDefRep(iZone).AFNVentVolTotalStdDen) * zoneMult; + + // Total ventilation + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaTaBzTotVent, + Zone(iZone).Name, + ZonePreDefRep(iZone).MechVentVolTotalStdDen + ZonePreDefRep(iZone).SimpVentVolTotalStdDen + + ZonePreDefRep(iZone).AFNVentVolTotalStdDen, + 0); + // infiltration if (Zone(iZone).Volume > 0 && ZonePreDefRep(iZone).TotTimeOcc > 0) { PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaoAvgInfil, - Zone(iZone).Name, - ZonePreDefRep(iZone).InfilVolTotal / (ZonePreDefRep(iZone).TotTimeOcc * Zone(iZone).Volume), - 3); + Zone(iZone).Name, + ZonePreDefRep(iZone).InfilVolTotalOcc / (ZonePreDefRep(iZone).TotTimeOcc * Zone(iZone).Volume), + 3); } if ((Zone(iZone).Volume > 0) && (ZonePreDefRep(iZone).TotTimeOcc > 0)) { PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaoMinInfil, Zone(iZone).Name, ZonePreDefRep(iZone).InfilVolMin / (Zone(iZone).Volume), 3); } - // AFN infiltration -- check that afn sim is being done. - if (AirflowNetwork::SimulateAirflowNetwork < AirflowNetwork::AirflowNetworkControlMultizone) { - ZonePreDefRep(iZone).AFNInfilVolMin = 0.0; - ZonePreDefRep(iZone).AFNInfilVolTotal = 0.0; - if (!(AirflowNetwork::SimulateAirflowNetwork == AirflowNetwork::AirflowNetworkControlMultizone || - AirflowNetwork::SimulateAirflowNetwork == AirflowNetwork::AirflowNetworkControlMultiADS)) { - ZonePreDefRep(iZone).AFNInfilVolMin = 0.0; - ZonePreDefRep(iZone).AFNInfilVolTotal = 0.0; - } - } if (Zone(iZone).Volume > 0 && ZonePreDefRep(iZone).TotTimeOcc > 0) { PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaoAvgAFNInfil, - Zone(iZone).Name, - ZonePreDefRep(iZone).AFNInfilVolTotal / (ZonePreDefRep(iZone).TotTimeOcc * Zone(iZone).Volume), - 3); + Zone(iZone).Name, + ZonePreDefRep(iZone).AFNInfilVolTotalOcc / (ZonePreDefRep(iZone).TotTimeOcc * Zone(iZone).Volume), + 3); } if ((Zone(iZone).Volume > 0) && (ZonePreDefRep(iZone).TotTimeOcc > 0)) { PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaoMinAFNInfil, Zone(iZone).Name, ZonePreDefRep(iZone).AFNInfilVolMin / (Zone(iZone).Volume), 3); @@ -6040,22 +6109,200 @@ namespace EnergyPlus::OutputReportTabular { // simple 'ZoneVentilation' if (Zone(iZone).Volume > 0 && ZonePreDefRep(iZone).TotTimeOcc > 0) { PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaoAvgSimpVent, - Zone(iZone).Name, - ZonePreDefRep(iZone).SimpVentVolTotal / (ZonePreDefRep(iZone).TotTimeOcc * Zone(iZone).Volume), - 3); + Zone(iZone).Name, + ZonePreDefRep(iZone).SimpVentVolTotalOcc / (ZonePreDefRep(iZone).TotTimeOcc * Zone(iZone).Volume), + 3); } if ((Zone(iZone).Volume > 0) && (ZonePreDefRep(iZone).TotTimeOcc > 0)) { PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaoMinSimpVent, Zone(iZone).Name, ZonePreDefRep(iZone).SimpVentVolMin / (Zone(iZone).Volume), 3); } - // Zone volume - PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaoZoneVol1, Zone(iZone).Name, Zone(iZone).Volume); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaoZoneVol2, Zone(iZone).Name, Zone(iZone).Volume); - totalVolume += Zone(iZone).Volume; + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaTaBzInfil, Zone(iZone).Name, ZonePreDefRep(iZone).InfilVolTotalStdDen, 0); + totalInfilVol += ZonePreDefRep(iZone).InfilVolTotalStdDen * zoneMult; + + // Total ventilation and infiltration + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaTaBzTotVentInfil, + Zone(iZone).Name, + ZonePreDefRep(iZone).MechVentVolTotalStdDen + ZonePreDefRep(iZone).SimpVentVolTotalStdDen + + ZonePreDefRep(iZone).AFNInfilVolTotalStdDen + ZonePreDefRep(iZone).InfilVolTotalStdDen, + 0); + + // Dynamic target ventilation Voz-dyn + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaTaBzDynTrgVent, Zone(iZone).Name, ZonePreDefRep(iZone).VozTargetTotal, 0); + totalVozDyn += ZonePreDefRep(iZone).VozTargetTotal * zoneMult; + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaTaBzTmBelow, Zone(iZone).Name, ZonePreDefRep(iZone).VozTargetTimeBelow, 0); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaTaBzTmAt, Zone(iZone).Name, ZonePreDefRep(iZone).VozTargetTimeAt, 0); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaTaBzTmAbove, Zone(iZone).Name, ZonePreDefRep(iZone).VozTargetTimeAbove, 0); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaTaBzTmAboveUnocc, Zone(iZone).Name, ZonePreDefRep(iZone).TotVentTimeNonZeroUnocc, 0); + + if (Zone(iZone).isNominalOccupied && (ZonePreDefRep(iZone).TotTimeOcc > 0.0)) { + Real64 totTimeOccSec = ZonePreDefRep(iZone).TotTimeOcc * SecInHour; + // Mechanical ventilation + Real64 mechVent = ZonePreDefRep(iZone).MechVentVolTotalOccStdDen / totTimeOccSec; + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaOccBzMechVent, Zone(iZone).Name, mechVent, 4); + totalMechVentRateOcc += mechVent * zoneMult; + + // Natural ventilation + Real64 natVent = (ZonePreDefRep(iZone).SimpVentVolTotalOccStdDen + ZonePreDefRep(iZone).AFNVentVolTotalOccStdDen) / totTimeOccSec; + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaOccBzNatVent, Zone(iZone).Name, natVent); + totalNatVentRateOcc += natVent * zoneMult; + + // Total ventilation + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaOccBzTotVent, Zone(iZone).Name, mechVent + natVent, 4); + + // infiltration + Real64 infil = (ZonePreDefRep(iZone).InfilVolTotalOccStdDen+ ZonePreDefRep(iZone).AFNInfilVolTotalOccStdDen) / totTimeOccSec; + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaOccBzInfil, Zone(iZone).Name, infil, 4); + totalInfilRateOcc += infil * zoneMult; + + // Total ventilation and infiltration + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaOccBzTotVentInfil, Zone(iZone).Name, mechVent + natVent + infil, 4); + + // Dynamic target ventilation Voz-dyn + Real64 avgVoz = ZonePreDefRep(iZone).VozTargetTotalOcc / totTimeOccSec; + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaOccBzDynTrgVent, Zone(iZone).Name, avgVoz, 4); + totalVozDynOcc += avgVoz * zoneMult; + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchOaOccBzTmBelow, Zone(iZone).Name, ZonePreDefRep(iZone).VozTargetTimeBelowOcc, 0); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchOaOccBzTmAt, Zone(iZone).Name, ZonePreDefRep(iZone).VozTargetTimeAtOcc, 0); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchOaOccBzTmAbove, Zone(iZone).Name, ZonePreDefRep(iZone).VozTargetTimeAboveOcc, 0); + } } } } + for (int iSys = 1; iSys <= DataHVACGlobals::NumPrimaryAirSys; ++iSys) { + // Total Outdoor Air by Airloop + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaTaAlMechVent, + state.dataAirSystemsData->PrimaryAirSystems(iSys).Name, + state.dataSysRpts->SysPreDefRep(iSys).SysMechVentTotal, + 0); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaTaAlNatVent, + state.dataAirSystemsData->PrimaryAirSystems(iSys).Name, + state.dataSysRpts->SysPreDefRep(iSys).SysNatVentTotal, + 0); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaTaAlTotVent, + state.dataAirSystemsData->PrimaryAirSystems(iSys).Name, + state.dataSysRpts->SysPreDefRep(iSys).SysMechVentTotal + state.dataSysRpts->SysPreDefRep(iSys).SysNatVentTotal, + 0); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaTaAlSumDynTrgVent, + state.dataAirSystemsData->PrimaryAirSystems(iSys).Name, + state.dataSysRpts->SysPreDefRep(iSys).SysTargetVentTotalVoz, + 0); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaTaAlTmBelow, + state.dataAirSystemsData->PrimaryAirSystems(iSys).Name, + state.dataSysRpts->SysPreDefRep(iSys).SysTimeBelowVozDynTotal, + 0); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaTaAlTmAt, + state.dataAirSystemsData->PrimaryAirSystems(iSys).Name, + state.dataSysRpts->SysPreDefRep(iSys).SysTimeAtVozDynTotal, + 0); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaTaAlTmAbove, + state.dataAirSystemsData->PrimaryAirSystems(iSys).Name, + state.dataSysRpts->SysPreDefRep(iSys).SysTimeAboveVozDynTotal, + 0); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaTaAlTmAboveUnocc, + state.dataAirSystemsData->PrimaryAirSystems(iSys).Name, + state.dataSysRpts->SysPreDefRep(iSys).SysTimeVentUnoccTotal, + 0); + // Average Outdoor Air During Occupancy by Airloop + if (state.dataSysRpts->SysPreDefRep(iSys).SysTimeOccupiedTotal > 0.0) { + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaOccAlMechVent, + state.dataAirSystemsData->PrimaryAirSystems(iSys).Name, + state.dataSysRpts->SysPreDefRep(iSys).SysMechVentTotalOcc / + state.dataSysRpts->SysPreDefRep(iSys).SysTimeOccupiedTotal, + 4); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaOccAlNatVent, + state.dataAirSystemsData->PrimaryAirSystems(iSys).Name, + state.dataSysRpts->SysPreDefRep(iSys).SysNatVentTotalOcc / + state.dataSysRpts->SysPreDefRep(iSys).SysTimeOccupiedTotal, + 4); + PreDefTableEntry( + state, + state.dataOutRptPredefined->pdchOaOccAlTotVent, + state.dataAirSystemsData->PrimaryAirSystems(iSys).Name, + (state.dataSysRpts->SysPreDefRep(iSys).SysMechVentTotalOcc + state.dataSysRpts->SysPreDefRep(iSys).SysNatVentTotalOcc) / + state.dataSysRpts->SysPreDefRep(iSys).SysTimeOccupiedTotal, + 4); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaOccAlSumDynTrgVent, + state.dataAirSystemsData->PrimaryAirSystems(iSys).Name, + state.dataSysRpts->SysPreDefRep(iSys).SysTargetVentTotalVozOcc / + state.dataSysRpts->SysPreDefRep(iSys).SysTimeOccupiedTotal, + 4); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaOccAlTmBelow, + state.dataAirSystemsData->PrimaryAirSystems(iSys).Name, + state.dataSysRpts->SysPreDefRep(iSys).SysTimeBelowVozDynTotalOcc, + 0); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaOccAlTmAt, + state.dataAirSystemsData->PrimaryAirSystems(iSys).Name, + state.dataSysRpts->SysPreDefRep(iSys).SysTimeAtVozDynTotalOcc, + 0); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaOccAlTmAbove, + state.dataAirSystemsData->PrimaryAirSystems(iSys).Name, + state.dataSysRpts->SysPreDefRep(iSys).SysTimeAboveVozDynTotalOcc, + 0); + } + } + // add total rows for outdoor air details + OutputReportPredefined::PreDefTableEntry( + state, state.dataOutRptPredefined->pdchOaMvDesZnOa, "Total Facility", state.dataOutRptPredefined->TotalVozMax, 4); + + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaMvZoneVol, "Total Facility", totalVolume); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaMvZoneArea, "Total Facility", totalArea); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaMvNomNumOcc, "Total Facility", totalOccupants); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaMvAvgNumOcc, "Total Facility", totalAverageOccupants); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaMvMinDynTrgVent, "Total Facility", totalVozMin, 3); + + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaTaBzMechVent, "Total Facility", totalMechVentVol, 0); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaTaBzNatVent, "Total Facility", totalNatVentVol, 0); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaTaBzTotVent, "Total Facility", totalMechVentVol + totalNatVentVol, 0); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaTaBzInfil, "Total Facility", totalInfilVol, 0); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchOaTaBzTotVentInfil, "Total Facility", totalMechVentVol + totalNatVentVol + totalInfilVol, 0); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaTaBzDynTrgVent, "Total Facility", totalVozDyn, 0); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchOaTaBzTmBelow, "Total Facility", state.dataOutRptPredefined->TotalAnyZoneBelowVozDynForOA, 0); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchOaTaBzTmAt, "Total Facility", state.dataOutRptPredefined->TotalAllZonesAtVozDynForOA, 0); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchOaTaBzTmAbove, "Total Facility", state.dataOutRptPredefined->TotalAnyZoneAboveVozDynForOA, 0); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchOaTaBzTmAboveUnocc, "Total Facility", state.dataOutRptPredefined->TotalAnyZoneVentUnoccForOA, 0); + + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaOccBzMechVent, "Total Facility", totalMechVentRateOcc, 4); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaOccBzNatVent, "Total Facility", totalNatVentRateOcc, 4); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaOccBzTotVent, "Total Facility", totalMechVentRateOcc + totalNatVentRateOcc, 4); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaOccBzInfil, "Total Facility", totalInfilRateOcc, 4); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdchOaOccBzTotVentInfil, + "Total Facility", + totalMechVentRateOcc + totalNatVentRateOcc + totalInfilRateOcc, + 4); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaOccBzDynTrgVent, "Total Facility", totalVozDynOcc, 4); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchOaOccBzTmBelow, "Total Facility", state.dataOutRptPredefined->TotalAnyZoneBelowVozDynOccForOA, 0); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchOaOccBzTmAt, "Total Facility", state.dataOutRptPredefined->TotalAllZonesAtVozDynOccForOA, 0); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchOaOccBzTmAbove, "Total Facility", state.dataOutRptPredefined->TotalAnyZoneAboveVozDynOccForOA, 0); + // Add the number of central air distributions system to the count report PreDefTableEntry(state, state.dataOutRptPredefined->pdchHVACcntVal, "HVAC Air Loops", NumPrimaryAirSys); // Add the number of conditioned and unconditioned zones to the count report @@ -15881,14 +16128,19 @@ namespace EnergyPlus::OutputReportTabular { for (iZone = 1; iZone <= state.dataGlobal->NumOfZones; ++iZone) { if (Zone(iZone).SystemZoneNodeNumber >= 0) { // conditioned zones only if (Zone(iZone).isNominalOccupied) { - ZonePreDefRep(iZone).MechVentVolTotal = 0.; + ZonePreDefRep(iZone).MechVentVolTotalOcc = 0.; + ZonePreDefRep(iZone).MechVentVolTotalOccStdDen = 0.; ZonePreDefRep(iZone).MechVentVolMin = HUGE_(bigVal); - ZonePreDefRep(iZone).InfilVolTotal = 0.; + ZonePreDefRep(iZone).InfilVolTotalOcc = 0.; + ZonePreDefRep(iZone).InfilVolTotalOccStdDen = 0.; ZonePreDefRep(iZone).InfilVolMin = HUGE_(bigVal); - ZonePreDefRep(iZone).AFNInfilVolTotal = 0.; + ZonePreDefRep(iZone).AFNInfilVolTotalOcc = 0.; + ZonePreDefRep(iZone).AFNInfilVolTotalOccStdDen = 0.; ZonePreDefRep(iZone).AFNInfilVolMin = HUGE_(bigVal); - ZonePreDefRep(iZone).SimpVentVolTotal = 0.; + ZonePreDefRep(iZone).SimpVentVolTotalOcc = 0.; + ZonePreDefRep(iZone).SimpVentVolTotalOccStdDen = 0.; ZonePreDefRep(iZone).SimpVentVolMin = HUGE_(bigVal); + ZonePreDefRep(iZone).AFNVentVolTotalOccStdDen = 0.; ZonePreDefRep(iZone).TotTimeOcc = 0.; } } diff --git a/src/EnergyPlus/RoomAirModelAirflowNetwork.cc b/src/EnergyPlus/RoomAirModelAirflowNetwork.cc index 8c4e4650ed1..6f522e370dc 100644 --- a/src/EnergyPlus/RoomAirModelAirflowNetwork.cc +++ b/src/EnergyPlus/RoomAirModelAirflowNetwork.cc @@ -1051,14 +1051,14 @@ namespace RoomAirModelAirflowNetwork { if (Surface(SurfNum).Class == DataSurfaces::SurfaceClass::Window) { // Add to the convective internal gains - if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // The shade area covers the area of the glazing plus the area of the dividers. Area += SurfWinDividerArea(SurfNum); SumIntGain += SurfWinDividerHeatGain(SurfNum); } // Convective heat gain from natural convection in gap between glass and interior shade or blind - if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn) + if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) SumIntGain += SurfWinConvHeatFlowNatural(SurfNum); // Convective heat gain from airflow window @@ -1088,8 +1088,7 @@ namespace RoomAirModelAirflowNetwork { HA += HConvIn(SurfNum) * SurfWinFrameArea(SurfNum) * (1.0 + SurfWinProjCorrFrIn(SurfNum)); } - if (SurfWinDividerArea(SurfNum) > 0.0 && SurfWinShadingFlag(SurfNum) != IntShadeOn && - SurfWinShadingFlag(SurfNum) != IntBlindOn) { + if (SurfWinDividerArea(SurfNum) > 0.0 && !ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // Window divider contribution(only from shade or blind for window with divider and interior shade or blind) SumHATsurf += HConvIn(SurfNum) * SurfWinDividerArea(SurfNum) * (1.0 + 2.0 * SurfWinProjCorrDivIn(SurfNum)) * SurfWinDividerTempSurfIn(SurfNum); diff --git a/src/EnergyPlus/SimulationManager.cc b/src/EnergyPlus/SimulationManager.cc index ff43d382993..abd2968f8d3 100644 --- a/src/EnergyPlus/SimulationManager.cc +++ b/src/EnergyPlus/SimulationManager.cc @@ -3105,7 +3105,7 @@ void Resimulate(EnergyPlusData &state, // HVAC simulation ManageZoneAirUpdates(state, iGetZoneSetPoints, ZoneTempChange, false, UseZoneTimeStepHistory, 0.0); if (state.dataContaminantBalance->Contaminant.SimulateContaminants) ManageZoneContaminanUpdates(state, iGetZoneSetPoints, false, UseZoneTimeStepHistory, 0.0); - CalcAirFlowSimple(state, 0, ZoneAirMassFlow.EnforceZoneMassBalance); + CalcAirFlowSimple(state, 0, ZoneAirMassFlow.EnforceZoneMassBalance, ZoneAirMassFlow.EnforceZoneMassBalance); ManageZoneAirUpdates(state, iPredictStep, ZoneTempChange, false, UseZoneTimeStepHistory, 0.0); if (state.dataContaminantBalance->Contaminant.SimulateContaminants) ManageZoneContaminanUpdates(state, iPredictStep, false, UseZoneTimeStepHistory, 0.0); SimHVAC(state); diff --git a/src/EnergyPlus/SizingManager.cc b/src/EnergyPlus/SizingManager.cc index 6869bb45429..c97382f19c4 100644 --- a/src/EnergyPlus/SizingManager.cc +++ b/src/EnergyPlus/SizingManager.cc @@ -1621,6 +1621,7 @@ namespace EnergyPlus::SizingManager { VbzByZone(termUnitSizingIndex) / TermUnitFinalZoneSizing(termUnitSizingIndex).ZoneADEffCooling, 4); // Voz-clg + } OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchS62zvpHtEz, TermUnitFinalZoneSizing(termUnitSizingIndex).ZoneName, @@ -1715,11 +1716,12 @@ namespace EnergyPlus::SizingManager { TermUnitFinalZoneSizing(termUnitSizingIndex).ZoneName, VpzMinClgByZone(termUnitSizingIndex), 4); // Vpz-min + Real64 VozClg = 0.0; if (TermUnitFinalZoneSizing(termUnitSizingIndex).ZoneADEffCooling > 0.0) { + VozClg = VbzByZone(termUnitSizingIndex) / TermUnitFinalZoneSizing(termUnitSizingIndex).ZoneADEffCooling; OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchS62zcdVozclg, TermUnitFinalZoneSizing(termUnitSizingIndex).ZoneName, - VbzByZone(termUnitSizingIndex) / - TermUnitFinalZoneSizing(termUnitSizingIndex).ZoneADEffCooling, + VozClg, 4); // Voz-clg } OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchS62zcdZpz, @@ -1776,13 +1778,21 @@ namespace EnergyPlus::SizingManager { TermUnitFinalZoneSizing(termUnitSizingIndex).ZoneName, VpzMinHtgByZone(termUnitSizingIndex), 4); // Vpz-min + Real64 VozHtg = 0.0; if (TermUnitFinalZoneSizing(termUnitSizingIndex).ZoneADEffHeating != 0.0) { + VozHtg = VbzByZone(termUnitSizingIndex) / TermUnitFinalZoneSizing(termUnitSizingIndex).ZoneADEffHeating; OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchS62zhdVozhtg, TermUnitFinalZoneSizing(termUnitSizingIndex).ZoneName, - VbzByZone(termUnitSizingIndex) / - TermUnitFinalZoneSizing(termUnitSizingIndex).ZoneADEffHeating, + VozHtg, 4); // Voz-htg } + // Outdoor Air Details Report - Design Zone Outdoor Airflow - Voz + Real64 VozMax = std::max(VozHtg, VozClg); // take larger of the heating and cooling Voz values + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchOaMvDesZnOa, + TermUnitFinalZoneSizing(termUnitSizingIndex).ZoneName, + VozMax, + 4); + state.dataOutRptPredefined->TotalVozMax += VozMax * DataHeatBalance::Zone(zoneNum).Multiplier * DataHeatBalance::Zone(zoneNum).ListMultiplier; OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchS62zhdZpz, TermUnitFinalZoneSizing(termUnitSizingIndex).ZoneName, TermUnitFinalZoneSizing(termUnitSizingIndex).ZpzHtgByZone, @@ -1877,6 +1887,8 @@ namespace EnergyPlus::SizingManager { 4); // Voz-htg OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchS62shdEvz, FinalSysSizing(AirLoopNum).AirPriLoopName, EvzMinBySysHeat(AirLoopNum), 4); // Evz-min + + } // loop over air loops for table writing } diff --git a/src/EnergyPlus/SolarShading.cc b/src/EnergyPlus/SolarShading.cc index 45eecb27a6a..6472448b014 100644 --- a/src/EnergyPlus/SolarShading.cc +++ b/src/EnergyPlus/SolarShading.cc @@ -1347,8 +1347,8 @@ namespace SolarShading { // Added TH 5/26/2009 for switchable windows to report switching factor (tinted level) // CurrentModuleObject='Switchable Windows' if (Surface(SurfLoop).HasShadeControl) { - if (WindowShadingControl(Surface(SurfLoop).activeWindowShadingControl).ShadingType == WSC_ST_SwitchableGlazing) { - // IF (SurfaceWindow(SurfLoop)%ShadingFlag == SwitchableGlazing) THEN !ShadingFlag is not set to SwitchableGlazing yet! + if (WindowShadingControl(Surface(SurfLoop).activeWindowShadingControl).ShadingType == WinShadingType::SwitchableGlazing) { + // IF (SurfaceWindow(SurfLoop)%ShadingFlag == WinShadingType::SwitchableGlazing) THEN !ShadingFlag is not set to WinShadingType::SwitchableGlazing yet! SetupOutputVariable(state, "Surface Window Switchable Glazing Switching Factor", OutputProcessor::Unit::None, SurfWinSwitchingFactor(SurfLoop), @@ -6068,7 +6068,7 @@ namespace SolarShading { } int BlNum = SurfWinBlindNumber(SurfNum); int ScNum = SurfWinScreenNumber(SurfNum); - int ShadeFlag = SurfWinShadingFlag(SurfNum); // Set in subr. WindowShadingManager + WinShadingType ShadeFlag = SurfWinShadingFlag(SurfNum); // Set in subr. WindowShadingManager Real64 ProfAng = 0.0; // Window solar profile angle (radians) @@ -6111,8 +6111,8 @@ namespace SolarShading { AbWin(Lay) = POLYF(CosInc, state.dataConstruction->Construct(ConstrNum).AbsBeamCoef({1, 6}, Lay)) * CosInc * SunLitFract * SurfaceWindow(SurfNum).OutProjSLFracMult(state.dataGlobal->HourOfDay); } - if (ShadeFlag <= 0 || ShadeFlag >= 10) { - // Bare window (ShadeFlag = -1 or 0 or shading device of off) + if (!IS_SHADED_NO_GLARE_CTRL(ShadeFlag)) { + // (ShadeFlag <= 0 || ShadeFlag >= 10) - Bare window (ShadeFlag = -1 or 0 or shading device of off) for (int Lay = 1; Lay <= NGlass; ++Lay) { // Add contribution of beam reflected from outside and inside reveal SurfWinA(Lay, SurfNum) = AbWin(Lay) + SurfWinOutsRevealDiffOntoGlazing(SurfNum) * state.dataConstruction->Construct(ConstrNum).AbsDiff(Lay) + @@ -6124,30 +6124,30 @@ namespace SolarShading { Real64 InOutProjSLFracMult = SurfaceWindow(SurfNum).InOutProjSLFracMult(state.dataGlobal->HourOfDay); Array1D AbWinSh(NGlass); // Like AbWin, but for shaded window Array1D ADiffWinSh(NGlass); // Diffuse solar absorptance of glass layer, window with shading device - if (ShadeFlag == ExtShadeOn || ShadeFlag == ExtBlindOn || ShadeFlag == ExtScreenOn) FracSunLit = SunLitFract; + if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) FracSunLit = SunLitFract; - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || ShadeFlag == SwitchableGlazing) { + if (ANY_SHADE(ShadeFlag) || ShadeFlag == WinShadingType::SwitchableGlazing) { // Shade or switchable glazing on for (int Lay = 1; Lay <= NGlass; ++Lay) { AbWinSh(Lay) = POLYF(CosInc, state.dataConstruction->Construct(ConstrNumSh).AbsBeamCoef({1, 6}, Lay)) * CosInc * FracSunLit; ADiffWinSh(Lay) = state.dataConstruction->Construct(ConstrNumSh).AbsDiff(Lay); } - if (ShadeFlag == IntShadeOn) { // Exterior beam absorbed by INTERIOR SHADE + if (ShadeFlag == WinShadingType::IntShade) { // Exterior beam absorbed by INTERIOR SHADE // Note that AbsBeamShadeCoef includes effect of shade/glazing inter-reflection Real64 AbsShade = POLYF(CosInc, state.dataConstruction->Construct(ConstrNumSh).AbsBeamShadeCoef); // Interior shade or blind beam solar absorptance ExtBeamAbsByShadFac(SurfNum) = (AbsShade * CosInc * SunLitFract * InOutProjSLFracMult + SurfWinOutsRevealDiffOntoGlazing(SurfNum) * state.dataConstruction->Construct(ConstrNumSh).AbsDiffShade) * SurfWinGlazedFrac(SurfNum); // In the above, GlazedFrac corrects for shadowing of divider onto interior shade - } else if (ShadeFlag == ExtShadeOn) { // Exterior beam absorbed by EXTERIOR SHADE + } else if (ShadeFlag == WinShadingType::ExtShade) { // Exterior beam absorbed by EXTERIOR SHADE ExtBeamAbsByShadFac(SurfNum) = state.dataConstruction->Construct(ConstrNumSh).AbsDiffShade * CosInc * SunLitFract; - } else if (ShadeFlag == BGShadeOn) { // Exterior beam absorbed by BETWEEN-GLASS SHADE + } else if (ShadeFlag == WinShadingType::BGShade) { // Exterior beam absorbed by BETWEEN-GLASS SHADE Real64 AbsShade = POLYF(CosInc, state.dataConstruction->Construct(ConstrNumSh).AbsBeamShadeCoef); ExtBeamAbsByShadFac(SurfNum) = AbsShade * CosInc * SunLitFract + SurfWinOutsRevealDiffOntoGlazing(SurfNum) * state.dataConstruction->Construct(ConstrNumSh).AbsDiffShade; } } else { // Blind or screen on - if (ShadeFlag != ExtScreenOn) ProfileAngle(SurfNum, state.dataEnvrn->SOLCOS, Blind(BlNum).SlatOrientation, ProfAng); - if (ShadeFlag == IntBlindOn) { + if (ShadeFlag != WinShadingType::ExtScreen) ProfileAngle(SurfNum, state.dataEnvrn->SOLCOS, Blind(BlNum).SlatOrientation, ProfAng); + if (ShadeFlag == WinShadingType::IntBlind) { // Interior blind on Real64 TGlBm = POLYF(CosInc,state.dataConstruction->Construct(ConstrNum).TransSolBeamCoef); // Glazing system front solar beam transmittance Real64 RGlDiffBack = state.dataConstruction->Construct(ConstrNum).ReflectSolDiffBack; // Glazing system back diffuse solar reflectance @@ -6171,7 +6171,7 @@ namespace SolarShading { SurfWinOutsRevealDiffOntoGlazing(SurfNum) * AbsShadeDiff) * SurfWinGlazedFrac(SurfNum); // In the above, GlazedFrac corrects for shadowing of divider onto interior blind - } else if (ShadeFlag == ExtBlindOn) { + } else if (ShadeFlag == WinShadingType::ExtBlind) { // Exterior blind on Real64 TBlBmBm = BlindBeamBeamTrans(ProfAng, SlatAng, Blind(BlNum).SlatWidth, Blind(BlNum).SlatSeparation, Blind(BlNum).SlatThickness); // Blind solar front beam-beam transmittance Real64 TBlDifDif = InterpSlatAng(SlatAng, VarSlats, Blind(BlNum).SolFrontDiffDiffTrans); // Diffuse-diffuse solar transmittance of blind @@ -6196,7 +6196,7 @@ namespace SolarShading { Real64 AbsBlDiffBack = InterpSlatAng(SlatAng, VarSlats, Blind(BlNum).SolBackDiffAbs); // Blind solar back diffuse absorptance Real64 AbsShade = AbsBlFront + AbsBlBack * RGlFront * TBlBmBm + (AbsBlDiffBack * RGlDiffFront / (1.0 - RhoBlDiffBack * RGlDiffFront)) * (RGlFront * TBlBmBm * RhoBlBack + TBlBmDiff); ExtBeamAbsByShadFac(SurfNum) = AbsShade * CosInc * SunLitFract * InOutProjSLFracMult; - } else if (ShadeFlag == ExtScreenOn) { + } else if (ShadeFlag == WinShadingType::ExtScreen) { // Exterior screen on Real64 TScBmBm = SurfaceScreens(ScNum).BmBmTrans; // Screen solar front beam-beam transmittance Real64 TScBmDiff = SurfaceScreens(ScNum).BmDifTrans; // Screen solar front beam-diffuse transmittance @@ -6218,7 +6218,7 @@ namespace SolarShading { Real64 AbsScDiffBack = SurfaceScreens(ScNum).DifScreenAbsorp; // Screen solar back diffuse absorptance Real64 AbsScreen = AbsScBeam * (1.0 + TScBmBm * RGlFront) + (AbsScDiffBack * TScBmBm * RGlFront * RGlDiffFront * RScBack / (1.0 - RScDifBack * RGlDiffFront)); // Exterior screen beam solar absorptance ExtBeamAbsByShadFac(SurfNum) = AbsScreen * CosInc * SunLitFract * InOutProjSLFracMult; - } else if (ShadeFlag == BGBlindOn) { + } else if (ShadeFlag == WinShadingType::BGBlind) { // Between-glass blind o // Isolated glass and blind properties at current incidence angle, profile angle and slat angle Real64 t1 = POLYF(CosInc, state.dataConstruction->Construct(ConstrNum).tBareSolCoef({1, 6}, 1)); // Bare-glass beam solar transmittance for glass layers 1,2 and 3 @@ -6281,12 +6281,12 @@ namespace SolarShading { } // End of check if blind is interior, exterior or between-glass } // End of check if a blind is on - if (ShadeFlag != SwitchableGlazing) { + if (ShadeFlag != WinShadingType::SwitchableGlazing) { // Interior or between glass shade or blind on for (int Lay = 1; Lay <= NGlass; ++Lay) { SurfWinA(Lay, SurfNum) = AbWinSh(Lay); // Add contribution of diffuse from beam on outside reveal - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn || ShadeFlag == BGShadeOn || ShadeFlag == BGBlindOn) + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag) || ANY_BETWEENGLASS_SHADE_BLIND(ShadeFlag)) SurfWinA(Lay, SurfNum) += ADiffWinSh(Lay) * SurfWinOutsRevealDiffOntoGlazing(SurfNum); } } else { @@ -6401,10 +6401,10 @@ namespace SolarShading { } if (SurfWinWindowModelType(SurfNum) == Window5DetailedModel) { - if (ShadeFlag > 0 && ShadeFlag < 10) { - if (ShadeFlag != SwitchableGlazing) { + if (IS_SHADED_NO_GLARE_CTRL(SurfWinShadingFlag(SurfNum))) { + if (ShadeFlag != WinShadingType::SwitchableGlazing) { // Shade or blind - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || ShadeFlag == ExtScreenOn) { + if (ANY_SHADE_SCREEN(ShadeFlag)) { // Shade or screen DiffTrans = state.dataConstruction->Construct(ConstrNumSh).TransDiff; } else { @@ -6489,10 +6489,10 @@ namespace SolarShading { } else { DiffTrans = state.dataConstruction->Construct(ConstrNum).TransDiff; } - if (ShadeFlag > 0 && ShadeFlag < 10) { - if (ShadeFlag != SwitchableGlazing) { + if (IS_SHADED_NO_GLARE_CTRL(ShadeFlag)) { + if (ShadeFlag != WinShadingType::SwitchableGlazing) { // Shade or blind - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || ShadeFlag == ExtScreenOn) { + if (ANY_SHADE_SCREEN(ShadeFlag)) { // Shade or screen DiffTrans = state.dataConstruction->Construct(ConstrNumSh).TransDiff; } else { @@ -6546,10 +6546,10 @@ namespace SolarShading { if (SurfWinWindowModelType(SurfNum) != WindowEQLModel) { SurfWinBlGlSysTsolDifDif(SurfNum) = DiffTrans; SurfWinScGlSysTsolDifDif(SurfNum) = DiffTrans; - if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGBlindOn || ShadeFlag == ExtScreenOn) { + if (ANY_BLIND(ShadeFlag)|| ShadeFlag == WinShadingType::ExtScreen) { SurfWinBlGlSysTsolDifDif(SurfNum) = DiffTrans; SurfWinScGlSysTsolDifDif(SurfNum) = DiffTrans; - if (ShadeFlag == ExtScreenOn) { + if (ShadeFlag == WinShadingType::ExtScreen) { SurfWinScTsolDifDif(SurfNum) = SurfaceScreens(ScNum).DifDifTrans; } else { SurfWinBlTsolDifDif(SurfNum) = InterpSlatAng(SlatAng, VarSlats, Blind(BlNum).SolFrontDiffDiffTrans); @@ -6562,10 +6562,10 @@ namespace SolarShading { //----------------------------------------------------------------- if (ConstrNumSh != 0 && SunLitFract > 0.0) { if (SurfWinWindowModelType(SurfNum) != WindowEQLModel) { - if (ShadeFlag > 0 && ShadeFlag < 10) { + if (IS_SHADED_NO_GLARE_CTRL(ShadeFlag)) { // Shade or screen or blind on, or switchable glazing // (note in the following that diffusing glass is not allowed in a window with shade, blind or switchable glazing) - if (ShadeFlag != IntBlindOn && ShadeFlag != ExtBlindOn && ShadeFlag != BGBlindOn && ShadeFlag != ExtScreenOn) { + if (ANY_SHADE(ShadeFlag) || ShadeFlag == WinShadingType::SwitchableGlazing) { // Shade on or switchable glazing TBmAllShBlSc = POLYF(CosInc, state.dataConstruction->Construct(ConstrNumSh).TransSolBeamCoef); } else { @@ -6575,7 +6575,7 @@ namespace SolarShading { Real64 TBlDifDif; // Diffuse-diffuse solar transmittance of blind Real64 TScBmBm; Real64 TBlBmBm; - if (ShadeFlag == ExtScreenOn) {// Exterior screen + if (ShadeFlag == WinShadingType::ExtScreen) {// Exterior screen Real64 RScBack = SurfaceScreens(ScNum).ReflectSolBeamFront; Real64 RScDifDifBk = SurfaceScreens(ScNum).DifReflect; // Diffuse-diffuse back refectance of screen Real64 RGlBmFr = POLYF(CosInc, state.dataConstruction->Construct(ConstrNum).ReflSolBeamFrontCoef); // Beam front reflectance of glass @@ -6595,7 +6595,7 @@ namespace SolarShading { } else { TBlBmBm = BlindBeamBeamTrans(ProfAng, SlatAng, Blind(BlNum).SlatWidth, Blind(BlNum).SlatSeparation, Blind(BlNum).SlatThickness); TBlBmDif = InterpProfSlatAng(ProfAng, SlatAng, VarSlats, Blind(BlNum).SolFrontBeamDiffTrans); - if (ShadeFlag == IntBlindOn) { + if (ShadeFlag == WinShadingType::IntBlind) { Real64 RhoBlBmDifFr = InterpProfSlatAng(ProfAng, SlatAng, VarSlats, Blind(BlNum).SolFrontBeamDiffRefl); // Beam-diffuse front reflectance of blind Real64 RGlDifBk = state.dataConstruction->Construct(ConstrNum).ReflectSolDiffBack; // Diffuse front reflectance of glass Real64 RhoBlDifDifFr = InterpSlatAng(SlatAng, VarSlats, Blind(BlNum).SolFrontDiffDiffRefl); // Diffuse-diffuse front refectance of blind @@ -6606,7 +6606,7 @@ namespace SolarShading { TBmBmShBlSc = TBmBmBl; // TBmBm * TBlBmBm TBmDifShBlSc = TBmAllShBlSc - TBmBmShBlSc; if (TBmDifShBlSc < 0.0) TBmDifShBlSc = 0.0; - } else if (ShadeFlag == ExtBlindOn) { + } else if (ShadeFlag == WinShadingType::ExtBlind) { Real64 RhoBlBmDifBk = InterpProfSlatAng(ProfAng, SlatAng, VarSlats, Blind(BlNum).SolBackBeamDiffRefl); // Beam-diffuse back reflectance of blind Real64 RhoBlDifDifBk = InterpSlatAng(SlatAng, VarSlats, Blind(BlNum).SolBackDiffDiffRefl); // Diffuse-diffuse back refectance of blind Real64 RGlBmFr = POLYF(CosInc, state.dataConstruction->Construct(ConstrNum).ReflSolBeamFrontCoef); @@ -6659,8 +6659,7 @@ namespace SolarShading { } // end of checking if not eql window model } // end of checking if sunlitfract > 0 - // TODO: Why this is updated after reporting - if (ShadeFlag == SwitchableGlazing) { + if (ShadeFlag == WinShadingType::SwitchableGlazing) { // Switchable glazing Real64 SwitchFac = SurfWinSwitchingFactor(SurfNum); if (!SurfWinSolarDiffusing(SurfNum)) { @@ -6690,7 +6689,7 @@ namespace SolarShading { Real64 InOutProjSLFracMult = SurfaceWindow(SurfNum).InOutProjSLFracMult(state.dataGlobal->HourOfDay); if (SurfWinWindowModelType(SurfNum) != WindowEQLModel) { WinTransDifSolar(SurfNum) = DiffTrans * Surface(SurfNum).Area; - if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGBlindOn) { + if (ANY_BLIND(ShadeFlag)) { if (Blind(SurfWinBlindNumber(SurfNum)).SlatOrientation == Horizontal) { WinTransDifSolarGnd(SurfNum) = DiffTransGnd * Surface(SurfNum).Area; WinTransDifSolarSky(SurfNum) = DiffTransSky * Surface(SurfNum).Area; @@ -6705,7 +6704,8 @@ namespace SolarShading { WinTransDifSolarSky(SurfNum) = DiffTrans * Surface(SurfNum).Area; } - if (ShadeFlag < 1 || ShadeFlag == SwitchableGlazing || ShadeFlag >= 10) { // Unshaded or switchable glazing + if (!IS_SHADED_NO_GLARE_CTRL(ShadeFlag) || ShadeFlag == WinShadingType::SwitchableGlazing) { + // Unshaded or switchable glazing // Note: with previous defs of TBmBm & TBmDif, these come out right for Complex Fenestration // WinTransBmSolar uses the directional-hemispherical transmittance WinTransBmSolar(SurfNum) = (TBmBm + TBmDif) * SunLitFract * CosInc * Surface(SurfNum).Area * InOutProjSLFracMult; @@ -6744,9 +6744,7 @@ namespace SolarShading { // Window is schedule surface gained. Do not make addition to what enters into zone since that information is not available if (FenSolAbsPtr == 0) { Real64 TBmAll; // Window beam-to-(beam+diffuse) transmittance - if (SurfWinWindowModelType(SurfNum) != WindowBSDFModel && - (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || - ShadeFlag == BGShadeOn || ShadeFlag == BGBlindOn || ShadeFlag == ExtScreenOn)) { + if (SurfWinWindowModelType(SurfNum) != WindowBSDFModel && (ANY_BLIND(ShadeFlag) || ANY_SHADE_SCREEN(ShadeFlag))) { TBmAll = TBmAllShBlSc; } else { TBmAll = TBmBm + TBmDif; @@ -6787,9 +6785,10 @@ namespace SolarShading { // from this exterior window since the beam-beam transmittance of shades and diffusing glass // is assumed to be zero. The beam-beam transmittance of tubular daylighting devices is also // assumed to be zero. + if (SunLitFract > 0.0) { if (SurfWinWindowModelType(SurfNum) != WindowBSDFModel) - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || SurfWinSolarDiffusing(SurfNum) || + if (ANY_SHADE(ShadeFlag) || SurfWinSolarDiffusing(SurfNum) || SurfWinOriginalClass(SurfNum) == SurfaceClass::TDD_Diffuser || Surface(SurfNum).Class == SurfaceClass::TDD_Dome) continue; @@ -6812,9 +6811,9 @@ namespace SolarShading { if (ShelfNum > 0) { // Daylighting shelf InShelfSurf = state.dataDaylightingDevicesData->Shelf(ShelfNum).InSurf; } - if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGBlindOn) { + if (ANY_BLIND(ShadeFlag)) { TBm = TBmBmBl; // Interior, exterior or between-glass blind on - } else if (ShadeFlag == ExtScreenOn) { + } else if (ShadeFlag == WinShadingType::ExtScreen) { TBm = TBmBmSc; // Exterior screen on } else { TBm = TBmBm; // Bare glass or switchable glazing @@ -6882,7 +6881,7 @@ namespace SolarShading { // are assumed to be bare, i.e., they have no shading device and are non-switchable. // The layer order for interior windows is "outside" to "inside," where "outside" refers to // the adjacent zone and "inside" refers to the current zone. - int ShadeFlagBack = SurfWinShadingFlag(BackSurfNum); + WinShadingType ShadeFlagBack = SurfWinShadingFlag(BackSurfNum); bool VarSlatsBack = SurfWinMovableSlats(BackSurfNum); Real64 SlatAngBack = SurfWinSlatAngThisTS(BackSurfNum); Real64 CosIncBack = std::abs(CosIncAng(state.dataGlobal->TimeStep, state.dataGlobal->HourOfDay, BackSurfNum)); @@ -6902,7 +6901,7 @@ namespace SolarShading { // Interior beam absorptance of glass layers and beam transmittance of back exterior & // or interior window WITHOUT SHADING this timestep - if (ShadeFlagBack <= 0) { + if (NOT_SHADED(ShadeFlagBack)) { for (int Lay = 1; Lay <= NBackGlass; ++Lay) { AbsBeamWin(Lay) = POLYF(CosIncBack, state.dataConstruction->Construct(ConstrNumBack).AbsBeamBackCoef({1, 6}, Lay)); } @@ -6911,7 +6910,7 @@ namespace SolarShading { // Interior beam absorptance of glass layers and beam transmittance // of back exterior window with SHADE - if (ShadeFlagBack == IntShadeOn || ShadeFlagBack == ExtShadeOn || ShadeFlagBack == BGShadeOn) { + if (ANY_SHADE(ShadeFlagBack)) { for (int Lay = 1; Lay <= state.dataConstruction->Construct(ConstrNumBackSh).TotGlassLayers; ++Lay) { AbsBeamWin(Lay) = POLYF(CosIncBack, state.dataConstruction->Construct(ConstrNumBackSh).AbsBeamBackCoef({1, 6}, Lay)); } @@ -6920,15 +6919,11 @@ namespace SolarShading { // Interior beam absorbed by INTERIOR SHADE of back exterior window - if (ShadeFlagBack == IntShadeOn) { + if (ShadeFlagBack == WinShadingType::IntShade) { IntBeamAbsByShadFac(BackSurfNum) = BOverlap * state.dataConstruction->Construct(ConstrNumBackSh).AbsDiffBackShade / (Surface(BackSurfNum).Area + SurfWinDividerArea(BackSurfNum)); BABSZone += BOverlap * state.dataConstruction->Construct(ConstrNumBackSh).AbsDiffBackShade; - } - - // Interior beam absorbed by EXTERIOR SHADE of back exterior window - - if (ShadeFlagBack == ExtShadeOn) { + } else if (ShadeFlagBack == WinShadingType::ExtShade) { // Interior beam absorbed by EXTERIOR SHADE of back exterior window Real64 RGlFront = state.dataConstruction->Construct(ConstrNumBack).ReflectSolDiffFront; Real64 AbsSh = state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNumBackSh).LayerPoint(1)).AbsorpSolar; Real64 RhoSh = 1.0 - AbsSh - state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNumBackSh).LayerPoint(1)).Trans; @@ -6936,11 +6931,7 @@ namespace SolarShading { BABSZone += BOverlap * AShBack; IntBeamAbsByShadFac(BackSurfNum) = BOverlap * AShBack / (Surface(BackSurfNum).Area + SurfWinDividerArea(BackSurfNum)); - } - - // Interior beam absorbed by BETWEEN-GLASS SHADE of back exterior window - - if (ShadeFlagBack == BGShadeOn) { + } else if (ShadeFlagBack == WinShadingType::BGShade) { // Interior beam absorbed by BETWEEN-GLASS SHADE of back exterior window Real64 rbd1k = state.dataConstruction->Construct(ConstrNumBack).rbBareSolDiff(1); Real64 rfd2k = state.dataConstruction->Construct(ConstrNumBack).rfBareSolDiff(2); Real64 AShBack; // System shade absorptance for interior beam solar @@ -6966,7 +6957,7 @@ namespace SolarShading { // Interior beam absorptance of glass layers and beam absorbed in blind // of back exterior window with BLIND - if (ShadeFlagBack == IntBlindOn || ShadeFlagBack == ExtBlindOn || ShadeFlagBack == BGBlindOn) { + if (ANY_BLIND(ShadeFlagBack)) { int BlNumBack = SurfWinBlindNumber(BackSurfNum); // Back surface blind number Real64 ProfAngBack; // Back window solar profile angle (radians) ProfileAngle(BackSurfNum, state.dataEnvrn->SOLCOS, Blind(BlNumBack).SlatOrientation, ProfAngBack); @@ -6979,7 +6970,7 @@ namespace SolarShading { Real64 TBlBmDiffBack = InterpProfSlatAng(ProfAngBack, SlatAngBack, VarSlatsBack, Blind(BlNumBack).SolBackBeamDiffTrans); // Blind solar back beam-diffuse transmittance - if (ShadeFlagBack == IntBlindOn) { + if (ShadeFlagBack == WinShadingType::IntBlind) { // Interior beam absorptance of GLASS LAYERS of exterior back window with INTERIOR BLIND // Blind solar front beam reflectance @@ -7021,9 +7012,7 @@ namespace SolarShading { IntBeamAbsByShadFac(BackSurfNum) = BOverlap * ABlBack / (Surface(BackSurfNum).Area + SurfWinDividerArea(BackSurfNum)); BABSZone += BOverlap * ABlBack; - } - - if (ShadeFlagBack == ExtBlindOn) { + } else if (ShadeFlagBack == WinShadingType::ExtBlind) { // Interior beam absorptance of GLASS LAYERS of exterior back window with EXTERIOR BLIND // Glazing system front diffuse solar reflectance @@ -7058,10 +7047,8 @@ namespace SolarShading { BABSZone += BOverlap * ABlBack; IntBeamAbsByShadFac(BackSurfNum) = BOverlap * ABlBack / (Surface(BackSurfNum).Area + SurfWinDividerArea(BackSurfNum)); - } // End of check if exterior blind on back window - - if (ShadeFlagBack == BGBlindOn) { - + } else { + // ShadeFlagBack == BGBlindOn Real64 t1k = POLYF(CosIncBack, state.dataConstruction->Construct(ConstrNumBack).tBareSolCoef({1, 6}, 1)); Real64 t2k = POLYF(CosIncBack, state.dataConstruction->Construct(ConstrNumBack).tBareSolCoef({1, 6}, 2)); Real64 af2k = POLYF(CosIncBack, state.dataConstruction->Construct(ConstrNumBack).afBareSolCoef({1, 6}, 2)); @@ -7122,10 +7109,8 @@ namespace SolarShading { IntBeamAbsByShadFac(BackSurfNum) = BOverlap * ABlBack / Surface(BackSurfNum).Area; } // End of check if between-glass blind is on back window - - } // End of check if blind is on back window - - if (ShadeFlagBack == ExtScreenOn) { + // End of check if blind is on back window + } else if (ShadeFlagBack == WinShadingType::ExtScreen) { // Interior beam absorptance of GLASS LAYERS of exterior back window with EXTERIOR SCREEN int ScNumBack = SurfWinScreenNumber(BackSurfNum); // Back surface screen number @@ -7161,7 +7146,7 @@ namespace SolarShading { // Interior beam absorptance of glass layers of back exterior window with SWITCHABLE GLAZING - if (ShadeFlagBack == SwitchableGlazing && Surface(BackSurfNum).ExtBoundCond == 0) { + if (ShadeFlagBack == WinShadingType::SwitchableGlazing && Surface(BackSurfNum).ExtBoundCond == 0) { Real64 SwitchFac = SurfWinSwitchingFactor(SurfNum); // Switching factor for a window Real64 AbsBeamWinSh; // Glass layer beam solar absorptance of a shaded window for (int Lay = 1; Lay <= NBackGlass; ++Lay) { @@ -7564,7 +7549,7 @@ namespace SolarShading { if ((Surface(SurfNum).ExtBoundCond == ExternalEnvironment) || (Surface(SurfNum).ExtBoundCond == OtherSideCondModeledExt)) { - int ShadeFlag = SurfWinShadingFlag(SurfNum); + WinShadingType ShadeFlag = SurfWinShadingFlag(SurfNum); int ShelfNum = Surface(SurfNum).Shelf; int OutShelfSurf = 0; if (ShelfNum > 0) { // Outside daylighting shelf @@ -7627,7 +7612,7 @@ namespace SolarShading { SurfWinDifSolar(SurfNum) = DifSolarInc * WinTransDifSolar(SurfNum); SurfWinBmSolarEnergy(SurfNum) = SurfWinBmSolar(SurfNum) * state.dataGlobal->TimeStepZoneSec; SurfWinDifSolarEnergy(SurfNum) = SurfWinDifSolar(SurfNum) * state.dataGlobal->TimeStepZoneSec; - if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGBlindOn) { + if (ANY_BLIND(ShadeFlag)) { if (Blind(SurfWinBlindNumber(SurfNum)).SlatOrientation == Horizontal) { SurfWinDifSolar(SurfNum) = SkySolarInc * WinTransDifSolarSky(SurfNum) + GndSolarInc * WinTransDifSolarGnd(SurfNum); SurfWinDifSolarEnergy(SurfNum) = SurfWinDifSolar(SurfNum) * state.dataGlobal->TimeStepZoneSec; @@ -8672,7 +8657,7 @@ namespace SolarShading { for (int ISurf = firstSurfWin; ISurf <= lastSurfWin; ++ISurf) { SurfWinExtIntShadePrevTS(ISurf) = SurfWinShadingFlag(ISurf); - SurfWinShadingFlag(ISurf) = NoShade; + SurfWinShadingFlag(ISurf) = WinShadingType::NoShade; SurfWinFracTimeShadingDeviceOn(ISurf) = 0.0; if (SurfWinWindowModelType(ISurf) == WindowEQLModel) { int EQLNum = state.dataConstruction->Construct(Surface(ISurf).Construction).EQLConsPtr; @@ -8694,10 +8679,14 @@ namespace SolarShading { const int LayPtr = construction.LayerPoint(Lay); auto &material(state.dataMaterial->Material(LayPtr)); const bool isShading = material.Group == ComplexWindowShade; - if (isShading && Lay == 1) SurfWinShadingFlag(ISurf) = ExtShadeOn; - if (isShading && Lay == TotLayers) SurfWinShadingFlag(ISurf) = IntShadeOn; + if (isShading && Lay == 1) { + SurfWinShadingFlag(ISurf) = WinShadingType::ExtShade; + } + if (isShading && Lay == TotLayers) { + SurfWinShadingFlag(ISurf) = WinShadingType::IntShade; + } } - if (SurfWinShadingFlag(ISurf) == IntShadeOn) { + if (SurfWinShadingFlag(ISurf) == WinShadingType::IntShade) { auto &construction(state.dataConstruction->Construct(Surface(ISurf).Construction)); const int TotLay = construction.TotLayers; int ShadingLayerPtr = construction.LayerPoint(TotLay); @@ -8745,37 +8734,11 @@ namespace SolarShading { Surface(ISurf).activeStormWinShadedConstruction = Surface(ISurf).shadedStormWinConstructionList[indexWindowShadingControl]; } int IShadingCtrl = Surface(ISurf).activeWindowShadingControl; - - int ShadingType = WindowShadingControl(IShadingCtrl).ShadingType; // Type of shading (interior shade, interior blind, etc.) - SurfWinShadingFlag(ISurf) = ShadeOff; // Initialize shading flag to off - int IZone = Surface(ISurf).Zone; // Setpoint for shading Real64 SetPoint = WindowShadingControl(IShadingCtrl).SetPoint; // Control setpoint Real64 SetPoint2 = WindowShadingControl(IShadingCtrl).SetPoint2; // Second control setpoint - - // ShType = NoShade ! =-1 (see DataHeatBalance) - // ShType = ShadeOff ! =0 - int ShType; - // 1 = interior shade is on, - // 2 = glass is switched to dark state, - // 3 = exterior shade is on, - // 4 = exterior screen is on, - // 6 = interior blind is on, - // 7 = exterior blind is on, - // 8 = between-glass shade is on, - // 9 = between-glass blind is on. - // CHARACTER(len=32) :: ShadingType ! Type of shading (interior shade, interior blind, etc.) - if (ShadingType == WSC_ST_InteriorShade) ShType = IntShadeOn; // =1 - if (ShadingType == WSC_ST_SwitchableGlazing) ShType = SwitchableGlazing; // =2 - if (ShadingType == WSC_ST_ExteriorShade) ShType = ExtShadeOn; // =3 - if (ShadingType == WSC_ST_ExteriorScreen) ShType = ExtScreenOn; // =4 - if (ShadingType == WSC_ST_InteriorBlind) ShType = IntBlindOn; // =6 - if (ShadingType == WSC_ST_ExteriorBlind) ShType = ExtBlindOn; // =7 - if (ShadingType == WSC_ST_BetweenGlassShade) ShType = BGShadeOn; // =8 - if (ShadingType == WSC_ST_BetweenGlassBlind) ShType = BGBlindOn; // =9 - bool SchedAllowsControl = true; // True if control schedule is not specified or is specified and schedule value = 1 int SchedulePtr = WindowShadingControl(IShadingCtrl).Schedule; if (SchedulePtr != 0) { @@ -8802,195 +8765,226 @@ namespace SolarShading { // Determine whether to deploy shading depending on type of control - auto const SELECT_CASE_var(WindowShadingControl(IShadingCtrl).ShadingControlType); - - if (SELECT_CASE_var == WSCT_AlwaysOn) { // 'ALWAYSON' - SurfWinShadingFlag(ISurf) = ShType; - - } else if (SELECT_CASE_var == WSCT_AlwaysOff) { // 'ALWAYSOFF' - SurfWinShadingFlag(ISurf) = ShadeOff; + bool shadingOn = false; + bool shadingOffButGlareControlOn = false; + switch (WindowShadingControl(IShadingCtrl).ShadingControlType) { + case WindowShadingControlType::AlwaysOn: // 'ALWAYSON' + shadingOn = true; + break; + case WindowShadingControlType::AlwaysOff: // 'ALWAYSOFF' + break; + case WindowShadingControlType::OnIfScheduled: // 'ONIFSCHEDULEALLOWS' + if (SchedAllowsControl) shadingOn = true; + break; + case WindowShadingControlType::HiSolar: // 'ONIFHIGHSOLARONWINDOW' + // ! Direct plus diffuse solar intensity on window + if (state.dataEnvrn->SunIsUp) { + if (SolarOnWindow > SetPoint && SchedAllowsControl) { + shadingOn = true; + } else if (GlareControlIsActive) { + shadingOffButGlareControlOn = true; + } + } + break; - } else if (SELECT_CASE_var == WSCT_OnIfScheduled) { // 'ONIFSCHEDULEALLOWS' - if (SchedAllowsControl) SurfWinShadingFlag(ISurf) = ShType; + case WindowShadingControlType::HiHorzSolar: // 'ONIFHIGHHORIZONTALSOLAR' ! Direct plus diffuse exterior horizontal solar intensity + if (state.dataEnvrn->SunIsUp) { + if (HorizSolar > SetPoint && SchedAllowsControl) { + shadingOn = true; + } else if (GlareControlIsActive) { + shadingOffButGlareControlOn = true; + } + } + break; - } else if (SELECT_CASE_var == WSCT_HiSolar) { - // 'ONIFHIGHSOLARONWINDOW' ! Direct plus diffuse solar intensity on window - if (state.dataEnvrn->SunIsUp) { - if (SolarOnWindow > SetPoint && SchedAllowsControl) { - SurfWinShadingFlag(ISurf) = ShType; + case WindowShadingControlType::HiOutAirTemp: // 'OnIfHighOutdoorAirTemperature' + if (Surface(ISurf).OutDryBulbTemp > SetPoint && SchedAllowsControl) { + shadingOn = true; } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; + shadingOffButGlareControlOn = true; } - } + break; - } else if (SELECT_CASE_var == WSCT_HiHorzSolar) { - // 'ONIFHIGHHORIZONTALSOLAR' ! Direct plus diffuse exterior horizontal solar intensity - if (state.dataEnvrn->SunIsUp) { - if (HorizSolar > SetPoint && SchedAllowsControl) { - SurfWinShadingFlag(ISurf) = ShType; + case WindowShadingControlType::HiZoneAirTemp: // 'OnIfHighZoneAirTemperature' ! Previous time step zone air temperature + if (MAT(IZone) > SetPoint && SchedAllowsControl) { + shadingOn = true; } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; + shadingOffButGlareControlOn = true; } - } + break; - } else if (SELECT_CASE_var == WSCT_HiOutAirTemp) { // 'OnIfHighOutdoorAirTemperature' - if (Surface(ISurf).OutDryBulbTemp > SetPoint && SchedAllowsControl) { - SurfWinShadingFlag(ISurf) = ShType; - } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; - } + case WindowShadingControlType::OnHiOutTemp_HiSolarWindow: // 'OnIfHighOutdoorAirTempAndHighSolarOnWindow' ! Outside air temp and solar on window + if (state.dataEnvrn->SunIsUp) { + if (Surface(ISurf).OutDryBulbTemp > SetPoint && SolarOnWindow > SetPoint2 && SchedAllowsControl) { + shadingOn = true; + } else if (GlareControlIsActive) { + shadingOffButGlareControlOn = true; + } + } + break; - } else if (SELECT_CASE_var == WSCT_HiZoneAirTemp) { - // 'OnIfHighZoneAirTemperature' ! Previous time step zone air temperature - if (MAT(IZone) > SetPoint && SchedAllowsControl) { - SurfWinShadingFlag(ISurf) = ShType; - } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; - } + case WindowShadingControlType::OnHiOutTemp_HiHorzSolar: // 'OnIfHighOutdoorAirTempAndHighHorizontalSolar' ! Outside air temp and horizontal solar + if (state.dataEnvrn->SunIsUp) { + if (Surface(ISurf).OutDryBulbTemp > SetPoint && HorizSolar > SetPoint2 && SchedAllowsControl) { + shadingOn = true; + } else if (GlareControlIsActive) { + shadingOffButGlareControlOn = true; + } + } + break; - } else if (SELECT_CASE_var == WSCT_OnHiOutTemp_HiSolarWindow) { - // 'OnIfHighOutdoorAirTempAndHighSolarOnWindow' ! Outside air temp and solar on window - if (state.dataEnvrn->SunIsUp) { - if (Surface(ISurf).OutDryBulbTemp > SetPoint && SolarOnWindow > SetPoint2 && - SchedAllowsControl) { - SurfWinShadingFlag(ISurf) = ShType; - } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; + case WindowShadingControlType::OnHiZoneTemp_HiSolarWindow: // 'ONIFHIGHZONEAIRTEMPANDHIGHSOLARONWINDOW' ! Zone air temp and solar on window + if (state.dataEnvrn->SunIsUp) { + if (MAT(IZone) > SetPoint && SolarOnWindow > SetPoint2 && SchedAllowsControl) { + shadingOn = true; + } else if (GlareControlIsActive) { + shadingOffButGlareControlOn = true; + } } - } + break; - } else if (SELECT_CASE_var == WSCT_OnHiOutTemp_HiHorzSolar) { - // 'OnIfHighOutdoorAirTempAndHighHorizontalSolar' ! Outside air temp and horizontal solar - if (state.dataEnvrn->SunIsUp) { - if (Surface(ISurf).OutDryBulbTemp > SetPoint && HorizSolar > SetPoint2 && - SchedAllowsControl) { - SurfWinShadingFlag(ISurf) = ShType; - } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; + case WindowShadingControlType::OnHiZoneTemp_HiHorzSolar: // 'ONIFHIGHZONEAIRTEMPANDHIGHHORIZONTALSOLAR' ! Zone air temp and horizontal solar + if (state.dataEnvrn->SunIsUp) { + if (MAT(IZone) > SetPoint && HorizSolar > SetPoint2 && SchedAllowsControl) { + shadingOn = true; + } else if (GlareControlIsActive) { + shadingOffButGlareControlOn = true; + } } - } + break; - } else if (SELECT_CASE_var == WSCT_OnHiZoneTemp_HiSolarWindow) { - // 'ONIFHIGHZONEAIRTEMPANDHIGHSOLARONWINDOW' ! Zone air temp and solar on window - if (state.dataEnvrn->SunIsUp) { - if (MAT(IZone) > SetPoint && SolarOnWindow > SetPoint2 && SchedAllowsControl) { - SurfWinShadingFlag(ISurf) = ShType; - } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; + case WindowShadingControlType::HiZoneCooling: + // 'ONIFHIGHZONECOOLING' ! Previous time step zone sensible cooling rate [W] + // In the following, the check on BeginSimFlag is needed since SNLoadCoolRate (and SNLoadHeatRate, + // used in other CASEs) are not allocated at this point for the first time step of the simulation. + if (!state.dataGlobal->BeginSimFlag) { + if (SNLoadCoolRate(IZone) > SetPoint && SchedAllowsControl) { + shadingOn = true; + } else if (GlareControlIsActive) { + shadingOffButGlareControlOn = true; + } } - } + break; - } else if (SELECT_CASE_var == WSCT_OnHiZoneTemp_HiHorzSolar) { - // 'ONIFHIGHZONEAIRTEMPANDHIGHHORIZONTALSOLAR' ! Zone air temp and horizontal solar - if (state.dataEnvrn->SunIsUp) { - if (MAT(IZone) > SetPoint && HorizSolar > SetPoint2 && SchedAllowsControl) { - SurfWinShadingFlag(ISurf) = ShType; - } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; + case WindowShadingControlType::HiGlare: + // 'ONIFHIGHGLARE' ! Daylight glare index at first reference point in the zone. + // This type of shading control is done in DayltgInteriorIllum. Glare control is not affected + // by control schedule. + if (state.dataEnvrn->SunIsUp) { + shadingOffButGlareControlOn = true; } - } + break; - } else if (SELECT_CASE_var == WSCT_HiZoneCooling) { - // 'ONIFHIGHZONECOOLING' ! Previous time step zone sensible cooling rate [W] - // In the following, the check on BeginSimFlag is needed since SNLoadCoolRate (and SNLoadHeatRate, - // used in other CASEs) are not allocated at this point for the first time step of the simulation. - if (!state.dataGlobal->BeginSimFlag) { - if (SNLoadCoolRate(IZone) > SetPoint && SchedAllowsControl) { - SurfWinShadingFlag(ISurf) = ShType; - } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; + case WindowShadingControlType::MeetDaylIlumSetp: + // 'MEETDAYLIGHTILLUMINANCESETPOINT') ! Daylight illuminance test is done in DayltgInteriorIllum + // Only switchable glazing does daylight illuminance control + if (state.dataEnvrn->SunIsUp && SchedAllowsControl) { + shadingOffButGlareControlOn = true; } - } + break; - } else if (SELECT_CASE_var == WSCT_HiGlare) { - // 'ONIFHIGHGLARE' ! Daylight glare index at first reference point in the zone. - // This type of shading control is done in DayltgInteriorIllum. Glare control is not affected - // by control schedule. - if (state.dataEnvrn->SunIsUp) SurfWinShadingFlag(ISurf) = 10 * ShType; + case WindowShadingControlType::OnNightLoOutTemp_OffDay: // 'OnNightIfLowOutdoorTempAndOffDay' + if (!state.dataEnvrn->SunIsUp && Surface(ISurf).OutDryBulbTemp < SetPoint && SchedAllowsControl) { + shadingOn = true; + } else if (GlareControlIsActive) { + shadingOffButGlareControlOn = true; + } + break; - } else if (SELECT_CASE_var == WSCT_MeetDaylIlumSetp) { - // 'MEETDAYLIGHTILLUMINANCESETPOINT') ! Daylight illuminance test is done in DayltgInteriorIllum - // Only switchable glazing does daylight illuminance control - if (state.dataEnvrn->SunIsUp && SchedAllowsControl) SurfWinShadingFlag(ISurf) = GlassConditionallyLightened; + case WindowShadingControlType::OnNightLoInTemp_OffDay: // 'OnNightIfLowInsideTempAndOffDay') + if (!state.dataEnvrn->SunIsUp && MAT(IZone) < SetPoint && SchedAllowsControl) { + shadingOn = true; + } else if (GlareControlIsActive) { + shadingOffButGlareControlOn = true; + } + break; - } else if (SELECT_CASE_var == WSCT_OnNightLoOutTemp_OffDay) { // 'OnNightIfLowOutdoorTempAndOffDay' - if (!state.dataEnvrn->SunIsUp && Surface(ISurf).OutDryBulbTemp < SetPoint && SchedAllowsControl) { - SurfWinShadingFlag(ISurf) = ShType; - } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; - } + case WindowShadingControlType::OnNightIfHeating_OffDay: // 'OnNightIfHeatingAndOffDay' + if (!state.dataGlobal->BeginSimFlag) { + if (!state.dataEnvrn->SunIsUp && SNLoadHeatRate(IZone) > SetPoint && SchedAllowsControl) { + shadingOn = true; + } else if (GlareControlIsActive) { + shadingOffButGlareControlOn = true; + } + } + break; - } else if (SELECT_CASE_var == WSCT_OnNightLoInTemp_OffDay) { // 'OnNightIfLowInsideTempAndOffDay') - if (!state.dataEnvrn->SunIsUp && MAT(IZone) < SetPoint && SchedAllowsControl) { - SurfWinShadingFlag(ISurf) = ShType; - } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; - } + case WindowShadingControlType::OnNightLoOutTemp_OnDayCooling: // 'OnNightIfLowOutdoorTempAndOnDayIfCooling' + if (!state.dataGlobal->BeginSimFlag) { + if (!state.dataEnvrn->SunIsUp) { // Night + if (Surface(ISurf).OutDryBulbTemp < SetPoint && SchedAllowsControl) + shadingOn = true; + } else { // Day + if (SNLoadCoolRate(IZone) > 0.0 && SchedAllowsControl) { + shadingOn = true; + } else if (GlareControlIsActive) { + shadingOffButGlareControlOn = true; + } + } + } + break; - } else if (SELECT_CASE_var == WSCT_OnNightIfHeating_OffDay) { // 'OnNightIfHeatingAndOffDay' - if (!state.dataGlobal->BeginSimFlag) { - if (!state.dataEnvrn->SunIsUp && SNLoadHeatRate(IZone) > SetPoint && SchedAllowsControl) { - SurfWinShadingFlag(ISurf) = ShType; - } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; + case WindowShadingControlType::OnNightIfHeating_OnDayCooling: // 'OnNightIfHeatingAndOnDayIfCooling' + if (!state.dataGlobal->BeginSimFlag) { + if (!state.dataEnvrn->SunIsUp) { // Night + if (SNLoadHeatRate(IZone) > SetPoint && SchedAllowsControl) + shadingOn = true; + } else { // Day + if (SNLoadCoolRate(IZone) > 0.0 && SchedAllowsControl) { + shadingOn = true; + } else if (GlareControlIsActive) { + shadingOffButGlareControlOn = true; + } + } } - } + break; - } else if (SELECT_CASE_var == WSCT_OnNightLoOutTemp_OnDayCooling) { - // 'OnNightIfLowOutdoorTempAndOnDayIfCooling' - if (!state.dataGlobal->BeginSimFlag) { - if (!state.dataEnvrn->SunIsUp) { // Night - if (Surface(ISurf).OutDryBulbTemp < SetPoint && SchedAllowsControl) - SurfWinShadingFlag(ISurf) = ShType; - } else { // Day - if (SNLoadCoolRate(IZone) > 0.0 && SchedAllowsControl) { - SurfWinShadingFlag(ISurf) = ShType; + case WindowShadingControlType::OffNight_OnDay_HiSolarWindow: // 'OffNightAndOnDayIfCoolingAndHighSolarOnWindow' + if (!state.dataGlobal->BeginSimFlag) { + if (state.dataEnvrn->SunIsUp && SNLoadCoolRate(IZone) > 0.0 && SchedAllowsControl) { + if (SolarOnWindow > SetPoint) shadingOn = true; } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; + shadingOffButGlareControlOn = true; } } - } + break; - } else if (SELECT_CASE_var == - WSCT_OnNightIfHeating_OnDayCooling) { // 'OnNightIfHeatingAndOnDayIfCooling' - if (!state.dataGlobal->BeginSimFlag) { - if (!state.dataEnvrn->SunIsUp) { // Night - if (SNLoadHeatRate(IZone) > SetPoint && SchedAllowsControl) - SurfWinShadingFlag(ISurf) = ShType; - } else { // Day - if (SNLoadCoolRate(IZone) > 0.0 && SchedAllowsControl) { - SurfWinShadingFlag(ISurf) = ShType; + case WindowShadingControlType::OnNight_OnDay_HiSolarWindow: // 'OnNightAndOnDayIfCoolingAndHighSolarOnWindow' + if (!state.dataGlobal->BeginSimFlag) { + if (state.dataEnvrn->SunIsUp && SNLoadCoolRate(IZone) > 0.0 && SchedAllowsControl) { + if (SolarOnWindow > SetPoint) shadingOn = true; + } else if (!state.dataEnvrn->SunIsUp && SchedAllowsControl) { + shadingOn = true; } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; + shadingOffButGlareControlOn = true; } } - } + break; + default: + ShowWarningError(state, "Invalid Selection of Window Shading Control Type for Surface " + + Surface(ISurf).Name); + } - } else if (SELECT_CASE_var == - WSCT_OffNight_OnDay_HiSolarWindow) { // 'OffNightAndOnDayIfCoolingAndHighSolarOnWindow' - if (!state.dataGlobal->BeginSimFlag) { - if (state.dataEnvrn->SunIsUp && SNLoadCoolRate(IZone) > 0.0 && SchedAllowsControl) { - if (SolarOnWindow > SetPoint) SurfWinShadingFlag(ISurf) = ShType; - } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; - } - } + WinShadingType ShType = WindowShadingControl(IShadingCtrl).ShadingType; - } else if (SELECT_CASE_var == - WSCT_OnNight_OnDay_HiSolarWindow) { // 'OnNightAndOnDayIfCoolingAndHighSolarOnWindow' - if (!state.dataGlobal->BeginSimFlag) { - if (state.dataEnvrn->SunIsUp && SNLoadCoolRate(IZone) > 0.0 && SchedAllowsControl) { - if (SolarOnWindow > SetPoint) SurfWinShadingFlag(ISurf) = ShType; - } else if (!state.dataEnvrn->SunIsUp && SchedAllowsControl) { - SurfWinShadingFlag(ISurf) = ShType; - } else if (GlareControlIsActive) { - SurfWinShadingFlag(ISurf) = 10 * ShType; - } + SurfWinShadingFlag(ISurf) = WinShadingType::ShadeOff; // Initialize shading flag to off + + if (IS_SHADED(ShType)) { + if (shadingOn) { + SurfWinShadingFlag(ISurf) = ShType; + } else if (shadingOffButGlareControlOn) { + if (ShType == WinShadingType::SwitchableGlazing) SurfWinShadingFlag(ISurf) = WinShadingType::GlassConditionallyLightened; + else if (ShType == WinShadingType::IntShade) SurfWinShadingFlag(ISurf) = WinShadingType::IntShadeConditionallyOff; + else if (ShType == WinShadingType::ExtShade) SurfWinShadingFlag(ISurf) = WinShadingType::ExtShadeConditionallyOff; + else if (ShType == WinShadingType::IntBlind) SurfWinShadingFlag(ISurf) = WinShadingType::IntBlindConditionallyOff; + else if (ShType == WinShadingType::ExtBlind) SurfWinShadingFlag(ISurf) = WinShadingType::ExtBlindConditionallyOff; + else if (ShType == WinShadingType::BGShade) SurfWinShadingFlag(ISurf) = WinShadingType::BGShadeConditionallyOff; + else if (ShType == WinShadingType::BGBlind) SurfWinShadingFlag(ISurf) = WinShadingType::BGBlindConditionallyOff; } } // Set switching factor to fully switched if ShadingFlag = 2 - if (SurfWinShadingFlag(ISurf) == SwitchableGlazing) { + if (SurfWinShadingFlag(ISurf) == WinShadingType::SwitchableGlazing) { SurfWinSwitchingFactor(ISurf) = 1.0; // Added TH 1/20/2010 @@ -9005,9 +8999,10 @@ namespace SolarShading { SurfWinSlatAngThisTS(ISurf) = 0.0; SurfWinSlatAngThisTSDeg(ISurf) = 0.0; SurfWinSlatsBlockBeam(ISurf) = false; - if (SurfWinShadingFlag(ISurf) == IntBlindOn || SurfWinShadingFlag(ISurf) == 10 * IntBlindOn || - SurfWinShadingFlag(ISurf) == ExtBlindOn || SurfWinShadingFlag(ISurf) == 10 * ExtBlindOn || - SurfWinShadingFlag(ISurf) == BGBlindOn || SurfWinShadingFlag(ISurf) == 10 * BGBlindOn) { + if (ANY_BLIND(SurfWinShadingFlag(ISurf)) || + SurfWinShadingFlag(ISurf) == WinShadingType::IntBlindConditionallyOff || + SurfWinShadingFlag(ISurf) == WinShadingType::ExtBlindConditionallyOff || + SurfWinShadingFlag(ISurf) == WinShadingType::BGBlindConditionallyOff) { // Blind in place or may be in place due to glare control int BlNum = SurfWinBlindNumber(ISurf); if (BlNum > 0) { @@ -9138,19 +9133,68 @@ namespace SolarShading { } // End of check if interior or exterior blind in place // CALL CalcScreenTransmittance to intialized all screens prior to HB calc's - if (SurfWinShadingFlag(ISurf) == ExtScreenOn && state.dataEnvrn->SunIsUp) { + if (SurfWinShadingFlag(ISurf) == WinShadingType::ExtScreen && state.dataEnvrn->SunIsUp) { CalcScreenTransmittance(state, ISurf); } // EMS Actuator Point: override setting if ems flag on if (SurfWinShadingFlagEMSOn(ISurf)) { - SurfWinShadingFlag(ISurf) = SurfWinShadingFlagEMSValue(ISurf); + WinShadingType SurfWinShadingFlagEMS = findValueInEnumeration(SurfWinShadingFlagEMSValue(ISurf)); + if (SurfWinShadingFlagEMS != WinShadingType::INVALID) { + SurfWinShadingFlag(ISurf) = SurfWinShadingFlagEMS; + } else { + ShowWarningError(state, "Invalid EMS value of Window Shading Control Type for Surface " + + Surface(ISurf).Name); + } } - } // End of surface loop } } + DataSurfaces::WinShadingType findValueInEnumeration(Real64 controlValue) { + // This is a workaround to translate EMS Shading control numerical values + // EMS control of window shading devices involves setting the control values for shading control actuators with + // one of these values. The variable names can be used or replaced, it is the whole number values that trigger + // changes in the modeling. + // Shades and Blinds are either fully on or fully off, partial positions require multiple windows. + // the window shading control flag values follow + // -1: if window has no shading device + // 0: if shading device is off + // 1: if interior shade is on + // 2: if glazing is switched to darker state + // 3: if exterior shade is on + // 4: if exterior screen is on + // 6: if interior blind is on + // 7: if exterior blind is on + // 8: if between-glass shade is on + // 9: if between-glass blind is on + // 10: window has interior shade that is off but may be triggered on later to control daylight glare + // 20: window has switchable glazing that is unswitched but may be switched later to control daylight glare or daylight illuminance + // 30: window has exterior shade that is off but may be triggered on later to control daylight glare or daylight illuminance + // 60: window has interior blind that is off but may be triggered on later to control daylight glare or daylight illuminance + // 70: window has exterior blind that is off but may be triggered on later to control daylight glare or daylight illuminance + // 80: window has between-glass shade that is off but may be triggered on later to control daylight glare or daylight illuminance + // 90: window has between-glass blind that is off but may be triggered on later to control daylight glare or daylight illuminance + if (controlValue == -1.0) return WinShadingType::NoShade; + if (controlValue == 0.0) return WinShadingType::ShadeOff; + if (controlValue == 1.0) return WinShadingType::IntShade; + if (controlValue == 2.0) return WinShadingType::SwitchableGlazing; + if (controlValue == 3.0) return WinShadingType::ExtShade; + if (controlValue == 4.0) return WinShadingType::ExtScreen; + if (controlValue == 6.0) return WinShadingType::IntBlind; + if (controlValue == 7.0) return WinShadingType::ExtBlind; + if (controlValue == 8.0) return WinShadingType::BGShade; + if (controlValue == 9.0) return WinShadingType::BGBlind; + if (controlValue == 10.0) return WinShadingType::IntShadeConditionallyOff; + if (controlValue == 20.0) return WinShadingType::GlassConditionallyLightened; + if (controlValue == 30.0) return WinShadingType::ExtShadeConditionallyOff; + if (controlValue == 60.0) return WinShadingType::IntBlindConditionallyOff; + if (controlValue == 70.0) return WinShadingType::ExtBlindConditionallyOff; + if (controlValue == 80.0) return WinShadingType::BGShadeConditionallyOff; + if (controlValue == 90.0) return WinShadingType::BGBlindConditionallyOff; + return WinShadingType::INVALID; + } + int selectActiveWindowShadingControlIndex(EnergyPlusData &state, int curSurface) { // For a given surface, determine based on the schedules which index to the window shading control list vector should be active @@ -9868,7 +9912,7 @@ namespace SolarShading { // outside reveal surface (m2) Real64 BmSolRefldInsReveal; // Multiplied by beam solar gives beam solar reflected by horiz or vertical // inside reveal surface (m2) - int ShadeFlag; // Shading flag + WinShadingType ShadeFlag; // Shading flag int FrameDivNum; // Frame/Divider number Real64 FrameWidth; // Frame width (m) Real64 P1; // Frame outside/inside projection plus half of glazing thickness (m) @@ -9922,7 +9966,7 @@ namespace SolarShading { if (SurfWinInsideSillDepth(SurfNum) < SurfWinInsideReveal(SurfNum)) continue; ShadeFlag = SurfWinShadingFlag(SurfNum); - if (ShadeFlag == ExtShadeOn || ShadeFlag == ExtBlindOn) continue; + if (BITF_TEST_ANY(BITF(ShadeFlag), BITF(WinShadingType::ExtShade) | BITF(WinShadingType::ExtBlind))) continue; if (CosIncAng(state.dataGlobal->TimeStep, state.dataGlobal->HourOfDay, SurfNum) <= 0.0) continue; @@ -10177,12 +10221,12 @@ namespace SolarShading { // Quantities related to inside reveal; inside reveal reflection/absorption is assumed // to occur only if an interior shade or blind is not in place. - if (ShadeFlag <= 0 || ShadeFlag == SwitchableGlazing) { + if (NOT_SHADED(ShadeFlag) || ShadeFlag == WinShadingType::SwitchableGlazing) { if (A2ill > 1.0e-6) { DiffReflGlass = state.dataConstruction->Construct(ConstrNum).ReflectSolDiffBack; - if (ShadeFlag == SwitchableGlazing) { + if (ShadeFlag == WinShadingType::SwitchableGlazing) { SolTransGlassSh = POLYF(CosIncAng(state.dataGlobal->TimeStep, state.dataGlobal->HourOfDay, SurfNum), state.dataConstruction->Construct(ConstrNumSh).TransSolBeamCoef); SolTransGlass = InterpSw(SurfWinSwitchingFactor(SurfNum), SolTransGlass, @@ -10517,18 +10561,16 @@ namespace SolarShading { Real64 AbsorpEff = 0.0; // Effective absorptance of isolated shade layer (fraction of // of incident radiation remaining after reflected portion is // removed that is absorbed - if (WindowShadingControl(WinShadeCtrlNum).ShadingType == WSC_ST_InteriorShade || - WindowShadingControl(WinShadeCtrlNum).ShadingType == WSC_ST_ExteriorShade || - WindowShadingControl(WinShadeCtrlNum).ShadingType == WSC_ST_BetweenGlassShade) { + if (ANY_SHADE(WindowShadingControl(WinShadeCtrlNum).ShadingType)) { int ConstrNumSh = Surface(SurfNum).activeShadedConstruction; // Window construction number with shade int TotLay = state.dataConstruction->Construct(ConstrNumSh).TotLayers; // Total layers in a construction - if (WindowShadingControl(WinShadeCtrlNum).ShadingType == WSC_ST_InteriorShade) { + if (WindowShadingControl(WinShadeCtrlNum).ShadingType == WinShadingType::IntShade) { MatNumSh = state.dataConstruction->Construct(ConstrNumSh).LayerPoint(TotLay); // Interior shade - } else if (WindowShadingControl(WinShadeCtrlNum).ShadingType == WSC_ST_ExteriorShade) { + } else if (WindowShadingControl(WinShadeCtrlNum).ShadingType == WinShadingType::ExtShade) { MatNumSh = state.dataConstruction->Construct(ConstrNumSh).LayerPoint(1); // Exterior shade - } else if (WindowShadingControl(WinShadeCtrlNum).ShadingType == WSC_ST_BetweenGlassShade) { + } else if (WindowShadingControl(WinShadeCtrlNum).ShadingType == WinShadingType::BGShade) { if (state.dataConstruction->Construct(ConstrNumSh).TotGlassLayers == 2) { // Double pane with between-glass shade MatNumSh = state.dataConstruction->Construct(ConstrNumSh).LayerPoint(3); @@ -10765,10 +10807,10 @@ namespace SolarShading { ConstrNumSh = Surface(HeatTransSurfNum).activeStormWinShadedConstruction; } int TotGlassLayers = state.dataConstruction->Construct(ConstrNum).TotGlassLayers; - int ShadeFlag = SurfWinShadingFlag(HeatTransSurfNum); + WinShadingType ShadeFlag = SurfWinShadingFlag(HeatTransSurfNum); if (SurfWinWindowModelType(HeatTransSurfNum) != WindowEQLModel) { - if (ShadeFlag <= 0) { // No window shading + if (NOT_SHADED(ShadeFlag)) { // No window shading // Init accumulator for transmittance calc below DifSolarAbsW = 0.0; @@ -10859,7 +10901,52 @@ namespace SolarShading { // Accumulate transmitted diffuse solar for reporting SurfWinInitialDifSolInTrans(HeatTransSurfNum) += DifSolarTransW * per_HTSurfaceArea; - } else if (ConstrNumSh != 0 && (ShadeFlag == IntShadeOn || ShadeFlag >= 3)) { + } else if (ShadeFlag == WinShadingType::SwitchableGlazing) { // Switchable glazing + // Init accumulator for transmittance calc below + DifSolarAbsW = 0.0; + + auto const &construct(state.dataConstruction->Construct(ConstrNum)); + auto const &construct_AbsDiffBack(construct.AbsDiffBack); + auto const &construct_sh(state.dataConstruction->Construct(ConstrNumSh)); + auto const &construct_sh_AbsDiffBack(construct_sh.AbsDiffBack); + for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) { + // Calc diffuse solar absorbed in each window glass layer + WinDifSolLayAbsW = WinDifSolarTrans_Factor * + InterpSw(win_SwitchingFactor, construct_AbsDiffBack(IGlass), construct_sh_AbsDiffBack(IGlass)); + + // Accumulate distributed diffuse solar absorbed [W] by overall window for transmittance calc below + DifSolarAbsW += WinDifSolLayAbsW; + + // Accumulate Window and Zone total distributed diffuse solar to check for conservation of energy +// WinDifSolarDistAbsorbedTotl += WinDifSolLayAbsW; // debug +// ZoneDifSolarDistAbsorbedTotl += WinDifSolLayAbsW; // debug + + // Accumulate diffuse solar absorbed from the inside by each window glass layer [W/m2] for heat balance calcs + SurfWinInitialDifSolwinAbs(IGlass, HeatTransSurfNum) += WinDifSolLayAbsW * per_HTSurfaceArea; + } + + // Calc diffuse solar reflected back to zone + DifSolarReflW = WinDifSolarTrans_Factor * + InterpSw(win_SwitchingFactor, construct.ReflectSolDiffBack, construct_sh.ReflectSolDiffBack); + + // Accumulate total reflected distributed diffuse solar for each zone for subsequent interreflection calcs + InitialZoneDifSolReflW(enclosureNum) += DifSolarReflW; // [W] + + // Accumulate Window and Zone total distributed diffuse solar to check for conservation of energy +// WinDifSolarDistReflectedTotl += DifSolarReflW; // debug +// ZoneDifSolarDistReflectedTotl += DifSolarReflW; // debug + + // Accumulate transmitted Window and Zone total distributed diffuse solar to check for conservation of energy + // This is not very effective since it assigns whatever distributed diffuse solar has not been + // absorbed or reflected to transmitted. + DifSolarTransW = WinDifSolarTrans_Factor - DifSolarAbsW - DifSolarReflW; +// WinDifSolarDistTransmittedTotl += DifSolarTransW; // debug [W] +// ZoneDifSolarDistTransmittedTotl += DifSolarTransW; // debug [W] + + // Accumulate transmitted diffuse solar for reporting + SurfWinInitialDifSolInTrans(HeatTransSurfNum) += DifSolarTransW * per_HTSurfaceArea; + + } else if (ConstrNumSh != 0) { // Interior, exterior or between-glass shade, screen or blind in place // Init accumulator for transmittance calc below @@ -10871,12 +10958,10 @@ namespace SolarShading { auto const &construct_sh_AbsDiffBack(construct_sh.AbsDiffBack); auto const &construct_sh_BlAbsDiffBack(construct_sh.BlAbsDiffBack); for (int IGlass = 1; IGlass <= construct_sh.TotGlassLayers; ++IGlass) { - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || ShadeFlag == ExtScreenOn) { + if (ANY_SHADE_SCREEN(ShadeFlag)) { // Calc diffuse solar absorbed in each window glass layer and shade WinDifSolLayAbsW = WinDifSolarTrans_Factor * construct_sh_AbsDiffBack(IGlass); - } - - if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGBlindOn) { + } else if (ANY_BLIND(ShadeFlag)) { BlAbsDiffBk = InterpSlatAng(HTsurf_slat_ang, HTsurf_movable_slats, construct_sh_BlAbsDiffBack(_, IGlass)); // Calc diffuse solar absorbed in each window glass layer and shade WinDifSolLayAbsW = WinDifSolarTrans_Factor * BlAbsDiffBk; @@ -10896,7 +10981,7 @@ namespace SolarShading { // Next calc diffuse solar reflected back to zone from window with shade or blind on // Diffuse back solar reflectance, bare glass or shade on InsideDifReflectance = state.dataConstruction->Construct(ConstrNum).ReflectSolDiffBack; - if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn) { + if (BITF_TEST_ANY(BITF(ShadeFlag), BITF(WinShadingType::IntBlind) | BITF(WinShadingType::ExtBlind))) { // Diffuse back solar reflectance, blind present, vs. slat angle InsideDifReflectance = InterpSlatAng(HTsurf_slat_ang, HTsurf_movable_slats, state.dataConstruction->Construct(ConstrNum).BlReflectSolDiffBack); @@ -10912,18 +10997,18 @@ namespace SolarShading { // Now calc diffuse solar absorbed by shade/blind itself BlNum = SurfWinBlindNumber(HeatTransSurfNum); - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || ShadeFlag == ExtScreenOn) { + if (ANY_SHADE_SCREEN(ShadeFlag)) { // Calc diffuse solar absorbed by shade or screen [W] ShBlDifSolarAbsW = WinDifSolarTrans_Factor * construct_sh.AbsDiffBackShade; - } - if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGBlindOn) { + } else if (ANY_BLIND(ShadeFlag)) { // Calc diffuse solar absorbed by blind [W] AbsDiffBkBl = InterpSlatAng(HTsurf_slat_ang, HTsurf_movable_slats, construct_sh.AbsDiffBackBlind); ShBlDifSolarAbsW = WinDifSolarTrans_Factor * AbsDiffBkBl; } // Correct for divider shadowing - if (ShadeFlag == ExtShadeOn || ShadeFlag == ExtBlindOn || ShadeFlag == ExtScreenOn) + if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) { ShBlDifSolarAbsW *= SurfWinGlazedFrac(HeatTransSurfNum); + } // Accumulate diffuse solar absorbed by shade or screen [W/m2] for heat balance calcs SurfWinInitialDifSolAbsByShade(HeatTransSurfNum) += ShBlDifSolarAbsW * per_HTSurfaceArea; @@ -10944,52 +11029,6 @@ namespace SolarShading { // Accumulate transmitted diffuse solar for reporting SurfWinInitialDifSolInTrans(HeatTransSurfNum) += DifSolarTransW * per_HTSurfaceArea; - - } else if (ShadeFlag == SwitchableGlazing) { // Switchable glazing - // Init accumulator for transmittance calc below - DifSolarAbsW = 0.0; - - auto const &construct(state.dataConstruction->Construct(ConstrNum)); - auto const &construct_AbsDiffBack(construct.AbsDiffBack); - auto const &construct_sh(state.dataConstruction->Construct(ConstrNumSh)); - auto const &construct_sh_AbsDiffBack(construct_sh.AbsDiffBack); - for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) { - // Calc diffuse solar absorbed in each window glass layer - WinDifSolLayAbsW = WinDifSolarTrans_Factor * - InterpSw(win_SwitchingFactor, construct_AbsDiffBack(IGlass), construct_sh_AbsDiffBack(IGlass)); - - // Accumulate distributed diffuse solar absorbed [W] by overall window for transmittance calc below - DifSolarAbsW += WinDifSolLayAbsW; - - // Accumulate Window and Zone total distributed diffuse solar to check for conservation of energy -// WinDifSolarDistAbsorbedTotl += WinDifSolLayAbsW; // debug -// ZoneDifSolarDistAbsorbedTotl += WinDifSolLayAbsW; // debug - - // Accumulate diffuse solar absorbed from the inside by each window glass layer [W/m2] for heat balance calcs - SurfWinInitialDifSolwinAbs(IGlass, HeatTransSurfNum) += WinDifSolLayAbsW * per_HTSurfaceArea; - } - - // Calc diffuse solar reflected back to zone - DifSolarReflW = WinDifSolarTrans_Factor * - InterpSw(win_SwitchingFactor, construct.ReflectSolDiffBack, construct_sh.ReflectSolDiffBack); - - // Accumulate total reflected distributed diffuse solar for each zone for subsequent interreflection calcs - InitialZoneDifSolReflW(enclosureNum) += DifSolarReflW; // [W] - - // Accumulate Window and Zone total distributed diffuse solar to check for conservation of energy -// WinDifSolarDistReflectedTotl += DifSolarReflW; // debug -// ZoneDifSolarDistReflectedTotl += DifSolarReflW; // debug - - // Accumulate transmitted Window and Zone total distributed diffuse solar to check for conservation of energy - // This is not very effective since it assigns whatever distributed diffuse solar has not been - // absorbed or reflected to transmitted. - DifSolarTransW = WinDifSolarTrans_Factor - DifSolarAbsW - DifSolarReflW; -// WinDifSolarDistTransmittedTotl += DifSolarTransW; // debug [W] -// ZoneDifSolarDistTransmittedTotl += DifSolarTransW; // debug [W] - - // Accumulate transmitted diffuse solar for reporting - SurfWinInitialDifSolInTrans(HeatTransSurfNum) += DifSolarTransW * per_HTSurfaceArea; - } // End of shading flag check } else { @@ -11098,7 +11137,7 @@ namespace SolarShading { // IF(ShadeFlag == IntShadeOn) THEN // MatNumSh = Construct(ConstrNumSh)%LayerPoint(Construct(ConstrNumSh)%TotLayers) // DividerSolAbs = DividerSolAbs * dataMaterial.Material(MatNumSh)%Trans - // ELSE IF(ShadeFlag == IntBlindOn) THEN + // ELSE IF(ShadeFlag == WinShadingType::IntBlind) THEN // DividerSolAbs = DividerSolAbs * InterpSlatAng(SurfaceWindow(HeatTransSurfNum)%SlatAngThisTS, & // SurfaceWindow(HeatTransSurfNum)%MovableSlats,Blind(BlNum)%SolBackDiffDiffTrans) // END IF @@ -11177,7 +11216,7 @@ namespace SolarShading { int ConstrNumSh; // Shaded construction number int IGlass; // Glass layer counter int TotGlassLayers; // Number of glass layers in a window construction - int ShadeFlag; // Shading flag + WinShadingType ShadeFlag; // Shading flag Real64 AbsInt; // Tmp var for Inside surface short-wave absorptance Real64 MovInsulSchedVal; // Value of the movable insulation schedule for current time Real64 HMovInsul; // Conductance of movable insulation @@ -11309,7 +11348,7 @@ namespace SolarShading { TotGlassLayers = state.dataConstruction->Construct(ConstrNum).TotGlassLayers; ShadeFlag = SurfWinShadingFlag(HeatTransSurfNum); - if (ShadeFlag <= 0) { // No window shading + if (NOT_SHADED(ShadeFlag)) { // No window shading // Init accumulator for transmittance calc below DifSolarAbsW = 0.0; @@ -11379,7 +11418,49 @@ namespace SolarShading { InitialZoneDifSolReflW(Surface(AdjSurfNum).SolarEnclIndex) += DifSolarTransW; // [W] } - } else if (ShadeFlag == IntShadeOn || ShadeFlag >= 3) { + } else if (ShadeFlag == WinShadingType::SwitchableGlazing) { // Switchable glazing + // Init accumulator for transmittance calc below + DifSolarAbsW = 0.0; + + for (IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) { + // Calc diffuse solar absorbed in each window glass layer + WinDifSolLayAbsW = SolarTrans_ViewFactor * InterpSw(SurfWinSwitchingFactor(HeatTransSurfNum), + state.dataConstruction->Construct(ConstrNum).AbsDiffBack(IGlass), + state.dataConstruction->Construct(ConstrNumSh).AbsDiffBack(IGlass)); + + // Accumulate distributed diffuse solar absorbed [W] by overall window for transmittance calc below + DifSolarAbsW += WinDifSolLayAbsW; + + // Accumulate diffuse solar absorbed from the inside by each window glass layer [W/m2] for heat balance calcs + SurfWinInitialDifSolwinAbs(IGlass, HeatTransSurfNum) += (WinDifSolLayAbsW / Surface(HeatTransSurfNum).Area); + } + // Accumulate Window and Zone total distributed diffuse solar to check for conservation of energy + // WinDifSolarDistAbsorbedTotl += DifSolarAbsW; // debug + // ZoneDifSolarDistAbsorbedTotl += DifSolarAbsW; // debug + + // Calc diffuse solar reflected back to zone + DifSolarReflW = SolarTrans_ViewFactor * InterpSw(SurfWinSwitchingFactor(HeatTransSurfNum), + state.dataConstruction->Construct(ConstrNum).ReflectSolDiffBack, + state.dataConstruction->Construct(ConstrNumSh).ReflectSolDiffBack); + + // Accumulate total reflected distributed diffuse solar for each zone for subsequent interreflection calcs + InitialZoneDifSolReflW_zone += DifSolarReflW; // [W] + + // Accumulate Window and Zone total distributed diffuse solar to check for conservation of energy + // WinDifSolarDistReflectedTotl += DifSolarReflW; // debug + // ZoneDifSolarDistReflectedTotl += DifSolarReflW; // debug + + // Accumulate transmitted Window and Zone total distributed diffuse solar to check for conservation of energy + // This is not very effective since it assigns whatever distributed diffuse solar has not been + // absorbed or reflected to transmitted. + DifSolarTransW = SolarTrans_ViewFactor - DifSolarAbsW - DifSolarReflW; + // WinDifSolarDistTransmittedTotl += DifSolarTransW; // debug [W] + // ZoneDifSolarDistTransmittedTotl += DifSolarTransW; // debug [W] + + // Accumulate transmitted diffuse solar for reporting + SurfWinInitialDifSolInTrans(HeatTransSurfNum) += (DifSolarTransW / Surface(HeatTransSurfNum).Area); + + } else { // Interior, exterior or between-glass shade, screen or blind in place // Init accumulator for transmittance calc below @@ -11388,12 +11469,10 @@ namespace SolarShading { // First calc diffuse solar absorbed by each glass layer in this window with shade/blind in place for (IGlass = 1; IGlass <= state.dataConstruction->Construct(ConstrNumSh).TotGlassLayers; ++IGlass) { - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || ShadeFlag == ExtScreenOn) { + if (ANY_SHADE_SCREEN(ShadeFlag)) { // Calc diffuse solar absorbed in each window glass layer and shade WinDifSolLayAbsW = SolarTrans_ViewFactor * state.dataConstruction->Construct(ConstrNumSh).AbsDiffBack(IGlass); - } - - if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGBlindOn) { + } else if (ANY_BLIND(ShadeFlag)) { BlAbsDiffBk = InterpSlatAng(SurfWinSlatAngThisTS(HeatTransSurfNum), SurfWinMovableSlats(HeatTransSurfNum), state.dataConstruction->Construct(ConstrNumSh).BlAbsDiffBack(_, IGlass)); @@ -11414,7 +11493,7 @@ namespace SolarShading { // Next calc diffuse solar reflected back to zone from window with shade or blind on // Diffuse back solar reflectance, bare glass or shade on InsideDifReflectance = state.dataConstruction->Construct(ConstrNum).ReflectSolDiffBack; - if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn) { + if (BITF_TEST_ANY(BITF(ShadeFlag), BITF(WinShadingType::IntBlind) | BITF(WinShadingType::ExtBlind))) { // Diffuse back solar reflectance, blind present, vs. slat angle InsideDifReflectance = InterpSlatAng(SurfWinSlatAngThisTS(HeatTransSurfNum), SurfWinMovableSlats(HeatTransSurfNum), @@ -11431,11 +11510,10 @@ namespace SolarShading { // Now calc diffuse solar absorbed by shade/blind itself BlNum = SurfWinBlindNumber(HeatTransSurfNum); - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || ShadeFlag == ExtScreenOn) { + if (ANY_SHADE_SCREEN(ShadeFlag)) { // Calc diffuse solar absorbed by shade or screen [W] ShBlDifSolarAbsW = SolarTrans_ViewFactor * state.dataConstruction->Construct(ConstrNumSh).AbsDiffBackShade; - } - if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGBlindOn) { + } else if (ANY_BLIND(ShadeFlag)) { // Calc diffuse solar absorbed by blind [W] AbsDiffBkBl = InterpSlatAng(SurfWinSlatAngThisTS(HeatTransSurfNum), SurfWinMovableSlats(HeatTransSurfNum), @@ -11443,8 +11521,9 @@ namespace SolarShading { ShBlDifSolarAbsW = SolarTrans_ViewFactor * AbsDiffBkBl; } // Correct for divider shadowing - if (ShadeFlag == ExtShadeOn || ShadeFlag == ExtBlindOn || ShadeFlag == ExtScreenOn) + if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) { ShBlDifSolarAbsW *= SurfWinGlazedFrac(HeatTransSurfNum); + } // Accumulate diffuse solar absorbed by shade or screen [W/m2] for heat balance calcs SurfWinInitialDifSolAbsByShade(HeatTransSurfNum) += (ShBlDifSolarAbsW / Surface(HeatTransSurfNum).Area); @@ -11466,48 +11545,6 @@ namespace SolarShading { // Accumulate transmitted diffuse solar for reporting SurfWinInitialDifSolInTrans(HeatTransSurfNum) += (DifSolarTransW / Surface(HeatTransSurfNum).Area); - } else if (ShadeFlag == SwitchableGlazing) { // Switchable glazing - // Init accumulator for transmittance calc below - DifSolarAbsW = 0.0; - - for (IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) { - // Calc diffuse solar absorbed in each window glass layer - WinDifSolLayAbsW = SolarTrans_ViewFactor * InterpSw(SurfWinSwitchingFactor(HeatTransSurfNum), - state.dataConstruction->Construct(ConstrNum).AbsDiffBack(IGlass), - state.dataConstruction->Construct(ConstrNumSh).AbsDiffBack(IGlass)); - - // Accumulate distributed diffuse solar absorbed [W] by overall window for transmittance calc below - DifSolarAbsW += WinDifSolLayAbsW; - - // Accumulate diffuse solar absorbed from the inside by each window glass layer [W/m2] for heat balance calcs - SurfWinInitialDifSolwinAbs(IGlass, HeatTransSurfNum) += (WinDifSolLayAbsW / Surface(HeatTransSurfNum).Area); - } - // Accumulate Window and Zone total distributed diffuse solar to check for conservation of energy - // WinDifSolarDistAbsorbedTotl += DifSolarAbsW; // debug - // ZoneDifSolarDistAbsorbedTotl += DifSolarAbsW; // debug - - // Calc diffuse solar reflected back to zone - DifSolarReflW = SolarTrans_ViewFactor * InterpSw(SurfWinSwitchingFactor(HeatTransSurfNum), - state.dataConstruction->Construct(ConstrNum).ReflectSolDiffBack, - state.dataConstruction->Construct(ConstrNumSh).ReflectSolDiffBack); - - // Accumulate total reflected distributed diffuse solar for each zone for subsequent interreflection calcs - InitialZoneDifSolReflW_zone += DifSolarReflW; // [W] - - // Accumulate Window and Zone total distributed diffuse solar to check for conservation of energy - // WinDifSolarDistReflectedTotl += DifSolarReflW; // debug - // ZoneDifSolarDistReflectedTotl += DifSolarReflW; // debug - - // Accumulate transmitted Window and Zone total distributed diffuse solar to check for conservation of energy - // This is not very effective since it assigns whatever distributed diffuse solar has not been - // absorbed or reflected to transmitted. - DifSolarTransW = SolarTrans_ViewFactor - DifSolarAbsW - DifSolarReflW; - // WinDifSolarDistTransmittedTotl += DifSolarTransW; // debug [W] - // ZoneDifSolarDistTransmittedTotl += DifSolarTransW; // debug [W] - - // Accumulate transmitted diffuse solar for reporting - SurfWinInitialDifSolInTrans(HeatTransSurfNum) += (DifSolarTransW / Surface(HeatTransSurfNum).Area); - } // End of shading flag check // HERE 8/14/07 Ignore absorptance and reflectance of Frames and Dividers for now. @@ -11532,7 +11569,7 @@ namespace SolarShading { // IF(ShadeFlag == IntShadeOn) THEN // MatNumSh = Construct(ConstrNumSh)%LayerPoint(Construct(ConstrNumSh)%TotLayers) // DividerSolAbs = DividerSolAbs * dataMaterial.Material(MatNumSh)%Trans - // ELSE IF(ShadeFlag == IntBlindOn) THEN + // ELSE IF(ShadeFlag == WinShadingType::IntBlind) THEN // DividerSolAbs = DividerSolAbs * InterpSlatAng(SurfaceWindow(HeatTransSurfNum)%SlatAngThisTS, & // SurfaceWindow(HeatTransSurfNum)%MovableSlats,Blind(BlNum)%SolBackDiffDiffTrans) // END IF diff --git a/src/EnergyPlus/SolarShading.hh b/src/EnergyPlus/SolarShading.hh index 2949c3cb6eb..12ea05acb1c 100644 --- a/src/EnergyPlus/SolarShading.hh +++ b/src/EnergyPlus/SolarShading.hh @@ -273,6 +273,8 @@ namespace SolarShading { void WindowShadingManager(EnergyPlusData &state); + DataSurfaces::WinShadingType findValueInEnumeration(Real64 controlValue); + int selectActiveWindowShadingControlIndex(EnergyPlusData &state, int curSurface); void WindowGapAirflowControl(EnergyPlusData &state); diff --git a/src/EnergyPlus/SteamBaseboardRadiator.cc b/src/EnergyPlus/SteamBaseboardRadiator.cc index 01472dabf71..4612bef838c 100644 --- a/src/EnergyPlus/SteamBaseboardRadiator.cc +++ b/src/EnergyPlus/SteamBaseboardRadiator.cc @@ -1444,7 +1444,7 @@ namespace SteamBaseboardRadiator { Area = Surface(SurfNum).Area; if (Surface(SurfNum).Class == SurfaceClass::Window) { - if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // The area is the shade or blind area = the sum of the glazing area and the divider area (which is zero if no divider) Area += SurfWinDividerArea(SurfNum); } @@ -1455,8 +1455,7 @@ namespace SteamBaseboardRadiator { SurfWinFrameTempSurfIn(SurfNum); } - if (SurfWinDividerArea(SurfNum) > 0.0 && SurfWinShadingFlag(SurfNum) != IntShadeOn && - SurfWinShadingFlag(SurfNum) != IntBlindOn) { + if (SurfWinDividerArea(SurfNum) > 0.0 && !ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) SumHATsurf += HConvIn(SurfNum) * SurfWinDividerArea(SurfNum) * (1.0 + 2.0 * SurfWinProjCorrDivIn(SurfNum)) * SurfWinDividerTempSurfIn(SurfNum); diff --git a/src/EnergyPlus/SurfaceGeometry.cc b/src/EnergyPlus/SurfaceGeometry.cc index ff91ab8c057..19d3e9e5cad 100644 --- a/src/EnergyPlus/SurfaceGeometry.cc +++ b/src/EnergyPlus/SurfaceGeometry.cc @@ -159,13 +159,13 @@ namespace SurfaceGeometry { SurfWinProfileAngHor.dimension(NumSurfaces, 0); SurfWinProfileAngVert.dimension(NumSurfaces, 0); - SurfWinShadingFlag.dimension(NumSurfaces, 0); + SurfWinShadingFlag.dimension(NumSurfaces, WinShadingType::ShadeOff); SurfWinShadingFlagEMSOn.dimension(NumSurfaces, 0); - SurfWinShadingFlagEMSValue.dimension(NumSurfaces, 0); + SurfWinShadingFlagEMSValue.dimension(NumSurfaces, 0.0); SurfWinStormWinFlag.dimension(NumSurfaces, 0); SurfWinStormWinFlagPrevDay.dimension(NumSurfaces, 0); SurfWinFracTimeShadingDeviceOn.dimension(NumSurfaces, 0); - SurfWinExtIntShadePrevTS.dimension(NumSurfaces, 0); + SurfWinExtIntShadePrevTS.dimension(NumSurfaces, WinShadingType::ShadeOff); SurfWinHasShadeOrBlindLayer.dimension(NumSurfaces, 0); SurfWinSurfDayLightInit.dimension(NumSurfaces, 0); SurfWinDaylFacPoint.dimension(NumSurfaces, 0); @@ -1006,7 +1006,6 @@ namespace SurfaceGeometry { // unused INTEGER :: SchID int BlNumNew; int WinShadingControlPtr(0); - int ShadingType; int ErrCount; Real64 diffp; bool izConstDiff; // differences in construction for IZ surfaces @@ -2037,10 +2036,10 @@ namespace SurfaceGeometry { ConstrNumSh = Surface(SurfNum).activeShadedConstruction; if (ConstrNumSh <= 0) continue; - ShadingType = WindowShadingControl(WinShadingControlPtr).ShadingType; + WinShadingType ShadingType = WindowShadingControl(WinShadingControlPtr).ShadingType; // only for blinds - if (ShadingType == WSC_ST_ExteriorBlind || ShadingType == WSC_ST_InteriorBlind || ShadingType == WSC_ST_BetweenGlassBlind) { + if (ANY_BLIND(ShadingType)) { // TH 1/7/2010. CR 7930 // The old code did not consider between-glass blind. Also there should not be two blinds - both interior and exterior @@ -4772,11 +4771,7 @@ namespace SurfaceGeometry { if (ConstrNumSh > 0) { state.dataSurfaceGeometry->SurfaceTmp(SurfNum).activeShadedConstruction = ConstrNumSh; } else { - if (WindowShadingControl(WSCPtr).ShadingType == WSC_ST_InteriorShade || - WindowShadingControl(WSCPtr).ShadingType == WSC_ST_InteriorBlind || - WindowShadingControl(WSCPtr).ShadingType == WSC_ST_ExteriorShade || - WindowShadingControl(WSCPtr).ShadingType == WSC_ST_ExteriorScreen || - WindowShadingControl(WSCPtr).ShadingType == WSC_ST_ExteriorBlind) { + if (ANY_INTERIOR_SHADE_BLIND(WindowShadingControl(WSCPtr).ShadingType) || ANY_EXTERIOR_SHADE_BLIND_SCREEN(WindowShadingControl(WSCPtr).ShadingType)) { ShDevNum = WindowShadingControl(WSCPtr).ShadingDevice; if (ShDevNum > 0) { CreateShadedWindowConstruction(state, SurfNum, WSCPtr, ShDevNum, shadeControlIndex); @@ -4791,8 +4786,7 @@ namespace SurfaceGeometry { ConstrNum = state.dataSurfaceGeometry->SurfaceTmp(SurfNum).Construction; if (!ErrorsFound && WSCPtr > 0 && ConstrNum > 0 && ConstrNumSh > 0) { - if (WindowShadingControl(WSCPtr).ShadingType == WSC_ST_InteriorShade || - WindowShadingControl(WSCPtr).ShadingType == WSC_ST_InteriorBlind) { + if (ANY_INTERIOR_SHADE_BLIND(WindowShadingControl(WSCPtr).ShadingType)) { TotLayers = state.dataConstruction->Construct(ConstrNum).TotLayers; TotShLayers = state.dataConstruction->Construct(ConstrNumSh).TotLayers; if (TotShLayers - 1 != TotLayers) { @@ -4815,9 +4809,7 @@ namespace SurfaceGeometry { } } - if (WindowShadingControl(WSCPtr).ShadingType == WSC_ST_ExteriorShade || - WindowShadingControl(WSCPtr).ShadingType == WSC_ST_ExteriorScreen || - WindowShadingControl(WSCPtr).ShadingType == WSC_ST_ExteriorBlind) { + if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(WindowShadingControl(WSCPtr).ShadingType)) { TotLayers = state.dataConstruction->Construct(ConstrNum).TotLayers; TotShLayers = state.dataConstruction->Construct(ConstrNumSh).TotLayers; if (TotShLayers - 1 != TotLayers) { @@ -4840,8 +4832,7 @@ namespace SurfaceGeometry { } } - if (WindowShadingControl(WSCPtr).ShadingType == WSC_ST_BetweenGlassShade || - WindowShadingControl(WSCPtr).ShadingType == WSC_ST_BetweenGlassBlind) { + if (ANY_BETWEENGLASS_SHADE_BLIND(WindowShadingControl(WSCPtr).ShadingType)) { // Divider not allowed with between-glass shade or blind if (state.dataSurfaceGeometry->SurfaceTmp(SurfNum).FrameDivider > 0) { if (FrameDivider(state.dataSurfaceGeometry->SurfaceTmp(SurfNum).FrameDivider).DividerWidth > 0.0) { @@ -4884,7 +4875,7 @@ namespace SurfaceGeometry { MatGap1 = state.dataConstruction->Construct(ConstrNumSh).LayerPoint(2 * TotGlassLayers - 2); MatGap2 = state.dataConstruction->Construct(ConstrNumSh).LayerPoint(2 * TotGlassLayers); MatSh = state.dataConstruction->Construct(ConstrNumSh).LayerPoint(2 * TotGlassLayers - 1); - if (WindowShadingControl(WSCPtr).ShadingType == WSC_ST_BetweenGlassBlind) { + if (WindowShadingControl(WSCPtr).ShadingType == WinShadingType::BGBlind) { MatGapCalc = std::abs(state.dataMaterial->Material(MatGap).Thickness - (state.dataMaterial->Material(MatGap1).Thickness + state.dataMaterial->Material(MatGap2).Thickness)); if (MatGapCalc > 0.001) { ShowSevereError(state, cRoutineName + ": The gap width(s) for the unshaded window construction " + state.dataConstruction->Construct(ConstrNum).Name); @@ -4972,8 +4963,7 @@ namespace SurfaceGeometry { // Divider not allowed with between-glass shade or blind for (int WSCPtr : state.dataSurfaceGeometry->SurfaceTmp(SurfNum).windowShadingControlList) { if (!ErrorsFound && WSCPtr > 0 && ConstrNumSh > 0) { - if (WindowShadingControl(WSCPtr).ShadingType == WSC_ST_BetweenGlassShade || - WindowShadingControl(WSCPtr).ShadingType == WSC_ST_BetweenGlassBlind) { + if (ANY_BETWEENGLASS_SHADE_BLIND(WindowShadingControl(WSCPtr).ShadingType)) { if (state.dataSurfaceGeometry->SurfaceTmp(SurfNum).FrameDivider > 0) { if (FrameDivider(state.dataSurfaceGeometry->SurfaceTmp(SurfNum).FrameDivider).DividerWidth > 0.0) { ShowSevereError(state, cCurrentModuleObject + "=\"" + state.dataSurfaceGeometry->SurfaceTmp(SurfNum).Name + "\", invalid " + @@ -8168,25 +8158,19 @@ namespace SurfaceGeometry { using ScheduleManager::GetScheduleIndex; // SUBROUTINE PARAMETER DEFINITIONS: - int const NumValidShadingTypes(8); + + int const NumValidShadingTypes(9); static Array1D_string const cValidShadingTypes(NumValidShadingTypes, - {"INTERIORSHADE", - "EXTERIORSHADE", - "EXTERIORSCREEN", - "INTERIORBLIND", - "EXTERIORBLIND", - "BETWEENGLASSSHADE", - "BETWEENGLASSBLIND", - "SWITCHABLEGLAZING"}); - static Array1D_int const ValidShadingTypes(NumValidShadingTypes, - {WSC_ST_InteriorShade, - WSC_ST_ExteriorShade, - WSC_ST_ExteriorScreen, - WSC_ST_InteriorBlind, - WSC_ST_ExteriorBlind, - WSC_ST_BetweenGlassShade, - WSC_ST_BetweenGlassBlind, - WSC_ST_SwitchableGlazing}); + {"SHADEOFF", // 1 + "INTERIORSHADE", // 2 + "SWITCHABLEGLAZING", // 3 + "EXTERIORSHADE", // 4 + "EXTERIORSCREEN", // 5 + "INTERIORBLIND", // 6 + "EXTERIORBLIND", // 7 + "BETWEENGLASSSHADE", // 8 + "BETWEENGLASSBLIND" // 9 + }); int const NumValidWindowShadingControlTypes(21); static Array1D_string const cValidWindowShadingControlTypes(NumValidWindowShadingControlTypes, @@ -8212,43 +8196,7 @@ namespace SurfaceGeometry { "ONIFHIGHZONEAIRTEMPANDHIGHSOLARONWINDOW", "ONIFHIGHZONEAIRTEMPANDHIGHHORIZONTALSOLAR"}); - static Array1D_int const ValidWindowShadingControlTypes( - NumValidWindowShadingControlTypes, - {WSCT_AlwaysOn, - WSCT_AlwaysOff, - WSCT_OnIfScheduled, - WSCT_HiSolar, - WSCT_HiHorzSolar, - WSCT_HiOutAirTemp, - WSCT_HiZoneAirTemp, - WSCT_HiZoneCooling, - WSCT_HiGlare, - WSCT_MeetDaylIlumSetp, - WSCT_OnNightLoOutTemp_OffDay, - WSCT_OnNightLoInTemp_OffDay, - WSCT_OnNightIfHeating_OffDay, - WSCT_OnNightLoOutTemp_OnDayCooling, - WSCT_OnNightIfHeating_OnDayCooling, - WSCT_OffNight_OnDay_HiSolarWindow, - WSCT_OnNight_OnDay_HiSolarWindow, - WSCT_OnHiOutTemp_HiSolarWindow, - WSCT_OnHiOutTemp_HiHorzSolar, - WSCT_OnHiZoneTemp_HiSolarWindow, - WSCT_OnHiZoneTemp_HiHorzSolar}); // 'ALWAYSON ', & | 'ALWAYSOFF ', & - // | 'ONIFSCHEDULEALLOWS ', & | 'ONIFHIGHSOLARONWINDOW ', - // & | 'ONIFHIGHHORIZONTALSOLAR ', & | 'ONIFHIGHOUTDOORAIRTEMPERATURE - // ', & | 'ONIFHIGHZONEAIRTEMPERATURE ', & | 'ONIFHIGHZONECOOLING - // ', & | 'ONIFHIGHGLARE ', & | 'MEETDAYLIGHTILLUMINANCESETPOINT - // ', & | 'ONNIGHTIFLOWOUTDOORTEMPANDOFFDAY ', & | 'ONNIGHTIFLOWINSIDETEMPANDOFFDAY - // ', & | 'ONNIGHTIFHEATINGANDOFFDAY ', & | - // 'ONNIGHTIFLOWOUTDOORTEMPANDONDAYIFCOOLING ', & | 'ONNIGHTIFHEATINGANDONDAYIFCOOLING - // ', & | 'OFFNIGHTANDONDAYIFCOOLINGANDHIGHSOLARONWINDOW ', & | - // 'ONNIGHTANDONDAYIFCOOLINGANDHIGHSOLARONWINDOW ', & | 'ONIFHIGHOUTDOORAIRTEMPANDHIGHSOLARONWINDOW ', - // & | 'ONIFHIGHOUTDOORAIRTEMPANDHIGHHORIZONTALSOLAR', & | 'ONIFHIGHZONEAIRTEMPANDHIGHSOLARONWINDOW - // ', & | 'ONIFHIGHZONEAIRTEMPANDHIGHHORIZONTALSOLAR '/) - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int IOStat; // IO Status when calling get input subroutine int ControlNumAlpha; // Number of control alpha names being passed int ControlNumProp; // Number of control properties being passed @@ -8259,7 +8207,6 @@ namespace SurfaceGeometry { bool ErrorInName; bool IsBlank; int Loop; - int ShTyp; // Shading type std::string ControlType; // Shading control type bool BGShadeBlindError; // True if problem with construction that is supposed to have between-glass // shade or blind @@ -8446,7 +8393,7 @@ namespace SurfaceGeometry { ShowSevereError(state, cCurrentModuleObject + "=\"" + WindowShadingControl(ControlNum).Name + "\" invalid " + cAlphaFieldNames(5) + "=\"" + cAlphaArgs(5) + "\"."); } else { - WindowShadingControl(ControlNum).ShadingControlType = ValidWindowShadingControlTypes(Found); + WindowShadingControl(ControlNum).ShadingControlType = WindowShadingControlType(Found); } // Error checks @@ -8461,7 +8408,7 @@ namespace SurfaceGeometry { cAlphaArgs(8) + "\"."); } - if ((WindowShadingControl(ControlNum).ShadingControlType == WSCT_OnIfScheduled) && + if ((WindowShadingControl(ControlNum).ShadingControlType == WindowShadingControlType::OnIfScheduled) && (!WindowShadingControl(ControlNum).ShadingControlIsScheduled)) { // CR 7709 BG ErrorsFound = true; ShowSevereError(state, cCurrentModuleObject + " = \"" + WindowShadingControl(ControlNum).Name + "\" invalid, " + cAlphaFieldNames(7) + @@ -8485,13 +8432,13 @@ namespace SurfaceGeometry { if (cAlphaArgs(3) == "INTERIORNONINSULATINGSHADE" || cAlphaArgs(3) == "INTERIORINSULATINGSHADE") { ShowWarningError(state, cCurrentModuleObject + "=\"" + WindowShadingControl(ControlNum).Name + "\" is using obsolete " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\", changing to \"InteriorShade\""); - WindowShadingControl(ControlNum).ShadingType = WSC_ST_InteriorShade; + WindowShadingControl(ControlNum).ShadingType = WinShadingType::IntShade; cAlphaArgs(3) = "INTERIORSHADE"; } if (cAlphaArgs(3) == "EXTERIORNONINSULATINGSHADE" || cAlphaArgs(3) == "EXTERIORINSULATINGSHADE") { ShowWarningError(state, cCurrentModuleObject + "=\"" + WindowShadingControl(ControlNum).Name + "\" is using obsolete " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\", changing to \"ExteriorShade\""); - WindowShadingControl(ControlNum).ShadingType = WSC_ST_ExteriorShade; + WindowShadingControl(ControlNum).ShadingType = WinShadingType::ExtShade; cAlphaArgs(3) = "EXTERIORSHADE"; } @@ -8505,15 +8452,15 @@ namespace SurfaceGeometry { // Check for illegal shading type name Found = UtilityRoutines::FindItemInList(cAlphaArgs(3), cValidShadingTypes, NumValidShadingTypes); - if (Found == 0) { + if (Found <= 1) { ErrorsFound = true; ShowSevereError(state, cCurrentModuleObject + "=\"" + WindowShadingControl(ControlNum).Name + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\"."); } else { - WindowShadingControl(ControlNum).ShadingType = ValidShadingTypes(Found); + WindowShadingControl(ControlNum).ShadingType = WinShadingType(Found); } - ShTyp = WindowShadingControl(ControlNum).ShadingType; + WinShadingType ShTyp = WindowShadingControl(ControlNum).ShadingType; IShadedConst = WindowShadingControl(ControlNum).getInputShadedConstruction; IShadingDevice = WindowShadingControl(ControlNum).ShadingDevice; @@ -8522,30 +8469,30 @@ namespace SurfaceGeometry { "\" has no matching shaded construction or shading device."); ErrorsFound = true; } else if (IShadedConst == 0 && IShadingDevice > 0) { - if (ShTyp == WSC_ST_SwitchableGlazing) { + if (ShTyp == WinShadingType::SwitchableGlazing) { ShowSevereError(state, cCurrentModuleObject + "=\"" + WindowShadingControl(ControlNum).Name + "\" has " + cAlphaArgs(3) + "= SwitchableGlazing but no matching shaded construction"); ErrorsFound = true; } - if ((ShTyp == WSC_ST_InteriorShade || ShTyp == WSC_ST_ExteriorShade) && state.dataMaterial->Material(IShadingDevice).Group != Shade) { + if ((ShTyp == WinShadingType::IntShade || ShTyp == WinShadingType::ExtShade) && state.dataMaterial->Material(IShadingDevice).Group != Shade) { ShowSevereError(state, cCurrentModuleObject + "=\"" + WindowShadingControl(ControlNum).Name + "\" has " + cAlphaArgs(3) + "= InteriorShade or ExteriorShade but matching shading device is not a window shade"); ShowContinueError(state, cAlphaFieldNames(8) + " in error=\"" + state.dataMaterial->Material(IShadingDevice).Name + "\"."); ErrorsFound = true; } - if ((ShTyp == WSC_ST_ExteriorScreen) && state.dataMaterial->Material(IShadingDevice).Group != Screen) { + if ((ShTyp == WinShadingType::ExtScreen) && state.dataMaterial->Material(IShadingDevice).Group != Screen) { ShowSevereError(state, cCurrentModuleObject + "=\"" + WindowShadingControl(ControlNum).Name + "\" has " + cAlphaArgs(3) + "= ExteriorScreen but matching shading device is not a window screen"); ShowContinueError(state, cAlphaFieldNames(8) + " in error=\"" + state.dataMaterial->Material(IShadingDevice).Name + "\"."); ErrorsFound = true; } - if ((ShTyp == WSC_ST_InteriorBlind || ShTyp == WSC_ST_ExteriorBlind) && state.dataMaterial->Material(IShadingDevice).Group != WindowBlind) { + if ((ShTyp == WinShadingType::IntBlind || ShTyp == WinShadingType::ExtBlind) && state.dataMaterial->Material(IShadingDevice).Group != WindowBlind) { ShowSevereError(state, cCurrentModuleObject + "=\"" + WindowShadingControl(ControlNum).Name + "\" has " + cAlphaArgs(3) + "= InteriorBlind or ExteriorBlind but matching shading device is not a window blind"); ShowContinueError(state, cAlphaFieldNames(8) + " in error=\"" + state.dataMaterial->Material(IShadingDevice).Name + "\"."); ErrorsFound = true; } - if (ShTyp == WSC_ST_BetweenGlassShade || ShTyp == WSC_ST_BetweenGlassBlind) { + if (ShTyp == WinShadingType::BGShade || ShTyp == WinShadingType::BGBlind) { ShowSevereError(state, cCurrentModuleObject + "=\"" + WindowShadingControl(ControlNum).Name + "\" has " + cAlphaArgs(3) + "= BetweenGlassShade or BetweenGlassBlind and"); ShowContinueError(state, cAlphaFieldNames(8) + " is specified. This is illegal. Specify shaded construction instead."); @@ -8566,7 +8513,7 @@ namespace SurfaceGeometry { BGShadeBlindError = false; IShadingDevice = 0; if (state.dataConstruction->Construct(IShadedConst).LayerPoint(NLayers) != 0) { - if (WindowShadingControl(ControlNum).ShadingType == WSC_ST_InteriorShade) { + if (WindowShadingControl(ControlNum).ShadingType == WinShadingType::IntShade) { IShadingDevice = state.dataConstruction->Construct(IShadedConst).LayerPoint(NLayers); if (state.dataMaterial->Material(state.dataConstruction->Construct(IShadedConst).LayerPoint(NLayers)).Group != Shade) { ErrorsFound = true; @@ -8575,7 +8522,7 @@ namespace SurfaceGeometry { ShowContinueError(state, "of " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" should have a shade layer on the inside of the window."); } - } else if (WindowShadingControl(ControlNum).ShadingType == WSC_ST_ExteriorShade) { + } else if (WindowShadingControl(ControlNum).ShadingType == WinShadingType::ExtShade) { IShadingDevice = state.dataConstruction->Construct(IShadedConst).LayerPoint(1); if (state.dataMaterial->Material(state.dataConstruction->Construct(IShadedConst).LayerPoint(1)).Group != Shade) { ErrorsFound = true; @@ -8584,7 +8531,7 @@ namespace SurfaceGeometry { ShowContinueError(state, "of " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" should have a shade layer on the outside of the window."); } - } else if (WindowShadingControl(ControlNum).ShadingType == WSC_ST_ExteriorScreen) { + } else if (WindowShadingControl(ControlNum).ShadingType == WinShadingType::ExtScreen) { IShadingDevice = state.dataConstruction->Construct(IShadedConst).LayerPoint(1); if (state.dataMaterial->Material(state.dataConstruction->Construct(IShadedConst).LayerPoint(1)).Group != Screen) { ErrorsFound = true; @@ -8593,7 +8540,7 @@ namespace SurfaceGeometry { ShowContinueError(state, "of " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" should have a screen layer on the outside of the window."); } - } else if (WindowShadingControl(ControlNum).ShadingType == WSC_ST_InteriorBlind) { + } else if (WindowShadingControl(ControlNum).ShadingType == WinShadingType::IntBlind) { IShadingDevice = state.dataConstruction->Construct(IShadedConst).LayerPoint(NLayers); if (state.dataMaterial->Material(state.dataConstruction->Construct(IShadedConst).LayerPoint(NLayers)).Group != WindowBlind) { ErrorsFound = true; @@ -8602,7 +8549,7 @@ namespace SurfaceGeometry { ShowContinueError(state, "of " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" should have a blind layer on the inside of the window."); } - } else if (WindowShadingControl(ControlNum).ShadingType == WSC_ST_ExteriorBlind) { + } else if (WindowShadingControl(ControlNum).ShadingType == WinShadingType::ExtBlind) { IShadingDevice = state.dataConstruction->Construct(IShadedConst).LayerPoint(1); if (state.dataMaterial->Material(state.dataConstruction->Construct(IShadedConst).LayerPoint(1)).Group != WindowBlind) { ErrorsFound = true; @@ -8611,7 +8558,7 @@ namespace SurfaceGeometry { ShowContinueError(state, "of " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" should have a blind layer on the outside of the window."); } - } else if (WindowShadingControl(ControlNum).ShadingType == WSC_ST_BetweenGlassShade) { + } else if (WindowShadingControl(ControlNum).ShadingType == WinShadingType::BGShade) { if (NLayers != 5 && NLayers != 7) BGShadeBlindError = true; if (NLayers == 5) { if (state.dataMaterial->Material(state.dataConstruction->Construct(IShadedConst).LayerPoint(3)).Group != Shade) BGShadeBlindError = true; @@ -8627,7 +8574,7 @@ namespace SurfaceGeometry { "\" should have two or three glass layers and a"); ShowContinueError(state, "between-glass shade layer with a gas layer on each side."); } - } else if (WindowShadingControl(ControlNum).ShadingType == WSC_ST_BetweenGlassBlind) { + } else if (WindowShadingControl(ControlNum).ShadingType == WinShadingType::BGBlind) { if (NLayers != 5 && NLayers != 7) BGShadeBlindError = true; if (NLayers == 5) { if (state.dataMaterial->Material(state.dataConstruction->Construct(IShadedConst).LayerPoint(3)).Group != WindowBlind) BGShadeBlindError = true; @@ -8645,19 +8592,19 @@ namespace SurfaceGeometry { } } if (IShadingDevice > 0) { - if ((ShTyp == WSC_ST_InteriorShade || ShTyp == WSC_ST_ExteriorShade) && state.dataMaterial->Material(IShadingDevice).Group != Shade) { + if ((ShTyp == WinShadingType::IntShade || ShTyp == WinShadingType::ExtShade) && state.dataMaterial->Material(IShadingDevice).Group != Shade) { ShowSevereError(state, cCurrentModuleObject + "=\"" + WindowShadingControl(ControlNum).Name + "\" has " + cAlphaFieldNames(3) + "= InteriorShade or ExteriorShade but matching shading device is not a window shade"); ShowContinueError(state, "Shading Device in error=\"" + state.dataMaterial->Material(IShadingDevice).Name + "\"."); ErrorsFound = true; } - if ((ShTyp == WSC_ST_ExteriorScreen) && state.dataMaterial->Material(IShadingDevice).Group != Screen) { + if ((ShTyp == WinShadingType::ExtScreen) && state.dataMaterial->Material(IShadingDevice).Group != Screen) { ShowSevereError(state, cCurrentModuleObject + "=\"" + WindowShadingControl(ControlNum).Name + "\" has " + cAlphaFieldNames(3) + "= ExteriorScreen but matching shading device is not an exterior window screen."); ShowContinueError(state, "Shading Device in error=\"" + state.dataMaterial->Material(IShadingDevice).Name + "\"."); ErrorsFound = true; } - if ((ShTyp == WSC_ST_InteriorBlind || ShTyp == WSC_ST_ExteriorBlind) && state.dataMaterial->Material(IShadingDevice).Group != WindowBlind) { + if ((ShTyp == WinShadingType::IntBlind || ShTyp == WinShadingType::ExtBlind) && state.dataMaterial->Material(IShadingDevice).Group != WindowBlind) { ShowSevereError(state, cCurrentModuleObject + "=\"" + WindowShadingControl(ControlNum).Name + "\" has " + cAlphaFieldNames(3) + "= InteriorBlind or ExteriorBlind but matching shading device is not a window blind."); ShowContinueError(state, "Shading Device in error=\"" + state.dataMaterial->Material(IShadingDevice).Name + "\"."); @@ -9178,8 +9125,7 @@ namespace SurfaceGeometry { if (Surface(SurfNum).HasShadeControl) { for (std::size_t listIndex = 0; listIndex < Surface(SurfNum).windowShadingControlList.size(); ++listIndex) { int WSCPtr = Surface(SurfNum).windowShadingControlList[listIndex]; - if (WindowShadingControl(WSCPtr).ShadingType == WSC_ST_BetweenGlassShade || - WindowShadingControl(WSCPtr).ShadingType == WSC_ST_BetweenGlassBlind) { + if (ANY_BETWEENGLASS_SHADE_BLIND(WindowShadingControl(WSCPtr).ShadingType)) { ConstrNumSh = Surface(SurfNum).shadedConstructionList[listIndex]; if (state.dataConstruction->Construct(ConstrNum).TotGlassLayers == 2) { MatGapFlow1 = state.dataConstruction->Construct(ConstrNumSh).LayerPoint(2); @@ -11691,7 +11637,7 @@ namespace SurfaceGeometry { ShDevName = state.dataMaterial->Material(ShDevNum).Name; ConstrNum = state.dataSurfaceGeometry->SurfaceTmp(SurfNum).Construction; ConstrName = state.dataConstruction->Construct(ConstrNum).Name; - if (WindowShadingControl(WSCPtr).ShadingType == WSC_ST_InteriorShade || WindowShadingControl(WSCPtr).ShadingType == WSC_ST_InteriorBlind) { + if (ANY_INTERIOR_SHADE_BLIND(WindowShadingControl(WSCPtr).ShadingType)) { ConstrNameSh = ConstrName + ':' + ShDevName + ":INT"; } else { ConstrNameSh = ConstrName + ':' + ShDevName + ":EXT"; @@ -11723,8 +11669,8 @@ namespace SurfaceGeometry { state.dataConstruction->Construct(ConstrNewSh).LayerPoint = 0; - if (WindowShadingControl(WSCPtr).ShadingType == WSC_ST_InteriorShade || - WindowShadingControl(WSCPtr).ShadingType == WSC_ST_InteriorBlind) { + if (WindowShadingControl(WSCPtr).ShadingType == WinShadingType::IntShade || + WindowShadingControl(WSCPtr).ShadingType == WinShadingType::IntBlind) { // Interior shading device state.dataConstruction->Construct(ConstrNewSh).LayerPoint({1, TotLayersOld}) = state.dataConstruction->Construct(ConstrNum).LayerPoint({1, TotLayersOld}); state.dataConstruction->Construct(ConstrNewSh).LayerPoint(TotLayersNew) = ShDevNum; diff --git a/src/EnergyPlus/SwimmingPool.cc b/src/EnergyPlus/SwimmingPool.cc index ded8e83b51e..ad4b0250a7b 100644 --- a/src/EnergyPlus/SwimmingPool.cc +++ b/src/EnergyPlus/SwimmingPool.cc @@ -1007,8 +1007,8 @@ namespace EnergyPlus::SwimmingPool { Real64 Area = DataSurfaces::Surface(SurfNum).Area; // Effective surface area if (DataSurfaces::Surface(SurfNum).Class == DataSurfaces::SurfaceClass::Window) { - if (DataSurfaces::SurfWinShadingFlag(SurfNum) == DataSurfaces::IntShadeOn || - DataSurfaces::SurfWinShadingFlag(SurfNum) == DataSurfaces::IntBlindOn) { + if (DataSurfaces::SurfWinShadingFlag(SurfNum) == DataSurfaces::WinShadingType::IntShade || + DataSurfaces::SurfWinShadingFlag(SurfNum) == DataSurfaces::WinShadingType::IntBlind) { // The area is the shade or blind are = sum of the glazing area and the divider area (which is zero if no divider) Area += DataSurfaces::SurfWinDividerArea(SurfNum); } @@ -1020,8 +1020,8 @@ namespace EnergyPlus::SwimmingPool { } if (DataSurfaces::SurfWinDividerArea(SurfNum) > 0.0 && - DataSurfaces::SurfWinShadingFlag(SurfNum) != DataSurfaces::IntShadeOn && - DataSurfaces::SurfWinShadingFlag(SurfNum) != DataSurfaces::IntBlindOn) { + DataSurfaces::SurfWinShadingFlag(SurfNum) != DataSurfaces::WinShadingType::IntShade && + DataSurfaces::SurfWinShadingFlag(SurfNum) != DataSurfaces::WinShadingType::IntBlind) { // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) SumHATsurf += DataHeatBalance::HConvIn(SurfNum) * DataSurfaces::SurfWinDividerArea(SurfNum) * (1.0 + 2.0 * DataSurfaces::SurfWinProjCorrDivIn(SurfNum)) * diff --git a/src/EnergyPlus/SystemReports.cc b/src/EnergyPlus/SystemReports.cc index db29cc39857..5b09f84c57a 100644 --- a/src/EnergyPlus/SystemReports.cc +++ b/src/EnergyPlus/SystemReports.cc @@ -57,10 +57,12 @@ #include // EnergyPlus Headers +#include #include #include #include #include +#include #include #include #include @@ -75,6 +77,7 @@ #include #include #include +#include #include #include #include @@ -1651,6 +1654,21 @@ namespace EnergyPlus::SystemReports { state.dataSysRpts->ZoneOAVolFlowCrntRho.allocate(state.dataGlobal->NumOfZones); state.dataSysRpts->ZoneOAVolCrntRho.allocate(state.dataGlobal->NumOfZones); state.dataSysRpts->ZoneMechACH.allocate(state.dataGlobal->NumOfZones); + state.dataSysRpts->ZoneTargetVentilationFlowVoz.allocate(state.dataGlobal->NumOfZones); + state.dataSysRpts->ZoneTimeBelowVozDyn.allocate(state.dataGlobal->NumOfZones); + state.dataSysRpts->ZoneTimeAtVozDyn.allocate(state.dataGlobal->NumOfZones); + state.dataSysRpts->ZoneTimeAboveVozDyn.allocate(state.dataGlobal->NumOfZones); + state.dataSysRpts->ZoneTimeVentUnocc.allocate(state.dataGlobal->NumOfZones); + + state.dataSysRpts->SysMechVentFlow.allocate(NumPrimaryAirSys); + state.dataSysRpts->SysNatVentFlow.allocate(NumPrimaryAirSys); + state.dataSysRpts->SysTargetVentilationFlowVoz.allocate(NumPrimaryAirSys); + state.dataSysRpts->SysTimeBelowVozDyn.allocate(NumPrimaryAirSys); + state.dataSysRpts->SysTimeAtVozDyn.allocate(NumPrimaryAirSys); + state.dataSysRpts->SysTimeAboveVozDyn.allocate(NumPrimaryAirSys); + state.dataSysRpts->SysTimeVentUnocc.allocate(NumPrimaryAirSys); + state.dataSysRpts->SysAnyZoneOccupied.allocate(NumPrimaryAirSys); + state.dataSysRpts->SysPreDefRep.allocate(NumPrimaryAirSys); state.dataSysRpts->SysTotZoneLoadHTNG.allocate(NumPrimaryAirSys); state.dataSysRpts->SysTotZoneLoadCLNG.allocate(NumPrimaryAirSys); @@ -1728,6 +1746,20 @@ namespace EnergyPlus::SystemReports { state.dataSysRpts->ZoneOAVolFlowCrntRho = 0.0; state.dataSysRpts->ZoneOAVolCrntRho = 0.0; state.dataSysRpts->ZoneMechACH = 0.0; + state.dataSysRpts->ZoneTargetVentilationFlowVoz = 0.0; + state.dataSysRpts->ZoneTimeBelowVozDyn = 0.0; + state.dataSysRpts->ZoneTimeAtVozDyn = 0.0; + state.dataSysRpts->ZoneTimeAboveVozDyn = 0.0; + state.dataSysRpts->ZoneTimeVentUnocc = 0.0; + + state.dataSysRpts->SysMechVentFlow = 0.0; + state.dataSysRpts->SysNatVentFlow = 0.0; + state.dataSysRpts->SysTargetVentilationFlowVoz = 0.0; + state.dataSysRpts->SysTimeBelowVozDyn = 0.0; + state.dataSysRpts->SysTimeAtVozDyn = 0.0; + state.dataSysRpts->SysTimeAboveVozDyn = 0.0; + state.dataSysRpts->SysTimeVentUnocc = 0.0; + state.dataSysRpts->SysAnyZoneOccupied = false; // SYSTEM LOADS REPORT state.dataSysRpts->SysTotZoneLoadHTNG = 0.0; @@ -2004,6 +2036,63 @@ namespace EnergyPlus::SystemReports { "HVAC", "Sum", state.dataAirSystemsData->PrimaryAirSystems(SysIndex).Name); + + SetupOutputVariable(state, + "Air System Mechanical Ventilation Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataSysRpts->SysMechVentFlow(SysIndex), + "HVAC", + "Sum", + state.dataAirSystemsData->PrimaryAirSystems(SysIndex).Name); + + SetupOutputVariable(state, + "Air System Natural Ventilation Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataSysRpts->SysNatVentFlow(SysIndex), + "HVAC", + "Sum", + state.dataAirSystemsData->PrimaryAirSystems(SysIndex).Name); + + SetupOutputVariable(state, + "Air System Target Voz Ventilation Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataSysRpts->SysTargetVentilationFlowVoz(SysIndex), + "HVAC", + "Sum", + state.dataAirSystemsData->PrimaryAirSystems(SysIndex).Name); + + SetupOutputVariable(state, + "Air System Ventilation Below Target Voz Time", + OutputProcessor::Unit::hr, + state.dataSysRpts->SysTimeBelowVozDyn(SysIndex), + "HVAC", + "Sum", + state.dataAirSystemsData->PrimaryAirSystems(SysIndex).Name); + + SetupOutputVariable(state, + "Air System Ventilation At Target Voz Time", + OutputProcessor::Unit::hr, + state.dataSysRpts->SysTimeAtVozDyn(SysIndex), + "HVAC", + "Sum", + state.dataAirSystemsData->PrimaryAirSystems(SysIndex).Name); + + SetupOutputVariable(state, + "Air System Ventilation Above Target Voz Time", + OutputProcessor::Unit::hr, + state.dataSysRpts->SysTimeAboveVozDyn(SysIndex), + "HVAC", + "Sum", + state.dataAirSystemsData->PrimaryAirSystems(SysIndex).Name); + + SetupOutputVariable(state, + "Air System Ventilation When Unoccupied Time", + OutputProcessor::Unit::hr, + state.dataSysRpts->SysTimeVentUnocc(SysIndex), + "HVAC", + "Sum", + state.dataAirSystemsData->PrimaryAirSystems(SysIndex).Name); + } } for (int ZoneIndex = 1; ZoneIndex <= state.dataGlobal->NumOfZones; ++ZoneIndex) { @@ -2116,7 +2205,73 @@ namespace EnergyPlus::SystemReports { "HVAC", "Average", state.dataZoneEquip->ZoneEquipConfig(ZoneIndex).ZoneName); + + SetupOutputVariable(state, "Zone Target Voz Ventilation Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataSysRpts->ZoneTargetVentilationFlowVoz(ZoneIndex), + "HVAC", + "Sum", + state.dataZoneEquip->ZoneEquipConfig(ZoneIndex).ZoneName); + + SetupOutputVariable(state, "Zone Ventilation Below Target Voz Time", + OutputProcessor::Unit::hr, + state.dataSysRpts->ZoneTimeBelowVozDyn(ZoneIndex), + "HVAC", + "Sum", + state.dataZoneEquip->ZoneEquipConfig(ZoneIndex).ZoneName); + + SetupOutputVariable(state, "Zone Ventilation At Target Voz Time", + OutputProcessor::Unit::hr, + state.dataSysRpts->ZoneTimeAtVozDyn(ZoneIndex), + "HVAC", + "Sum", + state.dataZoneEquip->ZoneEquipConfig(ZoneIndex).ZoneName); + + SetupOutputVariable(state, "Zone Ventilation Above Target Voz Time", + OutputProcessor::Unit::hr, + state.dataSysRpts->ZoneTimeAboveVozDyn(ZoneIndex), + "HVAC", + "Sum", + state.dataZoneEquip->ZoneEquipConfig(ZoneIndex).ZoneName); + + SetupOutputVariable(state, "Zone Ventilation When Unoccupied Time", + OutputProcessor::Unit::hr, + state.dataSysRpts->ZoneTimeVentUnocc(ZoneIndex), + "HVAC", + "Sum", + state.dataZoneEquip->ZoneEquipConfig(ZoneIndex).ZoneName); + } + + // Facility outputs + SetupOutputVariable(state, "Facility Any Zone Ventilation Below Target Voz Time", + OutputProcessor::Unit::hr, + state.dataSysRpts->AnyZoneTimeBelowVozDyn, + "HVAC", + "Sum", + "Facility"); + + SetupOutputVariable(state, "Facility All Zones Ventilation At Target Voz Time", + OutputProcessor::Unit::hr, + state.dataSysRpts->AllZonesTimeAtVozDyn, + "HVAC", + "Sum", + "Facility"); + + SetupOutputVariable(state, "Facility Any Zone Ventilation Above Target Voz Time", + OutputProcessor::Unit::hr, + state.dataSysRpts->AnyZoneTimeAboveVozDyn, + "HVAC", + "Sum", + "Facility"); + + SetupOutputVariable(state, "Facility Any Zone Ventilation When Unoccupied Time", + OutputProcessor::Unit::hr, + state.dataSysRpts->AnyZoneTimeVentUnocc, + "HVAC", + "Sum", + "Facility"); + } void CreateEnergyReportStructure(EnergyPlusData &state) @@ -4086,7 +4241,6 @@ namespace EnergyPlus::SystemReports { int ZoneInNum; // counter for zone air distribution inlets int ReturnAirNode; // node number for return node on primary air loop int MixedAirNode; // mixed air node number (right after the mixing box) on primary air loop - int AirLoopNum; // index to AirloopHVAC int AirDistCoolInletNodeNum; // Air distribution unit inlet node number int AirDistHeatInletNodeNum; // Air distribution unit outlet node number @@ -4115,21 +4269,49 @@ namespace EnergyPlus::SystemReports { if (!state.dataSysRpts->VentReportStructureCreated) return; if (!state.dataSysRpts->VentLoadsReportEnabled) return; // following inits are array assignments across all controlled zones. - state.dataSysRpts->ZoneOAMassFlow = 0.0; - state.dataSysRpts->ZoneOAMass = 0.0; - state.dataSysRpts->ZoneOAVolFlowStdRho = 0.0; - state.dataSysRpts->ZoneOAVolStdRho = 0.0; - state.dataSysRpts->ZoneOAVolFlowCrntRho = 0.0; - state.dataSysRpts->ZoneOAVolCrntRho = 0.0; - state.dataSysRpts->ZoneMechACH = 0.0; - state.dataSysRpts->MaxCoolingLoadMetByVent = 0.0; - state.dataSysRpts->MaxCoolingLoadAddedByVent = 0.0; - state.dataSysRpts->MaxOvercoolingByVent = 0.0; - state.dataSysRpts->MaxHeatingLoadMetByVent = 0.0; - state.dataSysRpts->MaxHeatingLoadAddedByVent = 0.0; - state.dataSysRpts->MaxOverheatingByVent = 0.0; - state.dataSysRpts->MaxNoLoadHeatingByVent = 0.0; - state.dataSysRpts->MaxNoLoadCoolingByVent = 0.0; + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + state.dataSysRpts->ZoneOAMassFlow(zoneNum) = 0.0; + state.dataSysRpts->ZoneOAMass(zoneNum) = 0.0; + state.dataSysRpts->ZoneOAVolFlowStdRho(zoneNum) = 0.0; + state.dataSysRpts->ZoneOAVolStdRho(zoneNum) = 0.0; + state.dataSysRpts->ZoneOAVolFlowCrntRho(zoneNum) = 0.0; + state.dataSysRpts->ZoneOAVolCrntRho(zoneNum) = 0.0; + state.dataSysRpts->ZoneMechACH(zoneNum) = 0.0; + state.dataSysRpts->ZoneTargetVentilationFlowVoz(zoneNum) = 0.0; + state.dataSysRpts->ZoneTimeBelowVozDyn(zoneNum) = 0.0; + state.dataSysRpts->ZoneTimeAtVozDyn(zoneNum) = 0.0; + } + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + state.dataSysRpts->ZoneTimeAboveVozDyn(zoneNum) = 0.0; + state.dataSysRpts->ZoneTimeVentUnocc(zoneNum) = 0.0; + state.dataSysRpts->MaxCoolingLoadMetByVent(zoneNum) = 0.0; + state.dataSysRpts->MaxCoolingLoadAddedByVent(zoneNum) = 0.0; + state.dataSysRpts->MaxOvercoolingByVent(zoneNum) = 0.0; + state.dataSysRpts->MaxHeatingLoadMetByVent(zoneNum) = 0.0; + state.dataSysRpts->MaxHeatingLoadAddedByVent(zoneNum) = 0.0; + state.dataSysRpts->MaxOverheatingByVent(zoneNum) = 0.0; + state.dataSysRpts->MaxNoLoadHeatingByVent(zoneNum) = 0.0; + state.dataSysRpts->MaxNoLoadCoolingByVent(zoneNum) = 0.0; + } + + state.dataSysRpts->AnyZoneTimeBelowVozDyn = 0.0; + state.dataSysRpts->AllZonesTimeAtVozDyn = 0.0; + state.dataSysRpts->AnyZoneTimeAboveVozDyn = 0.0; + state.dataSysRpts->AnyZoneTimeVentUnocc = 0.0; + state.dataSysRpts->AnyZoneTimeBelowVozDynOcc = 0.0; + state.dataSysRpts->AllZonesTimeAtVozDynOcc = 0.0; + state.dataSysRpts->AnyZoneTimeAboveVozDynOcc = 0.0; + + for (int sysNum = 1; sysNum <= DataHVACGlobals::NumPrimaryAirSys; ++sysNum) { + state.dataSysRpts->SysMechVentFlow(sysNum) = 0.0; + state.dataSysRpts->SysNatVentFlow(sysNum) = 0.0; + state.dataSysRpts->SysTargetVentilationFlowVoz(sysNum) = 0.0; + state.dataSysRpts->SysTimeBelowVozDyn(sysNum) = 0.0; + state.dataSysRpts->SysTimeAtVozDyn(sysNum) = 0.0; + state.dataSysRpts->SysTimeAboveVozDyn(sysNum) = 0.0; + state.dataSysRpts->SysTimeVentUnocc(sysNum) = 0.0; + state.dataSysRpts->SysAnyZoneOccupied(sysNum) = false; + } for (CtrlZoneNum = 1; CtrlZoneNum <= state.dataGlobal->NumOfZones; ++CtrlZoneNum) { if (!state.dataZoneEquip->ZoneEquipConfig(CtrlZoneNum).IsControlled) continue; @@ -4138,7 +4320,7 @@ namespace EnergyPlus::SystemReports { // first clear out working variables from previous zone. ZFAUFlowRate = 0.0; ZFAUZoneVentLoad = 0.0; - ZFAUOutAirFlow = 0.0; + ZFAUOutAirFlow = 0.0; // kg/s OutAirFlow = 0.0; ZoneFlowFrac = 0.0; @@ -4147,6 +4329,17 @@ namespace EnergyPlus::SystemReports { ZoneLoad = state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).TotalOutputRequired; ZoneVolume = Zone(ActualZoneNum).Volume * Zone(ActualZoneNum).Multiplier * Zone(ActualZoneNum).ListMultiplier; // CR 7170 + bool const UseOccSchFlag = true; + bool const UseMinOASchFlag = true; + state.dataSysRpts->ZoneTargetVentilationFlowVoz(CtrlZoneNum) = DataZoneEquipment::CalcDesignSpecificationOutdoorAir( + state, state.dataZoneEquip->ZoneEquipConfig(CtrlZoneNum).ZoneDesignSpecOAIndex, ActualZoneNum, UseOccSchFlag, UseMinOASchFlag); + if (state.dataZoneEquip->ZoneEquipConfig(CtrlZoneNum).ZoneAirDistributionIndex > 0) { + state.dataSysRpts->ZoneTargetVentilationFlowVoz(CtrlZoneNum) = + state.dataSysRpts->ZoneTargetVentilationFlowVoz(CtrlZoneNum) / + DataSizing::ZoneAirDistribution(state.dataZoneEquip->ZoneEquipConfig(CtrlZoneNum).ZoneAirDistributionIndex).calculateEz(state, ActualZoneNum); + } + + // if system operating in deadband reset zone load if (state.dataZoneEnergyDemand->DeadBandOrSetback(ActualZoneNum)) ZoneLoad = 0.0; @@ -4377,7 +4570,7 @@ namespace EnergyPlus::SystemReports { Real64 AirSysTotalMixFlowRate = 0.0; // Mixed air mass flow rate [kg/s] Real64 AirSysOutAirFlow = 0.0; // outside air flow rate for zone from primary air system [kg/s] // retrieve air loop index - AirLoopNum = state.dataZoneEquip->ZoneEquipConfig(CtrlZoneNum).InletNodeAirLoopNum(ZoneInNum); + int AirLoopNum = state.dataZoneEquip->ZoneEquipConfig(CtrlZoneNum).InletNodeAirLoopNum(ZoneInNum); MixedAirNode = 0; ReturnAirNode = 0; AirDistCoolInletNodeNum = 0; @@ -4408,6 +4601,25 @@ namespace EnergyPlus::SystemReports { // Find the mixed air node and return air node of the system that supplies the zone MixedAirNode = state.dataAirSystemsData->PrimaryAirSystems(AirLoopNum).OASysOutletNodeNum; ReturnAirNode = state.dataAirSystemsData->PrimaryAirSystems(AirLoopNum).OASysInletNodeNum; + + // Collect air loop Voz-dyn and natural ventilation + int ADUNum = state.dataZoneEquip->ZoneEquipConfig(CtrlZoneNum).InletNodeADUNum(ZoneInNum); + Real64 termUnitOAFrac = 1.0; + if (ADUNum > 0) { + int termUnitSizingNum = state.dataDefineEquipment->AirDistUnit(ADUNum).TermUnitSizingNum; + if (termUnitSizingNum > 0) { + termUnitOAFrac = DataSizing::TermUnitSizing(termUnitSizingNum).SpecMinOAFrac; + } + } + state.dataSysRpts->SysTargetVentilationFlowVoz(AirLoopNum) += + termUnitOAFrac * state.dataSysRpts->ZoneTargetVentilationFlowVoz(CtrlZoneNum); + Real64 naturalVentVol = +ZnAirRpt(ActualZoneNum).VentilVolumeStdDensity + ZonePreDefRep(ActualZoneNum).AFNVentVolTotalStdDen; + state.dataSysRpts->SysNatVentFlow(AirLoopNum) += termUnitOAFrac * naturalVentVol; + + if (ZonePreDefRep(ActualZoneNum).isOccupied) { + state.dataSysRpts->SysAnyZoneOccupied(AirLoopNum) = true; + } + } if (MixedAirNode == 0 || ReturnAirNode == 0) { @@ -4452,6 +4664,24 @@ namespace EnergyPlus::SystemReports { state.dataSysRpts->ZoneOAVolFlowStdRho(CtrlZoneNum) = state.dataSysRpts->ZoneOAMassFlow(CtrlZoneNum) / state.dataEnvrn->StdRhoAir; state.dataSysRpts->ZoneOAVolStdRho(CtrlZoneNum) = state.dataSysRpts->ZoneOAVolFlowStdRho(CtrlZoneNum) * TimeStepSys * DataGlobalConstants::SecInHour; + // set time mechanical+natural ventilation is below, at, or above target Voz-dyn + // MJWToDo - InfilVolume should be NatVentVolume or similar after this is split in AFN + Real64 afnVentVol = ZonePreDefRep(ActualZoneNum).AFNVentVolTotalStdDen; + Real64 totMechNatVentVolStdRho = state.dataSysRpts->ZoneOAVolStdRho(CtrlZoneNum) + ZnAirRpt(ActualZoneNum).VentilVolumeStdDensity + + afnVentVol; + Real64 targetVoz = state.dataSysRpts->ZoneTargetVentilationFlowVoz(CtrlZoneNum) * TimeStepSys * DataGlobalConstants::SecInHour; + // Allow 1% tolerance + if (totMechNatVentVolStdRho < (0.99 * targetVoz)) { + state.dataSysRpts->ZoneTimeBelowVozDyn(CtrlZoneNum) = TimeStepSys; + state.dataSysRpts->AnyZoneTimeBelowVozDyn = TimeStepSys; + } else if (totMechNatVentVolStdRho > (1.01 * targetVoz)) { + state.dataSysRpts->ZoneTimeAboveVozDyn(CtrlZoneNum) = TimeStepSys; + state.dataSysRpts->AnyZoneTimeAboveVozDyn = TimeStepSys; + } else if (totMechNatVentVolStdRho > SmallAirVolFlow) { + state.dataSysRpts->ZoneTimeAtVozDyn(CtrlZoneNum) = TimeStepSys; + state.dataSysRpts->AllZonesTimeAtVozDyn = TimeStepSys; + } + // determine volumetric values from mass flow using current air density for zone (adjusted for elevation) currentZoneAirDensity = PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, MAT(ActualZoneNum), ZoneAirHumRatAvg(ActualZoneNum)); if (currentZoneAirDensity > 0.0) state.dataSysRpts->ZoneOAVolFlowCrntRho(CtrlZoneNum) = state.dataSysRpts->ZoneOAMassFlow(CtrlZoneNum) / currentZoneAirDensity; @@ -4462,22 +4692,48 @@ namespace EnergyPlus::SystemReports { if (ZonePreDefRep(ActualZoneNum).isOccupied) { // accumulate the occupied time ZonePreDefRep(ActualZoneNum).TotTimeOcc += TimeStepSys; - // mechnical ventilation - ZonePreDefRep(ActualZoneNum).MechVentVolTotal += state.dataSysRpts->ZoneOAVolCrntRho(CtrlZoneNum); + // mechanical ventilation + ZonePreDefRep(ActualZoneNum).MechVentVolTotalOcc += state.dataSysRpts->ZoneOAVolCrntRho(CtrlZoneNum); if ((state.dataSysRpts->ZoneOAVolCrntRho(CtrlZoneNum) / TimeStepSys) < ZonePreDefRep(ActualZoneNum).MechVentVolMin) { ZonePreDefRep(ActualZoneNum).MechVentVolMin = state.dataSysRpts->ZoneOAVolCrntRho(CtrlZoneNum) / TimeStepSys; } + ZonePreDefRep(ActualZoneNum).MechVentVolTotalOccStdDen += state.dataSysRpts->ZoneOAVolStdRho(CtrlZoneNum); // infiltration - ZonePreDefRep(ActualZoneNum).InfilVolTotal += ZnAirRpt(ActualZoneNum).InfilVolumeCurDensity; + ZonePreDefRep(ActualZoneNum).InfilVolTotalOcc += ZnAirRpt(ActualZoneNum).InfilVolumeCurDensity; if (ZnAirRpt(ActualZoneNum).InfilVolumeCurDensity < ZonePreDefRep(ActualZoneNum).InfilVolMin) { ZonePreDefRep(ActualZoneNum).InfilVolMin = ZnAirRpt(ActualZoneNum).InfilVolumeCurDensity; } - //'simple' mechanical ventilation - ZonePreDefRep(ActualZoneNum).SimpVentVolTotal += ZnAirRpt(ActualZoneNum).VentilVolumeCurDensity; + ZonePreDefRep(ActualZoneNum).InfilVolTotalOccStdDen += ZnAirRpt(ActualZoneNum).InfilVolumeStdDensity; + // 'simple' natural ventilation + ZonePreDefRep(ActualZoneNum).SimpVentVolTotalOcc += ZnAirRpt(ActualZoneNum).VentilVolumeCurDensity; if (ZnAirRpt(ActualZoneNum).VentilVolumeCurDensity < ZonePreDefRep(ActualZoneNum).SimpVentVolMin) { ZonePreDefRep(ActualZoneNum).SimpVentVolMin = ZnAirRpt(ActualZoneNum).VentilVolumeCurDensity; } + ZonePreDefRep(ActualZoneNum).SimpVentVolTotalOccStdDen += + ZnAirRpt(ActualZoneNum).VentilVolumeStdDensity + afnVentVol; + //target ventilation Voz-dyn + state.dataSysRpts->AnyZoneTimeBelowVozDynOcc = state.dataSysRpts->AnyZoneTimeBelowVozDyn; + state.dataSysRpts->AllZonesTimeAtVozDynOcc = state.dataSysRpts->AllZonesTimeAtVozDyn; + state.dataSysRpts->AnyZoneTimeAboveVozDynOcc = state.dataSysRpts->AnyZoneTimeAboveVozDyn; + ZonePreDefRep(ActualZoneNum).VozTargetTotalOcc += targetVoz; + + // time mechanical+natural ventilation is below, at, or above target Voz-dyn + ZonePreDefRep(ActualZoneNum).VozTargetTimeBelowOcc += state.dataSysRpts->ZoneTimeBelowVozDyn(CtrlZoneNum); + ZonePreDefRep(ActualZoneNum).VozTargetTimeAtOcc += state.dataSysRpts->ZoneTimeAtVozDyn(CtrlZoneNum); + ZonePreDefRep(ActualZoneNum).VozTargetTimeAboveOcc += state.dataSysRpts->ZoneTimeAboveVozDyn(CtrlZoneNum); + } else if (totMechNatVentVolStdRho > SmallAirVolFlow) { + state.dataSysRpts->ZoneTimeVentUnocc(CtrlZoneNum) = TimeStepSys; + ZonePreDefRep(ActualZoneNum).TotVentTimeNonZeroUnocc += state.dataSysRpts->ZoneTimeVentUnocc(CtrlZoneNum); } + // accumulate during occupancy or not + ZonePreDefRep(ActualZoneNum).MechVentVolTotalStdDen += state.dataSysRpts->ZoneOAVolStdRho(CtrlZoneNum); + ZonePreDefRep(ActualZoneNum).InfilVolTotalStdDen += ZnAirRpt(ActualZoneNum).InfilVolumeStdDensity; + ZonePreDefRep(ActualZoneNum).SimpVentVolTotalStdDen += + ZnAirRpt(ActualZoneNum).VentilVolumeStdDensity + afnVentVol; + ZonePreDefRep(ActualZoneNum).VozTargetTotal += targetVoz; + ZonePreDefRep(ActualZoneNum).VozTargetTimeBelow += state.dataSysRpts->ZoneTimeBelowVozDyn(CtrlZoneNum); + ZonePreDefRep(ActualZoneNum).VozTargetTimeAt += state.dataSysRpts->ZoneTimeAtVozDyn(CtrlZoneNum); + ZonePreDefRep(ActualZoneNum).VozTargetTimeAbove += state.dataSysRpts->ZoneTimeAboveVozDyn(CtrlZoneNum); // now combine Vent load from zone forced air units with primary air system ZoneVentLoad = ZAirSysZoneVentLoad + ZFAUZoneVentLoad; @@ -4524,7 +4780,55 @@ namespace EnergyPlus::SystemReports { } else { } } // loop over controlled zones - } + + // loop over air loops + for (int sysNum = 1; sysNum <= NumPrimaryAirSys; ++sysNum){ + Real64 mechVentFlow = state.dataAirLoop->AirLoopFlow(sysNum).OAFlow * state.dataEnvrn->StdRhoAir; + state.dataSysRpts->SysMechVentFlow(sysNum) = mechVentFlow; + state.dataSysRpts->SysPreDefRep(sysNum).SysMechVentTotal += mechVentFlow; + state.dataSysRpts->SysPreDefRep(sysNum).SysNatVentTotal += state.dataSysRpts->SysNatVentFlow(sysNum);; + // set time mechanical+natural ventilation is below, at, or above target Voz-dyn + // MJWToDo - InfilVolume should be NatVentVolume or similar after this is split in AFN + Real64 totMechNatVentVolFlowStdRho = + mechVentFlow + state.dataSysRpts->SysNatVentFlow(sysNum); + + Real64 targetFlowVoz = state.dataSysRpts->SysTargetVentilationFlowVoz(sysNum); + state.dataSysRpts->SysPreDefRep(sysNum).SysTargetVentTotalVoz += targetFlowVoz; + // Allow 1% tolerance + if (totMechNatVentVolFlowStdRho < (0.99 * targetFlowVoz)) { + state.dataSysRpts->SysTimeBelowVozDyn(sysNum) = TimeStepSys; + state.dataSysRpts->SysPreDefRep(sysNum).SysTimeBelowVozDynTotal += TimeStepSys; + } + else if (totMechNatVentVolFlowStdRho > (1.01 * targetFlowVoz)) { + state.dataSysRpts->SysTimeAboveVozDyn(sysNum) = TimeStepSys; + state.dataSysRpts->SysPreDefRep(sysNum).SysTimeAboveVozDynTotal += TimeStepSys; + } + else if (totMechNatVentVolFlowStdRho > SmallAirVolFlow) { + state.dataSysRpts->SysTimeAtVozDyn(sysNum) = TimeStepSys; + state.dataSysRpts->SysPreDefRep(sysNum).SysTimeAtVozDynTotal += TimeStepSys; + } + if (state.dataSysRpts->SysAnyZoneOccupied(sysNum)) { + state.dataSysRpts->SysPreDefRep(sysNum).SysTimeOccupiedTotal += TimeStepSys; + state.dataSysRpts->SysPreDefRep(sysNum).SysMechVentTotalOcc += mechVentFlow; + state.dataSysRpts->SysPreDefRep(sysNum).SysNatVentTotalOcc += state.dataSysRpts->SysNatVentFlow(sysNum); + state.dataSysRpts->SysPreDefRep(sysNum).SysTargetVentTotalVozOcc += targetFlowVoz; + state.dataSysRpts->SysPreDefRep(sysNum).SysTimeBelowVozDynTotalOcc += state.dataSysRpts->SysTimeBelowVozDyn(sysNum); + state.dataSysRpts->SysPreDefRep(sysNum).SysTimeAboveVozDynTotalOcc += state.dataSysRpts->SysTimeAboveVozDyn(sysNum); + state.dataSysRpts->SysPreDefRep(sysNum).SysTimeAtVozDynTotalOcc += state.dataSysRpts->SysTimeAtVozDyn(sysNum); + } else if (totMechNatVentVolFlowStdRho > SmallAirVolFlow) { + state.dataSysRpts->SysPreDefRep(sysNum).SysTimeVentUnoccTotal += TimeStepSys; + } + + } + // Accumulate facility totals + state.dataOutRptPredefined->TotalAnyZoneBelowVozDynForOA += state.dataSysRpts->AnyZoneTimeBelowVozDyn; + state.dataOutRptPredefined->TotalAllZonesAtVozDynForOA += state.dataSysRpts->AllZonesTimeAtVozDyn; + state.dataOutRptPredefined->TotalAnyZoneAboveVozDynForOA += state.dataSysRpts->AnyZoneTimeAboveVozDyn; + state.dataOutRptPredefined->TotalAnyZoneVentUnoccForOA += state.dataSysRpts->AnyZoneTimeVentUnocc; + state.dataOutRptPredefined->TotalAnyZoneBelowVozDynOccForOA += state.dataSysRpts->AnyZoneTimeBelowVozDynOcc; + state.dataOutRptPredefined->TotalAllZonesAtVozDynOccForOA += state.dataSysRpts->AllZonesTimeAtVozDynOcc; + state.dataOutRptPredefined->TotalAnyZoneAboveVozDynOccForOA += state.dataSysRpts->AnyZoneTimeAboveVozDynOcc; + } void MatchPlantSys(EnergyPlusData &state, int const AirLoopNum, // counter for zone air distribution inlets diff --git a/src/EnergyPlus/SystemReports.hh b/src/EnergyPlus/SystemReports.hh index 7092db71bef..581b23d0e39 100644 --- a/src/EnergyPlus/SystemReports.hh +++ b/src/EnergyPlus/SystemReports.hh @@ -125,6 +125,33 @@ namespace SystemReports { } }; + struct SysPreDefRepType + { + Real64 SysMechVentTotal; // air loop mechanical vent total volume OA at standard density {m3} + Real64 SysNatVentTotal; // air loop natural vent total volume OA at standard density {m3} + Real64 SysTargetVentTotalVoz; // air loop target ventilation ventilation flow based on 62.1 Voz-dyn {m3} + Real64 SysTimeBelowVozDynTotal; // time [hrs] that mechanical+natural ventilation is < VozTarget - 1% + Real64 SysTimeAtVozDynTotal; // time [hrs] that mechanical+natural ventilation is = VozTarget within 1% and > zero + Real64 SysTimeAboveVozDynTotal; // time [hrs] that mechanical+natural ventilation is > VozTarget + 1% + Real64 SysMechVentTotalOcc; // air loop mechanical vent total volume OA at standard density {m3} + Real64 SysNatVentTotalOcc; // air loop natural vent total volume OA at standard density {m3} + Real64 SysTargetVentTotalVozOcc; // air loop target ventilation ventilation flow based on 62.1 Voz-dyn {m3} during occupied + Real64 SysTimeBelowVozDynTotalOcc; // time [hrs] that mechanical+natural ventilation is < VozTarget - 1% during occupied + Real64 SysTimeAtVozDynTotalOcc; // time [hrs] that mechanical+natural ventilation is = VozTarget within 1% and > zero during occ + Real64 SysTimeAboveVozDynTotalOcc; // time [hrs] that mechanical+natural ventilation is > VozTarget + 1% during occupied + Real64 SysTimeVentUnoccTotal; // time [hrs] that mechanical+natural ventilation is > zero during unoccupied + Real64 SysTimeOccupiedTotal; // time [hrs] that any zone is occupied + + // Default Constructor + SysPreDefRepType() + : SysMechVentTotal(0.0), SysNatVentTotal(0.0), SysTargetVentTotalVoz(0.0), SysTimeBelowVozDynTotal(0.0), SysTimeAtVozDynTotal(0.0), + SysTimeAboveVozDynTotal(0.0), SysMechVentTotalOcc(0.0), SysNatVentTotalOcc(0.0), SysTargetVentTotalVozOcc(0.0), + SysTimeBelowVozDynTotalOcc(0.0), SysTimeAtVozDynTotalOcc(0.0), SysTimeAboveVozDynTotalOcc(0.0), SysTimeVentUnoccTotal(0.0), + SysTimeOccupiedTotal(0.0) + { + } + }; + // Functions void InitEnergyReports(EnergyPlusData &state); @@ -292,13 +319,34 @@ struct SystemReportsData : BaseGlobalStruct { Array1D SysHCCompSteam; Array1D SysDomesticH2O; - Array1D ZoneOAMassFlow; // zone mech vent mass flow rate {kg/s} - Array1D ZoneOAMass; // zone mech vent total mass for time {kg} - Array1D ZoneOAVolFlowStdRho; // zone mech vent volume flow rate at standard density {m3/s} - Array1D ZoneOAVolStdRho; // zone mech vent total volume OA at standard density {m3/s} - Array1D ZoneOAVolFlowCrntRho; // zone mech vent volume flow rate at current density {m3/s} - Array1D ZoneOAVolCrntRho; // zone mech vent total volume OA at current density {m3/s} - Array1D ZoneMechACH; // zone mech vent air changes per hour {ACH} + Array1D ZoneOAMassFlow; // zone mech vent mass flow rate {kg/s} + Array1D ZoneOAMass; // zone mech vent total mass for time {kg} + Array1D ZoneOAVolFlowStdRho; // zone mech vent volume flow rate at standard density {m3/s} + Array1D ZoneOAVolStdRho; // zone mech vent total volume OA at standard density {m3} + Array1D ZoneOAVolFlowCrntRho; // zone mech vent volume flow rate at current density {m3/s} + Array1D ZoneOAVolCrntRho; // zone mech vent total volume OA at current density {m3} + Array1D ZoneMechACH; // zone mech vent air changes per hour {ACH} + Array1D ZoneTargetVentilationFlowVoz; // zone target ventilation ventilation flow based on 62.1 Voz-dyn {m3/s} + Array1D ZoneTimeBelowVozDyn; // time [hrs] that mechanical+natural ventilation is < VozTarget - 1% + Array1D ZoneTimeAtVozDyn; // time [hrs] that mechanical+natural ventilation is = VozTarget within 1% and > zero + Array1D ZoneTimeAboveVozDyn; // time [hrs] that mechanical+natural ventilation is > VozTarget + 1% + Array1D ZoneTimeVentUnocc; // time [hrs] that mechanical+natural ventilation is > zero during unoccupied + Real64 AnyZoneTimeBelowVozDyn = 0.0; // time [hrs] that any zone mechanical+natural ventilation is < VozTarget - 1% + Real64 AllZonesTimeAtVozDyn = 0.0; // time [hrs] that all zones mechanical+natural ventilation is = VozTarget within 1% and > zero + Real64 AnyZoneTimeAboveVozDyn = 0.0; // time [hrs] that any zone mechanical+natural ventilation is > VozTarget + 1% + Real64 AnyZoneTimeVentUnocc = 0.0; // time [hrs] that any zone mechanical+natural ventilation is > zero during unoccupied + Real64 AnyZoneTimeBelowVozDynOcc = 0.0; // time [hrs] that any zone mechanical+natural ventilation is < VozTarget - 1% during occupied + Real64 AllZonesTimeAtVozDynOcc = 0.0; // time [hrs] that all zones mech+nat vent is = VozTarget within 1% and > zero during occupied + Real64 AnyZoneTimeAboveVozDynOcc = 0.0; // time [hrs] that any zone mechanical+natural ventilation is > VozTarget + 1% during occupied + + Array1D SysMechVentFlow; // air loop mechanical vent total volume OA at standard density {m3/s} + Array1D SysNatVentFlow; // air loop natural vent total volume OA at standard density {m3/s} + Array1D SysTargetVentilationFlowVoz; // air loop target ventilation ventilation flow based on 62.1 Voz-dyn {m3/s} + Array1D SysTimeBelowVozDyn; // time [hrs] that mechanical+natural ventilation is < VozTarget - 1% + Array1D SysTimeAtVozDyn; // time [hrs] that mechanical+natural ventilation is = VozTarget within 1% and > zero + Array1D SysTimeAboveVozDyn; // time [hrs] that mechanical+natural ventilation is > VozTarget + 1% + Array1D SysTimeVentUnocc; // time [hrs] that mechanical+natural ventilation is > zero during unoccupied + Array1D SysAnyZoneOccupied; // true if any zone on system is occupied bool AirLoopLoadsReportEnabled = true; bool VentLoadsReportEnabled = true; @@ -318,6 +366,7 @@ struct SystemReportsData : BaseGlobalStruct { Array1D_bool UnmetLoadFlag; Array1D Vent; + Array1D SysPreDefRep; bool OneTimeFlag_FindFirstLastPtr = true; bool OneTimeFlag_InitEnergyReports = true; @@ -398,6 +447,26 @@ struct SystemReportsData : BaseGlobalStruct { this->ZoneOAVolFlowCrntRho.deallocate(); this->ZoneOAVolCrntRho.deallocate(); this->ZoneMechACH.deallocate(); + this->ZoneTargetVentilationFlowVoz.deallocate(); + this->ZoneTimeBelowVozDyn.deallocate(); + this->ZoneTimeAtVozDyn.deallocate(); + this->ZoneTimeAboveVozDyn.deallocate(); + this->ZoneTimeVentUnocc.deallocate(); + this->AnyZoneTimeBelowVozDyn = 0.0; + this->AllZonesTimeAtVozDyn = 0.0; + this->AnyZoneTimeAboveVozDyn = 0.0; + this->AnyZoneTimeVentUnocc = 0.0; + this->AnyZoneTimeBelowVozDynOcc = 0.0; + this->AllZonesTimeAtVozDynOcc = 0.0; + this->AnyZoneTimeAboveVozDynOcc = 0.0; + this->SysMechVentFlow = 0.0; + this->SysNatVentFlow = 0.0; + this->SysTargetVentilationFlowVoz.deallocate(); + this->SysTimeBelowVozDyn.deallocate(); + this->SysTimeAtVozDyn.deallocate(); + this->SysTimeAboveVozDyn.deallocate(); + this->SysTimeVentUnocc.deallocate(); + this->SysAnyZoneOccupied.deallocate(); this->AirLoopLoadsReportEnabled = true; this->VentLoadsReportEnabled = true; this->VentEnergyReportEnabled = false; @@ -414,6 +483,7 @@ struct SystemReportsData : BaseGlobalStruct { this->NoLoadFlag.deallocate(); this->UnmetLoadFlag.deallocate(); this->Vent.deallocate(); + this->SysPreDefRep.deallocate(); this->OneTimeFlag_FindFirstLastPtr = true; this->OneTimeFlag_InitEnergyReports = true; this->OneTimeFlag_UpdateZoneCompPtrArray = true; diff --git a/src/EnergyPlus/UFADManager.cc b/src/EnergyPlus/UFADManager.cc index d6b2cdc156a..a107fdf2d46 100644 --- a/src/EnergyPlus/UFADManager.cc +++ b/src/EnergyPlus/UFADManager.cc @@ -212,7 +212,7 @@ namespace UFADManager { if (SurfNum == 0) continue; if (Surface(SurfNum).ExtBoundCond == ExternalEnvironment || Surface(SurfNum).ExtBoundCond == OtherSideCoefNoCalcExt || Surface(SurfNum).ExtBoundCond == OtherSideCoefCalcExt || Surface(SurfNum).ExtBoundCond == OtherSideCondModeledExt) { - if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { ++NumShadesDown; } } @@ -971,7 +971,7 @@ namespace UFADManager { Real64 HeightOccupiedSubzoneAve; // Height of center of occupied air subzone Real64 ZoneMult; // total zone multiplier int ZoneNodeNum; // node number of the HVAC zone node - Array1D_int IntGainTypesOccupied(29, + Array1D_int IntGainTypesOccupied(30, {IntGainTypeOf_People, IntGainTypeOf_WaterHeaterMixed, IntGainTypeOf_WaterHeaterStratified, @@ -991,6 +991,7 @@ namespace UFADManager { IntGainTypeOf_ElectricLoadCenterInverterSimple, IntGainTypeOf_ElectricLoadCenterInverterFunctionOfPower, IntGainTypeOf_ElectricLoadCenterInverterLookUpTable, + IntGainTypeOf_ElectricLoadCenterStorageLiIonNmcBattery, IntGainTypeOf_ElectricLoadCenterStorageBattery, IntGainTypeOf_ElectricLoadCenterStorageSimple, IntGainTypeOf_PipeIndoor, @@ -1445,7 +1446,7 @@ namespace UFADManager { int ZoneNodeNum; // node number of the HVAC zone node static Real64 TempDepCoef(0.0); // Formerly CoefSumha, coef in zone temp equation with dimensions of h*A static Real64 TempIndCoef(0.0); // Formerly CoefSumhat, coef in zone temp equation with dimensions of h*A(T1 - static Array1D_int IntGainTypesOccupied(29, + static Array1D_int IntGainTypesOccupied(30, {IntGainTypeOf_People, IntGainTypeOf_WaterHeaterMixed, IntGainTypeOf_WaterHeaterStratified, @@ -1466,6 +1467,7 @@ namespace UFADManager { IntGainTypeOf_ElectricLoadCenterInverterFunctionOfPower, IntGainTypeOf_ElectricLoadCenterInverterLookUpTable, IntGainTypeOf_ElectricLoadCenterStorageBattery, + IntGainTypeOf_ElectricLoadCenterStorageLiIonNmcBattery, IntGainTypeOf_ElectricLoadCenterStorageSimple, IntGainTypeOf_PipeIndoor, IntGainTypeOf_RefrigerationCase, diff --git a/src/EnergyPlus/VentilatedSlab.cc b/src/EnergyPlus/VentilatedSlab.cc index a6e015ca7b4..a6372b0e3b3 100644 --- a/src/EnergyPlus/VentilatedSlab.cc +++ b/src/EnergyPlus/VentilatedSlab.cc @@ -4459,7 +4459,7 @@ namespace VentilatedSlab { Area = Surface(SurfNum).Area; if (Surface(SurfNum).Class == SurfaceClass::Window) { - if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // The area is the shade or blind are = sum of the glazing area and the divider area (which is zero if no divider) Area += SurfWinDividerArea(SurfNum); } @@ -4470,8 +4470,7 @@ namespace VentilatedSlab { SurfWinFrameTempSurfIn(SurfNum); } - if (SurfWinDividerArea(SurfNum) > 0.0 && SurfWinShadingFlag(SurfNum) != IntShadeOn && - SurfWinShadingFlag(SurfNum) != IntBlindOn) { + if (SurfWinDividerArea(SurfNum) > 0.0 && !ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) SumHATsurf += HConvIn(SurfNum) * SurfWinDividerArea(SurfNum) * (1.0 + 2.0 * SurfWinProjCorrDivIn(SurfNum)) * SurfWinDividerTempSurfIn(SurfNum); diff --git a/src/EnergyPlus/WaterThermalTanks.cc b/src/EnergyPlus/WaterThermalTanks.cc index 68f00b407f0..b7328bfadb2 100644 --- a/src/EnergyPlus/WaterThermalTanks.cc +++ b/src/EnergyPlus/WaterThermalTanks.cc @@ -11855,6 +11855,87 @@ namespace WaterThermalTanks { } } + bool GetHeatPumpWaterHeaterNodeNumber(EnergyPlusData &state, int const NodeNumber) + { + // PURPOSE OF THIS FUNCTION: + // Check if a node is used by a heat pump water heater + // and can be excluded from an airflow network. + + // Return value + bool HeatPumpWaterHeaterNodeException; + + int HeatPumpWaterHeaterIndex; + + if (state.dataWaterThermalTanks->getWaterThermalTankInputFlag) { + GetWaterThermalTankInput(state); + state.dataWaterThermalTanks->getWaterThermalTankInputFlag = false; + } + + HeatPumpWaterHeaterNodeException = false; + + for (HeatPumpWaterHeaterIndex = 1; HeatPumpWaterHeaterIndex <= state.dataWaterThermalTanks->numHeatPumpWaterHeater; ++HeatPumpWaterHeaterIndex) { + + // Get heat pump water heater data + HeatPumpWaterHeaterData &HPWH = state.dataWaterThermalTanks->HPWaterHeater(HeatPumpWaterHeaterIndex); + + // "Zone and outdoor air" configuration is expected break the conservation of mass + if (HPWH.InletAirConfiguration != AmbientTempEnum::ZoneAndOA) { + + // Air outlet node + if (NodeNumber == HPWH.HeatPumpAirOutletNode) { + HeatPumpWaterHeaterNodeException = true; + break; + } + + // Air inlet node + if (NodeNumber == HPWH.HeatPumpAirInletNode) { + HeatPumpWaterHeaterNodeException = true; + break; + } + + // Get fan inlet node index + bool ErrorsFound{false}; + int FanInletNodeIndex(0); + if (HPWH.FanType_Num == DataHVACGlobals::FanType_SystemModelObject) { + FanInletNodeIndex = HVACFan::fanObjs[HPWH.FanNum]->inletNodeNum; + } else { + FanInletNodeIndex = Fans::GetFanInletNode(state, HPWH.FanType, HPWH.FanName, ErrorsFound); + if (ErrorsFound) { + ShowWarningError(state, "Could not retrieve fan outlet node for this unit=\"" + HPWH.Name + "\"."); + ErrorsFound = true; + } + } + + // Fan inlet node + if (NodeNumber == FanInletNodeIndex) { + HeatPumpWaterHeaterNodeException = true; + break; + } + + // Fan outlet node + if (NodeNumber == HPWH.FanOutletNode) { + HeatPumpWaterHeaterNodeException = true; + break; + } + + // Outside air node + if (NodeNumber == HPWH.OutsideAirNode) { + HeatPumpWaterHeaterNodeException = true; + break; + } + + // Exhaust air node + if (NodeNumber == HPWH.ExhaustAirNode) { + HeatPumpWaterHeaterNodeException = true; + break; + } + + } + } + + return HeatPumpWaterHeaterNodeException; + } + } // namespace WaterThermalTanks } // namespace EnergyPlus diff --git a/src/EnergyPlus/WaterThermalTanks.hh b/src/EnergyPlus/WaterThermalTanks.hh index 7845673cb10..95952fa081a 100644 --- a/src/EnergyPlus/WaterThermalTanks.hh +++ b/src/EnergyPlus/WaterThermalTanks.hh @@ -894,6 +894,8 @@ namespace WaterThermalTanks { int getHPTankIDX(EnergyPlusData &state, std::string const &CompName, int &CompIndex); + bool GetHeatPumpWaterHeaterNodeNumber(EnergyPlusData &state, int const NodeNumber); + } // namespace WaterThermalTanks struct WaterThermalTanksData : BaseGlobalStruct { diff --git a/src/EnergyPlus/WindowComplexManager.cc b/src/EnergyPlus/WindowComplexManager.cc index ae162afb40c..c22e1351205 100644 --- a/src/EnergyPlus/WindowComplexManager.cc +++ b/src/EnergyPlus/WindowComplexManager.cc @@ -2638,7 +2638,7 @@ namespace WindowComplexManager { int k; // Layer counter int SurfNumAdj; // An interzone surface's number in the adjacent zone int ZoneNumAdj; // An interzone surface's adjacent zone number - int ShadeFlag; // Flag indicating whether shade or blind is on, and shade/blind position + WinShadingType ShadeFlag; // Flag indicating whether shade or blind is on, and shade/blind position int IMix; Real64 IncidentSolar; // Solar incident on outside of window (W) @@ -2897,7 +2897,7 @@ namespace WindowComplexManager { // outdoor wind speed if (!Surface(SurfNum).ExtWind) { wso = 0.0; // No wind exposure - // ELSE IF (Surface(SurfNum)%Class == SurfaceClass::Window .AND. SurfaceWindow(SurfNum)%ShadingFlag == ExtShadeOn) THEN + // ELSE IF (Surface(SurfNum)%Class == SurfaceClass::Window .AND. SurfaceWindow(SurfNum)%ShadingFlag == WinShadingType::ExtShade) THEN // wso = 0.0 ! Assume zero wind speed at outside glass surface of window with exterior shade } else { wso = Surface(SurfNum).WindSpeed; @@ -3294,7 +3294,7 @@ namespace WindowComplexManager { SurfOutsideEmiss = emis(1); IncidentSolar = Surface(SurfNum).Area * SurfQRadSWOutIncident(SurfNum); - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { // Interior shade or blind ConvHeatFlowNatural = -qv(nlayer) * height * width; @@ -3340,7 +3340,7 @@ namespace WindowComplexManager { SurfWinGainConvGlazToZoneRep(SurfNum) = ConvHeatGainFrZoneSideOfGlass; SurfWinGainIRGlazToZoneRep(SurfNum) = NetIRHeatGainGlass; // need to report convective heat flow from the gap in case of exterior shade - if (ShadeFlag == ExtShadeOn) { + if (ShadeFlag == WinShadingType::ExtShade) { ConvHeatFlowNatural = -qv(2) * height * width; // qv(1) is exterior environment SurfWinGapConvHtFlowRep(SurfNum) = ConvHeatFlowNatural; @@ -3400,9 +3400,9 @@ namespace WindowComplexManager { // TransDiff = Construct(ConstrNum).TransDiff; int IState = SurfaceWindow(SurfNum).ComplexFen.NumStates; Real64 TransDiff = SurfaceWindow(SurfNum).ComplexFen.State(IState).WinDiffTrans; - // ELSE IF(ShadeFlag==IntShadeOn .OR. ShadeFlag==ExtShadeOn) THEN + // ELSE IF(ShadeFlag==WinShadingType::IntShade .OR. ShadeFlag==WinShadingType::ExtShade) THEN // TransDiff = Construct(ConstrNum)%TransDiff - // ELSE IF(ShadeFlag==IntBlindOn .OR. ShadeFlag==ExtBlindOn .OR.ShadeFlag==BGBlindOn) THEN + // ELSE IF(ShadeFlag==WinShadingType::IntBlind .OR. ShadeFlag==WinShadingType::ExtBlind .OR.ShadeFlag==WinShadingType::BGBlind) THEN // TransDiff = InterpSlatAng(SurfaceWindow(SurfNum)%SlatAngThisTS,SurfaceWindow(SurfNum)%MovableSlats, & // Construct(ConstrNumSh)%BlTransDiff) // ELSE IF(ShadeFlag == SwitchableGlazing) THEN @@ -3413,7 +3413,7 @@ namespace WindowComplexManager { SurfWinHeatTransfer(SurfNum) -= QS(Surface(SurfNum).SolarEnclIndex) * Surface(SurfNum).Area * TransDiff; SurfWinLossSWZoneToOutWinRep(SurfNum) = QS(Surface(SurfNum).SolarEnclIndex) * Surface(SurfNum).Area * TransDiff; - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn) { + if (ShadeFlag == WinShadingType::IntShade || ShadeFlag == WinShadingType::ExtShade) { SurfWinShadingAbsorbedSolar(SurfNum) = (SurfWinExtBeamAbsByShade(SurfNum) + SurfWinExtDiffAbsByShade(SurfNum)) * (Surface(SurfNum).Area + SurfWinDividerArea(SurfNum)); SurfWinShadingAbsorbedSolarEnergy(SurfNum) = SurfWinShadingAbsorbedSolar(SurfNum) * state.dataGlobal->TimeStepZoneSec; @@ -3431,9 +3431,9 @@ namespace WindowComplexManager { } // Save hcv for use in divider calc with interior or exterior shade (see CalcWinFrameAndDividerTemps) - if (ShadeFlag == IntShadeOn) SurfWinConvCoeffWithShade(SurfNum) = 0.0; + if (ShadeFlag == WinShadingType::IntShade) SurfWinConvCoeffWithShade(SurfNum) = 0.0; - if (ShadeFlag == IntShadeOn) { + if (ShadeFlag == WinShadingType::IntShade) { SurfInsideTemp = theta(2 * ngllayer + 2) - DataGlobalConstants::KelvinConv; // // Get properties of inside shading layer diff --git a/src/EnergyPlus/WindowManager.cc b/src/EnergyPlus/WindowManager.cc index f2ec73e9230..28515b7dda8 100644 --- a/src/EnergyPlus/WindowManager.cc +++ b/src/EnergyPlus/WindowManager.cc @@ -1512,7 +1512,6 @@ namespace WindowManager { int NumHorDividers; // Number of horizontal divider elements int NumVertDividers; // Number of vertical divider elements int BaseSurfNum; // Base surface number - int ShadingType; // Window shading type int MatNum; // Material number int DifOverrideCount; // Count the number of SolarDiffusing material overrides @@ -1545,8 +1544,8 @@ namespace WindowManager { if (Surface(SurfNum).HasShadeControl) { for (int winShadCtrl : Surface(SurfNum).windowShadingControlList) { - ShadingType = WindowShadingControl(winShadCtrl).ShadingType; - if (ShadingType == WSC_ST_ExteriorScreen) { + WinShadingType ShadingType = WindowShadingControl(winShadCtrl).ShadingType; + if (ShadingType == WinShadingType::ExtScreen) { // Count number of exterior window screens, initialize in InitGlassOpticalCalculations after returning // from this subroutine. The blind structure is initialized first and then the screen structure is initialized. ++NumSurfaceScreens; @@ -1616,7 +1615,7 @@ namespace WindowManager { if (!Surface(SurfNum).HasShadeControl) { SurfWinSolarDiffusing(SurfNum) = true; } else { // There is a shading control - if (WindowShadingControl(Surface(SurfNum).activeWindowShadingControl).ShadingType == SwitchableGlazing) { + if (WindowShadingControl(Surface(SurfNum).activeWindowShadingControl).ShadingType == WinShadingType::SwitchableGlazing) { SurfWinSolarDiffusing(SurfNum) = true; } else { SurfWinSolarDiffusing(SurfNum) = false; @@ -2064,7 +2063,7 @@ namespace WindowManager { int IGap; // Gap layer number (1,2,...) int IMix; // Gas number in a mixture of gases int ICoeff; // Gas property index (1,2,3) - int ShadeFlag; // Flag indicating whether shade or blind is on, and shade/blind position + WinShadingType ShadeFlag; // Flag indicating whether shade or blind is on, and shade/blind position int k; // Layer counter // REAL(r64) :: tsky ! Sky temperature [K] int ShadeLayPtr; // Material number corresponding to a shade layer @@ -2321,8 +2320,7 @@ namespace WindowManager { // blind/shade and glass 3. IConst = ConstrNum; - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGShadeOn || - ShadeFlag == BGBlindOn || ShadeFlag == ExtScreenOn) { + if (ANY_SHADE_SCREEN(ShadeFlag) || ANY_BLIND(ShadeFlag)) { IConst = surface.activeShadedConstruction; if (SurfWinStormWinFlag(SurfNum) > 0) IConst = surface.activeStormWinShadedConstruction; } @@ -2346,13 +2344,13 @@ namespace WindowManager { } if (state.dataMaterial->Material(LayPtr).Group == Shade || state.dataMaterial->Material(LayPtr).Group == WindowBlind || state.dataMaterial->Material(LayPtr).Group == Screen) { - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) ShadeLayPtr = state.dataConstruction->Construct(IConst).LayerPoint(state.dataConstruction->Construct(IConst).TotLayers); - if (ShadeFlag == ExtShadeOn || ShadeFlag == ExtBlindOn || ShadeFlag == ExtScreenOn) ShadeLayPtr = state.dataConstruction->Construct(IConst).LayerPoint(1); - if (ShadeFlag == BGShadeOn || ShadeFlag == BGBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) ShadeLayPtr = state.dataConstruction->Construct(IConst).LayerPoint(state.dataConstruction->Construct(IConst).TotLayers); + if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) ShadeLayPtr = state.dataConstruction->Construct(IConst).LayerPoint(1); + if (ANY_BETWEENGLASS_SHADE_BLIND(ShadeFlag)) { ShadeLayPtr = state.dataConstruction->Construct(IConst).LayerPoint(3); if (TotGlassLay == 3) ShadeLayPtr = state.dataConstruction->Construct(IConst).LayerPoint(5); } - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || ShadeFlag == ExtScreenOn) { + if (ANY_SHADE_SCREEN(ShadeFlag)) { // Shade or screen on if (state.dataGlobal->AnyEnergyManagementSystemInModel) { // check to make sure the user hasn't messed up the shade control values if (state.dataMaterial->Material(ShadeLayPtr).Group == WindowBlind) { @@ -2364,7 +2362,7 @@ namespace WindowManager { } state.dataWindowManager->thick(TotGlassLay + 1) = state.dataMaterial->Material(ShadeLayPtr).Thickness; state.dataWindowManager->scon(TotGlassLay + 1) = state.dataMaterial->Material(ShadeLayPtr).Conductivity / state.dataMaterial->Material(ShadeLayPtr).Thickness; - if (ShadeFlag == ExtScreenOn) { + if (ShadeFlag == WinShadingType::ExtScreen) { state.dataWindowManager->emis(state.dataWindowManager->nglface + 1) = state.dataMaterial->Material(ShadeLayPtr).AbsorpThermalFront; state.dataWindowManager->tir(state.dataWindowManager->nglface + 1) = SurfaceScreens(state.dataMaterial->Material(ShadeLayPtr).ScreenDataPtr).DifDifTrans; state.dataWindowManager->tir(state.dataWindowManager->nglface + 2) = SurfaceScreens(state.dataMaterial->Material(ShadeLayPtr).ScreenDataPtr).DifDifTrans; @@ -2412,12 +2410,11 @@ namespace WindowManager { } // End of loop over glass, gap and blind/shade layers in a window construction - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || - ShadeFlag == ExtScreenOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag) || ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) { // Interior or exterior blind, shade or screen is on. // Fill gap between blind/shade and adjacent glass with air properties. ++IGap; - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == ExtScreenOn) { // Interior or exterior shade + if (ShadeFlag == WinShadingType::IntShade || ShadeFlag == WinShadingType::ExtShade || ShadeFlag == WinShadingType::ExtScreen) { // Interior or exterior shade state.dataWindowManager->gap(IGap) = state.dataMaterial->Material(ShadeLayPtr).WinShadeToGlassDist; } else { // Interior or exterior blind state.dataWindowManager->gap(IGap) = Blind(SurfWinBlindNumber(SurfNum)).BlindToGlassDist; @@ -2564,7 +2561,7 @@ namespace WindowManager { dth3 = state.dataWindowManager->thetas(6) - state.dataWindowManager->thetas(5); dth4 = state.dataWindowManager->thetas(8) - state.dataWindowManager->thetas(7); - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { SurfInsideTemp = state.dataWindowManager->thetas(2 * state.dataWindowManager->ngllayer + 2) - state.dataWindowManager->TKelvin; EffShBlEmiss = InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), window.EffShBlindEmiss); EffGlEmiss = InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), window.EffGlassEmiss); @@ -2572,7 +2569,7 @@ namespace WindowManager { } else { SurfInsideTemp = state.dataWindowManager->thetas(2 * state.dataWindowManager->ngllayer) - state.dataWindowManager->TKelvin; } - if (ShadeFlag == ExtShadeOn || ShadeFlag == ExtBlindOn || ShadeFlag == ExtScreenOn) { + if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) { SurfOutsideTemp = state.dataWindowManager->thetas(2 * state.dataWindowManager->ngllayer + 1) - state.dataWindowManager->TKelvin; // this index looks suspicious (CR 8202) // SurfOutsideEmiss = emis(1) ! this index should be coordinated with previous line SurfOutsideEmiss = state.dataWindowManager->emis(2 * state.dataWindowManager->ngllayer + 1); // fix for CR 8202 @@ -2887,7 +2884,7 @@ namespace WindowManager { // 2=exterior shade/blind Real64 TauShIR; // Long-wave transmittance of isolated shade/blind Real64 sconsh; // shade/blind conductance (W/m2-K) - int ShadeFlag; // Shading flag + WinShadingType ShadeFlag; // Shading flag // Real64 ShadeAbsFac1; // Fractions for apportioning absorbed radiation to shade/blind faces // Real64 ShadeAbsFac2; static Array1D AbsRadShadeFace(2); // Solar radiation, short-wave radiation from lights, and long-wave //Tuned Made static @@ -2939,22 +2936,21 @@ namespace WindowManager { AbsRadShadeFace = 0.0; TGapNew = 0.0; - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGShadeOn || - ShadeFlag == BGBlindOn || ShadeFlag == ExtScreenOn) { + if (ANY_SHADE_SCREEN(ShadeFlag) || ANY_BLIND(ShadeFlag)) { state.dataWindowManager->nglfacep = state.dataWindowManager->nglface + 2; AbsRadShadeFace(1) = DataSurfaces::AbsFrontSide(SurfNum); AbsRadShadeFace(2) = DataSurfaces::AbsBackSide(SurfNum); - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) AbsRadShadeFace(2) += SurfWinIntLWAbsByShade(SurfNum); + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) AbsRadShadeFace(2) += SurfWinIntLWAbsByShade(SurfNum); sconsh = state.dataWindowManager->scon(state.dataWindowManager->ngllayer + 1); TauShIR = state.dataWindowManager->tir(state.dataWindowManager->nglface + 1); EpsShIR1 = state.dataWindowManager->emis(state.dataWindowManager->nglface + 1); EpsShIR2 = state.dataWindowManager->emis(state.dataWindowManager->nglface + 2); RhoShIR1 = max(0.0, 1.0 - TauShIR - EpsShIR1); RhoShIR2 = max(0.0, 1.0 - TauShIR - EpsShIR2); - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { RhoGlIR2 = 1.0 - state.dataWindowManager->emis(2 * state.dataWindowManager->ngllayer); ShGlReflFacIR = 1.0 - RhoGlIR2 * RhoShIR1; - } else if (ShadeFlag == ExtShadeOn || ShadeFlag == ExtBlindOn || ShadeFlag == ExtScreenOn) { + } else if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) { RhoGlIR1 = 1.0 - state.dataWindowManager->emis(1); ShGlReflFacIR = 1.0 - RhoGlIR1 * RhoShIR2; } @@ -2986,7 +2982,7 @@ namespace WindowManager { (Surface(SurfNum).IntConvCoeff == -2)) { // coef model is "detailed" and not prescribed by user // need to find inside face index, varies with shade/blind etc. - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { InsideFaceIndex = state.dataWindowManager->nglfacep; } else { InsideFaceIndex = state.dataWindowManager->nglface; @@ -3002,8 +2998,7 @@ namespace WindowManager { // coefficient from glass and shade/blind to gap between glass and shade/blind, // effective gap air temperature, velocity of air in gap and gap outlet temperature. - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || - ShadeFlag == ExtScreenOn) { + if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag) || ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { ExtOrIntShadeNaturalFlow(state, SurfNum, iter, VGap, TGapNew, TGapOutlet, hcv, ConvHeatFlowNatural); if (iter >= 1) { hcv = 0.5 * (hcvPrev + hcv); @@ -3019,7 +3014,7 @@ namespace WindowManager { // get glass-to-air forced convection heat transfer coefficient, average gap air temperature, and // convective heat flow from gap. - if (ShadeFlag != BGShadeOn && ShadeFlag != BGBlindOn && SurfWinAirflowThisTS(SurfNum) > 0.0) { + if (!ANY_BETWEENGLASS_SHADE_BLIND(ShadeFlag) && SurfWinAirflowThisTS(SurfNum) > 0.0) { BetweenGlassForcedFlow(state, SurfNum, iter, VAirflowGap, TAirflowGapNew, TAirflowGapOutlet, hcvAirflowGap, ConvHeatFlowForced); } @@ -3028,7 +3023,7 @@ namespace WindowManager { // Also get average gas temperature in the two gaps, and, for airflow window, the sum of the // convective heat flows from the gaps. - if (ShadeFlag == BGShadeOn || ShadeFlag == BGBlindOn) { + if (ANY_BETWEENGLASS_SHADE_BLIND(ShadeFlag)) { if (SurfWinAirflowThisTS(SurfNum) == 0.0) { // Natural convection in gaps BetweenGlassShadeNaturalFlow(state, SurfNum, iter, VGap, TGapNewBG, hcvBG); } else { // Forced convection in gaps @@ -3052,7 +3047,7 @@ namespace WindowManager { Aface(1, 2) = -state.dataWindowManager->scon(1); Aface(2, 2) = hr(2) + state.dataWindowManager->scon(1) + state.dataWindowManager->hcin; - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { Bface(2) = state.dataWindowManager->Rmir * state.dataWindowManager->emis(2) * TauShIR / ShGlReflFacIR + hcv * TGapNew + state.dataWindowManager->AbsRadGlassFace(2); Bface(3) = state.dataWindowManager->Rmir * TauShIR * RhoGlIR2 * EpsShIR1 / ShGlReflFacIR + hcv * TGapNew + AbsRadShadeFace(1); Bface(4) = state.dataWindowManager->Rmir * EpsShIR2 + state.dataWindowManager->hcin * state.dataWindowManager->tin + AbsRadShadeFace(2); @@ -3066,7 +3061,7 @@ namespace WindowManager { Aface(4, 4) = hr(4) + sconsh + state.dataWindowManager->hcin; } - if (ShadeFlag == ExtShadeOn || ShadeFlag == ExtBlindOn || ShadeFlag == ExtScreenOn) { + if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) { Bface(1) = state.dataWindowManager->Outir * state.dataWindowManager->emis(1) * TauShIR / ShGlReflFacIR + hcv * TGapNew + state.dataWindowManager->AbsRadGlassFace(1); Bface(3) = state.dataWindowManager->Outir * EpsShIR1 + state.dataWindowManager->hcout * state.dataWindowManager->tout + AbsRadShadeFace(1); Bface(4) = state.dataWindowManager->Outir * TauShIR * RhoGlIR1 * EpsShIR2 / ShGlReflFacIR + hcv * TGapNew + AbsRadShadeFace(2); @@ -3108,7 +3103,7 @@ namespace WindowManager { Aface(3, 4) = -state.dataWindowManager->scon(2); Aface(4, 4) = hr(4) + state.dataWindowManager->scon(2) + state.dataWindowManager->hcin; - if (ShadeFlag != BGShadeOn && ShadeFlag != BGBlindOn && SurfWinAirflowThisTS(SurfNum) > 0.0) { + if (!ANY_BETWEENGLASS_SHADE_BLIND(ShadeFlag) && SurfWinAirflowThisTS(SurfNum) > 0.0) { Bface(2) = state.dataWindowManager->AbsRadGlassFace(2) + hcvAirflowGap * TAirflowGapNew; Bface(3) = state.dataWindowManager->AbsRadGlassFace(3) + hcvAirflowGap * TAirflowGapNew; Aface(2, 2) = state.dataWindowManager->scon(1) + hcvAirflowGap - state.dataWindowManager->A23P * hr(2); @@ -3117,7 +3112,7 @@ namespace WindowManager { Aface(3, 3) = hcvAirflowGap + state.dataWindowManager->scon(2) + state.dataWindowManager->A32P * hr(3); } - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { Bface(4) = state.dataWindowManager->Rmir * state.dataWindowManager->emis(4) * TauShIR / ShGlReflFacIR + hcv * TGapNew + state.dataWindowManager->AbsRadGlassFace(4); Bface(5) = state.dataWindowManager->Rmir * TauShIR * RhoGlIR2 * EpsShIR1 / ShGlReflFacIR + hcv * TGapNew + AbsRadShadeFace(1); Bface(6) = state.dataWindowManager->Rmir * EpsShIR2 + state.dataWindowManager->hcin * state.dataWindowManager->tin + AbsRadShadeFace(2); @@ -3131,7 +3126,7 @@ namespace WindowManager { Aface(6, 6) = hr(6) + sconsh + state.dataWindowManager->hcin; } - if (ShadeFlag == ExtShadeOn || ShadeFlag == ExtBlindOn || ShadeFlag == ExtScreenOn) { + if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) { Bface(1) = state.dataWindowManager->Outir * state.dataWindowManager->emis(1) * TauShIR / ShGlReflFacIR + hcv * TGapNew + state.dataWindowManager->AbsRadGlassFace(1); Bface(5) = state.dataWindowManager->Outir * EpsShIR1 + state.dataWindowManager->hcout * state.dataWindowManager->tout + AbsRadShadeFace(1); Bface(6) = state.dataWindowManager->Outir * TauShIR * RhoGlIR1 * EpsShIR2 / ShGlReflFacIR + hcv * TGapNew + AbsRadShadeFace(2); @@ -3145,7 +3140,7 @@ namespace WindowManager { Aface(6, 6) = hr(6) * (1 - RhoGlIR1 * (EpsShIR2 + RhoShIR2)) / ShGlReflFacIR + sconsh + hcv; } - if (ShadeFlag == BGShadeOn || ShadeFlag == BGBlindOn) { + if (ANY_BETWEENGLASS_SHADE_BLIND(ShadeFlag)) { for (i = 1; i <= 6; ++i) { RhoIR(i) = max(0.0, 1.0 - state.dataWindowManager->tir(i) - state.dataWindowManager->emis(i)); } @@ -3226,7 +3221,7 @@ namespace WindowManager { Aface(5, 6) = -state.dataWindowManager->scon(3); Aface(6, 6) = hr(6) + state.dataWindowManager->scon(3) + state.dataWindowManager->hcin; - if (ShadeFlag != BGShadeOn && ShadeFlag != BGBlindOn && SurfWinAirflowThisTS(SurfNum) > 0.0) { + if (!ANY_BETWEENGLASS_SHADE_BLIND(ShadeFlag) && SurfWinAirflowThisTS(SurfNum) > 0.0) { Bface(4) = state.dataWindowManager->AbsRadGlassFace(4) + hcvAirflowGap * TAirflowGapNew; Bface(5) = state.dataWindowManager->AbsRadGlassFace(5) + hcvAirflowGap * TAirflowGapNew; Aface(4, 4) = state.dataWindowManager->scon(2) + hcvAirflowGap - state.dataWindowManager->A45P * hr(4); @@ -3235,7 +3230,7 @@ namespace WindowManager { Aface(5, 5) = hcvAirflowGap + state.dataWindowManager->scon(3) + state.dataWindowManager->A54P * hr(5); } - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { Bface(6) = state.dataWindowManager->Rmir * state.dataWindowManager->emis(6) * TauShIR / ShGlReflFacIR + hcv * TGapNew + state.dataWindowManager->AbsRadGlassFace(6); Bface(7) = state.dataWindowManager->Rmir * TauShIR * RhoGlIR2 * EpsShIR1 / ShGlReflFacIR + hcv * TGapNew + AbsRadShadeFace(1); Bface(8) = state.dataWindowManager->Rmir * EpsShIR2 + state.dataWindowManager->hcin * state.dataWindowManager->tin + AbsRadShadeFace(2); @@ -3247,9 +3242,7 @@ namespace WindowManager { Aface(8, 7) = -sconsh; Aface(7, 8) = -sconsh; Aface(8, 8) = hr(8) + sconsh + state.dataWindowManager->hcin; - } - - if (ShadeFlag == ExtShadeOn || ShadeFlag == ExtBlindOn || ShadeFlag == ExtScreenOn) { + } else if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) { Bface(1) = state.dataWindowManager->Outir * state.dataWindowManager->emis(1) * TauShIR / ShGlReflFacIR + hcv * TGapNew + state.dataWindowManager->AbsRadGlassFace(1); Bface(7) = state.dataWindowManager->Outir * EpsShIR1 + state.dataWindowManager->hcout * state.dataWindowManager->tout + AbsRadShadeFace(1); Bface(8) = state.dataWindowManager->Outir * TauShIR * RhoGlIR1 * EpsShIR2 / ShGlReflFacIR + hcv * TGapNew + AbsRadShadeFace(2); @@ -3261,9 +3254,7 @@ namespace WindowManager { Aface(1, 8) = -hr(1) * EpsShIR2 / ShGlReflFacIR; Aface(7, 8) = -sconsh; Aface(8, 8) = hr(8) * (1 - RhoGlIR1 * (EpsShIR2 + RhoShIR2)) / ShGlReflFacIR + sconsh + hcv; - } - - if (ShadeFlag == BGShadeOn || ShadeFlag == BGBlindOn) { + } else if (ANY_BETWEENGLASS_SHADE_BLIND(ShadeFlag)) { for (i = 1; i <= 8; ++i) { RhoIR(i) = max(0.0, 1.0 - state.dataWindowManager->tir(i) - state.dataWindowManager->emis(i)); } @@ -3361,7 +3352,7 @@ namespace WindowManager { Aface(7, 8) = -state.dataWindowManager->scon(4); Aface(8, 8) = hr(8) + state.dataWindowManager->scon(4) + state.dataWindowManager->hcin; - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { Bface(8) = state.dataWindowManager->Rmir * state.dataWindowManager->emis(8) * TauShIR / ShGlReflFacIR + hcv * TGapNew + state.dataWindowManager->AbsRadGlassFace(8); Bface(9) = state.dataWindowManager->Rmir * TauShIR * RhoGlIR2 * EpsShIR1 / ShGlReflFacIR + hcv * TGapNew + AbsRadShadeFace(1); Bface(10) = state.dataWindowManager->Rmir * EpsShIR2 + state.dataWindowManager->hcin * state.dataWindowManager->tin + AbsRadShadeFace(2); @@ -3375,7 +3366,7 @@ namespace WindowManager { Aface(10, 10) = hr(10) + sconsh + state.dataWindowManager->hcin; } - if (ShadeFlag == ExtShadeOn || ShadeFlag == ExtBlindOn || ShadeFlag == ExtScreenOn) { + if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) { Bface(1) = state.dataWindowManager->Outir * state.dataWindowManager->emis(1) * TauShIR / ShGlReflFacIR + hcv * TGapNew + state.dataWindowManager->AbsRadGlassFace(1); Bface(9) = state.dataWindowManager->Outir * EpsShIR1 + state.dataWindowManager->hcout * state.dataWindowManager->tout + AbsRadShadeFace(1); Bface(10) = state.dataWindowManager->Outir * TauShIR * RhoGlIR1 * EpsShIR2 / ShGlReflFacIR + hcv * TGapNew + AbsRadShadeFace(2); @@ -3427,7 +3418,7 @@ namespace WindowManager { // For all cases, get total window heat gain for reporting. See CalcWinFrameAndDividerTemps for // contribution of frame and divider. IncidentSolar = Surface(SurfNum).Area * SurfQRadSWOutIncident(SurfNum); - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { // Interior shade or blind SurfWinConvHeatFlowNatural(SurfNum) = ConvHeatFlowNatural; // Window heat gain from glazing and shade/blind to zone. Consists of transmitted solar, convection @@ -3508,14 +3499,14 @@ namespace WindowManager { } TransDiff = state.dataConstruction->Construct(ConstrNum).TransDiff; // Default value for TransDiff here - if (ShadeFlag <= 0) { + if (NOT_SHADED(ShadeFlag)) { TransDiff = state.dataConstruction->Construct(ConstrNum).TransDiff; - } else if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == BGShadeOn || ShadeFlag == ExtScreenOn) { + } else if (ANY_SHADE_SCREEN(ShadeFlag)) { TransDiff = state.dataConstruction->Construct(ConstrNumSh).TransDiff; - } else if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGBlindOn) { + } else if (ANY_BLIND(ShadeFlag)) { TransDiff = InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), state.dataConstruction->Construct(ConstrNumSh).BlTransDiff); - } else if (ShadeFlag == SwitchableGlazing) { + } else if (ShadeFlag == WinShadingType::SwitchableGlazing) { TransDiff = InterpSw(SurfWinSwitchingFactor(SurfNum), state.dataConstruction->Construct(ConstrNum).TransDiff, state.dataConstruction->Construct(ConstrNumSh).TransDiff); } SurfWinHeatGain(SurfNum) -= QS(Surface(SurfNum).SolarEnclIndex) * Surface(SurfNum).Area * TransDiff; @@ -3523,8 +3514,7 @@ namespace WindowManager { // shouldn't this be + outward flowing fraction of absorbed SW? -- do not know whose comment this is? LKL (9/2012) SurfWinLossSWZoneToOutWinRep(SurfNum) = QS(Surface(SurfNum).SolarEnclIndex) * Surface(SurfNum).Area * TransDiff; - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGShadeOn || - ShadeFlag == BGBlindOn || ShadeFlag == ExtScreenOn) { + if (ANY_SHADE_SCREEN(ShadeFlag) || ANY_BLIND(ShadeFlag)) { SurfWinShadingAbsorbedSolar(SurfNum) = (SurfWinExtBeamAbsByShade(SurfNum) + SurfWinExtDiffAbsByShade(SurfNum)) * (Surface(SurfNum).Area + SurfWinDividerArea(SurfNum)); SurfWinShadingAbsorbedSolarEnergy(SurfNum) = SurfWinShadingAbsorbedSolar(SurfNum) * state.dataGlobal->TimeStepZoneSec; @@ -3543,7 +3533,7 @@ namespace WindowManager { } // Save hcv for use in divider calc with interior or exterior shade (see CalcWinFrameAndDividerTemps) - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == ExtScreenOn) + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag) || ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) SurfWinConvCoeffWithShade(SurfNum) = hcv; } else { // No convergence after MaxIterations even with relaxed error tolerance @@ -3638,7 +3628,7 @@ namespace WindowManager { Real64 gr; // glass-shade/blind gap Grashof number Real64 pr; // glass-shade/blind gap Prandtl number Real64 nu; // glass-shade/blind gap Nusselt number - int ShadeFlag; // Shading flag + WinShadingType ShadeFlag; // Shading flag int BlNum; // Blind number // Air properties @@ -3651,7 +3641,7 @@ namespace WindowManager { nglassfaces = 2 * state.dataConstruction->Construct(ConstrNumSh).TotGlassLayers; TotGaps = state.dataConstruction->Construct(ConstrNumSh).TotGlassLayers; - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) { // Interior shade or blind + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { // Interior shade or blind MatNumSh = state.dataConstruction->Construct(ConstrNumSh).LayerPoint(nglassfaces); TGapInlet = state.dataWindowManager->tin; TGlassFace = state.dataWindowManager->thetas(nglassfaces); @@ -3689,7 +3679,7 @@ namespace WindowManager { GapHeight = Surface(SurfNum).Height; - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == ExtScreenOn) { + if (ShadeFlag == WinShadingType::IntShade || ShadeFlag == WinShadingType::ExtShade || ShadeFlag == WinShadingType::ExtScreen) { // Shade or Screen on GapDepth = state.dataMaterial->Material(MatNumSh).WinShadeToGlassDist; AGap = GapDepth * Surface(SurfNum).Width; @@ -3753,7 +3743,7 @@ namespace WindowManager { TGapNew = TAve - (GapHeightChar / GapHeight) * (TGapOutlet - TGapInlet); // Convective heat flow from gap to room air for interior shade or blind - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { RhoAir = state.dataWindowManager->AirProps(1) + state.dataWindowManager->AirProps(2) * (TGapNew - state.dataWindowManager->TKelvin); QConvGap = RhoAir * AGap * VGap * 1008.0 * (TGapOutlet - TGapInlet); // Exclude convection to gap due to divider, if present; divider convection handled @@ -3838,7 +3828,7 @@ namespace WindowManager { Real64 gr; // Gap gas Grashof number Real64 pr; // Gap gas Prandtl number Real64 nu; // Gap gas Nusselt number - int ShadeFlag; // Shading flag + WinShadingType ShadeFlag; // Shading flag int BlNum; // Blind number int IGap; // Gap counter; 1 = gap on outer side of shade/blind, 2 = gap on inner side. int IGapInc; // Gap increment (0 or 1) @@ -3892,7 +3882,7 @@ namespace WindowManager { GapDepth = state.dataWindowManager->gap(1 + IGapInc); AGap = GapDepth * Surface(SurfNum).Width; - if (ShadeFlag == BGShadeOn) { + if (ShadeFlag == WinShadingType::BGShade) { // Shade on ATopGap = state.dataMaterial->Material(MatNumSh).WinShadeTopOpeningMult * AGap; ABotGap = state.dataMaterial->Material(MatNumSh).WinShadeBottomOpeningMult * AGap; @@ -4128,7 +4118,7 @@ namespace WindowManager { Real64 gr; // Gap air Grashof number Real64 pr; // Gap air Prandtl number Real64 nu; // Gap air Nusselt number - int ShadeFlag; // Shading flag + WinShadingType ShadeFlag; // Shading flag int IGap; // Gap counter; 1 = gap on outer side of shade/blind, 2 = gap on inner side. int IGapInc; // Gap increment; =0, double glass, =1, triple glass // REAL(r64) :: AirProps(8) ! Air properties @@ -4618,7 +4608,7 @@ namespace WindowManager { Real64 const resgap(0.21); // Typical gap resistance (m2-K/W) int i; // Face counter - int ShadeFlag; // Shading flag + WinShadingType ShadeFlag; // Shading flag static Array1D rguess(11); // Combined radiative/convective resistance (m2-K/W) of //Tuned Made static // inside or outside air film, or gap Real64 restot; // Total window resistance including outside @@ -4675,9 +4665,9 @@ namespace WindowManager { // Initialize face temperatures of shade or blind, if present ShadeFlag = SurfWinShadingFlag(SurfNum); - if (SurfWinExtIntShadePrevTS(SurfNum) == IntShadeOn || SurfWinExtIntShadePrevTS(SurfNum) == IntBlindOn || - SurfWinExtIntShadePrevTS(SurfNum) == ExtShadeOn || SurfWinExtIntShadePrevTS(SurfNum) == ExtBlindOn || - SurfWinExtIntShadePrevTS(SurfNum) == BGShadeOn || SurfWinExtIntShadePrevTS(SurfNum) == BGBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(SurfWinExtIntShadePrevTS(SurfNum)) || + SurfWinExtIntShadePrevTS(SurfNum) == WinShadingType::ExtShade || SurfWinExtIntShadePrevTS(SurfNum) == WinShadingType::ExtBlind || + ANY_BETWEENGLASS_SHADE_BLIND(SurfWinExtIntShadePrevTS(SurfNum))) { // Shade or blind is on during the previous TS; use previous-TS values of shade/blind face temps. // Note that if shade or blind is NOT on in the current TS the following two // temperature values, although calculated here, are not used. The shade/blind face numbers @@ -4697,15 +4687,13 @@ namespace WindowManager { // equal to tout. For between-glass shade/blind it is assumed to be equal to the // average temperature of the adjacent glass faces. - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { state.dataWindowManager->thetas(state.dataWindowManager->nglface + 1) = state.dataWindowManager->tin + (AbsRadShade(1) + AbsRadShade(2)) / (2 * (state.dataWindowManager->hcin + hrad)); state.dataWindowManager->thetas(state.dataWindowManager->nglface + 2) = state.dataWindowManager->thetas(state.dataWindowManager->nglface + 1); - } - if (ShadeFlag == ExtShadeOn || ShadeFlag == ExtBlindOn) { + } else if (ShadeFlag == WinShadingType::ExtShade || ShadeFlag == WinShadingType::ExtBlind) { state.dataWindowManager->thetas(state.dataWindowManager->nglface + 1) = state.dataWindowManager->tout + (AbsRadShade(1) + AbsRadShade(2)) / (2 * (state.dataWindowManager->hcout + hrad)); state.dataWindowManager->thetas(state.dataWindowManager->nglface + 2) = state.dataWindowManager->thetas(state.dataWindowManager->nglface + 1); - } - if (ShadeFlag == BGShadeOn || ShadeFlag == BGBlindOn) { + } else if (ANY_BETWEENGLASS_SHADE_BLIND(ShadeFlag)) { // Between-glass shade/blind allowed only for double and triple glazing. // The factor 16.0 below is based on a combined convective/radiative heat transfer // coefficient on either side of the shade/blind of 8.0 W/m2-K -- about 1.4 Btu/h-ft2-F. @@ -5738,7 +5726,7 @@ namespace WindowManager { Real64 TOutRad; // Outside radiative temperature (K) Real64 TOutRadFr; // Effective outside radiative temperature for frame (K) Real64 TOutRadDiv; // Effective outside radiative temperature for divider (K) - int ShadeFlag; // Window shading flag + WinShadingType ShadeFlag; // Window shading flag Real64 FrameCon; // Frame conductance (W/m2-K) Real64 Afac; // Intermediate calculation variables @@ -5862,7 +5850,7 @@ namespace WindowManager { if (FrameDivider(FrDivNum).DividerProjectionOut > 0.0) { HOutRad *= (1.0 + 2.0 * SurfWinProjCorrDivOut(SurfNum)); - if (SurfWinShadingFlag(SurfNum) == ExtShadeOn) HOutConvDiv = SurfWinConvCoeffWithShade(SurfNum); + if (SurfWinShadingFlag(SurfNum) == WinShadingType::ExtShade) HOutConvDiv = SurfWinConvCoeffWithShade(SurfNum); HOutConvDiv *= (1.0 + 2.0 * SurfWinProjCorrDivOut(SurfNum)); // Add long-wave from outside window surface absorbed by divider outside projection SurfWinDividerQRadOutAbs(SurfNum) += SurfWinProjCorrDivOut(SurfNum) * FrameDivider(FrDivNum).DividerEmis * @@ -5873,7 +5861,7 @@ namespace WindowManager { if (FrameDivider(FrDivNum).DividerProjectionIn > 0.0) { HInRad *= (1.0 + 2.0 * SurfWinProjCorrDivIn(SurfNum)); - if (SurfWinShadingFlag(SurfNum) == IntShadeOn) HInConvDiv = SurfWinConvCoeffWithShade(SurfNum); + if (SurfWinShadingFlag(SurfNum) == WinShadingType::IntShade) HInConvDiv = SurfWinConvCoeffWithShade(SurfNum); HInConvDiv *= (1.0 + 2.0 * SurfWinProjCorrDivIn(SurfNum)); // Add long-wave from inside window surface absorbed by divider inside projection SurfWinDividerQRadInAbs(SurfNum) += SurfWinProjCorrDivIn(SurfNum) * FrameDivider(FrDivNum).DividerEmis * EmisGlassIn * @@ -5905,7 +5893,7 @@ namespace WindowManager { // from the inside surface of the divider goes directly into the zone air -- i.e., the IR radiative // interaction between divider and shade is ignored due to the difficulty of calculating this interaction // at the same time that the interaction between glass and shade is calculated. - if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn) + if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) SurfWinDividerHeatGain(SurfNum) = DividerHeatGain; DivTempOut = SurfWinDividerTempSurfOut(SurfNum) + state.dataWindowManager->TKelvin; } // End of check if window has dividers @@ -6016,7 +6004,7 @@ namespace WindowManager { Array1D hgap(5); // Conductive gap conductance [W/m2-K] Array1D hGapTot(5); // Combined radiative and conductive gap conductance [W/m2-K] Real64 Rbare; // Nominal center-of-glass resistance without air films [m2-K/W] - int ShadeFlag; // Shading flag + WinShadingType ShadeFlag; // Shading flag Real64 ShadeRes; // Thermal resistance of shade int MatOutside; // Material number of outside layer of construction int MatInside; // Material number of inside layer of construction @@ -6117,42 +6105,42 @@ namespace WindowManager { state.dataWindowManager->Outir = state.dataWindowManager->sigma * pow_4(state.dataWindowManager->tout); // Determine whether construction has an exterior or interior shade or blind - ShadeFlag = NoShade; + ShadeFlag = WinShadingType::NoShade; ShadeRes = 0.0; MatOutside = state.dataConstruction->Construct(ConstrNum).LayerPoint(1); MatInside = state.dataConstruction->Construct(ConstrNum).LayerPoint(TotLay); if (state.dataMaterial->Material(MatOutside).Group == 2) { // Exterior shade present MatShade = MatOutside; - ShadeFlag = ExtShadeOn; + ShadeFlag = WinShadingType::ExtShade; // Set glazing outside convection coefficient to Window 4 still-air value state.dataWindowManager->hcout = 12.25; } else if (state.dataMaterial->Material(MatOutside).Group == 7) { // Exterior screen present MatShade = MatOutside; ScNum = state.dataMaterial->Material(MatShade).ScreenDataPtr; // Orphaned constructs with exterior screen are ignored - if (ScNum > 0) ShadeFlag = ExtScreenOn; + if (ScNum > 0) ShadeFlag = WinShadingType::ExtScreen; state.dataWindowManager->hcout = 12.25; } else if (state.dataMaterial->Material(MatOutside).Group == 5) { // Exterior blind present MatShade = MatOutside; - ShadeFlag = ExtBlindOn; + ShadeFlag = WinShadingType::ExtBlind; BlNum = state.dataMaterial->Material(MatShade).BlindDataPtr; state.dataWindowManager->hcout = 12.25; } else if (state.dataMaterial->Material(MatInside).Group == 2) { // Interior shade present MatShade = MatInside; - ShadeFlag = IntShadeOn; + ShadeFlag = WinShadingType::IntShade; } else if (state.dataMaterial->Material(MatInside).Group == 5) { // Interior blind present MatShade = MatInside; BlNum = state.dataMaterial->Material(MatShade).BlindDataPtr; - ShadeFlag = IntBlindOn; + ShadeFlag = WinShadingType::IntBlind; } else if (TotGlassLay == 2) { - if (state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(3)).Group == 2) ShadeFlag = BGShadeOn; - if (state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(3)).Group == 5) ShadeFlag = BGBlindOn; + if (state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(3)).Group == 2) ShadeFlag = WinShadingType::BGShade; + if (state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(3)).Group == 5) ShadeFlag = WinShadingType::BGBlind; } else if (TotGlassLay == 3) { - if (state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(5)).Group == 2) ShadeFlag = BGShadeOn; - if (state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(5)).Group == 5) ShadeFlag = BGBlindOn; + if (state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(5)).Group == 2) ShadeFlag = WinShadingType::BGShade; + if (state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(5)).Group == 5) ShadeFlag = WinShadingType::BGBlind; } - if (ShadeFlag == BGShadeOn || ShadeFlag == BGBlindOn) { + if (ANY_BETWEENGLASS_SHADE_BLIND(ShadeFlag)) { errFlag = 2; return; } @@ -6160,10 +6148,10 @@ namespace WindowManager { TSolNorm = POLYF(1.0, state.dataConstruction->Construct(ConstrNum).TransSolBeamCoef); TVisNorm = POLYF(1.0, state.dataConstruction->Construct(ConstrNum).TransVisBeamCoef); AbsBeamShadeNorm = 0.0; - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn) { // Exterior or interior shade on + if (ShadeFlag == WinShadingType::IntShade || ShadeFlag == WinShadingType::ExtShade) { // Exterior or interior shade on AbsBeamShadeNorm = POLYF(1.0, state.dataConstruction->Construct(ConstrNum).AbsBeamShadeCoef); // Exterior blind or screen or interior blind on - } else if (ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == ExtScreenOn) { + } else if (ShadeFlag == WinShadingType::IntBlind || ShadeFlag == WinShadingType::ExtBlind || ShadeFlag == WinShadingType::ExtScreen) { // Find unshaded construction that goes with this construction w/blind or screen ConstrNumBare = 0; for (ConstrNum1 = 1; ConstrNum1 <= TotConstructs; ++ConstrNum1) { @@ -6175,7 +6163,7 @@ namespace WindowManager { ConstrNumBare = ConstrNum1; for (Lay = 1; Lay <= state.dataConstruction->Construct(ConstrNum1).TotLayers; ++Lay) { LayPtr = state.dataConstruction->Construct(ConstrNum1).LayerPoint(Lay); - if (ShadeFlag == IntBlindOn) { // The shaded construction has an interior blind + if (ShadeFlag == WinShadingType::IntBlind) { // The shaded construction has an interior blind LayPtrSh = state.dataConstruction->Construct(ConstrNum).LayerPoint(Lay); } else { // The shaded construction has an exterior blind or screen LayPtrSh = state.dataConstruction->Construct(ConstrNum).LayerPoint(Lay + 1); @@ -6193,7 +6181,7 @@ namespace WindowManager { TBmBm = POLYF(1.0, state.dataConstruction->Construct(ConstrNumBare).TransSolBeamCoef); TBmBmVis = POLYF(1.0, state.dataConstruction->Construct(ConstrNumBare).TransVisBeamCoef); - if (ShadeFlag == ExtScreenOn) { + if (ShadeFlag == WinShadingType::ExtScreen) { // Don't need to call subroutine, use normal incident properties (SUBROUTINE CalcNominalWindowCond) // Last call to CalcScreenTransmittance(ISurf) was done at direct normal angle (0,0) in CalcWindowScreenProperties TScBmBm = SurfaceScreens(ScNum).BmBmTrans; @@ -6225,7 +6213,7 @@ namespace WindowManager { TBlBmDifVis = InterpProfSlatAng(0.0, SlatAng, VarSlats, Blind(BlNum).VisFrontBeamDiffTrans); TDif = state.dataConstruction->Construct(ConstrNumBare).TransDiff; TDifVis = state.dataConstruction->Construct(ConstrNumBare).TransDiffVis; - if (ShadeFlag == IntBlindOn) { + if (ShadeFlag == WinShadingType::IntBlind) { RGlDiffBack = state.dataConstruction->Construct(ConstrNumBare).ReflectSolDiffBack; RGlDiffBackVis = state.dataConstruction->Construct(ConstrNumBare).ReflectVisDiffBack; RhoBlFront = InterpProfSlatAng(0.0, SlatAng, VarSlats, Blind(BlNum).SolFrontBeamDiffRefl); @@ -6242,7 +6230,7 @@ namespace WindowManager { TVisNorm = TBmBmVis * (TBlBmBm + TBlBmDifVis + TBlDifDifVis * RhoBlFrontVis * RGlDiffBackVis / (1.0 - RhoBlDiffFrontVis * RGlDiffBackVis)); } // (IntBlind) - if (ShadeFlag == ExtBlindOn) { + if (ShadeFlag == WinShadingType::ExtBlind) { TBlBmBm = BlindBeamBeamTrans(0.0, SlatAng, Blind(BlNum).SlatWidth, Blind(BlNum).SlatSeparation, Blind(BlNum).SlatThickness); RGlFront = POLYF(1.0, state.dataConstruction->Construct(ConstrNumBare).ReflSolBeamFrontCoef); RGlFrontVis = POLYF(1.0, state.dataConstruction->Construct(ConstrNumBare).ReflSolBeamFrontCoef); @@ -6293,16 +6281,16 @@ namespace WindowManager { state.dataWindowManager->tir(2 * IGlass - 1) = state.dataMaterial->Material(LayPtr).TransThermal; state.dataWindowManager->tir(2 * IGlass) = state.dataMaterial->Material(LayPtr).TransThermal; AbsBeamNorm(IGlass) = POLYF(1.0, state.dataConstruction->Construct(ConstrNum).AbsBeamCoef({1, 6}, IGlass)); - if (ShadeFlag == IntBlindOn) { // Interior blind on + if (ShadeFlag == WinShadingType::IntBlind) { // Interior blind on AbsBeamNorm(IGlass) = POLYF(1.0, state.dataConstruction->Construct(ConstrNumBare).AbsBeamCoef({1, 6}, IGlass)); AGlDiffBack = state.dataConstruction->Construct(ConstrNumBare).AbsDiffBack(IGlass); AbsBeamNorm(IGlass) += TBmBm * AGlDiffBack * RhoBlFront / (1.0 - RhoBlFront * RGlDiffBack); - } else if (ShadeFlag == ExtBlindOn) { // Exterior blind on + } else if (ShadeFlag == WinShadingType::ExtBlind) { // Exterior blind on AbsBeamNorm(IGlass) = POLYF(1.0, state.dataConstruction->Construct(ConstrNumBare).AbsBeamCoef({1, 6}, IGlass)); AbsBeamNorm(IGlass) = TBlBmBm * AbsBeamNorm(IGlass) + (TBlBmBm * RGlFront * RhoBlBack + TBlBmDif) * state.dataConstruction->Construct(ConstrNumBare).AbsDiff(IGlass) / (1.0 - RGlDiffFront * RhoBlDiffBack); - } else if (ShadeFlag == ExtScreenOn) { // Exterior screen on + } else if (ShadeFlag == WinShadingType::ExtScreen) { // Exterior screen on AbsBeamNorm(IGlass) = POLYF(1.0, state.dataConstruction->Construct(ConstrNumBare).AbsBeamCoef({1, 6}, IGlass)); AbsBeamNorm(IGlass) = TScBmBm * AbsBeamNorm(IGlass) + (TScBmBm * RGlFront * RScBack + TScBmDif) * state.dataConstruction->Construct(ConstrNumBare).AbsDiff(IGlass) / @@ -6363,7 +6351,7 @@ namespace WindowManager { hInRad = state.dataWindowManager->emis(state.dataWindowManager->nglface) * state.dataWindowManager->sigma * 0.5 * pow_3(state.dataWindowManager->tin + state.dataWindowManager->thetas(state.dataWindowManager->nglface)); rIn = 1.0 / (hInRad + state.dataWindowManager->hcin); - if (!(ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn)) AbsBeamShadeNorm = 0.0; + if (!ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) AbsBeamShadeNorm = 0.0; { auto const SELECT_CASE_var(state.dataWindowManager->ngllayer); @@ -7457,7 +7445,6 @@ namespace WindowManager { Real64 SumReflect; // Integration variable for reflectance Real64 SumReflectVis; // Integration variable for visible reflectance Real64 SumArea; // Integration variable for area of quarter hemisphere - int ShadingType; // Type of shading device bool FoundMaterial; // Flag to avoid printing screen transmittance data multiple times when Material:WindowScreen // is used on multiple surfaces bool PrintTransMap; // Flag used to print transmittance map @@ -7509,8 +7496,8 @@ namespace WindowManager { if (Surface(SurfNum).HasShadeControl) { ConstrNumSh = Surface(SurfNum).activeShadedConstruction; MatNum = state.dataConstruction->Construct(ConstrNumSh).LayerPoint(1); - ShadingType = WindowShadingControl(Surface(SurfNum).activeWindowShadingControl).ShadingType; - if (ShadingType == WSC_ST_ExteriorScreen) { + WinShadingType ShadingType = WindowShadingControl(Surface(SurfNum).activeWindowShadingControl).ShadingType; + if (ShadingType == WinShadingType::ExtScreen) { if (state.dataMaterial->Material(MatNum).ScreenMapResolution > 0) PrintTransMap = true; ++ScreenNum; diff --git a/src/EnergyPlus/WindowManagerExteriorThermal.cc b/src/EnergyPlus/WindowManagerExteriorThermal.cc index 6b01cb5d458..c566d4420d8 100644 --- a/src/EnergyPlus/WindowManagerExteriorThermal.cc +++ b/src/EnergyPlus/WindowManagerExteriorThermal.cc @@ -110,9 +110,7 @@ namespace WindowManager { // Interior and exterior shading layers have gas between them and IGU but that gas // was not part of construction so it needs to be increased by one - if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == ExtShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn || - SurfWinShadingFlag(SurfNum) == ExtBlindOn || SurfWinShadingFlag(SurfNum) == ExtScreenOn || SurfWinShadingFlag(SurfNum) == BGShadeOn || - SurfWinShadingFlag(SurfNum) == BGBlindOn) { + if (ANY_SHADE_SCREEN(SurfWinShadingFlag(SurfNum)) || ANY_BLIND(SurfWinShadingFlag(SurfNum))) { ++totSolidLayers; } @@ -141,7 +139,7 @@ namespace WindowManager { ++i; } SurfInsideTemp = aTemp - DataGlobalConstants::KelvinConv; - if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { auto EffShBlEmiss = InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), window.EffShBlindEmiss); auto EffGlEmiss = InterpSlatAng(SurfWinSlatAngThisTS(SurfNum), SurfWinMovableSlats(SurfNum), window.EffGlassEmiss); SurfWinEffInsSurfTemp(SurfNum) = @@ -150,7 +148,7 @@ namespace WindowManager { } HConvIn(SurfNum) = aSystem->getHc(Environment::Indoor); - if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn || aFactory.isInteriorShade()) { + if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))|| aFactory.isInteriorShade()) { // It is not clear why EnergyPlus keeps this interior calculations separately for interior shade. This does create different // solution from heat transfer from tarcog itself. Need to confirm with LBNL team about this approach. Note that heat flow // through shade (consider case when openings are zero) is different from heat flow obtained by these equations. Will keep @@ -248,23 +246,22 @@ namespace WindowManager { m_ConstructionNumber = m_Surface.Construction; m_ShadePosition = ShadePosition::NoShade; - if (ShadeFlag == IntShadeOn || ShadeFlag == ExtShadeOn || ShadeFlag == IntBlindOn || ShadeFlag == ExtBlindOn || ShadeFlag == BGShadeOn || - ShadeFlag == BGBlindOn || ShadeFlag == ExtScreenOn) { + if (ANY_SHADE_SCREEN(ShadeFlag) || ANY_BLIND(ShadeFlag)) { m_ConstructionNumber = m_Surface.activeShadedConstruction; if (SurfWinStormWinFlag(t_SurfNum) > 0) m_ConstructionNumber = m_Surface.activeStormWinShadedConstruction; } m_TotLay = getNumOfLayers(state); - if (ShadeFlag == IntShadeOn || ShadeFlag == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) { m_ShadePosition = ShadePosition::Interior; } - if (ShadeFlag == ExtShadeOn || ShadeFlag == ExtBlindOn || ShadeFlag == ExtScreenOn) { + if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) { m_ShadePosition = ShadePosition::Exterior; } - if (ShadeFlag == BGShadeOn || ShadeFlag == BGBlindOn) { + if (ANY_BETWEENGLASS_SHADE_BLIND(ShadeFlag)) { m_ShadePosition = ShadePosition::Between; } } @@ -303,9 +300,7 @@ namespace WindowManager { { auto ConstrNum = m_Surface.Construction; - if (SurfWinShadingFlag(m_SurfNum) == IntShadeOn || SurfWinShadingFlag(m_SurfNum) == ExtShadeOn || SurfWinShadingFlag(m_SurfNum) == IntBlindOn || - SurfWinShadingFlag(m_SurfNum) == ExtBlindOn || SurfWinShadingFlag(m_SurfNum) == BGShadeOn || SurfWinShadingFlag(m_SurfNum) == BGBlindOn || - SurfWinShadingFlag(m_SurfNum) == ExtScreenOn) { + if (ANY_SHADE_SCREEN(SurfWinShadingFlag(m_SurfNum)) || ANY_BLIND(SurfWinShadingFlag(m_SurfNum))) { ConstrNum = m_Surface.activeShadedConstruction; if (SurfWinStormWinFlag(m_SurfNum) > 0) ConstrNum = m_Surface.activeStormWinShadedConstruction; } @@ -499,10 +494,10 @@ namespace WindowManager { auto aGas = getAir(); auto thickness = 0.0; - if (SurfWinShadingFlag(m_SurfNum) == IntBlindOn || SurfWinShadingFlag(m_SurfNum) == ExtBlindOn) { + if (SurfWinShadingFlag(m_SurfNum) == WinShadingType::IntBlind || SurfWinShadingFlag(m_SurfNum) == WinShadingType::ExtBlind) { thickness = Blind(SurfWinBlindNumber(m_SurfNum)).BlindToGlassDist; } - if (SurfWinShadingFlag(m_SurfNum) == IntShadeOn || SurfWinShadingFlag(m_SurfNum) == ExtShadeOn || SurfWinShadingFlag(m_SurfNum) == ExtScreenOn) { + if (SurfWinShadingFlag(m_SurfNum) == WinShadingType::IntShade || SurfWinShadingFlag(m_SurfNum) == WinShadingType::ExtShade || SurfWinShadingFlag(m_SurfNum) == WinShadingType::ExtScreen) { auto material = getLayerMaterial(state, t_Index); thickness = material->WinShadeToGlassDist; } diff --git a/src/EnergyPlus/ZoneEquipmentManager.cc b/src/EnergyPlus/ZoneEquipmentManager.cc index a9f398e60c0..9cff89a6453 100644 --- a/src/EnergyPlus/ZoneEquipmentManager.cc +++ b/src/EnergyPlus/ZoneEquipmentManager.cc @@ -1001,6 +1001,7 @@ namespace EnergyPlus::ZoneEquipmentManager { FinalZoneSizing(CtrlZoneNum).HeatDesTempDiff = ZoneSizingInput(ZoneSizNum).HeatDesTempDiff; FinalZoneSizing(CtrlZoneNum).CoolDesHumRat = ZoneSizingInput(ZoneSizNum).CoolDesHumRat; FinalZoneSizing(CtrlZoneNum).HeatDesHumRat = ZoneSizingInput(ZoneSizNum).HeatDesHumRat; + FinalZoneSizing(CtrlZoneNum).ZoneAirDistributionIndex = ZoneSizingInput(ZoneSizNum).ZoneAirDistributionIndex; FinalZoneSizing(CtrlZoneNum).ZoneDesignSpecOAIndex = ZoneSizingInput(ZoneSizNum).ZoneDesignSpecOAIndex; FinalZoneSizing(CtrlZoneNum).OADesMethod = ZoneSizingInput(ZoneSizNum).OADesMethod; FinalZoneSizing(CtrlZoneNum).DesOAFlowPPer = ZoneSizingInput(ZoneSizNum).DesOAFlowPPer; @@ -1034,6 +1035,7 @@ namespace EnergyPlus::ZoneEquipmentManager { CalcFinalZoneSizing(CtrlZoneNum).HeatDesTempDiff = ZoneSizingInput(ZoneSizNum).HeatDesTempDiff; CalcFinalZoneSizing(CtrlZoneNum).CoolDesHumRat = ZoneSizingInput(ZoneSizNum).CoolDesHumRat; CalcFinalZoneSizing(CtrlZoneNum).HeatDesHumRat = ZoneSizingInput(ZoneSizNum).HeatDesHumRat; + CalcFinalZoneSizing(CtrlZoneNum).ZoneAirDistributionIndex = ZoneSizingInput(ZoneSizNum).ZoneAirDistributionIndex; CalcFinalZoneSizing(CtrlZoneNum).ZoneDesignSpecOAIndex = ZoneSizingInput(ZoneSizNum).ZoneDesignSpecOAIndex; CalcFinalZoneSizing(CtrlZoneNum).OADesMethod = ZoneSizingInput(ZoneSizNum).OADesMethod; CalcFinalZoneSizing(CtrlZoneNum).DesOAFlowPPer = ZoneSizingInput(ZoneSizNum).DesOAFlowPPer; @@ -1066,6 +1068,7 @@ namespace EnergyPlus::ZoneEquipmentManager { FinalZoneSizing(CtrlZoneNum).HeatDesTempDiff = ZoneSizingInput(1).HeatDesTempDiff; FinalZoneSizing(CtrlZoneNum).CoolDesHumRat = ZoneSizingInput(1).CoolDesHumRat; FinalZoneSizing(CtrlZoneNum).HeatDesHumRat = ZoneSizingInput(1).HeatDesHumRat; + FinalZoneSizing(CtrlZoneNum).ZoneAirDistributionIndex = ZoneSizingInput(1).ZoneAirDistributionIndex; FinalZoneSizing(CtrlZoneNum).ZoneDesignSpecOAIndex = ZoneSizingInput(1).ZoneDesignSpecOAIndex; FinalZoneSizing(CtrlZoneNum).OADesMethod = ZoneSizingInput(1).OADesMethod; FinalZoneSizing(CtrlZoneNum).DesOAFlowPPer = ZoneSizingInput(1).DesOAFlowPPer; @@ -1099,6 +1102,7 @@ namespace EnergyPlus::ZoneEquipmentManager { CalcFinalZoneSizing(CtrlZoneNum).HeatDesTempDiff = ZoneSizingInput(1).HeatDesTempDiff; CalcFinalZoneSizing(CtrlZoneNum).CoolDesHumRat = ZoneSizingInput(1).CoolDesHumRat; CalcFinalZoneSizing(CtrlZoneNum).HeatDesHumRat = ZoneSizingInput(1).HeatDesHumRat; + CalcFinalZoneSizing(CtrlZoneNum).ZoneAirDistributionIndex = ZoneSizingInput(1).ZoneAirDistributionIndex; CalcFinalZoneSizing(CtrlZoneNum).ZoneDesignSpecOAIndex = ZoneSizingInput(1).ZoneDesignSpecOAIndex; CalcFinalZoneSizing(CtrlZoneNum).OADesMethod = ZoneSizingInput(1).OADesMethod; CalcFinalZoneSizing(CtrlZoneNum).DesOAFlowPPer = ZoneSizingInput(1).DesOAFlowPPer; @@ -1257,6 +1261,7 @@ namespace EnergyPlus::ZoneEquipmentManager { // Use the max occupancy data from the PEOPLE structure to calculate design min OA for each zone // from the outside air flow per person input TotPeopleInZone = 0.0; + Real64 ZoneMinOccupancy = 0.; ZoneIndex = FinalZoneSizing(CtrlZoneNum).ActualZoneNum; for (PeopleNum = 1; PeopleNum <= TotPeople; ++PeopleNum) { if (People(PeopleNum).ZonePtr == FinalZoneSizing(CtrlZoneNum).ActualZoneNum) { @@ -1268,6 +1273,7 @@ namespace EnergyPlus::ZoneEquipmentManager { } else { FinalZoneSizing(CtrlZoneNum).ZonePeakOccupancy = TotPeopleInZone; } + ZoneMinOccupancy += TotPeopleInZone * ScheduleManager::GetScheduleMinValue(state, People(PeopleNum).NumberOfPeoplePtr); } } FinalZoneSizing(CtrlZoneNum).TotalZoneFloorArea = @@ -1283,10 +1289,20 @@ namespace EnergyPlus::ZoneEquipmentManager { FinalZoneSizing(CtrlZoneNum).TotPeopleInZone = TotPeopleInZone; FinalZoneSizing(CtrlZoneNum).TotalOAFromPeople = OAFromPeople; FinalZoneSizing(CtrlZoneNum).TotalOAFromArea = OAFromArea; + + // save Voz for predefined outdoor air summary report + Real64 MinEz = std::min(FinalZoneSizing(CtrlZoneNum).ZoneADEffCooling, FinalZoneSizing(CtrlZoneNum).ZoneADEffHeating); + if (MinEz == 0) { + MinEz = 1.0; // if not calculated assume 1.0 ventilation effectiveness + } + DataHeatBalance::ZonePreDefRep(ZoneIndex).VozMin = (ZoneMinOccupancy * FinalZoneSizing(CtrlZoneNum).DesOAFlowPPer + OAFromArea) / MinEz; + // Calculate the design min OA flow rate for this zone UseOccSchFlag = false; UseMinOASchFlag = false; DSOAPtr = FinalZoneSizing(CtrlZoneNum).ZoneDesignSpecOAIndex; + state.dataZoneEquip->ZoneEquipConfig(CtrlZoneNum).ZoneDesignSpecOAIndex = DSOAPtr; // store for later use + state.dataZoneEquip->ZoneEquipConfig(CtrlZoneNum).ZoneAirDistributionIndex = FinalZoneSizing(CtrlZoneNum).ZoneAirDistributionIndex; // store for later use OAVolumeFlowRate = CalcDesignSpecificationOutdoorAir(state, DSOAPtr, ZoneIndex, UseOccSchFlag, UseMinOASchFlag); // Zone(ZoneIndex)%Multiplier and Zone(ZoneIndex)%ListMultiplier applied in CalcDesignSpecificationOutdoorAir @@ -2616,7 +2632,11 @@ namespace EnergyPlus::ZoneEquipmentManager { // Determine flow rate and temperature of supply air based on type of damper - bool AdjustZoneMassFlowFlag(true); // holds zone mixing and infiltration flow calc status + //bool AdjustZoneMassFlowFlag(true); // holds zone mixing and infiltration flow calc status + + bool AdjustZoneMixingFlowFlag(true); // holds zone mixing air flow calc status + bool AdjustZoneInfiltrationFlowFlag(true); // holds zone infiltration air flow calc status + FirstCall = true; ErrorFlag = false; @@ -2665,7 +2685,9 @@ namespace EnergyPlus::ZoneEquipmentManager { // and controllers if (ZoneAirMassFlow.EnforceZoneMassBalance) { - CalcAirFlowSimple(state, 0, AdjustZoneMassFlowFlag); + if (ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::NoAdjustReturnAndMixing) AdjustZoneMixingFlowFlag = false; + if (ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::NoInfiltrationFlow) AdjustZoneInfiltrationFlowFlag = false; + CalcAirFlowSimple(state, 0, AdjustZoneMixingFlowFlag, AdjustZoneInfiltrationFlowFlag); } for (ControlledZoneNum = 1; ControlledZoneNum <= state.dataGlobal->NumOfZones; ++ControlledZoneNum) { @@ -3826,12 +3848,7 @@ namespace EnergyPlus::ZoneEquipmentManager { using DataLoopNode::Node; using namespace DataRoomAirModel; // UCSD - using DataHeatBalance::AddInfiltrationFlow; - using DataHeatBalance::AdjustInfiltrationFlow; - using DataHeatBalance::AllZones; - using DataHeatBalance::Infiltration; using DataHeatBalance::MassConservation; - using DataHeatBalance::NoInfiltrationFlow; using DataHeatBalance::Zone; using DataHeatBalance::ZoneAirMassFlow; using DataHeatBalFanSys::MixingMassFlowZone; @@ -3852,6 +3869,8 @@ namespace EnergyPlus::ZoneEquipmentManager { Real64 TotInletAirMassFlowRateMaxAvail; Real64 TotInletAirMassFlowRateMin; Real64 TotInletAirMassFlowRateMinAvail; + Real64 TotInletAirMassFlowRate; + Real64 TotExhaustAirMassFlowRate; Real64 ZoneMixingAirMassFlowRate; Real64 ZoneMixingNetAirMassFlowRate; @@ -3865,10 +3884,16 @@ namespace EnergyPlus::ZoneEquipmentManager { int Iteration; int ZoneNum1; + Real64 BuildingZoneReturnFlow; + Real64 BuildingZoneReturnFlowOld; + ZoneMassBalanceHVACReSim = false; Iteration = 0; BuildingZoneMixingFlow = 0.0; BuildingZoneMixingFlowOld = 0.0; + BuildingZoneReturnFlow = 0.0; + BuildingZoneReturnFlowOld = 0.0; + // Total loop supply and recirc flows (these have been zeroed earlier in InitZoneEquipment for (int airDistUnit = 1; airDistUnit <= state.dataDefineEquipment->NumAirDistUnits; ++airDistUnit) { @@ -3909,6 +3934,9 @@ namespace EnergyPlus::ZoneEquipmentManager { BuildingZoneMixingFlowOld = BuildingZoneMixingFlow; BuildingZoneMixingFlow = 0.0; + BuildingZoneReturnFlowOld = BuildingZoneReturnFlow; + BuildingZoneReturnFlow = 0.0; + for (ZoneNum1 = 1; ZoneNum1 <= state.dataGlobal->NumOfZones; ++ZoneNum1) { int ZoneNum = ZoneNum1; if (ZoneAirMassFlow.EnforceZoneMassBalance) ZoneNum = ZoneReOrder(ZoneNum1); @@ -3920,6 +3948,9 @@ namespace EnergyPlus::ZoneEquipmentManager { TotInletAirMassFlowRateMaxAvail = 0.0; TotInletAirMassFlowRateMin = 0.0; TotInletAirMassFlowRateMinAvail = 0.0; + TotInletAirMassFlowRate = 0.0; + TotExhaustAirMassFlowRate = 0.0; + state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotExhaustAirMassFlowRate = 0.0; ZoneMixingAirMassFlowRate = 0.0; @@ -3940,12 +3971,15 @@ namespace EnergyPlus::ZoneEquipmentManager { } } + TotInletAirMassFlowRate = state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotInletAirMassFlowRate; + for (NodeNum = 1; NodeNum <= state.dataZoneEquip->ZoneEquipConfig(ZoneNum).NumExhaustNodes; ++NodeNum) { if (AirflowNetwork::AirflowNetworkNumOfExhFan == 0) { state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotExhaustAirMassFlowRate += Node(state.dataZoneEquip->ZoneEquipConfig(ZoneNum).ExhaustNode(NodeNum)).MassFlowRate; } } + TotExhaustAirMassFlowRate = state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotExhaustAirMassFlowRate; // Include zone mixing mass flow rate if (ZoneMassBalanceFlag(ZoneNum)) { @@ -3957,29 +3991,27 @@ namespace EnergyPlus::ZoneEquipmentManager { } } // Set zone mixing incoming mass flow rate - if ((Iteration == 0) || !ZoneAirMassFlow.BalanceMixing) { + if ((Iteration == 0) || ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustReturnOnly || + ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustReturnThenMixing) { ZoneMixingAirMassFlowRate = MixingMassFlowZone(ZoneNum); } else { - ZoneMixingAirMassFlowRate = - max(0.0, - ZoneReturnAirMassFlowRate + state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotExhaustAirMassFlowRate - - state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotInletAirMassFlowRate + MassConservation(ZoneNum).MixingSourceMassFlowRate); + ZoneMixingAirMassFlowRate = max(0.0, ZoneReturnAirMassFlowRate + TotExhaustAirMassFlowRate - + TotInletAirMassFlowRate + MassConservation(ZoneNum).MixingSourceMassFlowRate); } CalcZoneMixingFlowRateOfReceivingZone(ZoneNum, ZoneMixingAirMassFlowRate); ZoneMixingNetAirMassFlowRate = MassConservation(ZoneNum).MixingMassFlowRate - MassConservation(ZoneNum).MixingSourceMassFlowRate; - } ZoneNode = state.dataZoneEquip->ZoneEquipConfig(ZoneNum).ZoneNode; - Node(ZoneNode).MassFlowRate = state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotInletAirMassFlowRate; + Node(ZoneNode).MassFlowRate = TotInletAirMassFlowRate; Node(ZoneNode).MassFlowRateMax = TotInletAirMassFlowRateMax; Node(ZoneNode).MassFlowRateMaxAvail = TotInletAirMassFlowRateMaxAvail; Node(ZoneNode).MassFlowRateMin = TotInletAirMassFlowRateMin; Node(ZoneNode).MassFlowRateMinAvail = TotInletAirMassFlowRateMinAvail; // Calculate standard return air flow rate using default method of inlets minus exhausts adjusted for "balanced" exhaust flow - StdTotalReturnMassFlow = state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotInletAirMassFlowRate + ZoneMixingNetAirMassFlowRate - - (state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotExhaustAirMassFlowRate - state.dataZoneEquip->ZoneEquipConfig(ZoneNum).ZoneExhBalanced); + StdTotalReturnMassFlow = TotInletAirMassFlowRate + ZoneMixingNetAirMassFlowRate - + (TotExhaustAirMassFlowRate - state.dataZoneEquip->ZoneEquipConfig(ZoneNum).ZoneExhBalanced); if (!ZoneAirMassFlow.EnforceZoneMassBalance) { if (StdTotalReturnMassFlow < 0.0) { state.dataZoneEquip->ZoneEquipConfig(ZoneNum).ExcessZoneExh = -StdTotalReturnMassFlow; @@ -3994,61 +4026,78 @@ namespace EnergyPlus::ZoneEquipmentManager { Real64 FinalTotalReturnMassFlow = 0; CalcZoneReturnFlows(state, ZoneNum, StdTotalReturnMassFlow, FinalTotalReturnMassFlow); - MassConservation(ZoneNum).RetMassFlowRate = FinalTotalReturnMassFlow; - - // Set zone infiltration flow rate - if (ZoneAirMassFlow.InfiltrationTreatment != NoInfiltrationFlow) { - if (MassConservation(ZoneNum).InfiltrationPtr > 0) { - if (MassConservation(ZoneNum).IsOnlySourceZone || (ZoneAirMassFlow.InfiltrationZoneType == AllZones)) { - ZoneInfiltrationMassFlowRate = MassConservation(ZoneNum).MixingSourceMassFlowRate - MassConservation(ZoneNum).MixingMassFlowRate + - state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotExhaustAirMassFlowRate + ZoneReturnAirMassFlowRate - - state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotInletAirMassFlowRate; - if (ZoneAirMassFlow.InfiltrationTreatment == AdjustInfiltrationFlow) { - if (std::abs(ZoneInfiltrationMassFlowRate) > ConvergenceTolerance) { - ZoneInfiltrationFlag(ZoneNum) = true; - MassConservation(ZoneNum).InfiltrationMassFlowRate = ZoneInfiltrationMassFlowRate; - MassConservation(ZoneNum).IncludeInfilToZoneMassBal = 1; - Infiltration(MassConservation(ZoneNum).InfiltrationPtr).MassFlowRate = ZoneInfiltrationMassFlowRate; - Infiltration(MassConservation(ZoneNum).InfiltrationPtr).MassFlowRate = - max(0.0, Infiltration(MassConservation(ZoneNum).InfiltrationPtr).MassFlowRate); - } else { - Infiltration(MassConservation(ZoneNum).InfiltrationPtr).MassFlowRate = 0.0; - MassConservation(ZoneNum).InfiltrationMassFlowRate = 0.0; - } - } else if (ZoneAirMassFlow.InfiltrationTreatment == AddInfiltrationFlow) { - if (ZoneInfiltrationMassFlowRate > ConvergenceTolerance) { - ZoneInfiltrationFlag(ZoneNum) = true; - MassConservation(ZoneNum).InfiltrationMassFlowRate = ZoneInfiltrationMassFlowRate; - MassConservation(ZoneNum).IncludeInfilToZoneMassBal = 1; - Infiltration(MassConservation(ZoneNum).InfiltrationPtr).MassFlowRate += ZoneInfiltrationMassFlowRate; - } else { - MassConservation(ZoneNum).InfiltrationMassFlowRate = 0.0; - } - } else if (ZoneAirMassFlow.InfiltrationTreatment == NoInfiltrationFlow) { - MassConservation(ZoneNum).InfiltrationMassFlowRate = 0.0; - } - } else { - if (ZoneAirMassFlow.InfiltrationTreatment == AdjustInfiltrationFlow) { - MassConservation(ZoneNum).InfiltrationMassFlowRate = - Infiltration(MassConservation(ZoneNum).InfiltrationPtr).MassFlowRate; - } else if (ZoneAirMassFlow.InfiltrationTreatment == AddInfiltrationFlow) { - MassConservation(ZoneNum).InfiltrationMassFlowRate = 0.0; - } else if (ZoneAirMassFlow.InfiltrationTreatment == NoInfiltrationFlow) { - MassConservation(ZoneNum).InfiltrationMassFlowRate = 0.0; - } + if (ZoneAirMassFlow.EnforceZoneMassBalance) { + // set mass conservation variables + MassConservation(ZoneNum).InMassFlowRate = TotInletAirMassFlowRate; + MassConservation(ZoneNum).ExhMassFlowRate = TotExhaustAirMassFlowRate; + + if (ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustMixingOnly || + ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustMixingThenReturn) { + ZoneReturnAirMassFlowRate = FinalTotalReturnMassFlow; + Real64 AdjustedTotalReturnMassFlow = 0; + MassConservation(ZoneNum).RetMassFlowRate = FinalTotalReturnMassFlow; + ZoneReturnAirMassFlowRate = FinalTotalReturnMassFlow; + if (ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustMixingThenReturn) { + + // Calculate return air flow rate using mass conservation equation + AdjustedTotalReturnMassFlow = TotInletAirMassFlowRate - TotExhaustAirMassFlowRate + ZoneMixingNetAirMassFlowRate; + AdjustedTotalReturnMassFlow = max(0.0, AdjustedTotalReturnMassFlow); + Real64 zoneReturnFlowMax = 0.0; + ZoneReturnFlowsMaximum(state, ZoneNum, zoneReturnFlowMax); + AdjustedTotalReturnMassFlow = min(AdjustedTotalReturnMassFlow, zoneReturnFlowMax); + // add adjust zone return node air flow calc + CalcZoneReturnFlows(state, ZoneNum, AdjustedTotalReturnMassFlow, FinalTotalReturnMassFlow); + MassConservation(ZoneNum).RetMassFlowRate = FinalTotalReturnMassFlow; + ZoneReturnAirMassFlowRate = FinalTotalReturnMassFlow; + } + // Set zone infiltration air flow rate + CalcZoneInfiltrationFlows(state, ZoneNum, ZoneReturnAirMassFlowRate); + + } else if (ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustReturnOnly || + ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustReturnThenMixing) { + + Real64 zoneReturnFlowMax = 0.0; + Real64 AdjustedTotalReturnMassFlow = 0; + // Calculate return air flow rate using mass conservation equation + AdjustedTotalReturnMassFlow = TotInletAirMassFlowRate - TotExhaustAirMassFlowRate + ZoneMixingNetAirMassFlowRate; + AdjustedTotalReturnMassFlow = max(0.0, AdjustedTotalReturnMassFlow); + ZoneReturnFlowsMaximum(state, ZoneNum, zoneReturnFlowMax); + AdjustedTotalReturnMassFlow = min(AdjustedTotalReturnMassFlow, zoneReturnFlowMax); + + // add adjust zone return node air flow calculation + CalcZoneReturnFlows(state, ZoneNum, AdjustedTotalReturnMassFlow, FinalTotalReturnMassFlow); + MassConservation(ZoneNum).RetMassFlowRate = FinalTotalReturnMassFlow; + ZoneReturnAirMassFlowRate = FinalTotalReturnMassFlow; + + if (ZoneAirMassFlow.ZoneFlowAdjustment == DataHeatBalance::AdjustReturnThenMixing) { + ZoneMixingAirMassFlowRate = max(0.0, + ZoneReturnAirMassFlowRate + TotExhaustAirMassFlowRate - TotInletAirMassFlowRate + + MassConservation(ZoneNum).MixingSourceMassFlowRate); + CalcZoneMixingFlowRateOfReceivingZone(ZoneNum, ZoneMixingAirMassFlowRate); + ZoneMixingNetAirMassFlowRate = + MassConservation(ZoneNum).MixingMassFlowRate - MassConservation(ZoneNum).MixingSourceMassFlowRate; + + // Calculate return air flow rate using mass conservation equation + AdjustedTotalReturnMassFlow = TotInletAirMassFlowRate - TotExhaustAirMassFlowRate + ZoneMixingNetAirMassFlowRate; + AdjustedTotalReturnMassFlow = max(0.0, AdjustedTotalReturnMassFlow); + AdjustedTotalReturnMassFlow = min(AdjustedTotalReturnMassFlow, zoneReturnFlowMax); + // add adjust zone return node air flow calc + CalcZoneReturnFlows(state, ZoneNum, AdjustedTotalReturnMassFlow, FinalTotalReturnMassFlow); + MassConservation(ZoneNum).RetMassFlowRate = FinalTotalReturnMassFlow; + ZoneReturnAirMassFlowRate = FinalTotalReturnMassFlow; } + + // Set zone infiltration air flow rate + CalcZoneInfiltrationFlows(state, ZoneNum, ZoneReturnAirMassFlowRate); } else { - // Zone has no infiltration objects - MassConservation(ZoneNum).InfiltrationMassFlowRate = 0.0; + // if infiltration treatment method is not None + // Set zone infiltration air flow rate + CalcZoneInfiltrationFlows(state, ZoneNum, ZoneReturnAirMassFlowRate); } } - // - if (ZoneMassBalanceFlag(ZoneNum)) { - MassConservation(ZoneNum).InMassFlowRate = state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotInletAirMassFlowRate; - MassConservation(ZoneNum).ExhMassFlowRate = state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotExhaustAirMassFlowRate; - } BuildingZoneMixingFlow += MassConservation(ZoneNum).MixingMassFlowRate; + BuildingZoneReturnFlow += MassConservation(ZoneNum).RetMassFlowRate; // Accumulate airloop total return flows and allocate excess exhaust flows for (int returnNum = 1; returnNum <= state.dataZoneEquip->ZoneEquipConfig(ZoneNum).NumReturnNodes; ++returnNum) { @@ -4145,7 +4194,9 @@ namespace EnergyPlus::ZoneEquipmentManager { // update the if (Iteration > 0) { - if (std::abs(BuildingZoneMixingFlow - BuildingZoneMixingFlowOld) < ConvergenceTolerance) { + Real64 totalResidual = 0.0; + totalResidual = std::abs(BuildingZoneMixingFlow - BuildingZoneMixingFlowOld) + std::abs(BuildingZoneReturnFlow - BuildingZoneReturnFlowOld); + if (totalResidual < ConvergenceTolerance) { ZoneMassBalanceHVACReSim = false; break; } else { @@ -4230,7 +4281,7 @@ namespace EnergyPlus::ZoneEquipmentManager { returnNodeMassFlow = inletMassFlow; thisZoneEquip.FixedReturnFlow(returnNum) = true; } - // if zone mass balance true, set to expected return flow + // if zone mass balance true, set totReturnFlow to expected return flow if (DataHeatBalance::ZoneAirMassFlow.EnforceZoneMassBalance ) { returnNodeMassFlow = ExpTotalReturnMassFlow; } @@ -4264,9 +4315,9 @@ namespace EnergyPlus::ZoneEquipmentManager { returnNodeMassFlow = max(0.0, (ExpTotalReturnMassFlow * returnSchedFrac * airLoopReturnFrac)); } } - // if zone mass balance true, set to expected return flow + // if zone mass balance true, set totReturnFlow to expected return flow if (DataHeatBalance::ZoneAirMassFlow.EnforceZoneMassBalance ) { - returnNodeMassFlow = ExpTotalReturnMassFlow; + returnNodeMassFlow = ExpTotalReturnMassFlow; } } } @@ -4299,6 +4350,83 @@ namespace EnergyPlus::ZoneEquipmentManager { } } + + void ZoneReturnFlowsMaximum(EnergyPlusData &state, + int const ZoneNum, + Real64 &MaximumZoneReturnMassFlow // maximum zone total return air mass flow rate + ) + { + MaximumZoneReturnMassFlow = 0.0; + // sets the zone return node maximum flow rate to the airloop design supply flow rate + for (int returnNum = 1; returnNum <= state.dataZoneEquip->ZoneEquipConfig(ZoneNum).NumReturnNodes; ++returnNum) { + int airLoop = state.dataZoneEquip->ZoneEquipConfig(ZoneNum).ReturnNodeAirLoopNum(returnNum); + if (airLoop > 0) { + auto &thisAirLoopFlow(state.dataAirLoop->AirLoopFlow(airLoop)); + MaximumZoneReturnMassFlow = thisAirLoopFlow.DesSupply; + } + } + } + + void CalcZoneInfiltrationFlows(EnergyPlusData &state, + int const ZoneNum, // current zone index + Real64 &ZoneReturnAirMassFlowRate // zone total zone return air mass flow rate + ) + { + Real64 const ConvergenceTolerance(0.000010); + Real64 ZoneInfiltrationMassFlowRate = 0.0; + + // Set zone infiltration flow rate + if (DataHeatBalance::ZoneAirMassFlow.InfiltrationTreatment != DataHeatBalance::NoInfiltrationFlow) { + if (DataHeatBalance::MassConservation(ZoneNum).InfiltrationPtr > 0) { + if (DataHeatBalance::MassConservation(ZoneNum).IsOnlySourceZone || + (DataHeatBalance::ZoneAirMassFlow.InfiltrationZoneType == DataHeatBalance::AllZones)) { + ZoneInfiltrationMassFlowRate = DataHeatBalance::MassConservation(ZoneNum).MixingSourceMassFlowRate - + DataHeatBalance::MassConservation(ZoneNum).MixingMassFlowRate + + state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotExhaustAirMassFlowRate + + ZoneReturnAirMassFlowRate - state.dataZoneEquip->ZoneEquipConfig(ZoneNum).TotInletAirMassFlowRate; + if (DataHeatBalance::ZoneAirMassFlow.InfiltrationTreatment == DataHeatBalance::AdjustInfiltrationFlow) { + if (std::abs(ZoneInfiltrationMassFlowRate) > ConvergenceTolerance) { + DataHeatBalFanSys::ZoneInfiltrationFlag(ZoneNum) = true; + DataHeatBalance::MassConservation(ZoneNum).InfiltrationMassFlowRate = ZoneInfiltrationMassFlowRate; + DataHeatBalance::MassConservation(ZoneNum).IncludeInfilToZoneMassBal = 1; + DataHeatBalance::Infiltration(DataHeatBalance::MassConservation(ZoneNum).InfiltrationPtr).MassFlowRate = + ZoneInfiltrationMassFlowRate; + DataHeatBalance::Infiltration(DataHeatBalance::MassConservation(ZoneNum).InfiltrationPtr).MassFlowRate = + max(0.0, DataHeatBalance::Infiltration(DataHeatBalance::MassConservation(ZoneNum).InfiltrationPtr).MassFlowRate); + } else { + DataHeatBalance::MassConservation(ZoneNum).InfiltrationMassFlowRate = 0.0; + DataHeatBalance::Infiltration(DataHeatBalance::MassConservation(ZoneNum).InfiltrationPtr).MassFlowRate = 0.0; + } + } else if (DataHeatBalance::ZoneAirMassFlow.InfiltrationTreatment == DataHeatBalance::AddInfiltrationFlow) { + if (ZoneInfiltrationMassFlowRate > ConvergenceTolerance) { + DataHeatBalFanSys::ZoneInfiltrationFlag(ZoneNum) = true; + DataHeatBalance::MassConservation(ZoneNum).InfiltrationMassFlowRate = ZoneInfiltrationMassFlowRate; + DataHeatBalance::MassConservation(ZoneNum).IncludeInfilToZoneMassBal = 1; + DataHeatBalance::Infiltration(DataHeatBalance::MassConservation(ZoneNum).InfiltrationPtr).MassFlowRate += + ZoneInfiltrationMassFlowRate; + } else { + DataHeatBalance::MassConservation(ZoneNum).InfiltrationMassFlowRate = 0.0; + } + } else if (DataHeatBalance::ZoneAirMassFlow.InfiltrationTreatment == DataHeatBalance::NoInfiltrationFlow) { + DataHeatBalance::MassConservation(ZoneNum).InfiltrationMassFlowRate = 0.0; + } + } else { + if (DataHeatBalance::ZoneAirMassFlow.InfiltrationTreatment == DataHeatBalance::AdjustInfiltrationFlow) { + DataHeatBalance::MassConservation(ZoneNum).InfiltrationMassFlowRate = + DataHeatBalance::Infiltration(DataHeatBalance::MassConservation(ZoneNum).InfiltrationPtr).MassFlowRate; + } else if (DataHeatBalance::ZoneAirMassFlow.InfiltrationTreatment == DataHeatBalance::AddInfiltrationFlow) { + DataHeatBalance::MassConservation(ZoneNum).InfiltrationMassFlowRate = 0.0; + } else if (DataHeatBalance::ZoneAirMassFlow.InfiltrationTreatment == DataHeatBalance::NoInfiltrationFlow) { + DataHeatBalance::MassConservation(ZoneNum).InfiltrationMassFlowRate = 0.0; + } + } + } else { + // Zone has no infiltration objects + DataHeatBalance::MassConservation(ZoneNum).InfiltrationMassFlowRate = 0.0; + } + } + } + void CalcZoneLeavingConditions(EnergyPlusData &state, bool const FirstHVACIteration) { @@ -4516,7 +4644,8 @@ namespace EnergyPlus::ZoneEquipmentManager { } void CalcAirFlowSimple(EnergyPlusData &state, int const SysTimestepLoop, // System time step index - bool const AdjustZoneMassFlowFlag // flags to adjust zone mxing and infiltration mass flow rates + bool const AdjustZoneMixingFlowFlag, // holds zone mixing air flow calc status + bool const AdjustZoneInfiltrationFlowFlag // holds zone mixing air flow calc status ) { @@ -5034,7 +5163,7 @@ namespace EnergyPlus::ZoneEquipmentManager { CpAir = PsyCpAirFnW((state.dataZoneEquip->ZHumRat(n) + state.dataZoneEquip->ZHumRat(m)) / 2.0); // Use average conditions Mixing(j).DesiredAirFlowRate = Mixing(j).DesiredAirFlowRateSaved; - if (ZoneMassBalanceFlag(n) && AdjustZoneMassFlowFlag) { + if (ZoneMassBalanceFlag(n) && AdjustZoneMixingFlowFlag) { if (Mixing(j).MixingMassFlowRate > 0.0) { Mixing(j).DesiredAirFlowRate = Mixing(j).MixingMassFlowRate / AirDensity; } @@ -5065,7 +5194,7 @@ namespace EnergyPlus::ZoneEquipmentManager { CpAir = PsyCpAirFnW((state.dataZoneEquip->ZHumRat(n) + state.dataZoneEquip->ZHumRat(m)) / 2.0); // Use average conditions Mixing(j).DesiredAirFlowRate = Mixing(j).DesiredAirFlowRateSaved; - if (ZoneMassBalanceFlag(n) && AdjustZoneMassFlowFlag) { + if (ZoneMassBalanceFlag(n) && AdjustZoneMixingFlowFlag) { if (Mixing(j).MixingMassFlowRate > 0.0) { Mixing(j).DesiredAirFlowRate = Mixing(j).MixingMassFlowRate / AirDensity; } @@ -5095,7 +5224,7 @@ namespace EnergyPlus::ZoneEquipmentManager { CpAir = PsyCpAirFnW((state.dataZoneEquip->ZHumRat(n) + state.dataZoneEquip->ZHumRat(m)) / 2.0); // Use average conditions Mixing(j).DesiredAirFlowRate = Mixing(j).DesiredAirFlowRateSaved; - if (ZoneMassBalanceFlag(n) && AdjustZoneMassFlowFlag) { + if (ZoneMassBalanceFlag(n) && AdjustZoneMixingFlowFlag) { if (Mixing(j).MixingMassFlowRate > 0.0) { Mixing(j).DesiredAirFlowRate = Mixing(j).MixingMassFlowRate / AirDensity; } @@ -5373,7 +5502,7 @@ namespace EnergyPlus::ZoneEquipmentManager { if (MCpI_temp < 0.0) MCpI_temp = 0.0; Infiltration(j).VolumeFlowRate = MCpI_temp / AirDensity / CpAir; - if (AdjustZoneMassFlowFlag && ZoneInfiltrationFlag(NZ)) { + if (AdjustZoneInfiltrationFlowFlag && ZoneInfiltrationFlag(NZ)) { if (ZoneAirMassFlow.InfiltrationTreatment == AdjustInfiltrationFlow) { // if ( Infiltration(j).MassFlowRate > 0.0 ) { Infiltration(j).VolumeFlowRate = Infiltration(j).MassFlowRate / AirDensity; @@ -5397,7 +5526,7 @@ namespace EnergyPlus::ZoneEquipmentManager { MCpI_temp = IVF * AirDensity * CpAir; if (MCpI_temp < 0.0) MCpI_temp = 0.0; Infiltration(j).VolumeFlowRate = MCpI_temp / AirDensity / CpAir; - if (AdjustZoneMassFlowFlag && ZoneInfiltrationFlag(NZ)) { + if (AdjustZoneInfiltrationFlowFlag && ZoneInfiltrationFlag(NZ)) { if (ZoneAirMassFlow.InfiltrationTreatment == AdjustInfiltrationFlow) { if (Infiltration(j).MassFlowRate > 0.0) { Infiltration(j).VolumeFlowRate = Infiltration(j).MassFlowRate / AirDensity; @@ -5422,7 +5551,7 @@ namespace EnergyPlus::ZoneEquipmentManager { MCpI_temp = IVF * AirDensity * CpAir; if (MCpI_temp < 0.0) MCpI_temp = 0.0; Infiltration(j).VolumeFlowRate = MCpI_temp / AirDensity / CpAir; - if (AdjustZoneMassFlowFlag && ZoneInfiltrationFlag(NZ)) { + if (AdjustZoneInfiltrationFlowFlag && ZoneInfiltrationFlag(NZ)) { if (ZoneAirMassFlow.InfiltrationTreatment == AdjustInfiltrationFlow) { if (Infiltration(j).MassFlowRate > 0.0) { Infiltration(j).VolumeFlowRate = Infiltration(j).MassFlowRate / AirDensity; @@ -5555,29 +5684,23 @@ namespace EnergyPlus::ZoneEquipmentManager { // This subroutine updates the receiving zone mixing flow rate to ensures the zone // air mass balance. - // Using/Aliasing - using DataHeatBalance::MassConservation; - using DataHeatBalance::Mixing; - using DataHeatBalance::TotMixing; - using DataHeatBalFanSys::MixingMassFlowZone; - int Loop; int MixingNum; int NumOfReceivingZoneMixingObjects; Real64 MixingMassFlowRate; // current zone mixing mass flow rate, [kg/s] MixingMassFlowRate = 0.0; - // distribute the total zone mixing flow rate to the source zones - NumOfReceivingZoneMixingObjects = MassConservation(ZoneNum).NumReceivingZonesMixingObject; + NumOfReceivingZoneMixingObjects = DataHeatBalance::MassConservation(ZoneNum).NumReceivingZonesMixingObject; if (NumOfReceivingZoneMixingObjects > 0) { - for (Loop = 1; Loop <= NumOfReceivingZoneMixingObjects; ++Loop) { - MixingNum = MassConservation(ZoneNum).ZoneMixingReceivingPtr(Loop); - Mixing(MixingNum).MixingMassFlowRate = MassConservation(ZoneNum).ZoneMixingReceivingFr(Loop) * ZoneMixingMassFlowRate; - MixingMassFlowRate += Mixing(MixingNum).MixingMassFlowRate; - CalcZoneMixingFlowRateOfSourceZone(Mixing(MixingNum).FromZone); - } + // distribute the total zone mixing flow rate to the source zones + for (Loop = 1; Loop <= NumOfReceivingZoneMixingObjects; ++Loop) { + MixingNum = DataHeatBalance::MassConservation(ZoneNum).ZoneMixingReceivingPtr(Loop); + DataHeatBalance::Mixing(MixingNum).MixingMassFlowRate = DataHeatBalance::MassConservation(ZoneNum).ZoneMixingReceivingFr(Loop) * ZoneMixingMassFlowRate; + MixingMassFlowRate += DataHeatBalance::Mixing(MixingNum).MixingMassFlowRate; + CalcZoneMixingFlowRateOfSourceZone(DataHeatBalance::Mixing(MixingNum).FromZone); + } } - MassConservation(ZoneNum).MixingMassFlowRate = MixingMassFlowRate; + DataHeatBalance::MassConservation(ZoneNum).MixingMassFlowRate = MixingMassFlowRate; ZoneMixingMassFlowRate = MixingMassFlowRate; } @@ -5593,14 +5716,7 @@ namespace EnergyPlus::ZoneEquipmentManager { // PURPOSE OF THIS SUBROUTINE: // This subroutine calculates the zone mixing flow rate such that it ensures the zone // air mass balance. - - // Using/Aliasing - using DataHeatBalance::MassConservation; - using DataHeatBalance::Mixing; - using DataHeatBalance::TotMixing; - using DataHeatBalance::Zone; - using DataHeatBalFanSys::MixingMassFlowZone; - + ; int Loop; int MixingNum; int ZoneMixingNum; @@ -5608,18 +5724,18 @@ namespace EnergyPlus::ZoneEquipmentManager { Real64 ZoneSourceMassFlowRate; // current zone as a source mass flow rate for zone mixing in other zones, [kg/s] ZoneSourceMassFlowRate = 0.0; - NumOfSourceZoneMixingObjects = MassConservation(ZoneNum).NumSourceZonesMixingObject; + NumOfSourceZoneMixingObjects = DataHeatBalance::MassConservation(ZoneNum).NumSourceZonesMixingObject; if (NumOfSourceZoneMixingObjects > 0) { for (ZoneMixingNum = 1; ZoneMixingNum <= NumOfSourceZoneMixingObjects; ++ZoneMixingNum) { - MixingNum = MassConservation(ZoneNum).ZoneMixingSourcesPtr(ZoneMixingNum); - for (Loop = 1; Loop <= TotMixing; ++Loop) { + MixingNum = DataHeatBalance::MassConservation(ZoneNum).ZoneMixingSourcesPtr(ZoneMixingNum); + for (Loop = 1; Loop <= DataHeatBalance::TotMixing; ++Loop) { if (Loop == MixingNum) { - ZoneSourceMassFlowRate += Mixing(Loop).MixingMassFlowRate; + ZoneSourceMassFlowRate += DataHeatBalance::Mixing(Loop).MixingMassFlowRate; } } } } - MassConservation(ZoneNum).MixingSourceMassFlowRate = ZoneSourceMassFlowRate; + DataHeatBalance::MassConservation(ZoneNum).MixingSourceMassFlowRate = ZoneSourceMassFlowRate; } void AutoCalcDOASControlStrategy(EnergyPlusData &state) diff --git a/src/EnergyPlus/ZoneEquipmentManager.hh b/src/EnergyPlus/ZoneEquipmentManager.hh index 90712d517e0..581e643fdf8 100644 --- a/src/EnergyPlus/ZoneEquipmentManager.hh +++ b/src/EnergyPlus/ZoneEquipmentManager.hh @@ -122,9 +122,20 @@ namespace ZoneEquipmentManager { Real64 &FinalTotalReturnMassFlow // Final total return air mass flow rate ); + void CalcZoneInfiltrationFlows(EnergyPlusData &state, + int const ZoneNum, // current zone index + Real64 &ZoneReturnAirMassFlowRate // zone total zone return air mass flow rate + ); + + void ZoneReturnFlowsMaximum(EnergyPlusData &state, + int const ZoneNum, + Real64 &MaximumZoneReturnMassFlow // maximum zone total return air mass flow rate + ); + void CalcAirFlowSimple(EnergyPlusData &state, int const SysTimestepLoop = 0, // System time step index - bool const AdjustZoneMixingFlowFlag = false // flags to adjust zone mxing mass flow rate + bool const AdjustZoneMixingFlowFlag = false, // flags to adjust zone mxing mass flow rate + bool const AdjustZoneInfiltrationFlowFlag = false // flags to djust zone infiltration air flow rate ); void GetStandAloneERVNodes(EnergyPlusData &state, int const OutdoorNum); // Zone Air Balance Outdoor index diff --git a/src/EnergyPlus/ZoneTempPredictorCorrector.cc b/src/EnergyPlus/ZoneTempPredictorCorrector.cc index 3de862998b8..faff45e33b1 100644 --- a/src/EnergyPlus/ZoneTempPredictorCorrector.cc +++ b/src/EnergyPlus/ZoneTempPredictorCorrector.cc @@ -6257,7 +6257,7 @@ namespace ZoneTempPredictorCorrector { auto const shading_flag(SurfWinShadingFlag(SurfNum)); // Add to the convective internal gains - if (shading_flag == IntShadeOn || shading_flag == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(shading_flag)) { // The shade area covers the area of the glazing plus the area of the dividers. Area += SurfWinDividerArea(SurfNum); // If interior shade or blind is present it is assumed that both the convective and IR radiative gain @@ -6271,7 +6271,7 @@ namespace ZoneTempPredictorCorrector { if (state.dataConstruction->Construct(Surface(SurfNum).Construction).WindowTypeEQL) SumIntGain += SurfWinOtherConvHeatGain(SurfNum); // Convective heat gain from natural convection in gap between glass and interior shade or blind - if (shading_flag == IntShadeOn || shading_flag == IntBlindOn) SumIntGain += SurfWinConvHeatFlowNatural(SurfNum); + if (ANY_INTERIOR_SHADE_BLIND(shading_flag)) SumIntGain += SurfWinConvHeatFlowNatural(SurfNum); // Convective heat gain from airflow window if (SurfWinAirflowThisTS(SurfNum) > 0.0) { @@ -6299,7 +6299,7 @@ namespace ZoneTempPredictorCorrector { HA += HA_surf; } - if (SurfWinDividerArea(SurfNum) > 0.0 && shading_flag != IntShadeOn && shading_flag != IntBlindOn) { + if (SurfWinDividerArea(SurfNum) > 0.0 && !ANY_INTERIOR_SHADE_BLIND(shading_flag)) { // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) Real64 const HA_surf(HConvIn(SurfNum) * SurfWinDividerArea(SurfNum) * (1.0 + 2.0 * SurfWinProjCorrDivIn(SurfNum))); SumHATsurf += HA_surf * SurfWinDividerTempSurfIn(SurfNum); @@ -6588,7 +6588,7 @@ namespace ZoneTempPredictorCorrector { if (Surface(SurfNum).Class == SurfaceClass::Window) { // Add to the convective internal gains - if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn) { + if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // The shade area covers the area of the glazing plus the area of the dividers. Area += SurfWinDividerArea(SurfNum); // If interior shade or blind is present it is assumed that both the convective and IR radiative gain @@ -6602,7 +6602,7 @@ namespace ZoneTempPredictorCorrector { if (state.dataConstruction->Construct(Surface(SurfNum).Construction).WindowTypeEQL) SumIntGains += SurfWinOtherConvHeatGain(SurfNum); // Convective heat gain from natural convection in gap between glass and interior shade or blind - if (SurfWinShadingFlag(SurfNum) == IntShadeOn || SurfWinShadingFlag(SurfNum) == IntBlindOn) + if (ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) SumIntGains += SurfWinConvHeatFlowNatural(SurfNum); // Convective heat gain from airflow window @@ -6621,8 +6621,7 @@ namespace ZoneTempPredictorCorrector { (SurfWinFrameTempSurfIn(SurfNum) - RefAirTemp); } - if (SurfWinDividerArea(SurfNum) > 0.0 && SurfWinShadingFlag(SurfNum) != IntShadeOn && - SurfWinShadingFlag(SurfNum) != IntBlindOn) { + if (SurfWinDividerArea(SurfNum) > 0.0 && !ANY_INTERIOR_SHADE_BLIND(SurfWinShadingFlag(SurfNum))) { // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) SumHADTsurfs += HConvIn(SurfNum) * SurfWinDividerArea(SurfNum) * (1.0 + 2.0 * SurfWinProjCorrDivIn(SurfNum)) * (SurfWinDividerTempSurfIn(SurfNum) - RefAirTemp); diff --git a/src/Transition/CreateNewIDFUsingRulesV9_5_0.f90 b/src/Transition/CreateNewIDFUsingRulesV9_5_0.f90 index 99c7ab193b0..3f870ac7aed 100644 --- a/src/Transition/CreateNewIDFUsingRulesV9_5_0.f90 +++ b/src/Transition/CreateNewIDFUsingRulesV9_5_0.f90 @@ -386,6 +386,7 @@ SUBROUTINE CreateNewIDFUsingRules(EndOfFile,DiffOnly,InLfn,AskForInput,InputFile ! If your original object starts with A, insert the rules here ! If your original object starts with C, insert the rules here + CASE('CONSTRUCTION:AIRBOUNDARY') CALL GetNewObjectDefInIDD(ObjectName,NwNumArgs,NwAorN,NwReqFld,NwObjMinFlds,NwFldNames,NwFldDefaults,NwFldUnits) nodiff=.false. @@ -630,6 +631,17 @@ SUBROUTINE CreateNewIDFUsingRules(EndOfFile,DiffOnly,InLfn,AskForInput,InputFile ! If your original object starts with Z, insert the rules here + CASE('ZONEAIRMASSFLOWCONSERVATION') + CALL GetNewObjectDefInIDD(ObjectName,NwNumArgs,NwAorN,NwReqFld,NwObjMinFlds,NwFldNames,NwFldDefaults,NwFldUnits) + nodiff=.false. + OutArgs(1:CurArgs)=InArgs(1:CurArgs) + IF (OutArgs(1) == "YES" .OR. OutArgs(1) == "Yes" .OR. OutArgs(1) == "yes") THEN + OutArgs(1) = "AdjustMixingOnly" + END IF + IF (OutArgs(1) == "NO" .OR. OutArgs(1) == "No" .OR. OutArgs(1) == "no") THEN + OutArgs(1) = "None" + END IF + CASE('ZONEHVAC:LOWTEMPERATURERADIANT:VARIABLEFLOW') CALL GetNewObjectDefInIDD(ObjectName,NwNumArgs,NwAorN,NwReqFld,NwObjMinFlds,NwFldNames,NwFldDefaults,NwFldUnits) OutArgs(1)=InArgs(1) diff --git a/src/Transition/InputRulesFiles/Rules9-4-0-to-9-5-0.md b/src/Transition/InputRulesFiles/Rules9-4-0-to-9-5-0.md index 06a0f05ade6..a259b5824c3 100644 --- a/src/Transition/InputRulesFiles/Rules9-4-0-to-9-5-0.md +++ b/src/Transition/InputRulesFiles/Rules9-4-0-to-9-5-0.md @@ -230,3 +230,18 @@ See [8464](https://github.com/NREL/EnergyPlus/pull/8464) - Field 5, previous Field 11 - Convergence Tolerance - Field 6, previous Field 12 - Fraction Radiant - Field 7, previous Field 13 - Fraction of Radiant Energy Incident on People + +# Object Change: ZoneAirMassFlowConservation + +Summary: name of the first input field have been renamed, the two existing key choices (*Yes* and *No*) have been renamed and three more new choice keys have been added. + +Field 1 renamed from *Adjust Zone Mixing For Zone Air Mass Flow Balance* to *Adjust Zone Mixing and Return For Air Mass Flow Balance*. + - Choice key *Yes* has been replaced with *AdjustMixingOnly*. + - Choice key *No* has been replaced with *None*. + - New choice key *AdjustReturnOnly* has been added. + - New choice key *AdjustMixingThenReturn* has been added. + - New choice key *AdjustReturnThenMixing* has been added. + - Now there are five choice keys. +Fields 2-3 remain the same. + +See [pull request 8460] (https://github.com/NREL/EnergyPlus/pull/8460) \ No newline at end of file diff --git a/testfiles/5ZoneAirCooled_ZoneAirMassFlowBalance.idf b/testfiles/5ZoneAirCooled_ZoneAirMassFlowBalance.idf index 07e94df34a2..6ad54f90dff 100644 --- a/testfiles/5ZoneAirCooled_ZoneAirMassFlowBalance.idf +++ b/testfiles/5ZoneAirCooled_ZoneAirMassFlowBalance.idf @@ -120,7 +120,7 @@ Timestep,4; ZoneAirMassFlowConservation, - Yes, !- Adjust Zone Mixing For Zone Air Mass Flow Balance + AdjustMixingOnly, !- Adjust Zone Mixing and Return For Air Mass Flow Balance AddInfiltrationFlow, !- Infiltration Balancing Method MixingSourceZonesOnly; !- Infiltration Balancing Zones diff --git a/testfiles/5ZoneAirCooled_ZoneAirMassFlowBalance_Pressurized.idf b/testfiles/5ZoneAirCooled_ZoneAirMassFlowBalance_Pressurized.idf index 41b40320cb6..815c491cf40 100644 --- a/testfiles/5ZoneAirCooled_ZoneAirMassFlowBalance_Pressurized.idf +++ b/testfiles/5ZoneAirCooled_ZoneAirMassFlowBalance_Pressurized.idf @@ -122,7 +122,7 @@ Timestep,4; ZoneAirMassFlowConservation, - Yes, !- Adjust Zone Mixing For Zone Air Mass Flow Balance + AdjustMixingOnly, !- Adjust Zone Mixing and Return For Air Mass Flow Balance AdjustInfiltrationFlow, !- Infiltration Balancing Method AllZones; !- Infiltration Balancing Zones diff --git a/testfiles/CMakeLists.txt b/testfiles/CMakeLists.txt index e52cafadbca..ec19803943e 100644 --- a/testfiles/CMakeLists.txt +++ b/testfiles/CMakeLists.txt @@ -501,8 +501,11 @@ add_simulation_test(IDF_FILE RetailPackagedTESCoil.idf EPW_FILE USA_IL_Chicago-O add_simulation_test(IDF_FILE RoomAirflowNetwork.idf EPW_FILE USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw) add_simulation_test(IDF_FILE SeriesActiveBranch.idf EPW_FILE USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw) add_simulation_test(IDF_FILE ShopWithPVandBattery.idf EPW_FILE USA_OK_Oklahoma.City-Will.Rogers.World.AP.723530_TMY3.epw) +add_simulation_test(IDF_FILE ShopWithPVandLiIonBattery.idf EPW_FILE USA_OK_Oklahoma.City-Will.Rogers.World.AP.723530_TMY3.epw) add_simulation_test(IDF_FILE ShopWithPVandStorage.idf EPW_FILE USA_OK_Oklahoma.City-Will.Rogers.World.AP.723530_TMY3.epw) add_simulation_test(IDF_FILE ShopWithSimplePVT.idf EPW_FILE USA_OK_Oklahoma.City-Will.Rogers.World.AP.723530_TMY3.epw) +add_simulation_test(IDF_FILE SingleFamilyHouse_HP_Slab.idf EPW_FILE USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw) +add_simulation_test(IDF_FILE SingleFamilyHouse_HP_Slab_Dehumidification.idf EPW_FILE USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw) add_simulation_test(IDF_FILE SingleFamilyHouse_TwoSpeed_ZoneAirBalance.idf EPW_FILE USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw) add_simulation_test(IDF_FILE SingleFamilyHouse_TwoSpeed_CutoutTemperature.idf EPW_FILE USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw) add_simulation_test(IDF_FILE SmallOffice_CentralDOAS.idf EPW_FILE USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw) diff --git a/testfiles/ShopWithPVandLiIonBattery.idf b/testfiles/ShopWithPVandLiIonBattery.idf new file mode 100644 index 00000000000..60f7adaa483 --- /dev/null +++ b/testfiles/ShopWithPVandLiIonBattery.idf @@ -0,0 +1,5301 @@ +!ShopWithPVandBattery.idf +! Basic file description: 1 story building divided into 4 exterior and one interior conditioned zones and return plenum. +! +! Highlights: low energy building with photovoltaic roof and electrical storage +! Demonstrate the used of battery model for electrical storage +! Demonstrates different inverters on different arrays. +! Fairly comprehensive model with full HVAC, service water heating, etc. +! +! Simulation Location/Run: OKLAHOMA_CITY_OK_USA TMY2-13967, 2 design days, 1 run period +! +! Location: Oklahoma City, OK +! +! Design Days: OKLAHOMA_CITY_OK_USA Heating 99.6% Conditions +! OKLAHOMA_CITY_OK_USA Cooling .4% Conditions WB=>MDB +! +! Run Period (Weather File): +! +! Run Control: Zone and System sizing with weather file run control (no design days run) +! +! Building: small service repair shop. open Mon-Fri, 45 hours a week, +! model developed from 2003CBECS PUBID8=2994 +! Envelope and equipment set to nominally meet ASHRAE Standard 90.1-2004 +! +! +! Floor Area: 390.19 m2 (4200 ft2) +! Number of Stories: 1 +! +! Zone Description Details: +! +! Internal gains description: lighting is 15 watts/m2, service equip is 8.3 watts/m2. There are 3 occupants. +! The infiltration is about 0.5 air changes per hour. +! +! +! Detached Shading: None +! Daylight: None +! Natural Ventilation: None +! Compact Schedules: Yes +! +! HVAC: Single zone, constant volume air systems. +! 5 seperate "packages" +! outside air system includes ideal PVT air preconditioners +! +! Zonal Equipment: Direct Air/Single Duct Uncontrolled. +! Central Air Handling Equipment: no ( but uses central-air-style air handlers for PSZ) +! System Equipment Autosize: Yes +! Coils: DX +! Pumps: Pump:VariableSpeed +! +! Results: +! Standard Reports: All Summary +! Timestep or Hourly Variables: Timestep +! Time bins Report: None +! HTML Report: Yes +! Environmental Emissions: Yes +! Utility Tariffs: Yes, circa 2004, Reliant , TX + + Version,9.4; + + Timestep,6; + + SimulationControl, + Yes, !- Do Zone Sizing Calculation + Yes, !- Do System Sizing Calculation + No, !- Do Plant Sizing Calculation + No, !- Run Simulation for Sizing Periods + Yes, !- Run Simulation for Weather File Run Periods + No, !- Do HVAC Sizing Simulation for Sizing Periods + 1; !- Maximum Number of HVAC Sizing Simulation Passes + + RunPeriod, + Run Period 1, !- Name + 7, !- Begin Month + 1, !- Begin Day of Month + , !- Begin Year + 7, !- End Month + 2, !- End Day of Month + , !- End Year + Sunday, !- Day of Week for Start Day + No, !- Use Weather File Holidays and Special Days + No, !- Use Weather File Daylight Saving Period + No, !- Apply Weekend Holiday Rule + Yes, !- Use Weather File Rain Indicators + Yes; !- Use Weather File Snow Indicators + + SurfaceConvectionAlgorithm:Inside,TARP; + + SurfaceConvectionAlgorithm:Outside,DOE-2; + + HeatBalanceAlgorithm,ConductionTransferFunction; + + Sizing:Parameters, + 1.2000, !- Heating Sizing Factor + 1.2000, !- Cooling Sizing Factor + ; !- Timesteps in Averaging Window + + ConvergenceLimits, + 5, !- Minimum System Timestep {minutes} + 10; !- Maximum HVAC Iterations + + ShadowCalculation, + PolygonClipping, !- Shading Calculation Method + Periodic, !- Shading Calculation Update Frequency Method + 30; !- Shading Calculation Update Frequency + + GlobalGeometryRules, + UpperLeftCorner, !- Starting Vertex Position + CounterClockWise, !- Vertex Entry Direction + Relative; !- Coordinate System + + Building, + AutoBuilt Model: All, !- Name + 203.0140, !- North Axis {deg} + City, !- Terrain + 0.0400, !- Loads Convergence Tolerance Value {W} + 0.2000, !- Temperature Convergence Tolerance Value {deltaC} + FullInteriorAndExterior, !- Solar Distribution + 25, !- Maximum Number of Warmup Days + 6; !- Minimum Number of Warmup Days + +! US National Holidays + + RunPeriodControl:SpecialDays, + New Years Day, !- Name + January 1, !- Start Date + 1, !- Duration {days} + Holiday; !- Special Day Type + + RunPeriodControl:SpecialDays, + Veterans Day, !- Name + November 11, !- Start Date + 1, !- Duration {days} + Holiday; !- Special Day Type + + RunPeriodControl:SpecialDays, + Christmas, !- Name + December 25, !- Start Date + 1, !- Duration {days} + Holiday; !- Special Day Type + + RunPeriodControl:SpecialDays, + Independence Day, !- Name + July 4, !- Start Date + 1, !- Duration {days} + Holiday; !- Special Day Type + + RunPeriodControl:SpecialDays, + MLK Day, !- Name + 3rd Monday in January, !- Start Date + 1, !- Duration {days} + Holiday; !- Special Day Type + + RunPeriodControl:SpecialDays, + Presidents Day, !- Name + 3rd Monday in February, !- Start Date + 1, !- Duration {days} + Holiday; !- Special Day Type + + RunPeriodControl:SpecialDays, + Memorial Day, !- Name + Last Monday in May, !- Start Date + 1, !- Duration {days} + Holiday; !- Special Day Type + + RunPeriodControl:SpecialDays, + Labor Day, !- Name + 1st Monday in September, !- Start Date + 1, !- Duration {days} + Holiday; !- Special Day Type + + RunPeriodControl:SpecialDays, + Columbus Day, !- Name + 2nd Monday in October, !- Start Date + 1, !- Duration {days} + Holiday; !- Special Day Type + + RunPeriodControl:SpecialDays, + Thanksgiving, !- Name + 4th Thursday in November,!- Start Date + 1, !- Duration {days} + Holiday; !- Special Day Type + +! Daylight Saving Period in US + + RunPeriodControl:DaylightSavingTime, + 1st Sunday in April, !- Start Date + Last Sunday in October; !- End Date + + Site:Location, + OKLAHOMA_CITY_OK_USA TMY2-13967, !- Name + 35.40000, !- Latitude {deg} + -97.60000, !- Longitude {deg} + -6.000000, !- Time Zone {hr} + 397.0000; !- Elevation {m} + +! OKLAHOMA_CITY_OK_USA Heating 99.6%, MaxDB= -12.60 Wind Speed= 6.90 Wind Dir= 360.00 + + SizingPeriod:DesignDay, + OKLAHOMA_CITY_OK_USA Heating 99.6% Conditions, !- Name + 1, !- Month + 21, !- Day of Month + WinterDesignDay, !- Day Type + -12.60000, !- Maximum Dry-Bulb Temperature {C} + 0.0000000E+00, !- Daily Dry-Bulb Temperature Range {deltaC} + , !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + -12.60000, !- 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} + 96645.77, !- Barometric Pressure {Pa} + 6.900000, !- Wind Speed {m/s} + 360.0000, !- 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.0000000E+00; !- Sky Clearness + +! OKLAHOMA_CITY_OK_USA Cooling (WB=>MDB) .4%, MDB= 32.80 WB= 24.90 + + SizingPeriod:DesignDay, + OKLAHOMA_CITY_OK_USA Cooling .4% Conditions WB=>MDB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay, !- Day Type + 32.80000, !- Maximum Dry-Bulb Temperature {C} + 11.70000, !- Daily Dry-Bulb Temperature Range {deltaC} + , !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 24.90000, !- 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} + 96645.77, !- Barometric Pressure {Pa} + 0.0000000E+00, !- Wind Speed {m/s} + 0.0000000E+00, !- 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.000000; !- Sky Clearness + + Site:GroundTemperature:BuildingSurface,20.03,20.05,20.08,20.10,20.18,20.23,20.22,20.19,20.26,20.25,20.23,20.20; + +! Daily Avg, -0.3, 3.3, 10.4, 14.8, 20.6, 23.7, 26.3, 27.9, 22.0, 16.9, 9.7, 5.1 + + Site:WaterMainsTemperature, + CORRELATION, !- Calculation Method + , !- Temperature Schedule Name + 15.03, !- Annual Average Outdoor Air Temperature {C} + 28.20; !- Maximum Difference In Monthly Average Outdoor Air Temperatures {deltaC} + + 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, + On/Off, !- Name + 0, !- Lower Limit Value + 1, !- Upper Limit Value + DISCRETE; !- Numeric Type + + ScheduleTypeLimits, + Control Type, !- Name + 0, !- Lower Limit Value + 4, !- Upper Limit Value + DISCRETE; !- Numeric Type + + ScheduleTypeLimits, + Humidity, !- Name + 10, !- Lower Limit Value + 90, !- Upper Limit Value + CONTINUOUS; !- Numeric Type + + ScheduleTypeLimits, + Number; !- Name + +! PBA: 26: Service +! PBA+: 45: Repair shop +! Weekly Hours: 45 +! Open 24 Hours: False +! Open Weekends: False +! Days Open: Open Mon-Fri +! Months Not Open: 0 +! Month Occupied (not always used): 0 +! Schedule valid for the following building IDs +! ID_2994 +!------------ ALWAYS_ON --------- + + Schedule:Compact, + ALWAYS_ON, !- Name + On/Off, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,1; !- Field 3 + +!------------ WORK_EFF_SCH --------- + + Schedule:Compact, + WORK_EFF_SCH, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,0; !- Field 3 + +!------------ AIR_VELO_SCH --------- + + 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.2; !- Field 3 + +!------------ CLOTHING_SCH --------- + + Schedule:Compact, + CLOTHING_SCH, !- Name + Any Number, !- Schedule Type Limits Name + Through: 04/30, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,1.1, !- Field 3 + Through: 09/30, !- Field 5 + For: AllDays, !- Field 6 + Until: 24:00,0.6, !- Field 7 + Through: 12/31, !- Field 9 + For: AllDays, !- Field 10 + Until: 24:00,1.1; !- Field 11 + +!------------ PlantOnSched --------- + + Schedule:Compact, + PlantOnSched, !- Name + Any Number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,1; !- Field 3 + +!------------ Dual Zone Control Type Sched --------- + + Schedule:Compact, + Dual Zone Control Type Sched, !- Name + Control Type, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,4; !- Field 3 + +!------------ Hours_of_operation --------- +! Schedule for hours of operation +! Assigned 45 hours + + Schedule:Compact, + Hours_of_operation, !- Name + On/Off, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Weekdays SummerDesignDay, !- Field 2 + Until: 10:00,0, !- Field 3 + Until: 19:00,1, !- Field 5 + Until: 24:00,0, !- Field 7 + For: WeekEnds WinterDesignDay Holidays AllOtherDays, !- Field 9 + Until: 24:00,0; !- Field 10 + +!------------ HVACOperationSchd --------- +! Schedule for HVAC operation + + Schedule:Compact, + HVACOperationSchd, !- Name + On/Off, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Weekdays SummerDesignDay, !- Field 2 + Until: 10:00,0, !- Field 3 + Until: 19:00,1, !- Field 5 + Until: 24:00,0, !- Field 7 + For: WeekEnds WinterDesignDay Holidays AllOtherDays, !- Field 9 + Until: 24:00,0; !- Field 10 + +!------------ HTGSETP_SCH --------- +! Heating Setpoint + + Schedule:Compact, + HTGSETP_SCH, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: SummerDesignDay, !- Field 2 + Until: 24:00,13, !- Field 3 + For: WinterDesignDay, !- Field 5 + Until: 24:00,21, !- Field 6 + For: Weekdays, !- Field 8 + Until: 10:00,13, !- Field 9 + Until: 19:00,21, !- Field 11 + Until: 24:00,13, !- Field 13 + For: WeekEnds Holidays AllOtherDays, !- Field 15 + Until: 24:00,13; !- Field 16 + +!------------ CLGSETP_SCH --------- +! Cooling Setpoint + + Schedule:Compact, + CLGSETP_SCH, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: SummerDesignDay, !- Field 2 + Until: 24:00,24, !- Field 3 + For: WinterDesignDay, !- Field 5 + Until: 24:00,33, !- Field 6 + For: WeekEnds, !- Field 8 + Until: 24:00,33, !- Field 9 + For: Weekdays Holidays AllOtherDays, !- Field 11 + Until: 10:00,33, !- Field 12 + Until: 19:00,24, !- Field 14 + Until: 24:00,33; !- Field 16 + +!------------ MinOA_Sched --------- +! Minimum outside air schedule +! Gravity Damper + + Schedule:Compact, + MinOA_Sched, !- Name + On/Off, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,1; !- Field 3 + +!------------ BLDG_LIGHT_SCH --------- +! Lighting schedule +! Lighting Reduced: True +! Percent Lit When Closed: 0 +! Percent Lit When Open: 100 + + Schedule:Compact, + BLDG_LIGHT_SCH, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Weekdays SummerDesignDay, !- Field 2 + Until: 10:00,0, !- Field 3 + Until: 19:00,0.943, !- Field 5 + Until: 24:00,0, !- Field 7 + For: WeekEnds WinterDesignDay Holidays AllOtherDays, !- Field 9 + Until: 24:00,0; !- Field 10 + +!------------ BLDG_EQUIP_SCH --------- +! Equipment Schedule +! Minimum Equipment Percent: 10 +! Maximum Equipment Percent: 95 +! Equipment turned off during off hours: Always + + Schedule:Compact, + BLDG_EQUIP_SCH, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Weekdays SummerDesignDay, !- Field 2 + Until: 10:00,0.1, !- Field 3 + Until: 19:00,0.95, !- Field 5 + Until: 24:00,0.1, !- Field 7 + For: WeekEnds WinterDesignDay Holidays AllOtherDays, !- Field 9 + Until: 24:00,0.1; !- Field 10 + +!------------ BLDG_OCC_SCH --------- +! Occupancy Schedule +! Minimum Occupancy Percent: 0 +! Maximum Occupancy Percent: 95 + + Schedule:Compact, + BLDG_OCC_SCH, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Weekdays SummerDesignDay, !- Field 2 + Until: 10:00,0, !- Field 3 + Until: 12:00,0.95, !- Field 5 + Until: 13:00,0.5, !- Field 7 + Until: 19:00,0.95, !- Field 9 + Until: 24:00,0, !- Field 11 + For: WeekEnds WinterDesignDay Holidays AllOtherDays, !- Field 13 + Until: 24:00,0; !- Field 14 + +!------------ INFIL_SCH --------- +! Infiltration Schedule +! Infiltration Percent w/o HVAC: 100 +! Infiltration Percent w/HVAC: 100 + + Schedule:Compact, + INFIL_SCH, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,1; !- Field 3 + +!------------ ACTIVITY_SCH --------- +! Activity Schedule + + Schedule:Compact, + ACTIVITY_SCH, !- Name + Any Number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,140; !- Field 3 + + WindowMaterial:Glazing, + Theoretical Glass [23], !- Name + SpectralAverage, !- Optical Data Type + , !- Window Glass Spectral Data Set Name + 0.0030, !- Thickness {m} + 0.5531, !- Solar Transmittance at Normal Incidence + 0.3969, !- Front Side Solar Reflectance at Normal Incidence + 0.3969, !- Back Side Solar Reflectance at Normal Incidence + 0.6041, !- Visible Transmittance at Normal Incidence + 0.3459, !- Front Side Visible Reflectance at Normal Incidence + 0.3459, !- Back Side Visible Reflectance at Normal Incidence + 0.0000, !- Infrared Transmittance at Normal Incidence + 0.8500, !- Front Side Infrared Hemispherical Emissivity + 0.8500, !- Back Side Infrared Hemispherical Emissivity + 2.3904; !- Conductivity {W/m-K} + + WindowMaterial:Gas, + AIR 6MM, !- Name + Air, !- Gas Type + 0.0063; !- Thickness {m} + + WindowMaterial:Glazing, + Theoretical Glass [24], !- Name + SpectralAverage, !- Optical Data Type + , !- Window Glass Spectral Data Set Name + 0.0030, !- Thickness {m} + 0.6483, !- Solar Transmittance at Normal Incidence + 0.3017, !- Front Side Solar Reflectance at Normal Incidence + 0.3017, !- Back Side Solar Reflectance at Normal Incidence + 0.7094, !- Visible Transmittance at Normal Incidence + 0.2406, !- Front Side Visible Reflectance at Normal Incidence + 0.2406, !- Back Side Visible Reflectance at Normal Incidence + 0.0000, !- Infrared Transmittance at Normal Incidence + 0.8500, !- Front Side Infrared Hemispherical Emissivity + 0.8500, !- Back Side Infrared Hemispherical Emissivity + 2.4179; !- Conductivity {W/m-K} + + WindowMaterial:Glazing, + Theoretical Glass [8], !- Name + SpectralAverage, !- Optical Data Type + , !- Window Glass Spectral Data Set Name + 0.0030, !- Thickness {m} + 0.3480, !- Solar Transmittance at Normal Incidence + 0.6020, !- Front Side Solar Reflectance at Normal Incidence + 0.6020, !- Back Side Solar Reflectance at Normal Incidence + 0.3763, !- Visible Transmittance at Normal Incidence + 0.5737, !- Front Side Visible Reflectance at Normal Incidence + 0.5737, !- Back Side Visible Reflectance at Normal Incidence + 0.0000, !- Infrared Transmittance at Normal Incidence + 0.9990, !- Front Side Infrared Hemispherical Emissivity + 0.9990, !- Back Side Infrared Hemispherical Emissivity + 2.2444; !- Conductivity {W/m-K} + + Material, + Roof Membrane, !- Name + VeryRough, !- Roughness + 0.0095, !- Thickness {m} + 0.1600, !- Conductivity {W/m-K} + 1121.2900, !- Density {kg/m3} + 1460.0000, !- Specific Heat {J/kg-K} + 0.9000, !- Thermal Absorptance + 0.7000, !- Solar Absorptance + 0.7000; !- Visible Absorptance + + Material, + Roof Insulation, !- Name + MediumRough, !- Roughness + 0.1250, !- Thickness {m} + 0.0490, !- Conductivity {W/m-K} + 265.0000, !- Density {kg/m3} + 836.8000, !- Specific Heat {J/kg-K} + 0.9000, !- Thermal Absorptance + 0.7000, !- Solar Absorptance + 0.7000; !- Visible Absorptance + + Material, + Metal Decking, !- Name + MediumSmooth, !- Roughness + 0.0015, !- Thickness {m} + 45.0060, !- Conductivity {W/m-K} + 7680.0000, !- Density {kg/m3} + 418.4000, !- Specific Heat {J/kg-K} + 0.9000, !- Thermal Absorptance + 0.7000, !- Solar Absorptance + 0.3000; !- Visible Absorptance + + Material, + GP01 1/2 GYPSUM, !- Name + Smooth, !- Roughness + 0.0127, !- Thickness {m} + 0.1600, !- Conductivity {W/m-K} + 800.0000, !- Density {kg/m3} + 1090.0000, !- Specific Heat {J/kg-K} + 0.9000, !- Thermal Absorptance + 0.7000, !- Solar Absorptance + 0.5000; !- Visible Absorptance + + Material:NoMass, + MAT-SHEATH, !- Name + Rough, !- Roughness + 0.3626, !- Thermal Resistance {m2-K/W} + 0.9000, !- Thermal Absorptance + 0.7000, !- Solar Absorptance + 0.7000; !- Visible Absorptance + + Material, + Wall Insulation [2], !- Name + MediumRough, !- Roughness + 0.0376, !- Thickness {m} + 0.0450, !- Conductivity {W/m-K} + 265.0000, !- Density {kg/m3} + 836.8000, !- Specific Heat {J/kg-K} + 0.9000, !- Thermal Absorptance + 0.7000, !- Solar Absorptance + 0.7000; !- Visible Absorptance + + Material, + 1/2IN Gypsum, !- Name + Smooth, !- Roughness + 0.0127, !- Thickness {m} + 0.1600, !- Conductivity {W/m-K} + 784.9000, !- Density {kg/m3} + 830.0000, !- Specific Heat {J/kg-K} + 0.9000, !- Thermal Absorptance + 0.9200, !- Solar Absorptance + 0.9200; !- Visible Absorptance + + Material, + MAT-CC05 8 HW CONCRETE, !- Name + Rough, !- Roughness + 0.2032, !- Thickness {m} + 1.3110, !- Conductivity {W/m-K} + 2240.0000, !- Density {kg/m3} + 836.8000, !- Specific Heat {J/kg-K} + 0.9000, !- Thermal Absorptance + 0.7000, !- Solar Absorptance + 0.7000; !- Visible Absorptance + + Material:NoMass, + CP02 CARPET PAD, !- Name + VeryRough, !- Roughness + 0.2165, !- Thermal Resistance {m2-K/W} + 0.9000, !- Thermal Absorptance + 0.7000, !- Solar Absorptance + 0.8000; !- Visible Absorptance + + Material, + Floor Insulation [2], !- Name + MediumRough, !- Roughness + 0.0503, !- Thickness {m} + 0.0450, !- Conductivity {W/m-K} + 265.0000, !- Density {kg/m3} + 836.8000, !- Specific Heat {J/kg-K} + 0.9000, !- Thermal Absorptance + 0.7000, !- Solar Absorptance + 0.7000; !- Visible Absorptance + + Material, + 1/2IN Gypsum Top, !- Name + Smooth, !- Roughness + 0.0127, !- Thickness {m} + 0.1600, !- Conductivity {W/m-K} + 784.9000, !- Density {kg/m3} + 830.0000, !- Specific Heat {J/kg-K} + 0.9000, !- Thermal Absorptance + 0.9200, !- Solar Absorptance + 0.9200; !- Visible Absorptance + + Material, + AtticFloor Insulation, !- Name + MediumRough, !- Roughness + 0.2379, !- Thickness {m} + 0.0490, !- Conductivity {W/m-K} + 265.0000, !- Density {kg/m3} + 836.8000, !- Specific Heat {J/kg-K} + 0.9000, !- Thermal Absorptance + 0.7000, !- Solar Absorptance + 0.7000; !- Visible Absorptance + + Material, + 1/2IN Gypsum Bottom, !- Name + Smooth, !- Roughness + 0.0127, !- Thickness {m} + 0.1600, !- Conductivity {W/m-K} + 784.9000, !- Density {kg/m3} + 830.0000, !- Specific Heat {J/kg-K} + 0.9000, !- Thermal Absorptance + 0.9200, !- Solar Absorptance + 0.9200; !- Visible Absorptance + + Material, + Std Wood 6inch, !- Name + MediumSmooth, !- Roughness + 0.15, !- Thickness {m} + 0.12, !- Conductivity {W/m-K} + 540.0000, !- Density {kg/m3} + 1210, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.7000000, !- Solar Absorptance + 0.7000000; !- Visible Absorptance + + Material, + Std 1.5 MW CONCRETE, !- Name + Rough, !- Roughness + 0.038, !- Thickness {m} + 0.858, !- Conductivity {W/m-K} + 1968, !- Density {kg/m3} + 836.8, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + + Material, + Std AC02, !- Name + MediumSmooth, !- Roughness + 1.2700000E-02, !- Thickness {m} + 5.7000000E-02, !- Conductivity {W/m-K} + 288.0000, !- Density {kg/m3} + 1339.000, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.7000000, !- Solar Absorptance + 0.2000000; !- Visible Absorptance + + Material:NoMass, + Std CP02 CARPET PAD, !- Name + VeryRough, !- Roughness + 0.21648, !- Thermal Resistance {m2-K/W} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.8; !- Visible Absorptance + + Material, + Std MAT-CC05 4 MW CONCRETE, !- Name + Rough, !- Roughness + 0.1000, !- Thickness {m} + 0.858, !- Conductivity {W/m-K} + 1968, !- Density {kg/m3} + 836.8, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.2; !- Visible Absorptance + + Material, + Std Very High Reflectivity Surface, !- Name + Smooth, !- Roughness + 0.0005, !- Thickness {m} + 237, !- Conductivity {W/m-K} + 2702, !- Density {kg/m3} + 903, !- Specific Heat {J/kg-K} + 0.90, !- Thermal Absorptance + 0.05, !- Solar Absorptance + 0.05; !- Visible Absorptance + + WindowMaterial:Glazing, + Std Clear Acrylic Plastic, !- Name + SpectralAverage, !- Optical Data Type + , !- Window Glass Spectral Data Set Name + 0.003, !- Thickness {m} + 0.92, !- Solar Transmittance at Normal Incidence + 0.05, !- Front Side Solar Reflectance at Normal Incidence + 0.05, !- Back Side Solar Reflectance at Normal Incidence + 0.92, !- Visible Transmittance at Normal Incidence + 0.05, !- Front Side Visible Reflectance at Normal Incidence + 0.05, !- Back Side Visible Reflectance at Normal Incidence + 0.00, !- Infrared Transmittance at Normal Incidence + 0.90, !- Front Side Infrared Hemispherical Emissivity + 0.90, !- Back Side Infrared Hemispherical Emissivity + 0.90; !- Conductivity {W/m-K} + + WindowMaterial:Glazing, + Std Diffusing Acrylic Plastic, !- Name + SpectralAverage, !- Optical Data Type + , !- Window Glass Spectral Data Set Name + 0.0022, !- Thickness {m} + 0.90, !- Solar Transmittance at Normal Incidence + 0.08, !- Front Side Solar Reflectance at Normal Incidence + 0.08, !- Back Side Solar Reflectance at Normal Incidence + 0.90, !- Visible Transmittance at Normal Incidence + 0.08, !- Front Side Visible Reflectance at Normal Incidence + 0.08, !- Back Side Visible Reflectance at Normal Incidence + 0.00, !- Infrared Transmittance at Normal Incidence + 0.90, !- Front Side Infrared Hemispherical Emissivity + 0.90, !- Back Side Infrared Hemispherical Emissivity + 0.90; !- Conductivity {W/m-K} + + Material, + Std PW05, !- Name + MediumSmooth, !- Roughness + 1.9099999E-02, !- Thickness {m} + 0.1150000, !- Conductivity {W/m-K} + 545.0000, !- Density {kg/m3} + 1213.000, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.7800000, !- Solar Absorptance + 0.7800000; !- Visible Absorptance + + Material, + Std Steel_Brown_Regular, !- Name + Smooth, !- Roughness + 1.5000000E-03, !- Thickness {m} + 44.96960, !- Conductivity {W/m-K} + 7689.000, !- Density {kg/m3} + 418.0000, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.9200000, !- Solar Absorptance + 0.92000000; !- Visible Absorptance + + Material, + Std Steel_Brown_Cool, !- Name + Smooth, !- Roughness + 1.5000000E-03, !- Thickness {m} + 44.96960, !- Conductivity {W/m-K} + 7689.000, !- Density {kg/m3} + 418.0000, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.7300000, !- Solar Absorptance + 0.73000000; !- Visible Absorptance + + Construction, + InteriorFurnishings, !- Name + Std Wood 6inch; !- Outside Layer + + ComponentCost:LineItem, + Interior Furnishings, !- Name + , !- Type + Construction, !- Line Item Type + InteriorFurnishings, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + 1, !- Cost per Area {$/m2} + , !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + ; !- Cost per Energy per Temperature Difference {$/(W/K)} + + Construction, + ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_south_window, !- Name + Theoretical Glass [23], !- Outside Layer + AIR 6MM, !- Layer 2 + Theoretical Glass [23]; !- Layer 3 + + ComponentCost:LineItem, + south:ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_south_window, !- Name + , !- Type + CONSTRUCTION, !- Line Item Type + ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_south_window, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + 193.8100, !- Cost per Area {$/m2} + , !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + Construction, + ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_east_window, !- Name + Theoretical Glass [23], !- Outside Layer + AIR 6MM, !- Layer 2 + Theoretical Glass [23]; !- Layer 3 + + ComponentCost:LineItem, + east:ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_east_window, !- Name + , !- Type + CONSTRUCTION, !- Line Item Type + ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_east_window, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + 193.8100, !- Cost per Area {$/m2} + , !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + Construction, + ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_north_window, !- Name + Theoretical Glass [24], !- Outside Layer + AIR 6MM, !- Layer 2 + Theoretical Glass [24]; !- Layer 3 + + ComponentCost:LineItem, + north:ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_north_window, !- Name + , !- Type + CONSTRUCTION, !- Line Item Type + ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_north_window, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + 191.8100, !- Cost per Area {$/m2} + , !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + Construction, + ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_west_window, !- Name + Theoretical Glass [23], !- Outside Layer + AIR 6MM, !- Layer 2 + Theoretical Glass [23]; !- Layer 3 + + ComponentCost:LineItem, + west:ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_west_window, !- Name + , !- Type + CONSTRUCTION, !- Line Item Type + ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_west_window, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + 193.8100, !- Cost per Area {$/m2} + , !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + Construction, + ASHRAE 90.1-2004_Sec 5.5-3ab_IEAD_Roof, !- Name + Roof Membrane, !- Outside Layer + Roof Insulation, !- Layer 2 + Metal Decking; !- Layer 3 + + ComponentCost:LineItem, + roofs:ASHRAE 90.1-2004_Sec 5.5-3ab_IEAD_Roof, !- Name + , !- Type + CONSTRUCTION, !- Line Item Type + ASHRAE 90.1-2004_Sec 5.5-3ab_IEAD_Roof, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + 26.5800, !- Cost per Area {$/m2} + , !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + Construction, + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Name + GP01 1/2 GYPSUM, !- Outside Layer + GP01 1/2 GYPSUM; !- Layer 2 + + ComponentCost:LineItem, + int-walls:ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Name + , !- Type + CONSTRUCTION, !- Line Item Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + 1.0000, !- Cost per Area {$/m2} + , !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + Construction, + ASHRAE 90.1-2004_Sec 5.5-3ab_Steel-Framed_Ext-wall, !- Name + MAT-SHEATH, !- Outside Layer + Wall Insulation [2], !- Layer 2 + 1/2IN Gypsum; !- Layer 3 + + ComponentCost:LineItem, + ext-walls:ASHRAE 90.1-2004_Sec 5.5-3ab_Steel-Framed_Ext-wall, !- Name + , !- Type + CONSTRUCTION, !- Line Item Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Steel-Framed_Ext-wall, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + 39.2600, !- Cost per Area {$/m2} + , !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + Construction, + ASHRAE 90.1-2004_Sec 5.5-3ab_Unheated_Ext-slab, !- Name + MAT-CC05 8 HW CONCRETE, !- Outside Layer + CP02 CARPET PAD; !- Layer 2 + + ComponentCost:LineItem, + ext-slab:ASHRAE 90.1-2004_Sec 5.5-3ab_Unheated_Ext-slab, !- Name + , !- Type + CONSTRUCTION, !- Line Item Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Unheated_Ext-slab, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + 24.8600, !- Cost per Area {$/m2} + , !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + Zone, + ZN_1_FLR_1_SEC_1, !- Name + 0.0000, !- Direction of Relative North {deg} + 0.0000, !- X Origin {m} + 0.0000, !- Y Origin {m} + 0.0000, !- Z Origin {m} + 1, !- Type + 1.0000, !- Multiplier + 5.0088, !- Ceiling Height {m} + 393.3855, !- Volume {m3} + autocalculate, !- Floor Area {m2} + , !- Zone Inside Convection Algorithm + , !- Zone Outside Convection Algorithm + YES; !- Part of Total Floor Area + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_1_Wall_1, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Steel-Framed_Ext-wall, !- Construction Name + ZN_1_FLR_1_SEC_1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.5000, !- View Factor to Ground + 4, !- Number of Vertices + 0.000,0.000,5.009, !- X,Y,Z ==> Vertex 1 {m} + 0.000,0.000,0.000, !- X,Y,Z ==> Vertex 2 {m} + 21.756,0.000,0.000, !- X,Y,Z ==> Vertex 3 {m} + 21.756,0.000,5.009; !- X,Y,Z ==> Vertex 4 {m} + + FenestrationSurface:Detailed, + ZN_1_FLR_1_SEC_1_Wall_1_window_1, !- Name + Window, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_north_window, !- Construction Name + ZN_1_FLR_1_SEC_1_Wall_1, !- Building Surface Name + , !- Outside Boundary Condition Object + 0.5000, !- View Factor to Ground + , !- Frame and Divider Name + 1, !- Multiplier + 4, !- Number of Vertices + 0.050,0.000,1.181, !- X,Y,Z ==> Vertex 1 {m} + 0.050,0.000,1.000, !- X,Y,Z ==> Vertex 2 {m} + 21.706,0.000,1.000, !- X,Y,Z ==> Vertex 3 {m} + 21.706,0.000,1.181; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_1_Wall_2, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_1, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_2_Wall_4, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 21.756,0.000,5.009, !- X,Y,Z ==> Vertex 1 {m} + 21.756,0.000,0.000, !- X,Y,Z ==> Vertex 2 {m} + 17.186,4.570,0.000, !- X,Y,Z ==> Vertex 3 {m} + 17.186,4.570,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_1_Wall_3, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_1, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_5_Wall_1, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 17.186,4.570,5.009, !- X,Y,Z ==> Vertex 1 {m} + 17.186,4.570,0.000, !- X,Y,Z ==> Vertex 2 {m} + 4.570,4.570,0.000, !- X,Y,Z ==> Vertex 3 {m} + 4.570,4.570,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_1_Wall_4, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_1, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_4_Wall_1, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 4.570,4.570,5.009, !- X,Y,Z ==> Vertex 1 {m} + 4.570,4.570,0.000, !- X,Y,Z ==> Vertex 2 {m} + 0.000,0.000,0.000, !- X,Y,Z ==> Vertex 3 {m} + 0.000,0.000,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_1_Floor, !- Name + floor, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Unheated_Ext-slab, !- Construction Name + ZN_1_FLR_1_SEC_1, !- Zone Name + Ground, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 4.570,4.570,0.000, !- X,Y,Z ==> Vertex 1 {m} + 17.186,4.570,0.000, !- X,Y,Z ==> Vertex 2 {m} + 21.756,0.000,0.000, !- X,Y,Z ==> Vertex 3 {m} + 0.000,0.000,0.000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_1_Ceiling,!- Name + ceiling, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_IEAD_Roof, !- Construction Name + ZN_1_FLR_1_SEC_1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 0.000,0.000,5.009, !- X,Y,Z ==> Vertex 1 {m} + 21.756,0.000,5.009, !- X,Y,Z ==> Vertex 2 {m} + 17.186,4.570,5.009, !- X,Y,Z ==> Vertex 3 {m} + 4.570,4.570,5.009; !- X,Y,Z ==> Vertex 4 {m} + + InternalMass, + ZN_1_FLR_1_SEC_1_InternalMass_1, !- Name + InteriorFurnishings, !- Construction Name + ZN_1_FLR_1_SEC_1, !- Zone or ZoneList Name + 157.0784; !- Surface Area {m2} + + ZoneInfiltration:DesignFlowRate, + ZN_1_FLR_1_SEC_1_Infiltration, !- Name + ZN_1_FLR_1_SEC_1, !- Zone or ZoneList Name + INFIL_SCH, !- Schedule Name + flow/zone, !- Design Flow Rate Calculation Method + 0.0542, !- Design Flow Rate {m3/s} + , !- Flow per Zone Floor Area {m3/s-m2} + , !- Flow per Exterior Surface Area {m3/s-m2} + , !- Air Changes per Hour {1/hr} + 1.0000, !- Constant Term Coefficient + 0.0000, !- Temperature Term Coefficient + 0.0000, !- Velocity Term Coefficient + 0.0000; !- Velocity Squared Term Coefficient + + People, + ZN_1_FLR_1_SEC_1, !- Name + ZN_1_FLR_1_SEC_1, !- Zone or ZoneList Name + BLDG_OCC_SCH, !- Number of People Schedule Name + people, !- Number of People Calculation Method + 0.6039, !- Number of People + , !- People per Zone Floor Area {person/m2} + , !- Zone Floor Area per Person {m2/person} + 0.3000, !- 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 + ZoneAveraged, !- 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, + ZN_1_FLR_1_SEC_1_Lights, !- Name + ZN_1_FLR_1_SEC_1, !- Zone or ZoneList Name + BLDG_LIGHT_SCH, !- Schedule Name + LightingLevel, !- Design Level Calculation Method + 1178.0879, !- Lighting Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0000, !- Return Air Fraction + 0.2000, !- Fraction Radiant + 0.2000, !- Fraction Visible + 1.0000, !- Fraction Replaceable + General Lights; !- End-Use Subcategory + + ComponentCost:LineItem, + LIGHTING EQUIP:ZN_1_FLR_1_SEC_1, !- Name + , !- Type + LIGHTS, !- Line Item Type + ZN_1_FLR_1_SEC_1, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + , !- Cost per Area {$/m2} + 1.0000, !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + ElectricEquipment, + ZN_1_FLR_1_SEC_1_MiscPlug_Equip, !- Name + ZN_1_FLR_1_SEC_1, !- Zone or ZoneList Name + BLDG_EQUIP_SCH, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 465.9534, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0000, !- Fraction Latent + 0.5000, !- Fraction Radiant + 0.0000, !- Fraction Lost + GeneralEquipment; !- End-Use Subcategory + + GasEquipment, + ZN_1_FLR_1_SEC_1_MiscGas_Equip, !- Name + ZN_1_FLR_1_SEC_1, !- Zone or ZoneList Name + BLDG_EQUIP_SCH, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 184.1006, !- Design Level {W} + , !- Power per Zone Floor Area {W/m2} + , !- Power per Person {W/person} + 0.0000, !- Fraction Latent + 0.2000, !- Fraction Radiant + 0.0000, !- Fraction Lost + 0, !- Carbon Dioxide Generation Rate {m3/s-W} + GeneralEquipment; !- End-Use Subcategory + +!***** Space Conditioning For Zone: ZN_1_FLR_1_SEC_1 ***** + + Sizing:Zone, + ZN_1_FLR_1_SEC_1, !- Zone or ZoneList Name + SupplyAirTemperature, !- Zone Cooling Design Supply Air Temperature Input Method + 14.0, !- Zone Cooling Design Supply Air Temperature {C} + , !- Zone Cooling Design Supply Air Temperature Difference {deltaC} + SupplyAirTemperature, !- Zone Heating Design Supply Air Temperature Input Method + 50.0, !- Zone Heating Design Supply Air Temperature {C} + , !- Zone Heating Design Supply Air Temperature Difference {deltaC} + 0.0085, !- Zone Cooling Design Supply Air Humidity Ratio {kgWater/kgDryAir} + 0.008, !- Zone Heating Design Supply Air Humidity Ratio {kgWater/kgDryAir} + SZ DSOA ZN_1_FLR_1_SEC_1,!- Design Specification Outdoor Air Object Name + 0.0, !- Zone Heating Sizing Factor + 0.0, !- Zone Cooling Sizing Factor + DesignDay, !- Cooling Design Air Flow Method + 0.0, !- Cooling Design Air Flow Rate {m3/s} + , !- Cooling Minimum Air Flow per Zone Floor Area {m3/s-m2} + 0.0, !- Cooling Minimum Air Flow {m3/s} + 0.0, !- Cooling Minimum Air Flow Fraction + DesignDay, !- Heating Design Air Flow Method + 0.0, !- 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 ZN_1_FLR_1_SEC_1,!- Name + FLOW/ZONE, !- Outdoor Air Method + , !- Outdoor Air Flow per Person {m3/s-person} + 0.0, !- Outdoor Air Flow per Zone Floor Area {m3/s-m2} + 0.073704617803385; !- Outdoor Air Flow per Zone {m3/s} + + ZoneControl:Thermostat, + ZN_1_FLR_1_SEC_1 Thermostat, !- Name + ZN_1_FLR_1_SEC_1, !- Zone or ZoneList Name + Dual Zone Control Type Sched, !- Control Type Schedule Name + ThermostatSetpoint:DualSetpoint, !- Control 1 Object Type + ZN_1_FLR_1_SEC_1 DualSPSched; !- Control 1 Name + + ThermostatSetpoint:DualSetpoint, + ZN_1_FLR_1_SEC_1 DualSPSched, !- Name + HtgSetP_Sch, !- Heating Setpoint Temperature Schedule Name + ClgSetP_Sch; !- Cooling Setpoint Temperature Schedule Name + + ZoneHVAC:EquipmentConnections, + ZN_1_FLR_1_SEC_1, !- Zone Name + ZN_1_FLR_1_SEC_1 Equipment, !- Zone Conditioning Equipment List Name + ZN_1_FLR_1_SEC_1 Inlet Nodes, !- Zone Air Inlet Node or NodeList Name + , !- Zone Air Exhaust Node or NodeList Name + ZN_1_FLR_1_SEC_1 Air Node, !- Zone Air Node Name + ZN_1_FLR_1_SEC_1 Return Air Node; !- Zone Return Air Node or NodeList Name + + NodeList, + ZN_1_FLR_1_SEC_1 Inlet Nodes, !- Name + ZN_1_FLR_1_SEC_1 Direct Air Inlet Node; !- Node 1 Name + + ZoneHVAC:EquipmentList, + ZN_1_FLR_1_SEC_1 Equipment, !- Name + SequentialLoad, !- Load Distribution Scheme + ZoneHVAC:AirDistributionUnit, !- Zone Equipment 1 Object Type + ZN_1_FLR_1_SEC_1 Direct Air ADU, !- 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 + + AirTerminal:SingleDuct:ConstantVolume:NoReheat, + ZN_1_FLR_1_SEC_1 Direct Air, !- Name + ALWAYS_ON, !- Availability Schedule Name + ZN_1_FLR_1_SEC_1 Direct Air Inlet Node ATInlet, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_1 Direct Air Inlet Node, !- Air Outlet Node Name + AUTOSIZE, !- Maximum Air Flow Rate {m3/s} + , !- Design Specification Outdoor Air Object Name + ; !- Per Person Ventilation Rate Mode + + ZoneHVAC:AirDistributionUnit, + ZN_1_FLR_1_SEC_1 Direct Air ADU, !- Name + ZN_1_FLR_1_SEC_1 Direct Air Inlet Node, !- Air Distribution Unit Outlet Node Name + AirTerminal:SingleDuct:ConstantVolume:NoReheat, !- Air Terminal Object Type + ZN_1_FLR_1_SEC_1 Direct Air, !- Air Terminal Name + , !- Nominal Upstream Leakage Fraction + , !- Constant Downstream Leakage Fraction + ; !- Design Specification Air Terminal Sizing Object Name + + SetpointManager:SingleZone:Reheat, + SupAirTemp MngrZN_1_FLR_1_SEC_1, !- Name + Temperature, !- Control Variable + 13.0, !- Minimum Supply Air Temperature {C} + 40.0, !- Maximum Supply Air Temperature {C} + ZN_1_FLR_1_SEC_1, !- Control Zone Name + ZN_1_FLR_1_SEC_1 Air Node, !- Zone Node Name + ZN_1_FLR_1_SEC_1 Direct Air Inlet Node, !- Zone Inlet Node Name + ZN_1_FLR_1_SEC_1:Sys Supply Equipment Outlet Node; !- Setpoint Node or NodeList Name + +!***** Process Loads For Zone: ZN_1_FLR_1_SEC_1 ***** + + WaterUse:Connections, + ZN_1_FLR_1_SEC_1SHW_DEFAULT, !- Name + ZN_1_FLR_1_SEC_1SHW_DEFAULT Water Inlet Node, !- Inlet Node Name + ZN_1_FLR_1_SEC_1SHW_DEFAULT Water Outlet Node, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + , !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + ZN_1_FLR_1_SEC_1SHW_DEFAULT; !- Water Use Equipment 1 Name + + WaterUse:Equipment, + ZN_1_FLR_1_SEC_1SHW_DEFAULT, !- Name + SHW_DEFAULT, !- End-Use Subcategory + 2.21418604788511E-6, !- Peak Flow Rate {m3/s} + HOURS_OF_OPERATION, !- Flow Rate Fraction Schedule Name + ZN_1_FLR_1_SEC_1SHW_DEFAULT Temp Sched, !- Target Temperature Schedule Name + ZN_1_FLR_1_SEC_1SHW_DEFAULTHot Supply Temp Sched, !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + ZN_1_FLR_1_SEC_1, !- Zone Name + ZN_1_FLR_1_SEC_1SHW_DEFAULT Sensible fract sched, !- Sensible Fraction Schedule Name + ZN_1_FLR_1_SEC_1SHW_DEFAULT Latent fract sched; !- Latent Fraction Schedule Name + + Schedule:Compact, + ZN_1_FLR_1_SEC_1SHW_DEFAULT Latent fract sched, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,0.05; !- Field 3 + + Schedule:Compact, + ZN_1_FLR_1_SEC_1SHW_DEFAULT Sensible fract sched, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,0.2; !- Field 3 + + Schedule:Compact, + ZN_1_FLR_1_SEC_1SHW_DEFAULT Temp Sched, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,40; !- Field 3 + + Schedule:Compact, + ZN_1_FLR_1_SEC_1SHW_DEFAULTHot Supply Temp Sched, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,55; !- Field 3 + + Zone, + ZN_1_FLR_1_SEC_2, !- Name + 0.0000, !- Direction of Relative North {deg} + 21.7558, !- X Origin {m} + 0.0000, !- Y Origin {m} + 0.0000, !- Z Origin {m} + 1, !- Type + 1.0000, !- Multiplier + 5.0088, !- Ceiling Height {m} + 305.9154, !- Volume {m3} + autocalculate, !- Floor Area {m2} + , !- Zone Inside Convection Algorithm + , !- Zone Outside Convection Algorithm + YES; !- Part of Total Floor Area + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_2_Wall_1, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Steel-Framed_Ext-wall, !- Construction Name + ZN_1_FLR_1_SEC_2, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.5000, !- View Factor to Ground + 4, !- Number of Vertices + 0.000,0.000,5.009, !- X,Y,Z ==> Vertex 1 {m} + 0.000,0.000,0.000, !- X,Y,Z ==> Vertex 2 {m} + 0.000,17.935,0.000, !- X,Y,Z ==> Vertex 3 {m} + 0.000,17.935,5.009; !- X,Y,Z ==> Vertex 4 {m} + + FenestrationSurface:Detailed, + ZN_1_FLR_1_SEC_2_Wall_1_window_1, !- Name + Window, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_west_window, !- Construction Name + ZN_1_FLR_1_SEC_2_Wall_1, !- Building Surface Name + , !- Outside Boundary Condition Object + 0.5000, !- View Factor to Ground + , !- Frame and Divider Name + 1, !- Multiplier + 4, !- Number of Vertices + 0.000,0.050,1.363, !- X,Y,Z ==> Vertex 1 {m} + 0.000,0.050,1.000, !- X,Y,Z ==> Vertex 2 {m} + 0.000,17.885,1.000, !- X,Y,Z ==> Vertex 3 {m} + 0.000,17.885,1.363; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_2_Wall_2, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_2, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_3_Wall_2, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 0.000,17.935,5.009, !- X,Y,Z ==> Vertex 1 {m} + 0.000,17.935,0.000, !- X,Y,Z ==> Vertex 2 {m} + -4.570,13.365,0.000, !- X,Y,Z ==> Vertex 3 {m} + -4.570,13.365,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_2_Wall_3, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_2, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_5_Wall_2, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + -4.570,13.365,5.009, !- X,Y,Z ==> Vertex 1 {m} + -4.570,13.365,0.000, !- X,Y,Z ==> Vertex 2 {m} + -4.570,4.570,0.000, !- X,Y,Z ==> Vertex 3 {m} + -4.570,4.570,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_2_Wall_4, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_2, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_1_Wall_2, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + -4.570,4.570,5.009, !- X,Y,Z ==> Vertex 1 {m} + -4.570,4.570,0.000, !- X,Y,Z ==> Vertex 2 {m} + 0.000,0.000,0.000, !- X,Y,Z ==> Vertex 3 {m} + 0.000,0.000,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_2_Floor, !- Name + floor, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Unheated_Ext-slab, !- Construction Name + ZN_1_FLR_1_SEC_2, !- Zone Name + Ground, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + -4.570,4.570,0.000, !- X,Y,Z ==> Vertex 1 {m} + -4.570,13.365,0.000, !- X,Y,Z ==> Vertex 2 {m} + 0.000,17.935,0.000, !- X,Y,Z ==> Vertex 3 {m} + 0.000,0.000,0.000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_2_Ceiling,!- Name + ceiling, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_IEAD_Roof, !- Construction Name + ZN_1_FLR_1_SEC_2, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 0.000,0.000,5.009, !- X,Y,Z ==> Vertex 1 {m} + 0.000,17.935,5.009, !- X,Y,Z ==> Vertex 2 {m} + -4.570,13.365,5.009, !- X,Y,Z ==> Vertex 3 {m} + -4.570,4.570,5.009; !- X,Y,Z ==> Vertex 4 {m} + + InternalMass, + ZN_1_FLR_1_SEC_2_InternalMass_1, !- Name + InteriorFurnishings, !- Construction Name + ZN_1_FLR_1_SEC_2, !- Zone or ZoneList Name + 122.1516; !- Surface Area {m2} + + ZoneInfiltration:DesignFlowRate, + ZN_1_FLR_1_SEC_2_Infiltration, !- Name + ZN_1_FLR_1_SEC_2, !- Zone or ZoneList Name + INFIL_SCH, !- Schedule Name + flow/zone, !- Design Flow Rate Calculation Method + 0.0435, !- Design Flow Rate {m3/s} + , !- Flow per Zone Floor Area {m3/s-m2} + , !- Flow per Exterior Surface Area {m3/s-m2} + , !- Air Changes per Hour {1/hr} + 1.0000, !- Constant Term Coefficient + 0.0000, !- Temperature Term Coefficient + 0.0000, !- Velocity Term Coefficient + 0.0000; !- Velocity Squared Term Coefficient + + People, + ZN_1_FLR_1_SEC_2, !- Name + ZN_1_FLR_1_SEC_2, !- Zone or ZoneList Name + BLDG_OCC_SCH, !- Number of People Schedule Name + people, !- Number of People Calculation Method + 0.4696, !- Number of People + , !- People per Zone Floor Area {person/m2} + , !- Zone Floor Area per Person {m2/person} + 0.3000, !- 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 + ZoneAveraged, !- 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, + ZN_1_FLR_1_SEC_2_Lights, !- Name + ZN_1_FLR_1_SEC_2, !- Zone or ZoneList Name + BLDG_LIGHT_SCH, !- Schedule Name + LightingLevel, !- Design Level Calculation Method + 916.1373, !- Lighting Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0000, !- Return Air Fraction + 0.2000, !- Fraction Radiant + 0.2000, !- Fraction Visible + 1.0000, !- Fraction Replaceable + General Lights; !- End-Use Subcategory + + ComponentCost:LineItem, + LIGHTING EQUIP:ZN_1_FLR_1_SEC_2, !- Name + , !- Type + LIGHTS, !- Line Item Type + ZN_1_FLR_1_SEC_2, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + , !- Cost per Area {$/m2} + 1.0000, !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + ElectricEquipment, + ZN_1_FLR_1_SEC_2_MiscPlug_Equip, !- Name + ZN_1_FLR_1_SEC_2, !- Zone or ZoneList Name + BLDG_EQUIP_SCH, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 362.3476, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0000, !- Fraction Latent + 0.5000, !- Fraction Radiant + 0.0000, !- Fraction Lost + GeneralEquipment; !- End-Use Subcategory + + GasEquipment, + ZN_1_FLR_1_SEC_2_MiscGas_Equip, !- Name + ZN_1_FLR_1_SEC_2, !- Zone or ZoneList Name + BLDG_EQUIP_SCH, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 143.1654, !- Design Level {W} + , !- Power per Zone Floor Area {W/m2} + , !- Power per Person {W/person} + 0.0000, !- Fraction Latent + 0.2000, !- Fraction Radiant + 0.0000, !- Fraction Lost + 0, !- Carbon Dioxide Generation Rate {m3/s-W} + GeneralEquipment; !- End-Use Subcategory + +!***** Space Conditioning For Zone: ZN_1_FLR_1_SEC_2 ***** + + Sizing:Zone, + ZN_1_FLR_1_SEC_2, !- Zone or ZoneList Name + SupplyAirTemperature, !- Zone Cooling Design Supply Air Temperature Input Method + 14.0, !- Zone Cooling Design Supply Air Temperature {C} + , !- Zone Cooling Design Supply Air Temperature Difference {deltaC} + SupplyAirTemperature, !- Zone Heating Design Supply Air Temperature Input Method + 50.0, !- Zone Heating Design Supply Air Temperature {C} + , !- Zone Heating Design Supply Air Temperature Difference {deltaC} + 0.0085, !- Zone Cooling Design Supply Air Humidity Ratio {kgWater/kgDryAir} + 0.008, !- Zone Heating Design Supply Air Humidity Ratio {kgWater/kgDryAir} + SZ DSOA ZN_1_FLR_1_SEC_2,!- Design Specification Outdoor Air Object Name + 0.0, !- Zone Heating Sizing Factor + 0.0, !- Zone Cooling Sizing Factor + DesignDay, !- Cooling Design Air Flow Method + 0.0, !- Cooling Design Air Flow Rate {m3/s} + , !- Cooling Minimum Air Flow per Zone Floor Area {m3/s-m2} + 0.0, !- Cooling Minimum Air Flow {m3/s} + 0.0, !- Cooling Minimum Air Flow Fraction + DesignDay, !- Heating Design Air Flow Method + 0.0, !- 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 ZN_1_FLR_1_SEC_2,!- Name + FLOW/ZONE, !- Outdoor Air Method + , !- Outdoor Air Flow per Person {m3/s-person} + 0.0, !- Outdoor Air Flow per Zone Floor Area {m3/s-m2} + 0.057316225695446; !- Outdoor Air Flow per Zone {m3/s} + + ZoneControl:Thermostat, + ZN_1_FLR_1_SEC_2 Thermostat, !- Name + ZN_1_FLR_1_SEC_2, !- Zone or ZoneList Name + Dual Zone Control Type Sched, !- Control Type Schedule Name + ThermostatSetpoint:DualSetpoint, !- Control 1 Object Type + ZN_1_FLR_1_SEC_2 DualSPSched; !- Control 1 Name + + ThermostatSetpoint:DualSetpoint, + ZN_1_FLR_1_SEC_2 DualSPSched, !- Name + HtgSetP_Sch, !- Heating Setpoint Temperature Schedule Name + ClgSetP_Sch; !- Cooling Setpoint Temperature Schedule Name + + ZoneHVAC:EquipmentConnections, + ZN_1_FLR_1_SEC_2, !- Zone Name + ZN_1_FLR_1_SEC_2 Equipment, !- Zone Conditioning Equipment List Name + ZN_1_FLR_1_SEC_2 Inlet Nodes, !- Zone Air Inlet Node or NodeList Name + , !- Zone Air Exhaust Node or NodeList Name + ZN_1_FLR_1_SEC_2 Air Node, !- Zone Air Node Name + ZN_1_FLR_1_SEC_2 Return Air Node; !- Zone Return Air Node or NodeList Name + + NodeList, + ZN_1_FLR_1_SEC_2 Inlet Nodes, !- Name + ZN_1_FLR_1_SEC_2 Direct Air Inlet Node; !- Node 1 Name + + ZoneHVAC:EquipmentList, + ZN_1_FLR_1_SEC_2 Equipment, !- Name + SequentialLoad, !- Load Distribution Scheme + ZoneHVAC:AirDistributionUnit, !- Zone Equipment 1 Object Type + ZN_1_FLR_1_SEC_2 Direct Air ADU, !- 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 + + AirTerminal:SingleDuct:ConstantVolume:NoReheat, + ZN_1_FLR_1_SEC_2 Direct Air, !- Name + ALWAYS_ON, !- Availability Schedule Name + ZN_1_FLR_1_SEC_2 Direct Air Inlet Node ATInlet, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_2 Direct Air Inlet Node, !- Air Outlet Node Name + AUTOSIZE, !- Maximum Air Flow Rate {m3/s} + , !- Design Specification Outdoor Air Object Name + ; !- Per Person Ventilation Rate Mode + + ZoneHVAC:AirDistributionUnit, + ZN_1_FLR_1_SEC_2 Direct Air ADU, !- Name + ZN_1_FLR_1_SEC_2 Direct Air Inlet Node, !- Air Distribution Unit Outlet Node Name + AirTerminal:SingleDuct:ConstantVolume:NoReheat, !- Air Terminal Object Type + ZN_1_FLR_1_SEC_2 Direct Air, !- Air Terminal Name + , !- Nominal Upstream Leakage Fraction + , !- Constant Downstream Leakage Fraction + ; !- Design Specification Air Terminal Sizing Object Name + + SetpointManager:SingleZone:Reheat, + SupAirTemp MngrZN_1_FLR_1_SEC_2, !- Name + Temperature, !- Control Variable + 13.0, !- Minimum Supply Air Temperature {C} + 40.0, !- Maximum Supply Air Temperature {C} + ZN_1_FLR_1_SEC_2, !- Control Zone Name + ZN_1_FLR_1_SEC_2 Air Node, !- Zone Node Name + ZN_1_FLR_1_SEC_2 Direct Air Inlet Node, !- Zone Inlet Node Name + ZN_1_FLR_1_SEC_2:Sys Supply Equipment Outlet Node; !- Setpoint Node or NodeList Name + +!***** Process Loads For Zone: ZN_1_FLR_1_SEC_2 ***** + + WaterUse:Connections, + ZN_1_FLR_1_SEC_2SHW_DEFAULT, !- Name + ZN_1_FLR_1_SEC_2SHW_DEFAULT Water Inlet Node, !- Inlet Node Name + ZN_1_FLR_1_SEC_2SHW_DEFAULT Water Outlet Node, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + , !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + ZN_1_FLR_1_SEC_2SHW_DEFAULT; !- Water Use Equipment 1 Name + + WaterUse:Equipment, + ZN_1_FLR_1_SEC_2SHW_DEFAULT, !- Name + SHW_DEFAULT, !- End-Use Subcategory + 1.72185666291403E-7, !- Peak Flow Rate {m3/s} + HOURS_OF_OPERATION, !- Flow Rate Fraction Schedule Name + ZN_1_FLR_1_SEC_2SHW_DEFAULT Temp Sched, !- Target Temperature Schedule Name + ZN_1_FLR_1_SEC_2SHW_DEFAULTHot Supply Temp Sched, !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + ZN_1_FLR_1_SEC_2, !- Zone Name + ZN_1_FLR_1_SEC_2SHW_DEFAULT Sensible fract sched, !- Sensible Fraction Schedule Name + ZN_1_FLR_1_SEC_2SHW_DEFAULT Latent fract sched; !- Latent Fraction Schedule Name + + Schedule:Compact, + ZN_1_FLR_1_SEC_2SHW_DEFAULT Latent fract sched, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,0.05; !- Field 3 + + Schedule:Compact, + ZN_1_FLR_1_SEC_2SHW_DEFAULT Sensible fract sched, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,0.2; !- Field 3 + + Schedule:Compact, + ZN_1_FLR_1_SEC_2SHW_DEFAULT Temp Sched, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,40; !- Field 3 + + Schedule:Compact, + ZN_1_FLR_1_SEC_2SHW_DEFAULTHot Supply Temp Sched, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,55; !- Field 3 + + Zone, + ZN_1_FLR_1_SEC_3, !- Name + 0.0000, !- Direction of Relative North {deg} + 4.5700, !- X Origin {m} + 13.3645, !- Y Origin {m} + 0.0000, !- Z Origin {m} + 1, !- Type + 1.0000, !- Multiplier + 5.0088, !- Ceiling Height {m} + 393.3855, !- Volume {m3} + autocalculate, !- Floor Area {m2} + , !- Zone Inside Convection Algorithm + , !- Zone Outside Convection Algorithm + YES; !- Part of Total Floor Area + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_3_Wall_1, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_3, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_5_Wall_3, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 0.000,0.000,5.009, !- X,Y,Z ==> Vertex 1 {m} + 0.000,0.000,0.000, !- X,Y,Z ==> Vertex 2 {m} + 12.616,0.000,0.000, !- X,Y,Z ==> Vertex 3 {m} + 12.616,0.000,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_3_Wall_2, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_3, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_2_Wall_2, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 12.616,0.000,5.009, !- X,Y,Z ==> Vertex 1 {m} + 12.616,0.000,0.000, !- X,Y,Z ==> Vertex 2 {m} + 17.186,4.570,0.000, !- X,Y,Z ==> Vertex 3 {m} + 17.186,4.570,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_3_Wall_3, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Steel-Framed_Ext-wall, !- Construction Name + ZN_1_FLR_1_SEC_3, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.5000, !- View Factor to Ground + 4, !- Number of Vertices + 17.186,4.570,5.009, !- X,Y,Z ==> Vertex 1 {m} + 17.186,4.570,0.000, !- X,Y,Z ==> Vertex 2 {m} + -4.570,4.570,0.000, !- X,Y,Z ==> Vertex 3 {m} + -4.570,4.570,5.009; !- X,Y,Z ==> Vertex 4 {m} + + FenestrationSurface:Detailed, + ZN_1_FLR_1_SEC_3_Wall_3_window_1, !- Name + Window, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_south_window, !- Construction Name + ZN_1_FLR_1_SEC_3_Wall_3, !- Building Surface Name + , !- Outside Boundary Condition Object + 0.5000, !- View Factor to Ground + , !- Frame and Divider Name + 1, !- Multiplier + 4, !- Number of Vertices + 17.136,4.570,1.362, !- X,Y,Z ==> Vertex 1 {m} + 17.136,4.570,1.000, !- X,Y,Z ==> Vertex 2 {m} + -4.520,4.570,1.000, !- X,Y,Z ==> Vertex 3 {m} + -4.520,4.570,1.362; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_3_Wall_4, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_3, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_4_Wall_3, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + -4.570,4.570,5.009, !- X,Y,Z ==> Vertex 1 {m} + -4.570,4.570,0.000, !- X,Y,Z ==> Vertex 2 {m} + 0.000,0.000,0.000, !- X,Y,Z ==> Vertex 3 {m} + 0.000,0.000,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_3_Floor, !- Name + floor, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Unheated_Ext-slab, !- Construction Name + ZN_1_FLR_1_SEC_3, !- Zone Name + Ground, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + -4.570,4.570,0.000, !- X,Y,Z ==> Vertex 1 {m} + 17.186,4.570,0.000, !- X,Y,Z ==> Vertex 2 {m} + 12.616,0.000,0.000, !- X,Y,Z ==> Vertex 3 {m} + 0.000,0.000,0.000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_3_Ceiling,!- Name + ceiling, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_IEAD_Roof, !- Construction Name + ZN_1_FLR_1_SEC_3, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 0.000,0.000,5.009, !- X,Y,Z ==> Vertex 1 {m} + 12.616,0.000,5.009, !- X,Y,Z ==> Vertex 2 {m} + 17.186,4.570,5.009, !- X,Y,Z ==> Vertex 3 {m} + -4.570,4.570,5.009; !- X,Y,Z ==> Vertex 4 {m} + + InternalMass, + ZN_1_FLR_1_SEC_3_InternalMass_1, !- Name + InteriorFurnishings, !- Construction Name + ZN_1_FLR_1_SEC_3, !- Zone or ZoneList Name + 157.0784; !- Surface Area {m2} + + ZoneInfiltration:DesignFlowRate, + ZN_1_FLR_1_SEC_3_Infiltration, !- Name + ZN_1_FLR_1_SEC_3, !- Zone or ZoneList Name + INFIL_SCH, !- Schedule Name + flow/zone, !- Design Flow Rate Calculation Method + 0.0542, !- Design Flow Rate {m3/s} + , !- Flow per Zone Floor Area {m3/s-m2} + , !- Flow per Exterior Surface Area {m3/s-m2} + , !- Air Changes per Hour {1/hr} + 1.0000, !- Constant Term Coefficient + 0.0000, !- Temperature Term Coefficient + 0.0000, !- Velocity Term Coefficient + 0.0000; !- Velocity Squared Term Coefficient + + People, + ZN_1_FLR_1_SEC_3, !- Name + ZN_1_FLR_1_SEC_3, !- Zone or ZoneList Name + BLDG_OCC_SCH, !- Number of People Schedule Name + people, !- Number of People Calculation Method + 0.6039, !- Number of People + , !- People per Zone Floor Area {person/m2} + , !- Zone Floor Area per Person {m2/person} + 0.3000, !- 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 + ZoneAveraged, !- 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, + ZN_1_FLR_1_SEC_3_Lights, !- Name + ZN_1_FLR_1_SEC_3, !- Zone or ZoneList Name + BLDG_LIGHT_SCH, !- Schedule Name + LightingLevel, !- Design Level Calculation Method + 1178.0879, !- Lighting Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0000, !- Return Air Fraction + 0.2000, !- Fraction Radiant + 0.2000, !- Fraction Visible + 1.0000, !- Fraction Replaceable + General Lights; !- End-Use Subcategory + + ComponentCost:LineItem, + LIGHTING EQUIP:ZN_1_FLR_1_SEC_3, !- Name + , !- Type + LIGHTS, !- Line Item Type + ZN_1_FLR_1_SEC_3, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + , !- Cost per Area {$/m2} + 1.0000, !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + ElectricEquipment, + ZN_1_FLR_1_SEC_3_MiscPlug_Equip, !- Name + ZN_1_FLR_1_SEC_3, !- Zone or ZoneList Name + BLDG_EQUIP_SCH, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 465.9534, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0000, !- Fraction Latent + 0.5000, !- Fraction Radiant + 0.0000, !- Fraction Lost + GeneralEquipment; !- End-Use Subcategory + + GasEquipment, + ZN_1_FLR_1_SEC_3_MiscGas_Equip, !- Name + ZN_1_FLR_1_SEC_3, !- Zone or ZoneList Name + BLDG_EQUIP_SCH, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 184.1006, !- Design Level {W} + , !- Power per Zone Floor Area {W/m2} + , !- Power per Person {W/person} + 0.0000, !- Fraction Latent + 0.2000, !- Fraction Radiant + 0.0000, !- Fraction Lost + 0, !- Carbon Dioxide Generation Rate {m3/s-W} + GeneralEquipment; !- End-Use Subcategory + +!***** Space Conditioning For Zone: ZN_1_FLR_1_SEC_3 ***** + + Sizing:Zone, + ZN_1_FLR_1_SEC_3, !- Zone or ZoneList Name + SupplyAirTemperature, !- Zone Cooling Design Supply Air Temperature Input Method + 14.0, !- Zone Cooling Design Supply Air Temperature {C} + , !- Zone Cooling Design Supply Air Temperature Difference {deltaC} + SupplyAirTemperature, !- Zone Heating Design Supply Air Temperature Input Method + 50.0, !- Zone Heating Design Supply Air Temperature {C} + , !- Zone Heating Design Supply Air Temperature Difference {deltaC} + 0.0085, !- Zone Cooling Design Supply Air Humidity Ratio {kgWater/kgDryAir} + 0.008, !- Zone Heating Design Supply Air Humidity Ratio {kgWater/kgDryAir} + SZ DSOA ZN_1_FLR_1_SEC_3,!- Design Specification Outdoor Air Object Name + 0.0, !- Zone Heating Sizing Factor + 0.0, !- Zone Cooling Sizing Factor + DesignDay, !- Cooling Design Air Flow Method + 0.0, !- Cooling Design Air Flow Rate {m3/s} + , !- Cooling Minimum Air Flow per Zone Floor Area {m3/s-m2} + 0.0, !- Cooling Minimum Air Flow {m3/s} + 0.0, !- Cooling Minimum Air Flow Fraction + DesignDay, !- Heating Design Air Flow Method + 0.0, !- 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 ZN_1_FLR_1_SEC_3,!- Name + FLOW/ZONE, !- Outdoor Air Method + , !- Outdoor Air Flow per Person {m3/s-person} + 0.0, !- Outdoor Air Flow per Zone Floor Area {m3/s-m2} + 0.073704617803385; !- Outdoor Air Flow per Zone {m3/s} + + ZoneControl:Thermostat, + ZN_1_FLR_1_SEC_3 Thermostat, !- Name + ZN_1_FLR_1_SEC_3, !- Zone or ZoneList Name + Dual Zone Control Type Sched, !- Control Type Schedule Name + ThermostatSetpoint:DualSetpoint, !- Control 1 Object Type + ZN_1_FLR_1_SEC_3 DualSPSched; !- Control 1 Name + + ThermostatSetpoint:DualSetpoint, + ZN_1_FLR_1_SEC_3 DualSPSched, !- Name + HtgSetP_Sch, !- Heating Setpoint Temperature Schedule Name + ClgSetP_Sch; !- Cooling Setpoint Temperature Schedule Name + + ZoneHVAC:EquipmentConnections, + ZN_1_FLR_1_SEC_3, !- Zone Name + ZN_1_FLR_1_SEC_3 Equipment, !- Zone Conditioning Equipment List Name + ZN_1_FLR_1_SEC_3 Inlet Nodes, !- Zone Air Inlet Node or NodeList Name + , !- Zone Air Exhaust Node or NodeList Name + ZN_1_FLR_1_SEC_3 Air Node, !- Zone Air Node Name + ZN_1_FLR_1_SEC_3 Return Air Node; !- Zone Return Air Node or NodeList Name + + NodeList, + ZN_1_FLR_1_SEC_3 Inlet Nodes, !- Name + ZN_1_FLR_1_SEC_3 Direct Air Inlet Node; !- Node 1 Name + + ZoneHVAC:EquipmentList, + ZN_1_FLR_1_SEC_3 Equipment, !- Name + SequentialLoad, !- Load Distribution Scheme + ZoneHVAC:AirDistributionUnit, !- Zone Equipment 1 Object Type + ZN_1_FLR_1_SEC_3 Direct Air ADU, !- 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 + + AirTerminal:SingleDuct:ConstantVolume:NoReheat, + ZN_1_FLR_1_SEC_3 Direct Air, !- Name + ALWAYS_ON, !- Availability Schedule Name + ZN_1_FLR_1_SEC_3 Direct Air Inlet Node ATInlet, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_3 Direct Air Inlet Node, !- Air Outlet Node Name + AUTOSIZE, !- Maximum Air Flow Rate {m3/s} + , !- Design Specification Outdoor Air Object Name + ; !- Per Person Ventilation Rate Mode + + ZoneHVAC:AirDistributionUnit, + ZN_1_FLR_1_SEC_3 Direct Air ADU, !- Name + ZN_1_FLR_1_SEC_3 Direct Air Inlet Node, !- Air Distribution Unit Outlet Node Name + AirTerminal:SingleDuct:ConstantVolume:NoReheat, !- Air Terminal Object Type + ZN_1_FLR_1_SEC_3 Direct Air, !- Air Terminal Name + , !- Nominal Upstream Leakage Fraction + , !- Constant Downstream Leakage Fraction + ; !- Design Specification Air Terminal Sizing Object Name + + SetpointManager:SingleZone:Reheat, + SupAirTemp MngrZN_1_FLR_1_SEC_3, !- Name + Temperature, !- Control Variable + 13.0, !- Minimum Supply Air Temperature {C} + 40.0, !- Maximum Supply Air Temperature {C} + ZN_1_FLR_1_SEC_3, !- Control Zone Name + ZN_1_FLR_1_SEC_3 Air Node, !- Zone Node Name + ZN_1_FLR_1_SEC_3 Direct Air Inlet Node, !- Zone Inlet Node Name + ZN_1_FLR_1_SEC_3:Sys Supply Equipment Outlet Node; !- Setpoint Node or NodeList Name + +!***** Process Loads For Zone: ZN_1_FLR_1_SEC_3 ***** + + WaterUse:Connections, + ZN_1_FLR_1_SEC_3SHW_DEFAULT, !- Name + ZN_1_FLR_1_SEC_3SHW_DEFAULT Water Inlet Node, !- Inlet Node Name + ZN_1_FLR_1_SEC_3SHW_DEFAULT Water Outlet Node, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + , !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + ZN_1_FLR_1_SEC_3SHW_DEFAULT; !- Water Use Equipment 1 Name + + WaterUse:Equipment, + ZN_1_FLR_1_SEC_3SHW_DEFAULT, !- Name + SHW_DEFAULT, !- End-Use Subcategory + 2.21418604788511E-6, !- Peak Flow Rate {m3/s} + HOURS_OF_OPERATION, !- Flow Rate Fraction Schedule Name + ZN_1_FLR_1_SEC_3SHW_DEFAULT Temp Sched, !- Target Temperature Schedule Name + ZN_1_FLR_1_SEC_3SHW_DEFAULTHot Supply Temp Sched, !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + ZN_1_FLR_1_SEC_3, !- Zone Name + ZN_1_FLR_1_SEC_3SHW_DEFAULT Sensible fract sched, !- Sensible Fraction Schedule Name + ZN_1_FLR_1_SEC_3SHW_DEFAULT Latent fract sched; !- Latent Fraction Schedule Name + + Schedule:Compact, + ZN_1_FLR_1_SEC_3SHW_DEFAULT Latent fract sched, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,0.05; !- Field 3 + + Schedule:Compact, + ZN_1_FLR_1_SEC_3SHW_DEFAULT Sensible fract sched, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,0.2; !- Field 3 + + Schedule:Compact, + ZN_1_FLR_1_SEC_3SHW_DEFAULT Temp Sched, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,40; !- Field 3 + + Schedule:Compact, + ZN_1_FLR_1_SEC_3SHW_DEFAULTHot Supply Temp Sched, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,55; !- Field 3 + + Zone, + ZN_1_FLR_1_SEC_4, !- Name + 0.0000, !- Direction of Relative North {deg} + 0.0000, !- X Origin {m} + 0.0000, !- Y Origin {m} + 0.0000, !- Z Origin {m} + 1, !- Type + 1.0000, !- Multiplier + 5.0088, !- Ceiling Height {m} + 305.9154, !- Volume {m3} + autocalculate, !- Floor Area {m2} + , !- Zone Inside Convection Algorithm + , !- Zone Outside Convection Algorithm + YES; !- Part of Total Floor Area + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_4_Wall_1, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_4, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_1_Wall_4, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 0.000,0.000,5.009, !- X,Y,Z ==> Vertex 1 {m} + 0.000,0.000,0.000, !- X,Y,Z ==> Vertex 2 {m} + 4.570,4.570,0.000, !- X,Y,Z ==> Vertex 3 {m} + 4.570,4.570,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_4_Wall_2, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_4, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_5_Wall_4, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 4.570,4.570,5.009, !- X,Y,Z ==> Vertex 1 {m} + 4.570,4.570,0.000, !- X,Y,Z ==> Vertex 2 {m} + 4.570,13.365,0.000, !- X,Y,Z ==> Vertex 3 {m} + 4.570,13.365,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_4_Wall_3, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_4, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_3_Wall_4, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 4.570,13.365,5.009, !- X,Y,Z ==> Vertex 1 {m} + 4.570,13.365,0.000, !- X,Y,Z ==> Vertex 2 {m} + 0.000,17.935,0.000, !- X,Y,Z ==> Vertex 3 {m} + 0.000,17.935,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_4_Wall_4, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Steel-Framed_Ext-wall, !- Construction Name + ZN_1_FLR_1_SEC_4, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.5000, !- View Factor to Ground + 4, !- Number of Vertices + 0.000,17.935,5.009, !- X,Y,Z ==> Vertex 1 {m} + 0.000,17.935,0.000, !- X,Y,Z ==> Vertex 2 {m} + 0.000,0.000,0.000, !- X,Y,Z ==> Vertex 3 {m} + 0.000,0.000,5.009; !- X,Y,Z ==> Vertex 4 {m} + + FenestrationSurface:Detailed, + ZN_1_FLR_1_SEC_4_Wall_4_window_1, !- Name + Window, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_0_0.1_fixed_east_window, !- Construction Name + ZN_1_FLR_1_SEC_4_Wall_4, !- Building Surface Name + , !- Outside Boundary Condition Object + 0.5000, !- View Factor to Ground + , !- Frame and Divider Name + 1, !- Multiplier + 4, !- Number of Vertices + 0.000,17.885,1.363, !- X,Y,Z ==> Vertex 1 {m} + 0.000,17.885,1.000, !- X,Y,Z ==> Vertex 2 {m} + 0.000,0.050,1.000, !- X,Y,Z ==> Vertex 3 {m} + 0.000,0.050,1.363; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_4_Floor, !- Name + floor, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Unheated_Ext-slab, !- Construction Name + ZN_1_FLR_1_SEC_4, !- Zone Name + Ground, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 0.000,17.935,0.000, !- X,Y,Z ==> Vertex 1 {m} + 4.570,13.365,0.000, !- X,Y,Z ==> Vertex 2 {m} + 4.570,4.570,0.000, !- X,Y,Z ==> Vertex 3 {m} + 0.000,0.000,0.000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_4_Ceiling,!- Name + ceiling, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_IEAD_Roof, !- Construction Name + ZN_1_FLR_1_SEC_4, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 0.000,0.000,5.009, !- X,Y,Z ==> Vertex 1 {m} + 4.570,4.570,5.009, !- X,Y,Z ==> Vertex 2 {m} + 4.570,13.365,5.009, !- X,Y,Z ==> Vertex 3 {m} + 0.000,17.935,5.009; !- X,Y,Z ==> Vertex 4 {m} + + InternalMass, + ZN_1_FLR_1_SEC_4_InternalMass_1, !- Name + InteriorFurnishings, !- Construction Name + ZN_1_FLR_1_SEC_4, !- Zone or ZoneList Name + 122.1516; !- Surface Area {m2} + + ZoneInfiltration:DesignFlowRate, + ZN_1_FLR_1_SEC_4_Infiltration, !- Name + ZN_1_FLR_1_SEC_4, !- Zone or ZoneList Name + INFIL_SCH, !- Schedule Name + flow/zone, !- Design Flow Rate Calculation Method + 0.0435, !- Design Flow Rate {m3/s} + , !- Flow per Zone Floor Area {m3/s-m2} + , !- Flow per Exterior Surface Area {m3/s-m2} + , !- Air Changes per Hour {1/hr} + 1.0000, !- Constant Term Coefficient + 0.0000, !- Temperature Term Coefficient + 0.0000, !- Velocity Term Coefficient + 0.0000; !- Velocity Squared Term Coefficient + + People, + ZN_1_FLR_1_SEC_4, !- Name + ZN_1_FLR_1_SEC_4, !- Zone or ZoneList Name + BLDG_OCC_SCH, !- Number of People Schedule Name + people, !- Number of People Calculation Method + 0.4696, !- Number of People + , !- People per Zone Floor Area {person/m2} + , !- Zone Floor Area per Person {m2/person} + 0.3000, !- 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 + ZoneAveraged, !- 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, + ZN_1_FLR_1_SEC_4_Lights, !- Name + ZN_1_FLR_1_SEC_4, !- Zone or ZoneList Name + BLDG_LIGHT_SCH, !- Schedule Name + LightingLevel, !- Design Level Calculation Method + 916.1373, !- Lighting Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0000, !- Return Air Fraction + 0.2000, !- Fraction Radiant + 0.2000, !- Fraction Visible + 1.0000, !- Fraction Replaceable + General Lights; !- End-Use Subcategory + + ComponentCost:LineItem, + LIGHTING EQUIP:ZN_1_FLR_1_SEC_4, !- Name + , !- Type + LIGHTS, !- Line Item Type + ZN_1_FLR_1_SEC_4, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + , !- Cost per Area {$/m2} + 1.0000, !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + ElectricEquipment, + ZN_1_FLR_1_SEC_4_MiscPlug_Equip, !- Name + ZN_1_FLR_1_SEC_4, !- Zone or ZoneList Name + BLDG_EQUIP_SCH, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 362.3476, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0000, !- Fraction Latent + 0.5000, !- Fraction Radiant + 0.0000, !- Fraction Lost + GeneralEquipment; !- End-Use Subcategory + + GasEquipment, + ZN_1_FLR_1_SEC_4_MiscGas_Equip, !- Name + ZN_1_FLR_1_SEC_4, !- Zone or ZoneList Name + BLDG_EQUIP_SCH, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 143.1654, !- Design Level {W} + , !- Power per Zone Floor Area {W/m2} + , !- Power per Person {W/person} + 0.0000, !- Fraction Latent + 0.2000, !- Fraction Radiant + 0.0000, !- Fraction Lost + 0, !- Carbon Dioxide Generation Rate {m3/s-W} + GeneralEquipment; !- End-Use Subcategory + +!***** Space Conditioning For Zone: ZN_1_FLR_1_SEC_4 ***** + + Sizing:Zone, + ZN_1_FLR_1_SEC_4, !- Zone or ZoneList Name + SupplyAirTemperature, !- Zone Cooling Design Supply Air Temperature Input Method + 14.0, !- Zone Cooling Design Supply Air Temperature {C} + , !- Zone Cooling Design Supply Air Temperature Difference {deltaC} + SupplyAirTemperature, !- Zone Heating Design Supply Air Temperature Input Method + 50.0, !- Zone Heating Design Supply Air Temperature {C} + , !- Zone Heating Design Supply Air Temperature Difference {deltaC} + 0.0085, !- Zone Cooling Design Supply Air Humidity Ratio {kgWater/kgDryAir} + 0.008, !- Zone Heating Design Supply Air Humidity Ratio {kgWater/kgDryAir} + SZ DSOA ZN_1_FLR_1_SEC_4,!- Design Specification Outdoor Air Object Name + 0.0, !- Zone Heating Sizing Factor + 0.0, !- Zone Cooling Sizing Factor + DesignDay, !- Cooling Design Air Flow Method + 0.0, !- Cooling Design Air Flow Rate {m3/s} + , !- Cooling Minimum Air Flow per Zone Floor Area {m3/s-m2} + 0.0, !- Cooling Minimum Air Flow {m3/s} + 0.0, !- Cooling Minimum Air Flow Fraction + DesignDay, !- Heating Design Air Flow Method + 0.0, !- 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 ZN_1_FLR_1_SEC_4,!- Name + FLOW/ZONE, !- Outdoor Air Method + , !- Outdoor Air Flow per Person {m3/s-person} + 0.0, !- Outdoor Air Flow per Zone Floor Area {m3/s-m2} + 0.057316225695446; !- Outdoor Air Flow per Zone {m3/s} + + ZoneControl:Thermostat, + ZN_1_FLR_1_SEC_4 Thermostat, !- Name + ZN_1_FLR_1_SEC_4, !- Zone or ZoneList Name + Dual Zone Control Type Sched, !- Control Type Schedule Name + ThermostatSetpoint:DualSetpoint, !- Control 1 Object Type + ZN_1_FLR_1_SEC_4 DualSPSched; !- Control 1 Name + + ThermostatSetpoint:DualSetpoint, + ZN_1_FLR_1_SEC_4 DualSPSched, !- Name + HtgSetP_Sch, !- Heating Setpoint Temperature Schedule Name + ClgSetP_Sch; !- Cooling Setpoint Temperature Schedule Name + + ZoneHVAC:EquipmentConnections, + ZN_1_FLR_1_SEC_4, !- Zone Name + ZN_1_FLR_1_SEC_4 Equipment, !- Zone Conditioning Equipment List Name + ZN_1_FLR_1_SEC_4 Inlet Nodes, !- Zone Air Inlet Node or NodeList Name + , !- Zone Air Exhaust Node or NodeList Name + ZN_1_FLR_1_SEC_4 Air Node, !- Zone Air Node Name + ZN_1_FLR_1_SEC_4 Return Air Node; !- Zone Return Air Node or NodeList Name + + NodeList, + ZN_1_FLR_1_SEC_4 Inlet Nodes, !- Name + ZN_1_FLR_1_SEC_4 Direct Air Inlet Node; !- Node 1 Name + + ZoneHVAC:EquipmentList, + ZN_1_FLR_1_SEC_4 Equipment, !- Name + SequentialLoad, !- Load Distribution Scheme + ZoneHVAC:AirDistributionUnit, !- Zone Equipment 1 Object Type + ZN_1_FLR_1_SEC_4 Direct Air ADU, !- 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 + + AirTerminal:SingleDuct:ConstantVolume:NoReheat, + ZN_1_FLR_1_SEC_4 Direct Air, !- Name + ALWAYS_ON, !- Availability Schedule Name + ZN_1_FLR_1_SEC_4 Direct Air Inlet Node ATInlet, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_4 Direct Air Inlet Node, !- Air Outlet Node Name + AUTOSIZE, !- Maximum Air Flow Rate {m3/s} + , !- Design Specification Outdoor Air Object Name + ; !- Per Person Ventilation Rate Mode + + ZoneHVAC:AirDistributionUnit, + ZN_1_FLR_1_SEC_4 Direct Air ADU, !- Name + ZN_1_FLR_1_SEC_4 Direct Air Inlet Node, !- Air Distribution Unit Outlet Node Name + AirTerminal:SingleDuct:ConstantVolume:NoReheat, !- Air Terminal Object Type + ZN_1_FLR_1_SEC_4 Direct Air, !- Air Terminal Name + , !- Nominal Upstream Leakage Fraction + , !- Constant Downstream Leakage Fraction + ; !- Design Specification Air Terminal Sizing Object Name + + SetpointManager:SingleZone:Reheat, + SupAirTemp MngrZN_1_FLR_1_SEC_4, !- Name + Temperature, !- Control Variable + 13.0, !- Minimum Supply Air Temperature {C} + 40.0, !- Maximum Supply Air Temperature {C} + ZN_1_FLR_1_SEC_4, !- Control Zone Name + ZN_1_FLR_1_SEC_4 Air Node, !- Zone Node Name + ZN_1_FLR_1_SEC_4 Direct Air Inlet Node, !- Zone Inlet Node Name + ZN_1_FLR_1_SEC_4:Sys Supply Equipment Outlet Node; !- Setpoint Node or NodeList Name + +!***** Process Loads For Zone: ZN_1_FLR_1_SEC_4 ***** + + WaterUse:Connections, + ZN_1_FLR_1_SEC_4SHW_DEFAULT, !- Name + ZN_1_FLR_1_SEC_4SHW_DEFAULT Water Inlet Node, !- Inlet Node Name + ZN_1_FLR_1_SEC_4SHW_DEFAULT Water Outlet Node, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + , !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + ZN_1_FLR_1_SEC_4SHW_DEFAULT; !- Water Use Equipment 1 Name + + WaterUse:Equipment, + ZN_1_FLR_1_SEC_4SHW_DEFAULT, !- Name + SHW_DEFAULT, !- End-Use Subcategory + 1.72185666291403E-6, !- Peak Flow Rate {m3/s} + HOURS_OF_OPERATION, !- Flow Rate Fraction Schedule Name + ZN_1_FLR_1_SEC_4SHW_DEFAULT Temp Sched, !- Target Temperature Schedule Name + ZN_1_FLR_1_SEC_4SHW_DEFAULTHot Supply Temp Sched, !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + ZN_1_FLR_1_SEC_4, !- Zone Name + ZN_1_FLR_1_SEC_4SHW_DEFAULT Sensible fract sched, !- Sensible Fraction Schedule Name + ZN_1_FLR_1_SEC_4SHW_DEFAULT Latent fract sched; !- Latent Fraction Schedule Name + + Schedule:Compact, + ZN_1_FLR_1_SEC_4SHW_DEFAULT Latent fract sched, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,0.05; !- Field 3 + + Schedule:Compact, + ZN_1_FLR_1_SEC_4SHW_DEFAULT Sensible fract sched, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,0.2; !- Field 3 + + Schedule:Compact, + ZN_1_FLR_1_SEC_4SHW_DEFAULT Temp Sched, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,40; !- Field 3 + + Schedule:Compact, + ZN_1_FLR_1_SEC_4SHW_DEFAULTHot Supply Temp Sched, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,55; !- Field 3 + + Zone, + ZN_1_FLR_1_SEC_5, !- Name + 0.0000, !- Direction of Relative North {deg} + 4.5700, !- X Origin {m} + 4.5700, !- Y Origin {m} + 0.0000, !- Z Origin {m} + 1, !- Type + 1.0000, !- Multiplier + 5.0088, !- Ceiling Height {m} + 555.7240, !- Volume {m3} + autocalculate, !- Floor Area {m2} + , !- Zone Inside Convection Algorithm + , !- Zone Outside Convection Algorithm + YES; !- Part of Total Floor Area + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_5_Wall_1, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_5, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_1_Wall_3, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 0.000,0.000,5.009, !- X,Y,Z ==> Vertex 1 {m} + 0.000,0.000,0.000, !- X,Y,Z ==> Vertex 2 {m} + 12.616,0.000,0.000, !- X,Y,Z ==> Vertex 3 {m} + 12.616,0.000,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_5_Wall_2, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_5, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_2_Wall_3, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 12.616,0.000,5.009, !- X,Y,Z ==> Vertex 1 {m} + 12.616,0.000,0.000, !- X,Y,Z ==> Vertex 2 {m} + 12.616,8.795,0.000, !- X,Y,Z ==> Vertex 3 {m} + 12.616,8.795,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_5_Wall_3, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_5, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_3_Wall_1, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 12.616,8.795,5.009, !- X,Y,Z ==> Vertex 1 {m} + 12.616,8.795,0.000, !- X,Y,Z ==> Vertex 2 {m} + 0.000,8.795,0.000, !- X,Y,Z ==> Vertex 3 {m} + 0.000,8.795,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_5_Wall_4, !- Name + wall, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Interior Wall_Int-Wall, !- Construction Name + ZN_1_FLR_1_SEC_5, !- Zone Name + Surface, !- Outside Boundary Condition + ZN_1_FLR_1_SEC_4_Wall_2, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 0.000,8.795,5.009, !- X,Y,Z ==> Vertex 1 {m} + 0.000,8.795,0.000, !- X,Y,Z ==> Vertex 2 {m} + 0.000,0.000,0.000, !- X,Y,Z ==> Vertex 3 {m} + 0.000,0.000,5.009; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_5_Floor, !- Name + floor, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_Unheated_Ext-slab, !- Construction Name + ZN_1_FLR_1_SEC_5, !- Zone Name + Ground, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 0.000,8.795,0.000, !- X,Y,Z ==> Vertex 1 {m} + 12.616,8.795,0.000, !- X,Y,Z ==> Vertex 2 {m} + 12.616,0.000,0.000, !- X,Y,Z ==> Vertex 3 {m} + 0.000,0.000,0.000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZN_1_FLR_1_SEC_5_Ceiling,!- Name + ceiling, !- Surface Type + ASHRAE 90.1-2004_Sec 5.5-3ab_IEAD_Roof, !- Construction Name + ZN_1_FLR_1_SEC_5, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.0000, !- View Factor to Ground + 4, !- Number of Vertices + 0.000,0.000,5.009, !- X,Y,Z ==> Vertex 1 {m} + 12.616,0.000,5.009, !- X,Y,Z ==> Vertex 2 {m} + 12.616,8.795,5.009, !- X,Y,Z ==> Vertex 3 {m} + 0.000,8.795,5.009; !- X,Y,Z ==> Vertex 4 {m} + + InternalMass, + ZN_1_FLR_1_SEC_5_InternalMass_1, !- Name + InteriorFurnishings, !- Construction Name + ZN_1_FLR_1_SEC_5, !- Zone or ZoneList Name + 221.8999; !- Surface Area {m2} + + ZoneInfiltration:DesignFlowRate, + ZN_1_FLR_1_SEC_5_Infiltration, !- Name + ZN_1_FLR_1_SEC_5, !- Zone or ZoneList Name + INFIL_SCH, !- Schedule Name + flow/zone, !- Design Flow Rate Calculation Method + 0.0354, !- Design Flow Rate {m3/s} + , !- Flow per Zone Floor Area {m3/s-m2} + , !- Flow per Exterior Surface Area {m3/s-m2} + , !- Air Changes per Hour {1/hr} + 1.0000, !- Constant Term Coefficient + 0.0000, !- Temperature Term Coefficient + 0.0000, !- Velocity Term Coefficient + 0.0000; !- Velocity Squared Term Coefficient + + People, + ZN_1_FLR_1_SEC_5, !- Name + ZN_1_FLR_1_SEC_5, !- Zone or ZoneList Name + BLDG_OCC_SCH, !- Number of People Schedule Name + people, !- Number of People Calculation Method + 0.8531, !- Number of People + , !- People per Zone Floor Area {person/m2} + , !- Zone Floor Area per Person {m2/person} + 0.3000, !- 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 + ZoneAveraged, !- 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, + ZN_1_FLR_1_SEC_5_Lights, !- Name + ZN_1_FLR_1_SEC_5, !- Zone or ZoneList Name + BLDG_LIGHT_SCH, !- Schedule Name + LightingLevel, !- Design Level Calculation Method + 1664.2496, !- Lighting Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0000, !- Return Air Fraction + 0.2000, !- Fraction Radiant + 0.2000, !- Fraction Visible + 1.0000, !- Fraction Replaceable + General Lights; !- End-Use Subcategory + + ComponentCost:LineItem, + LIGHTING EQUIP:ZN_1_FLR_1_SEC_5, !- Name + , !- Type + LIGHTS, !- Line Item Type + ZN_1_FLR_1_SEC_5, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + , !- Cost per Area {$/m2} + 1.0000, !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + ElectricEquipment, + ZN_1_FLR_1_SEC_5_MiscPlug_Equip, !- Name + ZN_1_FLR_1_SEC_5, !- Zone or ZoneList Name + BLDG_EQUIP_SCH, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 658.2385, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0000, !- Fraction Latent + 0.5000, !- Fraction Radiant + 0.0000, !- Fraction Lost + GeneralEquipment; !- End-Use Subcategory + + GasEquipment, + ZN_1_FLR_1_SEC_5_MiscGas_Equip, !- Name + ZN_1_FLR_1_SEC_5, !- Zone or ZoneList Name + BLDG_EQUIP_SCH, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 260.0734, !- Design Level {W} + , !- Power per Zone Floor Area {W/m2} + , !- Power per Person {W/person} + 0.0000, !- Fraction Latent + 0.2000, !- Fraction Radiant + 0.0000, !- Fraction Lost + 0, !- Carbon Dioxide Generation Rate {m3/s-W} + GeneralEquipment; !- End-Use Subcategory + +!***** Space Conditioning For Zone: ZN_1_FLR_1_SEC_5 ***** + + Sizing:Zone, + ZN_1_FLR_1_SEC_5, !- Zone or ZoneList Name + SupplyAirTemperature, !- Zone Cooling Design Supply Air Temperature Input Method + 14.0, !- Zone Cooling Design Supply Air Temperature {C} + , !- Zone Cooling Design Supply Air Temperature Difference {deltaC} + SupplyAirTemperature, !- Zone Heating Design Supply Air Temperature Input Method + 50.0, !- Zone Heating Design Supply Air Temperature {C} + , !- Zone Heating Design Supply Air Temperature Difference {deltaC} + 0.0085, !- Zone Cooling Design Supply Air Humidity Ratio {kgWater/kgDryAir} + 0.008, !- Zone Heating Design Supply Air Humidity Ratio {kgWater/kgDryAir} + SZ DSOA ZN_1_FLR_1_SEC_5,!- Design Specification Outdoor Air Object Name + 0.0, !- Zone Heating Sizing Factor + 0.0, !- Zone Cooling Sizing Factor + DesignDay, !- Cooling Design Air Flow Method + 0.0, !- Cooling Design Air Flow Rate {m3/s} + , !- Cooling Minimum Air Flow per Zone Floor Area {m3/s-m2} + 0.0, !- Cooling Minimum Air Flow {m3/s} + 0.0, !- Cooling Minimum Air Flow Fraction + DesignDay, !- Heating Design Air Flow Method + 0.0, !- 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 ZN_1_FLR_1_SEC_5,!- Name + FLOW/ZONE, !- Outdoor Air Method + , !- Outdoor Air Flow per Person {m3/s-person} + 0.0, !- Outdoor Air Flow per Zone Floor Area {m3/s-m2} + 0.104120314886338; !- Outdoor Air Flow per Zone {m3/s} + + ZoneControl:Thermostat, + ZN_1_FLR_1_SEC_5 Thermostat, !- Name + ZN_1_FLR_1_SEC_5, !- Zone or ZoneList Name + Dual Zone Control Type Sched, !- Control Type Schedule Name + ThermostatSetpoint:DualSetpoint, !- Control 1 Object Type + ZN_1_FLR_1_SEC_5 DualSPSched; !- Control 1 Name + + ThermostatSetpoint:DualSetpoint, + ZN_1_FLR_1_SEC_5 DualSPSched, !- Name + HtgSetP_Sch, !- Heating Setpoint Temperature Schedule Name + ClgSetP_Sch; !- Cooling Setpoint Temperature Schedule Name + + ZoneHVAC:EquipmentConnections, + ZN_1_FLR_1_SEC_5, !- Zone Name + ZN_1_FLR_1_SEC_5 Equipment, !- Zone Conditioning Equipment List Name + ZN_1_FLR_1_SEC_5 Inlet Nodes, !- Zone Air Inlet Node or NodeList Name + , !- Zone Air Exhaust Node or NodeList Name + ZN_1_FLR_1_SEC_5 Air Node, !- Zone Air Node Name + ZN_1_FLR_1_SEC_5 Return Air Node; !- Zone Return Air Node or NodeList Name + + NodeList, + ZN_1_FLR_1_SEC_5 Inlet Nodes, !- Name + ZN_1_FLR_1_SEC_5 Direct Air Inlet Node; !- Node 1 Name + + ZoneHVAC:EquipmentList, + ZN_1_FLR_1_SEC_5 Equipment, !- Name + SequentialLoad, !- Load Distribution Scheme + ZoneHVAC:AirDistributionUnit, !- Zone Equipment 1 Object Type + ZN_1_FLR_1_SEC_5 Direct Air ADU, !- 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 + + AirTerminal:SingleDuct:ConstantVolume:NoReheat, + ZN_1_FLR_1_SEC_5 Direct Air, !- Name + ALWAYS_ON, !- Availability Schedule Name + ZN_1_FLR_1_SEC_5 Direct Air Inlet Node ATInlet, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_5 Direct Air Inlet Node, !- Air Outlet Node Name + AUTOSIZE, !- Maximum Air Flow Rate {m3/s} + , !- Design Specification Outdoor Air Object Name + ; !- Per Person Ventilation Rate Mode + + ZoneHVAC:AirDistributionUnit, + ZN_1_FLR_1_SEC_5 Direct Air ADU, !- Name + ZN_1_FLR_1_SEC_5 Direct Air Inlet Node, !- Air Distribution Unit Outlet Node Name + AirTerminal:SingleDuct:ConstantVolume:NoReheat, !- Air Terminal Object Type + ZN_1_FLR_1_SEC_5 Direct Air, !- Air Terminal Name + , !- Nominal Upstream Leakage Fraction + , !- Constant Downstream Leakage Fraction + ; !- Design Specification Air Terminal Sizing Object Name + + SetpointManager:SingleZone:Reheat, + SupAirTemp MngrZN_1_FLR_1_SEC_5, !- Name + Temperature, !- Control Variable + 13.0, !- Minimum Supply Air Temperature {C} + 40.0, !- Maximum Supply Air Temperature {C} + ZN_1_FLR_1_SEC_5, !- Control Zone Name + ZN_1_FLR_1_SEC_5 Air Node, !- Zone Node Name + ZN_1_FLR_1_SEC_5 Direct Air Inlet Node, !- Zone Inlet Node Name + ZN_1_FLR_1_SEC_5:Sys Supply Equipment Outlet Node; !- Setpoint Node or NodeList Name + +!***** Process Loads For Zone: ZN_1_FLR_1_SEC_5 ***** + + WaterUse:Connections, + ZN_1_FLR_1_SEC_5SHW_DEFAULT, !- Name + ZN_1_FLR_1_SEC_5SHW_DEFAULT Water Inlet Node, !- Inlet Node Name + ZN_1_FLR_1_SEC_5SHW_DEFAULT Water Outlet Node, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + , !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + ZN_1_FLR_1_SEC_5SHW_DEFAULT; !- Water Use Equipment 1 Name + + WaterUse:Equipment, + ZN_1_FLR_1_SEC_5SHW_DEFAULT, !- Name + SHW_DEFAULT, !- End-Use Subcategory + 3.12791457840171E-7, !- Peak Flow Rate {m3/s} + HOURS_OF_OPERATION, !- Flow Rate Fraction Schedule Name + ZN_1_FLR_1_SEC_5SHW_DEFAULT Temp Sched, !- Target Temperature Schedule Name + ZN_1_FLR_1_SEC_5SHW_DEFAULTHot Supply Temp Sched, !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + ZN_1_FLR_1_SEC_5, !- Zone Name + ZN_1_FLR_1_SEC_5SHW_DEFAULT Sensible fract sched, !- Sensible Fraction Schedule Name + ZN_1_FLR_1_SEC_5SHW_DEFAULT Latent fract sched; !- Latent Fraction Schedule Name + + Schedule:Compact, + ZN_1_FLR_1_SEC_5SHW_DEFAULT Latent fract sched, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,0.05; !- Field 3 + + Schedule:Compact, + ZN_1_FLR_1_SEC_5SHW_DEFAULT Sensible fract sched, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,0.2; !- Field 3 + + Schedule:Compact, + ZN_1_FLR_1_SEC_5SHW_DEFAULT Temp Sched, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,40; !- Field 3 + + Schedule:Compact, + ZN_1_FLR_1_SEC_5SHW_DEFAULTHot Supply Temp Sched, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,55; !- Field 3 + +!***** Air Loop: ZN_1_FLR_1_SEC_1:Sys ***** + + AirLoopHVAC, + ZN_1_FLR_1_SEC_1:Sys, !- Name + , !- Controller List Name + ZN_1_FLR_1_SEC_1:Sys Availability Manager List, !- Availability Manager List Name + AUTOSIZE, !- Design Supply Air Flow Rate {m3/s} + ZN_1_FLR_1_SEC_1:Sys Air Loop Branches, !- Branch List Name + , !- Connector List Name + ZN_1_FLR_1_SEC_1:Sys Supply Equipment Inlet Node, !- Supply Side Inlet Node Name + ZN_1_FLR_1_SEC_1:Sys Zone Equipment Outlet Node, !- Demand Side Outlet Node Name + ZN_1_FLR_1_SEC_1:Sys Zone Equipment Inlet Node, !- Demand Side Inlet Node Names + ZN_1_FLR_1_SEC_1:Sys Supply Equipment Outlet Node; !- Supply Side Outlet Node Names + + Sizing:System, + ZN_1_FLR_1_SEC_1:Sys, !- 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 + 7.0, !- Preheat Design Temperature {C} + .008, !- Preheat Design Humidity Ratio {kgWater/kgDryAir} + 11.0, !- Precool Design Temperature {C} + .008, !- Precool Design Humidity Ratio {kgWater/kgDryAir} + 12.8, !- Central Cooling Design Supply Air Temperature {C} + 40.0, !- 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.0085, !- 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.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.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 + + AvailabilityManagerAssignmentList, + ZN_1_FLR_1_SEC_1:Sys Availability Manager List, !- Name + AvailabilityManager:NightCycle, !- Availability Manager 1 Object Type + ZN_1_FLR_1_SEC_1:Sys Availability Manager; !- Availability Manager 1 Name + + AvailabilityManager:NightCycle, + ZN_1_FLR_1_SEC_1:Sys Availability Manager, !- Name + Always_On, !- Applicability Schedule Name + HVACOperationSchd, !- Fan Schedule Name + CycleOnAny, !- Control Type + 1.0, !- Thermostat Tolerance {deltaC} + FixedRunTime, !- Cycling Run Time Control Type + 7200; !- Cycling Run Time {s} + + BranchList, + ZN_1_FLR_1_SEC_1:Sys Air Loop Branches, !- Name + ZN_1_FLR_1_SEC_1:Sys Air Loop Main Branch; !- Branch 1 Name + + Branch, + ZN_1_FLR_1_SEC_1:Sys Air Loop Main Branch, !- Name + , !- Pressure Drop Curve Name + AirLoopHVAC:OutdoorAirSystem, !- Component 1 Object Type + ZN_1_FLR_1_SEC_1:Sys_OA, !- Component 1 Name + ZN_1_FLR_1_SEC_1:Sys Supply Equipment Inlet Node, !- Component 1 Inlet Node Name + ZN_1_FLR_1_SEC_1:Sys_OA-ZN_1_FLR_1_SEC_1:SysCoolCNode, !- Component 1 Outlet Node Name + CoilSystem:Cooling:DX, !- Component 2 Object Type + ZN_1_FLR_1_SEC_1:SysCoolC, !- Component 2 Name + ZN_1_FLR_1_SEC_1:Sys_OA-ZN_1_FLR_1_SEC_1:SysCoolCNode, !- Component 2 Inlet Node Name + ZN_1_FLR_1_SEC_1:SysCoolC-ZN_1_FLR_1_SEC_1:SysHeatCNode, !- Component 2 Outlet Node Name + Coil:Heating:Electric, !- Component 3 Object Type + ZN_1_FLR_1_SEC_1:SysHeatC, !- Component 3 Name + ZN_1_FLR_1_SEC_1:SysCoolC-ZN_1_FLR_1_SEC_1:SysHeatCNode, !- Component 3 Inlet Node Name + ZN_1_FLR_1_SEC_1:SysHeatC-ZN_1_FLR_1_SEC_1:Sys FanNode, !- Component 3 Outlet Node Name + Fan:ConstantVolume, !- Component 4 Object Type + ZN_1_FLR_1_SEC_1:Sys Fan,!- Component 4 Name + ZN_1_FLR_1_SEC_1:SysHeatC-ZN_1_FLR_1_SEC_1:Sys FanNode, !- Component 4 Inlet Node Name + ZN_1_FLR_1_SEC_1:Sys Supply Equipment Outlet Node; !- Component 4 Outlet Node Name + + AirLoopHVAC:ControllerList, + ZN_1_FLR_1_SEC_1:Sys_OAControllers, !- Name + Controller:OutdoorAir, !- Controller 1 Object Type + ControllerZN_1_FLR_1_SEC_1:Sys_OA; !- Controller 1 Name + + AirLoopHVAC:OutdoorAirSystem:EquipmentList, + ZN_1_FLR_1_SEC_1:Sys_OAEquipment, !- Name + OutdoorAir:Mixer, !- Component 1 Object Type + ZN_1_FLR_1_SEC_1:Sys_OAMixing Box; !- Component 1 Name + + AirLoopHVAC:OutdoorAirSystem, + ZN_1_FLR_1_SEC_1:Sys_OA, !- Name + ZN_1_FLR_1_SEC_1:Sys_OAControllers, !- Controller List Name + ZN_1_FLR_1_SEC_1:Sys_OAEquipment, !- Outdoor Air Equipment List Name + ZN_1_FLR_1_SEC_1:Sys Availability Manager List; !- Availability Manager List Name + + OutdoorAir:NodeList, + ZN_1_FLR_1_SEC_1:Sys_OANode List; !- Node or NodeList Name 1 + + NodeList, + ZN_1_FLR_1_SEC_1:Sys_OANode List, !- Name + ZN_1_FLR_1_SEC_1:Sys_OAInlet Node; !- Node 1 Name + + OutdoorAir:Mixer, + ZN_1_FLR_1_SEC_1:Sys_OAMixing Box, !- Name + ZN_1_FLR_1_SEC_1:Sys_OA-ZN_1_FLR_1_SEC_1:SysCoolCNode, !- Mixed Air Node Name + ZN_1_FLR_1_SEC_1:Sys_OAInlet Node, !- Outdoor Air Stream Node Name + ZN_1_FLR_1_SEC_1:Sys_OARelief Node, !- Relief Air Stream Node Name + ZN_1_FLR_1_SEC_1:Sys Supply Equipment Inlet Node; !- Return Air Stream Node Name + + SetpointManager:MixedAir, + ZN_1_FLR_1_SEC_1:Sys_OAMixed Air Temp Manager, !- Name + Temperature, !- Control Variable + ZN_1_FLR_1_SEC_1:Sys Supply Equipment Outlet Node, !- Reference Setpoint Node Name + ZN_1_FLR_1_SEC_1:SysHeatC-ZN_1_FLR_1_SEC_1:Sys FanNode, !- Fan Inlet Node Name + ZN_1_FLR_1_SEC_1:Sys Supply Equipment Outlet Node, !- Fan Outlet Node Name + ZN_1_FLR_1_SEC_1:Sys_OA-ZN_1_FLR_1_SEC_1:SysCoolCNode; !- Setpoint Node or NodeList Name + + Controller:OutdoorAir, + ControllerZN_1_FLR_1_SEC_1:Sys_OA, !- Name + ZN_1_FLR_1_SEC_1:Sys_OARelief Node, !- Relief Air Outlet Node Name + ZN_1_FLR_1_SEC_1:Sys Supply Equipment Inlet Node, !- Return Air Node Name + ZN_1_FLR_1_SEC_1:Sys_OA-ZN_1_FLR_1_SEC_1:SysCoolCNode, !- Mixed Air Node Name + ZN_1_FLR_1_SEC_1:Sys_OAInlet Node, !- Actuator Node Name + AUTOSIZE, !- Minimum Outdoor Air Flow Rate {m3/s} + AUTOSIZE, !- Maximum Outdoor Air Flow Rate {m3/s} + NoEconomizer, !- Economizer Control Type + ModulateFlow, !- Economizer Control Action Type + 19.0, !- Economizer Maximum Limit Dry-Bulb Temperature {C} + 32000.0, !- Economizer Maximum Limit Enthalpy {J/kg} + , !- Economizer Maximum Limit Dewpoint Temperature {C} + , !- Electronic Enthalpy Limit Curve Name + , !- Economizer Minimum Limit Dry-Bulb Temperature {C} + NoLockout, !- Lockout Type + FixedMinimum, !- Minimum Limit Type + MinOA_Sched; !- Minimum Outdoor Air Schedule Name + + CoilSystem:Cooling:DX, + ZN_1_FLR_1_SEC_1:SysCoolC, !- Name + ALWAYS_ON, !- Availability Schedule Name + ZN_1_FLR_1_SEC_1:Sys_OA-ZN_1_FLR_1_SEC_1:SysCoolCNode, !- DX Cooling Coil System Inlet Node Name + ZN_1_FLR_1_SEC_1:SysCoolC-ZN_1_FLR_1_SEC_1:SysHeatCNode, !- DX Cooling Coil System Outlet Node Name + ZN_1_FLR_1_SEC_1:Sys Supply Equipment Outlet Node, !- DX Cooling Coil System Sensor Node Name + Coil:Cooling:DX:SingleSpeed, !- Cooling Coil Object Type + ZN_1_FLR_1_SEC_1:SysCoolC DXCoil; !- Cooling Coil Name + + Coil:Cooling:DX:SingleSpeed, + ZN_1_FLR_1_SEC_1:SysCoolC DXCoil, !- Name + ALWAYS_ON, !- Availability Schedule Name + AUTOSIZE, !- Gross Rated Total Cooling Capacity {W} + AUTOSIZE, !- Gross Rated Sensible Heat Ratio + 2.7835, !- Gross Rated Cooling COP {W/W} + AUTOSIZE, !- Rated Air Flow Rate {m3/s} + , !- Rated Evaporator Fan Power Per Volume Flow Rate {W/(m3/s)} + ZN_1_FLR_1_SEC_1:Sys_OA-ZN_1_FLR_1_SEC_1:SysCoolCNode, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_1:SysCoolC-ZN_1_FLR_1_SEC_1:SysHeatCNode, !- Air Outlet Node Name + ZN_1_FLR_1_SEC_1:SysCoolCCarrier48TM014_12tons_CapFT, !- Total Cooling Capacity Function of Temperature Curve Name + ZN_1_FLR_1_SEC_1:SysCoolCCarrier48TM014_12tons_FFF, !- Total Cooling Capacity Function of Flow Fraction Curve Name + ZN_1_FLR_1_SEC_1:SysCoolCCarrier48TM014_12tons_EIRFT, !- Energy Input Ratio Function of Temperature Curve Name + ZN_1_FLR_1_SEC_1:SysCoolCCarrier48TM014_12tons_EIRFFF, !- Energy Input Ratio Function of Flow Fraction Curve Name + ZN_1_FLR_1_SEC_1:SysCoolCIEA_HVAC_BESTEST_9ton-PLR; !- Part Load Fraction Correlation Curve Name + + Curve:Biquadratic, + ZN_1_FLR_1_SEC_1:SysCoolCCarrier48TM014_12tons_CapFT, !- Name + 1.39072, !- Coefficient1 Constant + -0.0529058, !- Coefficient2 x + 0.0018423, !- Coefficient3 x**2 + 0.00058267, !- Coefficient4 y + -0.000186814, !- Coefficient5 y**2 + 0.000265159, !- Coefficient6 x*y + 16.5556, !- Minimum Value of x + 22.1111, !- Maximum Value of x + 18.0, !- Minimum Value of y + 47.66, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Biquadratic, + ZN_1_FLR_1_SEC_1:SysCoolCCarrier48TM014_12tons_EIRFT, !- Name + -0.536161, !- Coefficient1 Constant + 0.105138, !- Coefficient2 x + -0.00172659, !- Coefficient3 x**2 + 0.0149848, !- Coefficient4 y + 0.000659948, !- Coefficient5 y**2 + -0.0017385, !- Coefficient6 x*y + 16.5556, !- Minimum Value of x + 22.1111, !- Maximum Value of x + 18.0, !- Minimum Value of y + 47.66, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + ZN_1_FLR_1_SEC_1:SysCoolCCarrier48TM014_12tons_FFF, !- Name + 0.718954, !- Coefficient1 Constant + 0.435436, !- Coefficient2 x + -0.154193, !- Coefficient3 x**2 + 0.75, !- Minimum Value of x + 1.25; !- Maximum Value of x + + Curve:Quadratic, + ZN_1_FLR_1_SEC_1:SysCoolCCarrier48TM014_12tons_EIRFFF, !- Name + 1.19525, !- Coefficient1 Constant + -0.306138, !- Coefficient2 x + 0.110973, !- Coefficient3 x**2 + 0.75, !- Minimum Value of x + 1.25; !- Maximum Value of x + + Curve:Quadratic, + ZN_1_FLR_1_SEC_1:SysCoolCIEA_HVAC_BESTEST_9ton-PLR, !- Name + 0.771, !- Coefficient1 Constant + 0.229, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + + OutdoorAir:Node, + ZN_1_FLR_1_SEC_1:SysCoolCOA Ref node; !- Name + + Coil:Heating:Electric, + ZN_1_FLR_1_SEC_1:SysHeatC, !- Name + ALWAYS_ON, !- Availability Schedule Name + 1.0, !- Efficiency + AUTOSIZE, !- Nominal Capacity {W} + ZN_1_FLR_1_SEC_1:SysCoolC-ZN_1_FLR_1_SEC_1:SysHeatCNode, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_1:SysHeatC-ZN_1_FLR_1_SEC_1:Sys FanNode, !- Air Outlet Node Name + ZN_1_FLR_1_SEC_1:Sys Supply Equipment Outlet Node; !- Temperature Setpoint Node Name + + Fan:ConstantVolume, + ZN_1_FLR_1_SEC_1:Sys Fan,!- Name + HVACOperationSchd, !- Availability Schedule Name + 0.55, !- Fan Total Efficiency + 500, !- Pressure Rise {Pa} + AUTOSIZE, !- Maximum Flow Rate {m3/s} + 0.85, !- Motor Efficiency + 1.0, !- Motor In Airstream Fraction + ZN_1_FLR_1_SEC_1:SysHeatC-ZN_1_FLR_1_SEC_1:Sys FanNode, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_1:Sys Supply Equipment Outlet Node; !- Air Outlet Node Name + + AirLoopHVAC:SupplyPath, + ZN_1_FLR_1_SEC_1:Sys, !- Name + ZN_1_FLR_1_SEC_1:Sys Zone Equipment Inlet Node, !- Supply Air Path Inlet Node Name + AirLoopHVAC:ZoneSplitter,!- Component 1 Object Type + ZN_1_FLR_1_SEC_1:Sys Supply Air Splitter; !- Component 1 Name + + AirLoopHVAC:ZoneSplitter, + ZN_1_FLR_1_SEC_1:Sys Supply Air Splitter, !- Name + ZN_1_FLR_1_SEC_1:Sys Zone Equipment Inlet Node, !- Inlet Node Name + ZN_1_FLR_1_SEC_1 Direct Air Inlet Node ATInlet; !- Outlet 1 Node Name + + AirLoopHVAC:ReturnPath, + ZN_1_FLR_1_SEC_1:Sys Return Air Path, !- Name + ZN_1_FLR_1_SEC_1:Sys Zone Equipment Outlet Node, !- Return Air Path Outlet Node Name + AirLoopHVAC:ZoneMixer, !- Component 1 Object Type + ZN_1_FLR_1_SEC_1:Sys Return Air Mixer; !- Component 1 Name + + AirLoopHVAC:ZoneMixer, + ZN_1_FLR_1_SEC_1:Sys Return Air Mixer, !- Name + ZN_1_FLR_1_SEC_1:Sys Zone Equipment Outlet Node, !- Outlet Node Name + ZN_1_FLR_1_SEC_1 Return Air Node; !- Inlet 1 Node Name + +!***** Air Loop: ZN_1_FLR_1_SEC_2:Sys ***** + + AirLoopHVAC, + ZN_1_FLR_1_SEC_2:Sys, !- Name + , !- Controller List Name + ZN_1_FLR_1_SEC_2:Sys Availability Manager List, !- Availability Manager List Name + AUTOSIZE, !- Design Supply Air Flow Rate {m3/s} + ZN_1_FLR_1_SEC_2:Sys Air Loop Branches, !- Branch List Name + , !- Connector List Name + ZN_1_FLR_1_SEC_2:Sys Supply Equipment Inlet Node, !- Supply Side Inlet Node Name + ZN_1_FLR_1_SEC_2:Sys Zone Equipment Outlet Node, !- Demand Side Outlet Node Name + ZN_1_FLR_1_SEC_2:Sys Zone Equipment Inlet Node, !- Demand Side Inlet Node Names + ZN_1_FLR_1_SEC_2:Sys Supply Equipment Outlet Node; !- Supply Side Outlet Node Names + + Sizing:System, + ZN_1_FLR_1_SEC_2:Sys, !- 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 + 7.0, !- Preheat Design Temperature {C} + .008, !- Preheat Design Humidity Ratio {kgWater/kgDryAir} + 11.0, !- Precool Design Temperature {C} + .008, !- Precool Design Humidity Ratio {kgWater/kgDryAir} + 12.8, !- Central Cooling Design Supply Air Temperature {C} + 40.0, !- 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.0085, !- 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.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.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 + + AvailabilityManagerAssignmentList, + ZN_1_FLR_1_SEC_2:Sys Availability Manager List, !- Name + AvailabilityManager:NightCycle, !- Availability Manager 1 Object Type + ZN_1_FLR_1_SEC_2:Sys Availability Manager; !- Availability Manager 1 Name + + AvailabilityManager:NightCycle, + ZN_1_FLR_1_SEC_2:Sys Availability Manager, !- Name + Always_On, !- Applicability Schedule Name + HVACOperationSchd, !- Fan Schedule Name + CycleOnAny, !- Control Type + 1.0, !- Thermostat Tolerance {deltaC} + FixedRunTime, !- Cycling Run Time Control Type + 7200; !- Cycling Run Time {s} + + BranchList, + ZN_1_FLR_1_SEC_2:Sys Air Loop Branches, !- Name + ZN_1_FLR_1_SEC_2:Sys Air Loop Main Branch; !- Branch 1 Name + + Branch, + ZN_1_FLR_1_SEC_2:Sys Air Loop Main Branch, !- Name + , !- Pressure Drop Curve Name + AirLoopHVAC:OutdoorAirSystem, !- Component 1 Object Type + ZN_1_FLR_1_SEC_2:Sys_OA, !- Component 1 Name + ZN_1_FLR_1_SEC_2:Sys Supply Equipment Inlet Node, !- Component 1 Inlet Node Name + ZN_1_FLR_1_SEC_2:Sys_OA-ZN_1_FLR_1_SEC_2:SysCoolCNode, !- Component 1 Outlet Node Name + CoilSystem:Cooling:DX, !- Component 2 Object Type + ZN_1_FLR_1_SEC_2:SysCoolC, !- Component 2 Name + ZN_1_FLR_1_SEC_2:Sys_OA-ZN_1_FLR_1_SEC_2:SysCoolCNode, !- Component 2 Inlet Node Name + ZN_1_FLR_1_SEC_2:SysCoolC-ZN_1_FLR_1_SEC_2:SysHeatCNode, !- Component 2 Outlet Node Name + Coil:Heating:Electric, !- Component 3 Object Type + ZN_1_FLR_1_SEC_2:SysHeatC, !- Component 3 Name + ZN_1_FLR_1_SEC_2:SysCoolC-ZN_1_FLR_1_SEC_2:SysHeatCNode, !- Component 3 Inlet Node Name + ZN_1_FLR_1_SEC_2:SysHeatC-ZN_1_FLR_1_SEC_2:Sys FanNode, !- Component 3 Outlet Node Name + Fan:ConstantVolume, !- Component 4 Object Type + ZN_1_FLR_1_SEC_2:Sys Fan,!- Component 4 Name + ZN_1_FLR_1_SEC_2:SysHeatC-ZN_1_FLR_1_SEC_2:Sys FanNode, !- Component 4 Inlet Node Name + ZN_1_FLR_1_SEC_2:Sys Supply Equipment Outlet Node; !- Component 4 Outlet Node Name + + AirLoopHVAC:ControllerList, + ZN_1_FLR_1_SEC_2:Sys_OAControllers, !- Name + Controller:OutdoorAir, !- Controller 1 Object Type + ControllerZN_1_FLR_1_SEC_2:Sys_OA; !- Controller 1 Name + + AirLoopHVAC:OutdoorAirSystem:EquipmentList, + ZN_1_FLR_1_SEC_2:Sys_OAEquipment, !- Name + OutdoorAir:Mixer, !- Component 1 Object Type + ZN_1_FLR_1_SEC_2:Sys_OAMixing Box; !- Component 1 Name + + AirLoopHVAC:OutdoorAirSystem, + ZN_1_FLR_1_SEC_2:Sys_OA, !- Name + ZN_1_FLR_1_SEC_2:Sys_OAControllers, !- Controller List Name + ZN_1_FLR_1_SEC_2:Sys_OAEquipment, !- Outdoor Air Equipment List Name + ZN_1_FLR_1_SEC_2:Sys Availability Manager List; !- Availability Manager List Name + + OutdoorAir:NodeList, + ZN_1_FLR_1_SEC_2:Sys_OANode List; !- Node or NodeList Name 1 + + NodeList, + ZN_1_FLR_1_SEC_2:Sys_OANode List, !- Name + ZN_1_FLR_1_SEC_2:Sys_OAInlet Node; !- Node 1 Name + + OutdoorAir:Mixer, + ZN_1_FLR_1_SEC_2:Sys_OAMixing Box, !- Name + ZN_1_FLR_1_SEC_2:Sys_OA-ZN_1_FLR_1_SEC_2:SysCoolCNode, !- Mixed Air Node Name + ZN_1_FLR_1_SEC_2:Sys_OAInlet Node, !- Outdoor Air Stream Node Name + ZN_1_FLR_1_SEC_2:Sys_OARelief Node, !- Relief Air Stream Node Name + ZN_1_FLR_1_SEC_2:Sys Supply Equipment Inlet Node; !- Return Air Stream Node Name + + SetpointManager:MixedAir, + ZN_1_FLR_1_SEC_2:Sys_OAMixed Air Temp Manager, !- Name + Temperature, !- Control Variable + ZN_1_FLR_1_SEC_2:Sys Supply Equipment Outlet Node, !- Reference Setpoint Node Name + ZN_1_FLR_1_SEC_2:SysHeatC-ZN_1_FLR_1_SEC_2:Sys FanNode, !- Fan Inlet Node Name + ZN_1_FLR_1_SEC_2:Sys Supply Equipment Outlet Node, !- Fan Outlet Node Name + ZN_1_FLR_1_SEC_2:Sys_OA-ZN_1_FLR_1_SEC_2:SysCoolCNode; !- Setpoint Node or NodeList Name + + Controller:OutdoorAir, + ControllerZN_1_FLR_1_SEC_2:Sys_OA, !- Name + ZN_1_FLR_1_SEC_2:Sys_OARelief Node, !- Relief Air Outlet Node Name + ZN_1_FLR_1_SEC_2:Sys Supply Equipment Inlet Node, !- Return Air Node Name + ZN_1_FLR_1_SEC_2:Sys_OA-ZN_1_FLR_1_SEC_2:SysCoolCNode, !- Mixed Air Node Name + ZN_1_FLR_1_SEC_2:Sys_OAInlet Node, !- Actuator Node Name + AUTOSIZE, !- Minimum Outdoor Air Flow Rate {m3/s} + AUTOSIZE, !- Maximum Outdoor Air Flow Rate {m3/s} + NoEconomizer, !- Economizer Control Type + ModulateFlow, !- Economizer Control Action Type + 19.0, !- Economizer Maximum Limit Dry-Bulb Temperature {C} + 32000.0, !- Economizer Maximum Limit Enthalpy {J/kg} + , !- Economizer Maximum Limit Dewpoint Temperature {C} + , !- Electronic Enthalpy Limit Curve Name + , !- Economizer Minimum Limit Dry-Bulb Temperature {C} + NoLockout, !- Lockout Type + FixedMinimum, !- Minimum Limit Type + MinOA_Sched; !- Minimum Outdoor Air Schedule Name + + CoilSystem:Cooling:DX, + ZN_1_FLR_1_SEC_2:SysCoolC, !- Name + ALWAYS_ON, !- Availability Schedule Name + ZN_1_FLR_1_SEC_2:Sys_OA-ZN_1_FLR_1_SEC_2:SysCoolCNode, !- DX Cooling Coil System Inlet Node Name + ZN_1_FLR_1_SEC_2:SysCoolC-ZN_1_FLR_1_SEC_2:SysHeatCNode, !- DX Cooling Coil System Outlet Node Name + ZN_1_FLR_1_SEC_2:Sys Supply Equipment Outlet Node, !- DX Cooling Coil System Sensor Node Name + Coil:Cooling:DX:SingleSpeed, !- Cooling Coil Object Type + ZN_1_FLR_1_SEC_2:SysCoolC DXCoil; !- Cooling Coil Name + + Coil:Cooling:DX:SingleSpeed, + ZN_1_FLR_1_SEC_2:SysCoolC DXCoil, !- Name + ALWAYS_ON, !- Availability Schedule Name + AUTOSIZE, !- Gross Rated Total Cooling Capacity {W} + AUTOSIZE, !- Gross Rated Sensible Heat Ratio + 2.7835, !- Gross Rated Cooling COP {W/W} + AUTOSIZE, !- Rated Air Flow Rate {m3/s} + , !- Rated Evaporator Fan Power Per Volume Flow Rate {W/(m3/s)} + ZN_1_FLR_1_SEC_2:Sys_OA-ZN_1_FLR_1_SEC_2:SysCoolCNode, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_2:SysCoolC-ZN_1_FLR_1_SEC_2:SysHeatCNode, !- Air Outlet Node Name + ZN_1_FLR_1_SEC_2:SysCoolCCarrier48TM014_12tons_CapFT, !- Total Cooling Capacity Function of Temperature Curve Name + ZN_1_FLR_1_SEC_2:SysCoolCCarrier48TM014_12tons_FFF, !- Total Cooling Capacity Function of Flow Fraction Curve Name + ZN_1_FLR_1_SEC_2:SysCoolCCarrier48TM014_12tons_EIRFT, !- Energy Input Ratio Function of Temperature Curve Name + ZN_1_FLR_1_SEC_2:SysCoolCCarrier48TM014_12tons_EIRFFF, !- Energy Input Ratio Function of Flow Fraction Curve Name + ZN_1_FLR_1_SEC_2:SysCoolCIEA_HVAC_BESTEST_9ton-PLR; !- Part Load Fraction Correlation Curve Name + + Curve:Biquadratic, + ZN_1_FLR_1_SEC_2:SysCoolCCarrier48TM014_12tons_CapFT, !- Name + 1.39072, !- Coefficient1 Constant + -0.0529058, !- Coefficient2 x + 0.0018423, !- Coefficient3 x**2 + 0.00058267, !- Coefficient4 y + -0.000186814, !- Coefficient5 y**2 + 0.000265159, !- Coefficient6 x*y + 16.5556, !- Minimum Value of x + 22.1111, !- Maximum Value of x + 18.0, !- Minimum Value of y + 47.66, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Biquadratic, + ZN_1_FLR_1_SEC_2:SysCoolCCarrier48TM014_12tons_EIRFT, !- Name + -0.536161, !- Coefficient1 Constant + 0.105138, !- Coefficient2 x + -0.00172659, !- Coefficient3 x**2 + 0.0149848, !- Coefficient4 y + 0.000659948, !- Coefficient5 y**2 + -0.0017385, !- Coefficient6 x*y + 16.5556, !- Minimum Value of x + 22.1111, !- Maximum Value of x + 18.0, !- Minimum Value of y + 47.66, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + ZN_1_FLR_1_SEC_2:SysCoolCCarrier48TM014_12tons_FFF, !- Name + 0.718954, !- Coefficient1 Constant + 0.435436, !- Coefficient2 x + -0.154193, !- Coefficient3 x**2 + 0.75, !- Minimum Value of x + 1.25; !- Maximum Value of x + + Curve:Quadratic, + ZN_1_FLR_1_SEC_2:SysCoolCCarrier48TM014_12tons_EIRFFF, !- Name + 1.19525, !- Coefficient1 Constant + -0.306138, !- Coefficient2 x + 0.110973, !- Coefficient3 x**2 + 0.75, !- Minimum Value of x + 1.25; !- Maximum Value of x + + Curve:Quadratic, + ZN_1_FLR_1_SEC_2:SysCoolCIEA_HVAC_BESTEST_9ton-PLR, !- Name + 0.771, !- Coefficient1 Constant + 0.229, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + + OutdoorAir:Node, + ZN_1_FLR_1_SEC_2:SysCoolCOA Ref node; !- Name + + Coil:Heating:Electric, + ZN_1_FLR_1_SEC_2:SysHeatC, !- Name + ALWAYS_ON, !- Availability Schedule Name + 1.0, !- Efficiency + AUTOSIZE, !- Nominal Capacity {W} + ZN_1_FLR_1_SEC_2:SysCoolC-ZN_1_FLR_1_SEC_2:SysHeatCNode, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_2:SysHeatC-ZN_1_FLR_1_SEC_2:Sys FanNode, !- Air Outlet Node Name + ZN_1_FLR_1_SEC_2:Sys Supply Equipment Outlet Node; !- Temperature Setpoint Node Name + + Fan:ConstantVolume, + ZN_1_FLR_1_SEC_2:Sys Fan,!- Name + HVACOperationSchd, !- Availability Schedule Name + 0.55, !- Fan Total Efficiency + 500, !- Pressure Rise {Pa} + AUTOSIZE, !- Maximum Flow Rate {m3/s} + 0.85, !- Motor Efficiency + 1.0, !- Motor In Airstream Fraction + ZN_1_FLR_1_SEC_2:SysHeatC-ZN_1_FLR_1_SEC_2:Sys FanNode, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_2:Sys Supply Equipment Outlet Node; !- Air Outlet Node Name + + AirLoopHVAC:SupplyPath, + ZN_1_FLR_1_SEC_2:Sys, !- Name + ZN_1_FLR_1_SEC_2:Sys Zone Equipment Inlet Node, !- Supply Air Path Inlet Node Name + AirLoopHVAC:ZoneSplitter,!- Component 1 Object Type + ZN_1_FLR_1_SEC_2:Sys Supply Air Splitter; !- Component 1 Name + + AirLoopHVAC:ZoneSplitter, + ZN_1_FLR_1_SEC_2:Sys Supply Air Splitter, !- Name + ZN_1_FLR_1_SEC_2:Sys Zone Equipment Inlet Node, !- Inlet Node Name + ZN_1_FLR_1_SEC_2 Direct Air Inlet Node ATInlet; !- Outlet 1 Node Name + + AirLoopHVAC:ReturnPath, + ZN_1_FLR_1_SEC_2:Sys Return Air Path, !- Name + ZN_1_FLR_1_SEC_2:Sys Zone Equipment Outlet Node, !- Return Air Path Outlet Node Name + AirLoopHVAC:ZoneMixer, !- Component 1 Object Type + ZN_1_FLR_1_SEC_2:Sys Return Air Mixer; !- Component 1 Name + + AirLoopHVAC:ZoneMixer, + ZN_1_FLR_1_SEC_2:Sys Return Air Mixer, !- Name + ZN_1_FLR_1_SEC_2:Sys Zone Equipment Outlet Node, !- Outlet Node Name + ZN_1_FLR_1_SEC_2 Return Air Node; !- Inlet 1 Node Name + +!***** Air Loop: ZN_1_FLR_1_SEC_3:Sys ***** + + AirLoopHVAC, + ZN_1_FLR_1_SEC_3:Sys, !- Name + , !- Controller List Name + ZN_1_FLR_1_SEC_3:Sys Availability Manager List, !- Availability Manager List Name + AUTOSIZE, !- Design Supply Air Flow Rate {m3/s} + ZN_1_FLR_1_SEC_3:Sys Air Loop Branches, !- Branch List Name + , !- Connector List Name + ZN_1_FLR_1_SEC_3:Sys Supply Equipment Inlet Node, !- Supply Side Inlet Node Name + ZN_1_FLR_1_SEC_3:Sys Zone Equipment Outlet Node, !- Demand Side Outlet Node Name + ZN_1_FLR_1_SEC_3:Sys Zone Equipment Inlet Node, !- Demand Side Inlet Node Names + ZN_1_FLR_1_SEC_3:Sys Supply Equipment Outlet Node; !- Supply Side Outlet Node Names + + Sizing:System, + ZN_1_FLR_1_SEC_3:Sys, !- 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 + 7.0, !- Preheat Design Temperature {C} + .008, !- Preheat Design Humidity Ratio {kgWater/kgDryAir} + 11.0, !- Precool Design Temperature {C} + .008, !- Precool Design Humidity Ratio {kgWater/kgDryAir} + 12.8, !- Central Cooling Design Supply Air Temperature {C} + 40.0, !- 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.0085, !- 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.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.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 + + AvailabilityManagerAssignmentList, + ZN_1_FLR_1_SEC_3:Sys Availability Manager List, !- Name + AvailabilityManager:NightCycle, !- Availability Manager 1 Object Type + ZN_1_FLR_1_SEC_3:Sys Availability Manager; !- Availability Manager 1 Name + + AvailabilityManager:NightCycle, + ZN_1_FLR_1_SEC_3:Sys Availability Manager, !- Name + Always_On, !- Applicability Schedule Name + HVACOperationSchd, !- Fan Schedule Name + CycleOnAny, !- Control Type + 1.0, !- Thermostat Tolerance {deltaC} + FixedRunTime, !- Cycling Run Time Control Type + 7200; !- Cycling Run Time {s} + + BranchList, + ZN_1_FLR_1_SEC_3:Sys Air Loop Branches, !- Name + ZN_1_FLR_1_SEC_3:Sys Air Loop Main Branch; !- Branch 1 Name + + Branch, + ZN_1_FLR_1_SEC_3:Sys Air Loop Main Branch, !- Name + , !- Pressure Drop Curve Name + AirLoopHVAC:OutdoorAirSystem, !- Component 1 Object Type + ZN_1_FLR_1_SEC_3:Sys_OA, !- Component 1 Name + ZN_1_FLR_1_SEC_3:Sys Supply Equipment Inlet Node, !- Component 1 Inlet Node Name + ZN_1_FLR_1_SEC_3:Sys_OA-ZN_1_FLR_1_SEC_3:SysCoolCNode, !- Component 1 Outlet Node Name + CoilSystem:Cooling:DX, !- Component 2 Object Type + ZN_1_FLR_1_SEC_3:SysCoolC, !- Component 2 Name + ZN_1_FLR_1_SEC_3:Sys_OA-ZN_1_FLR_1_SEC_3:SysCoolCNode, !- Component 2 Inlet Node Name + ZN_1_FLR_1_SEC_3:SysCoolC-ZN_1_FLR_1_SEC_3:SysHeatCNode, !- Component 2 Outlet Node Name + Coil:Heating:Electric, !- Component 3 Object Type + ZN_1_FLR_1_SEC_3:SysHeatC, !- Component 3 Name + ZN_1_FLR_1_SEC_3:SysCoolC-ZN_1_FLR_1_SEC_3:SysHeatCNode, !- Component 3 Inlet Node Name + ZN_1_FLR_1_SEC_3:SysHeatC-ZN_1_FLR_1_SEC_3:Sys FanNode, !- Component 3 Outlet Node Name + Fan:ConstantVolume, !- Component 4 Object Type + ZN_1_FLR_1_SEC_3:Sys Fan,!- Component 4 Name + ZN_1_FLR_1_SEC_3:SysHeatC-ZN_1_FLR_1_SEC_3:Sys FanNode, !- Component 4 Inlet Node Name + ZN_1_FLR_1_SEC_3:Sys Supply Equipment Outlet Node; !- Component 4 Outlet Node Name + + AirLoopHVAC:ControllerList, + ZN_1_FLR_1_SEC_3:Sys_OAControllers, !- Name + Controller:OutdoorAir, !- Controller 1 Object Type + ControllerZN_1_FLR_1_SEC_3:Sys_OA; !- Controller 1 Name + + AirLoopHVAC:OutdoorAirSystem:EquipmentList, + ZN_1_FLR_1_SEC_3:Sys_OAEquipment, !- Name + OutdoorAir:Mixer, !- Component 1 Object Type + ZN_1_FLR_1_SEC_3:Sys_OAMixing Box; !- Component 1 Name + + AirLoopHVAC:OutdoorAirSystem, + ZN_1_FLR_1_SEC_3:Sys_OA, !- Name + ZN_1_FLR_1_SEC_3:Sys_OAControllers, !- Controller List Name + ZN_1_FLR_1_SEC_3:Sys_OAEquipment, !- Outdoor Air Equipment List Name + ZN_1_FLR_1_SEC_3:Sys Availability Manager List; !- Availability Manager List Name + + OutdoorAir:NodeList, + ZN_1_FLR_1_SEC_3:Sys_OANode List; !- Node or NodeList Name 1 + + NodeList, + ZN_1_FLR_1_SEC_3:Sys_OANode List, !- Name + ZN_1_FLR_1_SEC_3:Sys_OAInlet Node; !- Node 1 Name + + OutdoorAir:Mixer, + ZN_1_FLR_1_SEC_3:Sys_OAMixing Box, !- Name + ZN_1_FLR_1_SEC_3:Sys_OA-ZN_1_FLR_1_SEC_3:SysCoolCNode, !- Mixed Air Node Name + ZN_1_FLR_1_SEC_3:Sys_OAInlet Node, !- Outdoor Air Stream Node Name + ZN_1_FLR_1_SEC_3:Sys_OARelief Node, !- Relief Air Stream Node Name + ZN_1_FLR_1_SEC_3:Sys Supply Equipment Inlet Node; !- Return Air Stream Node Name + + SetpointManager:MixedAir, + ZN_1_FLR_1_SEC_3:Sys_OAMixed Air Temp Manager, !- Name + Temperature, !- Control Variable + ZN_1_FLR_1_SEC_3:Sys Supply Equipment Outlet Node, !- Reference Setpoint Node Name + ZN_1_FLR_1_SEC_3:SysHeatC-ZN_1_FLR_1_SEC_3:Sys FanNode, !- Fan Inlet Node Name + ZN_1_FLR_1_SEC_3:Sys Supply Equipment Outlet Node, !- Fan Outlet Node Name + ZN_1_FLR_1_SEC_3:Sys_OA-ZN_1_FLR_1_SEC_3:SysCoolCNode; !- Setpoint Node or NodeList Name + + Controller:OutdoorAir, + ControllerZN_1_FLR_1_SEC_3:Sys_OA, !- Name + ZN_1_FLR_1_SEC_3:Sys_OARelief Node, !- Relief Air Outlet Node Name + ZN_1_FLR_1_SEC_3:Sys Supply Equipment Inlet Node, !- Return Air Node Name + ZN_1_FLR_1_SEC_3:Sys_OA-ZN_1_FLR_1_SEC_3:SysCoolCNode, !- Mixed Air Node Name + ZN_1_FLR_1_SEC_3:Sys_OAInlet Node, !- Actuator Node Name + AUTOSIZE, !- Minimum Outdoor Air Flow Rate {m3/s} + AUTOSIZE, !- Maximum Outdoor Air Flow Rate {m3/s} + NoEconomizer, !- Economizer Control Type + ModulateFlow, !- Economizer Control Action Type + 19.0, !- Economizer Maximum Limit Dry-Bulb Temperature {C} + 32000.0, !- Economizer Maximum Limit Enthalpy {J/kg} + , !- Economizer Maximum Limit Dewpoint Temperature {C} + , !- Electronic Enthalpy Limit Curve Name + , !- Economizer Minimum Limit Dry-Bulb Temperature {C} + NoLockout, !- Lockout Type + FixedMinimum, !- Minimum Limit Type + MinOA_Sched; !- Minimum Outdoor Air Schedule Name + + CoilSystem:Cooling:DX, + ZN_1_FLR_1_SEC_3:SysCoolC, !- Name + ALWAYS_ON, !- Availability Schedule Name + ZN_1_FLR_1_SEC_3:Sys_OA-ZN_1_FLR_1_SEC_3:SysCoolCNode, !- DX Cooling Coil System Inlet Node Name + ZN_1_FLR_1_SEC_3:SysCoolC-ZN_1_FLR_1_SEC_3:SysHeatCNode, !- DX Cooling Coil System Outlet Node Name + ZN_1_FLR_1_SEC_3:Sys Supply Equipment Outlet Node, !- DX Cooling Coil System Sensor Node Name + Coil:Cooling:DX:SingleSpeed, !- Cooling Coil Object Type + ZN_1_FLR_1_SEC_3:SysCoolC DXCoil; !- Cooling Coil Name + + Coil:Cooling:DX:SingleSpeed, + ZN_1_FLR_1_SEC_3:SysCoolC DXCoil, !- Name + ALWAYS_ON, !- Availability Schedule Name + AUTOSIZE, !- Gross Rated Total Cooling Capacity {W} + AUTOSIZE, !- Gross Rated Sensible Heat Ratio + 2.7835, !- Gross Rated Cooling COP {W/W} + AUTOSIZE, !- Rated Air Flow Rate {m3/s} + , !- Rated Evaporator Fan Power Per Volume Flow Rate {W/(m3/s)} + ZN_1_FLR_1_SEC_3:Sys_OA-ZN_1_FLR_1_SEC_3:SysCoolCNode, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_3:SysCoolC-ZN_1_FLR_1_SEC_3:SysHeatCNode, !- Air Outlet Node Name + ZN_1_FLR_1_SEC_3:SysCoolCCarrier48TM014_12tons_CapFT, !- Total Cooling Capacity Function of Temperature Curve Name + ZN_1_FLR_1_SEC_3:SysCoolCCarrier48TM014_12tons_FFF, !- Total Cooling Capacity Function of Flow Fraction Curve Name + ZN_1_FLR_1_SEC_3:SysCoolCCarrier48TM014_12tons_EIRFT, !- Energy Input Ratio Function of Temperature Curve Name + ZN_1_FLR_1_SEC_3:SysCoolCCarrier48TM014_12tons_EIRFFF, !- Energy Input Ratio Function of Flow Fraction Curve Name + ZN_1_FLR_1_SEC_3:SysCoolCIEA_HVAC_BESTEST_9ton-PLR; !- Part Load Fraction Correlation Curve Name + + Curve:Biquadratic, + ZN_1_FLR_1_SEC_3:SysCoolCCarrier48TM014_12tons_CapFT, !- Name + 1.39072, !- Coefficient1 Constant + -0.0529058, !- Coefficient2 x + 0.0018423, !- Coefficient3 x**2 + 0.00058267, !- Coefficient4 y + -0.000186814, !- Coefficient5 y**2 + 0.000265159, !- Coefficient6 x*y + 16.5556, !- Minimum Value of x + 22.1111, !- Maximum Value of x + 18.0, !- Minimum Value of y + 47.66, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Biquadratic, + ZN_1_FLR_1_SEC_3:SysCoolCCarrier48TM014_12tons_EIRFT, !- Name + -0.536161, !- Coefficient1 Constant + 0.105138, !- Coefficient2 x + -0.00172659, !- Coefficient3 x**2 + 0.0149848, !- Coefficient4 y + 0.000659948, !- Coefficient5 y**2 + -0.0017385, !- Coefficient6 x*y + 16.5556, !- Minimum Value of x + 22.1111, !- Maximum Value of x + 18.0, !- Minimum Value of y + 47.66, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + ZN_1_FLR_1_SEC_3:SysCoolCCarrier48TM014_12tons_FFF, !- Name + 0.718954, !- Coefficient1 Constant + 0.435436, !- Coefficient2 x + -0.154193, !- Coefficient3 x**2 + 0.75, !- Minimum Value of x + 1.25; !- Maximum Value of x + + Curve:Quadratic, + ZN_1_FLR_1_SEC_3:SysCoolCCarrier48TM014_12tons_EIRFFF, !- Name + 1.19525, !- Coefficient1 Constant + -0.306138, !- Coefficient2 x + 0.110973, !- Coefficient3 x**2 + 0.75, !- Minimum Value of x + 1.25; !- Maximum Value of x + + Curve:Quadratic, + ZN_1_FLR_1_SEC_3:SysCoolCIEA_HVAC_BESTEST_9ton-PLR, !- Name + 0.771, !- Coefficient1 Constant + 0.229, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + + OutdoorAir:Node, + ZN_1_FLR_1_SEC_3:SysCoolCOA Ref node; !- Name + + Coil:Heating:Electric, + ZN_1_FLR_1_SEC_3:SysHeatC, !- Name + ALWAYS_ON, !- Availability Schedule Name + 1.0, !- Efficiency + AUTOSIZE, !- Nominal Capacity {W} + ZN_1_FLR_1_SEC_3:SysCoolC-ZN_1_FLR_1_SEC_3:SysHeatCNode, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_3:SysHeatC-ZN_1_FLR_1_SEC_3:Sys FanNode, !- Air Outlet Node Name + ZN_1_FLR_1_SEC_3:Sys Supply Equipment Outlet Node; !- Temperature Setpoint Node Name + + Fan:ConstantVolume, + ZN_1_FLR_1_SEC_3:Sys Fan,!- Name + HVACOperationSchd, !- Availability Schedule Name + 0.55, !- Fan Total Efficiency + 500, !- Pressure Rise {Pa} + AUTOSIZE, !- Maximum Flow Rate {m3/s} + 0.85, !- Motor Efficiency + 1.0, !- Motor In Airstream Fraction + ZN_1_FLR_1_SEC_3:SysHeatC-ZN_1_FLR_1_SEC_3:Sys FanNode, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_3:Sys Supply Equipment Outlet Node; !- Air Outlet Node Name + + AirLoopHVAC:SupplyPath, + ZN_1_FLR_1_SEC_3:Sys, !- Name + ZN_1_FLR_1_SEC_3:Sys Zone Equipment Inlet Node, !- Supply Air Path Inlet Node Name + AirLoopHVAC:ZoneSplitter,!- Component 1 Object Type + ZN_1_FLR_1_SEC_3:Sys Supply Air Splitter; !- Component 1 Name + + AirLoopHVAC:ZoneSplitter, + ZN_1_FLR_1_SEC_3:Sys Supply Air Splitter, !- Name + ZN_1_FLR_1_SEC_3:Sys Zone Equipment Inlet Node, !- Inlet Node Name + ZN_1_FLR_1_SEC_3 Direct Air Inlet Node ATInlet; !- Outlet 1 Node Name + + AirLoopHVAC:ReturnPath, + ZN_1_FLR_1_SEC_3:Sys Return Air Path, !- Name + ZN_1_FLR_1_SEC_3:Sys Zone Equipment Outlet Node, !- Return Air Path Outlet Node Name + AirLoopHVAC:ZoneMixer, !- Component 1 Object Type + ZN_1_FLR_1_SEC_3:Sys Return Air Mixer; !- Component 1 Name + + AirLoopHVAC:ZoneMixer, + ZN_1_FLR_1_SEC_3:Sys Return Air Mixer, !- Name + ZN_1_FLR_1_SEC_3:Sys Zone Equipment Outlet Node, !- Outlet Node Name + ZN_1_FLR_1_SEC_3 Return Air Node; !- Inlet 1 Node Name + +!***** Air Loop: ZN_1_FLR_1_SEC_4:Sys ***** + + AirLoopHVAC, + ZN_1_FLR_1_SEC_4:Sys, !- Name + , !- Controller List Name + ZN_1_FLR_1_SEC_4:Sys Availability Manager List, !- Availability Manager List Name + AUTOSIZE, !- Design Supply Air Flow Rate {m3/s} + ZN_1_FLR_1_SEC_4:Sys Air Loop Branches, !- Branch List Name + , !- Connector List Name + ZN_1_FLR_1_SEC_4:Sys Supply Equipment Inlet Node, !- Supply Side Inlet Node Name + ZN_1_FLR_1_SEC_4:Sys Zone Equipment Outlet Node, !- Demand Side Outlet Node Name + ZN_1_FLR_1_SEC_4:Sys Zone Equipment Inlet Node, !- Demand Side Inlet Node Names + ZN_1_FLR_1_SEC_4:Sys Supply Equipment Outlet Node; !- Supply Side Outlet Node Names + + Sizing:System, + ZN_1_FLR_1_SEC_4:Sys, !- 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 + 7.0, !- Preheat Design Temperature {C} + .008, !- Preheat Design Humidity Ratio {kgWater/kgDryAir} + 11.0, !- Precool Design Temperature {C} + .008, !- Precool Design Humidity Ratio {kgWater/kgDryAir} + 12.8, !- Central Cooling Design Supply Air Temperature {C} + 40.0, !- 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.0085, !- 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.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.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 + + AvailabilityManagerAssignmentList, + ZN_1_FLR_1_SEC_4:Sys Availability Manager List, !- Name + AvailabilityManager:NightCycle, !- Availability Manager 1 Object Type + ZN_1_FLR_1_SEC_4:Sys Availability Manager; !- Availability Manager 1 Name + + AvailabilityManager:NightCycle, + ZN_1_FLR_1_SEC_4:Sys Availability Manager, !- Name + Always_On, !- Applicability Schedule Name + HVACOperationSchd, !- Fan Schedule Name + CycleOnAny, !- Control Type + 1.0, !- Thermostat Tolerance {deltaC} + FixedRunTime, !- Cycling Run Time Control Type + 7200; !- Cycling Run Time {s} + + BranchList, + ZN_1_FLR_1_SEC_4:Sys Air Loop Branches, !- Name + ZN_1_FLR_1_SEC_4:Sys Air Loop Main Branch; !- Branch 1 Name + + Branch, + ZN_1_FLR_1_SEC_4:Sys Air Loop Main Branch, !- Name + , !- Pressure Drop Curve Name + AirLoopHVAC:OutdoorAirSystem, !- Component 1 Object Type + ZN_1_FLR_1_SEC_4:Sys_OA, !- Component 1 Name + ZN_1_FLR_1_SEC_4:Sys Supply Equipment Inlet Node, !- Component 1 Inlet Node Name + ZN_1_FLR_1_SEC_4:Sys_OA-ZN_1_FLR_1_SEC_4:SysCoolCNode, !- Component 1 Outlet Node Name + CoilSystem:Cooling:DX, !- Component 2 Object Type + ZN_1_FLR_1_SEC_4:SysCoolC, !- Component 2 Name + ZN_1_FLR_1_SEC_4:Sys_OA-ZN_1_FLR_1_SEC_4:SysCoolCNode, !- Component 2 Inlet Node Name + ZN_1_FLR_1_SEC_4:SysCoolC-ZN_1_FLR_1_SEC_4:SysHeatCNode, !- Component 2 Outlet Node Name + Coil:Heating:Electric, !- Component 3 Object Type + ZN_1_FLR_1_SEC_4:SysHeatC, !- Component 3 Name + ZN_1_FLR_1_SEC_4:SysCoolC-ZN_1_FLR_1_SEC_4:SysHeatCNode, !- Component 3 Inlet Node Name + ZN_1_FLR_1_SEC_4:SysHeatC-ZN_1_FLR_1_SEC_4:Sys FanNode, !- Component 3 Outlet Node Name + Fan:ConstantVolume, !- Component 4 Object Type + ZN_1_FLR_1_SEC_4:Sys Fan,!- Component 4 Name + ZN_1_FLR_1_SEC_4:SysHeatC-ZN_1_FLR_1_SEC_4:Sys FanNode, !- Component 4 Inlet Node Name + ZN_1_FLR_1_SEC_4:Sys Supply Equipment Outlet Node; !- Component 4 Outlet Node Name + + AirLoopHVAC:ControllerList, + ZN_1_FLR_1_SEC_4:Sys_OAControllers, !- Name + Controller:OutdoorAir, !- Controller 1 Object Type + ControllerZN_1_FLR_1_SEC_4:Sys_OA; !- Controller 1 Name + + AirLoopHVAC:OutdoorAirSystem:EquipmentList, + ZN_1_FLR_1_SEC_4:Sys_OAEquipment, !- Name + OutdoorAir:Mixer, !- Component 1 Object Type + ZN_1_FLR_1_SEC_4:Sys_OAMixing Box; !- Component 1 Name + + AirLoopHVAC:OutdoorAirSystem, + ZN_1_FLR_1_SEC_4:Sys_OA, !- Name + ZN_1_FLR_1_SEC_4:Sys_OAControllers, !- Controller List Name + ZN_1_FLR_1_SEC_4:Sys_OAEquipment, !- Outdoor Air Equipment List Name + ZN_1_FLR_1_SEC_4:Sys Availability Manager List; !- Availability Manager List Name + + OutdoorAir:NodeList, + ZN_1_FLR_1_SEC_4:Sys_OANode List; !- Node or NodeList Name 1 + + NodeList, + ZN_1_FLR_1_SEC_4:Sys_OANode List, !- Name + ZN_1_FLR_1_SEC_4:Sys_OAInlet Node; !- Node 1 Name + + OutdoorAir:Mixer, + ZN_1_FLR_1_SEC_4:Sys_OAMixing Box, !- Name + ZN_1_FLR_1_SEC_4:Sys_OA-ZN_1_FLR_1_SEC_4:SysCoolCNode, !- Mixed Air Node Name + ZN_1_FLR_1_SEC_4:Sys_OAInlet Node, !- Outdoor Air Stream Node Name + ZN_1_FLR_1_SEC_4:Sys_OARelief Node, !- Relief Air Stream Node Name + ZN_1_FLR_1_SEC_4:Sys Supply Equipment Inlet Node; !- Return Air Stream Node Name + + SetpointManager:MixedAir, + ZN_1_FLR_1_SEC_4:Sys_OAMixed Air Temp Manager, !- Name + Temperature, !- Control Variable + ZN_1_FLR_1_SEC_4:Sys Supply Equipment Outlet Node, !- Reference Setpoint Node Name + ZN_1_FLR_1_SEC_4:SysHeatC-ZN_1_FLR_1_SEC_4:Sys FanNode, !- Fan Inlet Node Name + ZN_1_FLR_1_SEC_4:Sys Supply Equipment Outlet Node, !- Fan Outlet Node Name + ZN_1_FLR_1_SEC_4:Sys_OA-ZN_1_FLR_1_SEC_4:SysCoolCNode; !- Setpoint Node or NodeList Name + + Controller:OutdoorAir, + ControllerZN_1_FLR_1_SEC_4:Sys_OA, !- Name + ZN_1_FLR_1_SEC_4:Sys_OARelief Node, !- Relief Air Outlet Node Name + ZN_1_FLR_1_SEC_4:Sys Supply Equipment Inlet Node, !- Return Air Node Name + ZN_1_FLR_1_SEC_4:Sys_OA-ZN_1_FLR_1_SEC_4:SysCoolCNode, !- Mixed Air Node Name + ZN_1_FLR_1_SEC_4:Sys_OAInlet Node, !- Actuator Node Name + AUTOSIZE, !- Minimum Outdoor Air Flow Rate {m3/s} + AUTOSIZE, !- Maximum Outdoor Air Flow Rate {m3/s} + NoEconomizer, !- Economizer Control Type + ModulateFlow, !- Economizer Control Action Type + 19.0, !- Economizer Maximum Limit Dry-Bulb Temperature {C} + 32000.0, !- Economizer Maximum Limit Enthalpy {J/kg} + , !- Economizer Maximum Limit Dewpoint Temperature {C} + , !- Electronic Enthalpy Limit Curve Name + , !- Economizer Minimum Limit Dry-Bulb Temperature {C} + NoLockout, !- Lockout Type + FixedMinimum, !- Minimum Limit Type + MinOA_Sched; !- Minimum Outdoor Air Schedule Name + + CoilSystem:Cooling:DX, + ZN_1_FLR_1_SEC_4:SysCoolC, !- Name + ALWAYS_ON, !- Availability Schedule Name + ZN_1_FLR_1_SEC_4:Sys_OA-ZN_1_FLR_1_SEC_4:SysCoolCNode, !- DX Cooling Coil System Inlet Node Name + ZN_1_FLR_1_SEC_4:SysCoolC-ZN_1_FLR_1_SEC_4:SysHeatCNode, !- DX Cooling Coil System Outlet Node Name + ZN_1_FLR_1_SEC_4:Sys Supply Equipment Outlet Node, !- DX Cooling Coil System Sensor Node Name + Coil:Cooling:DX:SingleSpeed, !- Cooling Coil Object Type + ZN_1_FLR_1_SEC_4:SysCoolC DXCoil; !- Cooling Coil Name + + Coil:Cooling:DX:SingleSpeed, + ZN_1_FLR_1_SEC_4:SysCoolC DXCoil, !- Name + ALWAYS_ON, !- Availability Schedule Name + AUTOSIZE, !- Gross Rated Total Cooling Capacity {W} + AUTOSIZE, !- Gross Rated Sensible Heat Ratio + 2.7835, !- Gross Rated Cooling COP {W/W} + AUTOSIZE, !- Rated Air Flow Rate {m3/s} + , !- Rated Evaporator Fan Power Per Volume Flow Rate {W/(m3/s)} + ZN_1_FLR_1_SEC_4:Sys_OA-ZN_1_FLR_1_SEC_4:SysCoolCNode, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_4:SysCoolC-ZN_1_FLR_1_SEC_4:SysHeatCNode, !- Air Outlet Node Name + ZN_1_FLR_1_SEC_4:SysCoolCCarrier48TM014_12tons_CapFT, !- Total Cooling Capacity Function of Temperature Curve Name + ZN_1_FLR_1_SEC_4:SysCoolCCarrier48TM014_12tons_FFF, !- Total Cooling Capacity Function of Flow Fraction Curve Name + ZN_1_FLR_1_SEC_4:SysCoolCCarrier48TM014_12tons_EIRFT, !- Energy Input Ratio Function of Temperature Curve Name + ZN_1_FLR_1_SEC_4:SysCoolCCarrier48TM014_12tons_EIRFFF, !- Energy Input Ratio Function of Flow Fraction Curve Name + ZN_1_FLR_1_SEC_4:SysCoolCIEA_HVAC_BESTEST_9ton-PLR; !- Part Load Fraction Correlation Curve Name + + Curve:Biquadratic, + ZN_1_FLR_1_SEC_4:SysCoolCCarrier48TM014_12tons_CapFT, !- Name + 1.39072, !- Coefficient1 Constant + -0.0529058, !- Coefficient2 x + 0.0018423, !- Coefficient3 x**2 + 0.00058267, !- Coefficient4 y + -0.000186814, !- Coefficient5 y**2 + 0.000265159, !- Coefficient6 x*y + 16.5556, !- Minimum Value of x + 22.1111, !- Maximum Value of x + 18.0, !- Minimum Value of y + 47.66, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Biquadratic, + ZN_1_FLR_1_SEC_4:SysCoolCCarrier48TM014_12tons_EIRFT, !- Name + -0.536161, !- Coefficient1 Constant + 0.105138, !- Coefficient2 x + -0.00172659, !- Coefficient3 x**2 + 0.0149848, !- Coefficient4 y + 0.000659948, !- Coefficient5 y**2 + -0.0017385, !- Coefficient6 x*y + 16.5556, !- Minimum Value of x + 22.1111, !- Maximum Value of x + 18.0, !- Minimum Value of y + 47.66, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + ZN_1_FLR_1_SEC_4:SysCoolCCarrier48TM014_12tons_FFF, !- Name + 0.718954, !- Coefficient1 Constant + 0.435436, !- Coefficient2 x + -0.154193, !- Coefficient3 x**2 + 0.75, !- Minimum Value of x + 1.25; !- Maximum Value of x + + Curve:Quadratic, + ZN_1_FLR_1_SEC_4:SysCoolCCarrier48TM014_12tons_EIRFFF, !- Name + 1.19525, !- Coefficient1 Constant + -0.306138, !- Coefficient2 x + 0.110973, !- Coefficient3 x**2 + 0.75, !- Minimum Value of x + 1.25; !- Maximum Value of x + + Curve:Quadratic, + ZN_1_FLR_1_SEC_4:SysCoolCIEA_HVAC_BESTEST_9ton-PLR, !- Name + 0.771, !- Coefficient1 Constant + 0.229, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + + OutdoorAir:Node, + ZN_1_FLR_1_SEC_4:SysCoolCOA Ref node; !- Name + + Coil:Heating:Electric, + ZN_1_FLR_1_SEC_4:SysHeatC, !- Name + ALWAYS_ON, !- Availability Schedule Name + 1.0, !- Efficiency + AUTOSIZE, !- Nominal Capacity {W} + ZN_1_FLR_1_SEC_4:SysCoolC-ZN_1_FLR_1_SEC_4:SysHeatCNode, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_4:SysHeatC-ZN_1_FLR_1_SEC_4:Sys FanNode, !- Air Outlet Node Name + ZN_1_FLR_1_SEC_4:Sys Supply Equipment Outlet Node; !- Temperature Setpoint Node Name + + Fan:ConstantVolume, + ZN_1_FLR_1_SEC_4:Sys Fan,!- Name + HVACOperationSchd, !- Availability Schedule Name + 0.55, !- Fan Total Efficiency + 500, !- Pressure Rise {Pa} + AUTOSIZE, !- Maximum Flow Rate {m3/s} + 0.85, !- Motor Efficiency + 1.0, !- Motor In Airstream Fraction + ZN_1_FLR_1_SEC_4:SysHeatC-ZN_1_FLR_1_SEC_4:Sys FanNode, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_4:Sys Supply Equipment Outlet Node; !- Air Outlet Node Name + + AirLoopHVAC:SupplyPath, + ZN_1_FLR_1_SEC_4:Sys, !- Name + ZN_1_FLR_1_SEC_4:Sys Zone Equipment Inlet Node, !- Supply Air Path Inlet Node Name + AirLoopHVAC:ZoneSplitter,!- Component 1 Object Type + ZN_1_FLR_1_SEC_4:Sys Supply Air Splitter; !- Component 1 Name + + AirLoopHVAC:ZoneSplitter, + ZN_1_FLR_1_SEC_4:Sys Supply Air Splitter, !- Name + ZN_1_FLR_1_SEC_4:Sys Zone Equipment Inlet Node, !- Inlet Node Name + ZN_1_FLR_1_SEC_4 Direct Air Inlet Node ATInlet; !- Outlet 1 Node Name + + AirLoopHVAC:ReturnPath, + ZN_1_FLR_1_SEC_4:Sys Return Air Path, !- Name + ZN_1_FLR_1_SEC_4:Sys Zone Equipment Outlet Node, !- Return Air Path Outlet Node Name + AirLoopHVAC:ZoneMixer, !- Component 1 Object Type + ZN_1_FLR_1_SEC_4:Sys Return Air Mixer; !- Component 1 Name + + AirLoopHVAC:ZoneMixer, + ZN_1_FLR_1_SEC_4:Sys Return Air Mixer, !- Name + ZN_1_FLR_1_SEC_4:Sys Zone Equipment Outlet Node, !- Outlet Node Name + ZN_1_FLR_1_SEC_4 Return Air Node; !- Inlet 1 Node Name + +!***** Air Loop: ZN_1_FLR_1_SEC_5:Sys ***** + + AirLoopHVAC, + ZN_1_FLR_1_SEC_5:Sys, !- Name + , !- Controller List Name + ZN_1_FLR_1_SEC_5:Sys Availability Manager List, !- Availability Manager List Name + AUTOSIZE, !- Design Supply Air Flow Rate {m3/s} + ZN_1_FLR_1_SEC_5:Sys Air Loop Branches, !- Branch List Name + , !- Connector List Name + ZN_1_FLR_1_SEC_5:Sys Supply Equipment Inlet Node, !- Supply Side Inlet Node Name + ZN_1_FLR_1_SEC_5:Sys Zone Equipment Outlet Node, !- Demand Side Outlet Node Name + ZN_1_FLR_1_SEC_5:Sys Zone Equipment Inlet Node, !- Demand Side Inlet Node Names + ZN_1_FLR_1_SEC_5:Sys Supply Equipment Outlet Node; !- Supply Side Outlet Node Names + + Sizing:System, + ZN_1_FLR_1_SEC_5:Sys, !- 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 + 7.0, !- Preheat Design Temperature {C} + .008, !- Preheat Design Humidity Ratio {kgWater/kgDryAir} + 11.0, !- Precool Design Temperature {C} + .008, !- Precool Design Humidity Ratio {kgWater/kgDryAir} + 12.8, !- Central Cooling Design Supply Air Temperature {C} + 40.0, !- 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.0085, !- 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.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.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 + + AvailabilityManagerAssignmentList, + ZN_1_FLR_1_SEC_5:Sys Availability Manager List, !- Name + AvailabilityManager:NightCycle, !- Availability Manager 1 Object Type + ZN_1_FLR_1_SEC_5:Sys Availability Manager; !- Availability Manager 1 Name + + AvailabilityManager:NightCycle, + ZN_1_FLR_1_SEC_5:Sys Availability Manager, !- Name + Always_On, !- Applicability Schedule Name + HVACOperationSchd, !- Fan Schedule Name + CycleOnAny, !- Control Type + 1.0, !- Thermostat Tolerance {deltaC} + FixedRunTime, !- Cycling Run Time Control Type + 7200; !- Cycling Run Time {s} + + BranchList, + ZN_1_FLR_1_SEC_5:Sys Air Loop Branches, !- Name + ZN_1_FLR_1_SEC_5:Sys Air Loop Main Branch; !- Branch 1 Name + + Branch, + ZN_1_FLR_1_SEC_5:Sys Air Loop Main Branch, !- Name + , !- Pressure Drop Curve Name + AirLoopHVAC:OutdoorAirSystem, !- Component 1 Object Type + ZN_1_FLR_1_SEC_5:Sys_OA, !- Component 1 Name + ZN_1_FLR_1_SEC_5:Sys Supply Equipment Inlet Node, !- Component 1 Inlet Node Name + ZN_1_FLR_1_SEC_5:Sys_OA-ZN_1_FLR_1_SEC_5:SysCoolCNode, !- Component 1 Outlet Node Name + CoilSystem:Cooling:DX, !- Component 2 Object Type + ZN_1_FLR_1_SEC_5:SysCoolC, !- Component 2 Name + ZN_1_FLR_1_SEC_5:Sys_OA-ZN_1_FLR_1_SEC_5:SysCoolCNode, !- Component 2 Inlet Node Name + ZN_1_FLR_1_SEC_5:SysCoolC-ZN_1_FLR_1_SEC_5:SysHeatCNode, !- Component 2 Outlet Node Name + Coil:Heating:Electric, !- Component 3 Object Type + ZN_1_FLR_1_SEC_5:SysHeatC, !- Component 3 Name + ZN_1_FLR_1_SEC_5:SysCoolC-ZN_1_FLR_1_SEC_5:SysHeatCNode, !- Component 3 Inlet Node Name + ZN_1_FLR_1_SEC_5:SysHeatC-ZN_1_FLR_1_SEC_5:Sys FanNode, !- Component 3 Outlet Node Name + Fan:ConstantVolume, !- Component 4 Object Type + ZN_1_FLR_1_SEC_5:Sys Fan,!- Component 4 Name + ZN_1_FLR_1_SEC_5:SysHeatC-ZN_1_FLR_1_SEC_5:Sys FanNode, !- Component 4 Inlet Node Name + ZN_1_FLR_1_SEC_5:Sys Supply Equipment Outlet Node; !- Component 4 Outlet Node Name + + AirLoopHVAC:ControllerList, + ZN_1_FLR_1_SEC_5:Sys_OAControllers, !- Name + Controller:OutdoorAir, !- Controller 1 Object Type + ControllerZN_1_FLR_1_SEC_5:Sys_OA; !- Controller 1 Name + + AirLoopHVAC:OutdoorAirSystem:EquipmentList, + ZN_1_FLR_1_SEC_5:Sys_OAEquipment, !- Name + OutdoorAir:Mixer, !- Component 1 Object Type + ZN_1_FLR_1_SEC_5:Sys_OAMixing Box; !- Component 1 Name + + AirLoopHVAC:OutdoorAirSystem, + ZN_1_FLR_1_SEC_5:Sys_OA, !- Name + ZN_1_FLR_1_SEC_5:Sys_OAControllers, !- Controller List Name + ZN_1_FLR_1_SEC_5:Sys_OAEquipment, !- Outdoor Air Equipment List Name + ZN_1_FLR_1_SEC_5:Sys Availability Manager List; !- Availability Manager List Name + + OutdoorAir:NodeList, + ZN_1_FLR_1_SEC_5:Sys_OANode List; !- Node or NodeList Name 1 + + NodeList, + ZN_1_FLR_1_SEC_5:Sys_OANode List, !- Name + ZN_1_FLR_1_SEC_5:Sys_OAInlet Node; !- Node 1 Name + + OutdoorAir:Mixer, + ZN_1_FLR_1_SEC_5:Sys_OAMixing Box, !- Name + ZN_1_FLR_1_SEC_5:Sys_OA-ZN_1_FLR_1_SEC_5:SysCoolCNode, !- Mixed Air Node Name + ZN_1_FLR_1_SEC_5:Sys_OAInlet Node, !- Outdoor Air Stream Node Name + ZN_1_FLR_1_SEC_5:Sys_OARelief Node, !- Relief Air Stream Node Name + ZN_1_FLR_1_SEC_5:Sys Supply Equipment Inlet Node; !- Return Air Stream Node Name + + SetpointManager:MixedAir, + ZN_1_FLR_1_SEC_5:Sys_OAMixed Air Temp Manager, !- Name + Temperature, !- Control Variable + ZN_1_FLR_1_SEC_5:Sys Supply Equipment Outlet Node, !- Reference Setpoint Node Name + ZN_1_FLR_1_SEC_5:SysHeatC-ZN_1_FLR_1_SEC_5:Sys FanNode, !- Fan Inlet Node Name + ZN_1_FLR_1_SEC_5:Sys Supply Equipment Outlet Node, !- Fan Outlet Node Name + ZN_1_FLR_1_SEC_5:Sys_OA-ZN_1_FLR_1_SEC_5:SysCoolCNode; !- Setpoint Node or NodeList Name + + Controller:OutdoorAir, + ControllerZN_1_FLR_1_SEC_5:Sys_OA, !- Name + ZN_1_FLR_1_SEC_5:Sys_OARelief Node, !- Relief Air Outlet Node Name + ZN_1_FLR_1_SEC_5:Sys Supply Equipment Inlet Node, !- Return Air Node Name + ZN_1_FLR_1_SEC_5:Sys_OA-ZN_1_FLR_1_SEC_5:SysCoolCNode, !- Mixed Air Node Name + ZN_1_FLR_1_SEC_5:Sys_OAInlet Node, !- Actuator Node Name + AUTOSIZE, !- Minimum Outdoor Air Flow Rate {m3/s} + AUTOSIZE, !- Maximum Outdoor Air Flow Rate {m3/s} + NoEconomizer, !- Economizer Control Type + ModulateFlow, !- Economizer Control Action Type + 19.0, !- Economizer Maximum Limit Dry-Bulb Temperature {C} + 32000.0, !- Economizer Maximum Limit Enthalpy {J/kg} + , !- Economizer Maximum Limit Dewpoint Temperature {C} + , !- Electronic Enthalpy Limit Curve Name + , !- Economizer Minimum Limit Dry-Bulb Temperature {C} + NoLockout, !- Lockout Type + FixedMinimum, !- Minimum Limit Type + MinOA_Sched; !- Minimum Outdoor Air Schedule Name + + CoilSystem:Cooling:DX, + ZN_1_FLR_1_SEC_5:SysCoolC, !- Name + ALWAYS_ON, !- Availability Schedule Name + ZN_1_FLR_1_SEC_5:Sys_OA-ZN_1_FLR_1_SEC_5:SysCoolCNode, !- DX Cooling Coil System Inlet Node Name + ZN_1_FLR_1_SEC_5:SysCoolC-ZN_1_FLR_1_SEC_5:SysHeatCNode, !- DX Cooling Coil System Outlet Node Name + ZN_1_FLR_1_SEC_5:Sys Supply Equipment Outlet Node, !- DX Cooling Coil System Sensor Node Name + Coil:Cooling:DX:SingleSpeed, !- Cooling Coil Object Type + ZN_1_FLR_1_SEC_5:SysCoolC DXCoil; !- Cooling Coil Name + + Coil:Cooling:DX:SingleSpeed, + ZN_1_FLR_1_SEC_5:SysCoolC DXCoil, !- Name + ALWAYS_ON, !- Availability Schedule Name + AUTOSIZE, !- Gross Rated Total Cooling Capacity {W} + AUTOSIZE, !- Gross Rated Sensible Heat Ratio + 2.7835, !- Gross Rated Cooling COP {W/W} + AUTOSIZE, !- Rated Air Flow Rate {m3/s} + , !- Rated Evaporator Fan Power Per Volume Flow Rate {W/(m3/s)} + ZN_1_FLR_1_SEC_5:Sys_OA-ZN_1_FLR_1_SEC_5:SysCoolCNode, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_5:SysCoolC-ZN_1_FLR_1_SEC_5:SysHeatCNode, !- Air Outlet Node Name + ZN_1_FLR_1_SEC_5:SysCoolCCarrier48TM014_12tons_CapFT, !- Total Cooling Capacity Function of Temperature Curve Name + ZN_1_FLR_1_SEC_5:SysCoolCCarrier48TM014_12tons_FFF, !- Total Cooling Capacity Function of Flow Fraction Curve Name + ZN_1_FLR_1_SEC_5:SysCoolCCarrier48TM014_12tons_EIRFT, !- Energy Input Ratio Function of Temperature Curve Name + ZN_1_FLR_1_SEC_5:SysCoolCCarrier48TM014_12tons_EIRFFF, !- Energy Input Ratio Function of Flow Fraction Curve Name + ZN_1_FLR_1_SEC_5:SysCoolCIEA_HVAC_BESTEST_9ton-PLR; !- Part Load Fraction Correlation Curve Name + + Curve:Biquadratic, + ZN_1_FLR_1_SEC_5:SysCoolCCarrier48TM014_12tons_CapFT, !- Name + 1.39072, !- Coefficient1 Constant + -0.0529058, !- Coefficient2 x + 0.0018423, !- Coefficient3 x**2 + 0.00058267, !- Coefficient4 y + -0.000186814, !- Coefficient5 y**2 + 0.000265159, !- Coefficient6 x*y + 16.5556, !- Minimum Value of x + 22.1111, !- Maximum Value of x + 18.0, !- Minimum Value of y + 47.66, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Biquadratic, + ZN_1_FLR_1_SEC_5:SysCoolCCarrier48TM014_12tons_EIRFT, !- Name + -0.536161, !- Coefficient1 Constant + 0.105138, !- Coefficient2 x + -0.00172659, !- Coefficient3 x**2 + 0.0149848, !- Coefficient4 y + 0.000659948, !- Coefficient5 y**2 + -0.0017385, !- Coefficient6 x*y + 16.5556, !- Minimum Value of x + 22.1111, !- Maximum Value of x + 18.0, !- Minimum Value of y + 47.66, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + ZN_1_FLR_1_SEC_5:SysCoolCCarrier48TM014_12tons_FFF, !- Name + 0.718954, !- Coefficient1 Constant + 0.435436, !- Coefficient2 x + -0.154193, !- Coefficient3 x**2 + 0.75, !- Minimum Value of x + 1.25; !- Maximum Value of x + + Curve:Quadratic, + ZN_1_FLR_1_SEC_5:SysCoolCCarrier48TM014_12tons_EIRFFF, !- Name + 1.19525, !- Coefficient1 Constant + -0.306138, !- Coefficient2 x + 0.110973, !- Coefficient3 x**2 + 0.75, !- Minimum Value of x + 1.25; !- Maximum Value of x + + Curve:Quadratic, + ZN_1_FLR_1_SEC_5:SysCoolCIEA_HVAC_BESTEST_9ton-PLR, !- Name + 0.771, !- Coefficient1 Constant + 0.229, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + + OutdoorAir:Node, + ZN_1_FLR_1_SEC_5:SysCoolCOA Ref node; !- Name + + Coil:Heating:Electric, + ZN_1_FLR_1_SEC_5:SysHeatC, !- Name + ALWAYS_ON, !- Availability Schedule Name + 1.0, !- Efficiency + AUTOSIZE, !- Nominal Capacity {W} + ZN_1_FLR_1_SEC_5:SysCoolC-ZN_1_FLR_1_SEC_5:SysHeatCNode, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_5:SysHeatC-ZN_1_FLR_1_SEC_5:Sys FanNode, !- Air Outlet Node Name + ZN_1_FLR_1_SEC_5:Sys Supply Equipment Outlet Node; !- Temperature Setpoint Node Name + + Fan:ConstantVolume, + ZN_1_FLR_1_SEC_5:Sys Fan,!- Name + HVACOperationSchd, !- Availability Schedule Name + 0.55, !- Fan Total Efficiency + 500, !- Pressure Rise {Pa} + AUTOSIZE, !- Maximum Flow Rate {m3/s} + 0.85, !- Motor Efficiency + 1.0, !- Motor In Airstream Fraction + ZN_1_FLR_1_SEC_5:SysHeatC-ZN_1_FLR_1_SEC_5:Sys FanNode, !- Air Inlet Node Name + ZN_1_FLR_1_SEC_5:Sys Supply Equipment Outlet Node; !- Air Outlet Node Name + + AirLoopHVAC:SupplyPath, + ZN_1_FLR_1_SEC_5:Sys, !- Name + ZN_1_FLR_1_SEC_5:Sys Zone Equipment Inlet Node, !- Supply Air Path Inlet Node Name + AirLoopHVAC:ZoneSplitter,!- Component 1 Object Type + ZN_1_FLR_1_SEC_5:Sys Supply Air Splitter; !- Component 1 Name + + AirLoopHVAC:ZoneSplitter, + ZN_1_FLR_1_SEC_5:Sys Supply Air Splitter, !- Name + ZN_1_FLR_1_SEC_5:Sys Zone Equipment Inlet Node, !- Inlet Node Name + ZN_1_FLR_1_SEC_5 Direct Air Inlet Node ATInlet; !- Outlet 1 Node Name + + AirLoopHVAC:ReturnPath, + ZN_1_FLR_1_SEC_5:Sys Return Air Path, !- Name + ZN_1_FLR_1_SEC_5:Sys Zone Equipment Outlet Node, !- Return Air Path Outlet Node Name + AirLoopHVAC:ZoneMixer, !- Component 1 Object Type + ZN_1_FLR_1_SEC_5:Sys Return Air Mixer; !- Component 1 Name + + AirLoopHVAC:ZoneMixer, + ZN_1_FLR_1_SEC_5:Sys Return Air Mixer, !- Name + ZN_1_FLR_1_SEC_5:Sys Zone Equipment Outlet Node, !- Outlet Node Name + ZN_1_FLR_1_SEC_5 Return Air Node; !- Inlet 1 Node Name + +!***** PLANT Loop: SHWSys1 ***** + + PlantLoop, + SHWSys1, !- Name + WATER, !- Fluid Type + , !- User Defined Fluid Type + SHWSys1 Loop Operation Scheme List, !- Plant Equipment Operation Scheme Name + SHWSys1 Supply Outlet Node, !- Loop Temperature Setpoint Node Name + 60.0, !- Maximum Loop Temperature {C} + 10.0, !- Minimum Loop Temperature {C} + AUTOSIZE, !- Maximum Loop Flow Rate {m3/s} + 0.0, !- Minimum Loop Flow Rate {m3/s} + AUTOSIZE, !- Plant Loop Volume {m3} + SHWSys1 Supply Inlet Node, !- Plant Side Inlet Node Name + SHWSys1 Supply Outlet Node, !- Plant Side Outlet Node Name + SHWSys1 Supply Branches, !- Plant Side Branch List Name + SHWSys1 Supply Connectors, !- Plant Side Connector List Name + SHWSys1 Demand Inlet Node, !- Demand Side Inlet Node Name + SHWSys1 Demand Outlet Node, !- Demand Side Outlet Node Name + SHWSys1 Demand Branches, !- Demand Side Branch List Name + SHWSys1 Demand Connectors, !- Demand Side Connector List Name + OPTIMAL; !- Load Distribution Scheme + + Sizing:Plant, + SHWSys1, !- Plant or Condenser Loop Name + HEATING, !- Loop Type + 55, !- Design Loop Exit Temperature {C} + 5.0; !- Loop Design Temperature Difference {deltaC} + + SetpointManager:Scheduled, + SHWSys1 Loop Setpoint Manager, !- Name + Temperature, !- Control Variable + SHWSys1-Loop-Temp-Schedule, !- Schedule Name + SHWSys1 Supply Outlet Node; !- Setpoint Node or NodeList Name + + PlantEquipmentOperationSchemes, + SHWSys1 Loop Operation Scheme List, !- Name + PlantEquipmentOperation:HeatingLoad, !- Control Scheme 1 Object Type + SHWSys1 Operation Scheme,!- Control Scheme 1 Name + PlantOnSched; !- Control Scheme 1 Schedule Name + + PlantEquipmentOperation:HeatingLoad, + SHWSys1 Operation Scheme,!- Name + 0.0, !- Load Range 1 Lower Limit {W} + 1000000000000000, !- Load Range 1 Upper Limit {W} + SHWSys1 Equipment List; !- Range 1 Equipment List Name + + Schedule:Compact, + SHWSys1-Loop-Temp-Schedule, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,55; !- Field 3 + + PlantEquipmentList, + SHWSys1 Equipment List, !- Name + WaterHeater:Mixed, !- Equipment 1 Object Type + SHWSys1 Water Heater; !- Equipment 1 Name + + BranchList, + SHWSys1 Supply Branches, !- Name + SHWSys1 Supply Inlet Branch, !- Branch 1 Name + SHWSys1 Supply Equipment Branch, !- Branch 2 Name + SHWSys1 Supply Equipment Bypass Branch, !- Branch 3 Name + SHWSys1 Supply Outlet Branch; !- Branch 4 Name + + ConnectorList, + SHWSys1 Supply Connectors, !- Name + Connector:Splitter, !- Connector 1 Object Type + SHWSys1 Supply Splitter, !- Connector 1 Name + Connector:Mixer, !- Connector 2 Object Type + SHWSys1 Supply Mixer; !- Connector 2 Name + + Connector:Splitter, + SHWSys1 Supply Splitter, !- Name + SHWSys1 Supply Inlet Branch, !- Inlet Branch Name + SHWSys1 Supply Equipment Branch, !- Outlet Branch 1 Name + SHWSys1 Supply Equipment Bypass Branch; !- Outlet Branch 2 Name + + Connector:Mixer, + SHWSys1 Supply Mixer, !- Name + SHWSys1 Supply Outlet Branch, !- Outlet Branch Name + SHWSys1 Supply Equipment Branch, !- Inlet Branch 1 Name + SHWSys1 Supply Equipment Bypass Branch; !- Inlet Branch 2 Name + + Branch, + SHWSys1 Supply Inlet Branch, !- Name + , !- Pressure Drop Curve Name + Pump:VariableSpeed, !- Component 1 Object Type + SHWSys1 Pump, !- Component 1 Name + SHWSys1 Supply Inlet Node, !- Component 1 Inlet Node Name + SHWSys1 Pump-SHWSys1 Water HeaterNodeviaConnector; !- Component 1 Outlet Node Name + + Branch, + SHWSys1 Supply Equipment Branch, !- Name + , !- Pressure Drop Curve Name + WaterHeater:Mixed, !- Component 1 Object Type + SHWSys1 Water Heater, !- Component 1 Name + SHWSys1 Pump-SHWSys1 Water HeaterNode, !- Component 1 Inlet Node Name + SHWSys1 Supply Equipment Outlet Node; !- Component 1 Outlet Node Name + + Pump:VariableSpeed, + SHWSys1 Pump, !- Name + SHWSys1 Supply Inlet Node, !- Inlet Node Name + SHWSys1 Pump-SHWSys1 Water HeaterNodeviaConnector, !- Outlet Node Name + AUTOSIZE, !- Design Maximum Flow Rate {m3/s} + 179352, !- Design Pump Head {Pa} + AUTOSIZE, !- Design Power Consumption {W} + 1, !- Motor Efficiency + 0.0, !- Fraction of Motor Inefficiencies to Fluid Stream + 0, !- Coefficient 1 of the Part Load Performance Curve + 1, !- Coefficient 2 of the Part Load Performance Curve + 0, !- Coefficient 3 of the Part Load Performance Curve + 0, !- Coefficient 4 of the Part Load Performance Curve + 0.0, !- Design Minimum Flow Rate {m3/s} + INTERMITTENT; !- Pump Control Type + + WaterHeater:Mixed, + SHWSys1 Water Heater, !- Name + 0.9, !- Tank Volume {m3} + SHWSys1 Water Heater Setpoint Temperature Schedule, !- Setpoint Temperature Schedule Name + 2.0, !- Deadband Temperature Difference {deltaC} + 82.2222, !- Maximum Temperature Limit {C} + CYCLE, !- Heater Control Type + 4500, !- Heater Maximum Capacity {W} + , !- Heater Minimum Capacity {W} + , !- Heater Ignition Minimum Flow Rate {m3/s} + , !- Heater Ignition Delay {s} + Electricity, !- Heater Fuel Type + 0.595, !- Heater Thermal Efficiency + , !- Part Load Factor Curve Name + 20, !- Off Cycle Parasitic Fuel Consumption Rate {W} + Electricity, !- Off Cycle Parasitic Fuel Type + 0.595, !- Off Cycle Parasitic Heat Fraction to Tank + , !- On Cycle Parasitic Fuel Consumption Rate {W} + Electricity, !- On Cycle Parasitic Fuel Type + , !- On Cycle Parasitic Heat Fraction to Tank + SCHEDULE, !- Ambient Temperature Indicator + SHWSys1 Water Heater Ambient Temperature Schedule, !- Ambient Temperature Schedule Name + , !- Ambient Temperature Zone Name + , !- Ambient Temperature Outdoor Air Node Name + 6.0, !- Off Cycle Loss Coefficient to Ambient Temperature {W/K} + , !- Off Cycle Loss Fraction to Zone + 6.0, !- On Cycle Loss Coefficient to Ambient Temperature {W/K} + , !- On Cycle Loss Fraction to Zone + , !- Peak Use Flow Rate {m3/s} + , !- Use Flow Rate Fraction Schedule Name + , !- Cold Water Supply Temperature Schedule Name + SHWSys1 Pump-SHWSys1 Water HeaterNode, !- Use Side Inlet Node Name + SHWSys1 Supply Equipment Outlet Node, !- Use Side Outlet Node Name + 1.0, !- Use Side Effectiveness + , !- Source Side Inlet Node Name + , !- Source Side Outlet Node Name + 1.0, !- Source Side Effectiveness + Autosize, !- Use Side Design Flow Rate {m3/s} + , !- Source Side Design Flow Rate {m3/s} + ; !- Indirect Water Heating Recovery Time {hr} + + Schedule:Compact, + SHWSys1 Water Heater Setpoint Temperature Schedule, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,60.0; !- Field 3 + + Schedule:Compact, + SHWSys1 Water Heater Ambient Temperature Schedule, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,22.0; !- Field 3 + + Branch, + SHWSys1 Supply Equipment Bypass Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + SHWSys1 Supply Equipment Bypass Pipe, !- Component 1 Name + SHWSys1 Supply Equip Bypass Inlet Node, !- Component 1 Inlet Node Name + SHWSys1 Supply Equip Bypass Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + SHWSys1 Supply Equipment Bypass Pipe, !- Name + SHWSys1 Supply Equip Bypass Inlet Node, !- Inlet Node Name + SHWSys1 Supply Equip Bypass Outlet Node; !- Outlet Node Name + + Branch, + SHWSys1 Supply Outlet Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + SHWSys1 Supply Outlet Pipe, !- Component 1 Name + SHWSys1 Supply Mixer-SHWSys1 Supply Outlet Pipe, !- Component 1 Inlet Node Name + SHWSys1 Supply Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + SHWSys1 Supply Outlet Pipe, !- Name + SHWSys1 Supply Mixer-SHWSys1 Supply Outlet Pipe, !- Inlet Node Name + SHWSys1 Supply Outlet Node; !- Outlet Node Name + + BranchList, + SHWSys1 Demand Branches, !- Name + SHWSys1 Demand Inlet Branch, !- Branch 1 Name + SHWSys1 Demand Load Branch 1, !- Branch 2 Name + SHWSys1 Demand Load Branch 2, !- Branch 3 Name + SHWSys1 Demand Load Branch 3, !- Branch 4 Name + SHWSys1 Demand Load Branch 4, !- Branch 5 Name + SHWSys1 Demand Load Branch 5, !- Branch 6 Name + SHWSys1 Demand Bypass Branch, !- Branch 7 Name + SHWSys1 Demand Outlet Branch; !- Branch 8 Name + + ConnectorList, + SHWSys1 Demand Connectors, !- Name + Connector:Splitter, !- Connector 1 Object Type + SHWSys1 Demand Splitter, !- Connector 1 Name + Connector:Mixer, !- Connector 2 Object Type + SHWSys1 Demand Mixer; !- Connector 2 Name + + Connector:Splitter, + SHWSys1 Demand Splitter, !- Name + SHWSys1 Demand Inlet Branch, !- Inlet Branch Name + SHWSys1 Demand Load Branch 1, !- Outlet Branch 1 Name + SHWSys1 Demand Load Branch 2, !- Outlet Branch 2 Name + SHWSys1 Demand Load Branch 3, !- Outlet Branch 3 Name + SHWSys1 Demand Load Branch 4, !- Outlet Branch 4 Name + SHWSys1 Demand Load Branch 5, !- Outlet Branch 5 Name + SHWSys1 Demand Bypass Branch; !- Outlet Branch 6 Name + + Connector:Mixer, + SHWSys1 Demand Mixer, !- Name + SHWSys1 Demand Outlet Branch, !- Outlet Branch Name + SHWSys1 Demand Load Branch 1, !- Inlet Branch 1 Name + SHWSys1 Demand Load Branch 2, !- Inlet Branch 2 Name + SHWSys1 Demand Load Branch 3, !- Inlet Branch 3 Name + SHWSys1 Demand Load Branch 4, !- Inlet Branch 4 Name + SHWSys1 Demand Load Branch 5, !- Inlet Branch 5 Name + SHWSys1 Demand Bypass Branch; !- Inlet Branch 6 Name + + Branch, + SHWSys1 Demand Inlet Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + SHWSys1 Demand Inlet Pipe, !- Component 1 Name + SHWSys1 Demand Inlet Node, !- Component 1 Inlet Node Name + SHWSys1 Demand Inlet Pipe-SHWSys1 Demand Mixer; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + SHWSys1 Demand Inlet Pipe, !- Name + SHWSys1 Demand Inlet Node, !- Inlet Node Name + SHWSys1 Demand Inlet Pipe-SHWSys1 Demand Mixer; !- Outlet Node Name + + Branch, + SHWSys1 Demand Load Branch 1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 1 Object Type + ZN_1_FLR_1_SEC_1SHW_DEFAULT, !- Component 1 Name + ZN_1_FLR_1_SEC_1SHW_DEFAULT Water Inlet Node, !- Component 1 Inlet Node Name + ZN_1_FLR_1_SEC_1SHW_DEFAULT Water Outlet Node; !- Component 1 Outlet Node Name + + Branch, + SHWSys1 Demand Load Branch 2, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 1 Object Type + ZN_1_FLR_1_SEC_2SHW_DEFAULT, !- Component 1 Name + ZN_1_FLR_1_SEC_2SHW_DEFAULT Water Inlet Node, !- Component 1 Inlet Node Name + ZN_1_FLR_1_SEC_2SHW_DEFAULT Water Outlet Node; !- Component 1 Outlet Node Name + + Branch, + SHWSys1 Demand Load Branch 3, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 1 Object Type + ZN_1_FLR_1_SEC_3SHW_DEFAULT, !- Component 1 Name + ZN_1_FLR_1_SEC_3SHW_DEFAULT Water Inlet Node, !- Component 1 Inlet Node Name + ZN_1_FLR_1_SEC_3SHW_DEFAULT Water Outlet Node; !- Component 1 Outlet Node Name + + Branch, + SHWSys1 Demand Load Branch 4, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 1 Object Type + ZN_1_FLR_1_SEC_4SHW_DEFAULT, !- Component 1 Name + ZN_1_FLR_1_SEC_4SHW_DEFAULT Water Inlet Node, !- Component 1 Inlet Node Name + ZN_1_FLR_1_SEC_4SHW_DEFAULT Water Outlet Node; !- Component 1 Outlet Node Name + + Branch, + SHWSys1 Demand Load Branch 5, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 1 Object Type + ZN_1_FLR_1_SEC_5SHW_DEFAULT, !- Component 1 Name + ZN_1_FLR_1_SEC_5SHW_DEFAULT Water Inlet Node, !- Component 1 Inlet Node Name + ZN_1_FLR_1_SEC_5SHW_DEFAULT Water Outlet Node; !- Component 1 Outlet Node Name + + Branch, + SHWSys1 Demand Bypass Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + SHWSys1 Demand Bypass Pipe, !- Component 1 Name + SHWSys1 Demand Bypass Pipe Inlet Node, !- Component 1 Inlet Node Name + SHWSys1 Demand Bypass Pipe Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + SHWSys1 Demand Bypass Pipe, !- Name + SHWSys1 Demand Bypass Pipe Inlet Node, !- Inlet Node Name + SHWSys1 Demand Bypass Pipe Outlet Node; !- Outlet Node Name + + Branch, + SHWSys1 Demand Outlet Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + SHWSys1 Demand Outlet Pipe, !- Component 1 Name + SHWSys1 Demand Mixer-SHWSys1 Demand Outlet Pipe, !- Component 1 Inlet Node Name + SHWSys1 Demand Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + SHWSys1 Demand Outlet Pipe, !- Name + SHWSys1 Demand Mixer-SHWSys1 Demand Outlet Pipe, !- Inlet Node Name + SHWSys1 Demand Outlet Node; !- Outlet Node Name + + Exterior:FuelEquipment, + Equipment_SimpleRefrigeration, !- Name + Electricity, !- Fuel Use Type + ALWAYS_ON, !- Schedule Name + 507.2340, !- Design Level {W} + Refrigeration (simple); !- End-Use Subcategory + + Exterior:Lights, + Exterior Facade Lighting,!- Name + ALWAYS_ON, !- Schedule Name + 130.2176, !- Design Level {W} + AstronomicalClock, !- Control Option + Exterior Facade Lighting;!- End-Use Subcategory + + Schedule:Compact, + ReliantEnergySeasonSched,!- Name + number, !- Schedule Type Limits Name + Through: 4/30, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00,1, !- Field 3 + Through: 10/31, !- Field 5 + For: AllDays, !- Field 6 + Until: 24:00,3, !- Field 7 + Through: 12/31, !- Field 9 + For: AllDays, !- Field 10 + Until: 24:00,1; !- Field 11 + + UtilityCost:Tariff, + ReliantEnergy_PTB-LGS_LargeGeneral, !- Name + Electricity:Facility, !- Output Meter Name + kWh, !- Conversion Factor Choice + , !- Energy Conversion Factor + , !- Demand Conversion Factor + , !- Time of Use Period Schedule Name + ReliantEnergySeasonSched,!- Season Schedule Name + , !- Month Schedule Name + halfHour, !- Demand Window Length + 2936.2, !- Monthly Charge or Variable Name + , !- Minimum Monthly Charge or Variable Name + , !- Real Time Pricing Charge Schedule Name + , !- Customer Baseline Load Schedule Name + Comm Elect; !- Group Name + + UtilityCost:Charge:Simple, + SummerFuelEnergyCharge, !- Utility Cost Charge Simple Name + ReliantEnergy_PTB-LGS_LargeGeneral, !- Tariff Name + totalEnergy, !- Source Variable + Summer, !- Season + EnergyCharges, !- Category Variable Name + 0.0823; !- Cost per Unit Value or Variable Name + + UtilityCost:Charge:Block, + SummerBaseEnergycharge, !- Utility Cost Charge Block Name + ReliantEnergy_PTB-LGS_LargeGeneral, !- Tariff Name + TotalEnergy, !- Source Variable + Summer, !- Season + EnergyCharges, !- Category Variable Name + , !- Remaining Into Variable + TotalDemand, !- Block Size Multiplier Value or Variable Name + 295, !- Block Size 1 Value or Variable Name + 0.0249, !- Block 1 Cost per Unit Value or Variable Name + remaining, !- Block Size 2 Value or Variable Name + 0.0048; !- Block 2 Cost per Unit Value or Variable Name + + UtilityCost:Charge:Simple, + WinterFuelEnergyCharge, !- Utility Cost Charge Simple Name + ReliantEnergy_PTB-LGS_LargeGeneral, !- Tariff Name + totalEnergy, !- Source Variable + Winter, !- Season + EnergyCharges, !- Category Variable Name + 0.0485; !- Cost per Unit Value or Variable Name + + UtilityCost:Charge:Block, + AnnualDemandCharge, !- Utility Cost Charge Block Name + ReliantEnergy_PTB-LGS_LargeGeneral, !- Tariff Name + TotalDemand, !- Source Variable + Annual, !- Season + DemandCharges, !- Category Variable Name + , !- Remaining Into Variable + , !- Block Size Multiplier Value or Variable Name + 400, !- Block Size 1 Value or Variable Name + 0.0, !- Block 1 Cost per Unit Value or Variable Name + remaining, !- Block Size 2 Value or Variable Name + 6.14; !- Block 2 Cost per Unit Value or Variable Name + + UtilityCost:Qualify, + MinDemand400kw, !- Utility Cost Qualify Name + ReliantEnergy_PTB-LGS_LargeGeneral, !- Tariff Name + TotalDemand, !- Variable Name + Minimum, !- Qualify Type + 400, !- Threshold Value or Variable Name + Annual, !- Season + Count, !- Threshold Test + 12; !- Number of Months + + UtilityCost:Charge:Simple, + TaxofEightPtTwoFivePercent, !- Utility Cost Charge Simple Name + ReliantEnergy_PTB-LGS_LargeGeneral, !- Tariff Name + SubTotal, !- Source Variable + Annual, !- Season + Taxes, !- Category Variable Name + 0.0825; !- Cost per Unit Value or Variable Name + +!end ReliantEnergy_PTB-LGS_LargeGeneral + + UtilityCost:Tariff, + ReliantEnergy_PTB-MGS_MiscGeneral, !- Name + Electricity:Facility, !- Output Meter Name + kWh, !- Conversion Factor Choice + , !- Energy Conversion Factor + , !- Demand Conversion Factor + , !- Time of Use Period Schedule Name + ReliantEnergySeasonSched,!- Season Schedule Name + , !- Month Schedule Name + halfHour, !- Demand Window Length + 18.82, !- Monthly Charge or Variable Name + , !- Minimum Monthly Charge or Variable Name + , !- Real Time Pricing Charge Schedule Name + , !- Customer Baseline Load Schedule Name + Comm Elect; !- Group Name + + UtilityCost:Charge:Simple, + SummerFuelEnergyCharge, !- Utility Cost Charge Simple Name + ReliantEnergy_PTB-MGS_MiscGeneral, !- Tariff Name + totalEnergy, !- Source Variable + Summer, !- Season + EnergyCharges, !- Category Variable Name + 0.0823; !- Cost per Unit Value or Variable Name + + UtilityCost:Charge:Block, + SummerBaseEnergycharge, !- Utility Cost Charge Block Name + ReliantEnergy_PTB-MGS_MiscGeneral, !- Tariff Name + TotalEnergy, !- Source Variable + Summer, !- Season + EnergyCharges, !- Category Variable Name + , !- Remaining Into Variable + TotalDemand, !- Block Size Multiplier Value or Variable Name + 125, !- Block Size 1 Value or Variable Name + 0.0521, !- Block 1 Cost per Unit Value or Variable Name + 170, !- Block Size 2 Value or Variable Name + 0.0317, !- Block 2 Cost per Unit Value or Variable Name + remaining, !- Block Size 3 Value or Variable Name + 0.0055; !- Block 3 Cost per Unit Value or Variable Name + + UtilityCost:Charge:Simple, + WinterFuelEnergyCharge, !- Utility Cost Charge Simple Name + ReliantEnergy_PTB-MGS_MiscGeneral, !- Tariff Name + totalEnergy, !- Source Variable + Winter, !- Season + EnergyCharges, !- Category Variable Name + 0.0485; !- Cost per Unit Value or Variable Name + + UtilityCost:Charge:Block, + SummerBaseEnergycharge, !- Utility Cost Charge Block Name + ReliantEnergy_PTB-MGS_MiscGeneral, !- Tariff Name + TotalEnergy, !- Source Variable + Summer, !- Season + EnergyCharges, !- Category Variable Name + , !- Remaining Into Variable + TotalDemand, !- Block Size Multiplier Value or Variable Name + 125, !- Block Size 1 Value or Variable Name + 0.0504, !- Block 1 Cost per Unit Value or Variable Name + 170, !- Block Size 2 Value or Variable Name + 0.0317, !- Block 2 Cost per Unit Value or Variable Name + remaining, !- Block Size 3 Value or Variable Name + 0.0055; !- Block 3 Cost per Unit Value or Variable Name + + UtilityCost:Charge:Block, + AnnualDemandCharge, !- Utility Cost Charge Block Name + ReliantEnergy_PTB-MGS_MiscGeneral, !- Tariff Name + TotalDemand, !- Source Variable + Annual, !- Season + DemandCharges, !- Category Variable Name + , !- Remaining Into Variable + TotalDemand, !- Block Size Multiplier Value or Variable Name + 10, !- Block Size 1 Value or Variable Name + 0.0, !- Block 1 Cost per Unit Value or Variable Name + remaining, !- Block Size 2 Value or Variable Name + 3.04; !- Block 2 Cost per Unit Value or Variable Name + + UtilityCost:Qualify, + MaxDemand400kw, !- Utility Cost Qualify Name + ReliantEnergy_PTB-MGS_MiscGeneral, !- Tariff Name + TotalDemand, !- Variable Name + Maximum, !- Qualify Type + 400, !- Threshold Value or Variable Name + Annual, !- Season + Count, !- Threshold Test + 1; !- Number of Months + + UtilityCost:Charge:Simple, + TaxofEightPtTwoFivePercent, !- Utility Cost Charge Simple Name + ReliantEnergy_PTB-MGS_MiscGeneral, !- Tariff Name + SubTotal, !- Source Variable + Annual, !- Season + Taxes, !- Category Variable Name + 0.0825; !- Cost per Unit Value or Variable Name + +!end ReliantEnergy_PTB-MGS_MiscGeneral + + FuelFactors, + Electricity, !- Existing Fuel Resource Name + kg, !- Units of Measure + , !- Energy per Unit Factor + 3.712, !- Source Energy Factor {J/J} + , !- Source Energy Schedule Name + 184.46090, !- CO2 Emission Factor {g/MJ} + , !- CO2 Emission Factor Schedule Name + 9.63405E+03, !- CO Emission Factor {g/MJ} + , !- CO Emission Factor Schedule Name + 9.70184E-04, !- CH4 Emission Factor {g/MJ} + , !- CH4 Emission Factor Schedule Name + 3.27720E-01, !- NOx Emission Factor {g/MJ} + , !- NOx Emission Factor Schedule Name + 1.83957E-03, !- N2O Emission Factor {g/MJ} + , !- N2O Emission Factor Schedule Name + 4.90888E-01, !- SO2 Emission Factor {g/MJ} + , !- SO2 Emission Factor Schedule Name + 1.73147E-02, !- PM Emission Factor {g/MJ} + , !- PM Emission Factor Schedule Name + 1.71765E-02, !- PM10 Emission Factor {g/MJ} + , !- PM10 Emission Factor Schedule Name + 1.38283E-04, !- PM2.5 Emission Factor {g/MJ} + , !- PM2.5 Emission Factor Schedule Name + 1.26310E-03, !- NH3 Emission Factor {g/MJ} + , !- NH3 Emission Factor Schedule Name + 4.32150E-03, !- NMVOC Emission Factor {g/MJ} + , !- NMVOC Emission Factor Schedule Name + 3.52794E-06, !- Hg Emission Factor {g/MJ} + , !- Hg Emission Factor Schedule Name + 0, !- Pb Emission Factor {g/MJ} + , !- Pb Emission Factor Schedule Name + 0.45499, !- Water Emission Factor {L/MJ} + , !- Water Emission Factor Schedule Name + 0, !- Nuclear High Level Emission Factor {g/MJ} + , !- Nuclear High Level Emission Factor Schedule Name + 0; !- Nuclear Low Level Emission Factor {m3/MJ} + + UtilityCost:Tariff, + TX_EIAMonthlyRateGas, !- Name + NaturalGas:Facility, !- Output Meter Name + MCF, !- Conversion Factor Choice + , !- Energy Conversion Factor + , !- Demand Conversion Factor + , !- Time of Use Period Schedule Name + , !- Season Schedule Name + , !- Month Schedule Name + , !- Demand Window Length + 0.0, !- Monthly Charge or Variable Name + , !- Minimum Monthly Charge or Variable Name + , !- Real Time Pricing Charge Schedule Name + , !- Customer Baseline Load Schedule Name + Comm Gas; !- Group Name + + UtilityCost:Charge:Simple, + MonthlyRateGasCharge, !- Utility Cost Charge Simple Name + TX_EIAMonthlyRateGas, !- Tariff Name + totalEnergy, !- Source Variable + Annual, !- Season + EnergyCharges, !- Category Variable Name + TX_MonthlyGasRates; !- Cost per Unit Value or Variable Name + + UtilityCost:Variable, + TX_MonthlyGasRates, !- Name + TX_EIAMonthlyRateGas, !- Tariff Name + Currency, !- Variable Type + 7.87, !- January Value + 7.73, !- February Value + 7.41, !- March Value + 7.86, !- April Value + 8.05, !- May Value + 8.75, !- June Value + 8.21, !- July Value + 8.34, !- August Value + 8.04, !- September Value + 7.65, !- October Value + 8.24, !- November Value + 7.99; !- December Value + + UtilityCost:Charge:Simple, + TaxofEightPtTwoFivePercent, !- Utility Cost Charge Simple Name + TX_EIAMonthlyRateGas, !- Tariff Name + SubTotal, !- Source Variable + Annual, !- Season + Taxes, !- Category Variable Name + 0.0825; !- Cost per Unit Value or Variable Name + + Output:Surfaces:Drawing,dxf; + + Output:VariableDictionary,IDF; + + Output:Constructions,Constructions; + + OutputControl:Table:Style, + HTML; !- Column Separator + + Output:Table:SummaryReports, + AllSummary; !- Report 1 Name + + Output:Table:Monthly, + Load Center Performance Summary, !- Name + 2, !- Digits After Decimal + Electric Load Center Produced Electricity Rate, !- Variable or Meter 1 Name + HoursNonZero, !- Aggregation Type for Variable or Meter 1 + Electric Load Center Produced Electricity Rate, !- Variable or Meter 2 Name + SumOrAverageDuringHoursShown; !- Aggregation Type for Variable or Meter 2 + + Output:Table:Monthly, + PV Performance Summary, !- Name + 2, !- Digits After Decimal + Generator Produced DC Electricity Rate, !- Variable or Meter 1 Name + HoursNonZero, !- Aggregation Type for Variable or Meter 1 + Generator Produced DC Electricity Rate, !- Variable or Meter 2 Name + SumOrAverageDuringHoursShown, !- Aggregation Type for Variable or Meter 2 + Generator PV Array Efficiency, !- Variable or Meter 3 Name + SumOrAverageDuringHoursShown, !- Aggregation Type for Variable or Meter 3 + Generator Produced DC Electricity Energy, !- Variable or Meter 4 Name + SumOrAverageDuringHoursShown; !- Aggregation Type for Variable or Meter 4 + + Output:Table:Monthly, + Inverter Performance Summary, !- Name + 3, !- Digits After Decimal + Inverter DC Input Electricity Rate, !- Variable or Meter 1 Name + HoursNonZero, !- Aggregation Type for Variable or Meter 1 + Inverter DC Input Electricity Rate, !- Variable or Meter 2 Name + SumOrAverageDuringHoursShown, !- Aggregation Type for Variable or Meter 2 + Inverter AC Output Electricity Rate, !- Variable or Meter 3 Name + SumOrAverageDuringHoursShown, !- Aggregation Type for Variable or Meter 3 + Inverter Thermal Loss Rate, !- Variable or Meter 4 Name + SumOrAverageDuringHoursShown, !- Aggregation Type for Variable or Meter 4 + Inverter DC to AC Efficiency, !- Variable or Meter 5 Name + SumOrAverageDuringHoursShown, !- Aggregation Type for Variable or Meter 5 + Inverter Thermal Loss Rate, !- Variable or Meter 6 Name + SumOrAverageDuringHoursShown; !- Aggregation Type for Variable or Meter 6 + + Output:Table:Monthly, + Electric Storage Performance Summary, !- Name + 2, !- Digits After Decimal + Electric Storage Charge Power, !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Electric Storage Charge Energy, !- Variable or Meter 2 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 2 + Electric Storage Discharge Power, !- Variable or Meter 3 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 3 + Electric Storage Discharge Energy, !- Variable or Meter 4 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 4 + Electric Storage Thermal Loss Rate, !- Variable or Meter 5 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 5 + Electric Storage Thermal Loss Energy, !- Variable or Meter 6 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 6 + Electric Storage Battery Charge State, !- Variable or Meter 7 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 7 + + Output:Table:Monthly, + AC Power Summary, !- Name + 3, !- Digits After Decimal + Facility Total Purchased Electricity Rate, !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Facility Net Purchased Electricity Rate, !- Variable or Meter 2 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 2 + Facility Total Produced Electricity Rate, !- Variable or Meter 3 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 3 + Facility Total Electricity Demand Rate, !- Variable or Meter 4 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 4 + Facility Total Building Electricity Demand Rate, !- Variable or Meter 5 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 5 + Facility Total HVAC Electricity Demand Rate, !- Variable or Meter 6 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 6 + + !!********************************************* + + ElectricLoadCenter:Distribution, + PV Array Load Center, !- Name + Generator List, !- Generator List Name + TrackElectrical, !- Generator Operation Scheme Type + 0, !- Generator Demand Limit Scheme Purchased Electric Demand Limit {W} + , !- Generator Track Schedule Name Scheme Schedule Name + , !- Generator Track Meter Scheme Meter Name + DirectCurrentWithInverterDCStorage, !- Electrical Buss Type + PV Inverter, !- Inverter Name + LiIonBattery, !- Electrical Storage Object Name + , !- Transformer Object Name + TrackFacilityElectricDemandStoreExcessOnSite, !- Storage Operation Scheme + , !- Storage Control Track Meter Name + , !- Storage Converter Object Name + 0.95, !- Maximum Storage State of Charge Fraction + 0.20; !- Minimum Storage State of Charge Fraction + + Curve:DoubleExponentialDecay, + Doubleexponential, !- Name + 1380, !- Coefficient1 C1 + 6834, !- Coefficient2 C2 + -8.75, !- Coefficient3 C3 + 6747, !- Coefficient4 C4 + -6.22, !- Coefficient5 C5 + 0, !- Minimum Value of x + 1, !- Maximum Value of x + , !- Minimum Curve Output + , !- Maximum Curve Output + Dimensionless, !- Input Unit Type for x + Dimensionless; !- Output Unit Type + + ElectricLoadCenter:Storage:LiIonNMCBattery, + LiIonBattery, !- Name + ALWAYS_ON, !- Availability Schedule Name + , !- Zone Name + 0, !- Radiative Fraction + KandlerSmith, !- Lifetime Model + 139, !- Number of Cells in Series + 25, !- Number of Strings in Parallel + 0.7, !- Initial Fractional State of Charge + , !- DC to DC Charging Efficiency + 342, !- Battery Mass + 4.26, !- Battery Surface Area + , !- Battery Specific Heat Capacity + ; !- Heat Transfer Coefficient Between Battery and Ambient + + ElectricLoadCenter:Inverter:LookUpTable, + PV Inverter, !- Name + ALWAYS_ON, !- Availability Schedule Name + , !- Zone Name + 0.25, !- Radiative Fraction + 14000, !- Rated Maximum Continuous Output Power {W} + 200.0, !- Night Tare Loss Power {W} + 368, !- Nominal Voltage Input {V} + 0.839, !- Efficiency at 10% Power and Nominal Voltage + 0.897, !- Efficiency at 20% Power and Nominal Voltage + 0.916, !- Efficiency at 30% Power and Nominal Voltage + 0.931, !- Efficiency at 50% Power and Nominal Voltage + 0.934, !- Efficiency at 75% Power and Nominal Voltage + 0.930; !- Efficiency at 100% Power and Nominal Voltage + + ElectricLoadCenter:Generators, + Generator List, !- Name + PV:ZN_1_FLR_1_SEC_1_Ceiling, !- Generator 1 Name + Generator:Photovoltaic, !- Generator 1 Object Type + 9000.0, !- Generator 1 Rated Electric Power Output {W} + , !- Generator 1 Availability Schedule Name + , !- Generator 1 Rated Thermal to Electrical Power Ratio + PV:ZN_1_FLR_1_SEC_2_Ceiling, !- Generator 2 Name + Generator:Photovoltaic, !- Generator 2 Object Type + 6000.0, !- Generator 2 Rated Electric Power Output {W} + , !- Generator 2 Availability Schedule Name + , !- Generator 2 Rated Thermal to Electrical Power Ratio + PV:ZN_1_FLR_1_SEC_3_Ceiling, !- Generator 3 Name + Generator:Photovoltaic, !- Generator 3 Object Type + 9000.0, !- Generator 3 Rated Electric Power Output {W} + , !- Generator 3 Availability Schedule Name + , !- Generator 3 Rated Thermal to Electrical Power Ratio + PV:ZN_1_FLR_1_SEC_4_Ceiling, !- Generator 4 Name + Generator:Photovoltaic, !- Generator 4 Object Type + 6000.0, !- Generator 4 Rated Electric Power Output {W} + , !- Generator 4 Availability Schedule Name + , !- Generator 4 Rated Thermal to Electrical Power Ratio + PV:ZN_1_FLR_1_SEC_5_Ceiling, !- Generator 5 Name + Generator:Photovoltaic, !- Generator 5 Object Type + 9000.0, !- Generator 5 Rated Electric Power Output {W} + , !- Generator 5 Availability Schedule Name + ; !- Generator 5 Rated Thermal to Electrical Power Ratio + + Generator:Photovoltaic, + PV:ZN_1_FLR_1_SEC_1_Ceiling, !- Name + ZN_1_FLR_1_SEC_1_Ceiling,!- Surface Name + PhotovoltaicPerformance:Simple, !- Photovoltaic Performance Object Type + 20percentEffPVhalfArea, !- Module Performance Name + Decoupled, !- Heat Transfer Integration Mode + 1.0, !- Number of Series Strings in Parallel {dimensionless} + 1.0; !- Number of Modules in Series {dimensionless} + + PhotovoltaicPerformance:Simple, + 20percentEffPVhalfArea, !- Name + 0.5, !- Fraction of Surface Area with Active Solar Cells {dimensionless} + Fixed, !- Conversion Efficiency Input Mode + 0.20, !- Value for Cell Efficiency if Fixed + ; !- Efficiency Schedule Name + + ComponentCost:LineItem, + PV:ZN_1_FLR_1_SEC_1_Ceiling, !- Name + , !- Type + Generator:Photovoltaic, !- Line Item Type + PV:ZN_1_FLR_1_SEC_1_Ceiling, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + , !- Cost per Area {$/m2} + 9000.0000, !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + Generator:Photovoltaic, + PV:ZN_1_FLR_1_SEC_2_Ceiling, !- Name + ZN_1_FLR_1_SEC_2_Ceiling,!- Surface Name + PhotovoltaicPerformance:Simple, !- Photovoltaic Performance Object Type + 20percentEffPVhalfArea, !- Module Performance Name + Decoupled, !- Heat Transfer Integration Mode + 1.0, !- Number of Series Strings in Parallel {dimensionless} + 1.0; !- Number of Modules in Series {dimensionless} + + ComponentCost:LineItem, + PV:ZN_1_FLR_1_SEC_2_Ceiling, !- Name + , !- Type + Generator:Photovoltaic, !- Line Item Type + PV:ZN_1_FLR_1_SEC_2_Ceiling, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + , !- Cost per Area {$/m2} + 9000.0000, !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + Generator:Photovoltaic, + PV:ZN_1_FLR_1_SEC_3_Ceiling, !- Name + ZN_1_FLR_1_SEC_3_Ceiling,!- Surface Name + PhotovoltaicPerformance:Simple, !- Photovoltaic Performance Object Type + 20percentEffPVhalfArea, !- Module Performance Name + Decoupled, !- Heat Transfer Integration Mode + 1.0, !- Number of Series Strings in Parallel {dimensionless} + 1.0; !- Number of Modules in Series {dimensionless} + + ComponentCost:LineItem, + PV:ZN_1_FLR_1_SEC_3_Ceiling, !- Name + , !- Type + Generator:Photovoltaic, !- Line Item Type + PV:ZN_1_FLR_1_SEC_3_Ceiling, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + , !- Cost per Area {$/m2} + 9000.0000, !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + Generator:Photovoltaic, + PV:ZN_1_FLR_1_SEC_4_Ceiling, !- Name + ZN_1_FLR_1_SEC_4_Ceiling,!- Surface Name + PhotovoltaicPerformance:Simple, !- Photovoltaic Performance Object Type + 20percentEffPVhalfArea, !- Module Performance Name + Decoupled, !- Heat Transfer Integration Mode + 1.0, !- Number of Series Strings in Parallel {dimensionless} + 1.0; !- Number of Modules in Series {dimensionless} + + ComponentCost:LineItem, + PV:ZN_1_FLR_1_SEC_4_Ceiling, !- Name + , !- Type + Generator:Photovoltaic, !- Line Item Type + PV:ZN_1_FLR_1_SEC_4_Ceiling, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + , !- Cost per Area {$/m2} + 9000.0000, !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + Generator:Photovoltaic, + PV:ZN_1_FLR_1_SEC_5_Ceiling, !- Name + ZN_1_FLR_1_SEC_5_Ceiling,!- Surface Name + PhotovoltaicPerformance:Simple, !- Photovoltaic Performance Object Type + 20percentEffPVhalfArea, !- Module Performance Name + Decoupled, !- Heat Transfer Integration Mode + 1.0, !- Number of Series Strings in Parallel {dimensionless} + 1.0; !- Number of Modules in Series {dimensionless} + + ComponentCost:LineItem, + PV:ZN_1_FLR_1_SEC_5_Ceiling, !- Name + , !- Type + Generator:Photovoltaic, !- Line Item Type + PV:ZN_1_FLR_1_SEC_5_Ceiling, !- Item Name + , !- Object End-Use Key + , !- Cost per Each {$} + , !- Cost per Area {$/m2} + 9000.0000, !- Cost per Unit of Output Capacity {$/kW} + , !- Cost per Unit of Output Capacity per COP {$/kW} + , !- Cost per Volume {$/m3} + , !- Cost per Volume Rate {$/(m3/s)} + , !- Cost per Energy per Temperature Difference {$/(W/K)} + ; !- Quantity {dimensionless} + + Output:Variable,*,Inverter DC to AC Efficiency,timestep; + + Output:Variable,*,Inverter DC Input Electricity Rate,timestep; + + Output:Variable,*,Inverter DC Input Electricity Energy,timestep; + + Output:Variable,*,Inverter AC Output Electricity Rate,timestep; + + Output:Variable,*,Electric Storage Degradation Fraction,timestep; + + Output:Variable,*,Electric Storage Charge Fraction,timestep; + + Output:Variable,*,Electric Storage Operating Mode Index,timestep; + + Output:Variable,*,Electric Storage Battery Charge State,timestep; + + Output:Variable,*,Electric Storage Charge Power,timestep; + + Output:Variable,*,Electric Storage Charge Energy,timestep; + + Output:Variable,*,Electric Storage Discharge Power,timestep; + + Output:Variable,*,Electric Storage Discharge Energy,timestep; + + Output:Variable,*,Electric Storage Thermal Loss Rate,timestep; + + Output:Variable,*,Electric Storage Thermal Loss Energy,timestep; + + Output:Variable,*,Electric Storage Total Current,timestep; + + Output:Variable,*,Electric Storage Total Voltage,timestep; + + Output:Variable,*,Electric Storage Battery Temperature,timestep; + + Output:Variable,*,Electric Load Center Produced Electricity Rate,timestep; + + Output:Variable,*,Electric Load Center Produced Electricity Energy,timestep; + + Output:Variable,*,Electric Load Center Produced Thermal Rate,timestep; + + Output:Variable,*,Electric Load Center Produced Thermal Energy,timestep; + + Output:Variable,*,Facility Total Purchased Electricity Rate,timestep; + + Output:Variable,*,Facility Total Purchased Electricity Energy,timestep; + + Output:Variable,*,Facility Total Surplus Electricity Energy,timestep; + + Output:Variable,*,Facility Net Purchased Electricity Rate,timestep; + + Output:Variable,*,Facility Net Purchased Electricity Energy,timestep; + + Output:Variable,*,Facility Total Building Electricity Demand Rate,timestep; + + Output:Variable,*,Facility Total HVAC Electricity Demand Rate,timestep; + + Output:Variable,*,Facility Total Electricity Demand Rate,timestep; + + Output:Variable,*,Facility Total Produced Electricity Rate,timestep; + + Output:Variable,*,Facility Total Produced Electricity Energy,timestep; + + Output:Variable,*,Generator Produced DC Electricity Rate,timestep; + + Output:Variable,*,Generator Produced DC Electricity Energy,timestep; + + Output:Variable,*,Generator PV Array Efficiency,timestep; + + Output:Variable,*,Generator Requested Electricity Rate,timestep; + + Output:Variable,*,Cooling Coil Electricity Rate,timestep; + + Output:SQLite, + Simple; !- Option Type + +!***** Portions of this file originally Generated by EPXMLPreproc2 ***** +!***** Created on 06/07/2007 02:53:27 ***** +!***** Input File produced by the EnergyPlus Model Example File Generator ***** +!***** Disclaimer & Notice: ***** +!***** The EnergyPlus Example File Generator ("EEFG") is provided by the ***** +!***** National Renewable Energy Laboratory ("NREL") operated by Midwest ***** +!***** Research Institute for the U.S. Department of Energy ("DOE"). ***** +!***** Access to and use of the EEFG shall impose the following obligations ***** +!***** on the user. The user agrees to credit NREL/MRI in any publication(s) ***** +!***** that result from the use of EEFG. The names NREL/MRI/DOE, however, may ***** +!***** not be used in any advertising or publicity to endorse or promote ***** +!***** any products, services or commercial entities unless specific written ***** +!***** permission is obtained from NREL/MRI/DOE. ***** +!***** EEFG IS PROVIDED BY NREL/MRI "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 NREL/MRI/DOE BE LIABLE FOR ANY ***** +!***** SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER, ***** +!***** INCLUDING BUT NOT LIMITED TO CLAIMS ASSOCIATED WITH THE LOSS OF DATA ***** +!***** OR PROFITS, WHICH MAY RESULT FROM AN ACTION IN CONTRACT, NEGLIGENCE ***** +!***** OR OTHER TORTIOUS CLAIM THAT ARISES OUT OF OR IN CONNECTION ***** +!***** WITH THE ACCESS, USE OR PERFORMANCE OF THE EEFG. ***** +!***** Please help us to improve this service. If you have suggestions for ***** +!***** improving this input file, please contact us at ewi_support@nrel.gov. ***** +! Start SimMetaData +! WeatherFileName=USA_OK_Oklahoma.City_TMY2.epw +! CodeStandard=ASHRAE 90.1-2004 +! Std62Version=2004 +! RoofConstruction=Insulation Entirely Above Deck +! ExtWallConstruction=Steel-Framed +! End SimMetaData diff --git a/testfiles/SingleFamilyHouse_HP_Slab.idf b/testfiles/SingleFamilyHouse_HP_Slab.idf new file mode 100644 index 00000000000..9bfe44295e0 --- /dev/null +++ b/testfiles/SingleFamilyHouse_HP_Slab.idf @@ -0,0 +1,5453 @@ +!-Generator IDFEditor 1.51 +!-Option SortedOrder UseSpecialFormat + +!-NOTE: All comments with '!-' are ignored by the IDFEditor and are generated automatically. +!- Use '!' comments if they need to be retained when using the IDFEditor. + + +!- =========== ALL OBJECTS IN CLASS: VERSION =========== + +Version,9.5; + +!- =========== ALL OBJECTS IN CLASS: SIMULATIONCONTROL =========== + + +SimulationControl, + Yes, !- Do Zone Sizing Calculation + Yes, !- Do System Sizing Calculation + No, !- Do Plant Sizing Calculation + Yes, !- Run Simulation for Sizing Periods + Yes, !- Run Simulation for Weather File Run Periods + , !- Do HVAC Sizing Simulation for Sizing Periods + ; !- Maximum Number of HVAC Sizing Simulation Passes + + +!- =========== ALL OBJECTS IN CLASS: BUILDING =========== + +Building, + SF_CZ8_HP_SLAB, !- Name + 0, !- North Axis {deg} + Suburbs, !- Terrain + 0.04, !- Loads Convergence Tolerance Value {W} + 0.4, !- Temperature Convergence Tolerance Value {deltaC} + FullExterior, !- Solar Distribution + 25, !- Maximum Number of Warmup Days + 6; !- Minimum Number of Warmup Days + + +!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:INSIDE =========== + +SurfaceConvectionAlgorithm:Inside,TARP; + +!- =========== ALL OBJECTS IN CLASS: TIMESTEP =========== + +Timestep,6; + +!- =========== ALL OBJECTS IN CLASS: SITE:LOCATION =========== + + +Site:Location, + Fairbanks Intl Arpt_AK_USA Design_Conditions, !- Name + 64.82, !- Latitude {deg} + -147.85, !- Longitude {deg} + -9.00, !- Time Zone {hr} + 133.00; !- Elevation {m} + + +!- =========== ALL OBJECTS IN CLASS: SIZINGPERIOD:DESIGNDAY =========== + +SizingPeriod:DesignDay, + Fairbanks Intl Arpt Ann Htg 99.6% Condns DB, !- Name + 1, !- Month + 21, !- Day of Month + WinterDesignDay, !- Day Type + -41.9, !- Maximum Dry-Bulb Temperature {C} + 0.0, !- Daily Dry-Bulb Temperature Range {deltaC} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + -41.9, !- 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} + 99737., !- Barometric Pressure {Pa} + 0.3, !- Wind Speed {m/s} + 20, !- 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 + +SizingPeriod:DesignDay, + Fairbanks Intl Arpt Ann Clg .4% Condns DB=>MWB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay, !- Day Type + 27.4, !- Maximum Dry-Bulb Temperature {C} + 10.2, !- Daily Dry-Bulb Temperature Range {deltaC} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 16.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} + 99737., !- Barometric Pressure {Pa} + 3.1, !- Wind Speed {m/s} + 180, !- Wind Direction {deg} + No, !- Rain Indicator + No, !- Snow Indicator + No, !- Daylight Saving Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.387, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} + 2.212; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} + + +!- =========== ALL OBJECTS IN CLASS: RUNPERIOD =========== + +RunPeriod, + annual, !- Name + 1, !- Begin Month + 1, !- Begin Day of Month + , !- Begin Year + 12, !- End Month + 31, !- End Day of Month + , !- End Year + Sunday, !- Day of Week for Start Day + Yes, !- Use Weather File Holidays and Special Days + Yes, !- Use Weather File Daylight Saving Period + No, !- Apply Weekend Holiday Rule + Yes, !- Use Weather File Rain Indicators + Yes; !- Use Weather File Snow Indicators + + +!- =========== ALL OBJECTS IN CLASS: SITE:WATERMAINSTEMPERATURE =========== + +Site:WaterMainsTemperature, + Correlation, !- Calculation Method + , !- Temperature Schedule Name + -1.525, !- Annual Average Outdoor Air Temperature {C} + 36.2; !- Maximum Difference In Monthly Average Outdoor Air Temperatures {deltaC} + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULETYPELIMITS =========== + +ScheduleTypeLimits, + any number; !- Name + +ScheduleTypeLimits, + On/Off, !- Name + 0, !- Lower Limit Value + 1, !- Upper Limit Value + Discrete; !- Numeric Type + +ScheduleTypeLimits, + control_type, !- Name + 0, !- Lower Limit Value + 4, !- Upper Limit Value + Discrete; !- Numeric Type + +ScheduleTypeLimits, + fraction, !- Name + 0, !- Lower Limit Value + 1, !- Upper Limit Value + Continuous; !- Numeric Type + +ScheduleTypeLimits, + Temperature, !- Name + -60, !- Lower Limit Value + 200, !- Upper Limit Value + Continuous; !- Numeric Type + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULE:DAY:HOURLY =========== + +Schedule:Day:Hourly, + OccupancyDay, !- Name + Fraction, !- Schedule Type Limits Name + 1.00000, !- Hour 1 + 1.00000, !- Hour 2 + 1.00000, !- Hour 3 + 1.00000, !- Hour 4 + 1.00000, !- Hour 5 + 1.00000, !- Hour 6 + 1.00000, !- Hour 7 + 0.88310, !- Hour 8 + 0.40861, !- Hour 9 + 0.24189, !- Hour 10 + 0.24189, !- Hour 11 + 0.24189, !- Hour 12 + 0.24189, !- Hour 13 + 0.24189, !- Hour 14 + 0.24189, !- Hour 15 + 0.24189, !- Hour 16 + 0.29498, !- Hour 17 + 0.55310, !- Hour 18 + 0.89693, !- Hour 19 + 0.89693, !- Hour 20 + 0.89693, !- Hour 21 + 1.00000, !- Hour 22 + 1.00000, !- Hour 23 + 1.00000; !- Hour 24 + +Schedule:Day:Hourly, + LightingDay, !- Name + Fraction, !- Schedule Type Limits Name + 0.0625, !- Hour 1 + 0.0625, !- Hour 2 + 0.0625, !- Hour 3 + 0.0625, !- Hour 4 + 0.1875, !- Hour 5 + 0.390625, !- Hour 6 + 0.4375, !- Hour 7 + 0.390625, !- Hour 8 + 0.171875, !- Hour 9 + 0.1171875, !- Hour 10 + 0.1171875, !- Hour 11 + 0.1171875, !- Hour 12 + 0.1171875, !- Hour 13 + 0.1171875, !- Hour 14 + 0.1171875, !- Hour 15 + 0.203125, !- Hour 16 + 0.4375, !- Hour 17 + 0.609375, !- Hour 18 + 0.8203125, !- Hour 19 + 0.984375, !- Hour 20 + 1, !- Hour 21 + 0.6875, !- Hour 22 + 0.3828125, !- Hour 23 + 0.15625; !- Hour 24 + +Schedule:Day:Hourly, + LightingDay_EELighting_OccSensors, !- Name + Fraction, !- Schedule Type Limits Name + 0.065170403, !- Hour 1 + 0.065170403, !- Hour 2 + 0.065170403, !- Hour 3 + 0.065170403, !- Hour 4 + 0.195511208, !- Hour 5 + 0.407315016, !- Hour 6 + 0.456192818, !- Hour 7 + 0.407315016, !- Hour 8 + 0.179218607, !- Hour 9 + 0.122194505, !- Hour 10 + 0.122194505, !- Hour 11 + 0.122194505, !- Hour 12 + 0.122194505, !- Hour 13 + 0.122194505, !- Hour 14 + 0.122194505, !- Hour 15 + 0.211803808, !- Hour 16 + 0.456192818, !- Hour 17 + 0.635411425, !- Hour 18 + 0.855361533, !- Hour 19 + 0.947933128, !- Hour 20 + 0.947933128, !- Hour 21 + 0.716874428, !- Hour 22 + 0.399168715, !- Hour 23 + 0.162926006; !- Hour 24 + +Schedule:Day:Hourly, + LightingDay_EELighting_Garage_OccSensors, !- Name + Fraction, !- Schedule Type Limits Name + 0.048125, !- Hour 1 + 0.048125, !- Hour 2 + 0.048125, !- Hour 3 + 0.048125, !- Hour 4 + 0.144375, !- Hour 5 + 0.30078125, !- Hour 6 + 0.336875, !- Hour 7 + 0.30078125, !- Hour 8 + 0.13234375, !- Hour 9 + 0.090234375, !- Hour 10 + 0.090234375, !- Hour 11 + 0.090234375, !- Hour 12 + 0.090234375, !- Hour 13 + 0.090234375, !- Hour 14 + 0.090234375, !- Hour 15 + 0.15640625, !- Hour 16 + 0.336875, !- Hour 17 + 0.46921875, !- Hour 18 + 0.631640625, !- Hour 19 + 0.7, !- Hour 20 + 0.7, !- Hour 21 + 0.529375, !- Hour 22 + 0.294765625, !- Hour 23 + 0.1203125; !- Hour 24 + +Schedule:Day:Hourly, + ExteriorLightingDay, !- Name + Fraction, !- Schedule Type Limits Name + 1, !- Hour 1 + 1, !- Hour 2 + 1, !- Hour 3 + 1, !- Hour 4 + 1, !- Hour 5 + 1, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 1, !- Hour 19 + 1, !- Hour 20 + 1, !- Hour 21 + 1, !- Hour 22 + 1, !- Hour 23 + 1; !- Hour 24 + +Schedule:Day:Hourly, + LightingDay_EELighting, !- Name + Fraction, !- Schedule Type Limits Name + 0.06875, !- Hour 1 + 0.06875, !- Hour 2 + 0.06875, !- Hour 3 + 0.06875, !- Hour 4 + 0.20625, !- Hour 5 + 0.4296875, !- Hour 6 + 0.48125, !- Hour 7 + 0.4296875, !- Hour 8 + 0.1890625, !- Hour 9 + 0.12890625, !- Hour 10 + 0.12890625, !- Hour 11 + 0.12890625, !- Hour 12 + 0.12890625, !- Hour 13 + 0.12890625, !- Hour 14 + 0.12890625, !- Hour 15 + 0.2234375, !- Hour 16 + 0.48125, !- Hour 17 + 0.6703125, !- Hour 18 + 0.90234375, !- Hour 19 + 1, !- Hour 20 + 1, !- Hour 21 + 0.75625, !- Hour 22 + 0.42109375, !- Hour 23 + 0.171875; !- Hour 24 + +Schedule:Day:Hourly, + RefrigeratorDay, !- Name + Fraction, !- Schedule Type Limits Name + 0.8, !- Hour 1 + 0.782696177062374, !- Hour 2 + 0.765593561368209, !- Hour 3 + 0.742857142857143, !- Hour 4 + 0.731388329979879, !- Hour 5 + 0.731388329979879, !- Hour 6 + 0.759959758551308, !- Hour 7 + 0.8, !- Hour 8 + 0.817102615694165, !- Hour 9 + 0.828571428571429, !- Hour 10 + 0.8, !- Hour 11 + 0.8, !- Hour 12 + 0.839839034205231, !- Hour 13 + 0.839839034205231, !- Hour 14 + 0.828571428571429, !- Hour 15 + 0.839839034205231, !- Hour 16 + 0.885714285714286, !- Hour 17 + 0.971428571428572, !- Hour 18 + 1, !- Hour 19 + 0.971428571428572, !- Hour 20 + 0.942857142857143, !- Hour 21 + 0.925553319919517, !- Hour 22 + 0.885714285714286, !- Hour 23 + 0.828571428571429; !- Hour 24 + +Schedule:Day:Hourly, + MiscPlugLoadDay, !- Name + Fraction, !- Schedule Type Limits Name + 0.607490272373541, !- Hour 1 + 0.559338521400778, !- Hour 2 + 0.552853437094682, !- Hour 3 + 0.545071335927367, !- Hour 4 + 0.524481193255512, !- Hour 5 + 0.585278858625162, !- Hour 6 + 0.676232166018158, !- Hour 7 + 0.718547341115435, !- Hour 8 + 0.607490272373541, !- Hour 9 + 0.517023346303502, !- Hour 10 + 0.529182879377432, !- Hour 11 + 0.529345006485084, !- Hour 12 + 0.520428015564202, !- Hour 13 + 0.538424124513619, !- Hour 14 + 0.568741893644617, !- Hour 15 + 0.600356679636835, !- Hour 16 + 0.71011673151751, !- Hour 17 + 0.862678339818418, !- Hour 18 + 0.936608300907912, !- Hour 19 + 0.966763942931258, !- Hour 20 + 1, !- Hour 21 + 0.976653696498055, !- Hour 22 + 0.845168612191959, !- Hour 23 + 0.73443579766537; !- Hour 24 + +Schedule:Day:Hourly, + CookingRangeDay, !- Name + Fraction, !- Schedule Type Limits Name + 0.04715848452508, !- Hour 1 + 0.04715848452508, !- Hour 2 + 0.0235458911419424, !- Hour 3 + 0.0235458911419424, !- Hour 4 + 0.04715848452508, !- Hour 5 + 0.0707043756670224, !- Hour 6 + 0.165088046958378, !- Hour 7 + 0.283017609391676, !- Hour 8 + 0.306563500533618, !- Hour 9 + 0.320771077908218, !- Hour 10 + 0.283017609391676, !- Hour 11 + 0.330176093916756, !- Hour 12 + 0.377334578441836, !- Hour 13 + 0.306563500533618, !- Hour 14 + 0.292422625400213, !- Hour 15 + 0.377334578441836, !- Hour 16 + 0.613193703308431, !- Hour 17 + 1, !- Hour 18 + 0.778348452508004, !- Hour 19 + 0.400947171824973, !- Hour 20 + 0.235859124866596, !- Hour 21 + 0.165088046958378, !- Hour 22 + 0.103721985058698, !- Hour 23 + 0.0707043756670224; !- Hour 24 + +Schedule:Day:Hourly, + DishwasherWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.115858456545258, !- Hour 1 + 0.0514758745041469, !- Hour 2 + 0.0385691669671833, !- Hour 3 + 0.0257379372520738, !- Hour 4 + 0.0257379372520738, !- Hour 5 + 0.0772138117562207, !- Hour 6 + 0.154503101334295, !- Hour 7 + 0.23179239091237, !- Hour 8 + 0.437922322394519, !- Hour 9 + 0.489398196898665, !- Hour 10 + 0.425015614857555, !- Hour 11 + 0.360633032816445, !- Hour 12 + 0.309081680490443, !- Hour 13 + 0.347726325279481, !- Hour 14 + 0.28334374323837, !- Hour 15 + 0.270437035701407, !- Hour 16 + 0.28334374323837, !- Hour 17 + 0.373464262531554, !- Hour 18 + 0.656883483591778, !- Hour 19 + 0.837199999999997, !- Hour 20 + 0.682621420843852, !- Hour 21 + 0.502304904435629, !- Hour 22 + 0.334819617742518, !- Hour 23 + 0.23179239091237; !- Hour 24 + +Schedule:Day:Hourly, + DishwasherWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.124134060584205, !- Hour 1 + 0.0551527226830148, !- Hour 2 + 0.0413241074648395, !- Hour 3 + 0.0275763613415074, !- Hour 4 + 0.0275763613415074, !- Hour 5 + 0.0827290840245222, !- Hour 6 + 0.165539037143888, !- Hour 7 + 0.248348990263252, !- Hour 8 + 0.469202488279841, !- Hour 9 + 0.524355210962856, !- Hour 10 + 0.455373873061666, !- Hour 11 + 0.386392535160476, !- Hour 12 + 0.331158943382618, !- Hour 13 + 0.3725639199423, !- Hour 14 + 0.303582582041111, !- Hour 15 + 0.289753966822935, !- Hour 16 + 0.303582582041111, !- Hour 17 + 0.400140281283808, !- Hour 18 + 0.703803732419762, !- Hour 19 + 0.897, !- Hour 20 + 0.731380093761269, !- Hour 21 + 0.538183826181031, !- Hour 22 + 0.358735304724125, !- Hour 23 + 0.248348990263252; !- Hour 24 + +Schedule:Day:Hourly, + DishwasherVacation, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 0, !- Hour 19 + 0, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + ClothesWasherWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.0796474528960224, !- Hour 1 + 0.0637009071877185, !- Hour 2 + 0.0318078157711097, !- Hour 3 + 0.0318078157711097, !- Hour 4 + 0.0637009071877185, !- Hour 5 + 0.0955939986043261, !- Hour 6 + 0.191187997208654, !- Hour 7 + 0.414354361479414, !- Hour 8 + 0.62157418004187, !- Hour 9 + 0.7332, !- Hour 10 + 0.717253454291697, !- Hour 11 + 0.637520725750175, !- Hour 12 + 0.573734542916957, !- Hour 13 + 0.510033635729239, !- Hour 14 + 0.446247452896022, !- Hour 15 + 0.414354361479414, !- Hour 16 + 0.430300907187718, !- Hour 17 + 0.414354361479414, !- Hour 18 + 0.414354361479414, !- Hour 19 + 0.414354361479414, !- Hour 20 + 0.414354361479414, !- Hour 21 + 0.398407815771109, !- Hour 22 + 0.270920725750174, !- Hour 23 + 0.143433635729239; !- Hour 24 + +Schedule:Day:Hourly, + ClothesWasherWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.0974410327983253, !- Hour 1 + 0.0779319609211445, !- Hour 2 + 0.038913817166783, !- Hour 3 + 0.038913817166783, !- Hour 4 + 0.0779319609211445, !- Hour 5 + 0.116950104675506, !- Hour 6 + 0.233900209351012, !- Hour 7 + 0.506922889043964, !- Hour 8 + 0.760436496859734, !- Hour 9 + 0.897, !- Hour 10 + 0.877490928122819, !- Hour 11 + 0.779945568736915, !- Hour 12 + 0.701909281228193, !- Hour 13 + 0.623977320307048, !- Hour 14 + 0.545941032798325, !- Hour 15 + 0.506922889043964, !- Hour 16 + 0.526431960921144, !- Hour 17 + 0.506922889043964, !- Hour 18 + 0.506922889043964, !- Hour 19 + 0.506922889043964, !- Hour 20 + 0.506922889043964, !- Hour 21 + 0.487413817166783, !- Hour 22 + 0.331445568736915, !- Hour 23 + 0.175477320307048; !- Hour 24 + +Schedule:Day:Hourly, + ClothesWasherVacation, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 0, !- Hour 19 + 0, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + dhw_profile_day, !- Name + fraction, !- Schedule Type Limits Name + 0.006, !- Hour 1 + 0.003, !- Hour 2 + 0.001, !- Hour 3 + 0.001, !- Hour 4 + 0.003, !- Hour 5 + 0.021, !- Hour 6 + 0.075, !- Hour 7 + 0.079, !- Hour 8 + 0.076, !- Hour 9 + 0.067, !- Hour 10 + 0.061, !- Hour 11 + 0.05, !- Hour 12 + 0.042, !- Hour 13 + 0.038, !- Hour 14 + 0.033, !- Hour 15 + 0.038, !- Hour 16 + 0.043, !- Hour 17 + 0.058, !- Hour 18 + 0.068, !- Hour 19 + 0.065, !- Hour 20 + 0.06, !- Hour 21 + 0.047, !- Hour 22 + 0.041, !- Hour 23 + 0.024; !- Hour 24 + +Schedule:Day:Hourly, + ClothesDryerWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.0996818663838815, !- Hour 1 + 0.0598091198303289, !- Hour 2 + 0.0398727465535526, !- Hour 3 + 0.0199363732767763, !- Hour 4 + 0.0398727465535526, !- Hour 5 + 0.0598091198303289, !- Hour 6 + 0.15949098621421, !- Hour 7 + 0.31898197242842, !- Hour 8 + 0.486427370202556, !- Hour 9 + 0.685791102970318, !- Hour 10 + 0.785472969354199, !- Hour 11 + 0.817391304347826, !- Hour 12 + 0.745600222800647, !- Hour 13 + 0.677836691410393, !- Hour 14 + 0.610073160020138, !- Hour 15 + 0.578154825026511, !- Hour 16 + 0.558218451749735, !- Hour 17 + 0.546236490032885, !- Hour 18 + 0.518345705196183, !- Hour 19 + 0.510391293636256, !- Hour 20 + 0.526300116756109, !- Hour 21 + 0.546236490032885, !- Hour 22 + 0.438600212089077, !- Hour 23 + 0.239236479321316; !- Hour 24 + +Schedule:Day:Hourly, + ClothesDryerWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.121951219512195, !- Hour 1 + 0.0731707317073171, !- Hour 2 + 0.0487804878048781, !- Hour 3 + 0.024390243902439, !- Hour 4 + 0.0487804878048781, !- Hour 5 + 0.0731707317073171, !- Hour 6 + 0.195121951219512, !- Hour 7 + 0.390243902439024, !- Hour 8 + 0.59509731460951, !- Hour 9 + 0.8389997536339, !- Hour 10 + 0.960950973146095, !- Hour 11 + 1, !- Hour 12 + 0.912170485341217, !- Hour 13 + 0.829268292682927, !- Hour 14 + 0.746366100024637, !- Hour 15 + 0.707317073170732, !- Hour 16 + 0.682926829268293, !- Hour 17 + 0.668268046316827, !- Hour 18 + 0.634146341463415, !- Hour 19 + 0.624414880512441, !- Hour 20 + 0.643877802414388, !- Hour 21 + 0.668268046316827, !- Hour 22 + 0.536585365853659, !- Hour 23 + 0.292682926829268; !- Hour 24 + +Schedule:Day:Hourly, + ClothesDryerVacation, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 0, !- Hour 19 + 0, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + SinksWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.160052687884461, !- Hour 1 + 0.0767484287242575, !- Hour 2 + 0.0575330636533838, !- Hour 3 + 0.0575330636533838, !- Hour 4 + 0.0767484287242575, !- Hour 5 + 0.204926216902916, !- Hour 6 + 0.480271095212623, !- Hour 7 + 0.704412677186414, !- Hour 8 + 0.742843407328163, !- Hour 9 + 0.697969878309708, !- Hour 10 + 0.614778650708746, !- Hour 11 + 0.563462322813587, !- Hour 12 + 0.550689756619418, !- Hour 13 + 0.512259026477668, !- Hour 14 + 0.467385497459214, !- Hour 15 + 0.486600862530089, !- Hour 16 + 0.544246957742712, !- Hour 17 + 0.736400608451458, !- Hour 18 + 0.84525, !- Hour 19 + 0.781274137469912, !- Hour 20 + 0.640323783097085, !- Hour 21 + 0.544246957742712, !- Hour 22 + 0.44828316394758, !- Hour 23 + 0.307332809574753; !- Hour 24 + +Schedule:Day:Hourly, + SinksWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.169851832040653, !- Hour 1 + 0.0814473121155389, !- Hour 2 + 0.0610554961219577, !- Hour 3 + 0.0610554961219577, !- Hour 4 + 0.0814473121155389, !- Hour 5 + 0.217472719978604, !- Hour 6 + 0.509675447980744, !- Hour 7 + 0.747539983952929, !- Hour 8 + 0.788323615940091, !- Hour 9 + 0.74070272800214, !- Hour 10 + 0.652418159935812, !- Hour 11 + 0.597960016047071, !- Hour 12 + 0.58440545600428, !- Hour 13 + 0.543621824017117, !- Hour 14 + 0.496000936079166, !- Hour 15 + 0.516392752072746, !- Hour 16 + 0.57756820005349, !- Hour 17 + 0.781486359989302, !- Hour 18 + 0.897, !- Hour 19 + 0.829107247927254, !- Hour 20 + 0.679527280021396, !- Hour 21 + 0.57756820005349, !- Hour 22 + 0.47572907194437, !- Hour 23 + 0.326149104038513; !- Hour 24 + +Schedule:Day:Hourly, + SinksVacation, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 0, !- Hour 19 + 0, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + ShowersWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.076044361285933, !- Hour 1 + 0.0345332539547544, !- Hour 2 + 0.0242088790610646, !- Hour 3 + 0.0345332539547544, !- Hour 4 + 0.0968355162442594, !- Hour 5 + 0.366693315189659, !- Hour 6 + 0.837199999999997, !- Hour 7 + 0.830293349209049, !- Hour 8 + 0.674644497363497, !- Hour 9 + 0.529320020411635, !- Hour 10 + 0.425506650790951, !- Hour 11 + 0.335577785337642, !- Hour 12 + 0.242159993196122, !- Hour 13 + 0.207555536655894, !- Hour 14 + 0.179857730906617, !- Hour 15 + 0.186764381697567, !- Hour 16 + 0.214462187446844, !- Hour 17 + 0.27676444973635, !- Hour 18 + 0.300973328797414, !- Hour 19 + 0.300973328797414, !- Hour 20 + 0.297484402109202, !- Hour 21 + 0.290577751318252, !- Hour 22 + 0.207555536655894, !- Hour 23 + 0.148742201054601; !- Hour 24 + +Schedule:Day:Hourly, + ShowersWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.0814761013777853, !- Hour 1 + 0.0369999149515223, !- Hour 2 + 0.0259380847082837, !- Hour 3 + 0.0369999149515223, !- Hour 4 + 0.103752338833135, !- Hour 5 + 0.392885694846062, !- Hour 6 + 0.897, !- Hour 7 + 0.889600017009696, !- Hour 8 + 0.722833390032318, !- Hour 9 + 0.56712859329818, !- Hour 10 + 0.455899982990304, !- Hour 11 + 0.359547627147474, !- Hour 12 + 0.259457135567274, !- Hour 13 + 0.222380932131315, !- Hour 14 + 0.19270471168566, !- Hour 15 + 0.200104694675966, !- Hour 16 + 0.229780915121619, !- Hour 17 + 0.296533339003232, !- Hour 18 + 0.322471423711515, !- Hour 19 + 0.322471423711515, !- Hour 20 + 0.318733287974145, !- Hour 21 + 0.311333304983841, !- Hour 22 + 0.222380932131315, !- Hour 23 + 0.159366643987073; !- Hour 24 + +Schedule:Day:Hourly, + ShowersVacation, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 0, !- Hour 19 + 0, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + BathsWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.0492758944582015, !- Hour 1 + 0.0246379472291013, !- Hour 2 + 0.0246379472291013, !- Hour 3 + 0.0246379472291013, !- Hour 4 + 0.0492758944582015, !- Hour 5 + 0.123189736145504, !- Hour 6 + 0.295719195628041, !- Hour 7 + 0.369633037315344, !- Hour 8 + 0.418908931773546, !- Hour 9 + 0.369633037315344, !- Hour 10 + 0.295719195628041, !- Hour 11 + 0.221741525061908, !- Hour 12 + 0.197103577832807, !- Hour 13 + 0.147827683374605, !- Hour 14 + 0.147827683374605, !- Hour 15 + 0.147827683374605, !- Hour 16 + 0.24644330116984, !- Hour 17 + 0.295719195628041, !- Hour 18 + 0.492886602339681, !- Hour 19 + 0.640714285714285, !- Hour 20 + 0.640714285714285, !- Hour 21 + 0.492886602339681, !- Hour 22 + 0.418908931773546, !- Hour 23 + 0.24644330116984; !- Hour 24 + +Schedule:Day:Hourly, + BathsWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.0689862522414824, !- Hour 1 + 0.0344931261207412, !- Hour 2 + 0.0344931261207412, !- Hour 3 + 0.0344931261207412, !- Hour 4 + 0.0689862522414824, !- Hour 5 + 0.172465630603706, !- Hour 6 + 0.414006873879259, !- Hour 7 + 0.517486252241482, !- Hour 8 + 0.586472504482965, !- Hour 9 + 0.517486252241482, !- Hour 10 + 0.414006873879259, !- Hour 11 + 0.310438135086671, !- Hour 12 + 0.27594500896593, !- Hour 13 + 0.206958756724447, !- Hour 14 + 0.206958756724447, !- Hour 15 + 0.206958756724447, !- Hour 16 + 0.345020621637776, !- Hour 17 + 0.414006873879259, !- Hour 18 + 0.690041243275553, !- Hour 19 + 0.897, !- Hour 20 + 0.897, !- Hour 21 + 0.690041243275553, !- Hour 22 + 0.586472504482965, !- Hour 23 + 0.345020621637776; !- Hour 24 + +Schedule:Day:Hourly, + BathsVacation, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 0, !- Hour 19 + 0, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + DHWDistDay, !- Name + Fraction, !- Schedule Type Limits Name + 0.142553149370226, !- Hour 1 + 0.0764866759550322, !- Hour 2 + 0.0516611840277747, !- Hour 3 + 0.0584039294664903, !- Hour 4 + 0.121469841058603, !- Hour 5 + 0.366180268451559, !- Hour 6 + 0.833258955739606, !- Hour 7 + 0.999999987228391, !- Hour 8 + 0.995483090581232, !- Hour 9 + 0.916474762598139, !- Hour 10 + 0.800898393293271, !- Hour 11 + 0.682564390940485, !- Hour 12 + 0.590066600109555, !- Hour 13 + 0.522371887032053, !- Hour 14 + 0.466005974303267, !- Hour 15 + 0.46573704253214, !- Hour 16 + 0.527514234916123, !- Hour 17 + 0.637905701335668, !- Hour 18 + 0.727588642310272, !- Hour 19 + 0.732551127624518, !- Hour 20 + 0.681468471942116, !- Hour 21 + 0.610804704600985, !- Hour 22 + 0.464292318119835, !- Hour 23 + 0.299867724445383; !- Hour 24 + +Schedule:Day:Hourly, + WinterLoadDay, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 0, !- Hour 19 + 0, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + SummerLoadDay, !- Name + Fraction, !- Schedule Type Limits Name + 1, !- Hour 1 + 1, !- Hour 2 + 1, !- Hour 3 + 1, !- Hour 4 + 1, !- Hour 5 + 1, !- Hour 6 + 1, !- Hour 7 + 1, !- Hour 8 + 1, !- Hour 9 + 1, !- Hour 10 + 1, !- Hour 11 + 1, !- Hour 12 + 1, !- Hour 13 + 1, !- Hour 14 + 1, !- Hour 15 + 1, !- Hour 16 + 1, !- Hour 17 + 1, !- Hour 18 + 1, !- Hour 19 + 1, !- Hour 20 + 1, !- Hour 21 + 1, !- Hour 22 + 1, !- Hour 23 + 1; !- Hour 24 + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULE:WEEK:COMPACT =========== + +Schedule:Week:Compact, + RefrigeratorWeek, !- Name + For: AllDays, !- DayType List 1 + RefrigeratorDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + MiscPlugLoadWeek, !- Name + For: AllDays, !- DayType List 1 + MiscPlugLoadDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + CookingRangeWeek, !- Name + For: AllDays, !- DayType List 1 + CookingRangeDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + DishwasherWeek, !- Name + For: Weekdays, !- DayType List 1 + DishwasherWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + DishwasherVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + DishwasherWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + ClothesWasherWeek, !- Name + For: Weekdays, !- DayType List 1 + ClothesWasherWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + ClothesWasherVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + ClothesWasherWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + dhw_profile_week, !- Name + AllDays, !- DayType List 1 + dhw_profile_day; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + ClothesDryerWeek, !- Name + For: Weekdays, !- DayType List 1 + ClothesDryerWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + ClothesDryerVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + ClothesDryerWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + SinksWeek, !- Name + For: Weekdays, !- DayType List 1 + SinksWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + SinksVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + SinksWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + ShowersWeek, !- Name + For: Weekdays, !- DayType List 1 + ShowersWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + ShowersVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + ShowersWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + BathsWeek, !- Name + For: Weekdays, !- DayType List 1 + BathsWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + BathsVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + BathsWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + DHWDistWeek, !- Name + For: AllDays, !- DayType List 1 + DHWDistDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + OccupancyWeek, !- Name + AllDays, !- DayType List 1 + OccupancyDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + LightingProfileWeek, !- Name + For: AllDays, !- DayType List 1 + LightingDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + LightingProfileWeek_EELighting, !- Name + For: AllDays, !- DayType List 1 + LightingDay_EELighting; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + LightingProfileWeek_EELighting_interior_controls, !- Name + For: AllDays, !- DayType List 1 + LightingDay_EELighting_OccSensors; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + LightingProfileWeek_EELighting_garage_controls, !- Name + For: AllDays, !- DayType List 1 + LightingDay_EELighting_Garage_OccSensors; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + ExteriorLightingProfileWeek, !- Name + For: AllDays, !- DayType List 1 + ExteriorLightingDay; !- Schedule:Day Name 1 + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULE:YEAR =========== + +Schedule:Year, + Occupancy, !- Name + Fraction, !- Schedule Type Limits Name + OccupancyWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + InteriorLighting, !- Name + Fraction, !- Schedule Type Limits Name + LightingProfileWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + InteriorLightingHE, !- Name + Fraction, !- Schedule Type Limits Name + LightingProfileWeek_EELighting, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + InteriorLightingHE_OS, !- Name + Fraction, !- Schedule Type Limits Name + LightingProfileWeek_EELighting_interior_controls, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + InteriorLightingHE_VS, !- Name + Fraction, !- Schedule Type Limits Name + LightingProfileWeek_EELighting_garage_controls, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + ExteriorLighting, !- Name + Fraction, !- Schedule Type Limits Name + ExteriorLightingProfileWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + Refrigerator, !- Name + Fraction, !- Schedule Type Limits Name + RefrigeratorWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + MiscPlugLoad, !- Name + Fraction, !- Schedule Type Limits Name + MiscPlugLoadWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + CookingRange, !- Name + Fraction, !- Schedule Type Limits Name + CookingRangeWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + dhw_sch, !- Name + fraction, !- Schedule Type Limits Name + dhw_profile_week, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + Dishwasher, !- Name + Fraction, !- Schedule Type Limits Name + DishwasherWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + ClothesWasher, !- Name + Fraction, !- Schedule Type Limits Name + ClothesWasherWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + ClothesDryer, !- Name + Fraction, !- Schedule Type Limits Name + ClothesDryerWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + Sinks, !- Name + Fraction, !- Schedule Type Limits Name + SinksWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + Showers, !- Name + Fraction, !- Schedule Type Limits Name + ShowersWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + Baths, !- Name + Fraction, !- Schedule Type Limits Name + BathsWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + DHWDist, !- Name + Fraction, !- Schedule Type Limits Name + DHWDistWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULE:COMPACT =========== + +Schedule:Compact, + BA_shower_sch, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 1:00, 0.00174682444444444, + !- Field 4 + Until: 2:00, 0.000794011111111111, + !- Field 6 + Until: 3:00, 0.000476406666666667, + !- Field 8 + Until: 4:00, 0.000794011111111111, + !- Field 10 + Until: 5:00, 0.00222323111111111, + !- Field 12 + Until: 6:00, 0.00825771555555556, + !- Field 14 + Until: 7:00, 0.0187386622222222, + !- Field 16 + Until: 8:00, 0.01857986, !- Field 18 + Until: 9:00, 0.0150862111111111, + !- Field 20 + Until: 10:00, 0.0117513644444444, + !- Field 22 + Until: 11:00, 0.00952813333333333, + !- Field 24 + Until: 12:00, 0.00746370444444444, + !- Field 26 + Until: 13:00, 0.00539927555555556, + !- Field 28 + Until: 14:00, 0.00460526444444444, + !- Field 30 + Until: 15:00, 0.00412885777777778, + !- Field 32 + Until: 16:00, 0.00397005555555556, + !- Field 34 + Until: 17:00, 0.00476406666666667, + !- Field 36 + Until: 18:00, 0.00619328666666667, + !- Field 38 + Until: 19:00, 0.00666969333333333, + !- Field 40 + Until: 20:00, 0.00666969333333333, + !- Field 42 + Until: 21:00, 0.00666969333333333, + !- Field 44 + Until: 22:00, 0.00651089111111111, + !- Field 46 + Until: 23:00, 0.00460526444444444, + !- Field 48 + Until: 24:00, 0.00333484666666667; + !- Field 50 + +Schedule:Compact, + BA_bath_sch, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 1:00, 0.000163090909090909, + !- Field 4 + Until: 2:00, 8.15454545454545e-05, + !- Field 6 + Until: 3:00, 8.15454545454545e-05, + !- Field 8 + Until: 4:00, 8.15454545454545e-05, + !- Field 10 + Until: 5:00, 0.000163090909090909, + !- Field 12 + Until: 6:00, 0.000387340909090909, + !- Field 14 + Until: 7:00, 0.000937772727272727, + !- Field 16 + Until: 8:00, 0.00118240909090909, + !- Field 18 + Until: 9:00, 0.0013455, !- Field 20 + Until: 10:00, 0.00118240909090909, + !- Field 22 + Until: 11:00, 0.000937772727272727, + !- Field 24 + Until: 12:00, 0.000713522727272727, + !- Field 26 + Until: 13:00, 0.000631977272727273, + !- Field 28 + Until: 14:00, 0.000468886363636364, + !- Field 30 + Until: 15:00, 0.000468886363636364, + !- Field 32 + Until: 16:00, 0.000468886363636364, + !- Field 34 + Until: 17:00, 0.000795068181818182, + !- Field 36 + Until: 18:00, 0.000937772727272727, + !- Field 38 + Until: 19:00, 0.00156975,!- Field 40 + Until: 20:00, 0.00203863636363636, + !- Field 42 + Until: 21:00, 0.00203863636363636, + !- Field 44 + Until: 22:00, 0.00156975,!- Field 46 + Until: 23:00, 0.0013455, !- Field 48 + Until: 24:00, 0.000795068181818182; + !- Field 50 + +Schedule:Compact, + BA_sink_sch, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 1:00, 0.00387388596491228, + !- Field 4 + Until: 2:00, 0.00193694298245614, + !- Field 6 + Until: 3:00, 0.00138353070175439, + !- Field 8 + Until: 4:00, 0.00138353070175439, + !- Field 10 + Until: 5:00, 0.00193694298245614, + !- Field 12 + Until: 6:00, 0.00498071052631579, + !- Field 14 + Until: 7:00, 0.0116216578947368, + !- Field 16 + Until: 8:00, 0.0171557807017544, + !- Field 18 + Until: 9:00, 0.0182626052631579, + !- Field 20 + Until: 10:00, 0.0171557807017544, + !- Field 22 + Until: 11:00, 0.0149421315789474, + !- Field 24 + Until: 12:00, 0.0138353070175439, + !- Field 26 + Until: 13:00, 0.013558600877193, + !- Field 28 + Until: 14:00, 0.0124517763157895, + !- Field 30 + Until: 15:00, 0.0118983640350877, + !- Field 32 + Until: 16:00, 0.011344951754386, + !- Field 34 + Until: 17:00, 0.0132818947368421, + !- Field 36 + Until: 18:00, 0.017985899122807, + !- Field 38 + Until: 19:00, 0.0207529605263158, + !- Field 40 + Until: 20:00, 0.0190927236842105, + !- Field 42 + Until: 21:00, 0.01577225,!- Field 44 + Until: 22:00, 0.0132818947368421, + !- Field 46 + Until: 23:00, 0.0110682456140351, + !- Field 48 + Until: 24:00, 0.00747106578947368; + !- Field 50 + +Schedule:Compact, + activity_sch, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 117.28; !- Field 4 + +Schedule:Compact, + inf_sch, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 1; !- Field 4 + +Schedule:Compact, + zone_control_type, !- Name + control_type, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until 24:00, !- Field 3 + 4; !- Field 4 + +Schedule:Compact, + shading_2012iecc, !- Name + fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until 24:00, !- Field 3 + 0; !- Field 4 + +Schedule:Compact, + shading_2009iecc, !- Name + any number, !- Schedule Type Limits Name + Through: 5/30, !- Field 1 + For: AllDays, !- Field 2 + Until 24:00, !- Field 3 + 0.85, !- Field 4 + Through: 8/31, !- Field 5 + For: AllDays, !- Field 6 + Until 24:00, !- Field 7 + 0.7, !- Field 8 + Through: 12/31, !- Field 9 + For: AllDays, !- Field 10 + Until: 24:00, 0.85; !- Field 12 + +Schedule:Compact, + dhw_setpt, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until 24:00, !- Field 3 + 48; !- Field 4 + +Schedule:Compact, + dhw_setpt_hpwh, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until 24:00, !- Field 3 + 44; !- Field 4 + +Schedule:Compact, + Supply-Air-Temp-Sch, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 12; !- Field 4 + +Schedule:Compact, + always_avail, !- Name + On/Off, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 1; !- Field 4 + +Schedule:Compact, + always_off, !- Name + On/Off, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 0; !- Field 4 + +Schedule:Compact, + heating_sch_HRef, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 20; !- Field 4 + +Schedule:Compact, + cooling_sch_HRef, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 25.55; !- Field 4 + +Schedule:Compact, + heating_sch, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 22.2222222222223; + !- Field 4 + +Schedule:Compact, + cooling_sch, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 23.888888888889; + !- Field 4 + +Schedule:Compact, + fan_cycle, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 0; !- Field 4 + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULE:CONSTANT =========== + +Schedule:Constant,DWWaterTempSchedule,Temperature,48.8888888888889; +Schedule:Constant,CWWaterTempSchedule,Temperature,48.8888888888889; +Schedule:Constant,SinkSensSchedule,Fraction,0.687777777777778; +Schedule:Constant,SinkLatSchedule,Fraction,0.312222222222222; +Schedule:Constant,ShowerSensSchedule,Fraction,0.51280276816609; +Schedule:Constant,ShowerLatSchedule,Fraction,0.48719723183391; +Schedule:Constant,BathSensSchedule,Fraction,1; +Schedule:Constant,BathLatSchedule,Fraction,0; +Schedule:Constant,SSBWaterTempSchedule,Temperature,40.5555555555556; +Schedule:Constant,WaterHeaterSP1Schedule,Temperature,48.8888888888889; +Schedule:Constant,WaterHeaterSP2Schedule,Temperature,40.5555555555556; +Schedule:Constant,DHWSupplySetpoint,Temperature,48.8888888888889; +Schedule:Constant,boiler_setpt,Temperature,80; +Schedule:Constant,Compressor Setpoint,Temperature,50; +Schedule:Constant,DOAShightemp,Temperature,200; +Schedule:Constant,DOASlowtemp,Temperature,-60; + +!- =========== ALL OBJECTS IN CLASS: MATERIAL =========== + + +Material, + sheathing_consol_layer, !- Name + Rough, !- Roughness + 0.031115, !- Thickness {m} + 0.035329, !- Conductivity {W/m-K} + 20.1, !- Density {kg/m3} + 1465.415; !- Specific Heat {J/kg-K} + +Material, + ceil_consol_layer, !- Name + Rough, !- Roughness + 0.444461299067702, !- Thickness {m} + 0.0617176, !- Conductivity {W/m-K} + 41.9286, !- Density {kg/m3} + 776.25126; !- Specific Heat {J/kg-K} + +Material, + floor_consol_layer, !- Name + Rough, !- Roughness + 0.000254, !- Thickness {m} + 12.989536, !- Conductivity {W/m-K} + 55.074, !- Density {kg/m3} + 916.9311; !- Specific Heat {J/kg-K} + +Material, + bsmtwall_consol_layer, !- Name + Rough, !- Roughness + 0.000254, !- Thickness {m} + 10.84384, !- Conductivity {W/m-K} + 120.801, !- Density {kg/m3} + 1036.25775; !- Specific Heat {J/kg-K} + +Material, + crawlwall_consol_layer, !- Name + Rough, !- Roughness + 0.000254, !- Thickness {m} + 10.84384, !- Conductivity {W/m-K} + 120.801, !- Density {kg/m3} + 1036.25775; !- Specific Heat {J/kg-K} + +Material, + wall_consol_layer, !- Name + Rough, !- Roughness + 0.1397, !- Thickness {m} + 0.057165, !- Conductivity {W/m-K} + 120.801, !- Density {kg/m3} + 1036.25775; !- Specific Heat {J/kg-K} + +Material, + Very High Reflectivity Surface, !- Name + Smooth, !- Roughness + 0.0005, !- Thickness {m} + 237, !- Conductivity {W/m-K} + 2702, !- Density {kg/m3} + 903, !- Specific Heat {J/kg-K} + 0.90, !- Thermal Absorptance + 0.05, !- Solar Absorptance + 0.05; !- Visible Absorptance + +Material, + GypsumBoard-5/16in, !- Name + Rough, !- Roughness + 7.93953E-03, !- Thickness {m} + 0.1586200, !- Conductivity {W/m-K} + 640, !- Density {kg/m3} + 1129.6, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.4, !- Solar Absorptance + 0.1; !- Visible Absorptance + +Material, + CopperPipe, !- Name + MediumRough, !- Roughness + 1.90500386169072E-02, !- Thickness {m} + 401, !- Conductivity {W/m-K} + 2243.000, !- Density {kg/m3} + 837.0000, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.6500000, !- Solar Absorptance + 0.6500000; !- Visible Absorptance + +Material, + F08 Metal surface, !- Name + Smooth, !- Roughness + 0.0008, !- Thickness {m} + 45.28, !- Conductivity {W/m-K} + 7824, !- Density {kg/m3} + 500; !- Specific Heat {J/kg-K} + +Material, + Concrete_4in, !- Name + Rough, !- Roughness + 0.1014984, !- Thickness {m} + 1.312098, !- Conductivity {W/m-K} + 2242.8, !- Density {kg/m3} + 465.2; !- Specific Heat {J/kg-K} + +Material, + Asphalt_shingle, !- Name + MediumRough, !- Roughness + 6.33985285170672E-03, !- Thickness {m} + 0.08186, !- Conductivity {W/m-K} + 1121.2917044623, !- Density {kg/m3} + 1255.20000949809, !- Specific Heat {J/kg-K} + , !- Thermal Absorptance + 0.75; !- Solar Absorptance + +Material, + Wood_shingle, !- Name + MediumSmooth, !- Roughness + 1.27000257446048E-02, !- Thickness {m} + 0.11388, !- Conductivity {W/m-K} + 426.090847695673, !- Density {kg/m3} + 1631.76001234752; !- Specific Heat {J/kg-K} + +Material, + Slate_shingle, !- Name + MediumSmooth, !- Roughness + 1.27000257446048E-02, !- Thickness {m} + 1.44219, !- Conductivity {W/m-K} + 1601.845292089, !- Density {kg/m3} + 1255.20000949809; !- Specific Heat {J/kg-K} + +Material, + cement_stucco, !- Name + MediumSmooth, !- Roughness + 1.905E-02, !- Thickness {m} + 0.721, !- Conductivity {W/m-K} + 1865.58, !- Density {kg/m3} + 878.640006648665; !- Specific Heat {J/kg-K} + +Material, + syn_stucco, !- Name + MediumSmooth, !- Roughness + 0.3048E-02, !- Thickness {m} + 8.65E-02, !- Conductivity {W/m-K} + 400, !- Density {kg/m3} + 878.640006648665; !- Specific Heat {J/kg-K} + +Material, + Drywall_1/2in, !- Name + MediumSmooth, !- Roughness + 1.27000257446048E-02, !- Thickness {m} + 0.16009, !- Conductivity {W/m-K} + 800.922646044499, !- Density {kg/m3} + 1087.84000823168; !- Specific Heat {J/kg-K} + +Material, + OSB_5/8in, !- Name + MediumSmooth, !- Roughness + 0.015875032180756, !- Thickness {m} + 0.1163, !- Conductivity {W/m-K} + 544.627399310259, !- Density {kg/m3} + 1213.36000918149; !- Specific Heat {J/kg-K} + +Material, + OSB_7/16in, !- Name + MediumSmooth, !- Roughness + 0.0111125, !- Thickness {m} + 0.1163, !- Conductivity {W/m-K} + 544.627399310259, !- Density {kg/m3} + 1213.36000918149; !- Specific Heat {J/kg-K} + +Material, + Blown_R30, !- Name + MediumRough, !- Roughness + 0.212598430964684, !- Thickness {m} + 0.04119, !- Conductivity {W/m-K} + 9.61107175253399, !- Density {kg/m3} + 836.800006332062; !- Specific Heat {J/kg-K} + +Material, + Blown_R30_top, !- Name + MediumRough, !- Roughness + 0.117348237880148, !- Thickness {m} + 0.04119, !- Conductivity {W/m-K} + 9.61107175253399, !- Density {kg/m3} + 836.800006332062, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + Plywood_3/4in, !- Name + Rough, !- Roughness + 0.01905, !- Thickness {m} + 0.1154577, !- Conductivity {W/m-K} + 544.68, !- Density {kg/m3} + 674.54, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + Batt_R19, !- Name + MediumRough, !- Roughness + 2.54000514892096E-02, !- Thickness {m} + 3.47522010738099E-03, !- Conductivity {W/m-K} + 9.61107175253399, !- Density {kg/m3} + 836.800006332062, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + Lumber_2x4, !- Name + Rough , !- Roughness + 0.0890016, !- Thickness {m} + 0.1154577, !- Conductivity {W/m-K} + 512.64, !- Density {kg/m3} + 767.58, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + Carpet_n_pad, !- Name + MediumSmooth, !- Roughness + 2.54000514892096E-02, !- Thickness {m} + 6.01314018580031E-02, !- Conductivity {W/m-K} + 32.03690584178, !- Density {kg/m3} + 836.800006332062, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + Batt_R13, !- Name + MediumRough, !- Roughness + 0.0889, !- Thickness {m} + 0.03876, !- Conductivity {W/m-K} + 9.61107175253399, !- Density {kg/m3} + 836.800006332062, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + OSB_1/2in, !- Name + MediumSmooth, !- Roughness + 1.27000257446048E-02, !- Thickness {m} + 0.1163, !- Conductivity {W/m-K} + 544.627399310259, !- Density {kg/m3} + 1213.36000918149, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + soil_12in, !- Name + Rough, !- Roughness + 0.3048, !- Thickness {m} + 1.731, !- Conductivity {W/m-K} + 1842.3, !- Density {kg/m3} + 232.6, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + door_const, !- Name + Smooth, !- Roughness + 0.0422695734864227, !- Thickness {m} + 0.0720096, !- Conductivity {W/m-K} + 512.64, !- Density {kg/m3} + 767.58; !- Specific Heat {J/kg-K} + +Material, + Gyp_board_1/2in, !- Name + Rough, !- Roughness + 0.01271016, !- Thickness {m} + 0.1586200, !- Conductivity {W/m-K} + 640, !- Density {kg/m3} + 1129.6, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.4, !- Solar Absorptance + 0.1; !- Visible Absorptance + +Material, + Std Wood 6inch, !- Name + MediumSmooth, !- Roughness + 0.15, !- Thickness {m} + 0.12, !- Conductivity {W/m-K} + 540.0000, !- Density {kg/m3} + 1210, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.7000000, !- Solar Absorptance + 0.7000000; !- Visible Absorptance + +Material, + Pipe Insulation, !- Name + VeryRough, !- Roughness + 0.0127032520325203, !- Thickness {m} + 0.03317175, !- Conductivity {W/m-K} + 91.0, !- Density {kg/m3} + 836.0, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.5, !- Solar Absorptance + 0.5; !- Visible Absorptance + + +!- =========== ALL OBJECTS IN CLASS: MATERIAL:NOMASS =========== + +Material:NoMass, + Manf_wall_airgap, !- Name + Smooth, !- Roughness + 0.12; !- Thermal Resistance {m2-K/W} + +Material:NoMass, + Bldg_paper_felt, !- Name + Smooth, !- Roughness + 1.05666113069662E-02; !- Thermal Resistance {m2-K/W} + +Material:NoMass, + R_high, !- Name + MediumRough, !- Roughness + 177; !- Thermal Resistance {m2-K/W} + + +!- =========== ALL OBJECTS IN CLASS: MATERIAL:AIRGAP =========== + +Material:AirGap, + Air_4_in_vert, !- Name + 0.158499169604493; !- Thermal Resistance {m2-K/W} + +Material:AirGap, + 3/4in_air_space, !- Name + 0.08513; !- Thermal Resistance {m2-K/W} + +Material:AirGap, + 3/4in_Reflective_air_space, !- Name + 0.246554; !- Thermal Resistance {m2-K/W} + + +!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:SIMPLEGLAZINGSYSTEM =========== + +WindowMaterial:SimpleGlazingSystem, + Glass, !- Name + 1.70358, !- U-Factor {W/m2-K} + 0.3344, !- Solar Heat Gain Coefficient + 0.88; !- Visible Transmittance + + +!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:GLAZING =========== + +WindowMaterial:Glazing, + Clear Acrylic Plastic, !- Name + SpectralAverage, !- Optical Data Type + , !- Window Glass Spectral Data Set Name + 0.003, !- Thickness {m} + 0.92, !- Solar Transmittance at Normal Incidence + 0.05, !- Front Side Solar Reflectance at Normal Incidence + 0.05, !- Back Side Solar Reflectance at Normal Incidence + 0.92, !- Visible Transmittance at Normal Incidence + 0.05, !- Front Side Visible Reflectance at Normal Incidence + 0.05, !- Back Side Visible Reflectance at Normal Incidence + 0.00, !- Infrared Transmittance at Normal Incidence + 0.90, !- Front Side Infrared Hemispherical Emissivity + 0.90, !- Back Side Infrared Hemispherical Emissivity + 0.90; !- Conductivity {W/m-K} + +WindowMaterial:Glazing, + Diffusing Acrylic Plastic, !- Name + SpectralAverage, !- Optical Data Type + , !- Window Glass Spectral Data Set Name + 0.0022, !- Thickness {m} + 0.90, !- Solar Transmittance at Normal Incidence + 0.08, !- Front Side Solar Reflectance at Normal Incidence + 0.08, !- Back Side Solar Reflectance at Normal Incidence + 0.90, !- Visible Transmittance at Normal Incidence + 0.08, !- Front Side Visible Reflectance at Normal Incidence + 0.08, !- Back Side Visible Reflectance at Normal Incidence + 0.00, !- Infrared Transmittance at Normal Incidence + 0.90, !- Front Side Infrared Hemispherical Emissivity + 0.90, !- Back Side Infrared Hemispherical Emissivity + 0.90; !- Conductivity {W/m-K} + + +!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:BLIND =========== + +WindowMaterial:Blind, + int_blind, !- Name + Horizontal, !- Slat Orientation + 0.025, !- Slat Width {m} + 0.01875, !- Slat Separation {m} + 0.001, !- Slat Thickness {m} + 45.0, !- Slat Angle {deg} + 221, !- Slat Conductivity {W/m-K} + 0.0, !- Slat Beam Solar Transmittance + 0.5, !- Front Side Slat Beam Solar Reflectance + 0.5, !- Back Side Slat Beam Solar Reflectance + 0.0, !- Slat Diffuse Solar Transmittance + 0.5, !- Front Side Slat Diffuse Solar Reflectance + 0.5, !- Back Side Slat Diffuse Solar Reflectance + 0.0, !- Slat Beam Visible Transmittance + 0.5, !- Front Side Slat Beam Visible Reflectance + 0.5, !- Back Side Slat Beam Visible Reflectance + 0.0, !- Slat Diffuse Visible Transmittance + 0.5, !- Front Side Slat Diffuse Visible Reflectance + 0.5, !- Back Side Slat Diffuse Visible Reflectance + 0.0, !- Slat Infrared Hemispherical Transmittance + 0.9, !- Front Side Slat Infrared Hemispherical Emissivity + 0.9, !- Back Side Slat Infrared Hemispherical Emissivity + 0.050, !- Blind to Glass Distance {m} + 0.5, !- Blind Top Opening Multiplier + 0.5, !- Blind Bottom Opening Multiplier + 0.5, !- Blind Left Side Opening Multiplier + 0.5, !- Blind Right Side Opening Multiplier + , !- Minimum Slat Angle {deg} + ; !- Maximum Slat Angle {deg} + + +!- =========== ALL OBJECTS IN CLASS: CONSTRUCTION =========== + +Construction, + Exterior Wall, !- Name + syn_stucco, !- Outside Layer + sheathing_consol_layer, !- Layer 2 + OSB_7/16in, !- Layer 3 + wall_consol_layer, !- Layer 4 + Drywall_1/2in; !- Layer 5 + +Construction, + InteriorFurnishings, !- Name + Std Wood 6inch; !- Outside Layer + +Construction, + ceiling-floor-layer, !- Name + Lumber_2x4; !- Outside Layer + +Construction, + Exterior Floor, !- Name + floor_consol_layer, !- Outside Layer + Plywood_3/4in, !- Layer 2 + Carpet_n_pad; !- Layer 3 + +Construction, + Interior Floor, !- Name + Plywood_3/4in, !- Outside Layer + Carpet_n_pad; !- Layer 2 + +Construction, + Interior Ceiling, !- Name + ceil_consol_layer, !- Outside Layer + Drywall_1/2in; !- Layer 2 + +Construction, + attic floor, !- Name + Drywall_1/2in, !- Outside Layer + ceil_consol_layer; !- Layer 2 + +Construction, + fndn_roof, !- Name + Carpet_n_pad, !- Outside Layer + Plywood_3/4in, !- Layer 2 + ceil_consol_layer; !- Layer 3 + +Construction, + interiorwall, !- Name + Drywall_1/2in, !- Outside Layer + OSB_5/8in, !- Layer 2 + Drywall_1/2in; !- Layer 3 + +Construction, + Interior Wall, !- Name + Drywall_1/2in, !- Outside Layer + Air_4_in_vert, !- Layer 2 + Drywall_1/2in; !- Layer 3 + +Construction, + Exterior Roof, !- Name + Asphalt_shingle, !- Outside Layer + OSB_1/2in; !- Layer 2 + +Construction, + Exterior Window, !- Name + Glass; !- Outside Layer + +Construction, + Interior Window, !- Name + Glass; !- Outside Layer + +Construction, + Exterior Door, !- Name + door_const; !- Outside Layer + +Construction, + Interior Door, !- Name + door_const; !- Outside Layer + +Construction, + Gable_end, !- Name + cement_stucco, !- Outside Layer + Bldg_paper_felt, !- Layer 2 + OSB_5/8in, !- Layer 3 + Air_4_in_vert, !- Layer 4 + Drywall_1/2in; !- Layer 5 + +Construction, + crawl_floor, !- Name + R_high, !- Outside Layer + soil_12in; !- Layer 2 + +Construction, + window_w_blinds, !- Name + Glass, !- Outside Layer + int_blind; !- Layer 2 + +Construction, + Insulated Pipe, !- Name + Pipe Insulation, !- Outside Layer + CopperPipe; !- Layer 2 + +Construction, + Plain Pipe, !- Name + CopperPipe; !- Outside Layer + +Construction, + TDD Pipe, !- Name + Very High Reflectivity Surface; !- Outside Layer + +Construction, + TDD Dome, !- Name + Clear Acrylic Plastic; !- Outside Layer + +Construction, + TDD Diffuser, !- Name + Diffusing Acrylic Plastic; !- Outside Layer + + +!- =========== ALL OBJECTS IN CLASS: GLOBALGEOMETRYRULES =========== + +GlobalGeometryRules, + LowerLeftCorner, !- Starting Vertex Position + Counterclockwise, !- Vertex Entry Direction + Relative; !- Coordinate System + + +!- =========== ALL OBJECTS IN CLASS: ZONE =========== + +Zone, + living_unit1, !- Name + 0.0, !- Direction of Relative North {deg} + 0.0, 0.0, 0.0, !- X,Y,Z {m} + , !- Type + 1; !- Multiplier + +Zone, + attic_unit1, !- Name + 0.0, !- Direction of Relative North {deg} + 0.0, 0.0, 0.0, !- X,Y,Z {m} + , !- Type + 1; !- Multiplier + + +!- =========== ALL OBJECTS IN CLASS: BUILDINGSURFACE:DETAILED =========== + +BuildingSurface:Detailed, + Inter zone floor 1, !- Name + Floor, !- Surface Type + Interior Floor, !- Construction Name + living_unit1, !- Zone Name + Adiabatic, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0, !- View Factor to Ground + 4, !- Number of Vertices + 0, 0, 2.60156341463415, !- X,Y,Z 1 {m} + 0, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 2 {m} + 12.1330909462833, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 3 {m} + 12.1330909462833, 0, 2.60156341463415; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + ceiling_unit1, !- Name + Ceiling, !- Surface Type + Interior Ceiling, !- Construction Name + living_unit1, !- Zone Name + Zone, !- Outside Boundary Condition + attic_unit1, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0, !- View Factor to Ground + 4, !- Number of Vertices + 0, 0, 5.19302682926829, !- X,Y,Z 1 {m} + 12.1330909462833, 0, 5.19302682926829, + !- X,Y,Z 2 {m} + 12.1330909462833, 9.09981820971244, 5.19302682926829, + !- X,Y,Z 3 {m} + 0, 9.09981820971244, 5.19302682926829; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Roof_front_unit1, !- Name + Roof, !- Surface Type + Exterior Roof, !- Construction Name + attic_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.0, !- View Factor to Ground + 4, !- Number of Vertices + 0, 0, 5.19302682926829, !- X,Y,Z 1 {m} + 12.1330909462833, 0, 5.19302682926829, + !- X,Y,Z 2 {m} + 12.1330909462833, 4.54990910485622, 6.6995631975537, + !- X,Y,Z 3 {m} + 0, 4.54990910485622, 6.6995631975537; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Roof_back_unit1, !- Name + Roof, !- Surface Type + Exterior Roof, !- Construction Name + attic_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.0, !- View Factor to Ground + 4, !- Number of Vertices + 12.1330909462833, 9.09981820971244, 5.19302682926829, + !- X,Y,Z 1 {m} + 0, 9.09981820971244, 5.19302682926829, + !- X,Y,Z 2 {m} + 0, 4.54990910485622, 6.6995631975537, + !- X,Y,Z 3 {m} + 12.1330909462833, 4.54990910485622, 6.6995631975537; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Roof_right_unit1, !- Name + Wall, !- Surface Type + Gable_end, !- Construction Name + attic_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 3, !- Number of Vertices + 12.1330909462833, 0, 5.19302682926829, + !- X,Y,Z 1 {m} + 12.1330909462833, 9.09981820971244, 5.19302682926829, + !- X,Y,Z 2 {m} + 12.1330909462833, 4.54990910485622, 6.6995631975537; + !- X,Y,Z 3 {m} + +BuildingSurface:Detailed, + Roof_left_unit1, !- Name + Wall, !- Surface Type + Gable_end, !- Construction Name + attic_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 3, !- Number of Vertices + 0, 9.09981820971244, 5.19302682926829, + !- X,Y,Z 1 {m} + 0, 0, 5.19302682926829, !- X,Y,Z 2 {m} + 0, 4.54990910485622, 6.6995631975537; + !- X,Y,Z 3 {m} + +BuildingSurface:Detailed, + Wall_ldf_1.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 0, 0, 0.0101, !- X,Y,Z 1 {m} + 12.1330909462833, 0, 0.0101, !- X,Y,Z 2 {m} + 12.1330909462833, 0, 2.60156341463415, + !- X,Y,Z 3 {m} + 0, 0, 2.60156341463415; !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Wall_sdr_1.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 12.1330909462833, 0, 0.0101, !- X,Y,Z 1 {m} + 12.1330909462833, 9.09981820971244, 0.0101, + !- X,Y,Z 2 {m} + 12.1330909462833, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 3 {m} + 12.1330909462833, 0, 2.60156341463415; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Wall_ldb_1.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 12.1330909462833, 9.09981820971244, 0.0101, + !- X,Y,Z 1 {m} + 0, 9.09981820971244, 0.0101, !- X,Y,Z 2 {m} + 0, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 3 {m} + 12.1330909462833, 9.09981820971244, 2.60156341463415; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Wall_sdl_1.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 0, 9.09981820971244, 0.0101, !- X,Y,Z 1 {m} + 0, 0, 0.0101, !- X,Y,Z 2 {m} + 0, 0, 2.60156341463415, !- X,Y,Z 3 {m} + 0, 9.09981820971244, 2.60156341463415; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Wall_ldf_2.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 0, 0, 2.60156341463415, !- X,Y,Z 1 {m} + 12.1330909462833, 0, 2.60156341463415, + !- X,Y,Z 2 {m} + 12.1330909462833, 0, 5.19302682926829, + !- X,Y,Z 3 {m} + 0, 0, 5.19302682926829; !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Wall_sdr_2.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 12.1330909462833, 0, 2.60156341463415, + !- X,Y,Z 1 {m} + 12.1330909462833, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 2 {m} + 12.1330909462833, 9.09981820971244, 5.19302682926829, + !- X,Y,Z 3 {m} + 12.1330909462833, 0, 5.19302682926829; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Wall_ldb_2.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 12.1330909462833, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 1 {m} + 0, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 2 {m} + 0, 9.09981820971244, 5.19302682926829, + !- X,Y,Z 3 {m} + 12.1330909462833, 9.09981820971244, 5.19302682926829; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Wall_sdl_2.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 0, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 1 {m} + 0, 0, 2.60156341463415, !- X,Y,Z 2 {m} + 0, 0, 5.19302682926829, !- X,Y,Z 3 {m} + 0, 9.09981820971244, 5.19302682926829; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Floor_unit1, !- Name + Floor, !- Surface Type + Interior Floor, !- Construction Name + living_unit1, !- Zone Name + GroundSlabPreprocessorAverage, !- Outside Boundary Condition + surfPropOthSdCoefSlabAverage, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0, !- View Factor to Ground + 4, !- Number of Vertices + 0, 0, 0.0101, !- X,Y,Z 1 {m} + 0, 9.09981820971244, 0.0101, !- X,Y,Z 2 {m} + 12.1330909462833, 9.09981820971244, 0.0101, + !- X,Y,Z 3 {m} + 12.1330909462833, 0, 0.0101; !- X,Y,Z 4 {m} + + +!- =========== ALL OBJECTS IN CLASS: WINDOW =========== + +Window, + Window_ldf_1.unit1, !- Name + Exterior Window, !- Construction Name + Wall_ldf_1.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 1, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + +Window, + Window_ldb_1.unit1, !- Name + Exterior Window, !- Construction Name + Wall_ldb_1.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 2.74190122145512, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + +Window, + Window_sdr_1.unit1, !- Name + Exterior Window, !- Construction Name + Wall_sdr_1.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 1, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + +Window, + Window_sdl_1.unit1, !- Name + Exterior Window, !- Construction Name + Wall_sdl_1.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 1, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + +Window, + Window_ldf_2.unit1, !- Name + Exterior Window, !- Construction Name + Wall_ldf_2.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 1, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + +Window, + Window_ldb_2.unit1, !- Name + Exterior Window, !- Construction Name + Wall_ldb_2.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 2.74190122145512, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + +Window, + Window_sdr_2.unit1, !- Name + Exterior Window, !- Construction Name + Wall_sdr_2.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 1, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + +Window, + Window_sdl_2.unit1, !- Name + Exterior Window, !- Construction Name + Wall_sdl_2.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 1, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + + +!- =========== ALL OBJECTS IN CLASS: DOOR =========== + +Door, + Door_ldb_unit1, !- Name + Exterior Door, !- Construction Name + Wall_ldb_1.unit1, !- Building Surface Name + 1, !- Multiplier + 0.5, !- Starting X Coordinate {m} + 0, !- Starting Z Coordinate {m} + 1.74190122145513, !- Length {m} + 2.13414634146341; !- Height {m} + + +!- =========== ALL OBJECTS IN CLASS: WINDOWSHADINGCONTROL =========== + +WindowShadingControl, + Shades-living_unit1, !- Name + living_unit1, !- Zone Name + 1, !- Shading Control Sequence Number + InteriorBlind, !- Shading Type + window_w_blinds, !- Construction with Shading Name + OnIfScheduleAllows, !- Shading Control Type + shading_2012iecc, !- Schedule Name + , !- Setpoint {W/m2, W or deg C} + Yes, !- Shading Control Is Scheduled + No, !- Glare Control Is Active + , !- Shading Device Material Name + , !- Type of Slat Angle Control for Blinds + , !- Slat Angle Schedule Name + , !- Setpoint 2 {W/m2 or deg C} + , !- Daylighting Control Object Name + Sequential, !- Multiple Surface Control Type + Window_ldf_1.unit1, !- Fenestration Surface 1 Name + Window_ldb_1.unit1, !- Fenestration Surface 2 Name + Window_sdr_1.unit1, !- Fenestration Surface 3 Name + Window_sdl_1.unit1, !- Fenestration Surface 4 Name + Window_ldf_2.unit1, !- Fenestration Surface 5 Name + Window_ldb_2.unit1, !- Fenestration Surface 6 Name + Window_sdr_2.unit1, !- Fenestration Surface 7 Name + Window_sdl_2.unit1; !- Fenestration Surface 8 Name + + +!- =========== ALL OBJECTS IN CLASS: INTERNALMASS =========== + +InternalMass, + Internalmass_unit1, !- Name + InteriorFurnishings, !- Construction Name + living_unit1, !- Zone or ZoneList Name + 9.89591078066915; !- Surface Area {m2} + + +!- =========== ALL OBJECTS IN CLASS: SHADING:OVERHANG =========== + +Shading:Overhang, + Overhang_sdr_1.unit1, !- Name + Window_sdr_1.unit1, !- Window or Door Name + 0, !- Height above Window or Door {m} + 90, !- Tilt Angle from Window/Door {deg} + 0, !- Left extension from Window/Door Width {m} + 0, !- Right extension from Window/Door Width {m} + 0.0152439024390244; !- Depth {m} + +Shading:Overhang, + Overhang_sdr_2.unit1, !- Name + Window_sdr_2.unit1, !- Window or Door Name + 0, !- Height above Window or Door {m} + 90, !- Tilt Angle from Window/Door {deg} + 0, !- Left extension from Window/Door Width {m} + 0, !- Right extension from Window/Door Width {m} + 0.0152439024390244; !- Depth {m} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:CONTROL =========== + +GroundHeatTransfer:Control, + gtp_control, !- Name + no, !- Run Basement Preprocessor + yes; !- Run Slab Preprocessor + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:MATERIALS =========== + +GroundHeatTransfer:Slab:Materials, + 2, !- NMAT: Number of materials + 0.16, !- ALBEDO: Surface Albedo: No Snow + 0.4, !- ALBEDO: Surface Albedo: Snow + 0.9, !- EPSLW: Surface Emissivity: No Snow + 0.9, !- EPSLW: Surface Emissivity: Snow + 0.75, !- Z0: Surface Roughness: No Snow {cm} + 0.05, !- Z0: Surface Roughness: Snow {cm} + 6, !- HIN: Indoor HConv: Downward Flow {W/m2-K} + 9; !- HIN: Indoor HConv: Upward {W/m2-K} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:MATLPROPS =========== + +GroundHeatTransfer:Slab:MatlProps, + 2300, !- RHO: Slab Material density {kg/m3} + 1200, !- RHO: Soil Density {kg/m3} + 650, !- CP: Slab CP {J/kg-K} + 1200, !- CP: Soil CP {J/kg-K} + 0.9, !- TCON: Slab k {W/m-K} + 1; !- TCON: Soil k {W/m-K} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:BOUNDCONDS =========== + +GroundHeatTransfer:Slab:BoundConds, + FALSE, !- EVTR: Is surface evapotranspiration modeled + TRUE, !- FIXBC: is the lower boundary at a fixed temperature + 10, !- TDEEPin {C} + FALSE; !- USRHflag: Is the ground surface h specified by the user? + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:BLDGPROPS =========== + +GroundHeatTransfer:Slab:BldgProps, + 10, !- IYRS: Number of years to iterate + 0, !- Shape: Slab shape + 4, !- HBLDG: Building height {m} + 22.22, !- TIN1: January Indoor Average Temperature Setpoint {C} + 22.22, !- TIN2: February Indoor Average Temperature Setpoint {C} + 22.22, !- TIN3: March Indoor Average Temperature Setpoint {C} + 22.22, !- TIN4: April Indoor Average Temperature Setpoint {C} + 22.22, !- TIN5: May Indoor Average Temperature Setpoint {C} + 23.88, !- TIN6: June Indoor Average Temperature Setpoint {C} + 23.88, !- TIN7: July Indoor Average Temperature Setpoint {C} + 23.88, !- TIN8: August Indoor Average Temperature Setpoint {C} + 23.88, !- TIN9: September Indoor Average Temperature Setpoint {C} + 22.22, !- TIN10: October Indoor Average Temperature Setpoint {C} + 22.22, !- TIN11: November Indoor Average Temperature Setpoint {C} + 22.22, !- TIN12: December Indoor Average Temperature Setpoint {C} + 0, !- TINAmp: Daily Indoor sine wave variation amplitude {deltaC} + 0.1; !- ConvTol: Convergence Tolerance + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:INSULATION =========== + +GroundHeatTransfer:Slab:Insulation, + 0, !- RINS: R value of under slab insulation {m2-K/W} + 0, !- DINS: Width of strip of under slab insulation {m} + 1.76099742894375, !- RVINS: R value of vertical insulation {m2-K/W} + 0.6, !- ZVINS: Depth of vertical insulation {m} + 1; !- IVINS: Flag: Is there vertical insulation + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:EQUIVALENTSLAB =========== + +GroundHeatTransfer:Slab:EquivalentSlab, + 2.59994805991784, !- APRatio: The area to perimeter ratio for this slab {m} + 0.1, !- SLABDEPTH: Thickness of slab on grade {m} + 15, !- CLEARANCE: Distance from edge of slab to domain edge {m} + 15; !- ZCLEARANCE: Distance from bottom of slab to domain bottom {m} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:SIMPARAMETERS =========== + +GroundHeatTransfer:Basement:SimParameters, + 0.1, !- F: Multiplier for the ADI solution + 15; !- IYRS: Maximum number of yearly iterations: + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:MATLPROPS =========== + +GroundHeatTransfer:Basement:MatlProps, + 6, !- NMAT: Number of materials in this domain + 2243, !- Density for Foundation Wall {kg/m3} + 2243, !- density for Floor Slab {kg/m3} + 311, !- density for Ceiling {kg/m3} + 1500, !- density for Soil {kg/m3} + 2000, !- density for Gravel {kg/m3} + 449, !- density for Wood {kg/m3} + 880, !- Specific heat for foundation wall {J/kg-K} + 880, !- Specific heat for floor slab {J/kg-K} + 1530, !- Specific heat for ceiling {J/kg-K} + 840, !- Specific heat for soil {J/kg-K} + 720, !- Specific heat for gravel {J/kg-K} + 1530, !- Specific heat for wood {J/kg-K} + 1.4, !- Thermal conductivity for foundation wall {W/m-K} + 1.4, !- Thermal conductivity for floor slab {W/m-K} + 0.09, !- Thermal conductivity for ceiling {W/m-K} + 1.1, !- thermal conductivity for soil {W/m-K} + 1.9, !- thermal conductivity for gravel {W/m-K} + 0.12; !- thermal conductivity for wood {W/m-K} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:INSULATION =========== + +GroundHeatTransfer:Basement:Insulation, + 1.76099742894375e-05, !- REXT: R Value of any exterior insulation {m2-K/W} + True; !- INSFULL: Flag: Is the wall fully insulated? + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:SURFACEPROPS =========== + +GroundHeatTransfer:Basement:SurfaceProps, + 0.16, !- ALBEDO: Surface albedo for No snow conditions + 0.4, !- ALBEDO: Surface albedo for snow conditions + 0.94, !- EPSLN: Surface emissivity No Snow + 0.86, !- EPSLN: Surface emissivity with Snow + 6, !- VEGHT: Surface roughness No snow conditions {cm} + 0.25, !- VEGHT: Surface roughness Snow conditions {cm} + False; !- PET: Flag, Potential evapotranspiration on? + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:BLDGDATA =========== + +GroundHeatTransfer:Basement:BldgData, + 0.200000006162114, !- DWALL: Wall thickness {m} + 0.243828108701145, !- DSLAB: Floor slab thickness {m} + 0.3, !- DGRAVXY: Width of gravel pit beside basement wall {m} + 0.2, !- DGRAVZN: Gravel depth extending above the floor slab {m} + 0.1; !- DGRAVZP: Gravel depth below the floor slab {m} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:INTERIOR =========== + +GroundHeatTransfer:Basement:Interior, + True, !- COND: Flag: Is the basement conditioned? + 0.92, !- HIN: Downward convection only heat transfer coefficient {W/m2-K} + 4.04, !- HIN: Upward convection only heat transfer coefficient {W/m2-K} + 3.08, !- HIN: Horizontal convection only heat transfer coefficient {W/m2-K} + 6.13, !- HIN: Downward combined (convection and radiation) heat transfer coefficient {W/m2-K} + 9.26, !- HIN: Upward combined (convection and radiation) heat transfer coefficient {W/m2-K} + 8.29; !- HIN: Horizontal combined (convection and radiation) heat transfer coefficient {W/m2-K} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:COMBLDG =========== + +GroundHeatTransfer:Basement:ComBldg, + 21, !- January average temperature {C} + 21, !- February average temperature {C} + 21, !- March average temperature {C} + 21, !- April average temperature {C} + 24, !- May average temperature {C} + 24, !- June average temperature {C} + 24, !- July average temperature {C} + 24, !- August average temperature {C} + 24, !- September average temperature {C} + 24, !- October average temperature {C} + 21, !- November average temperature {C} + 21, !- December average temperature {C} + 21; !- Daily variation sine wave amplitude {deltaC} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:EQUIVSLAB =========== + +GroundHeatTransfer:Basement:EquivSlab, + 2.59994805991784, !- APRatio: The area to perimeter ratio for this slab {m} + True; !- EquivSizing: Flag + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:EQUIVAUTOGRID =========== + +GroundHeatTransfer:Basement:EquivAutoGrid, + 15, !- CLEARANCE: Distance from outside of wall to edge of 3-D ground domain {m} + 0.1, !- SlabDepth: Thickness of the floor slab {m} + 1.21914054350572; !- BaseDepth: Depth of the basement wall below grade {m} + + +!- =========== ALL OBJECTS IN CLASS: PEOPLE =========== + +People, + people_unit1, !- Name + living_unit1, !- Zone or ZoneList Name + Occupancy, !- Number of People Schedule Name + People, !- Number of People Calculation Method + 3, !- Number of People + , !- People per Zone Floor Area {person/m2} + , !- Zone Floor Area per Person {m2/person} + 0, !- Fraction Radiant + autocalculate, !- Sensible Heat Fraction + activity_sch, !- Activity Level Schedule Name + , !- Carbon Dioxide Generation Rate {m3/s-W} + No, !- Enable ASHRAE 55 Comfort Warnings + ZoneAveraged; !- Mean Radiant Temperature Calculation Type + + +!- =========== ALL OBJECTS IN CLASS: LIGHTS =========== + +Lights, + Living Hardwired Lighting1, !- Name + living_unit1, !- Zone or ZoneList Name + InteriorLightingHE, !- Schedule Name + Watts/Area, !- Design Level Calculation Method + , !- Lighting Level {W} + 1.05216214401829, !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0, !- Return Air Fraction + 0.6, !- Fraction Radiant + 0.2, !- Fraction Visible + 0; !- Fraction Replaceable + +Lights, + Living Plug-in Lighting1,!- Name + living_unit1, !- Zone or ZoneList Name + InteriorLightingHE, !- Schedule Name + Watts/Area, !- Design Level Calculation Method + , !- Lighting Level {W} + 0.478467682251396, !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0, !- Return Air Fraction + 0.6, !- Fraction Radiant + 0.2, !- Fraction Visible + 0; !- Fraction Replaceable + + +!- =========== ALL OBJECTS IN CLASS: ELECTRICEQUIPMENT =========== + +ElectricEquipment, + dishwasher1, !- Name + living_unit1, !- Zone or ZoneList Name + DishWasher, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 65.698787492023, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.15, !- Fraction Latent + 0.6, !- Fraction Radiant + 0.25, !- Fraction Lost + dishwasher; !- End-Use Subcategory + +ElectricEquipment, + refrigerator1, !- Name + living_unit1, !- Zone or ZoneList Name + Refrigerator, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 91.0575745202123, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0, !- Fraction Latent + 1, !- Fraction Radiant + 0, !- Fraction Lost + refrigerator; !- End-Use Subcategory + +ElectricEquipment, + clotheswasher1, !- Name + living_unit1, !- Zone or ZoneList Name + ClothesWasher, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 28.4784377542718, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0, !- Fraction Latent + 0.8, !- Fraction Radiant + 0.2, !- Fraction Lost + clotheswasher; !- End-Use Subcategory + +ElectricEquipment, + electric_dryer1, !- Name + living_unit1, !- Zone or ZoneList Name + ClothesDryer, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 213.064557285022, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.05, !- Fraction Latent + 0.15, !- Fraction Radiant + 0.8, !- Fraction Lost + electric_dryer; !- End-Use Subcategory + +ElectricEquipment, + electric_range1, !- Name + living_unit1, !- Zone or ZoneList Name + CookingRange, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 248.154224774405, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.3, !- Fraction Latent + 0.4, !- Fraction Radiant + 0.3, !- Fraction Lost + electric_range; !- End-Use Subcategory + +ElectricEquipment, + television1, !- Name + living_unit1, !- Zone or ZoneList Name + InteriorLighting, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 0, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0, !- Fraction Latent + 1, !- Fraction Radiant + 0, !- Fraction Lost + television; !- End-Use Subcategory + +ElectricEquipment, + electric_mels1, !- Name + living_unit1, !- Zone or ZoneList Name + MiscPlugLoad, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 567.464237516869, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.06, !- Fraction Latent + 0.69, !- Fraction Radiant + 0.25, !- Fraction Lost + electric_mels; !- End-Use Subcategory + +ElectricEquipment, + IECC_Adj1, !- Name + living_unit1, !- Zone or ZoneList Name + MiscPlugLoad, !- Schedule Name + Watts/Area, !- Design Level Calculation Method + , !- Design Level {W} + 1.54356736989469, !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0624390461422629, !- Fraction Latent + 0.41190936353998, !- Fraction Radiant + 0.251045347957769, !- Fraction Lost + IECC_adj; !- End-Use Subcategory + + +!- =========== ALL OBJECTS IN CLASS: ZONEVENTILATION:DESIGNFLOWRATE =========== + +ZoneVentilation:DesignFlowRate, + Ventilation_unit1, !- Name + living_unit1, !- Zone or ZoneList Name + always_avail, !- Schedule Name + Flow/Zone, !- Design Flow Rate Calculation Method + 0, !- Design Flow Rate {m3/s} + , !- Flow Rate per Zone Floor Area {m3/s-m2} + , !- Flow Rate per Person {m3/s-person} + , !- Air Changes per Hour {1/hr} + Exhaust, !- Ventilation Type + 0, !- Fan Pressure Rise {Pa} + 0.6, !- Fan Total Efficiency + 1, !- Constant Term Coefficient + 0, !- Temperature Term Coefficient + 0, !- Velocity Term Coefficient + 0, !- Velocity Squared Term Coefficient + -100, !- Minimum Indoor Temperature {C} + , !- Minimum Indoor Temperature Schedule Name + 100, !- Maximum Indoor Temperature {C} + , !- Maximum Indoor Temperature Schedule Name + -100, !- Delta Temperature {deltaC} + , !- Delta Temperature Schedule Name + -100, !- Minimum Outdoor Temperature {C} + , !- Minimum Outdoor Temperature Schedule Name + 100, !- Maximum Outdoor Temperature {C} + , !- Maximum Outdoor Temperature Schedule Name + 40; !- Maximum Wind Speed {m/s} + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:SIMULATIONCONTROL =========== + +AirflowNetwork:SimulationControl, + House AirflowNetwork, !- Name + MultizoneWithDistribution, !- AirflowNetwork Control + SurfaceAverageCalculation, !- Wind Pressure Coefficient Type + , !- Height Selection for Local Wind Pressure Calculation + LOWRISE, !- Building Type + 500, !- Maximum Number of Iterations {dimensionless} + , !- Initialization Type + 0.001, !- Relative Airflow Convergence Tolerance {dimensionless} + 0.00001, !- Absolute Airflow Convergence Tolerance {kg/s} + 0, !- Convergence Acceleration Limit {dimensionless} + 0, !- Azimuth Angle of Long Axis of Building {deg} + 0.75, !- Ratio of Building Width Along Short Axis to Width Along Long Axis + , + , + Yes; + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:MULTIZONE:ZONE =========== + +AirflowNetwork:MultiZone:Zone, + living_unit1, !- Zone Name + NoVent, !- Ventilation Control Mode + , !- Ventilation Control Zone Temperature Setpoint Schedule Name + 0, !- Minimum Venting Open Factor {dimensionless} + 0.0, !- Indoor and Outdoor Temperature Difference Lower Limit For Maximum Venting Open Factor {deltaC} + 100.0, !- Indoor and Outdoor Temperature Difference Upper Limit for Minimum Venting Open Factor {deltaC} + 0.0, !- Indoor and Outdoor Enthalpy Difference Lower Limit For Maximum Venting Open Factor {deltaJ/kg} + 300000.0; !- Indoor and Outdoor Enthalpy Difference Upper Limit for Minimum Venting Open Factor {deltaJ/kg} + +AirflowNetwork:MultiZone:Zone, + attic_unit1, !- Zone Name + Constant, !- Ventilation Control Mode + , !- Ventilation Control Zone Temperature Setpoint Schedule Name + , !- Minimum Venting Open Factor {dimensionless} + , !- Indoor and Outdoor Temperature Difference Lower Limit For Maximum Venting Open Factor {deltaC} + 100, !- Indoor and Outdoor Temperature Difference Upper Limit for Minimum Venting Open Factor {deltaC} + , !- Indoor and Outdoor Enthalpy Difference Lower Limit For Maximum Venting Open Factor {deltaJ/kg} + 300000, !- Indoor and Outdoor Enthalpy Difference Upper Limit for Minimum Venting Open Factor {deltaJ/kg} + inf_sch; !- Venting Availability Schedule Name + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:MULTIZONE:SURFACE =========== + +AirflowNetwork:MultiZone:Surface, + Roof_front_unit1, !- Surface Name + AtticVent, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + Constant, !- Ventilation Control Mode + , !- Ventilation Control Zone Temperature Setpoint Schedule Name + 0, !- Minimum Venting Open Factor {dimensionless} + , !- Indoor and Outdoor Temperature Difference Lower Limit For Maximum Venting Open Factor {deltaC} + 100, !- Indoor and Outdoor Temperature Difference Upper Limit for Minimum Venting Open Factor {deltaC} + , !- Indoor and Outdoor Enthalpy Difference Lower Limit For Maximum Venting Open Factor {deltaJ/kg} + 300000, !- Indoor and Outdoor Enthalpy Difference Upper Limit for Minimum Venting Open Factor {deltaJ/kg} + inf_sch; !- Venting Availability Schedule Name + +AirflowNetwork:MultiZone:Surface, + Roof_back_unit1, !- Surface Name + AtticVent, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + Constant, !- Ventilation Control Mode + , !- Ventilation Control Zone Temperature Setpoint Schedule Name + , !- Minimum Venting Open Factor {dimensionless} + , !- Indoor and Outdoor Temperature Difference Lower Limit For Maximum Venting Open Factor {deltaC} + 100, !- Indoor and Outdoor Temperature Difference Upper Limit for Minimum Venting Open Factor {deltaC} + , !- Indoor and Outdoor Enthalpy Difference Lower Limit For Maximum Venting Open Factor {deltaJ/kg} + 300000, !- Indoor and Outdoor Enthalpy Difference Upper Limit for Minimum Venting Open Factor {deltaJ/kg} + inf_sch; !- Venting Availability Schedule Name + +AirflowNetwork:MultiZone:Surface, + Roof_right_unit1, !- Surface Name + AtticVent, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + Constant, !- Ventilation Control Mode + , !- Ventilation Control Zone Temperature Setpoint Schedule Name + , !- Minimum Venting Open Factor {dimensionless} + , !- Indoor and Outdoor Temperature Difference Lower Limit For Maximum Venting Open Factor {deltaC} + 100, !- Indoor and Outdoor Temperature Difference Upper Limit for Minimum Venting Open Factor {deltaC} + , !- Indoor and Outdoor Enthalpy Difference Lower Limit For Maximum Venting Open Factor {deltaJ/kg} + 300000, !- Indoor and Outdoor Enthalpy Difference Upper Limit for Minimum Venting Open Factor {deltaJ/kg} + inf_sch; !- Venting Availability Schedule Name + +AirflowNetwork:MultiZone:Surface, + Roof_left_unit1, !- Surface Name + AtticVent, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + Constant, !- Ventilation Control Mode + , !- Ventilation Control Zone Temperature Setpoint Schedule Name + , !- Minimum Venting Open Factor {dimensionless} + , !- Indoor and Outdoor Temperature Difference Lower Limit For Maximum Venting Open Factor {deltaC} + 100, !- Indoor and Outdoor Temperature Difference Upper Limit for Minimum Venting Open Factor {deltaC} + , !- Indoor and Outdoor Enthalpy Difference Lower Limit For Maximum Venting Open Factor {deltaJ/kg} + 300000, !- Indoor and Outdoor Enthalpy Difference Upper Limit for Minimum Venting Open Factor {deltaJ/kg} + inf_sch; !- Venting Availability Schedule Name + +AirflowNetwork:MultiZone:Surface, + ceiling_unit1, !- Surface Name + ZoneLeak_Ceiling, !- Leakage Component Name + , !- External Node Name + 1.0, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_ldf_1.unit1, !- Surface Name + ZoneLeak_LongWall, !- Leakage Component Name + , !- External Node Name + 1.0, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_ldb_1.unit1, !- Surface Name + ZoneLeak_LongWall, !- Leakage Component Name + , !- External Node Name + 1.0, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_sdl_1.unit1, !- Surface Name + ZoneLeak_ShortWall, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_sdr_1.unit1, !- Surface Name + ZoneLeak_ShortWall, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_ldf_2.unit1, !- Surface Name + ZoneLeak_LongWall, !- Leakage Component Name + , !- External Node Name + 1.0, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_ldb_2.unit1, !- Surface Name + ZoneLeak_LongWall, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_sdr_2.unit1, !- Surface Name + ZoneLeak_ShortWall, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_sdl_2.unit1, !- Surface Name + ZoneLeak_ShortWall, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_sdr_2.unit1, !- Surface Name + Zone Exhaust Fan_unit1, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + Constant; !- Ventilation Control Mode + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:MULTIZONE:SURFACE:EFFECTIVELEAKAGEAREA =========== + +AirflowNetwork:MultiZone:Surface:EffectiveLeakageArea, + ZoneLeak_LongWall, !- Name + 0.00340012477060435, !- Effective Leakage Area {m2} + 1.15, !- Discharge Coefficient {dimensionless} + 4, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + +AirflowNetwork:MultiZone:Surface:EffectiveLeakageArea, + ZoneLeak_ShortWall, !- Name + 0.00255009357795326, !- Effective Leakage Area {m2} + 1.15, !- Discharge Coefficient {dimensionless} + 4, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + +AirflowNetwork:MultiZone:Surface:EffectiveLeakageArea, + ZoneLeak_Ceiling, !- Name + 0.011939399618037, !- Effective Leakage Area {m2} + 1.15, !- Discharge Coefficient {dimensionless} + 4, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + +AirflowNetwork:MultiZone:Surface:EffectiveLeakageArea, + ZoneLeak_Floor, !- Name + 0.00001, !- Effective Leakage Area {m2} + 1.15, !- Discharge Coefficient {dimensionless} + 4, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + +AirflowNetwork:MultiZone:Surface:EffectiveLeakageArea, + AtticVent, !- Name + 0.37, !- Effective Leakage Area {m2} + 1.15, !- Discharge Coefficient {dimensionless} + 4, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + +AirflowNetwork:MultiZone:Surface:EffectiveLeakageArea, + CrawlVent, !- Name + 0.37, !- Effective Leakage Area {m2} + 1.15, !- Discharge Coefficient {dimensionless} + 4, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:MULTIZONE:COMPONENT:ZONEEXHAUSTFAN =========== + +AirflowNetwork:MultiZone:Component:ZoneExhaustFan, + Zone Exhaust Fan_unit1, !- Name + 0.01, !- Air Mass Flow Coefficient When the Zone Exhaust Fan is Off at Reference Conditions {kg/s} + 0.667; !- Air Mass Flow Exponent When the Zone Exhaust Fan is Off {dimensionless} + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:DISTRIBUTION:NODE =========== + +AirflowNetwork:Distribution:Node, + EquipmentInletNode_unit1,!- Name + Zone Equipment Inlet Node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + SplitterNode_unit1, !- Name + , !- Component Name or Node Name + AirLoopHVAC:ZoneSplitter,!- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + ZoneSupplyNode_unit1, !- Name + , !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + ZoneSupplyRegisterNode_unit1 ATInlet, !- Name + Zone Inlet Node_unit1 ATInlet, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + ZoneSupplyRegisterNode_unit1, !- Name + Zone Inlet Node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + ZoneOutletNode_unit1, !- Name + Zone Outlet node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + ZoneReturnNode_unit1, !- Name + , !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + MixerNode_unit1, !- Name + , !- Component Name or Node Name + AirLoopHVAC:ZoneMixer, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + MainReturnNode_unit1, !- Name + Return Air Mixer Outlet_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + MainInletNode_unit1, !- Name + Air Loop Inlet Node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + FanOutletNode_unit1, !- Name + Cooling Coil Air Inlet Node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + HeatingInletNode_unit1, !- Name + Heating Coil Air Inlet Node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + HeatingOutletNode_unit1, !- Name + Air Loop Outlet Node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + SuppHeatingInletNode_unit1, !- Name + Supp Heating coil air inlet Node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:DISTRIBUTION:COMPONENT:LEAKAGERATIO =========== + +AirflowNetwork:Distribution:Component:LeakageRatio, + SupplyLeak, !- Name + 0.0396, !- Effective Leakage Ratio {dimensionless} + 0.56034, !- Maximum Flow Rate {m3/s} + 25, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + +AirflowNetwork:Distribution:Component:LeakageRatio, + ReturnLeak, !- Name + 0.0396, !- Effective Leakage Ratio {dimensionless} + 0.56034, !- Maximum Flow Rate {m3/s} + 25, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:DISTRIBUTION:COMPONENT:DUCT =========== + +AirflowNetwork:Distribution:Component:Duct, + MainTrunk_unit1, !- Name + 2.0, !- Duct Length {m} + 0.591921113608382, !- Hydraulic Diameter {m} + 0.275216110019646, !- Cross Section Area {m2} + 0.0009, !- Surface Roughness {m} + 0.01, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + +AirflowNetwork:Distribution:Component:Duct, + ZoneSupply_unit1, !- Name + 15, !- Duct Length {m} + 0.591921113608382, !- Hydraulic Diameter {m} + 0.275216110019646, !- Cross Section Area {m2} + 0.0009, !- Surface Roughness {m} + 10, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + +AirflowNetwork:Distribution:Component:Duct, + ZoneSupplyLink2_unit1 ATInlet Duct, !- Name + 0.0001, !- Duct Length {m} + 0.591921113608382, !- Hydraulic Diameter {m} + 0.275216110019646, !- Cross Section Area {m2} + 0.0009, !- Surface Roughness {m} + 0, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + +AirflowNetwork:Distribution:Component:Duct, + ZoneReturn_unit1, !- Name + 8.0, !- Duct Length {m} + 0.529430338938287, !- Hydraulic Diameter {m} + 0.220172888015717, !- Cross Section Area {m2} + 0.0009, !- Surface Roughness {m} + 9, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + +AirflowNetwork:Distribution:Component:Duct, + ZoneConnectionDuct_unit1,!- Name + 0.1, !- Duct Length {m} + 0.591921113608382, !- Hydraulic Diameter {m} + 0.275216110019646, !- Cross Section Area {m2} + 0.0001, !- Surface Roughness {m} + 0.00, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + +AirflowNetwork:Distribution:Component:Duct, + MainReturn_unit1, !- Name + 1.0, !- Duct Length {m} + 0.529430338938287, !- Hydraulic Diameter {m} + 0.220172888015717, !- Cross Section Area {m2} + 0.0009, !- Surface Roughness {m} + 0.01, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + +AirflowNetwork:Distribution:Component:Duct, + AirLoopReturn_unit1, !- Name + 0.1, !- Duct Length {m} + 0.529430338938287, !- Hydraulic Diameter {m} + 0.220172888015717, !- Cross Section Area {m2} + 0.0001, !- Surface Roughness {m} + 0.00, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + +AirflowNetwork:Distribution:Component:Duct, + AirLoopSupply_unit1, !- Name + 0.1, !- Duct Length {m} + 0.591921113608382, !- Hydraulic Diameter {m} + 0.275216110019646, !- Cross Section Area {m2} + 0.0001, !- Surface Roughness {m} + 0.00, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:DISTRIBUTION:COMPONENT:FAN =========== + +AirflowNetwork:Distribution:Component:Fan, + Supply Fan_unit1, !- Fan Name + Fan:OnOff; !- Supply Fan Object Type + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:DISTRIBUTION:COMPONENT:COIL =========== + +AirflowNetwork:Distribution:Component:Coil, + DX Cooling Coil_unit1, !- Coil Name + Coil:Cooling:DX:SingleSpeed, !- Coil Object Type + 0.1, !- Air Path Length {m} + 1.000; !- Air Path Hydraulic Diameter {m} + +AirflowNetwork:Distribution:Component:Coil, + Main DX Heating Coil_unit1, !- Coil Name + Coil:Heating:DX:Singlespeed, !- Coil Object Type + 0.1, !- Air Path Length {m} + 1.000; !- Air Path Hydraulic Diameter {m} + +AirflowNetwork:Distribution:Component:Coil, + Supp Heating Coil_unit1, !- Coil Name + Coil:Heating:Electric, !- Coil Object Type + 0.1, !- Air Path Length {m} + 1.000; !- Air Path Hydraulic Diameter {m} + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:DISTRIBUTION:LINKAGE =========== + +AirflowNetwork:Distribution:Linkage, + MainSupplyLink_unit1, !- Name + EquipmentInletNode_unit1,!- Node 1 Name + SplitterNode_unit1, !- Node 2 Name + MainTrunk_unit1, !- Component Name + attic_unit1; !- Thermal Zone Name + +AirflowNetwork:Distribution:Linkage, + ZoneSupplyLink_unit1, !- Name + SplitterNode_unit1, !- Node 1 Name + ZoneSupplyNode_unit1, !- Node 2 Name + ZoneSupply_unit1, !- Component Name + attic_unit1; !- Thermal Zone Name + +AirflowNetwork:Distribution:Linkage, + ZoneSupplyLink2_unit1 ATInlet, !- Name + ZoneSupplyRegisterNode_unit1 ATInlet, !- Node 1 Name + ZoneSupplyRegisterNode_unit1, !- Node 2 Name + ZoneSupplyLink2_unit1 ATInlet Duct, !- Component Name + attic_unit1; !- Thermal Zone Name + +AirflowNetwork:Distribution:Linkage, + ZoneSupplyLink2_unit1, !- Name + ZoneSupplyNode_unit1, !- Node 1 Name + ZoneSupplyRegisterNode_unit1 ATInlet, !- Node 2 Name + ZoneSupply_unit1, !- Component Name + attic_unit1; !- Thermal Zone Name + +AirflowNetwork:Distribution:Linkage, + ZoneSupplyConnectionLink_unit1, !- Name + ZoneSupplyRegisterNode_unit1, !- Node 1 Name + living_unit1, !- Node 2 Name + ZoneConnectionDuct_unit1;!- Component Name + +AirflowNetwork:Distribution:Linkage, + ZoneReturnConnectionLink_unit1, !- Name + living_unit1, !- Node 1 Name + ZoneOutletNode_unit1, !- Node 2 Name + ZoneConnectionDuct_unit1;!- Component Name + +AirflowNetwork:Distribution:Linkage, + ZoneReturnLink1_unit1, !- Name + Zoneoutletnode_unit1, !- Node 1 Name + ZoneReturnNode_unit1, !- Node 2 Name + ZoneReturn_unit1, !- Component Name + attic_unit1; !- Thermal Zone Name + +AirflowNetwork:Distribution:Linkage, + ZoneReturnLink2_unit1, !- Name + ZoneReturnNode_unit1, !- Node 1 Name + MixerNode_unit1, !- Node 2 Name + ZoneReturn_unit1, !- Component Name + attic_unit1; !- Thermal Zone Name + +AirflowNetwork:Distribution:Linkage, + MainReturnLink_unit1, !- Name + MixerNode_unit1, !- Node 1 Name + MainReturnNode_unit1, !- Node 2 Name + MainReturn_unit1, !- Component Name + attic_unit1; !- Thermal Zone Name + +AirflowNetwork:Distribution:Linkage, + SystemReturnLink_unit1, !- Name + MainReturnNode_unit1, !- Node 1 Name + MainInletNode_unit1, !- Node 2 Name + AirLoopReturn_unit1; !- Component Name + +AirflowNetwork:Distribution:Linkage, + SupplyFanLink_unit1, !- Name + MainInletNode_unit1, !- Node 1 Name + FanOutletNode_unit1, !- Node 2 Name + Supply Fan_unit1; !- Component Name + +AirflowNetwork:Distribution:Linkage, + CoolingCoilLink_unit1, !- Name + FanOutletNode_unit1, !- Node 1 Name + HeatingInletNode_unit1, !- Node 2 Name + DX Cooling Coil_unit1; !- Component Name + +AirflowNetwork:Distribution:Linkage, + EquipmentAirLoopLink_unit1, !- Name + HeatingOutletNode_unit1, !- Node 1 Name + EquipmentInletNode_unit1,!- Node 2 Name + AirLoopSupply_unit1; !- Component Name + +AirflowNetwork:Distribution:Linkage, + HeatingCoilLink_unit1, !- Name + HeatingInletNode_unit1, !- Node 1 Name + SuppHeatingInletNode_unit1, !- Node 2 Name + Main DX Heating Coil_unit1; !- Component Name + +AirflowNetwork:Distribution:Linkage, + SuppHeatingCoilLink_unit1, !- Name + SuppHeatingInletNode_unit1, !- Node 1 Name + HeatingOutletNode_unit1, !- Node 2 Name + Supp Heating Coil_unit1; !- Component Name + +AirflowNetwork:Distribution:Linkage, + ZoneSupplyLeakLink_unit1,!- Name + ZoneSupplyNode_unit1, !- Node 1 Name + attic_unit1, !- Node 2 Name + SupplyLeak; !- Component Name + +AirflowNetwork:Distribution:Linkage, + ZoneReturnLeakLink_unit1,!- Name + attic_unit1, !- Node 1 Name + ZoneReturnNode_unit1, !- Node 2 Name + ReturnLeak; !- Component Name + + +!- =========== ALL OBJECTS IN CLASS: EXTERIOR:LIGHTS =========== + +Exterior:Lights, + Exterior-Lights_unit1, !- Name + ExteriorLighting, !- Schedule Name + 43.2424607481559, !- Design Level {W} + , !- Control Option + Exterior-Lights; !- End-Use Subcategory + +Exterior:Lights, + Garage-Lights_unit1, !- Name + InteriorLightingHE, !- Schedule Name + 7.16294617434682, !- Design Level {W} + , !- Control Option + Garage-Lights; !- End-Use Subcategory + + +!- =========== ALL OBJECTS IN CLASS: DESIGNSPECIFICATION:OUTDOORAIR =========== + +DesignSpecification:OutdoorAir, + SZ_DSOA_living_unit1, !- Name + Flow/Zone, !- Outdoor Air Method + 0, !- Outdoor Air Flow per Person {m3/s-person} + , !- Outdoor Air Flow per Zone Floor Area {m3/s-m2} + 0.0283168464628752; !- Outdoor Air Flow per Zone {m3/s} + + +!- =========== ALL OBJECTS IN CLASS: SIZING:ZONE =========== + +Sizing:Zone, + living_unit1, !- Zone or ZoneList Name + SupplyAirTemperature, !- Zone Cooling Design Supply Air Temperature Input Method + 12, !- Zone Cooling Design Supply Air Temperature {C} + , !- Zone Cooling Design Supply Air Temperature Difference {deltaC} + SupplyAirTemperature, !- Zone Heating Design Supply Air Temperature Input Method + 50, !- Zone Heating Design Supply Air Temperature {C} + , !- Zone Heating Design Supply Air Temperature Difference {deltaC} + 0.008, !- Zone Cooling Design Supply Air Humidity Ratio {kgWater/kgDryAir} + 0.008, !- Zone Heating Design Supply Air Humidity Ratio {kgWater/kgDryAir} + SZ_DSOA_living_unit1, !- Design Specification Outdoor Air Object Name + , !- Zone Heating Sizing Factor + , !- Zone Cooling Sizing Factor + DesignDay, !- Cooling Design Air Flow Method + , !- Cooling Design Air Flow Rate {m3/s} + 0.000762, !- Cooling Minimum Air Flow per Zone Floor Area {m3/s-m2} + , !- Cooling Minimum Air Flow {m3/s} + , !- Cooling Minimum Air Flow Fraction + DesignDay, !- Heating Design Air Flow Method + , !- Heating Design Air Flow Rate {m3/s} + 0.002032, !- Heating Maximum Air Flow per Zone Floor Area {m3/s-m2} + 0.1415762, !- Heating Maximum Air Flow {m3/s} + 0.3, !- Heating Maximum Air Flow Fraction + , !- Design Specification Zone Air Distribution Object Name + , !- Account for Dedicated Outdoor Air System + , !- Dedicated Outdoor Air System Control Strategy + , !- Dedicated Outdoor Air Low Setpoint Temperature for Design {C} + ; !- Dedicated Outdoor Air High Setpoint Temperature for Design {C} + + +!- =========== ALL OBJECTS IN CLASS: SIZING:SYSTEM =========== + +Sizing:System, + Central System_unit1, !- AirLoop Name + Sensible, !- Type of Load to Size On + autosize, !- Design Outdoor Air Flow Rate {m3/s} + 1, !- Central Heating Maximum System Air Flow Ratio + 7, !- Preheat Design Temperature {C} + 0.008, !- Preheat Design Humidity Ratio {kgWater/kgDryAir} + 11, !- Precool Design Temperature {C} + 0.008, !- Precool Design Humidity Ratio {kgWater/kgDryAir} + 12, !- Central Cooling Design Supply Air Temperature {C} + 50, !- 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 + , !- Cooling Supply Air Flow Rate {m3/s} + , !- Cooling Supply Air Flow Rate Per Floor Area {m3/s-m2} + , !- Cooling Fraction of Autosized Cooling Supply Air Flow Rate + , !- Cooling Supply Air Flow Rate Per Unit Cooling Capacity {m3/s-W} + DesignDay, !- Heating Supply Air Flow Rate Method + , !- Heating Supply Air Flow Rate {m3/s} + , !- Heating Supply Air Flow Rate Per Floor Area {m3/s-m2} + , !- Heating Fraction of Autosized Heating Supply Air Flow Rate + , !- Heating Fraction of Autosized Cooling Supply Air Flow Rate + , !- Heating Supply Air Flow Rate Per Unit Heating Capacity {m3/s-W} + , !- System Outdoor Air Method + 1.0, !- Zone Maximum Outdoor Air Fraction {dimensionless} + CoolingDesignCapacity, !- Cooling Design Capacity Method + autosize, !- Cooling Design Capacity {W} + , !- Cooling Design Capacity Per Floor Area {W/m2} + , !- Fraction of Autosized Cooling Design Capacity + HeatingDesignCapacity, !- Heating Design Capacity Method + autosize, !- Heating Design Capacity {W} + , !- Heating Design Capacity Per Floor Area {W/m2} + , !- Fraction of Autosized Heating Design Capacity + OnOff; !- Central Cooling Capacity Control Method + + +!- =========== ALL OBJECTS IN CLASS: SIZING:PLANT =========== + +Sizing:Plant, + DHW Loop_unit1, !- Plant or Condenser Loop Name + Heating, !- Loop Type + 48.8888888888889, !- Design Loop Exit Temperature {C} + 5.55555555555556; !- Loop Design Temperature Difference {deltaC} + + +!- =========== ALL OBJECTS IN CLASS: ZONECONTROL:THERMOSTAT =========== + +ZoneControl:Thermostat, + Zone Thermostat_unit1, !- Name + living_unit1, !- Zone or ZoneList Name + zone_control_type, !- Control Type Schedule Name + ThermostatSetpoint:DualSetpoint, !- Control 1 Object Type + thermostat_living Dual SP Control; !- Control 1 Name + + +!- =========== ALL OBJECTS IN CLASS: THERMOSTATSETPOINT:DUALSETPOINT =========== + +ThermostatSetpoint:DualSetpoint, + thermostat_living Dual SP Control, !- Name + heating_sch, !- Heating Setpoint Temperature Schedule Name + cooling_sch; !- Cooling Setpoint Temperature Schedule Name + + +!- =========== ALL OBJECTS IN CLASS: ZONEHVAC:ENERGYRECOVERYVENTILATOR =========== + +ZoneHVAC:EnergyRecoveryVentilator, + ERV_unit1, !- Name + always_avail, !- Availability Schedule Name + OA_Heat_Recovery_Unit1, !- Heat Exchanger Name + 0.0283168464628752, !- Supply Air Flow Rate {m3/s} + 0.0283168464628752, !- Exhaust Air Flow Rate {m3/s} + OASupplyFan_unit1, !- Supply Air Fan Name + OAExhaustFan_unit1; !- Exhaust Air Fan Name + + +!- =========== ALL OBJECTS IN CLASS: AIRTERMINAL:SINGLEDUCT:CONSTANTVOLUME:NOREHEAT =========== + +AirTerminal:SingleDuct:ConstantVolume:NoReheat, + ZoneDirectAir_unit1, !- Name + always_avail, !- Availability Schedule Name + Zone Inlet Node_unit1 ATInlet, !- Air Inlet Node Name + Zone Inlet Node_unit1, !- Air Outlet Node Name + autosize; !- Maximum Air Flow Rate {m3/s} + + +!- =========== ALL OBJECTS IN CLASS: ZONEHVAC:AIRDISTRIBUTIONUNIT =========== + +ZoneHVAC:AirDistributionUnit, + ZoneDirectAir_unit1 ADU, !- Name + Zone Inlet Node_unit1, !- Air Distribution Unit Outlet Node Name + AirTerminal:SingleDuct:ConstantVolume:NoReheat, !- Air Terminal Object Type + ZoneDirectAir_unit1; !- Air Terminal Name + + +!- =========== ALL OBJECTS IN CLASS: ZONEHVAC:EQUIPMENTLIST =========== + +ZoneHVAC:EquipmentList, + ZoneEquipment_unit1, !- Name + SequentialLoad, !- Load Distribution Scheme + ZoneHVAC:AirDistributionUnit, !- Zone Equipment 1 Object Type + ZoneDirectAir_unit1 ADU, !- Zone Equipment 1 Name + 3, !- Zone Equipment 1 Cooling Sequence + 3, !- Zone Equipment 1 Heating or No-Load Sequence + , !- Zone Equipment 1 Sequential Cooling Fraction Schedule Name + , !- Zone Equipment 1 Sequential Heating Fraction Schedule Name + WaterHeater:HeatPump:WrappedCondenser, !- Zone Equipment 2 Object Type + Water Heater_unit1, !- Zone Equipment 2 Name + 1, !- Zone Equipment 2 Cooling Sequence + 1, !- Zone Equipment 2 Heating or No-Load Sequence + , !- Zone Equipment 2 Sequential Cooling Fraction Schedule Name + , !- Zone Equipment 2 Sequential Heating Fraction Schedule Name + Fan:ZoneExhaust, !- Zone Equipment 3 Object Type + Zone Exhaust Fan_unit1, !- Zone Equipment 3 Name + 4, !- Zone Equipment 3 Cooling Sequence + 4, !- Zone Equipment 3 Heating or No-Load Sequence + , !- Zone Equipment 3 Sequential Cooling Fraction Schedule Name + , !- Zone Equipment 3 Sequential Heating Fraction Schedule Name + ZoneHVAC:EnergyRecoveryVentilator, !- Zone Equipment 4 Object Type + ERV_unit1, !- Zone Equipment 4 Name + 2, !- Zone Equipment 4 Cooling Sequence + 2; !- Zone Equipment 4 Heating or No-Load Sequence + + +!- =========== ALL OBJECTS IN CLASS: ZONEHVAC:EQUIPMENTCONNECTIONS =========== + +ZoneHVAC:EquipmentConnections, + living_unit1, !- Zone Name + ZoneEquipment_unit1, !- Zone Conditioning Equipment List Name + zone inlet nodes_unit1, !- Zone Air Inlet Node or NodeList Name + Zone Exhaust Node_list_unit1, !- Zone Air Exhaust Node or NodeList Name + Zone Node_unit1, !- Zone Air Node Name + Zone Outlet Node_unit1; !- Zone Return Air Node or NodeList Name + + +!- =========== ALL OBJECTS IN CLASS: FAN:ONOFF =========== + +Fan:OnOff, + Supply Fan_unit1, !- Name + always_avail, !- Availability Schedule Name + 0.50054, !- Fan Total Efficiency + 400, !- Pressure Rise {Pa} + autosize, !- Maximum Flow Rate {m3/s} + 0.863, !- Motor Efficiency + 1, !- Motor In Airstream Fraction + air loop inlet node_unit1, !- Air Inlet Node Name + cooling coil air inlet node_unit1, !- Air Outlet Node Name + , !- Fan Power Ratio Function of Speed Ratio Curve Name + , !- Fan Efficiency Ratio Function of Speed Ratio Curve Name + General; !- End-Use Subcategory + +Fan:OnOff, + OASupplyFan_unit1, !- Name + always_avail, !- Availability Schedule Name + 0.6, !- Fan Total Efficiency + 454.045717061016, !- Pressure Rise {Pa} + 0.0283168464628752, !- Maximum Flow Rate {m3/s} + 1, !- Motor Efficiency + 0, !- Motor In Airstream Fraction + OA fan inlet node_unit1, !- Air Inlet Node Name + OA inlet node_unit1, !- Air Outlet Node Name + , !- Fan Power Ratio Function of Speed Ratio Curve Name + , !- Fan Efficiency Ratio Function of Speed Ratio Curve Name + Ventilation; !- End-Use Subcategory + +Fan:OnOff, + OAExhaustFan_unit1, !- Name + always_avail, !- Availability Schedule Name + 0.6, !- Fan Total Efficiency + 454.045717061016, !- Pressure Rise {Pa} + 0.0283168464628752, !- Maximum Flow Rate {m3/s} + 1, !- Motor Efficiency + 0, !- Motor In Airstream Fraction + ERVexhaustnode_unit1, !- Air Inlet Node Name + exhaust outlet node_unit1, !- Air Outlet Node Name + , !- Fan Power Ratio Function of Speed Ratio Curve Name + , !- Fan Efficiency Ratio Function of Speed Ratio Curve Name + Ventilation; !- End-Use Subcategory + +Fan:OnOff, + Heat Pump Water Heater Fan_unit1, !- Name + always_avail, !- Availability Schedule Name + 0.7, !- Fan Total Efficiency + 100.0, !- Pressure Rise {Pa} + autosize, !- Maximum Flow Rate {m3/s} + 0.9, !- Motor Efficiency + 1.0, !- Motor In Airstream Fraction + Heat Pump Water Heater Fan Inlet Node_unit1, !- Air Inlet Node Name + HPWH zone inlet node_unit1, !- Air Outlet Node Name + , !- Fan Power Ratio Function of Speed Ratio Curve Name + , !- Fan Efficiency Ratio Function of Speed Ratio Curve Name + General; !- End-Use Subcategory + + +!- =========== ALL OBJECTS IN CLASS: FAN:ZONEEXHAUST =========== + +Fan:ZoneExhaust, + Zone Exhaust Fan_unit1, !- Name + always_avail, !- Availability Schedule Name + 0.6, !- Fan Total Efficiency + 0.00001, !- Pressure Rise {Pa} + 0.000001, !- Maximum Flow Rate {m3/s} + Zone Exhaust Node_unit1, !- Air Inlet Node Name + zone exhaust fan outlet nodes_unit1, !- Air Outlet Node Name + Ventilation, !- End-Use Subcategory + , !- Flow Fraction Schedule Name + Decoupled; !- System Availability Manager Coupling Mode + + +!- =========== ALL OBJECTS IN CLASS: COIL:COOLING:DX:SINGLESPEED =========== + +Coil:Cooling:DX:SingleSpeed, + DX Cooling Coil_unit1, !- Name + always_avail, !- Availability Schedule Name + autosize, !- Gross Rated Total Cooling Capacity {W} + autosize, !- Gross Rated Sensible Heat Ratio + 4.06853019625951, !- Gross Rated Cooling COP {W/W} + autosize, !- Rated Air Flow Rate {m3/s} + , !- Rated Evaporator Fan Power Per Volume Flow Rate {W/(m3/s)} + Cooling Coil Air Inlet Node_unit1, !- Air Inlet Node Name + Heating Coil Air Inlet Node_unit1, !- Air Outlet Node Name + HPACCoolCapFT, !- Total Cooling Capacity Function of Temperature Curve Name + HPACCoolCapFFF, !- Total Cooling Capacity Function of Flow Fraction Curve Name + HPACCOOLEIRFT, !- Energy Input Ratio Function of Temperature Curve Name + HPACCOOLEIRFFF, !- Energy Input Ratio Function of Flow Fraction Curve Name + HPACCOOLPLFFPLR; !- Part Load Fraction Correlation Curve Name + + +!- =========== ALL OBJECTS IN CLASS: COIL:HEATING:ELECTRIC =========== + +Coil:Heating:Electric, + Supp Heating Coil_unit1, !- Name + always_avail, !- Availability Schedule Name + 1, !- Efficiency + autosize, !- Nominal Capacity {W} + Supp Heating Coil Air Inlet Node_unit1, !- Air Inlet Node Name + Air Loop Outlet Node_unit1; !- Air Outlet Node Name + + +!- =========== ALL OBJECTS IN CLASS: COIL:HEATING:DX:SINGLESPEED =========== + +Coil:Heating:DX:SingleSpeed, + Main DX Heating Coil_unit1, !- Name + always_avail, !- Availability Schedule Name + autosize, !- Gross Rated Heating Capacity {W} + 3.69308080013886, !- Gross Rated Heating COP {W/W} + autosize, !- Rated Air Flow Rate {m3/s} + , !- Rated Supply Fan Power Per Volume Flow Rate {W/(m3/s)} + Heating Coil Air Inlet Node_unit1, !- Air Inlet Node Name + Supp Heating Coil Air Inlet Node_unit1, !- Air Outlet Node Name + HPACHeatCapFT, !- Heating Capacity Function of Temperature Curve Name + HPACHeatCapFFF, !- Heating Capacity Function of Flow Fraction Curve Name + HPACHeatEIRFT, !- Energy Input Ratio Function of Temperature Curve Name + HPACHeatEIRFFF, !- Energy Input Ratio Function of Flow Fraction Curve Name + HPACCOOLPLFFPLR, !- Part Load Fraction Correlation Curve Name + Defrost_EIR_FT, !- Defrost Energy Input Ratio Function of Temperature Curve Name + -17.78, !- Minimum Outdoor Dry-Bulb Temperature for Compressor Operation {C} + , !- Outdoor Dry-Bulb Temperature to Turn On Compressor {C} + 5.0, !- Maximum Outdoor Dry-Bulb Temperature for Defrost Operation {C} + 200.0, !- Crankcase Heater Capacity {W} + 10.0, !- Maximum Outdoor Dry-Bulb Temperature for Crankcase Heater Operation {C} + ReverseCycle, !- Defrost Strategy + OnDemand; !- Defrost Control + + +!- =========== ALL OBJECTS IN CLASS: COIL:WATERHEATING:AIRTOWATERHEATPUMP:WRAPPED =========== + +Coil:WaterHeating:AirToWaterHeatPump:Wrapped, + Heat Pump Water Heater Evaporator_unit1, !- Name + 1500, !- Rated Heating Capacity {W} + 3.0, !- Rated COP {W/W} + 0.981, !- Rated Sensible Heat Ratio + 19.7, !- Rated Evaporator Inlet Air Dry-Bulb Temperature {C} + 13.5, !- Rated Evaporator Inlet Air Wet-Bulb Temperature {C} + 48.89, !- Rated Condenser Water Temperature {C} + 0.189, !- Rated Evaporator Air Flow Rate {m3/s} + yes, !- Evaporator Fan Power Included in Rated COP + Zone Exhaust Node1_unit1,!- Evaporator Air Inlet Node Name + Heat Pump Water Heater Fan Inlet Node_unit1, !- Evaporator Air Outlet Node Name + , !- Crankcase Heater Capacity {W} + 10, !- Maximum Ambient Temperature for Crankcase Heater Operation {C} + WetBulbTemperature, !- Evaporator Air Temperature Type for Curve Objects + HPWH-Htg-Cap-fT, !- Heating Capacity Function of Temperature Curve Name + , !- Heating Capacity Function of Air Flow Fraction Curve Name + HPWH-Htg-COP-fT, !- Heating COP Function of Temperature Curve Name + , !- Heating COP Function of Air Flow Fraction Curve Name + HPWH-COP-fPLR; !- Part Load Fraction Correlation Curve Name + + +!- =========== ALL OBJECTS IN CLASS: HEATEXCHANGER:AIRTOAIR:SENSIBLEANDLATENT =========== + +HeatExchanger:AirToAir:SensibleAndLatent, + OA_Heat_Recovery_Unit1, !- Name + always_avail, !- Availability Schedule Name + 0.0283168464628752, !- Nominal Supply Air Flow Rate {m3/s} + 0.65, !- Sensible Effectiveness at 100% Heating Air Flow {dimensionless} + 0, !- Latent Effectiveness at 100% Heating Air Flow {dimensionless} + 0.65, !- Sensible Effectiveness at 75% Heating Air Flow {dimensionless} + 0, !- Latent Effectiveness at 75% Heating Air Flow {dimensionless} + 0.65, !- Sensible Effectiveness at 100% Cooling Air Flow {dimensionless} + 0, !- Latent Effectiveness at 100% Cooling Air Flow {dimensionless} + 0.65, !- Sensible Effectiveness at 75% Cooling Air Flow {dimensionless} + 0, !- Latent Effectiveness at 75% Cooling Air Flow {dimensionless} + outdoor air node_unit1, !- Supply Air Inlet Node Name + OA fan inlet node_unit1, !- Supply Air Outlet Node Name + Zone Exhaust Node_unit1, !- Exhaust Air Inlet Node Name + ERVexhaustnode_unit1, !- Exhaust Air Outlet Node Name + 0, !- Nominal Electric Power {W} + No, !- Supply Air Outlet Temperature Control + Plate, !- Heat Exchanger Type + None, !- Frost Control Type + -16.8333337792644, !- Threshold Temperature {C} + 0.083, !- Initial Defrost Time Fraction {dimensionless} + 2.15999989700318E-02, !- Rate of Defrost Time Fraction Increase {1/K} + No; !- Economizer Lockout + + +!- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC:UNITARYHEATPUMP:AIRTOAIR =========== + +AirLoopHVAC:UnitaryHeatPump:AirToAir, + Heat Pump_unit1, !- Name + always_avail, !- Availability Schedule Name + Air Loop Inlet node_unit1, !- Air Inlet Node Name + Air Loop Outlet Node_unit1, !- Air Outlet Node Name + autosize, !- Cooling Supply Air Flow Rate {m3/s} + autosize, !- Heating Supply Air Flow Rate {m3/s} + 0.0, !- No Load Supply Air Flow Rate {m3/s} + living_unit1, !- Controlling Zone or Thermostat Location + Fan:OnOff, !- Supply Air Fan Object Type + Supply Fan_unit1, !- Supply Air Fan Name + Coil:Heating:DX:SingleSpeed, !- Heating Coil Object Type + Main DX Heating Coil_unit1, !- Heating Coil Name + Coil:Cooling:DX:SingleSpeed, !- Cooling Coil Object Type + DX Cooling Coil_unit1, !- Cooling Coil Name + Coil:Heating:Electric, !- Supplemental Heating Coil Object Type + Supp Heating Coil_unit1, !- Supplemental Heating Coil Name + 50, !- Maximum Supply Air Temperature from Supplemental Heater {C} + 10, !- Maximum Outdoor Dry-Bulb Temperature for Supplemental Heater Operation {C} + BlowThrough, !- Fan Placement + fan_cycle; !- Supply Air Fan Operating Mode Schedule Name + + +!- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC =========== + +AirLoopHVAC, + Central System_unit1, !- Name + , !- Controller List Name + availability list, !- Availability Manager List Name + autosize, !- Design Supply Air Flow Rate {m3/s} + Air Loop Branches_unit1, !- Branch List Name + , !- Connector List Name + Air Loop Inlet Node_unit1, !- Supply Side Inlet Node Name + Return Air Mixer Outlet_unit1, !- Demand Side Outlet Node Name + Zone Equipment Inlet Node_unit1, !- Demand Side Inlet Node Names + Air Loop Outlet Node_unit1; !- Supply Side Outlet Node Names + + +!- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC:ZONESPLITTER =========== + +AirLoopHVAC:ZoneSplitter, + Zone Supply Air Splitter_unit1, !- Name + Zone Equipment Inlet Node_unit1, !- Inlet Node Name + Zone Inlet Node_unit1 ATInlet; !- Outlet 1 Node Name + + +!- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC:SUPPLYPATH =========== + +AirLoopHVAC:SupplyPath, + SupplyPath_unit1, !- Name + Zone Equipment Inlet Node_unit1, !- Supply Air Path Inlet Node Name + AirLoopHVAC:ZoneSplitter,!- Component 1 Object Type + Zone Supply Air Splitter_unit1; !- Component 1 Name + + +!- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC:ZONEMIXER =========== + +AirLoopHVAC:ZoneMixer, + Zone Return Air Mixer_unit1, !- Name + Return Air Mixer Outlet_unit1, !- Outlet Node Name + Zone Outlet Node_unit1; !- Inlet 1 Node Name + + +!- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC:RETURNPATH =========== + +AirLoopHVAC:ReturnPath, + ReturnPath_unit1, !- Name + Return Air Mixer Outlet_unit1, !- Return Air Path Outlet Node Name + AirLoopHVAC:ZoneMixer, !- Component 1 Object Type + Zone Return Air Mixer_unit1; !- Component 1 Name + + +!- =========== ALL OBJECTS IN CLASS: BRANCH =========== + +Branch, + Air Loop Main Branch_unit1, !- Name + , !- Pressure Drop Curve Name + AirLoopHVAC:UnitaryHeatPump:AirtoAir, !- Component 1 Object Type + Heat Pump_unit1, !- Component 1 Name + Air Loop Inlet Node_unit1, !- Component 1 Inlet Node Name + Air Loop Outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Mains Inlet Branch_unit1,!- Name + , !- Pressure Drop Curve Name + Pump:VariableSpeed, !- Component 1 Object Type + Mains Pressure_unit1, !- Component 1 Name + Mains Inlet Node_unit1, !- Component 1 Inlet Node Name + Mains Pressure Outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + DHW Supply Outlet Branch_unit1, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + DHW Supply Outlet Pipe_unit1, !- Component 1 Name + DHW Supply Outlet Pipe Inlet Node_unit1, !- Component 1 Inlet Node Name + DHW Supply Outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + DHW Demand Inlet Branch_unit1, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + DHW Demand Inlet Pipe_unit1, !- Component 1 Name + DHW Demand Inlet Node_unit1, !- Component 1 Inlet Node Name + DHW Demand Inlet Pipe Outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Water Sink Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 1 Object Type + DHW Sinks_unit1, !- Component 1 Name + Water Sink Inlet Node_unit1, !- Component 1 Inlet Node Name + Water Sink outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Water Shower Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 1 Object Type + DHW Showers_unit1, !- Component 1 Name + Water Shower Inlet Node_unit1, !- Component 1 Inlet Node Name + Water Shower Outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Water ClothesWasher Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 1 Object Type + DHW ClothesWasher_unit1, !- Component 1 Name + Water ClothesWasher Inlet Node_unit1, !- Component 1 Inlet Node Name + Water ClothesWasher Outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Water Dishwasher Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 1 Object Type + DHW DishWasher_unit1, !- Component 1 Name + Water DishWasher Inlet Node_unit1, !- Component 1 Inlet Node Name + Water DishWasher outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Water Bath Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 1 Object Type + DHW Baths_unit1, !- Component 1 Name + Water Bath Inlet Node_unit1, !- Component 1 Inlet Node Name + Water bath Outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Mains Makeup Branch_unit1, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Mains Makeup Pipe_unit1, !- Component 1 Name + Mains Makeup Pipe Inlet Node_unit1, !- Component 1 Inlet Node Name + Mains Makeup Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Water Heater Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterHeater:HeatPump:WrappedCondenser, !- Component 1 Object Type + Water Heater_unit1, !- Component 1 Name + Water Heater Use Inlet Node_unit1, !- Component 1 Inlet Node Name + Water Heater Use Outlet Node_unit1; !- Component 1 Outlet Node Name + + +!- =========== ALL OBJECTS IN CLASS: BRANCHLIST =========== + +BranchList, + Air Loop Branches_unit1, !- Name + Air Loop Main Branch_unit1; !- Branch 1 Name + +BranchList, + DHW Supply Branches_unit1, !- Name + Mains Inlet Branch_unit1,!- Branch 1 Name + Water Heater Branch_unit1, !- Branch 2 Name + DHW Supply Outlet Branch_unit1; !- Branch 3 Name + +BranchList, + DHW Demand Branches_unit1, !- Name + DHW Demand Inlet Branch_unit1, !- Branch 1 Name + Water Sink Branch_unit1, !- Branch 2 Name + Water Shower Branch_unit1, !- Branch 3 Name + Water ClothesWasher Branch_unit1, !- Branch 4 Name + Water Dishwasher Branch_unit1, !- Branch 5 Name + Water Bath Branch_unit1, !- Branch 6 Name + Mains Makeup Branch_unit1; !- Branch 7 Name + + +!- =========== ALL OBJECTS IN CLASS: CONNECTOR:SPLITTER =========== + +Connector:Splitter, + DHW Demand Splitter_unit1, !- Name + DHW Demand Inlet Branch_unit1, !- Inlet Branch Name + Water Sink Branch_unit1, !- Outlet Branch 1 Name + Water Shower Branch_unit1, !- Outlet Branch 2 Name + Water ClothesWasher Branch_unit1, !- Outlet Branch 3 Name + Water Dishwasher Branch_unit1, !- Outlet Branch 4 Name + Water Bath Branch_unit1; !- Outlet Branch 5 Name + +Connector:Splitter, + DHW Supply Splitter_unit1, !- Name + Mains Inlet Branch_unit1,!- Inlet Branch Name + Water Heater Branch_unit1; !- Outlet Branch 1 Name + + +!- =========== ALL OBJECTS IN CLASS: CONNECTOR:MIXER =========== + +Connector:Mixer, + DHW Demand Mixer_unit1, !- Name + Mains Makeup Branch_unit1, !- Outlet Branch Name + Water Sink Branch_unit1, !- Inlet Branch 1 Name + Water Shower Branch_unit1, !- Inlet Branch 2 Name + Water ClothesWasher Branch_unit1, !- Inlet Branch 3 Name + Water Dishwasher Branch_unit1, !- Inlet Branch 4 Name + Water Bath Branch_unit1; !- Inlet Branch 5 Name + +Connector:Mixer, + DHW Supply Mixer_unit1, !- Name + DHW Supply Outlet Branch_unit1, !- Outlet Branch Name + Water Heater Branch_unit1; !- Inlet Branch 1 Name + + +!- =========== ALL OBJECTS IN CLASS: CONNECTORLIST =========== + +ConnectorList, + DHW Demand Connectors_unit1, !- Name + Connector:Splitter, !- Connector 1 Object Type + DHW Demand Splitter_unit1, !- Connector 1 Name + Connector:Mixer, !- Connector 2 Object Type + DHW Demand Mixer_unit1; !- Connector 2 Name + +ConnectorList, + DHW Supply Connectors_unit1, !- Name + Connector:Splitter, !- Connector 1 Object Type + DHW Supply Splitter_unit1, !- Connector 1 Name + Connector:Mixer, !- Connector 2 Object Type + DHW Supply Mixer_unit1; !- Connector 2 Name + + +!- =========== ALL OBJECTS IN CLASS: NODELIST =========== + +NodeList, + Zone Inlet Nodes_unit1, !- Name + Zone Inlet Node_unit1, !- Node 1 Name + HPWH Zone Inlet Node_unit1, !- Node 2 Name + OA Inlet Node_unit1; !- Node 3 Name + +NodeList, + Zone Exhaust Node_list_unit1, !- Name + Zone Exhaust Node_unit1, !- Node 1 Name + Zone Exhaust Node1_unit1;!- Node 2 Name + + +!- =========== ALL OBJECTS IN CLASS: OUTDOORAIR:NODE =========== + +OutdoorAir:Node, + outside air inlet node_unit1, !- Name + 0.914355407629293; !- Height Above Ground {m} + + +!- =========== ALL OBJECTS IN CLASS: OUTDOORAIR:NODELIST =========== + +OutdoorAir:NodeList, + outdoor air node_unit1; !- Node or NodeList Name 1 + + +!- =========== ALL OBJECTS IN CLASS: PIPE:ADIABATIC =========== + +Pipe:Adiabatic, + DHW Supply Outlet Pipe_unit1, !- Name + DHW Supply Outlet Pipe Inlet Node_unit1, !- Inlet Node Name + DHW Supply Outlet Node_unit1; !- Outlet Node Name + +Pipe:Adiabatic, + Mains Makeup Pipe_unit1, !- Name + Mains Makeup Pipe Inlet Node_unit1, !- Inlet Node Name + Mains Makeup Node_unit1; !- Outlet Node Name + +Pipe:Adiabatic, + DHW Demand Inlet Pipe_unit1, !- Name + DHW Demand Inlet Node_unit1, !- Inlet Node Name + DHW Demand Inlet Pipe Outlet Node_unit1; !- Outlet Node Name + + +!- =========== ALL OBJECTS IN CLASS: PUMP:VARIABLESPEED =========== + +Pump:VariableSpeed, + Mains Pressure_unit1, !- Name + Mains Inlet Node_unit1, !- Inlet Node Name + Mains Pressure Outlet Node_unit1, !- Outlet Node Name + autosize, !- Design Maximum Flow Rate {m3/s} + 1, !- Design Pump Head {Pa} + 0, !- Design Power Consumption {W} + 1, !- Motor Efficiency + 0, !- Fraction of Motor Inefficiencies to Fluid Stream + 0, !- Coefficient 1 of the Part Load Performance Curve + 1, !- Coefficient 2 of the Part Load Performance Curve + 0, !- Coefficient 3 of the Part Load Performance Curve + 0, !- Coefficient 4 of the Part Load Performance Curve + 0, !- Design Minimum Flow Rate {m3/s} + Intermittent; !- Pump Control Type + + +!- =========== ALL OBJECTS IN CLASS: WATERHEATER:STRATIFIED =========== + +WaterHeater:Stratified, + Water Heater_Tank_unit1, !- Name + Water Heater, !- End-Use Subcategory + 0.196841372, !- Tank Volume {m3} + 1.594, !- Tank Height {m} + VerticalCylinder, !- Tank Shape + , !- Tank Perimeter {m} + 51, !- Maximum Temperature Limit {C} + MasterSlave, !- Heater Priority Control + dhw_setpt_hpwh, !- Heater 1 Setpoint Temperature Schedule Name + 2, !- Heater 1 Deadband Temperature Difference {deltaC} + autosize, !- Heater 1 Capacity {W} + 1.129, !- Heater 1 Height {m} + dhw_setpt_hpwh, !- Heater 2 Setpoint Temperature Schedule Name + 2, !- Heater 2 Deadband Temperature Difference {deltaC} + 0, !- Heater 2 Capacity {W} + 0.266, !- Heater 2 Height {m} + electricity, !- Heater Fuel Type + 1, !- Heater Thermal Efficiency + 8.3, !- Off Cycle Parasitic Fuel Consumption Rate {W} + Electricity, !- Off Cycle Parasitic Fuel Type + 0, !- Off Cycle Parasitic Heat Fraction to Tank + 1, !- Off Cycle Parasitic Height {m} + 8.3, !- On Cycle Parasitic Fuel Consumption Rate {W} + Electricity, !- On Cycle Parasitic Fuel Type + 0, !- On Cycle Parasitic Heat Fraction to Tank + 1, !- On Cycle Parasitic Height {m} + Zone, !- Ambient Temperature Indicator + , !- Ambient Temperature Schedule Name + living_unit1, !- Ambient Temperature Zone Name + , !- Ambient Temperature Outdoor Air Node Name + 4.536492, !- Uniform Skin Loss Coefficient per Unit Area to Ambient Temperature {W/m2-K} + 1, !- Skin Loss Fraction to Zone + , !- Off Cycle Flue Loss Coefficient to Ambient Temperature {W/K} + 1, !- Off Cycle Flue Loss Fraction to Zone + , !- Peak Use Flow Rate {m3/s} + , !- Use Flow Rate Fraction Schedule Name + , !- Cold Water Supply Temperature Schedule Name + Water Heater use inlet node_unit1, !- Use Side Inlet Node Name + Water Heater use outlet node_unit1, !- Use Side Outlet Node Name + 1, !- Use Side Effectiveness + 0, !- Use Side Inlet Height {m} + autocalculate, !- Use Side Outlet Height {m} + , !- Source Side Inlet Node Name + , !- Source Side Outlet Node Name + 1, !- Source Side Effectiveness + 0.7, !- Source Side Inlet Height {m} + 0, !- Source Side Outlet Height {m} + Fixed, !- Inlet Mode + autosize, !- Use Side Design Flow Rate {m3/s} + autosize, !- Source Side Design Flow Rate {m3/s} + 1.5, !- Indirect Water Heating Recovery Time {hr} + 1; !- Number of Nodes + + +!- =========== ALL OBJECTS IN CLASS: WATERHEATER:SIZING =========== + +WaterHeater:Sizing, + Water Heater_Tank_unit1, !- WaterHeater Name + ResidentialHUD-FHAMinimum, !- Design Mode + , !- Time Storage Can Meet Peak Draw {hr} + , !- Time for Tank Recovery {hr} + , !- Nominal Tank Volume for Autosizing Plant Connections {m3} + 3, !- Number of Bedrooms + 3; !- Number of Bathrooms + + +!- =========== ALL OBJECTS IN CLASS: WATERHEATER:HEATPUMP:WRAPPEDCONDENSER =========== + +WaterHeater:HeatPump:WrappedCondenser, + Water Heater_unit1, !- Name + always_avail, !- Availability Schedule Name + Compressor Setpoint, !- Compressor Setpoint Temperature Schedule Name + 5, !- Dead Band Temperature Difference {deltaC} + 0.0664166667, !- Condenser Bottom Location {m} + 0.8634166667, !- Condenser Top Location {m} + autocalculate, !- Evaporator Air Flow Rate {m3/s} + ZoneAirOnly, !- Inlet Air Configuration + Zone Exhaust Node1_unit1,!- Air Inlet Node Name + HPWH Zone Inlet Node_unit1, !- Air Outlet Node Name + , !- Outdoor Air Node Name + , !- Exhaust Air Node Name + , !- Inlet Air Temperature Schedule Name + , !- Inlet Air Humidity Schedule Name + living_unit1, !- Inlet Air Zone Name + WaterHeater:Stratified, !- Tank Object Type + Water Heater_Tank_unit1, !- Tank Name + Water Heater use inlet node_unit1, !- Tank Use Side Inlet Node Name + Water Heater use outlet node_unit1, !- Tank Use Side Outlet Node Name + Coil:WaterHeating:AirToWaterHeatPump:Wrapped, !- DX Coil Object Type + Heat Pump Water Heater Evaporator_unit1, !- DX Coil Name + 10.0, !- Minimum Inlet Air Temperature for Compressor Operation {C} + 48.89, !- Maximum Inlet Air Temperature for Compressor Operation {C} + Zone, !- Compressor Location + , !- Compressor Ambient Temperature Schedule Name + Fan:OnOff, !- Fan Object Type + Heat Pump Water Heater Fan_unit1, !- Fan Name + DrawThrough, !- Fan Placement + 0, !- On Cycle Parasitic Electric Load {W} + 0, !- Off Cycle Parasitic Electric Load {W} + , !- Parasitic Heat Rejection Location + , !- Inlet Air Mixer Node Name + , !- Outlet Air Splitter Node Name + , !- Inlet Air Mixer Schedule Name + MutuallyExclusive, !- Tank Element Control Logic + 1.262, !- Control Sensor 1 Height In Stratified Tank {m} + 0.75, !- Control Sensor 1 Weight {dimensionless} + 0.464; !- Control Sensor 2 Height In Stratified Tank {m} + + +!- =========== ALL OBJECTS IN CLASS: PLANTLOOP =========== + +PlantLoop, + DHW Loop_unit1, !- Name + Water, !- Fluid Type + , !- User Defined Fluid Type + DHW Loop Operation_unit1,!- Plant Equipment Operation Scheme Name + DHW Supply Outlet Node_unit1, !- Loop Temperature Setpoint Node Name + 100, !- Maximum Loop Temperature {C} + 0, !- Minimum Loop Temperature {C} + autosize, !- Maximum Loop Flow Rate {m3/s} + 0, !- Minimum Loop Flow Rate {m3/s} + autocalculate, !- Plant Loop Volume {m3} + Mains Inlet Node_unit1, !- Plant Side Inlet Node Name + DHW Supply Outlet Node_unit1, !- Plant Side Outlet Node Name + DHW Supply Branches_unit1, !- Plant Side Branch List Name + DHW Supply Connectors_unit1, !- Plant Side Connector List Name + DHW Demand Inlet Node_unit1, !- Demand Side Inlet Node Name + Mains Makeup Node_unit1, !- Demand Side Outlet Node Name + DHW Demand Branches_unit1, !- Demand Side Branch List Name + DHW Demand Connectors_unit1, !- Demand Side Connector List Name + Optimal; !- Load Distribution Scheme + + +!- =========== ALL OBJECTS IN CLASS: PLANTEQUIPMENTLIST =========== + +PlantEquipmentList, + DHW Plant Equipment_unit1, !- Name + WaterHeater:HeatPump:WrappedCondenser, !- Equipment 1 Object Type + Water Heater_unit1; !- Equipment 1 Name + + +!- =========== ALL OBJECTS IN CLASS: PLANTEQUIPMENTOPERATION:HEATINGLOAD =========== + +PlantEquipmentOperation:HeatingLoad, + DHW Control Scheme_unit1,!- Name + 0.0, !- Load Range 1 Lower Limit {W} + 1000000000000000, !- Load Range 1 Upper Limit {W} + DHW Plant Equipment_unit1; !- Range 1 Equipment List Name + + +!- =========== ALL OBJECTS IN CLASS: PLANTEQUIPMENTOPERATIONSCHEMES =========== + +PlantEquipmentOperationSchemes, + DHW Loop Operation_unit1,!- Name + PlantEquipmentOperation:HeatingLoad, !- Control Scheme 1 Object Type + DHW Control Scheme_unit1,!- Control Scheme 1 Name + always_avail; !- Control Scheme 1 Schedule Name + + +!- =========== ALL OBJECTS IN CLASS: AVAILABILITYMANAGER:SCHEDULED =========== + +AvailabilityManager:Scheduled, + System availability, !- Name + always_avail; !- Schedule Name + + +!- =========== ALL OBJECTS IN CLASS: AVAILABILITYMANAGERASSIGNMENTLIST =========== + +AvailabilityManagerAssignmentList, + availability list, !- Name + AvailabilityManager:Scheduled, !- Availability Manager 1 Object Type + System availability; !- Availability Manager 1 Name + + +!- =========== ALL OBJECTS IN CLASS: SETPOINTMANAGER:SCHEDULED =========== + +SetpointManager:Scheduled, + DHW Loop Setpoint Manager_unit1, !- Name + Temperature, !- Control Variable + DHWSupplySetpoint, !- Schedule Name + DHW Supply Outlet Node_unit1; !- Setpoint Node or NodeList Name + + +!- =========== ALL OBJECTS IN CLASS: WATERUSE:EQUIPMENT =========== + +WaterUse:Equipment, + Clothes Washer_unit1, !- Name + Domestic Hot Water, !- End-Use Subcategory + 1.6219189818e-06, !- Peak Flow Rate {m3/s} + ClothesWasher, !- Flow Rate Fraction Schedule Name + CWWaterTempSchedule; !- Target Temperature Schedule Name + +WaterUse:Equipment, + Dishwasher_unit1, !- Name + Domestic Hot Water, !- End-Use Subcategory + 6.36685353e-07, !- Peak Flow Rate {m3/s} + Dishwasher, !- Flow Rate Fraction Schedule Name + DWWaterTempSchedule; !- Target Temperature Schedule Name + +WaterUse:Equipment, + Sinks_unit1, !- Name + Domestic Hot Water, !- End-Use Subcategory + 7.1934e-05, !- Peak Flow Rate {m3/s} + BA_sink_sch, !- Flow Rate Fraction Schedule Name + SSBWaterTempSchedule; !- Target Temperature Schedule Name + +WaterUse:Equipment, + Showers_unit1, !- Name + Domestic Hot Water, !- End-Use Subcategory + 0.000141975, !- Peak Flow Rate {m3/s} + BA_shower_sch, !- Flow Rate Fraction Schedule Name + SSBWaterTempSchedule; !- Target Temperature Schedule Name + +WaterUse:Equipment, + Baths_unit1, !- Name + Domestic Hot Water, !- End-Use Subcategory + 0.00027764, !- Peak Flow Rate {m3/s} + BA_bath_sch, !- Flow Rate Fraction Schedule Name + SSBWaterTempSchedule; !- Target Temperature Schedule Name + + +!- =========== ALL OBJECTS IN CLASS: WATERUSE:CONNECTIONS =========== + +WaterUse:Connections, + DHW Sinks_unit1, !- Name + Water Sink Inlet Node_unit1, !- Inlet Node Name + Water Sink Outlet Node_unit1, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + None, !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + Sinks_unit1; !- Water Use Equipment 1 Name + +WaterUse:Connections, + DHW Showers_unit1, !- Name + Water Shower Inlet Node_unit1, !- Inlet Node Name + Water Shower Outlet Node_unit1, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + None, !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + Showers_unit1; !- Water Use Equipment 1 Name + +WaterUse:Connections, + DHW ClothesWasher_unit1, !- Name + Water ClothesWasher Inlet Node_unit1, !- Inlet Node Name + Water ClothesWasher Outlet Node_unit1, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + None, !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + Clothes Washer_unit1; !- Water Use Equipment 1 Name + +WaterUse:Connections, + DHW DishWasher_unit1, !- Name + Water DishWasher Inlet Node_unit1, !- Inlet Node Name + Water DishWasher Outlet Node_unit1, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + None, !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + Dishwasher_unit1; !- Water Use Equipment 1 Name + +WaterUse:Connections, + DHW Baths_unit1, !- Name + Water Bath Inlet Node_unit1, !- Inlet Node Name + Water Bath Outlet Node_unit1, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + None, !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + Baths_unit1; !- Water Use Equipment 1 Name + + +!- =========== ALL OBJECTS IN CLASS: CURVE:QUADRATIC =========== + +Curve:Quadratic, + HPWH-COP-fPLR, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1; !- Maximum Value of x + +Curve:Quadratic, + HPACCoolCapFFF, !- Name + 0.8, !- Coefficient1 Constant + 0.2, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.5, !- Minimum Value of x + 1.5; !- Maximum Value of x + +Curve:Quadratic, + HPACCOOLEIRFFF, !- Name + 1.156, !- Coefficient1 Constant + -0.1816, !- Coefficient2 x + 0.0256, !- Coefficient3 x**2 + 0.5, !- Minimum Value of x + 1.5; !- Maximum Value of x + +Curve:Quadratic, + HPACCOOLPLFFPLR, !- Name + 0.85, !- Coefficient1 Constant + 0.15, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + HPACHeatEIRFFF, !- Name + 1.3824, !- Coefficient1 Constant + -0.4336, !- Coefficient2 x + 0.0512, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + ACCoolingCAPFFF, !- Name + 0.718605468, !- Coefficient1 Constant + 0.410099989, !- Coefficient2 x + -0.128705457, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + ACCoolingEIRFFF, !- Name + 1.32299905, !- Coefficient1 Constant + -0.477711207, !- Coefficient2 x + 0.154712157, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + ACCoolingPLFFPLR, !- Name + 0.90, !- Coefficient1 Constant + 0.10, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + HPCoolingCAPFFF, !- Name + 0.718664047, !- Coefficient1 Constant + 0.41797409, !- Coefficient2 x + -0.136638137, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPCoolingEIRFFF, !- Name + 1.143487507, !- Coefficient1 Constant + -0.13943972, !- Coefficient2 x + -0.004047787, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPCOOLPLFFPLR, !- Name + 0.90, !- Coefficient1 Constant + 0.10, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + HPHeatingCAPFFF, !- Name + 0.694045465, !- Coefficient1 Constant + 0.474207981, !- Coefficient2 x + -0.168253446, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPHeatingEIRFFF, !- Name + 2.185418751, !- Coefficient1 Constant + -1.942827919, !- Coefficient2 x + 0.757409168, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPHeatPLFFPLR, !- Name + 0.90, !- Coefficient1 Constant + 0.10, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + HPLowStageHeatingCAPFFF, !- Name + 0.741466907, !- Coefficient1 Constant + 0.378645444, !- Coefficient2 x + -0.119754733, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPLowStageHeatingEIRFFF, !- Name + 2.153618211, !- Coefficient1 Constant + -1.737190609, !- Coefficient2 x + 0.584269478, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPHighStageHeatingCAPFFF,!- Name + 0.76634609, !- Coefficient1 Constant + 0.32840943, !- Coefficient2 x + -0.094701495, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPHighStageHeatingEIRFFF,!- Name + 2.001041353, !- Coefficient1 Constant + -1.58869128, !- Coefficient2 x + 0.587593517, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HP2StageHeatingPLFFPLR, !- Name + 0.93, !- Coefficient1 Constant + 0.07, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + HPLowStageCoolingCAPFFF, !- Name + 0.655239515, !- Coefficient1 Constant + 0.511655216, !- Coefficient2 x + -0.166894731, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPLowStageCoolingEIRFFF, !- Name + 1.639108268, !- Coefficient1 Constant + -0.998953996, !- Coefficient2 x + 0.359845728, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPHighStageCoolingCAPFFF,!- Name + 0.618281092, !- Coefficient1 Constant + 0.569060264, !- Coefficient2 x + -0.187341356, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPHighStageCoolingEIRFFF,!- Name + 1.570774717, !- Coefficient1 Constant + -0.914152018, !- Coefficient2 x + 0.343377302, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HP2StageCoolingPLFFPLR, !- Name + 0.93, !- Coefficient1 Constant + 0.07, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + ACLowStageCoolingCAPFFF, !- Name + 0.65673024, !- Coefficient1 Constant + 0.516470835, !- Coefficient2 x + -0.172887149, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + ACLowStageCoolingEIRFFF, !- Name + 1.562945114, !- Coefficient1 Constant + -0.791859997, !- Coefficient2 x + 0.230030877, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + ACHighStageCoolingCAPFFF,!- Name + 0.690334551, !- Coefficient1 Constant + 0.464383753, !- Coefficient2 x + -0.154507638, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + ACHighStageCoolingEIRFFF,!- Name + 1.31565404, !- Coefficient1 Constant + -0.482467162, !- Coefficient2 x + 0.166239001, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + AC2StageCoolingPLFFPLR, !- Name + 0.93, !- Coefficient1 Constant + 0.07, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + Cool-PLF-fPLR, !- Name + 0.80141423, !- Coefficient1 Constant + 0.23744685, !- Coefficient2 x + -0.0393773, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1, !- Maximum Value of x + 0.7, !- Minimum Curve Output + 1; !- Maximum Curve Output + + +!- =========== ALL OBJECTS IN CLASS: CURVE:CUBIC =========== + +Curve:Cubic, + HPACHeatCapFT, !- Name + 0.758746, !- Coefficient1 Constant + 0.027626, !- Coefficient2 x + 0.000148716, !- Coefficient3 x**2 + 0.0000034992, !- Coefficient4 x**3 + -20.0, !- Minimum Value of x + 20.0; !- Maximum Value of x + +Curve:Cubic, + HPACHeatCapFFF, !- Name + 0.84, !- Coefficient1 Constant + 0.16, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Coefficient4 x**3 + 0.5, !- Minimum Value of x + 1.5; !- Maximum Value of x + +Curve:Cubic, + HPACHeatEIRFT, !- Name + 1.19248, !- Coefficient1 Constant + -0.0300438, !- Coefficient2 x + 0.00103745, !- Coefficient3 x**2 + -0.000023328, !- Coefficient4 x**3 + -20.0, !- Minimum Value of x + 20.0; !- Maximum Value of x + +Curve:Cubic, + Fan-EIR-fPLR, !- Name + 0.00000000, !- Coefficient1 Constant + 1.00000000, !- Coefficient2 x + 0.00000000, !- Coefficient3 x**2 + 0.00000000, !- Coefficient4 x**3 + 0, !- Minimum Value of x + 1, !- Maximum Value of x + 0, !- Minimum Curve Output + 1; !- Maximum Curve Output + +Curve:Cubic, + ConstantCubic, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 x**3 + -100, !- Minimum Value of x + 100; !- Maximum Value of x + + +!- =========== ALL OBJECTS IN CLASS: CURVE:BIQUADRATIC =========== + +Curve:Biquadratic, + HPWH-Htg-Cap-fT, !- Name + 0.563, !- Coefficient1 Constant + 0.0437, !- Coefficient2 x + 0.000039, !- Coefficient3 x**2 + 0.0055, !- Coefficient4 y + -.000148, !- Coefficient5 y**2 + -.000145, !- Coefficient6 x*y + 0, !- Minimum Value of x + 100, !- Maximum Value of x + 0, !- Minimum Value of y + 100, !- Maximum Value of y + 0; !- Minimum Curve Output + +Curve:Biquadratic, + HPWH-Htg-COP-fT, !- Name + 1.1332, !- Coefficient1 Constant + 0.063, !- Coefficient2 x + -.0000979, !- Coefficient3 x**2 + -.00972, !- Coefficient4 y + -.0000214, !- Coefficient5 y**2 + -.000686, !- Coefficient6 x*y + 0, !- Minimum Value of x + 100, !- Maximum Value of x + 0, !- Minimum Value of y + 100; !- Maximum Value of y + +Curve:Biquadratic, + HPWHHeatingCapFTemp, !- Name + 0.369827, !- Coefficient1 Constant + 0.043341, !- Coefficient2 x + -0.00023, !- Coefficient3 x**2 + 0.000466, !- Coefficient4 y + 0.000026, !- Coefficient5 y**2 + -0.00027, !- Coefficient6 x*y + 0.0, !- Minimum Value of x + 40.0, !- Maximum Value of x + 20.0, !- Minimum Value of y + 90.0, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPWHHeatingCOPFTemp, !- Name + 1.19713, !- Coefficient1 Constant + 0.077849, !- Coefficient2 x + -0.0000016, !- Coefficient3 x**2 + -0.02675, !- Coefficient4 y + 0.000296, !- Coefficient5 y**2 + -0.00112, !- Coefficient6 x*y + 0.0, !- Minimum Value of x + 40.0, !- Maximum Value of x + 20.0, !- Minimum Value of y + 90.0, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPACCoolCapFT, !- Name + 0.766956, !- Coefficient1 Constant + 0.0107756, !- Coefficient2 x + -0.0000414703, !- Coefficient3 x**2 + 0.00134961, !- Coefficient4 y + -0.000261144, !- Coefficient5 y**2 + 0.000457488, !- Coefficient6 x*y + 12.77778, !- Minimum Value of x + 23.88889, !- Maximum Value of x + 21.11111, !- Minimum Value of y + 46.11111; !- Maximum Value of y + +Curve:Biquadratic, + HPACCOOLEIRFT, !- Name + 0.297145, !- Coefficient1 Constant + 0.0430933, !- Coefficient2 x + -0.000748766, !- Coefficient3 x**2 + 0.00597727, !- Coefficient4 y + 0.000482112, !- Coefficient5 y**2 + -0.000956448, !- Coefficient6 x*y + 12.77778, !- Minimum Value of x + 23.88889, !- Maximum Value of x + 21.11111, !- Minimum Value of y + 46.11111; !- Maximum Value of y + +Curve:Biquadratic, + Defrost_EIR_FT, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 y + 0, !- Coefficient5 y**2 + 0, !- Coefficient6 x*y + 0, !- Minimum Value of x + 100, !- Maximum Value of x + 0, !- Minimum Value of y + 100; !- Maximum Value of y + +Curve:Biquadratic, + dummy-waste-heat-curve, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 y + 0, !- Coefficient5 y**2 + 0, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 1, !- Minimum Curve Output + 1, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + ACCoolingCAPFTemp, !- Name + 1.5509, !- Coefficient1 Constant + -0.07505, !- Coefficient2 x + 0.0031, !- Coefficient3 x**2 + 0.0024, !- Coefficient4 y + -0.00005, !- Coefficient5 y**2 + -0.00043, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + ACCoolingEIRFTemp, !- Name + -0.30428, !- Coefficient1 Constant + 0.11805, !- Coefficient2 x + -0.00342, !- Coefficient3 x**2 + -0.00626, !- Coefficient4 y + 0.0007, !- Coefficient5 y**2 + -0.00047, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPCoolingCAPFTemp, !- Name + 1.55736, !- Coefficient1 Constant + -0.074448, !- Coefficient2 x + 0.003099, !- Coefficient3 x**2 + 0.00146, !- Coefficient4 y + -0.000041, !- Coefficient5 y**2 + -0.000427, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPCoolingEIRFTemp, !- Name + -0.350448, !- Coefficient1 Constant + 0.11681, !- Coefficient2 x + -0.0034, !- Coefficient3 x**2 + -0.001226, !- Coefficient4 y + 0.000601, !- Coefficient5 y**2 + -0.000467, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPHeatingCAPFTemp, !- Name + 0.876825, !- Coefficient1 Constant + -0.002955, !- Coefficient2 x + -0.000058, !- Coefficient3 x**2 + 0.025335, !- Coefficient4 y + 0.000196, !- Coefficient5 y**2 + -0.000043, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPHeatingEIRFTemp, !- Name + 0.704658, !- Coefficient1 Constant + 0.008767, !- Coefficient2 x + 0.000625, !- Coefficient3 x**2 + -0.009037, !- Coefficient4 y + 0.000738, !- Coefficient5 y**2 + -0.001025, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPLowStageHeatingCAPFTemp, !- Name + 0.84613, !- Coefficient1 Constant + -0.002279, !- Coefficient2 x + -0.000047, !- Coefficient3 x**2 + 0.026703, !- Coefficient4 y + 0.000201, !- Coefficient5 y**2 + -0.000079, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPLowStageHeatingEIRFTemp, !- Name + 0.551837, !- Coefficient1 Constant + 0.02038, !- Coefficient2 x + 0.000546, !- Coefficient3 x**2 + -0.009638, !- Coefficient4 y + 0.000785, !- Coefficient5 y**2 + -0.00125, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPHighStageHeatingCAPFTemp, !- Name + 0.818223, !- Coefficient1 Constant + 0.001981, !- Coefficient2 x + -0.000203, !- Coefficient3 x**2 + 0.028703, !- Coefficient4 y + 0.000207, !- Coefficient5 y**2 + -0.000071, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPHighStageHeatingEIRFTemp, !- Name + 0.81584, !- Coefficient1 Constant + -0.00615, !- Coefficient2 x + 0.001021, !- Coefficient3 x**2 + -0.001301, !- Coefficient4 y + 0.001083, !- Coefficient5 y**2 + -0.001487, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPLowStageCoolingCAPFTemp, !- Name + 1.658788, !- Coefficient1 Constant + -0.083453, !- Coefficient2 x + 0.003424, !- Coefficient3 x**2 + 0.002433, !- Coefficient4 y + -0.000045, !- Coefficient5 y**2 + -0.000534, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPLowStageCoolingEIRFTemp, !- Name + -0.582916, !- Coefficient1 Constant + 0.158101, !- Coefficient2 x + -0.004398, !- Coefficient3 x**2 + -0.020335, !- Coefficient4 y + 0.00108, !- Coefficient5 y**2 + -0.00064, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPHighStageCoolingCAPFTemp, !- Name + 1.472738, !- Coefficient1 Constant + -0.067222, !- Coefficient2 x + 0.00292, !- Coefficient3 x**2 + 0.000052, !- Coefficient4 y + -0.00003, !- Coefficient5 y**2 + -0.000359, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPHighStageCoolingEIRFTemp, !- Name + -0.488196, !- Coefficient1 Constant + 0.099162, !- Coefficient2 x + -0.00237, !- Coefficient3 x**2 + 0.019503, !- Coefficient4 y + 0.00043, !- Coefficient5 y**2 + -0.001097, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + ACLowStageCoolingCAPFTemp, !- Name + 1.66458, !- Coefficient1 Constant + -0.08039, !- Coefficient2 x + 0.0033, !- Coefficient3 x**2 + 0.00124, !- Coefficient4 y + -0.00003, !- Coefficient5 y**2 + -0.00052, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + ACLowStageCoolingEIRFTemp, !- Name + -0.42738, !- Coefficient1 Constant + 0.14191, !- Coefficient2 x + -0.00412, !- Coefficient3 x**2 + -0.01406, !- Coefficient4 y + 0.00083, !- Coefficient5 y**2 + -0.00043, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + ACHighStageCoolingCAPFTemp, !- Name + 1.36788, !- Coefficient1 Constant + -0.06257, !- Coefficient2 x + 0.0028, !- Coefficient3 x**2 + 0.00504, !- Coefficient4 y + -0.00007, !- Coefficient5 y**2 + -0.00045, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + ACHighStageCoolingEIRFTemp, !- Name + 0.04232, !- Coefficient1 Constant + 0.07892, !- Coefficient2 x + -0.00238, !- Coefficient3 x**2 + -0.00304, !- Coefficient4 y + 0.00053, !- Coefficient5 y**2 + -0.00032, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + Cool-Cap-fT, !- Name + 1.26489391, !- Coefficient1 Constant + -0.035054982, !- Coefficient2 x + 0.00211086, !- Coefficient3 x**2 + -0.001526886, !- Coefficient4 y + -0.0000070308, !- Coefficient5 y**2 + -0.0004691844, !- Coefficient6 x*y + -100, !- Minimum Value of x + 100, !- Maximum Value of x + -100, !- Minimum Value of y + 100; !- Maximum Value of y + +Curve:Biquadratic, + Cool-EIR-fT, !- Name + 0.38402403, !- Coefficient1 Constant + 0.029696724, !- Coefficient2 x + -0.0011329308, !- Coefficient3 x**2 + 0.006490674, !- Coefficient4 y + 0.0002626992, !- Coefficient5 y**2 + -0.0001207224, !- Coefficient6 x*y + -100, !- Minimum Value of x + 100, !- Maximum Value of x + -100, !- Minimum Value of y + 100; !- Maximum Value of y + + +!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLEDICTIONARY =========== + +Output:VariableDictionary,Regular; + +!- =========== ALL OBJECTS IN CLASS: OUTPUT:CONSTRUCTIONS =========== + +Output:Constructions,Constructions,Materials; + +!- =========== ALL OBJECTS IN CLASS: OUTPUT:TABLE:SUMMARYREPORTS =========== + + +Output:Table:SummaryReports, + InputVerificationandResultsSummary, !- Report 1 Name + EquipmentSummary, !- Report 2 Name + ClimaticDataSummary, !- Report 3 Name + EnvelopeSummary, !- Report 4 Name + AllSummary; !- Report 5 Name + + +!- =========== ALL OBJECTS IN CLASS: OUTPUT:TABLE:MONTHLY =========== + +Output:Table:Monthly, + FanSplit, !- Name + 3, !- Digits After Decimal + Air System Cooling Coil Total Cooling Energy, !- Variable or Meter 1 Name + HoursNonZero, !- Aggregation Type for Variable or Meter 1 + Air System Fan Electric Energy, !- Variable or Meter 2 Name + SumOrAverageDuringHoursShown, !- Aggregation Type for Variable or Meter 2 + Air System Heating Coil Total Heating Energy, !- Variable or Meter 3 Name + HoursNonZero, !- Aggregation Type for Variable or Meter 3 + Air System Fan Electric Energy, !- Variable or Meter 4 Name + SumOrAverageDuringHoursShown, !- Aggregation Type for Variable or Meter 4 + Air System Fan Electric Energy, !- Variable or Meter 5 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 5 + +Output:Table:Monthly, + CoilLoads, !- Name + 2, !- Digits After Decimal + Heating Coil Heating Rate , !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Heating Coil Air Heating Rate , !- Variable or Meter 2 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 2 + Cooling Coil Total Cooling Rate , !- Variable or Meter 3 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 3 + +Output:Table:Monthly, + Water Heater: Loads, !- Name + 2, !- Digits After Decimal + Water Heater Total Demand Rate , !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Water Heater Total Demand Energy , !- Variable or Meter 2 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 2 + Water Heater Heating Rate , !- Variable or Meter 3 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 3 + Water Heater Heating Energy , !- Variable or Meter 4 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 4 + +Output:Table:Monthly, + Heating and Cooling Loads, !- Name + 2, !- Digits After Decimal + Zone/Sys Sensible Cooling Energy , !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Zone/Sys Sensible Heating Energy , !- Variable or Meter 2 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 2 + +Output:Table:Monthly, + Lighting Loads, !- Name + 2, !- Digits After Decimal + Zone Lights Electric Consumption , !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Exterior Lights Electric Consumption , !- Variable or Meter 2 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 2 + +Output:Table:Monthly, + InternalGains, !- Name + 2, !- Digits After Decimal + Zone People Total Heat Gain, !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Zone Lights Total Heat Gain, !- Variable or Meter 2 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 2 + Zone Electric Equipment Total Heat Gain, !- Variable or Meter 3 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 3 + Zone Gas Equipment Total Heat Gain, !- Variable or Meter 4 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 4 + Zone Other Equipment Total Heat Gain, !- Variable or Meter 5 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 5 + Zone Total Internal Total Heat Gain, !- Variable or Meter 6 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 6 + + +!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:TABLE:STYLE =========== + +OutputControl:Table:Style, + CommaAndHTML, !- Column Separator + InchPound; !- Unit Conversion + + +!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLE =========== + +Output:Variable,*,Cooling Coil Sensible Cooling Rate,Hourly; +Output:Variable,*,Cooling Coil Latent Cooling Rate,Hourly; +Output:Variable,*,Cooling Coil Total Cooling Rate,Hourly; +Output:Variable,*,Heating Coil Heating Rate,Hourly; diff --git a/testfiles/SingleFamilyHouse_HP_Slab_Dehumidification.idf b/testfiles/SingleFamilyHouse_HP_Slab_Dehumidification.idf new file mode 100644 index 00000000000..12b81e00cd9 --- /dev/null +++ b/testfiles/SingleFamilyHouse_HP_Slab_Dehumidification.idf @@ -0,0 +1,5513 @@ +!-Generator IDFEditor 1.51 +!-Option SortedOrder UseSpecialFormat + +!-NOTE: All comments with '!-' are ignored by the IDFEditor and are generated automatically. +!- Use '!' comments if they need to be retained when using the IDFEditor. + + +!- =========== ALL OBJECTS IN CLASS: VERSION =========== + +Version,9.5; + +!- =========== ALL OBJECTS IN CLASS: SIMULATIONCONTROL =========== + + +SimulationControl, + Yes, !- Do Zone Sizing Calculation + Yes, !- Do System Sizing Calculation + No, !- Do Plant Sizing Calculation + Yes, !- Run Simulation for Sizing Periods + Yes, !- Run Simulation for Weather File Run Periods + , !- Do HVAC Sizing Simulation for Sizing Periods + ; !- Maximum Number of HVAC Sizing Simulation Passes + + +!- =========== ALL OBJECTS IN CLASS: BUILDING =========== + +Building, + SF_CZ8_HP_SLAB_DEH, !- Name + 0, !- North Axis {deg} + Suburbs, !- Terrain + 0.04, !- Loads Convergence Tolerance Value {W} + 0.4, !- Temperature Convergence Tolerance Value {deltaC} + FullExterior, !- Solar Distribution + 25, !- Maximum Number of Warmup Days + 6; !- Minimum Number of Warmup Days + + +!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:INSIDE =========== + +SurfaceConvectionAlgorithm:Inside,TARP; + +!- =========== ALL OBJECTS IN CLASS: TIMESTEP =========== + +Timestep,6; + +!- =========== ALL OBJECTS IN CLASS: SITE:LOCATION =========== + + +Site:Location, + Fairbanks Intl Arpt_AK_USA Design_Conditions, !- Name + 64.82, !- Latitude {deg} + -147.85, !- Longitude {deg} + -9.00, !- Time Zone {hr} + 133.00; !- Elevation {m} + + +!- =========== ALL OBJECTS IN CLASS: SIZINGPERIOD:DESIGNDAY =========== + +SizingPeriod:DesignDay, + Fairbanks Intl Arpt Ann Htg 99.6% Condns DB, !- Name + 1, !- Month + 21, !- Day of Month + WinterDesignDay, !- Day Type + -41.9, !- Maximum Dry-Bulb Temperature {C} + 0.0, !- Daily Dry-Bulb Temperature Range {deltaC} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + -41.9, !- 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} + 99737., !- Barometric Pressure {Pa} + 0.3, !- Wind Speed {m/s} + 20, !- 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 + +SizingPeriod:DesignDay, + Fairbanks Intl Arpt Ann Clg .4% Condns DB=>MWB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay, !- Day Type + 27.4, !- Maximum Dry-Bulb Temperature {C} + 10.2, !- Daily Dry-Bulb Temperature Range {deltaC} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 16.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} + 99737., !- Barometric Pressure {Pa} + 3.1, !- Wind Speed {m/s} + 180, !- Wind Direction {deg} + No, !- Rain Indicator + No, !- Snow Indicator + No, !- Daylight Saving Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.387, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} + 2.212; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} + + +!- =========== ALL OBJECTS IN CLASS: RUNPERIOD =========== + +RunPeriod, + annual, !- Name + 1, !- Begin Month + 1, !- Begin Day of Month + , !- Begin Year + 12, !- End Month + 31, !- End Day of Month + , !- End Year + Sunday, !- Day of Week for Start Day + Yes, !- Use Weather File Holidays and Special Days + Yes, !- Use Weather File Daylight Saving Period + No, !- Apply Weekend Holiday Rule + Yes, !- Use Weather File Rain Indicators + Yes; !- Use Weather File Snow Indicators + + +!- =========== ALL OBJECTS IN CLASS: SITE:WATERMAINSTEMPERATURE =========== + +Site:WaterMainsTemperature, + Correlation, !- Calculation Method + , !- Temperature Schedule Name + -1.525, !- Annual Average Outdoor Air Temperature {C} + 36.2; !- Maximum Difference In Monthly Average Outdoor Air Temperatures {deltaC} + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULETYPELIMITS =========== + +ScheduleTypeLimits, + any number; !- Name + +ScheduleTypeLimits, + On/Off, !- Name + 0, !- Lower Limit Value + 1, !- Upper Limit Value + Discrete; !- Numeric Type + +ScheduleTypeLimits, + control_type, !- Name + 0, !- Lower Limit Value + 4, !- Upper Limit Value + Discrete; !- Numeric Type + +ScheduleTypeLimits, + fraction, !- Name + 0, !- Lower Limit Value + 1, !- Upper Limit Value + Continuous; !- Numeric Type + +ScheduleTypeLimits, + Temperature, !- Name + -60, !- Lower Limit Value + 200, !- Upper Limit Value + Continuous; !- Numeric Type + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULE:DAY:HOURLY =========== + +Schedule:Day:Hourly, + OccupancyDay, !- Name + Fraction, !- Schedule Type Limits Name + 1.00000, !- Hour 1 + 1.00000, !- Hour 2 + 1.00000, !- Hour 3 + 1.00000, !- Hour 4 + 1.00000, !- Hour 5 + 1.00000, !- Hour 6 + 1.00000, !- Hour 7 + 0.88310, !- Hour 8 + 0.40861, !- Hour 9 + 0.24189, !- Hour 10 + 0.24189, !- Hour 11 + 0.24189, !- Hour 12 + 0.24189, !- Hour 13 + 0.24189, !- Hour 14 + 0.24189, !- Hour 15 + 0.24189, !- Hour 16 + 0.29498, !- Hour 17 + 0.55310, !- Hour 18 + 0.89693, !- Hour 19 + 0.89693, !- Hour 20 + 0.89693, !- Hour 21 + 1.00000, !- Hour 22 + 1.00000, !- Hour 23 + 1.00000; !- Hour 24 + +Schedule:Day:Hourly, + LightingDay, !- Name + Fraction, !- Schedule Type Limits Name + 0.0625, !- Hour 1 + 0.0625, !- Hour 2 + 0.0625, !- Hour 3 + 0.0625, !- Hour 4 + 0.1875, !- Hour 5 + 0.390625, !- Hour 6 + 0.4375, !- Hour 7 + 0.390625, !- Hour 8 + 0.171875, !- Hour 9 + 0.1171875, !- Hour 10 + 0.1171875, !- Hour 11 + 0.1171875, !- Hour 12 + 0.1171875, !- Hour 13 + 0.1171875, !- Hour 14 + 0.1171875, !- Hour 15 + 0.203125, !- Hour 16 + 0.4375, !- Hour 17 + 0.609375, !- Hour 18 + 0.8203125, !- Hour 19 + 0.984375, !- Hour 20 + 1, !- Hour 21 + 0.6875, !- Hour 22 + 0.3828125, !- Hour 23 + 0.15625; !- Hour 24 + +Schedule:Day:Hourly, + LightingDay_EELighting_OccSensors, !- Name + Fraction, !- Schedule Type Limits Name + 0.065170403, !- Hour 1 + 0.065170403, !- Hour 2 + 0.065170403, !- Hour 3 + 0.065170403, !- Hour 4 + 0.195511208, !- Hour 5 + 0.407315016, !- Hour 6 + 0.456192818, !- Hour 7 + 0.407315016, !- Hour 8 + 0.179218607, !- Hour 9 + 0.122194505, !- Hour 10 + 0.122194505, !- Hour 11 + 0.122194505, !- Hour 12 + 0.122194505, !- Hour 13 + 0.122194505, !- Hour 14 + 0.122194505, !- Hour 15 + 0.211803808, !- Hour 16 + 0.456192818, !- Hour 17 + 0.635411425, !- Hour 18 + 0.855361533, !- Hour 19 + 0.947933128, !- Hour 20 + 0.947933128, !- Hour 21 + 0.716874428, !- Hour 22 + 0.399168715, !- Hour 23 + 0.162926006; !- Hour 24 + +Schedule:Day:Hourly, + LightingDay_EELighting_Garage_OccSensors, !- Name + Fraction, !- Schedule Type Limits Name + 0.048125, !- Hour 1 + 0.048125, !- Hour 2 + 0.048125, !- Hour 3 + 0.048125, !- Hour 4 + 0.144375, !- Hour 5 + 0.30078125, !- Hour 6 + 0.336875, !- Hour 7 + 0.30078125, !- Hour 8 + 0.13234375, !- Hour 9 + 0.090234375, !- Hour 10 + 0.090234375, !- Hour 11 + 0.090234375, !- Hour 12 + 0.090234375, !- Hour 13 + 0.090234375, !- Hour 14 + 0.090234375, !- Hour 15 + 0.15640625, !- Hour 16 + 0.336875, !- Hour 17 + 0.46921875, !- Hour 18 + 0.631640625, !- Hour 19 + 0.7, !- Hour 20 + 0.7, !- Hour 21 + 0.529375, !- Hour 22 + 0.294765625, !- Hour 23 + 0.1203125; !- Hour 24 + +Schedule:Day:Hourly, + ExteriorLightingDay, !- Name + Fraction, !- Schedule Type Limits Name + 1, !- Hour 1 + 1, !- Hour 2 + 1, !- Hour 3 + 1, !- Hour 4 + 1, !- Hour 5 + 1, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 1, !- Hour 19 + 1, !- Hour 20 + 1, !- Hour 21 + 1, !- Hour 22 + 1, !- Hour 23 + 1; !- Hour 24 + +Schedule:Day:Hourly, + LightingDay_EELighting, !- Name + Fraction, !- Schedule Type Limits Name + 0.06875, !- Hour 1 + 0.06875, !- Hour 2 + 0.06875, !- Hour 3 + 0.06875, !- Hour 4 + 0.20625, !- Hour 5 + 0.4296875, !- Hour 6 + 0.48125, !- Hour 7 + 0.4296875, !- Hour 8 + 0.1890625, !- Hour 9 + 0.12890625, !- Hour 10 + 0.12890625, !- Hour 11 + 0.12890625, !- Hour 12 + 0.12890625, !- Hour 13 + 0.12890625, !- Hour 14 + 0.12890625, !- Hour 15 + 0.2234375, !- Hour 16 + 0.48125, !- Hour 17 + 0.6703125, !- Hour 18 + 0.90234375, !- Hour 19 + 1, !- Hour 20 + 1, !- Hour 21 + 0.75625, !- Hour 22 + 0.42109375, !- Hour 23 + 0.171875; !- Hour 24 + +Schedule:Day:Hourly, + RefrigeratorDay, !- Name + Fraction, !- Schedule Type Limits Name + 0.8, !- Hour 1 + 0.782696177062374, !- Hour 2 + 0.765593561368209, !- Hour 3 + 0.742857142857143, !- Hour 4 + 0.731388329979879, !- Hour 5 + 0.731388329979879, !- Hour 6 + 0.759959758551308, !- Hour 7 + 0.8, !- Hour 8 + 0.817102615694165, !- Hour 9 + 0.828571428571429, !- Hour 10 + 0.8, !- Hour 11 + 0.8, !- Hour 12 + 0.839839034205231, !- Hour 13 + 0.839839034205231, !- Hour 14 + 0.828571428571429, !- Hour 15 + 0.839839034205231, !- Hour 16 + 0.885714285714286, !- Hour 17 + 0.971428571428572, !- Hour 18 + 1, !- Hour 19 + 0.971428571428572, !- Hour 20 + 0.942857142857143, !- Hour 21 + 0.925553319919517, !- Hour 22 + 0.885714285714286, !- Hour 23 + 0.828571428571429; !- Hour 24 + +Schedule:Day:Hourly, + MiscPlugLoadDay, !- Name + Fraction, !- Schedule Type Limits Name + 0.607490272373541, !- Hour 1 + 0.559338521400778, !- Hour 2 + 0.552853437094682, !- Hour 3 + 0.545071335927367, !- Hour 4 + 0.524481193255512, !- Hour 5 + 0.585278858625162, !- Hour 6 + 0.676232166018158, !- Hour 7 + 0.718547341115435, !- Hour 8 + 0.607490272373541, !- Hour 9 + 0.517023346303502, !- Hour 10 + 0.529182879377432, !- Hour 11 + 0.529345006485084, !- Hour 12 + 0.520428015564202, !- Hour 13 + 0.538424124513619, !- Hour 14 + 0.568741893644617, !- Hour 15 + 0.600356679636835, !- Hour 16 + 0.71011673151751, !- Hour 17 + 0.862678339818418, !- Hour 18 + 0.936608300907912, !- Hour 19 + 0.966763942931258, !- Hour 20 + 1, !- Hour 21 + 0.976653696498055, !- Hour 22 + 0.845168612191959, !- Hour 23 + 0.73443579766537; !- Hour 24 + +Schedule:Day:Hourly, + CookingRangeDay, !- Name + Fraction, !- Schedule Type Limits Name + 0.04715848452508, !- Hour 1 + 0.04715848452508, !- Hour 2 + 0.0235458911419424, !- Hour 3 + 0.0235458911419424, !- Hour 4 + 0.04715848452508, !- Hour 5 + 0.0707043756670224, !- Hour 6 + 0.165088046958378, !- Hour 7 + 0.283017609391676, !- Hour 8 + 0.306563500533618, !- Hour 9 + 0.320771077908218, !- Hour 10 + 0.283017609391676, !- Hour 11 + 0.330176093916756, !- Hour 12 + 0.377334578441836, !- Hour 13 + 0.306563500533618, !- Hour 14 + 0.292422625400213, !- Hour 15 + 0.377334578441836, !- Hour 16 + 0.613193703308431, !- Hour 17 + 1, !- Hour 18 + 0.778348452508004, !- Hour 19 + 0.400947171824973, !- Hour 20 + 0.235859124866596, !- Hour 21 + 0.165088046958378, !- Hour 22 + 0.103721985058698, !- Hour 23 + 0.0707043756670224; !- Hour 24 + +Schedule:Day:Hourly, + DishwasherWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.115858456545258, !- Hour 1 + 0.0514758745041469, !- Hour 2 + 0.0385691669671833, !- Hour 3 + 0.0257379372520738, !- Hour 4 + 0.0257379372520738, !- Hour 5 + 0.0772138117562207, !- Hour 6 + 0.154503101334295, !- Hour 7 + 0.23179239091237, !- Hour 8 + 0.437922322394519, !- Hour 9 + 0.489398196898665, !- Hour 10 + 0.425015614857555, !- Hour 11 + 0.360633032816445, !- Hour 12 + 0.309081680490443, !- Hour 13 + 0.347726325279481, !- Hour 14 + 0.28334374323837, !- Hour 15 + 0.270437035701407, !- Hour 16 + 0.28334374323837, !- Hour 17 + 0.373464262531554, !- Hour 18 + 0.656883483591778, !- Hour 19 + 0.837199999999997, !- Hour 20 + 0.682621420843852, !- Hour 21 + 0.502304904435629, !- Hour 22 + 0.334819617742518, !- Hour 23 + 0.23179239091237; !- Hour 24 + +Schedule:Day:Hourly, + DishwasherWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.124134060584205, !- Hour 1 + 0.0551527226830148, !- Hour 2 + 0.0413241074648395, !- Hour 3 + 0.0275763613415074, !- Hour 4 + 0.0275763613415074, !- Hour 5 + 0.0827290840245222, !- Hour 6 + 0.165539037143888, !- Hour 7 + 0.248348990263252, !- Hour 8 + 0.469202488279841, !- Hour 9 + 0.524355210962856, !- Hour 10 + 0.455373873061666, !- Hour 11 + 0.386392535160476, !- Hour 12 + 0.331158943382618, !- Hour 13 + 0.3725639199423, !- Hour 14 + 0.303582582041111, !- Hour 15 + 0.289753966822935, !- Hour 16 + 0.303582582041111, !- Hour 17 + 0.400140281283808, !- Hour 18 + 0.703803732419762, !- Hour 19 + 0.897, !- Hour 20 + 0.731380093761269, !- Hour 21 + 0.538183826181031, !- Hour 22 + 0.358735304724125, !- Hour 23 + 0.248348990263252; !- Hour 24 + +Schedule:Day:Hourly, + DishwasherVacation, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 0, !- Hour 19 + 0, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + ClothesWasherWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.0796474528960224, !- Hour 1 + 0.0637009071877185, !- Hour 2 + 0.0318078157711097, !- Hour 3 + 0.0318078157711097, !- Hour 4 + 0.0637009071877185, !- Hour 5 + 0.0955939986043261, !- Hour 6 + 0.191187997208654, !- Hour 7 + 0.414354361479414, !- Hour 8 + 0.62157418004187, !- Hour 9 + 0.7332, !- Hour 10 + 0.717253454291697, !- Hour 11 + 0.637520725750175, !- Hour 12 + 0.573734542916957, !- Hour 13 + 0.510033635729239, !- Hour 14 + 0.446247452896022, !- Hour 15 + 0.414354361479414, !- Hour 16 + 0.430300907187718, !- Hour 17 + 0.414354361479414, !- Hour 18 + 0.414354361479414, !- Hour 19 + 0.414354361479414, !- Hour 20 + 0.414354361479414, !- Hour 21 + 0.398407815771109, !- Hour 22 + 0.270920725750174, !- Hour 23 + 0.143433635729239; !- Hour 24 + +Schedule:Day:Hourly, + ClothesWasherWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.0974410327983253, !- Hour 1 + 0.0779319609211445, !- Hour 2 + 0.038913817166783, !- Hour 3 + 0.038913817166783, !- Hour 4 + 0.0779319609211445, !- Hour 5 + 0.116950104675506, !- Hour 6 + 0.233900209351012, !- Hour 7 + 0.506922889043964, !- Hour 8 + 0.760436496859734, !- Hour 9 + 0.897, !- Hour 10 + 0.877490928122819, !- Hour 11 + 0.779945568736915, !- Hour 12 + 0.701909281228193, !- Hour 13 + 0.623977320307048, !- Hour 14 + 0.545941032798325, !- Hour 15 + 0.506922889043964, !- Hour 16 + 0.526431960921144, !- Hour 17 + 0.506922889043964, !- Hour 18 + 0.506922889043964, !- Hour 19 + 0.506922889043964, !- Hour 20 + 0.506922889043964, !- Hour 21 + 0.487413817166783, !- Hour 22 + 0.331445568736915, !- Hour 23 + 0.175477320307048; !- Hour 24 + +Schedule:Day:Hourly, + ClothesWasherVacation, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 0, !- Hour 19 + 0, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + dhw_profile_day, !- Name + fraction, !- Schedule Type Limits Name + 0.006, !- Hour 1 + 0.003, !- Hour 2 + 0.001, !- Hour 3 + 0.001, !- Hour 4 + 0.003, !- Hour 5 + 0.021, !- Hour 6 + 0.075, !- Hour 7 + 0.079, !- Hour 8 + 0.076, !- Hour 9 + 0.067, !- Hour 10 + 0.061, !- Hour 11 + 0.05, !- Hour 12 + 0.042, !- Hour 13 + 0.038, !- Hour 14 + 0.033, !- Hour 15 + 0.038, !- Hour 16 + 0.043, !- Hour 17 + 0.058, !- Hour 18 + 0.068, !- Hour 19 + 0.065, !- Hour 20 + 0.06, !- Hour 21 + 0.047, !- Hour 22 + 0.041, !- Hour 23 + 0.024; !- Hour 24 + +Schedule:Day:Hourly, + ClothesDryerWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.0996818663838815, !- Hour 1 + 0.0598091198303289, !- Hour 2 + 0.0398727465535526, !- Hour 3 + 0.0199363732767763, !- Hour 4 + 0.0398727465535526, !- Hour 5 + 0.0598091198303289, !- Hour 6 + 0.15949098621421, !- Hour 7 + 0.31898197242842, !- Hour 8 + 0.486427370202556, !- Hour 9 + 0.685791102970318, !- Hour 10 + 0.785472969354199, !- Hour 11 + 0.817391304347826, !- Hour 12 + 0.745600222800647, !- Hour 13 + 0.677836691410393, !- Hour 14 + 0.610073160020138, !- Hour 15 + 0.578154825026511, !- Hour 16 + 0.558218451749735, !- Hour 17 + 0.546236490032885, !- Hour 18 + 0.518345705196183, !- Hour 19 + 0.510391293636256, !- Hour 20 + 0.526300116756109, !- Hour 21 + 0.546236490032885, !- Hour 22 + 0.438600212089077, !- Hour 23 + 0.239236479321316; !- Hour 24 + +Schedule:Day:Hourly, + ClothesDryerWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.121951219512195, !- Hour 1 + 0.0731707317073171, !- Hour 2 + 0.0487804878048781, !- Hour 3 + 0.024390243902439, !- Hour 4 + 0.0487804878048781, !- Hour 5 + 0.0731707317073171, !- Hour 6 + 0.195121951219512, !- Hour 7 + 0.390243902439024, !- Hour 8 + 0.59509731460951, !- Hour 9 + 0.8389997536339, !- Hour 10 + 0.960950973146095, !- Hour 11 + 1, !- Hour 12 + 0.912170485341217, !- Hour 13 + 0.829268292682927, !- Hour 14 + 0.746366100024637, !- Hour 15 + 0.707317073170732, !- Hour 16 + 0.682926829268293, !- Hour 17 + 0.668268046316827, !- Hour 18 + 0.634146341463415, !- Hour 19 + 0.624414880512441, !- Hour 20 + 0.643877802414388, !- Hour 21 + 0.668268046316827, !- Hour 22 + 0.536585365853659, !- Hour 23 + 0.292682926829268; !- Hour 24 + +Schedule:Day:Hourly, + ClothesDryerVacation, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 0, !- Hour 19 + 0, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + SinksWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.160052687884461, !- Hour 1 + 0.0767484287242575, !- Hour 2 + 0.0575330636533838, !- Hour 3 + 0.0575330636533838, !- Hour 4 + 0.0767484287242575, !- Hour 5 + 0.204926216902916, !- Hour 6 + 0.480271095212623, !- Hour 7 + 0.704412677186414, !- Hour 8 + 0.742843407328163, !- Hour 9 + 0.697969878309708, !- Hour 10 + 0.614778650708746, !- Hour 11 + 0.563462322813587, !- Hour 12 + 0.550689756619418, !- Hour 13 + 0.512259026477668, !- Hour 14 + 0.467385497459214, !- Hour 15 + 0.486600862530089, !- Hour 16 + 0.544246957742712, !- Hour 17 + 0.736400608451458, !- Hour 18 + 0.84525, !- Hour 19 + 0.781274137469912, !- Hour 20 + 0.640323783097085, !- Hour 21 + 0.544246957742712, !- Hour 22 + 0.44828316394758, !- Hour 23 + 0.307332809574753; !- Hour 24 + +Schedule:Day:Hourly, + SinksWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.169851832040653, !- Hour 1 + 0.0814473121155389, !- Hour 2 + 0.0610554961219577, !- Hour 3 + 0.0610554961219577, !- Hour 4 + 0.0814473121155389, !- Hour 5 + 0.217472719978604, !- Hour 6 + 0.509675447980744, !- Hour 7 + 0.747539983952929, !- Hour 8 + 0.788323615940091, !- Hour 9 + 0.74070272800214, !- Hour 10 + 0.652418159935812, !- Hour 11 + 0.597960016047071, !- Hour 12 + 0.58440545600428, !- Hour 13 + 0.543621824017117, !- Hour 14 + 0.496000936079166, !- Hour 15 + 0.516392752072746, !- Hour 16 + 0.57756820005349, !- Hour 17 + 0.781486359989302, !- Hour 18 + 0.897, !- Hour 19 + 0.829107247927254, !- Hour 20 + 0.679527280021396, !- Hour 21 + 0.57756820005349, !- Hour 22 + 0.47572907194437, !- Hour 23 + 0.326149104038513; !- Hour 24 + +Schedule:Day:Hourly, + SinksVacation, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 0, !- Hour 19 + 0, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + ShowersWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.076044361285933, !- Hour 1 + 0.0345332539547544, !- Hour 2 + 0.0242088790610646, !- Hour 3 + 0.0345332539547544, !- Hour 4 + 0.0968355162442594, !- Hour 5 + 0.366693315189659, !- Hour 6 + 0.837199999999997, !- Hour 7 + 0.830293349209049, !- Hour 8 + 0.674644497363497, !- Hour 9 + 0.529320020411635, !- Hour 10 + 0.425506650790951, !- Hour 11 + 0.335577785337642, !- Hour 12 + 0.242159993196122, !- Hour 13 + 0.207555536655894, !- Hour 14 + 0.179857730906617, !- Hour 15 + 0.186764381697567, !- Hour 16 + 0.214462187446844, !- Hour 17 + 0.27676444973635, !- Hour 18 + 0.300973328797414, !- Hour 19 + 0.300973328797414, !- Hour 20 + 0.297484402109202, !- Hour 21 + 0.290577751318252, !- Hour 22 + 0.207555536655894, !- Hour 23 + 0.148742201054601; !- Hour 24 + +Schedule:Day:Hourly, + ShowersWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.0814761013777853, !- Hour 1 + 0.0369999149515223, !- Hour 2 + 0.0259380847082837, !- Hour 3 + 0.0369999149515223, !- Hour 4 + 0.103752338833135, !- Hour 5 + 0.392885694846062, !- Hour 6 + 0.897, !- Hour 7 + 0.889600017009696, !- Hour 8 + 0.722833390032318, !- Hour 9 + 0.56712859329818, !- Hour 10 + 0.455899982990304, !- Hour 11 + 0.359547627147474, !- Hour 12 + 0.259457135567274, !- Hour 13 + 0.222380932131315, !- Hour 14 + 0.19270471168566, !- Hour 15 + 0.200104694675966, !- Hour 16 + 0.229780915121619, !- Hour 17 + 0.296533339003232, !- Hour 18 + 0.322471423711515, !- Hour 19 + 0.322471423711515, !- Hour 20 + 0.318733287974145, !- Hour 21 + 0.311333304983841, !- Hour 22 + 0.222380932131315, !- Hour 23 + 0.159366643987073; !- Hour 24 + +Schedule:Day:Hourly, + ShowersVacation, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 0, !- Hour 19 + 0, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + BathsWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.0492758944582015, !- Hour 1 + 0.0246379472291013, !- Hour 2 + 0.0246379472291013, !- Hour 3 + 0.0246379472291013, !- Hour 4 + 0.0492758944582015, !- Hour 5 + 0.123189736145504, !- Hour 6 + 0.295719195628041, !- Hour 7 + 0.369633037315344, !- Hour 8 + 0.418908931773546, !- Hour 9 + 0.369633037315344, !- Hour 10 + 0.295719195628041, !- Hour 11 + 0.221741525061908, !- Hour 12 + 0.197103577832807, !- Hour 13 + 0.147827683374605, !- Hour 14 + 0.147827683374605, !- Hour 15 + 0.147827683374605, !- Hour 16 + 0.24644330116984, !- Hour 17 + 0.295719195628041, !- Hour 18 + 0.492886602339681, !- Hour 19 + 0.640714285714285, !- Hour 20 + 0.640714285714285, !- Hour 21 + 0.492886602339681, !- Hour 22 + 0.418908931773546, !- Hour 23 + 0.24644330116984; !- Hour 24 + +Schedule:Day:Hourly, + BathsWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.0689862522414824, !- Hour 1 + 0.0344931261207412, !- Hour 2 + 0.0344931261207412, !- Hour 3 + 0.0344931261207412, !- Hour 4 + 0.0689862522414824, !- Hour 5 + 0.172465630603706, !- Hour 6 + 0.414006873879259, !- Hour 7 + 0.517486252241482, !- Hour 8 + 0.586472504482965, !- Hour 9 + 0.517486252241482, !- Hour 10 + 0.414006873879259, !- Hour 11 + 0.310438135086671, !- Hour 12 + 0.27594500896593, !- Hour 13 + 0.206958756724447, !- Hour 14 + 0.206958756724447, !- Hour 15 + 0.206958756724447, !- Hour 16 + 0.345020621637776, !- Hour 17 + 0.414006873879259, !- Hour 18 + 0.690041243275553, !- Hour 19 + 0.897, !- Hour 20 + 0.897, !- Hour 21 + 0.690041243275553, !- Hour 22 + 0.586472504482965, !- Hour 23 + 0.345020621637776; !- Hour 24 + +Schedule:Day:Hourly, + BathsVacation, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 0, !- Hour 19 + 0, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + DHWDistDay, !- Name + Fraction, !- Schedule Type Limits Name + 0.142553149370226, !- Hour 1 + 0.0764866759550322, !- Hour 2 + 0.0516611840277747, !- Hour 3 + 0.0584039294664903, !- Hour 4 + 0.121469841058603, !- Hour 5 + 0.366180268451559, !- Hour 6 + 0.833258955739606, !- Hour 7 + 0.999999987228391, !- Hour 8 + 0.995483090581232, !- Hour 9 + 0.916474762598139, !- Hour 10 + 0.800898393293271, !- Hour 11 + 0.682564390940485, !- Hour 12 + 0.590066600109555, !- Hour 13 + 0.522371887032053, !- Hour 14 + 0.466005974303267, !- Hour 15 + 0.46573704253214, !- Hour 16 + 0.527514234916123, !- Hour 17 + 0.637905701335668, !- Hour 18 + 0.727588642310272, !- Hour 19 + 0.732551127624518, !- Hour 20 + 0.681468471942116, !- Hour 21 + 0.610804704600985, !- Hour 22 + 0.464292318119835, !- Hour 23 + 0.299867724445383; !- Hour 24 + +Schedule:Day:Hourly, + WinterLoadDay, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 0, !- Hour 19 + 0, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + SummerLoadDay, !- Name + Fraction, !- Schedule Type Limits Name + 1, !- Hour 1 + 1, !- Hour 2 + 1, !- Hour 3 + 1, !- Hour 4 + 1, !- Hour 5 + 1, !- Hour 6 + 1, !- Hour 7 + 1, !- Hour 8 + 1, !- Hour 9 + 1, !- Hour 10 + 1, !- Hour 11 + 1, !- Hour 12 + 1, !- Hour 13 + 1, !- Hour 14 + 1, !- Hour 15 + 1, !- Hour 16 + 1, !- Hour 17 + 1, !- Hour 18 + 1, !- Hour 19 + 1, !- Hour 20 + 1, !- Hour 21 + 1, !- Hour 22 + 1, !- Hour 23 + 1; !- Hour 24 + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULE:WEEK:COMPACT =========== + +Schedule:Week:Compact, + RefrigeratorWeek, !- Name + For: AllDays, !- DayType List 1 + RefrigeratorDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + MiscPlugLoadWeek, !- Name + For: AllDays, !- DayType List 1 + MiscPlugLoadDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + CookingRangeWeek, !- Name + For: AllDays, !- DayType List 1 + CookingRangeDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + DishwasherWeek, !- Name + For: Weekdays, !- DayType List 1 + DishwasherWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + DishwasherVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + DishwasherWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + ClothesWasherWeek, !- Name + For: Weekdays, !- DayType List 1 + ClothesWasherWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + ClothesWasherVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + ClothesWasherWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + dhw_profile_week, !- Name + AllDays, !- DayType List 1 + dhw_profile_day; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + ClothesDryerWeek, !- Name + For: Weekdays, !- DayType List 1 + ClothesDryerWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + ClothesDryerVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + ClothesDryerWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + SinksWeek, !- Name + For: Weekdays, !- DayType List 1 + SinksWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + SinksVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + SinksWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + ShowersWeek, !- Name + For: Weekdays, !- DayType List 1 + ShowersWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + ShowersVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + ShowersWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + BathsWeek, !- Name + For: Weekdays, !- DayType List 1 + BathsWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + BathsVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + BathsWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + DHWDistWeek, !- Name + For: AllDays, !- DayType List 1 + DHWDistDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + OccupancyWeek, !- Name + AllDays, !- DayType List 1 + OccupancyDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + LightingProfileWeek, !- Name + For: AllDays, !- DayType List 1 + LightingDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + LightingProfileWeek_EELighting, !- Name + For: AllDays, !- DayType List 1 + LightingDay_EELighting; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + LightingProfileWeek_EELighting_interior_controls, !- Name + For: AllDays, !- DayType List 1 + LightingDay_EELighting_OccSensors; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + LightingProfileWeek_EELighting_garage_controls, !- Name + For: AllDays, !- DayType List 1 + LightingDay_EELighting_Garage_OccSensors; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + ExteriorLightingProfileWeek, !- Name + For: AllDays, !- DayType List 1 + ExteriorLightingDay; !- Schedule:Day Name 1 + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULE:YEAR =========== + +Schedule:Year, + Occupancy, !- Name + Fraction, !- Schedule Type Limits Name + OccupancyWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + InteriorLighting, !- Name + Fraction, !- Schedule Type Limits Name + LightingProfileWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + InteriorLightingHE, !- Name + Fraction, !- Schedule Type Limits Name + LightingProfileWeek_EELighting, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + InteriorLightingHE_OS, !- Name + Fraction, !- Schedule Type Limits Name + LightingProfileWeek_EELighting_interior_controls, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + InteriorLightingHE_VS, !- Name + Fraction, !- Schedule Type Limits Name + LightingProfileWeek_EELighting_garage_controls, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + ExteriorLighting, !- Name + Fraction, !- Schedule Type Limits Name + ExteriorLightingProfileWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + Refrigerator, !- Name + Fraction, !- Schedule Type Limits Name + RefrigeratorWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + MiscPlugLoad, !- Name + Fraction, !- Schedule Type Limits Name + MiscPlugLoadWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + CookingRange, !- Name + Fraction, !- Schedule Type Limits Name + CookingRangeWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + dhw_sch, !- Name + fraction, !- Schedule Type Limits Name + dhw_profile_week, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + Dishwasher, !- Name + Fraction, !- Schedule Type Limits Name + DishwasherWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + ClothesWasher, !- Name + Fraction, !- Schedule Type Limits Name + ClothesWasherWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + ClothesDryer, !- Name + Fraction, !- Schedule Type Limits Name + ClothesDryerWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + Sinks, !- Name + Fraction, !- Schedule Type Limits Name + SinksWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + Showers, !- Name + Fraction, !- Schedule Type Limits Name + ShowersWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + Baths, !- Name + Fraction, !- Schedule Type Limits Name + BathsWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + DHWDist, !- Name + Fraction, !- Schedule Type Limits Name + DHWDistWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULE:COMPACT =========== + +Schedule:Compact, + BA_shower_sch, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 1:00, 0.00174682444444444, + !- Field 4 + Until: 2:00, 0.000794011111111111, + !- Field 6 + Until: 3:00, 0.000476406666666667, + !- Field 8 + Until: 4:00, 0.000794011111111111, + !- Field 10 + Until: 5:00, 0.00222323111111111, + !- Field 12 + Until: 6:00, 0.00825771555555556, + !- Field 14 + Until: 7:00, 0.0187386622222222, + !- Field 16 + Until: 8:00, 0.01857986, !- Field 18 + Until: 9:00, 0.0150862111111111, + !- Field 20 + Until: 10:00, 0.0117513644444444, + !- Field 22 + Until: 11:00, 0.00952813333333333, + !- Field 24 + Until: 12:00, 0.00746370444444444, + !- Field 26 + Until: 13:00, 0.00539927555555556, + !- Field 28 + Until: 14:00, 0.00460526444444444, + !- Field 30 + Until: 15:00, 0.00412885777777778, + !- Field 32 + Until: 16:00, 0.00397005555555556, + !- Field 34 + Until: 17:00, 0.00476406666666667, + !- Field 36 + Until: 18:00, 0.00619328666666667, + !- Field 38 + Until: 19:00, 0.00666969333333333, + !- Field 40 + Until: 20:00, 0.00666969333333333, + !- Field 42 + Until: 21:00, 0.00666969333333333, + !- Field 44 + Until: 22:00, 0.00651089111111111, + !- Field 46 + Until: 23:00, 0.00460526444444444, + !- Field 48 + Until: 24:00, 0.00333484666666667; + !- Field 50 + +Schedule:Compact, + BA_bath_sch, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 1:00, 0.000163090909090909, + !- Field 4 + Until: 2:00, 8.15454545454545e-05, + !- Field 6 + Until: 3:00, 8.15454545454545e-05, + !- Field 8 + Until: 4:00, 8.15454545454545e-05, + !- Field 10 + Until: 5:00, 0.000163090909090909, + !- Field 12 + Until: 6:00, 0.000387340909090909, + !- Field 14 + Until: 7:00, 0.000937772727272727, + !- Field 16 + Until: 8:00, 0.00118240909090909, + !- Field 18 + Until: 9:00, 0.0013455, !- Field 20 + Until: 10:00, 0.00118240909090909, + !- Field 22 + Until: 11:00, 0.000937772727272727, + !- Field 24 + Until: 12:00, 0.000713522727272727, + !- Field 26 + Until: 13:00, 0.000631977272727273, + !- Field 28 + Until: 14:00, 0.000468886363636364, + !- Field 30 + Until: 15:00, 0.000468886363636364, + !- Field 32 + Until: 16:00, 0.000468886363636364, + !- Field 34 + Until: 17:00, 0.000795068181818182, + !- Field 36 + Until: 18:00, 0.000937772727272727, + !- Field 38 + Until: 19:00, 0.00156975,!- Field 40 + Until: 20:00, 0.00203863636363636, + !- Field 42 + Until: 21:00, 0.00203863636363636, + !- Field 44 + Until: 22:00, 0.00156975,!- Field 46 + Until: 23:00, 0.0013455, !- Field 48 + Until: 24:00, 0.000795068181818182; + !- Field 50 + +Schedule:Compact, + BA_sink_sch, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 1:00, 0.00387388596491228, + !- Field 4 + Until: 2:00, 0.00193694298245614, + !- Field 6 + Until: 3:00, 0.00138353070175439, + !- Field 8 + Until: 4:00, 0.00138353070175439, + !- Field 10 + Until: 5:00, 0.00193694298245614, + !- Field 12 + Until: 6:00, 0.00498071052631579, + !- Field 14 + Until: 7:00, 0.0116216578947368, + !- Field 16 + Until: 8:00, 0.0171557807017544, + !- Field 18 + Until: 9:00, 0.0182626052631579, + !- Field 20 + Until: 10:00, 0.0171557807017544, + !- Field 22 + Until: 11:00, 0.0149421315789474, + !- Field 24 + Until: 12:00, 0.0138353070175439, + !- Field 26 + Until: 13:00, 0.013558600877193, + !- Field 28 + Until: 14:00, 0.0124517763157895, + !- Field 30 + Until: 15:00, 0.0118983640350877, + !- Field 32 + Until: 16:00, 0.011344951754386, + !- Field 34 + Until: 17:00, 0.0132818947368421, + !- Field 36 + Until: 18:00, 0.017985899122807, + !- Field 38 + Until: 19:00, 0.0207529605263158, + !- Field 40 + Until: 20:00, 0.0190927236842105, + !- Field 42 + Until: 21:00, 0.01577225,!- Field 44 + Until: 22:00, 0.0132818947368421, + !- Field 46 + Until: 23:00, 0.0110682456140351, + !- Field 48 + Until: 24:00, 0.00747106578947368; + !- Field 50 + +Schedule:Compact, + activity_sch, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 117.28; !- Field 4 + +Schedule:Compact, + inf_sch, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 1; !- Field 4 + +Schedule:Compact, + zone_control_type, !- Name + control_type, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until 24:00, !- Field 3 + 4; !- Field 4 + +Schedule:Compact, + shading_2012iecc, !- Name + fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until 24:00, !- Field 3 + 0; !- Field 4 + +Schedule:Compact, + shading_2009iecc, !- Name + any number, !- Schedule Type Limits Name + Through: 5/30, !- Field 1 + For: AllDays, !- Field 2 + Until 24:00, !- Field 3 + 0.85, !- Field 4 + Through: 8/31, !- Field 5 + For: AllDays, !- Field 6 + Until 24:00, !- Field 7 + 0.7, !- Field 8 + Through: 12/31, !- Field 9 + For: AllDays, !- Field 10 + Until: 24:00, 0.85; !- Field 12 + +Schedule:Compact, + dhw_setpt, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until 24:00, !- Field 3 + 48; !- Field 4 + +Schedule:Compact, + dhw_setpt_hpwh, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until 24:00, !- Field 3 + 44; !- Field 4 + +Schedule:Compact, + Supply-Air-Temp-Sch, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 12; !- Field 4 + +Schedule:Compact, + always_avail, !- Name + On/Off, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 1; !- Field 4 + +Schedule:Compact, + always_off, !- Name + On/Off, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 0; !- Field 4 + +Schedule:Compact, + heating_sch_HRef, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 20; !- Field 4 + +Schedule:Compact, + cooling_sch_HRef, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 25.55; !- Field 4 + +Schedule:Compact, + heating_sch, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 22.2222222222223; + !- Field 4 + +Schedule:Compact, + cooling_sch, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 23.888888888889; + !- Field 4 + +Schedule:Compact, + fan_cycle, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, 0; !- Field 4 + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULE:CONSTANT =========== + +Schedule:Constant,DWWaterTempSchedule,Temperature,48.8888888888889; +Schedule:Constant,CWWaterTempSchedule,Temperature,48.8888888888889; +Schedule:Constant,SinkSensSchedule,Fraction,0.687777777777778; +Schedule:Constant,SinkLatSchedule,Fraction,0.312222222222222; +Schedule:Constant,ShowerSensSchedule,Fraction,0.51280276816609; +Schedule:Constant,ShowerLatSchedule,Fraction,0.48719723183391; +Schedule:Constant,BathSensSchedule,Fraction,1; +Schedule:Constant,BathLatSchedule,Fraction,0; +Schedule:Constant,SSBWaterTempSchedule,Temperature,40.5555555555556; +Schedule:Constant,WaterHeaterSP1Schedule,Temperature,48.8888888888889; +Schedule:Constant,WaterHeaterSP2Schedule,Temperature,40.5555555555556; +Schedule:Constant,DHWSupplySetpoint,Temperature,48.8888888888889; +Schedule:Constant,boiler_setpt,Temperature,80; +Schedule:Constant,Compressor Setpoint,Temperature,50; +Schedule:Constant,DOAShightemp,Temperature,200; +Schedule:Constant,DOASlowtemp,Temperature,-60; + +!- =========== ALL OBJECTS IN CLASS: MATERIAL =========== + + +Material, + sheathing_consol_layer, !- Name + Rough, !- Roughness + 0.031115, !- Thickness {m} + 0.035329, !- Conductivity {W/m-K} + 20.1, !- Density {kg/m3} + 1465.415; !- Specific Heat {J/kg-K} + +Material, + ceil_consol_layer, !- Name + Rough, !- Roughness + 0.444461299067702, !- Thickness {m} + 0.0617176, !- Conductivity {W/m-K} + 41.9286, !- Density {kg/m3} + 776.25126; !- Specific Heat {J/kg-K} + +Material, + floor_consol_layer, !- Name + Rough, !- Roughness + 0.000254, !- Thickness {m} + 12.989536, !- Conductivity {W/m-K} + 55.074, !- Density {kg/m3} + 916.9311; !- Specific Heat {J/kg-K} + +Material, + bsmtwall_consol_layer, !- Name + Rough, !- Roughness + 0.000254, !- Thickness {m} + 10.84384, !- Conductivity {W/m-K} + 120.801, !- Density {kg/m3} + 1036.25775; !- Specific Heat {J/kg-K} + +Material, + crawlwall_consol_layer, !- Name + Rough, !- Roughness + 0.000254, !- Thickness {m} + 10.84384, !- Conductivity {W/m-K} + 120.801, !- Density {kg/m3} + 1036.25775; !- Specific Heat {J/kg-K} + +Material, + wall_consol_layer, !- Name + Rough, !- Roughness + 0.1397, !- Thickness {m} + 0.057165, !- Conductivity {W/m-K} + 120.801, !- Density {kg/m3} + 1036.25775; !- Specific Heat {J/kg-K} + +Material, + Very High Reflectivity Surface, !- Name + Smooth, !- Roughness + 0.0005, !- Thickness {m} + 237, !- Conductivity {W/m-K} + 2702, !- Density {kg/m3} + 903, !- Specific Heat {J/kg-K} + 0.90, !- Thermal Absorptance + 0.05, !- Solar Absorptance + 0.05; !- Visible Absorptance + +Material, + GypsumBoard-5/16in, !- Name + Rough, !- Roughness + 7.93953E-03, !- Thickness {m} + 0.1586200, !- Conductivity {W/m-K} + 640, !- Density {kg/m3} + 1129.6, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.4, !- Solar Absorptance + 0.1; !- Visible Absorptance + +Material, + CopperPipe, !- Name + MediumRough, !- Roughness + 1.90500386169072E-02, !- Thickness {m} + 401, !- Conductivity {W/m-K} + 2243.000, !- Density {kg/m3} + 837.0000, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.6500000, !- Solar Absorptance + 0.6500000; !- Visible Absorptance + +Material, + F08 Metal surface, !- Name + Smooth, !- Roughness + 0.0008, !- Thickness {m} + 45.28, !- Conductivity {W/m-K} + 7824, !- Density {kg/m3} + 500; !- Specific Heat {J/kg-K} + +Material, + Concrete_4in, !- Name + Rough, !- Roughness + 0.1014984, !- Thickness {m} + 1.312098, !- Conductivity {W/m-K} + 2242.8, !- Density {kg/m3} + 465.2; !- Specific Heat {J/kg-K} + +Material, + Asphalt_shingle, !- Name + MediumRough, !- Roughness + 6.33985285170672E-03, !- Thickness {m} + 0.08186, !- Conductivity {W/m-K} + 1121.2917044623, !- Density {kg/m3} + 1255.20000949809, !- Specific Heat {J/kg-K} + , !- Thermal Absorptance + 0.75; !- Solar Absorptance + +Material, + Wood_shingle, !- Name + MediumSmooth, !- Roughness + 1.27000257446048E-02, !- Thickness {m} + 0.11388, !- Conductivity {W/m-K} + 426.090847695673, !- Density {kg/m3} + 1631.76001234752; !- Specific Heat {J/kg-K} + +Material, + Slate_shingle, !- Name + MediumSmooth, !- Roughness + 1.27000257446048E-02, !- Thickness {m} + 1.44219, !- Conductivity {W/m-K} + 1601.845292089, !- Density {kg/m3} + 1255.20000949809; !- Specific Heat {J/kg-K} + +Material, + cement_stucco, !- Name + MediumSmooth, !- Roughness + 1.905E-02, !- Thickness {m} + 0.721, !- Conductivity {W/m-K} + 1865.58, !- Density {kg/m3} + 878.640006648665; !- Specific Heat {J/kg-K} + +Material, + syn_stucco, !- Name + MediumSmooth, !- Roughness + 0.3048E-02, !- Thickness {m} + 8.65E-02, !- Conductivity {W/m-K} + 400, !- Density {kg/m3} + 878.640006648665; !- Specific Heat {J/kg-K} + +Material, + Drywall_1/2in, !- Name + MediumSmooth, !- Roughness + 1.27000257446048E-02, !- Thickness {m} + 0.16009, !- Conductivity {W/m-K} + 800.922646044499, !- Density {kg/m3} + 1087.84000823168; !- Specific Heat {J/kg-K} + +Material, + OSB_5/8in, !- Name + MediumSmooth, !- Roughness + 0.015875032180756, !- Thickness {m} + 0.1163, !- Conductivity {W/m-K} + 544.627399310259, !- Density {kg/m3} + 1213.36000918149; !- Specific Heat {J/kg-K} + +Material, + OSB_7/16in, !- Name + MediumSmooth, !- Roughness + 0.0111125, !- Thickness {m} + 0.1163, !- Conductivity {W/m-K} + 544.627399310259, !- Density {kg/m3} + 1213.36000918149; !- Specific Heat {J/kg-K} + +Material, + Blown_R30, !- Name + MediumRough, !- Roughness + 0.212598430964684, !- Thickness {m} + 0.04119, !- Conductivity {W/m-K} + 9.61107175253399, !- Density {kg/m3} + 836.800006332062; !- Specific Heat {J/kg-K} + +Material, + Blown_R30_top, !- Name + MediumRough, !- Roughness + 0.117348237880148, !- Thickness {m} + 0.04119, !- Conductivity {W/m-K} + 9.61107175253399, !- Density {kg/m3} + 836.800006332062, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + Plywood_3/4in, !- Name + Rough, !- Roughness + 0.01905, !- Thickness {m} + 0.1154577, !- Conductivity {W/m-K} + 544.68, !- Density {kg/m3} + 674.54, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + Batt_R19, !- Name + MediumRough, !- Roughness + 2.54000514892096E-02, !- Thickness {m} + 3.47522010738099E-03, !- Conductivity {W/m-K} + 9.61107175253399, !- Density {kg/m3} + 836.800006332062, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + Lumber_2x4, !- Name + Rough , !- Roughness + 0.0890016, !- Thickness {m} + 0.1154577, !- Conductivity {W/m-K} + 512.64, !- Density {kg/m3} + 767.58, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + Carpet_n_pad, !- Name + MediumSmooth, !- Roughness + 2.54000514892096E-02, !- Thickness {m} + 6.01314018580031E-02, !- Conductivity {W/m-K} + 32.03690584178, !- Density {kg/m3} + 836.800006332062, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + Batt_R13, !- Name + MediumRough, !- Roughness + 0.0889, !- Thickness {m} + 0.03876, !- Conductivity {W/m-K} + 9.61107175253399, !- Density {kg/m3} + 836.800006332062, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + OSB_1/2in, !- Name + MediumSmooth, !- Roughness + 1.27000257446048E-02, !- Thickness {m} + 0.1163, !- Conductivity {W/m-K} + 544.627399310259, !- Density {kg/m3} + 1213.36000918149, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + soil_12in, !- Name + Rough, !- Roughness + 0.3048, !- Thickness {m} + 1.731, !- Conductivity {W/m-K} + 1842.3, !- Density {kg/m3} + 232.6, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + door_const, !- Name + Smooth, !- Roughness + 0.0422695734864227, !- Thickness {m} + 0.0720096, !- Conductivity {W/m-K} + 512.64, !- Density {kg/m3} + 767.58; !- Specific Heat {J/kg-K} + +Material, + Gyp_board_1/2in, !- Name + Rough, !- Roughness + 0.01271016, !- Thickness {m} + 0.1586200, !- Conductivity {W/m-K} + 640, !- Density {kg/m3} + 1129.6, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.4, !- Solar Absorptance + 0.1; !- Visible Absorptance + +Material, + Std Wood 6inch, !- Name + MediumSmooth, !- Roughness + 0.15, !- Thickness {m} + 0.12, !- Conductivity {W/m-K} + 540.0000, !- Density {kg/m3} + 1210, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.7000000, !- Solar Absorptance + 0.7000000; !- Visible Absorptance + +Material, + Pipe Insulation, !- Name + VeryRough, !- Roughness + 0.0127032520325203, !- Thickness {m} + 0.03317175, !- Conductivity {W/m-K} + 91.0, !- Density {kg/m3} + 836.0, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.5, !- Solar Absorptance + 0.5; !- Visible Absorptance + + +!- =========== ALL OBJECTS IN CLASS: MATERIAL:NOMASS =========== + +Material:NoMass, + Manf_wall_airgap, !- Name + Smooth, !- Roughness + 0.12; !- Thermal Resistance {m2-K/W} + +Material:NoMass, + Bldg_paper_felt, !- Name + Smooth, !- Roughness + 1.05666113069662E-02; !- Thermal Resistance {m2-K/W} + +Material:NoMass, + R_high, !- Name + MediumRough, !- Roughness + 177; !- Thermal Resistance {m2-K/W} + + +!- =========== ALL OBJECTS IN CLASS: MATERIAL:AIRGAP =========== + +Material:AirGap, + Air_4_in_vert, !- Name + 0.158499169604493; !- Thermal Resistance {m2-K/W} + +Material:AirGap, + 3/4in_air_space, !- Name + 0.08513; !- Thermal Resistance {m2-K/W} + +Material:AirGap, + 3/4in_Reflective_air_space, !- Name + 0.246554; !- Thermal Resistance {m2-K/W} + + +!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:SIMPLEGLAZINGSYSTEM =========== + +WindowMaterial:SimpleGlazingSystem, + Glass, !- Name + 1.70358, !- U-Factor {W/m2-K} + 0.3344, !- Solar Heat Gain Coefficient + 0.88; !- Visible Transmittance + + +!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:GLAZING =========== + +WindowMaterial:Glazing, + Clear Acrylic Plastic, !- Name + SpectralAverage, !- Optical Data Type + , !- Window Glass Spectral Data Set Name + 0.003, !- Thickness {m} + 0.92, !- Solar Transmittance at Normal Incidence + 0.05, !- Front Side Solar Reflectance at Normal Incidence + 0.05, !- Back Side Solar Reflectance at Normal Incidence + 0.92, !- Visible Transmittance at Normal Incidence + 0.05, !- Front Side Visible Reflectance at Normal Incidence + 0.05, !- Back Side Visible Reflectance at Normal Incidence + 0.00, !- Infrared Transmittance at Normal Incidence + 0.90, !- Front Side Infrared Hemispherical Emissivity + 0.90, !- Back Side Infrared Hemispherical Emissivity + 0.90; !- Conductivity {W/m-K} + +WindowMaterial:Glazing, + Diffusing Acrylic Plastic, !- Name + SpectralAverage, !- Optical Data Type + , !- Window Glass Spectral Data Set Name + 0.0022, !- Thickness {m} + 0.90, !- Solar Transmittance at Normal Incidence + 0.08, !- Front Side Solar Reflectance at Normal Incidence + 0.08, !- Back Side Solar Reflectance at Normal Incidence + 0.90, !- Visible Transmittance at Normal Incidence + 0.08, !- Front Side Visible Reflectance at Normal Incidence + 0.08, !- Back Side Visible Reflectance at Normal Incidence + 0.00, !- Infrared Transmittance at Normal Incidence + 0.90, !- Front Side Infrared Hemispherical Emissivity + 0.90, !- Back Side Infrared Hemispherical Emissivity + 0.90; !- Conductivity {W/m-K} + + +!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:BLIND =========== + +WindowMaterial:Blind, + int_blind, !- Name + Horizontal, !- Slat Orientation + 0.025, !- Slat Width {m} + 0.01875, !- Slat Separation {m} + 0.001, !- Slat Thickness {m} + 45.0, !- Slat Angle {deg} + 221, !- Slat Conductivity {W/m-K} + 0.0, !- Slat Beam Solar Transmittance + 0.5, !- Front Side Slat Beam Solar Reflectance + 0.5, !- Back Side Slat Beam Solar Reflectance + 0.0, !- Slat Diffuse Solar Transmittance + 0.5, !- Front Side Slat Diffuse Solar Reflectance + 0.5, !- Back Side Slat Diffuse Solar Reflectance + 0.0, !- Slat Beam Visible Transmittance + 0.5, !- Front Side Slat Beam Visible Reflectance + 0.5, !- Back Side Slat Beam Visible Reflectance + 0.0, !- Slat Diffuse Visible Transmittance + 0.5, !- Front Side Slat Diffuse Visible Reflectance + 0.5, !- Back Side Slat Diffuse Visible Reflectance + 0.0, !- Slat Infrared Hemispherical Transmittance + 0.9, !- Front Side Slat Infrared Hemispherical Emissivity + 0.9, !- Back Side Slat Infrared Hemispherical Emissivity + 0.050, !- Blind to Glass Distance {m} + 0.5, !- Blind Top Opening Multiplier + 0.5, !- Blind Bottom Opening Multiplier + 0.5, !- Blind Left Side Opening Multiplier + 0.5, !- Blind Right Side Opening Multiplier + , !- Minimum Slat Angle {deg} + ; !- Maximum Slat Angle {deg} + + +!- =========== ALL OBJECTS IN CLASS: CONSTRUCTION =========== + +Construction, + Exterior Wall, !- Name + syn_stucco, !- Outside Layer + sheathing_consol_layer, !- Layer 2 + OSB_7/16in, !- Layer 3 + wall_consol_layer, !- Layer 4 + Drywall_1/2in; !- Layer 5 + +Construction, + InteriorFurnishings, !- Name + Std Wood 6inch; !- Outside Layer + +Construction, + ceiling-floor-layer, !- Name + Lumber_2x4; !- Outside Layer + +Construction, + Exterior Floor, !- Name + floor_consol_layer, !- Outside Layer + Plywood_3/4in, !- Layer 2 + Carpet_n_pad; !- Layer 3 + +Construction, + Interior Floor, !- Name + Plywood_3/4in, !- Outside Layer + Carpet_n_pad; !- Layer 2 + +Construction, + Interior Ceiling, !- Name + ceil_consol_layer, !- Outside Layer + Drywall_1/2in; !- Layer 2 + +Construction, + attic floor, !- Name + Drywall_1/2in, !- Outside Layer + ceil_consol_layer; !- Layer 2 + +Construction, + fndn_roof, !- Name + Carpet_n_pad, !- Outside Layer + Plywood_3/4in, !- Layer 2 + ceil_consol_layer; !- Layer 3 + +Construction, + interiorwall, !- Name + Drywall_1/2in, !- Outside Layer + OSB_5/8in, !- Layer 2 + Drywall_1/2in; !- Layer 3 + +Construction, + Interior Wall, !- Name + Drywall_1/2in, !- Outside Layer + Air_4_in_vert, !- Layer 2 + Drywall_1/2in; !- Layer 3 + +Construction, + Exterior Roof, !- Name + Asphalt_shingle, !- Outside Layer + OSB_1/2in; !- Layer 2 + +Construction, + Exterior Window, !- Name + Glass; !- Outside Layer + +Construction, + Interior Window, !- Name + Glass; !- Outside Layer + +Construction, + Exterior Door, !- Name + door_const; !- Outside Layer + +Construction, + Interior Door, !- Name + door_const; !- Outside Layer + +Construction, + Gable_end, !- Name + cement_stucco, !- Outside Layer + Bldg_paper_felt, !- Layer 2 + OSB_5/8in, !- Layer 3 + Air_4_in_vert, !- Layer 4 + Drywall_1/2in; !- Layer 5 + +Construction, + crawl_floor, !- Name + R_high, !- Outside Layer + soil_12in; !- Layer 2 + +Construction, + window_w_blinds, !- Name + Glass, !- Outside Layer + int_blind; !- Layer 2 + +Construction, + Insulated Pipe, !- Name + Pipe Insulation, !- Outside Layer + CopperPipe; !- Layer 2 + +Construction, + Plain Pipe, !- Name + CopperPipe; !- Outside Layer + +Construction, + TDD Pipe, !- Name + Very High Reflectivity Surface; !- Outside Layer + +Construction, + TDD Dome, !- Name + Clear Acrylic Plastic; !- Outside Layer + +Construction, + TDD Diffuser, !- Name + Diffusing Acrylic Plastic; !- Outside Layer + + +!- =========== ALL OBJECTS IN CLASS: GLOBALGEOMETRYRULES =========== + +GlobalGeometryRules, + LowerLeftCorner, !- Starting Vertex Position + Counterclockwise, !- Vertex Entry Direction + Relative; !- Coordinate System + + +!- =========== ALL OBJECTS IN CLASS: ZONE =========== + +Zone, + living_unit1, !- Name + 0.0, !- Direction of Relative North {deg} + 0.0, 0.0, 0.0, !- X,Y,Z {m} + , !- Type + 1; !- Multiplier + +Zone, + attic_unit1, !- Name + 0.0, !- Direction of Relative North {deg} + 0.0, 0.0, 0.0, !- X,Y,Z {m} + , !- Type + 1; !- Multiplier + + +!- =========== ALL OBJECTS IN CLASS: BUILDINGSURFACE:DETAILED =========== + +BuildingSurface:Detailed, + Inter zone floor 1, !- Name + Floor, !- Surface Type + Interior Floor, !- Construction Name + living_unit1, !- Zone Name + Adiabatic, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0, !- View Factor to Ground + 4, !- Number of Vertices + 0, 0, 2.60156341463415, !- X,Y,Z 1 {m} + 0, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 2 {m} + 12.1330909462833, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 3 {m} + 12.1330909462833, 0, 2.60156341463415; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + ceiling_unit1, !- Name + Ceiling, !- Surface Type + Interior Ceiling, !- Construction Name + living_unit1, !- Zone Name + Zone, !- Outside Boundary Condition + attic_unit1, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0, !- View Factor to Ground + 4, !- Number of Vertices + 0, 0, 5.19302682926829, !- X,Y,Z 1 {m} + 12.1330909462833, 0, 5.19302682926829, + !- X,Y,Z 2 {m} + 12.1330909462833, 9.09981820971244, 5.19302682926829, + !- X,Y,Z 3 {m} + 0, 9.09981820971244, 5.19302682926829; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Roof_front_unit1, !- Name + Roof, !- Surface Type + Exterior Roof, !- Construction Name + attic_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.0, !- View Factor to Ground + 4, !- Number of Vertices + 0, 0, 5.19302682926829, !- X,Y,Z 1 {m} + 12.1330909462833, 0, 5.19302682926829, + !- X,Y,Z 2 {m} + 12.1330909462833, 4.54990910485622, 6.6995631975537, + !- X,Y,Z 3 {m} + 0, 4.54990910485622, 6.6995631975537; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Roof_back_unit1, !- Name + Roof, !- Surface Type + Exterior Roof, !- Construction Name + attic_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.0, !- View Factor to Ground + 4, !- Number of Vertices + 12.1330909462833, 9.09981820971244, 5.19302682926829, + !- X,Y,Z 1 {m} + 0, 9.09981820971244, 5.19302682926829, + !- X,Y,Z 2 {m} + 0, 4.54990910485622, 6.6995631975537, + !- X,Y,Z 3 {m} + 12.1330909462833, 4.54990910485622, 6.6995631975537; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Roof_right_unit1, !- Name + Wall, !- Surface Type + Gable_end, !- Construction Name + attic_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 3, !- Number of Vertices + 12.1330909462833, 0, 5.19302682926829, + !- X,Y,Z 1 {m} + 12.1330909462833, 9.09981820971244, 5.19302682926829, + !- X,Y,Z 2 {m} + 12.1330909462833, 4.54990910485622, 6.6995631975537; + !- X,Y,Z 3 {m} + +BuildingSurface:Detailed, + Roof_left_unit1, !- Name + Wall, !- Surface Type + Gable_end, !- Construction Name + attic_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 3, !- Number of Vertices + 0, 9.09981820971244, 5.19302682926829, + !- X,Y,Z 1 {m} + 0, 0, 5.19302682926829, !- X,Y,Z 2 {m} + 0, 4.54990910485622, 6.6995631975537; + !- X,Y,Z 3 {m} + +BuildingSurface:Detailed, + Wall_ldf_1.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 0, 0, 0.0101, !- X,Y,Z 1 {m} + 12.1330909462833, 0, 0.0101, !- X,Y,Z 2 {m} + 12.1330909462833, 0, 2.60156341463415, + !- X,Y,Z 3 {m} + 0, 0, 2.60156341463415; !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Wall_sdr_1.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 12.1330909462833, 0, 0.0101, !- X,Y,Z 1 {m} + 12.1330909462833, 9.09981820971244, 0.0101, + !- X,Y,Z 2 {m} + 12.1330909462833, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 3 {m} + 12.1330909462833, 0, 2.60156341463415; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Wall_ldb_1.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 12.1330909462833, 9.09981820971244, 0.0101, + !- X,Y,Z 1 {m} + 0, 9.09981820971244, 0.0101, !- X,Y,Z 2 {m} + 0, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 3 {m} + 12.1330909462833, 9.09981820971244, 2.60156341463415; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Wall_sdl_1.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 0, 9.09981820971244, 0.0101, !- X,Y,Z 1 {m} + 0, 0, 0.0101, !- X,Y,Z 2 {m} + 0, 0, 2.60156341463415, !- X,Y,Z 3 {m} + 0, 9.09981820971244, 2.60156341463415; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Wall_ldf_2.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 0, 0, 2.60156341463415, !- X,Y,Z 1 {m} + 12.1330909462833, 0, 2.60156341463415, + !- X,Y,Z 2 {m} + 12.1330909462833, 0, 5.19302682926829, + !- X,Y,Z 3 {m} + 0, 0, 5.19302682926829; !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Wall_sdr_2.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 12.1330909462833, 0, 2.60156341463415, + !- X,Y,Z 1 {m} + 12.1330909462833, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 2 {m} + 12.1330909462833, 9.09981820971244, 5.19302682926829, + !- X,Y,Z 3 {m} + 12.1330909462833, 0, 5.19302682926829; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Wall_ldb_2.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 12.1330909462833, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 1 {m} + 0, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 2 {m} + 0, 9.09981820971244, 5.19302682926829, + !- X,Y,Z 3 {m} + 12.1330909462833, 9.09981820971244, 5.19302682926829; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Wall_sdl_2.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 0, 9.09981820971244, 2.60156341463415, + !- X,Y,Z 1 {m} + 0, 0, 2.60156341463415, !- X,Y,Z 2 {m} + 0, 0, 5.19302682926829, !- X,Y,Z 3 {m} + 0, 9.09981820971244, 5.19302682926829; + !- X,Y,Z 4 {m} + +BuildingSurface:Detailed, + Floor_unit1, !- Name + Floor, !- Surface Type + Interior Floor, !- Construction Name + living_unit1, !- Zone Name + GroundSlabPreprocessorAverage, !- Outside Boundary Condition + surfPropOthSdCoefSlabAverage, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0, !- View Factor to Ground + 4, !- Number of Vertices + 0, 0, 0.0101, !- X,Y,Z 1 {m} + 0, 9.09981820971244, 0.0101, !- X,Y,Z 2 {m} + 12.1330909462833, 9.09981820971244, 0.0101, + !- X,Y,Z 3 {m} + 12.1330909462833, 0, 0.0101; !- X,Y,Z 4 {m} + + +!- =========== ALL OBJECTS IN CLASS: WINDOW =========== + +Window, + Window_ldf_1.unit1, !- Name + Exterior Window, !- Construction Name + Wall_ldf_1.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 1, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + +Window, + Window_ldb_1.unit1, !- Name + Exterior Window, !- Construction Name + Wall_ldb_1.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 2.74190122145512, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + +Window, + Window_sdr_1.unit1, !- Name + Exterior Window, !- Construction Name + Wall_sdr_1.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 1, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + +Window, + Window_sdl_1.unit1, !- Name + Exterior Window, !- Construction Name + Wall_sdl_1.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 1, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + +Window, + Window_ldf_2.unit1, !- Name + Exterior Window, !- Construction Name + Wall_ldf_2.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 1, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + +Window, + Window_ldb_2.unit1, !- Name + Exterior Window, !- Construction Name + Wall_ldb_2.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 2.74190122145512, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + +Window, + Window_sdr_2.unit1, !- Name + Exterior Window, !- Construction Name + Wall_sdr_2.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 1, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + +Window, + Window_sdl_2.unit1, !- Name + Exterior Window, !- Construction Name + Wall_sdl_2.unit1, !- Building Surface Name + , !- Frame and Divider Name + 1, !- Multiplier + 1, !- Starting X Coordinate {m} + 0.914634146341463, !- Starting Z Coordinate {m} + 2.70719591738945, !- Length {m} + 1.52439024390244; !- Height {m} + + +!- =========== ALL OBJECTS IN CLASS: DOOR =========== + +Door, + Door_ldb_unit1, !- Name + Exterior Door, !- Construction Name + Wall_ldb_1.unit1, !- Building Surface Name + 1, !- Multiplier + 0.5, !- Starting X Coordinate {m} + 0, !- Starting Z Coordinate {m} + 1.74190122145513, !- Length {m} + 2.13414634146341; !- Height {m} + + +!- =========== ALL OBJECTS IN CLASS: WINDOWSHADINGCONTROL =========== + +WindowShadingControl, + Shades-living_unit1, !- Name + living_unit1, !- Zone Name + 1, !- Shading Control Sequence Number + InteriorBlind, !- Shading Type + window_w_blinds, !- Construction with Shading Name + OnIfScheduleAllows, !- Shading Control Type + shading_2012iecc, !- Schedule Name + , !- Setpoint {W/m2, W or deg C} + Yes, !- Shading Control Is Scheduled + No, !- Glare Control Is Active + , !- Shading Device Material Name + , !- Type of Slat Angle Control for Blinds + , !- Slat Angle Schedule Name + , !- Setpoint 2 {W/m2 or deg C} + , !- Daylighting Control Object Name + Sequential, !- Multiple Surface Control Type + Window_ldf_1.unit1, !- Fenestration Surface 1 Name + Window_ldb_1.unit1, !- Fenestration Surface 2 Name + Window_sdr_1.unit1, !- Fenestration Surface 3 Name + Window_sdl_1.unit1, !- Fenestration Surface 4 Name + Window_ldf_2.unit1, !- Fenestration Surface 5 Name + Window_ldb_2.unit1, !- Fenestration Surface 6 Name + Window_sdr_2.unit1, !- Fenestration Surface 7 Name + Window_sdl_2.unit1; !- Fenestration Surface 8 Name + + +!- =========== ALL OBJECTS IN CLASS: INTERNALMASS =========== + +InternalMass, + Internalmass_unit1, !- Name + InteriorFurnishings, !- Construction Name + living_unit1, !- Zone or ZoneList Name + 9.89591078066915; !- Surface Area {m2} + + +!- =========== ALL OBJECTS IN CLASS: SHADING:OVERHANG =========== + +Shading:Overhang, + Overhang_sdr_1.unit1, !- Name + Window_sdr_1.unit1, !- Window or Door Name + 0, !- Height above Window or Door {m} + 90, !- Tilt Angle from Window/Door {deg} + 0, !- Left extension from Window/Door Width {m} + 0, !- Right extension from Window/Door Width {m} + 0.0152439024390244; !- Depth {m} + +Shading:Overhang, + Overhang_sdr_2.unit1, !- Name + Window_sdr_2.unit1, !- Window or Door Name + 0, !- Height above Window or Door {m} + 90, !- Tilt Angle from Window/Door {deg} + 0, !- Left extension from Window/Door Width {m} + 0, !- Right extension from Window/Door Width {m} + 0.0152439024390244; !- Depth {m} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:CONTROL =========== + +GroundHeatTransfer:Control, + gtp_control, !- Name + no, !- Run Basement Preprocessor + yes; !- Run Slab Preprocessor + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:MATERIALS =========== + +GroundHeatTransfer:Slab:Materials, + 2, !- NMAT: Number of materials + 0.16, !- ALBEDO: Surface Albedo: No Snow + 0.4, !- ALBEDO: Surface Albedo: Snow + 0.9, !- EPSLW: Surface Emissivity: No Snow + 0.9, !- EPSLW: Surface Emissivity: Snow + 0.75, !- Z0: Surface Roughness: No Snow {cm} + 0.05, !- Z0: Surface Roughness: Snow {cm} + 6, !- HIN: Indoor HConv: Downward Flow {W/m2-K} + 9; !- HIN: Indoor HConv: Upward {W/m2-K} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:MATLPROPS =========== + +GroundHeatTransfer:Slab:MatlProps, + 2300, !- RHO: Slab Material density {kg/m3} + 1200, !- RHO: Soil Density {kg/m3} + 650, !- CP: Slab CP {J/kg-K} + 1200, !- CP: Soil CP {J/kg-K} + 0.9, !- TCON: Slab k {W/m-K} + 1; !- TCON: Soil k {W/m-K} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:BOUNDCONDS =========== + +GroundHeatTransfer:Slab:BoundConds, + FALSE, !- EVTR: Is surface evapotranspiration modeled + TRUE, !- FIXBC: is the lower boundary at a fixed temperature + 10, !- TDEEPin {C} + FALSE; !- USRHflag: Is the ground surface h specified by the user? + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:BLDGPROPS =========== + +GroundHeatTransfer:Slab:BldgProps, + 10, !- IYRS: Number of years to iterate + 0, !- Shape: Slab shape + 4, !- HBLDG: Building height {m} + 22.22, !- TIN1: January Indoor Average Temperature Setpoint {C} + 22.22, !- TIN2: February Indoor Average Temperature Setpoint {C} + 22.22, !- TIN3: March Indoor Average Temperature Setpoint {C} + 22.22, !- TIN4: April Indoor Average Temperature Setpoint {C} + 22.22, !- TIN5: May Indoor Average Temperature Setpoint {C} + 23.88, !- TIN6: June Indoor Average Temperature Setpoint {C} + 23.88, !- TIN7: July Indoor Average Temperature Setpoint {C} + 23.88, !- TIN8: August Indoor Average Temperature Setpoint {C} + 23.88, !- TIN9: September Indoor Average Temperature Setpoint {C} + 22.22, !- TIN10: October Indoor Average Temperature Setpoint {C} + 22.22, !- TIN11: November Indoor Average Temperature Setpoint {C} + 22.22, !- TIN12: December Indoor Average Temperature Setpoint {C} + 0, !- TINAmp: Daily Indoor sine wave variation amplitude {deltaC} + 0.1; !- ConvTol: Convergence Tolerance + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:INSULATION =========== + +GroundHeatTransfer:Slab:Insulation, + 0, !- RINS: R value of under slab insulation {m2-K/W} + 0, !- DINS: Width of strip of under slab insulation {m} + 1.76099742894375, !- RVINS: R value of vertical insulation {m2-K/W} + 0.6, !- ZVINS: Depth of vertical insulation {m} + 1; !- IVINS: Flag: Is there vertical insulation + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:EQUIVALENTSLAB =========== + +GroundHeatTransfer:Slab:EquivalentSlab, + 2.59994805991784, !- APRatio: The area to perimeter ratio for this slab {m} + 0.1, !- SLABDEPTH: Thickness of slab on grade {m} + 15, !- CLEARANCE: Distance from edge of slab to domain edge {m} + 15; !- ZCLEARANCE: Distance from bottom of slab to domain bottom {m} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:SIMPARAMETERS =========== + +GroundHeatTransfer:Basement:SimParameters, + 0.1, !- F: Multiplier for the ADI solution + 15; !- IYRS: Maximum number of yearly iterations: + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:MATLPROPS =========== + +GroundHeatTransfer:Basement:MatlProps, + 6, !- NMAT: Number of materials in this domain + 2243, !- Density for Foundation Wall {kg/m3} + 2243, !- density for Floor Slab {kg/m3} + 311, !- density for Ceiling {kg/m3} + 1500, !- density for Soil {kg/m3} + 2000, !- density for Gravel {kg/m3} + 449, !- density for Wood {kg/m3} + 880, !- Specific heat for foundation wall {J/kg-K} + 880, !- Specific heat for floor slab {J/kg-K} + 1530, !- Specific heat for ceiling {J/kg-K} + 840, !- Specific heat for soil {J/kg-K} + 720, !- Specific heat for gravel {J/kg-K} + 1530, !- Specific heat for wood {J/kg-K} + 1.4, !- Thermal conductivity for foundation wall {W/m-K} + 1.4, !- Thermal conductivity for floor slab {W/m-K} + 0.09, !- Thermal conductivity for ceiling {W/m-K} + 1.1, !- thermal conductivity for soil {W/m-K} + 1.9, !- thermal conductivity for gravel {W/m-K} + 0.12; !- thermal conductivity for wood {W/m-K} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:INSULATION =========== + +GroundHeatTransfer:Basement:Insulation, + 1.76099742894375e-05, !- REXT: R Value of any exterior insulation {m2-K/W} + True; !- INSFULL: Flag: Is the wall fully insulated? + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:SURFACEPROPS =========== + +GroundHeatTransfer:Basement:SurfaceProps, + 0.16, !- ALBEDO: Surface albedo for No snow conditions + 0.4, !- ALBEDO: Surface albedo for snow conditions + 0.94, !- EPSLN: Surface emissivity No Snow + 0.86, !- EPSLN: Surface emissivity with Snow + 6, !- VEGHT: Surface roughness No snow conditions {cm} + 0.25, !- VEGHT: Surface roughness Snow conditions {cm} + False; !- PET: Flag, Potential evapotranspiration on? + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:BLDGDATA =========== + +GroundHeatTransfer:Basement:BldgData, + 0.200000006162114, !- DWALL: Wall thickness {m} + 0.243828108701145, !- DSLAB: Floor slab thickness {m} + 0.3, !- DGRAVXY: Width of gravel pit beside basement wall {m} + 0.2, !- DGRAVZN: Gravel depth extending above the floor slab {m} + 0.1; !- DGRAVZP: Gravel depth below the floor slab {m} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:INTERIOR =========== + +GroundHeatTransfer:Basement:Interior, + True, !- COND: Flag: Is the basement conditioned? + 0.92, !- HIN: Downward convection only heat transfer coefficient {W/m2-K} + 4.04, !- HIN: Upward convection only heat transfer coefficient {W/m2-K} + 3.08, !- HIN: Horizontal convection only heat transfer coefficient {W/m2-K} + 6.13, !- HIN: Downward combined (convection and radiation) heat transfer coefficient {W/m2-K} + 9.26, !- HIN: Upward combined (convection and radiation) heat transfer coefficient {W/m2-K} + 8.29; !- HIN: Horizontal combined (convection and radiation) heat transfer coefficient {W/m2-K} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:COMBLDG =========== + +GroundHeatTransfer:Basement:ComBldg, + 21, !- January average temperature {C} + 21, !- February average temperature {C} + 21, !- March average temperature {C} + 21, !- April average temperature {C} + 24, !- May average temperature {C} + 24, !- June average temperature {C} + 24, !- July average temperature {C} + 24, !- August average temperature {C} + 24, !- September average temperature {C} + 24, !- October average temperature {C} + 21, !- November average temperature {C} + 21, !- December average temperature {C} + 21; !- Daily variation sine wave amplitude {deltaC} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:EQUIVSLAB =========== + +GroundHeatTransfer:Basement:EquivSlab, + 2.59994805991784, !- APRatio: The area to perimeter ratio for this slab {m} + True; !- EquivSizing: Flag + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:EQUIVAUTOGRID =========== + +GroundHeatTransfer:Basement:EquivAutoGrid, + 15, !- CLEARANCE: Distance from outside of wall to edge of 3-D ground domain {m} + 0.1, !- SlabDepth: Thickness of the floor slab {m} + 1.21914054350572; !- BaseDepth: Depth of the basement wall below grade {m} + + +!- =========== ALL OBJECTS IN CLASS: PEOPLE =========== + +People, + people_unit1, !- Name + living_unit1, !- Zone or ZoneList Name + Occupancy, !- Number of People Schedule Name + People, !- Number of People Calculation Method + 3, !- Number of People + , !- People per Zone Floor Area {person/m2} + , !- Zone Floor Area per Person {m2/person} + 0, !- Fraction Radiant + autocalculate, !- Sensible Heat Fraction + activity_sch, !- Activity Level Schedule Name + , !- Carbon Dioxide Generation Rate {m3/s-W} + No, !- Enable ASHRAE 55 Comfort Warnings + ZoneAveraged; !- Mean Radiant Temperature Calculation Type + + +!- =========== ALL OBJECTS IN CLASS: LIGHTS =========== + +Lights, + Living Hardwired Lighting1, !- Name + living_unit1, !- Zone or ZoneList Name + InteriorLightingHE, !- Schedule Name + Watts/Area, !- Design Level Calculation Method + , !- Lighting Level {W} + 1.05216214401829, !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0, !- Return Air Fraction + 0.6, !- Fraction Radiant + 0.2, !- Fraction Visible + 0; !- Fraction Replaceable + +Lights, + Living Plug-in Lighting1,!- Name + living_unit1, !- Zone or ZoneList Name + InteriorLightingHE, !- Schedule Name + Watts/Area, !- Design Level Calculation Method + , !- Lighting Level {W} + 0.478467682251396, !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0, !- Return Air Fraction + 0.6, !- Fraction Radiant + 0.2, !- Fraction Visible + 0; !- Fraction Replaceable + + +!- =========== ALL OBJECTS IN CLASS: ELECTRICEQUIPMENT =========== + +ElectricEquipment, + dishwasher1, !- Name + living_unit1, !- Zone or ZoneList Name + DishWasher, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 65.698787492023, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.15, !- Fraction Latent + 0.6, !- Fraction Radiant + 0.25, !- Fraction Lost + dishwasher; !- End-Use Subcategory + +ElectricEquipment, + refrigerator1, !- Name + living_unit1, !- Zone or ZoneList Name + Refrigerator, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 91.0575745202123, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0, !- Fraction Latent + 1, !- Fraction Radiant + 0, !- Fraction Lost + refrigerator; !- End-Use Subcategory + +ElectricEquipment, + clotheswasher1, !- Name + living_unit1, !- Zone or ZoneList Name + ClothesWasher, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 28.4784377542718, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0, !- Fraction Latent + 0.8, !- Fraction Radiant + 0.2, !- Fraction Lost + clotheswasher; !- End-Use Subcategory + +ElectricEquipment, + electric_dryer1, !- Name + living_unit1, !- Zone or ZoneList Name + ClothesDryer, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 213.064557285022, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.05, !- Fraction Latent + 0.15, !- Fraction Radiant + 0.8, !- Fraction Lost + electric_dryer; !- End-Use Subcategory + +ElectricEquipment, + electric_range1, !- Name + living_unit1, !- Zone or ZoneList Name + CookingRange, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 248.154224774405, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.3, !- Fraction Latent + 0.4, !- Fraction Radiant + 0.3, !- Fraction Lost + electric_range; !- End-Use Subcategory + +ElectricEquipment, + television1, !- Name + living_unit1, !- Zone or ZoneList Name + InteriorLighting, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 0, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0, !- Fraction Latent + 1, !- Fraction Radiant + 0, !- Fraction Lost + television; !- End-Use Subcategory + +ElectricEquipment, + electric_mels1, !- Name + living_unit1, !- Zone or ZoneList Name + MiscPlugLoad, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 567.464237516869, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.06, !- Fraction Latent + 0.69, !- Fraction Radiant + 0.25, !- Fraction Lost + electric_mels; !- End-Use Subcategory + +ElectricEquipment, + IECC_Adj1, !- Name + living_unit1, !- Zone or ZoneList Name + MiscPlugLoad, !- Schedule Name + Watts/Area, !- Design Level Calculation Method + , !- Design Level {W} + 1.54356736989469, !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0624390461422629, !- Fraction Latent + 0.41190936353998, !- Fraction Radiant + 0.251045347957769, !- Fraction Lost + IECC_adj; !- End-Use Subcategory + + +!- =========== ALL OBJECTS IN CLASS: ZONEVENTILATION:DESIGNFLOWRATE =========== + +ZoneVentilation:DesignFlowRate, + Ventilation_unit1, !- Name + living_unit1, !- Zone or ZoneList Name + always_avail, !- Schedule Name + Flow/Zone, !- Design Flow Rate Calculation Method + 0, !- Design Flow Rate {m3/s} + , !- Flow Rate per Zone Floor Area {m3/s-m2} + , !- Flow Rate per Person {m3/s-person} + , !- Air Changes per Hour {1/hr} + Exhaust, !- Ventilation Type + 0, !- Fan Pressure Rise {Pa} + 0.6, !- Fan Total Efficiency + 1, !- Constant Term Coefficient + 0, !- Temperature Term Coefficient + 0, !- Velocity Term Coefficient + 0, !- Velocity Squared Term Coefficient + -100, !- Minimum Indoor Temperature {C} + , !- Minimum Indoor Temperature Schedule Name + 100, !- Maximum Indoor Temperature {C} + , !- Maximum Indoor Temperature Schedule Name + -100, !- Delta Temperature {deltaC} + , !- Delta Temperature Schedule Name + -100, !- Minimum Outdoor Temperature {C} + , !- Minimum Outdoor Temperature Schedule Name + 100, !- Maximum Outdoor Temperature {C} + , !- Maximum Outdoor Temperature Schedule Name + 40; !- Maximum Wind Speed {m/s} + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:SIMULATIONCONTROL =========== + +AirflowNetwork:SimulationControl, + House AirflowNetwork, !- Name + MultizoneWithDistribution, !- AirflowNetwork Control + SurfaceAverageCalculation, !- Wind Pressure Coefficient Type + , !- Height Selection for Local Wind Pressure Calculation + LOWRISE, !- Building Type + 500, !- Maximum Number of Iterations {dimensionless} + , !- Initialization Type + 0.001, !- Relative Airflow Convergence Tolerance {dimensionless} + 0.00001, !- Absolute Airflow Convergence Tolerance {kg/s} + 0, !- Convergence Acceleration Limit {dimensionless} + 0, !- Azimuth Angle of Long Axis of Building {deg} + 0.75, !- Ratio of Building Width Along Short Axis to Width Along Long Axis + , + , + Yes; + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:MULTIZONE:ZONE =========== + +AirflowNetwork:MultiZone:Zone, + living_unit1, !- Zone Name + NoVent, !- Ventilation Control Mode + , !- Ventilation Control Zone Temperature Setpoint Schedule Name + 0, !- Minimum Venting Open Factor {dimensionless} + 0.0, !- Indoor and Outdoor Temperature Difference Lower Limit For Maximum Venting Open Factor {deltaC} + 100.0, !- Indoor and Outdoor Temperature Difference Upper Limit for Minimum Venting Open Factor {deltaC} + 0.0, !- Indoor and Outdoor Enthalpy Difference Lower Limit For Maximum Venting Open Factor {deltaJ/kg} + 300000.0; !- Indoor and Outdoor Enthalpy Difference Upper Limit for Minimum Venting Open Factor {deltaJ/kg} + +AirflowNetwork:MultiZone:Zone, + attic_unit1, !- Zone Name + Constant, !- Ventilation Control Mode + , !- Ventilation Control Zone Temperature Setpoint Schedule Name + , !- Minimum Venting Open Factor {dimensionless} + , !- Indoor and Outdoor Temperature Difference Lower Limit For Maximum Venting Open Factor {deltaC} + 100, !- Indoor and Outdoor Temperature Difference Upper Limit for Minimum Venting Open Factor {deltaC} + , !- Indoor and Outdoor Enthalpy Difference Lower Limit For Maximum Venting Open Factor {deltaJ/kg} + 300000, !- Indoor and Outdoor Enthalpy Difference Upper Limit for Minimum Venting Open Factor {deltaJ/kg} + inf_sch; !- Venting Availability Schedule Name + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:MULTIZONE:SURFACE =========== + +AirflowNetwork:MultiZone:Surface, + Roof_front_unit1, !- Surface Name + AtticVent, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + Constant, !- Ventilation Control Mode + , !- Ventilation Control Zone Temperature Setpoint Schedule Name + 0, !- Minimum Venting Open Factor {dimensionless} + , !- Indoor and Outdoor Temperature Difference Lower Limit For Maximum Venting Open Factor {deltaC} + 100, !- Indoor and Outdoor Temperature Difference Upper Limit for Minimum Venting Open Factor {deltaC} + , !- Indoor and Outdoor Enthalpy Difference Lower Limit For Maximum Venting Open Factor {deltaJ/kg} + 300000, !- Indoor and Outdoor Enthalpy Difference Upper Limit for Minimum Venting Open Factor {deltaJ/kg} + inf_sch; !- Venting Availability Schedule Name + +AirflowNetwork:MultiZone:Surface, + Roof_back_unit1, !- Surface Name + AtticVent, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + Constant, !- Ventilation Control Mode + , !- Ventilation Control Zone Temperature Setpoint Schedule Name + , !- Minimum Venting Open Factor {dimensionless} + , !- Indoor and Outdoor Temperature Difference Lower Limit For Maximum Venting Open Factor {deltaC} + 100, !- Indoor and Outdoor Temperature Difference Upper Limit for Minimum Venting Open Factor {deltaC} + , !- Indoor and Outdoor Enthalpy Difference Lower Limit For Maximum Venting Open Factor {deltaJ/kg} + 300000, !- Indoor and Outdoor Enthalpy Difference Upper Limit for Minimum Venting Open Factor {deltaJ/kg} + inf_sch; !- Venting Availability Schedule Name + +AirflowNetwork:MultiZone:Surface, + Roof_right_unit1, !- Surface Name + AtticVent, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + Constant, !- Ventilation Control Mode + , !- Ventilation Control Zone Temperature Setpoint Schedule Name + , !- Minimum Venting Open Factor {dimensionless} + , !- Indoor and Outdoor Temperature Difference Lower Limit For Maximum Venting Open Factor {deltaC} + 100, !- Indoor and Outdoor Temperature Difference Upper Limit for Minimum Venting Open Factor {deltaC} + , !- Indoor and Outdoor Enthalpy Difference Lower Limit For Maximum Venting Open Factor {deltaJ/kg} + 300000, !- Indoor and Outdoor Enthalpy Difference Upper Limit for Minimum Venting Open Factor {deltaJ/kg} + inf_sch; !- Venting Availability Schedule Name + +AirflowNetwork:MultiZone:Surface, + Roof_left_unit1, !- Surface Name + AtticVent, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + Constant, !- Ventilation Control Mode + , !- Ventilation Control Zone Temperature Setpoint Schedule Name + , !- Minimum Venting Open Factor {dimensionless} + , !- Indoor and Outdoor Temperature Difference Lower Limit For Maximum Venting Open Factor {deltaC} + 100, !- Indoor and Outdoor Temperature Difference Upper Limit for Minimum Venting Open Factor {deltaC} + , !- Indoor and Outdoor Enthalpy Difference Lower Limit For Maximum Venting Open Factor {deltaJ/kg} + 300000, !- Indoor and Outdoor Enthalpy Difference Upper Limit for Minimum Venting Open Factor {deltaJ/kg} + inf_sch; !- Venting Availability Schedule Name + +AirflowNetwork:MultiZone:Surface, + ceiling_unit1, !- Surface Name + ZoneLeak_Ceiling, !- Leakage Component Name + , !- External Node Name + 1.0, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_ldf_1.unit1, !- Surface Name + ZoneLeak_LongWall, !- Leakage Component Name + , !- External Node Name + 1.0, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_ldb_1.unit1, !- Surface Name + ZoneLeak_LongWall, !- Leakage Component Name + , !- External Node Name + 1.0, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_sdl_1.unit1, !- Surface Name + ZoneLeak_ShortWall, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_sdr_1.unit1, !- Surface Name + ZoneLeak_ShortWall, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_ldf_2.unit1, !- Surface Name + ZoneLeak_LongWall, !- Leakage Component Name + , !- External Node Name + 1.0, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_ldb_2.unit1, !- Surface Name + ZoneLeak_LongWall, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_sdr_2.unit1, !- Surface Name + ZoneLeak_ShortWall, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_sdl_2.unit1, !- Surface Name + ZoneLeak_ShortWall, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + NoVent; !- Ventilation Control Mode + +AirflowNetwork:MultiZone:Surface, + Wall_sdr_2.unit1, !- Surface Name + Zone Exhaust Fan_unit1, !- Leakage Component Name + , !- External Node Name + 1, !- Window/Door Opening Factor, or Crack Factor {dimensionless} + Constant; !- Ventilation Control Mode + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:MULTIZONE:SURFACE:EFFECTIVELEAKAGEAREA =========== + +AirflowNetwork:MultiZone:Surface:EffectiveLeakageArea, + ZoneLeak_LongWall, !- Name + 0.00340012477060435, !- Effective Leakage Area {m2} + 1.15, !- Discharge Coefficient {dimensionless} + 4, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + +AirflowNetwork:MultiZone:Surface:EffectiveLeakageArea, + ZoneLeak_ShortWall, !- Name + 0.00255009357795326, !- Effective Leakage Area {m2} + 1.15, !- Discharge Coefficient {dimensionless} + 4, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + +AirflowNetwork:MultiZone:Surface:EffectiveLeakageArea, + ZoneLeak_Ceiling, !- Name + 0.011939399618037, !- Effective Leakage Area {m2} + 1.15, !- Discharge Coefficient {dimensionless} + 4, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + +AirflowNetwork:MultiZone:Surface:EffectiveLeakageArea, + ZoneLeak_Floor, !- Name + 0.00001, !- Effective Leakage Area {m2} + 1.15, !- Discharge Coefficient {dimensionless} + 4, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + +AirflowNetwork:MultiZone:Surface:EffectiveLeakageArea, + AtticVent, !- Name + 0.37, !- Effective Leakage Area {m2} + 1.15, !- Discharge Coefficient {dimensionless} + 4, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + +AirflowNetwork:MultiZone:Surface:EffectiveLeakageArea, + CrawlVent, !- Name + 0.37, !- Effective Leakage Area {m2} + 1.15, !- Discharge Coefficient {dimensionless} + 4, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:MULTIZONE:COMPONENT:ZONEEXHAUSTFAN =========== + +AirflowNetwork:MultiZone:Component:ZoneExhaustFan, + Zone Exhaust Fan_unit1, !- Name + 0.01, !- Air Mass Flow Coefficient When the Zone Exhaust Fan is Off at Reference Conditions {kg/s} + 0.667; !- Air Mass Flow Exponent When the Zone Exhaust Fan is Off {dimensionless} + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:DISTRIBUTION:NODE =========== + +AirflowNetwork:Distribution:Node, + EquipmentInletNode_unit1,!- Name + Zone Equipment Inlet Node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + SplitterNode_unit1, !- Name + , !- Component Name or Node Name + AirLoopHVAC:ZoneSplitter,!- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + ZoneSupplyNode_unit1, !- Name + , !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + ZoneSupplyRegisterNode_unit1 ATInlet, !- Name + Zone Inlet Node_unit1 ATInlet, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + ZoneSupplyRegisterNode_unit1, !- Name + Zone Inlet Node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + ZoneOutletNode_unit1, !- Name + Zone Outlet node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + ZoneReturnNode_unit1, !- Name + , !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + MixerNode_unit1, !- Name + , !- Component Name or Node Name + AirLoopHVAC:ZoneMixer, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + MainReturnNode_unit1, !- Name + Return Air Mixer Outlet_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + MainInletNode_unit1, !- Name + Air Loop Inlet Node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + FanOutletNode_unit1, !- Name + Cooling Coil Air Inlet Node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + HeatingInletNode_unit1, !- Name + Heating Coil Air Inlet Node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + HeatingOutletNode_unit1, !- Name + Air Loop Outlet Node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + +AirflowNetwork:Distribution:Node, + SuppHeatingInletNode_unit1, !- Name + Supp Heating coil air inlet Node_unit1, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:DISTRIBUTION:COMPONENT:LEAKAGERATIO =========== + +AirflowNetwork:Distribution:Component:LeakageRatio, + SupplyLeak, !- Name + 0.0396, !- Effective Leakage Ratio {dimensionless} + 0.56034, !- Maximum Flow Rate {m3/s} + 25, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + +AirflowNetwork:Distribution:Component:LeakageRatio, + ReturnLeak, !- Name + 0.0396, !- Effective Leakage Ratio {dimensionless} + 0.56034, !- Maximum Flow Rate {m3/s} + 25, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:DISTRIBUTION:COMPONENT:DUCT =========== + +AirflowNetwork:Distribution:Component:Duct, + MainTrunk_unit1, !- Name + 2.0, !- Duct Length {m} + 0.591921113608382, !- Hydraulic Diameter {m} + 0.275216110019646, !- Cross Section Area {m2} + 0.0009, !- Surface Roughness {m} + 0.01, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + +AirflowNetwork:Distribution:Component:Duct, + ZoneSupply_unit1, !- Name + 15, !- Duct Length {m} + 0.591921113608382, !- Hydraulic Diameter {m} + 0.275216110019646, !- Cross Section Area {m2} + 0.0009, !- Surface Roughness {m} + 10, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + +AirflowNetwork:Distribution:Component:Duct, + ZoneSupplyLink2_unit1 ATInlet Duct, !- Name + 0.0001, !- Duct Length {m} + 0.591921113608382, !- Hydraulic Diameter {m} + 0.275216110019646, !- Cross Section Area {m2} + 0.0009, !- Surface Roughness {m} + 0, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + +AirflowNetwork:Distribution:Component:Duct, + ZoneReturn_unit1, !- Name + 8.0, !- Duct Length {m} + 0.529430338938287, !- Hydraulic Diameter {m} + 0.220172888015717, !- Cross Section Area {m2} + 0.0009, !- Surface Roughness {m} + 9, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + +AirflowNetwork:Distribution:Component:Duct, + ZoneConnectionDuct_unit1,!- Name + 0.1, !- Duct Length {m} + 0.591921113608382, !- Hydraulic Diameter {m} + 0.275216110019646, !- Cross Section Area {m2} + 0.0001, !- Surface Roughness {m} + 0.00, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + +AirflowNetwork:Distribution:Component:Duct, + MainReturn_unit1, !- Name + 1.0, !- Duct Length {m} + 0.529430338938287, !- Hydraulic Diameter {m} + 0.220172888015717, !- Cross Section Area {m2} + 0.0009, !- Surface Roughness {m} + 0.01, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + +AirflowNetwork:Distribution:Component:Duct, + AirLoopReturn_unit1, !- Name + 0.1, !- Duct Length {m} + 0.529430338938287, !- Hydraulic Diameter {m} + 0.220172888015717, !- Cross Section Area {m2} + 0.0001, !- Surface Roughness {m} + 0.00, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + +AirflowNetwork:Distribution:Component:Duct, + AirLoopSupply_unit1, !- Name + 0.1, !- Duct Length {m} + 0.591921113608382, !- Hydraulic Diameter {m} + 0.275216110019646, !- Cross Section Area {m2} + 0.0001, !- Surface Roughness {m} + 0.00, !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + 0.709825, !- Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction {W/m2-K} + 0.0000001; !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:DISTRIBUTION:COMPONENT:FAN =========== + +AirflowNetwork:Distribution:Component:Fan, + Supply Fan_unit1, !- Fan Name + Fan:OnOff; !- Supply Fan Object Type + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:DISTRIBUTION:COMPONENT:COIL =========== + +AirflowNetwork:Distribution:Component:Coil, + DX Cooling Coil_unit1, !- Coil Name + Coil:Cooling:DX:SingleSpeed, !- Coil Object Type + 0.1, !- Air Path Length {m} + 1.000; !- Air Path Hydraulic Diameter {m} + +AirflowNetwork:Distribution:Component:Coil, + Main DX Heating Coil_unit1, !- Coil Name + Coil:Heating:DX:Singlespeed, !- Coil Object Type + 0.1, !- Air Path Length {m} + 1.000; !- Air Path Hydraulic Diameter {m} + +AirflowNetwork:Distribution:Component:Coil, + Supp Heating Coil_unit1, !- Coil Name + Coil:Heating:Electric, !- Coil Object Type + 0.1, !- Air Path Length {m} + 1.000; !- Air Path Hydraulic Diameter {m} + + +!- =========== ALL OBJECTS IN CLASS: AIRFLOWNETWORK:DISTRIBUTION:LINKAGE =========== + +AirflowNetwork:Distribution:Linkage, + MainSupplyLink_unit1, !- Name + EquipmentInletNode_unit1,!- Node 1 Name + SplitterNode_unit1, !- Node 2 Name + MainTrunk_unit1, !- Component Name + attic_unit1; !- Thermal Zone Name + +AirflowNetwork:Distribution:Linkage, + ZoneSupplyLink_unit1, !- Name + SplitterNode_unit1, !- Node 1 Name + ZoneSupplyNode_unit1, !- Node 2 Name + ZoneSupply_unit1, !- Component Name + attic_unit1; !- Thermal Zone Name + +AirflowNetwork:Distribution:Linkage, + ZoneSupplyLink2_unit1 ATInlet, !- Name + ZoneSupplyRegisterNode_unit1 ATInlet, !- Node 1 Name + ZoneSupplyRegisterNode_unit1, !- Node 2 Name + ZoneSupplyLink2_unit1 ATInlet Duct, !- Component Name + attic_unit1; !- Thermal Zone Name + +AirflowNetwork:Distribution:Linkage, + ZoneSupplyLink2_unit1, !- Name + ZoneSupplyNode_unit1, !- Node 1 Name + ZoneSupplyRegisterNode_unit1 ATInlet, !- Node 2 Name + ZoneSupply_unit1, !- Component Name + attic_unit1; !- Thermal Zone Name + +AirflowNetwork:Distribution:Linkage, + ZoneSupplyConnectionLink_unit1, !- Name + ZoneSupplyRegisterNode_unit1, !- Node 1 Name + living_unit1, !- Node 2 Name + ZoneConnectionDuct_unit1;!- Component Name + +AirflowNetwork:Distribution:Linkage, + ZoneReturnConnectionLink_unit1, !- Name + living_unit1, !- Node 1 Name + ZoneOutletNode_unit1, !- Node 2 Name + ZoneConnectionDuct_unit1;!- Component Name + +AirflowNetwork:Distribution:Linkage, + ZoneReturnLink1_unit1, !- Name + Zoneoutletnode_unit1, !- Node 1 Name + ZoneReturnNode_unit1, !- Node 2 Name + ZoneReturn_unit1, !- Component Name + attic_unit1; !- Thermal Zone Name + +AirflowNetwork:Distribution:Linkage, + ZoneReturnLink2_unit1, !- Name + ZoneReturnNode_unit1, !- Node 1 Name + MixerNode_unit1, !- Node 2 Name + ZoneReturn_unit1, !- Component Name + attic_unit1; !- Thermal Zone Name + +AirflowNetwork:Distribution:Linkage, + MainReturnLink_unit1, !- Name + MixerNode_unit1, !- Node 1 Name + MainReturnNode_unit1, !- Node 2 Name + MainReturn_unit1, !- Component Name + attic_unit1; !- Thermal Zone Name + +AirflowNetwork:Distribution:Linkage, + SystemReturnLink_unit1, !- Name + MainReturnNode_unit1, !- Node 1 Name + MainInletNode_unit1, !- Node 2 Name + AirLoopReturn_unit1; !- Component Name + +AirflowNetwork:Distribution:Linkage, + SupplyFanLink_unit1, !- Name + MainInletNode_unit1, !- Node 1 Name + FanOutletNode_unit1, !- Node 2 Name + Supply Fan_unit1; !- Component Name + +AirflowNetwork:Distribution:Linkage, + CoolingCoilLink_unit1, !- Name + FanOutletNode_unit1, !- Node 1 Name + HeatingInletNode_unit1, !- Node 2 Name + DX Cooling Coil_unit1; !- Component Name + +AirflowNetwork:Distribution:Linkage, + EquipmentAirLoopLink_unit1, !- Name + HeatingOutletNode_unit1, !- Node 1 Name + EquipmentInletNode_unit1,!- Node 2 Name + AirLoopSupply_unit1; !- Component Name + +AirflowNetwork:Distribution:Linkage, + HeatingCoilLink_unit1, !- Name + HeatingInletNode_unit1, !- Node 1 Name + SuppHeatingInletNode_unit1, !- Node 2 Name + Main DX Heating Coil_unit1; !- Component Name + +AirflowNetwork:Distribution:Linkage, + SuppHeatingCoilLink_unit1, !- Name + SuppHeatingInletNode_unit1, !- Node 1 Name + HeatingOutletNode_unit1, !- Node 2 Name + Supp Heating Coil_unit1; !- Component Name + +AirflowNetwork:Distribution:Linkage, + ZoneSupplyLeakLink_unit1,!- Name + ZoneSupplyNode_unit1, !- Node 1 Name + attic_unit1, !- Node 2 Name + SupplyLeak; !- Component Name + +AirflowNetwork:Distribution:Linkage, + ZoneReturnLeakLink_unit1,!- Name + attic_unit1, !- Node 1 Name + ZoneReturnNode_unit1, !- Node 2 Name + ReturnLeak; !- Component Name + + +!- =========== ALL OBJECTS IN CLASS: EXTERIOR:LIGHTS =========== + +Exterior:Lights, + Exterior-Lights_unit1, !- Name + ExteriorLighting, !- Schedule Name + 43.2424607481559, !- Design Level {W} + , !- Control Option + Exterior-Lights; !- End-Use Subcategory + +Exterior:Lights, + Garage-Lights_unit1, !- Name + InteriorLightingHE, !- Schedule Name + 7.16294617434682, !- Design Level {W} + , !- Control Option + Garage-Lights; !- End-Use Subcategory + + +!- =========== ALL OBJECTS IN CLASS: DESIGNSPECIFICATION:OUTDOORAIR =========== + +DesignSpecification:OutdoorAir, + SZ_DSOA_living_unit1, !- Name + Flow/Zone, !- Outdoor Air Method + 0, !- Outdoor Air Flow per Person {m3/s-person} + , !- Outdoor Air Flow per Zone Floor Area {m3/s-m2} + 0.0283168464628752; !- Outdoor Air Flow per Zone {m3/s} + + +!- =========== ALL OBJECTS IN CLASS: SIZING:ZONE =========== + +Sizing:Zone, + living_unit1, !- Zone or ZoneList Name + SupplyAirTemperature, !- Zone Cooling Design Supply Air Temperature Input Method + 12, !- Zone Cooling Design Supply Air Temperature {C} + , !- Zone Cooling Design Supply Air Temperature Difference {deltaC} + SupplyAirTemperature, !- Zone Heating Design Supply Air Temperature Input Method + 50, !- Zone Heating Design Supply Air Temperature {C} + , !- Zone Heating Design Supply Air Temperature Difference {deltaC} + 0.008, !- Zone Cooling Design Supply Air Humidity Ratio {kgWater/kgDryAir} + 0.008, !- Zone Heating Design Supply Air Humidity Ratio {kgWater/kgDryAir} + SZ_DSOA_living_unit1, !- Design Specification Outdoor Air Object Name + , !- Zone Heating Sizing Factor + , !- Zone Cooling Sizing Factor + DesignDay, !- Cooling Design Air Flow Method + , !- Cooling Design Air Flow Rate {m3/s} + 0.000762, !- Cooling Minimum Air Flow per Zone Floor Area {m3/s-m2} + , !- Cooling Minimum Air Flow {m3/s} + , !- Cooling Minimum Air Flow Fraction + DesignDay, !- Heating Design Air Flow Method + , !- Heating Design Air Flow Rate {m3/s} + 0.002032, !- Heating Maximum Air Flow per Zone Floor Area {m3/s-m2} + 0.1415762, !- Heating Maximum Air Flow {m3/s} + 0.3, !- Heating Maximum Air Flow Fraction + , !- Design Specification Zone Air Distribution Object Name + , !- Account for Dedicated Outdoor Air System + , !- Dedicated Outdoor Air System Control Strategy + , !- Dedicated Outdoor Air Low Setpoint Temperature for Design {C} + ; !- Dedicated Outdoor Air High Setpoint Temperature for Design {C} + + +!- =========== ALL OBJECTS IN CLASS: SIZING:SYSTEM =========== + +Sizing:System, + Central System_unit1, !- AirLoop Name + Sensible, !- Type of Load to Size On + autosize, !- Design Outdoor Air Flow Rate {m3/s} + 1, !- Central Heating Maximum System Air Flow Ratio + 7, !- Preheat Design Temperature {C} + 0.008, !- Preheat Design Humidity Ratio {kgWater/kgDryAir} + 11, !- Precool Design Temperature {C} + 0.008, !- Precool Design Humidity Ratio {kgWater/kgDryAir} + 12, !- Central Cooling Design Supply Air Temperature {C} + 50, !- 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 + , !- Cooling Supply Air Flow Rate {m3/s} + , !- Cooling Supply Air Flow Rate Per Floor Area {m3/s-m2} + , !- Cooling Fraction of Autosized Cooling Supply Air Flow Rate + , !- Cooling Supply Air Flow Rate Per Unit Cooling Capacity {m3/s-W} + DesignDay, !- Heating Supply Air Flow Rate Method + , !- Heating Supply Air Flow Rate {m3/s} + , !- Heating Supply Air Flow Rate Per Floor Area {m3/s-m2} + , !- Heating Fraction of Autosized Heating Supply Air Flow Rate + , !- Heating Fraction of Autosized Cooling Supply Air Flow Rate + , !- Heating Supply Air Flow Rate Per Unit Heating Capacity {m3/s-W} + , !- System Outdoor Air Method + 1.0, !- Zone Maximum Outdoor Air Fraction {dimensionless} + CoolingDesignCapacity, !- Cooling Design Capacity Method + autosize, !- Cooling Design Capacity {W} + , !- Cooling Design Capacity Per Floor Area {W/m2} + , !- Fraction of Autosized Cooling Design Capacity + HeatingDesignCapacity, !- Heating Design Capacity Method + autosize, !- Heating Design Capacity {W} + , !- Heating Design Capacity Per Floor Area {W/m2} + , !- Fraction of Autosized Heating Design Capacity + OnOff; !- Central Cooling Capacity Control Method + + +!- =========== ALL OBJECTS IN CLASS: SIZING:PLANT =========== + +Sizing:Plant, + DHW Loop_unit1, !- Plant or Condenser Loop Name + Heating, !- Loop Type + 48.8888888888889, !- Design Loop Exit Temperature {C} + 5.55555555555556; !- Loop Design Temperature Difference {deltaC} + + +!- =========== ALL OBJECTS IN CLASS: ZONECONTROL:THERMOSTAT =========== + +ZoneControl:Thermostat, + Zone Thermostat_unit1, !- Name + living_unit1, !- Zone or ZoneList Name + zone_control_type, !- Control Type Schedule Name + ThermostatSetpoint:DualSetpoint, !- Control 1 Object Type + thermostat_living Dual SP Control; !- Control 1 Name + + +!- =========== ALL OBJECTS IN CLASS: THERMOSTATSETPOINT:DUALSETPOINT =========== + +ThermostatSetpoint:DualSetpoint, + thermostat_living Dual SP Control, !- Name + heating_sch, !- Heating Setpoint Temperature Schedule Name + cooling_sch; !- Cooling Setpoint Temperature Schedule Name + + +!- =========== ALL OBJECTS IN CLASS: ZONEHVAC:DEHUMIDIFIER:DX =========== + +ZoneHVAC:Dehumidifier:DX, + North Zone Dehumidifier, !- Name + always_avail, !- Availability Schedule Name + Zone3DehumidifierInlet, !- Air Inlet Node Name + Dehumidifier Outlet Node,!- Air Outlet Node Name + 50.16, !- Rated Water Removal {L/day} + 3.412, !- Rated Energy Factor {L/kWh} + 0.12036, !- Rated Air Flow Rate {m3/s} + ZoneDehumidWaterRemoval, !- Water Removal Curve Name + ZoneDehumidEnergyFactor, !- Energy Factor Curve Name + ZoneDehumidPLFFPLR, !- Part Load Fraction Correlation Curve Name + 10.0, !- Minimum Dry-Bulb Temperature for Dehumidifier Operation {C} + 32.0, !- Maximum Dry-Bulb Temperature for Dehumidifier Operation {C} + 0.0; !- Off-Cycle Parasitic Electric Load {W} + + +!- =========== ALL OBJECTS IN CLASS: ZONEHVAC:ENERGYRECOVERYVENTILATOR =========== + +ZoneHVAC:EnergyRecoveryVentilator, + ERV_unit1, !- Name + always_avail, !- Availability Schedule Name + OA_Heat_Recovery_Unit1, !- Heat Exchanger Name + 0.0283168464628752, !- Supply Air Flow Rate {m3/s} + 0.0283168464628752, !- Exhaust Air Flow Rate {m3/s} + OASupplyFan_unit1, !- Supply Air Fan Name + OAExhaustFan_unit1; !- Exhaust Air Fan Name + + +!- =========== ALL OBJECTS IN CLASS: AIRTERMINAL:SINGLEDUCT:CONSTANTVOLUME:NOREHEAT =========== + +AirTerminal:SingleDuct:ConstantVolume:NoReheat, + ZoneDirectAir_unit1, !- Name + always_avail, !- Availability Schedule Name + Zone Inlet Node_unit1 ATInlet, !- Air Inlet Node Name + Zone Inlet Node_unit1, !- Air Outlet Node Name + autosize; !- Maximum Air Flow Rate {m3/s} + + +!- =========== ALL OBJECTS IN CLASS: ZONEHVAC:AIRDISTRIBUTIONUNIT =========== + +ZoneHVAC:AirDistributionUnit, + ZoneDirectAir_unit1 ADU, !- Name + Zone Inlet Node_unit1, !- Air Distribution Unit Outlet Node Name + AirTerminal:SingleDuct:ConstantVolume:NoReheat, !- Air Terminal Object Type + ZoneDirectAir_unit1; !- Air Terminal Name + + +!- =========== ALL OBJECTS IN CLASS: ZONEHVAC:EQUIPMENTLIST =========== + +ZoneHVAC:EquipmentList, + ZoneEquipment_unit1, !- Name + SequentialLoad, !- Load Distribution Scheme + ZoneHVAC:AirDistributionUnit, !- Zone Equipment 1 Object Type + ZoneDirectAir_unit1 ADU, !- Zone Equipment 1 Name + 4, !- Zone Equipment 1 Cooling Sequence + 4, !- Zone Equipment 1 Heating or No-Load Sequence + , !- Zone Equipment 1 Sequential Cooling Fraction Schedule Name + , !- Zone Equipment 1 Sequential Heating Fraction Schedule Name + WaterHeater:HeatPump:WrappedCondenser, !- Zone Equipment 2 Object Type + Water Heater_unit1, !- Zone Equipment 2 Name + 1, !- Zone Equipment 2 Cooling Sequence + 1, !- Zone Equipment 2 Heating or No-Load Sequence + , !- Zone Equipment 2 Sequential Cooling Fraction Schedule Name + , !- Zone Equipment 2 Sequential Heating Fraction Schedule Name + Fan:ZoneExhaust, !- Zone Equipment 3 Object Type + Zone Exhaust Fan_unit1, !- Zone Equipment 3 Name + 5, !- Zone Equipment 3 Cooling Sequence + 5, !- Zone Equipment 3 Heating or No-Load Sequence + , !- Zone Equipment 3 Sequential Cooling Fraction Schedule Name + , !- Zone Equipment 3 Sequential Heating Fraction Schedule Name + ZoneHVAC:EnergyRecoveryVentilator, !- Zone Equipment 4 Object Type + ERV_unit1, !- Zone Equipment 4 Name + 2, !- Zone Equipment 4 Cooling Sequence + 2, !- Zone Equipment 4 Heating or No-Load Sequence + , !- Zone Equipment 4 Sequential Cooling Fraction Schedule Name + , !- Zone Equipment 4 Sequential Heating Fraction Schedule Name + ZoneHVAC:Dehumidifier:DX,!- Zone Equipment 5 Object Type + North Zone Dehumidifier, !- Zone Equipment 5 Name + 3, !- Zone Equipment 5 Cooling Sequence + 3; !- Zone Equipment 5 Heating or No-Load Sequence + + +!- =========== ALL OBJECTS IN CLASS: ZONEHVAC:EQUIPMENTCONNECTIONS =========== + +ZoneHVAC:EquipmentConnections, + living_unit1, !- Zone Name + ZoneEquipment_unit1, !- Zone Conditioning Equipment List Name + zone inlet nodes_unit1, !- Zone Air Inlet Node or NodeList Name + Zone Exhaust Node_list_unit1, !- Zone Air Exhaust Node or NodeList Name + Zone Node_unit1, !- Zone Air Node Name + Zone Outlet Node_unit1; !- Zone Return Air Node or NodeList Name + + +!- =========== ALL OBJECTS IN CLASS: FAN:ONOFF =========== + +Fan:OnOff, + Supply Fan_unit1, !- Name + always_avail, !- Availability Schedule Name + 0.50054, !- Fan Total Efficiency + 400, !- Pressure Rise {Pa} + autosize, !- Maximum Flow Rate {m3/s} + 0.863, !- Motor Efficiency + 1, !- Motor In Airstream Fraction + air loop inlet node_unit1, !- Air Inlet Node Name + cooling coil air inlet node_unit1, !- Air Outlet Node Name + , !- Fan Power Ratio Function of Speed Ratio Curve Name + , !- Fan Efficiency Ratio Function of Speed Ratio Curve Name + General; !- End-Use Subcategory + +Fan:OnOff, + OASupplyFan_unit1, !- Name + always_avail, !- Availability Schedule Name + 0.6, !- Fan Total Efficiency + 454.045717061016, !- Pressure Rise {Pa} + 0.0283168464628752, !- Maximum Flow Rate {m3/s} + 1, !- Motor Efficiency + 0, !- Motor In Airstream Fraction + OA fan inlet node_unit1, !- Air Inlet Node Name + OA inlet node_unit1, !- Air Outlet Node Name + , !- Fan Power Ratio Function of Speed Ratio Curve Name + , !- Fan Efficiency Ratio Function of Speed Ratio Curve Name + Ventilation; !- End-Use Subcategory + +Fan:OnOff, + OAExhaustFan_unit1, !- Name + always_avail, !- Availability Schedule Name + 0.6, !- Fan Total Efficiency + 454.045717061016, !- Pressure Rise {Pa} + 0.0283168464628752, !- Maximum Flow Rate {m3/s} + 1, !- Motor Efficiency + 0, !- Motor In Airstream Fraction + ERVexhaustnode_unit1, !- Air Inlet Node Name + exhaust outlet node_unit1, !- Air Outlet Node Name + , !- Fan Power Ratio Function of Speed Ratio Curve Name + , !- Fan Efficiency Ratio Function of Speed Ratio Curve Name + Ventilation; !- End-Use Subcategory + +Fan:OnOff, + Heat Pump Water Heater Fan_unit1, !- Name + always_avail, !- Availability Schedule Name + 0.7, !- Fan Total Efficiency + 100.0, !- Pressure Rise {Pa} + autosize, !- Maximum Flow Rate {m3/s} + 0.9, !- Motor Efficiency + 1.0, !- Motor In Airstream Fraction + Heat Pump Water Heater Fan Inlet Node_unit1, !- Air Inlet Node Name + HPWH zone inlet node_unit1, !- Air Outlet Node Name + , !- Fan Power Ratio Function of Speed Ratio Curve Name + , !- Fan Efficiency Ratio Function of Speed Ratio Curve Name + General; !- End-Use Subcategory + + +!- =========== ALL OBJECTS IN CLASS: FAN:ZONEEXHAUST =========== + +Fan:ZoneExhaust, + Zone Exhaust Fan_unit1, !- Name + always_avail, !- Availability Schedule Name + 0.6, !- Fan Total Efficiency + 0.00001, !- Pressure Rise {Pa} + 0.000001, !- Maximum Flow Rate {m3/s} + Zone Exhaust Node_unit1, !- Air Inlet Node Name + zone exhaust fan outlet nodes_unit1, !- Air Outlet Node Name + Ventilation, !- End-Use Subcategory + , !- Flow Fraction Schedule Name + Decoupled; !- System Availability Manager Coupling Mode + + +!- =========== ALL OBJECTS IN CLASS: COIL:COOLING:DX:SINGLESPEED =========== + +Coil:Cooling:DX:SingleSpeed, + DX Cooling Coil_unit1, !- Name + always_avail, !- Availability Schedule Name + autosize, !- Gross Rated Total Cooling Capacity {W} + autosize, !- Gross Rated Sensible Heat Ratio + 4.06853019625951, !- Gross Rated Cooling COP {W/W} + autosize, !- Rated Air Flow Rate {m3/s} + , !- Rated Evaporator Fan Power Per Volume Flow Rate {W/(m3/s)} + Cooling Coil Air Inlet Node_unit1, !- Air Inlet Node Name + Heating Coil Air Inlet Node_unit1, !- Air Outlet Node Name + HPACCoolCapFT, !- Total Cooling Capacity Function of Temperature Curve Name + HPACCoolCapFFF, !- Total Cooling Capacity Function of Flow Fraction Curve Name + HPACCOOLEIRFT, !- Energy Input Ratio Function of Temperature Curve Name + HPACCOOLEIRFFF, !- Energy Input Ratio Function of Flow Fraction Curve Name + HPACCOOLPLFFPLR; !- Part Load Fraction Correlation Curve Name + + +!- =========== ALL OBJECTS IN CLASS: COIL:HEATING:ELECTRIC =========== + +Coil:Heating:Electric, + Supp Heating Coil_unit1, !- Name + always_avail, !- Availability Schedule Name + 1, !- Efficiency + autosize, !- Nominal Capacity {W} + Supp Heating Coil Air Inlet Node_unit1, !- Air Inlet Node Name + Air Loop Outlet Node_unit1; !- Air Outlet Node Name + + +!- =========== ALL OBJECTS IN CLASS: COIL:HEATING:DX:SINGLESPEED =========== + +Coil:Heating:DX:SingleSpeed, + Main DX Heating Coil_unit1, !- Name + always_avail, !- Availability Schedule Name + autosize, !- Gross Rated Heating Capacity {W} + 3.69308080013886, !- Gross Rated Heating COP {W/W} + autosize, !- Rated Air Flow Rate {m3/s} + , !- Rated Supply Fan Power Per Volume Flow Rate {W/(m3/s)} + Heating Coil Air Inlet Node_unit1, !- Air Inlet Node Name + Supp Heating Coil Air Inlet Node_unit1, !- Air Outlet Node Name + HPACHeatCapFT, !- Heating Capacity Function of Temperature Curve Name + HPACHeatCapFFF, !- Heating Capacity Function of Flow Fraction Curve Name + HPACHeatEIRFT, !- Energy Input Ratio Function of Temperature Curve Name + HPACHeatEIRFFF, !- Energy Input Ratio Function of Flow Fraction Curve Name + HPACCOOLPLFFPLR, !- Part Load Fraction Correlation Curve Name + Defrost_EIR_FT, !- Defrost Energy Input Ratio Function of Temperature Curve Name + -17.78, !- Minimum Outdoor Dry-Bulb Temperature for Compressor Operation {C} + , !- Outdoor Dry-Bulb Temperature to Turn On Compressor {C} + 5.0, !- Maximum Outdoor Dry-Bulb Temperature for Defrost Operation {C} + 200.0, !- Crankcase Heater Capacity {W} + 10.0, !- Maximum Outdoor Dry-Bulb Temperature for Crankcase Heater Operation {C} + ReverseCycle, !- Defrost Strategy + OnDemand; !- Defrost Control + + +!- =========== ALL OBJECTS IN CLASS: COIL:WATERHEATING:AIRTOWATERHEATPUMP:WRAPPED =========== + +Coil:WaterHeating:AirToWaterHeatPump:Wrapped, + Heat Pump Water Heater Evaporator_unit1, !- Name + 1500, !- Rated Heating Capacity {W} + 3.0, !- Rated COP {W/W} + 0.981, !- Rated Sensible Heat Ratio + 19.7, !- Rated Evaporator Inlet Air Dry-Bulb Temperature {C} + 13.5, !- Rated Evaporator Inlet Air Wet-Bulb Temperature {C} + 48.89, !- Rated Condenser Water Temperature {C} + 0.189, !- Rated Evaporator Air Flow Rate {m3/s} + yes, !- Evaporator Fan Power Included in Rated COP + Zone Exhaust Node1_unit1,!- Evaporator Air Inlet Node Name + Heat Pump Water Heater Fan Inlet Node_unit1, !- Evaporator Air Outlet Node Name + , !- Crankcase Heater Capacity {W} + 10, !- Maximum Ambient Temperature for Crankcase Heater Operation {C} + WetBulbTemperature, !- Evaporator Air Temperature Type for Curve Objects + HPWH-Htg-Cap-fT, !- Heating Capacity Function of Temperature Curve Name + , !- Heating Capacity Function of Air Flow Fraction Curve Name + HPWH-Htg-COP-fT, !- Heating COP Function of Temperature Curve Name + , !- Heating COP Function of Air Flow Fraction Curve Name + HPWH-COP-fPLR; !- Part Load Fraction Correlation Curve Name + + +!- =========== ALL OBJECTS IN CLASS: HEATEXCHANGER:AIRTOAIR:SENSIBLEANDLATENT =========== + +HeatExchanger:AirToAir:SensibleAndLatent, + OA_Heat_Recovery_Unit1, !- Name + always_avail, !- Availability Schedule Name + 0.0283168464628752, !- Nominal Supply Air Flow Rate {m3/s} + 0.65, !- Sensible Effectiveness at 100% Heating Air Flow {dimensionless} + 0, !- Latent Effectiveness at 100% Heating Air Flow {dimensionless} + 0.65, !- Sensible Effectiveness at 75% Heating Air Flow {dimensionless} + 0, !- Latent Effectiveness at 75% Heating Air Flow {dimensionless} + 0.65, !- Sensible Effectiveness at 100% Cooling Air Flow {dimensionless} + 0, !- Latent Effectiveness at 100% Cooling Air Flow {dimensionless} + 0.65, !- Sensible Effectiveness at 75% Cooling Air Flow {dimensionless} + 0, !- Latent Effectiveness at 75% Cooling Air Flow {dimensionless} + outdoor air node_unit1, !- Supply Air Inlet Node Name + OA fan inlet node_unit1, !- Supply Air Outlet Node Name + Zone Exhaust Node_unit1, !- Exhaust Air Inlet Node Name + ERVexhaustnode_unit1, !- Exhaust Air Outlet Node Name + 0, !- Nominal Electric Power {W} + No, !- Supply Air Outlet Temperature Control + Plate, !- Heat Exchanger Type + None, !- Frost Control Type + -16.8333337792644, !- Threshold Temperature {C} + 0.083, !- Initial Defrost Time Fraction {dimensionless} + 2.15999989700318E-02, !- Rate of Defrost Time Fraction Increase {1/K} + No; !- Economizer Lockout + + +!- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC:UNITARYHEATPUMP:AIRTOAIR =========== + +AirLoopHVAC:UnitaryHeatPump:AirToAir, + Heat Pump_unit1, !- Name + always_avail, !- Availability Schedule Name + Air Loop Inlet node_unit1, !- Air Inlet Node Name + Air Loop Outlet Node_unit1, !- Air Outlet Node Name + autosize, !- Cooling Supply Air Flow Rate {m3/s} + autosize, !- Heating Supply Air Flow Rate {m3/s} + 0.0, !- No Load Supply Air Flow Rate {m3/s} + living_unit1, !- Controlling Zone or Thermostat Location + Fan:OnOff, !- Supply Air Fan Object Type + Supply Fan_unit1, !- Supply Air Fan Name + Coil:Heating:DX:SingleSpeed, !- Heating Coil Object Type + Main DX Heating Coil_unit1, !- Heating Coil Name + Coil:Cooling:DX:SingleSpeed, !- Cooling Coil Object Type + DX Cooling Coil_unit1, !- Cooling Coil Name + Coil:Heating:Electric, !- Supplemental Heating Coil Object Type + Supp Heating Coil_unit1, !- Supplemental Heating Coil Name + 50, !- Maximum Supply Air Temperature from Supplemental Heater {C} + 10, !- Maximum Outdoor Dry-Bulb Temperature for Supplemental Heater Operation {C} + BlowThrough, !- Fan Placement + fan_cycle; !- Supply Air Fan Operating Mode Schedule Name + + +!- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC =========== + +AirLoopHVAC, + Central System_unit1, !- Name + , !- Controller List Name + availability list, !- Availability Manager List Name + autosize, !- Design Supply Air Flow Rate {m3/s} + Air Loop Branches_unit1, !- Branch List Name + , !- Connector List Name + Air Loop Inlet Node_unit1, !- Supply Side Inlet Node Name + Return Air Mixer Outlet_unit1, !- Demand Side Outlet Node Name + Zone Equipment Inlet Node_unit1, !- Demand Side Inlet Node Names + Air Loop Outlet Node_unit1; !- Supply Side Outlet Node Names + + +!- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC:ZONESPLITTER =========== + +AirLoopHVAC:ZoneSplitter, + Zone Supply Air Splitter_unit1, !- Name + Zone Equipment Inlet Node_unit1, !- Inlet Node Name + Zone Inlet Node_unit1 ATInlet; !- Outlet 1 Node Name + + +!- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC:SUPPLYPATH =========== + +AirLoopHVAC:SupplyPath, + SupplyPath_unit1, !- Name + Zone Equipment Inlet Node_unit1, !- Supply Air Path Inlet Node Name + AirLoopHVAC:ZoneSplitter,!- Component 1 Object Type + Zone Supply Air Splitter_unit1; !- Component 1 Name + + +!- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC:ZONEMIXER =========== + +AirLoopHVAC:ZoneMixer, + Zone Return Air Mixer_unit1, !- Name + Return Air Mixer Outlet_unit1, !- Outlet Node Name + Zone Outlet Node_unit1; !- Inlet 1 Node Name + + +!- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC:RETURNPATH =========== + +AirLoopHVAC:ReturnPath, + ReturnPath_unit1, !- Name + Return Air Mixer Outlet_unit1, !- Return Air Path Outlet Node Name + AirLoopHVAC:ZoneMixer, !- Component 1 Object Type + Zone Return Air Mixer_unit1; !- Component 1 Name + + +!- =========== ALL OBJECTS IN CLASS: BRANCH =========== + +Branch, + Air Loop Main Branch_unit1, !- Name + , !- Pressure Drop Curve Name + AirLoopHVAC:UnitaryHeatPump:AirtoAir, !- Component 1 Object Type + Heat Pump_unit1, !- Component 1 Name + Air Loop Inlet Node_unit1, !- Component 1 Inlet Node Name + Air Loop Outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Mains Inlet Branch_unit1,!- Name + , !- Pressure Drop Curve Name + Pump:VariableSpeed, !- Component 1 Object Type + Mains Pressure_unit1, !- Component 1 Name + Mains Inlet Node_unit1, !- Component 1 Inlet Node Name + Mains Pressure Outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + DHW Supply Outlet Branch_unit1, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + DHW Supply Outlet Pipe_unit1, !- Component 1 Name + DHW Supply Outlet Pipe Inlet Node_unit1, !- Component 1 Inlet Node Name + DHW Supply Outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + DHW Demand Inlet Branch_unit1, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + DHW Demand Inlet Pipe_unit1, !- Component 1 Name + DHW Demand Inlet Node_unit1, !- Component 1 Inlet Node Name + DHW Demand Inlet Pipe Outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Water Sink Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 1 Object Type + DHW Sinks_unit1, !- Component 1 Name + Water Sink Inlet Node_unit1, !- Component 1 Inlet Node Name + Water Sink outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Water Shower Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 1 Object Type + DHW Showers_unit1, !- Component 1 Name + Water Shower Inlet Node_unit1, !- Component 1 Inlet Node Name + Water Shower Outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Water ClothesWasher Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 1 Object Type + DHW ClothesWasher_unit1, !- Component 1 Name + Water ClothesWasher Inlet Node_unit1, !- Component 1 Inlet Node Name + Water ClothesWasher Outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Water Dishwasher Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 1 Object Type + DHW DishWasher_unit1, !- Component 1 Name + Water DishWasher Inlet Node_unit1, !- Component 1 Inlet Node Name + Water DishWasher outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Water Bath Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 1 Object Type + DHW Baths_unit1, !- Component 1 Name + Water Bath Inlet Node_unit1, !- Component 1 Inlet Node Name + Water bath Outlet Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Mains Makeup Branch_unit1, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Mains Makeup Pipe_unit1, !- Component 1 Name + Mains Makeup Pipe Inlet Node_unit1, !- Component 1 Inlet Node Name + Mains Makeup Node_unit1; !- Component 1 Outlet Node Name + +Branch, + Water Heater Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterHeater:HeatPump:WrappedCondenser, !- Component 1 Object Type + Water Heater_unit1, !- Component 1 Name + Water Heater Use Inlet Node_unit1, !- Component 1 Inlet Node Name + Water Heater Use Outlet Node_unit1; !- Component 1 Outlet Node Name + + +!- =========== ALL OBJECTS IN CLASS: BRANCHLIST =========== + +BranchList, + Air Loop Branches_unit1, !- Name + Air Loop Main Branch_unit1; !- Branch 1 Name + +BranchList, + DHW Supply Branches_unit1, !- Name + Mains Inlet Branch_unit1,!- Branch 1 Name + Water Heater Branch_unit1, !- Branch 2 Name + DHW Supply Outlet Branch_unit1; !- Branch 3 Name + +BranchList, + DHW Demand Branches_unit1, !- Name + DHW Demand Inlet Branch_unit1, !- Branch 1 Name + Water Sink Branch_unit1, !- Branch 2 Name + Water Shower Branch_unit1, !- Branch 3 Name + Water ClothesWasher Branch_unit1, !- Branch 4 Name + Water Dishwasher Branch_unit1, !- Branch 5 Name + Water Bath Branch_unit1, !- Branch 6 Name + Mains Makeup Branch_unit1; !- Branch 7 Name + + +!- =========== ALL OBJECTS IN CLASS: CONNECTOR:SPLITTER =========== + +Connector:Splitter, + DHW Demand Splitter_unit1, !- Name + DHW Demand Inlet Branch_unit1, !- Inlet Branch Name + Water Sink Branch_unit1, !- Outlet Branch 1 Name + Water Shower Branch_unit1, !- Outlet Branch 2 Name + Water ClothesWasher Branch_unit1, !- Outlet Branch 3 Name + Water Dishwasher Branch_unit1, !- Outlet Branch 4 Name + Water Bath Branch_unit1; !- Outlet Branch 5 Name + +Connector:Splitter, + DHW Supply Splitter_unit1, !- Name + Mains Inlet Branch_unit1,!- Inlet Branch Name + Water Heater Branch_unit1; !- Outlet Branch 1 Name + + +!- =========== ALL OBJECTS IN CLASS: CONNECTOR:MIXER =========== + +Connector:Mixer, + DHW Demand Mixer_unit1, !- Name + Mains Makeup Branch_unit1, !- Outlet Branch Name + Water Sink Branch_unit1, !- Inlet Branch 1 Name + Water Shower Branch_unit1, !- Inlet Branch 2 Name + Water ClothesWasher Branch_unit1, !- Inlet Branch 3 Name + Water Dishwasher Branch_unit1, !- Inlet Branch 4 Name + Water Bath Branch_unit1; !- Inlet Branch 5 Name + +Connector:Mixer, + DHW Supply Mixer_unit1, !- Name + DHW Supply Outlet Branch_unit1, !- Outlet Branch Name + Water Heater Branch_unit1; !- Inlet Branch 1 Name + + +!- =========== ALL OBJECTS IN CLASS: CONNECTORLIST =========== + +ConnectorList, + DHW Demand Connectors_unit1, !- Name + Connector:Splitter, !- Connector 1 Object Type + DHW Demand Splitter_unit1, !- Connector 1 Name + Connector:Mixer, !- Connector 2 Object Type + DHW Demand Mixer_unit1; !- Connector 2 Name + +ConnectorList, + DHW Supply Connectors_unit1, !- Name + Connector:Splitter, !- Connector 1 Object Type + DHW Supply Splitter_unit1, !- Connector 1 Name + Connector:Mixer, !- Connector 2 Object Type + DHW Supply Mixer_unit1; !- Connector 2 Name + + +!- =========== ALL OBJECTS IN CLASS: NODELIST =========== + +NodeList, + Zone Inlet Nodes_unit1, !- Name + Zone Inlet Node_unit1, !- Node 1 Name + HPWH Zone Inlet Node_unit1, !- Node 2 Name + OA Inlet Node_unit1, !- Node 3 Name + Dehumidifier Outlet Node;!- Node 4 Name + +NodeList, + Zone Exhaust Node_list_unit1, !- Name + Zone Exhaust Node_unit1, !- Node 1 Name + Zone Exhaust Node1_unit1,!- Node 2 Name + Zone3DehumidifierInlet; !- Node 3 Name + + +!- =========== ALL OBJECTS IN CLASS: OUTDOORAIR:NODE =========== + +OutdoorAir:Node, + outside air inlet node_unit1, !- Name + 0.914355407629293; !- Height Above Ground {m} + + +!- =========== ALL OBJECTS IN CLASS: OUTDOORAIR:NODELIST =========== + +OutdoorAir:NodeList, + outdoor air node_unit1; !- Node or NodeList Name 1 + + +!- =========== ALL OBJECTS IN CLASS: PIPE:ADIABATIC =========== + +Pipe:Adiabatic, + DHW Supply Outlet Pipe_unit1, !- Name + DHW Supply Outlet Pipe Inlet Node_unit1, !- Inlet Node Name + DHW Supply Outlet Node_unit1; !- Outlet Node Name + +Pipe:Adiabatic, + Mains Makeup Pipe_unit1, !- Name + Mains Makeup Pipe Inlet Node_unit1, !- Inlet Node Name + Mains Makeup Node_unit1; !- Outlet Node Name + +Pipe:Adiabatic, + DHW Demand Inlet Pipe_unit1, !- Name + DHW Demand Inlet Node_unit1, !- Inlet Node Name + DHW Demand Inlet Pipe Outlet Node_unit1; !- Outlet Node Name + + +!- =========== ALL OBJECTS IN CLASS: PUMP:VARIABLESPEED =========== + +Pump:VariableSpeed, + Mains Pressure_unit1, !- Name + Mains Inlet Node_unit1, !- Inlet Node Name + Mains Pressure Outlet Node_unit1, !- Outlet Node Name + autosize, !- Design Maximum Flow Rate {m3/s} + 1, !- Design Pump Head {Pa} + 0, !- Design Power Consumption {W} + 1, !- Motor Efficiency + 0, !- Fraction of Motor Inefficiencies to Fluid Stream + 0, !- Coefficient 1 of the Part Load Performance Curve + 1, !- Coefficient 2 of the Part Load Performance Curve + 0, !- Coefficient 3 of the Part Load Performance Curve + 0, !- Coefficient 4 of the Part Load Performance Curve + 0, !- Design Minimum Flow Rate {m3/s} + Intermittent; !- Pump Control Type + + +!- =========== ALL OBJECTS IN CLASS: WATERHEATER:STRATIFIED =========== + +WaterHeater:Stratified, + Water Heater_Tank_unit1, !- Name + Water Heater, !- End-Use Subcategory + 0.196841372, !- Tank Volume {m3} + 1.594, !- Tank Height {m} + VerticalCylinder, !- Tank Shape + , !- Tank Perimeter {m} + 51, !- Maximum Temperature Limit {C} + MasterSlave, !- Heater Priority Control + dhw_setpt_hpwh, !- Heater 1 Setpoint Temperature Schedule Name + 2, !- Heater 1 Deadband Temperature Difference {deltaC} + autosize, !- Heater 1 Capacity {W} + 1.129, !- Heater 1 Height {m} + dhw_setpt_hpwh, !- Heater 2 Setpoint Temperature Schedule Name + 2, !- Heater 2 Deadband Temperature Difference {deltaC} + 0, !- Heater 2 Capacity {W} + 0.266, !- Heater 2 Height {m} + electricity, !- Heater Fuel Type + 1, !- Heater Thermal Efficiency + 8.3, !- Off Cycle Parasitic Fuel Consumption Rate {W} + Electricity, !- Off Cycle Parasitic Fuel Type + 0, !- Off Cycle Parasitic Heat Fraction to Tank + 1, !- Off Cycle Parasitic Height {m} + 8.3, !- On Cycle Parasitic Fuel Consumption Rate {W} + Electricity, !- On Cycle Parasitic Fuel Type + 0, !- On Cycle Parasitic Heat Fraction to Tank + 1, !- On Cycle Parasitic Height {m} + Zone, !- Ambient Temperature Indicator + , !- Ambient Temperature Schedule Name + living_unit1, !- Ambient Temperature Zone Name + , !- Ambient Temperature Outdoor Air Node Name + 4.536492, !- Uniform Skin Loss Coefficient per Unit Area to Ambient Temperature {W/m2-K} + 1, !- Skin Loss Fraction to Zone + , !- Off Cycle Flue Loss Coefficient to Ambient Temperature {W/K} + 1, !- Off Cycle Flue Loss Fraction to Zone + , !- Peak Use Flow Rate {m3/s} + , !- Use Flow Rate Fraction Schedule Name + , !- Cold Water Supply Temperature Schedule Name + Water Heater use inlet node_unit1, !- Use Side Inlet Node Name + Water Heater use outlet node_unit1, !- Use Side Outlet Node Name + 1, !- Use Side Effectiveness + 0, !- Use Side Inlet Height {m} + autocalculate, !- Use Side Outlet Height {m} + , !- Source Side Inlet Node Name + , !- Source Side Outlet Node Name + 1, !- Source Side Effectiveness + 0.7, !- Source Side Inlet Height {m} + 0, !- Source Side Outlet Height {m} + Fixed, !- Inlet Mode + autosize, !- Use Side Design Flow Rate {m3/s} + autosize, !- Source Side Design Flow Rate {m3/s} + 1.5, !- Indirect Water Heating Recovery Time {hr} + 1; !- Number of Nodes + + +!- =========== ALL OBJECTS IN CLASS: WATERHEATER:SIZING =========== + +WaterHeater:Sizing, + Water Heater_Tank_unit1, !- WaterHeater Name + ResidentialHUD-FHAMinimum, !- Design Mode + , !- Time Storage Can Meet Peak Draw {hr} + , !- Time for Tank Recovery {hr} + , !- Nominal Tank Volume for Autosizing Plant Connections {m3} + 3, !- Number of Bedrooms + 3; !- Number of Bathrooms + + +!- =========== ALL OBJECTS IN CLASS: WATERHEATER:HEATPUMP:WRAPPEDCONDENSER =========== + +WaterHeater:HeatPump:WrappedCondenser, + Water Heater_unit1, !- Name + always_avail, !- Availability Schedule Name + Compressor Setpoint, !- Compressor Setpoint Temperature Schedule Name + 5, !- Dead Band Temperature Difference {deltaC} + 0.0664166667, !- Condenser Bottom Location {m} + 0.8634166667, !- Condenser Top Location {m} + autocalculate, !- Evaporator Air Flow Rate {m3/s} + ZoneAirOnly, !- Inlet Air Configuration + Zone Exhaust Node1_unit1,!- Air Inlet Node Name + HPWH Zone Inlet Node_unit1, !- Air Outlet Node Name + , !- Outdoor Air Node Name + , !- Exhaust Air Node Name + , !- Inlet Air Temperature Schedule Name + , !- Inlet Air Humidity Schedule Name + living_unit1, !- Inlet Air Zone Name + WaterHeater:Stratified, !- Tank Object Type + Water Heater_Tank_unit1, !- Tank Name + Water Heater use inlet node_unit1, !- Tank Use Side Inlet Node Name + Water Heater use outlet node_unit1, !- Tank Use Side Outlet Node Name + Coil:WaterHeating:AirToWaterHeatPump:Wrapped, !- DX Coil Object Type + Heat Pump Water Heater Evaporator_unit1, !- DX Coil Name + 10.0, !- Minimum Inlet Air Temperature for Compressor Operation {C} + 48.89, !- Maximum Inlet Air Temperature for Compressor Operation {C} + Zone, !- Compressor Location + , !- Compressor Ambient Temperature Schedule Name + Fan:OnOff, !- Fan Object Type + Heat Pump Water Heater Fan_unit1, !- Fan Name + DrawThrough, !- Fan Placement + 0, !- On Cycle Parasitic Electric Load {W} + 0, !- Off Cycle Parasitic Electric Load {W} + , !- Parasitic Heat Rejection Location + , !- Inlet Air Mixer Node Name + , !- Outlet Air Splitter Node Name + , !- Inlet Air Mixer Schedule Name + MutuallyExclusive, !- Tank Element Control Logic + 1.262, !- Control Sensor 1 Height In Stratified Tank {m} + 0.75, !- Control Sensor 1 Weight {dimensionless} + 0.464; !- Control Sensor 2 Height In Stratified Tank {m} + + +!- =========== ALL OBJECTS IN CLASS: PLANTLOOP =========== + +PlantLoop, + DHW Loop_unit1, !- Name + Water, !- Fluid Type + , !- User Defined Fluid Type + DHW Loop Operation_unit1,!- Plant Equipment Operation Scheme Name + DHW Supply Outlet Node_unit1, !- Loop Temperature Setpoint Node Name + 100, !- Maximum Loop Temperature {C} + 0, !- Minimum Loop Temperature {C} + autosize, !- Maximum Loop Flow Rate {m3/s} + 0, !- Minimum Loop Flow Rate {m3/s} + autocalculate, !- Plant Loop Volume {m3} + Mains Inlet Node_unit1, !- Plant Side Inlet Node Name + DHW Supply Outlet Node_unit1, !- Plant Side Outlet Node Name + DHW Supply Branches_unit1, !- Plant Side Branch List Name + DHW Supply Connectors_unit1, !- Plant Side Connector List Name + DHW Demand Inlet Node_unit1, !- Demand Side Inlet Node Name + Mains Makeup Node_unit1, !- Demand Side Outlet Node Name + DHW Demand Branches_unit1, !- Demand Side Branch List Name + DHW Demand Connectors_unit1, !- Demand Side Connector List Name + Optimal; !- Load Distribution Scheme + + +!- =========== ALL OBJECTS IN CLASS: PLANTEQUIPMENTLIST =========== + +PlantEquipmentList, + DHW Plant Equipment_unit1, !- Name + WaterHeater:HeatPump:WrappedCondenser, !- Equipment 1 Object Type + Water Heater_unit1; !- Equipment 1 Name + + +!- =========== ALL OBJECTS IN CLASS: PLANTEQUIPMENTOPERATION:HEATINGLOAD =========== + +PlantEquipmentOperation:HeatingLoad, + DHW Control Scheme_unit1,!- Name + 0.0, !- Load Range 1 Lower Limit {W} + 1000000000000000, !- Load Range 1 Upper Limit {W} + DHW Plant Equipment_unit1; !- Range 1 Equipment List Name + + +!- =========== ALL OBJECTS IN CLASS: PLANTEQUIPMENTOPERATIONSCHEMES =========== + +PlantEquipmentOperationSchemes, + DHW Loop Operation_unit1,!- Name + PlantEquipmentOperation:HeatingLoad, !- Control Scheme 1 Object Type + DHW Control Scheme_unit1,!- Control Scheme 1 Name + always_avail; !- Control Scheme 1 Schedule Name + + +!- =========== ALL OBJECTS IN CLASS: AVAILABILITYMANAGER:SCHEDULED =========== + +AvailabilityManager:Scheduled, + System availability, !- Name + always_avail; !- Schedule Name + + +!- =========== ALL OBJECTS IN CLASS: AVAILABILITYMANAGERASSIGNMENTLIST =========== + +AvailabilityManagerAssignmentList, + availability list, !- Name + AvailabilityManager:Scheduled, !- Availability Manager 1 Object Type + System availability; !- Availability Manager 1 Name + + +!- =========== ALL OBJECTS IN CLASS: SETPOINTMANAGER:SCHEDULED =========== + +SetpointManager:Scheduled, + DHW Loop Setpoint Manager_unit1, !- Name + Temperature, !- Control Variable + DHWSupplySetpoint, !- Schedule Name + DHW Supply Outlet Node_unit1; !- Setpoint Node or NodeList Name + + +!- =========== ALL OBJECTS IN CLASS: WATERUSE:EQUIPMENT =========== + +WaterUse:Equipment, + Clothes Washer_unit1, !- Name + Domestic Hot Water, !- End-Use Subcategory + 1.6219189818e-06, !- Peak Flow Rate {m3/s} + ClothesWasher, !- Flow Rate Fraction Schedule Name + CWWaterTempSchedule; !- Target Temperature Schedule Name + +WaterUse:Equipment, + Dishwasher_unit1, !- Name + Domestic Hot Water, !- End-Use Subcategory + 6.36685353e-07, !- Peak Flow Rate {m3/s} + Dishwasher, !- Flow Rate Fraction Schedule Name + DWWaterTempSchedule; !- Target Temperature Schedule Name + +WaterUse:Equipment, + Sinks_unit1, !- Name + Domestic Hot Water, !- End-Use Subcategory + 7.1934e-05, !- Peak Flow Rate {m3/s} + BA_sink_sch, !- Flow Rate Fraction Schedule Name + SSBWaterTempSchedule; !- Target Temperature Schedule Name + +WaterUse:Equipment, + Showers_unit1, !- Name + Domestic Hot Water, !- End-Use Subcategory + 0.000141975, !- Peak Flow Rate {m3/s} + BA_shower_sch, !- Flow Rate Fraction Schedule Name + SSBWaterTempSchedule; !- Target Temperature Schedule Name + +WaterUse:Equipment, + Baths_unit1, !- Name + Domestic Hot Water, !- End-Use Subcategory + 0.00027764, !- Peak Flow Rate {m3/s} + BA_bath_sch, !- Flow Rate Fraction Schedule Name + SSBWaterTempSchedule; !- Target Temperature Schedule Name + + +!- =========== ALL OBJECTS IN CLASS: WATERUSE:CONNECTIONS =========== + +WaterUse:Connections, + DHW Sinks_unit1, !- Name + Water Sink Inlet Node_unit1, !- Inlet Node Name + Water Sink Outlet Node_unit1, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + None, !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + Sinks_unit1; !- Water Use Equipment 1 Name + +WaterUse:Connections, + DHW Showers_unit1, !- Name + Water Shower Inlet Node_unit1, !- Inlet Node Name + Water Shower Outlet Node_unit1, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + None, !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + Showers_unit1; !- Water Use Equipment 1 Name + +WaterUse:Connections, + DHW ClothesWasher_unit1, !- Name + Water ClothesWasher Inlet Node_unit1, !- Inlet Node Name + Water ClothesWasher Outlet Node_unit1, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + None, !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + Clothes Washer_unit1; !- Water Use Equipment 1 Name + +WaterUse:Connections, + DHW DishWasher_unit1, !- Name + Water DishWasher Inlet Node_unit1, !- Inlet Node Name + Water DishWasher Outlet Node_unit1, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + None, !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + Dishwasher_unit1; !- Water Use Equipment 1 Name + +WaterUse:Connections, + DHW Baths_unit1, !- Name + Water Bath Inlet Node_unit1, !- Inlet Node Name + Water Bath Outlet Node_unit1, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + None, !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + Baths_unit1; !- Water Use Equipment 1 Name + + +!- =========== ALL OBJECTS IN CLASS: CURVE:QUADRATIC =========== + +Curve:Quadratic, + HPWH-COP-fPLR, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1; !- Maximum Value of x + +Curve:Quadratic, + HPACCoolCapFFF, !- Name + 0.8, !- Coefficient1 Constant + 0.2, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.5, !- Minimum Value of x + 1.5; !- Maximum Value of x + +Curve:Quadratic, + HPACCOOLEIRFFF, !- Name + 1.156, !- Coefficient1 Constant + -0.1816, !- Coefficient2 x + 0.0256, !- Coefficient3 x**2 + 0.5, !- Minimum Value of x + 1.5; !- Maximum Value of x + +Curve:Quadratic, + HPACCOOLPLFFPLR, !- Name + 0.85, !- Coefficient1 Constant + 0.15, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + HPACHeatEIRFFF, !- Name + 1.3824, !- Coefficient1 Constant + -0.4336, !- Coefficient2 x + 0.0512, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + ACCoolingCAPFFF, !- Name + 0.718605468, !- Coefficient1 Constant + 0.410099989, !- Coefficient2 x + -0.128705457, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + ACCoolingEIRFFF, !- Name + 1.32299905, !- Coefficient1 Constant + -0.477711207, !- Coefficient2 x + 0.154712157, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + ACCoolingPLFFPLR, !- Name + 0.90, !- Coefficient1 Constant + 0.10, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + HPCoolingCAPFFF, !- Name + 0.718664047, !- Coefficient1 Constant + 0.41797409, !- Coefficient2 x + -0.136638137, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPCoolingEIRFFF, !- Name + 1.143487507, !- Coefficient1 Constant + -0.13943972, !- Coefficient2 x + -0.004047787, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPCOOLPLFFPLR, !- Name + 0.90, !- Coefficient1 Constant + 0.10, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + HPHeatingCAPFFF, !- Name + 0.694045465, !- Coefficient1 Constant + 0.474207981, !- Coefficient2 x + -0.168253446, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPHeatingEIRFFF, !- Name + 2.185418751, !- Coefficient1 Constant + -1.942827919, !- Coefficient2 x + 0.757409168, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPHeatPLFFPLR, !- Name + 0.90, !- Coefficient1 Constant + 0.10, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + HPLowStageHeatingCAPFFF, !- Name + 0.741466907, !- Coefficient1 Constant + 0.378645444, !- Coefficient2 x + -0.119754733, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPLowStageHeatingEIRFFF, !- Name + 2.153618211, !- Coefficient1 Constant + -1.737190609, !- Coefficient2 x + 0.584269478, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPHighStageHeatingCAPFFF,!- Name + 0.76634609, !- Coefficient1 Constant + 0.32840943, !- Coefficient2 x + -0.094701495, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPHighStageHeatingEIRFFF,!- Name + 2.001041353, !- Coefficient1 Constant + -1.58869128, !- Coefficient2 x + 0.587593517, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HP2StageHeatingPLFFPLR, !- Name + 0.93, !- Coefficient1 Constant + 0.07, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + HPLowStageCoolingCAPFFF, !- Name + 0.655239515, !- Coefficient1 Constant + 0.511655216, !- Coefficient2 x + -0.166894731, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPLowStageCoolingEIRFFF, !- Name + 1.639108268, !- Coefficient1 Constant + -0.998953996, !- Coefficient2 x + 0.359845728, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPHighStageCoolingCAPFFF,!- Name + 0.618281092, !- Coefficient1 Constant + 0.569060264, !- Coefficient2 x + -0.187341356, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HPHighStageCoolingEIRFFF,!- Name + 1.570774717, !- Coefficient1 Constant + -0.914152018, !- Coefficient2 x + 0.343377302, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + HP2StageCoolingPLFFPLR, !- Name + 0.93, !- Coefficient1 Constant + 0.07, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + ACLowStageCoolingCAPFFF, !- Name + 0.65673024, !- Coefficient1 Constant + 0.516470835, !- Coefficient2 x + -0.172887149, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + ACLowStageCoolingEIRFFF, !- Name + 1.562945114, !- Coefficient1 Constant + -0.791859997, !- Coefficient2 x + 0.230030877, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + ACHighStageCoolingCAPFFF,!- Name + 0.690334551, !- Coefficient1 Constant + 0.464383753, !- Coefficient2 x + -0.154507638, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + ACHighStageCoolingEIRFFF,!- Name + 1.31565404, !- Coefficient1 Constant + -0.482467162, !- Coefficient2 x + 0.166239001, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +Curve:Quadratic, + AC2StageCoolingPLFFPLR, !- Name + 0.93, !- Coefficient1 Constant + 0.07, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Quadratic, + Cool-PLF-fPLR, !- Name + 0.80141423, !- Coefficient1 Constant + 0.23744685, !- Coefficient2 x + -0.0393773, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1, !- Maximum Value of x + 0.7, !- Minimum Curve Output + 1; !- Maximum Curve Output + +Curve:Quadratic, + ZoneDehumidPLFFPLR, !- Name + 0.95, !- Coefficient1 Constant + 0.05, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + + +!- =========== ALL OBJECTS IN CLASS: CURVE:CUBIC =========== + +Curve:Cubic, + HPACHeatCapFT, !- Name + 0.758746, !- Coefficient1 Constant + 0.027626, !- Coefficient2 x + 0.000148716, !- Coefficient3 x**2 + 0.0000034992, !- Coefficient4 x**3 + -20.0, !- Minimum Value of x + 20.0; !- Maximum Value of x + +Curve:Cubic, + HPACHeatCapFFF, !- Name + 0.84, !- Coefficient1 Constant + 0.16, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Coefficient4 x**3 + 0.5, !- Minimum Value of x + 1.5; !- Maximum Value of x + +Curve:Cubic, + HPACHeatEIRFT, !- Name + 1.19248, !- Coefficient1 Constant + -0.0300438, !- Coefficient2 x + 0.00103745, !- Coefficient3 x**2 + -0.000023328, !- Coefficient4 x**3 + -20.0, !- Minimum Value of x + 20.0; !- Maximum Value of x + +Curve:Cubic, + Fan-EIR-fPLR, !- Name + 0.00000000, !- Coefficient1 Constant + 1.00000000, !- Coefficient2 x + 0.00000000, !- Coefficient3 x**2 + 0.00000000, !- Coefficient4 x**3 + 0, !- Minimum Value of x + 1, !- Maximum Value of x + 0, !- Minimum Curve Output + 1; !- Maximum Curve Output + +Curve:Cubic, + ConstantCubic, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 x**3 + -100, !- Minimum Value of x + 100; !- Maximum Value of x + + +!- =========== ALL OBJECTS IN CLASS: CURVE:BIQUADRATIC =========== + +Curve:Biquadratic, + HPWH-Htg-Cap-fT, !- Name + 0.563, !- Coefficient1 Constant + 0.0437, !- Coefficient2 x + 0.000039, !- Coefficient3 x**2 + 0.0055, !- Coefficient4 y + -.000148, !- Coefficient5 y**2 + -.000145, !- Coefficient6 x*y + 0, !- Minimum Value of x + 100, !- Maximum Value of x + 0, !- Minimum Value of y + 100, !- Maximum Value of y + 0; !- Minimum Curve Output + +Curve:Biquadratic, + HPWH-Htg-COP-fT, !- Name + 1.1332, !- Coefficient1 Constant + 0.063, !- Coefficient2 x + -.0000979, !- Coefficient3 x**2 + -.00972, !- Coefficient4 y + -.0000214, !- Coefficient5 y**2 + -.000686, !- Coefficient6 x*y + 0, !- Minimum Value of x + 100, !- Maximum Value of x + 0, !- Minimum Value of y + 100; !- Maximum Value of y + +Curve:Biquadratic, + HPWHHeatingCapFTemp, !- Name + 0.369827, !- Coefficient1 Constant + 0.043341, !- Coefficient2 x + -0.00023, !- Coefficient3 x**2 + 0.000466, !- Coefficient4 y + 0.000026, !- Coefficient5 y**2 + -0.00027, !- Coefficient6 x*y + 0.0, !- Minimum Value of x + 40.0, !- Maximum Value of x + 20.0, !- Minimum Value of y + 90.0, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPWHHeatingCOPFTemp, !- Name + 1.19713, !- Coefficient1 Constant + 0.077849, !- Coefficient2 x + -0.0000016, !- Coefficient3 x**2 + -0.02675, !- Coefficient4 y + 0.000296, !- Coefficient5 y**2 + -0.00112, !- Coefficient6 x*y + 0.0, !- Minimum Value of x + 40.0, !- Maximum Value of x + 20.0, !- Minimum Value of y + 90.0, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPACCoolCapFT, !- Name + 0.766956, !- Coefficient1 Constant + 0.0107756, !- Coefficient2 x + -0.0000414703, !- Coefficient3 x**2 + 0.00134961, !- Coefficient4 y + -0.000261144, !- Coefficient5 y**2 + 0.000457488, !- Coefficient6 x*y + 12.77778, !- Minimum Value of x + 23.88889, !- Maximum Value of x + 21.11111, !- Minimum Value of y + 46.11111; !- Maximum Value of y + +Curve:Biquadratic, + HPACCOOLEIRFT, !- Name + 0.297145, !- Coefficient1 Constant + 0.0430933, !- Coefficient2 x + -0.000748766, !- Coefficient3 x**2 + 0.00597727, !- Coefficient4 y + 0.000482112, !- Coefficient5 y**2 + -0.000956448, !- Coefficient6 x*y + 12.77778, !- Minimum Value of x + 23.88889, !- Maximum Value of x + 21.11111, !- Minimum Value of y + 46.11111; !- Maximum Value of y + +Curve:Biquadratic, + Defrost_EIR_FT, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 y + 0, !- Coefficient5 y**2 + 0, !- Coefficient6 x*y + 0, !- Minimum Value of x + 100, !- Maximum Value of x + 0, !- Minimum Value of y + 100; !- Maximum Value of y + +Curve:Biquadratic, + dummy-waste-heat-curve, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 y + 0, !- Coefficient5 y**2 + 0, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 1, !- Minimum Curve Output + 1, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + ACCoolingCAPFTemp, !- Name + 1.5509, !- Coefficient1 Constant + -0.07505, !- Coefficient2 x + 0.0031, !- Coefficient3 x**2 + 0.0024, !- Coefficient4 y + -0.00005, !- Coefficient5 y**2 + -0.00043, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + ACCoolingEIRFTemp, !- Name + -0.30428, !- Coefficient1 Constant + 0.11805, !- Coefficient2 x + -0.00342, !- Coefficient3 x**2 + -0.00626, !- Coefficient4 y + 0.0007, !- Coefficient5 y**2 + -0.00047, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPCoolingCAPFTemp, !- Name + 1.55736, !- Coefficient1 Constant + -0.074448, !- Coefficient2 x + 0.003099, !- Coefficient3 x**2 + 0.00146, !- Coefficient4 y + -0.000041, !- Coefficient5 y**2 + -0.000427, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPCoolingEIRFTemp, !- Name + -0.350448, !- Coefficient1 Constant + 0.11681, !- Coefficient2 x + -0.0034, !- Coefficient3 x**2 + -0.001226, !- Coefficient4 y + 0.000601, !- Coefficient5 y**2 + -0.000467, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPHeatingCAPFTemp, !- Name + 0.876825, !- Coefficient1 Constant + -0.002955, !- Coefficient2 x + -0.000058, !- Coefficient3 x**2 + 0.025335, !- Coefficient4 y + 0.000196, !- Coefficient5 y**2 + -0.000043, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPHeatingEIRFTemp, !- Name + 0.704658, !- Coefficient1 Constant + 0.008767, !- Coefficient2 x + 0.000625, !- Coefficient3 x**2 + -0.009037, !- Coefficient4 y + 0.000738, !- Coefficient5 y**2 + -0.001025, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPLowStageHeatingCAPFTemp, !- Name + 0.84613, !- Coefficient1 Constant + -0.002279, !- Coefficient2 x + -0.000047, !- Coefficient3 x**2 + 0.026703, !- Coefficient4 y + 0.000201, !- Coefficient5 y**2 + -0.000079, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPLowStageHeatingEIRFTemp, !- Name + 0.551837, !- Coefficient1 Constant + 0.02038, !- Coefficient2 x + 0.000546, !- Coefficient3 x**2 + -0.009638, !- Coefficient4 y + 0.000785, !- Coefficient5 y**2 + -0.00125, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPHighStageHeatingCAPFTemp, !- Name + 0.818223, !- Coefficient1 Constant + 0.001981, !- Coefficient2 x + -0.000203, !- Coefficient3 x**2 + 0.028703, !- Coefficient4 y + 0.000207, !- Coefficient5 y**2 + -0.000071, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPHighStageHeatingEIRFTemp, !- Name + 0.81584, !- Coefficient1 Constant + -0.00615, !- Coefficient2 x + 0.001021, !- Coefficient3 x**2 + -0.001301, !- Coefficient4 y + 0.001083, !- Coefficient5 y**2 + -0.001487, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPLowStageCoolingCAPFTemp, !- Name + 1.658788, !- Coefficient1 Constant + -0.083453, !- Coefficient2 x + 0.003424, !- Coefficient3 x**2 + 0.002433, !- Coefficient4 y + -0.000045, !- Coefficient5 y**2 + -0.000534, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPLowStageCoolingEIRFTemp, !- Name + -0.582916, !- Coefficient1 Constant + 0.158101, !- Coefficient2 x + -0.004398, !- Coefficient3 x**2 + -0.020335, !- Coefficient4 y + 0.00108, !- Coefficient5 y**2 + -0.00064, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPHighStageCoolingCAPFTemp, !- Name + 1.472738, !- Coefficient1 Constant + -0.067222, !- Coefficient2 x + 0.00292, !- Coefficient3 x**2 + 0.000052, !- Coefficient4 y + -0.00003, !- Coefficient5 y**2 + -0.000359, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPHighStageCoolingEIRFTemp, !- Name + -0.488196, !- Coefficient1 Constant + 0.099162, !- Coefficient2 x + -0.00237, !- Coefficient3 x**2 + 0.019503, !- Coefficient4 y + 0.00043, !- Coefficient5 y**2 + -0.001097, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + ACLowStageCoolingCAPFTemp, !- Name + 1.66458, !- Coefficient1 Constant + -0.08039, !- Coefficient2 x + 0.0033, !- Coefficient3 x**2 + 0.00124, !- Coefficient4 y + -0.00003, !- Coefficient5 y**2 + -0.00052, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + ACLowStageCoolingEIRFTemp, !- Name + -0.42738, !- Coefficient1 Constant + 0.14191, !- Coefficient2 x + -0.00412, !- Coefficient3 x**2 + -0.01406, !- Coefficient4 y + 0.00083, !- Coefficient5 y**2 + -0.00043, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + ACHighStageCoolingCAPFTemp, !- Name + 1.36788, !- Coefficient1 Constant + -0.06257, !- Coefficient2 x + 0.0028, !- Coefficient3 x**2 + 0.00504, !- Coefficient4 y + -0.00007, !- Coefficient5 y**2 + -0.00045, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + ACHighStageCoolingEIRFTemp, !- Name + 0.04232, !- Coefficient1 Constant + 0.07892, !- Coefficient2 x + -0.00238, !- Coefficient3 x**2 + -0.00304, !- Coefficient4 y + 0.00053, !- Coefficient5 y**2 + -0.00032, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + Cool-Cap-fT, !- Name + 1.26489391, !- Coefficient1 Constant + -0.035054982, !- Coefficient2 x + 0.00211086, !- Coefficient3 x**2 + -0.001526886, !- Coefficient4 y + -0.0000070308, !- Coefficient5 y**2 + -0.0004691844, !- Coefficient6 x*y + -100, !- Minimum Value of x + 100, !- Maximum Value of x + -100, !- Minimum Value of y + 100; !- Maximum Value of y + +Curve:Biquadratic, + Cool-EIR-fT, !- Name + 0.38402403, !- Coefficient1 Constant + 0.029696724, !- Coefficient2 x + -0.0011329308, !- Coefficient3 x**2 + 0.006490674, !- Coefficient4 y + 0.0002626992, !- Coefficient5 y**2 + -0.0001207224, !- Coefficient6 x*y + -100, !- Minimum Value of x + 100, !- Maximum Value of x + -100, !- Minimum Value of y + 100; !- Maximum Value of y + +Curve:Biquadratic, + ZoneDehumidWaterRemoval, !- Name + -2.724878664080, !- Coefficient1 Constant + 0.100711983591, !- Coefficient2 x + -0.000990538285, !- Coefficient3 x**2 + 0.050053043874, !- Coefficient4 y + -0.000203629282, !- Coefficient5 y**2 + -0.000341750531, !- Coefficient6 x*y + 21.0, !- Minimum Value of x + 32.22, !- Maximum Value of x + 40.0, !- Minimum Value of y + 80.0; !- Maximum Value of y + +Curve:Biquadratic, + ZoneDehumidEnergyFactor, !- Name + -2.388319068955, !- Coefficient1 Constant + 0.093047739452, !- Coefficient2 x + -0.001369700327, !- Coefficient3 x**2 + 0.066533716758, !- Coefficient4 y + -0.000343198063, !- Coefficient5 y**2 + -0.000562490295, !- Coefficient6 x*y + 21.0, !- Minimum Value of x + 32.22, !- Maximum Value of x + 40.0, !- Minimum Value of y + 80.0; !- Maximum Value of y + + +!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLEDICTIONARY =========== + +Output:VariableDictionary,Regular; + +!- =========== ALL OBJECTS IN CLASS: OUTPUT:CONSTRUCTIONS =========== + +Output:Constructions,Constructions,Materials; + +!- =========== ALL OBJECTS IN CLASS: OUTPUT:TABLE:SUMMARYREPORTS =========== + + +Output:Table:SummaryReports, + InputVerificationandResultsSummary, !- Report 1 Name + EquipmentSummary, !- Report 2 Name + ClimaticDataSummary, !- Report 3 Name + EnvelopeSummary, !- Report 4 Name + AllSummary; !- Report 5 Name + + +!- =========== ALL OBJECTS IN CLASS: OUTPUT:TABLE:MONTHLY =========== + +Output:Table:Monthly, + FanSplit, !- Name + 3, !- Digits After Decimal + Air System Cooling Coil Total Cooling Energy, !- Variable or Meter 1 Name + HoursNonZero, !- Aggregation Type for Variable or Meter 1 + Air System Fan Electric Energy, !- Variable or Meter 2 Name + SumOrAverageDuringHoursShown, !- Aggregation Type for Variable or Meter 2 + Air System Heating Coil Total Heating Energy, !- Variable or Meter 3 Name + HoursNonZero, !- Aggregation Type for Variable or Meter 3 + Air System Fan Electric Energy, !- Variable or Meter 4 Name + SumOrAverageDuringHoursShown, !- Aggregation Type for Variable or Meter 4 + Air System Fan Electric Energy, !- Variable or Meter 5 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 5 + +Output:Table:Monthly, + CoilLoads, !- Name + 2, !- Digits After Decimal + Heating Coil Heating Rate , !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Heating Coil Air Heating Rate , !- Variable or Meter 2 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 2 + Cooling Coil Total Cooling Rate , !- Variable or Meter 3 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 3 + +Output:Table:Monthly, + Water Heater: Loads, !- Name + 2, !- Digits After Decimal + Water Heater Total Demand Rate , !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Water Heater Total Demand Energy , !- Variable or Meter 2 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 2 + Water Heater Heating Rate , !- Variable or Meter 3 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 3 + Water Heater Heating Energy , !- Variable or Meter 4 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 4 + +Output:Table:Monthly, + Heating and Cooling Loads, !- Name + 2, !- Digits After Decimal + Zone/Sys Sensible Cooling Energy , !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Zone/Sys Sensible Heating Energy , !- Variable or Meter 2 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 2 + +Output:Table:Monthly, + Lighting Loads, !- Name + 2, !- Digits After Decimal + Zone Lights Electric Consumption , !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Exterior Lights Electric Consumption , !- Variable or Meter 2 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 2 + +Output:Table:Monthly, + InternalGains, !- Name + 2, !- Digits After Decimal + Zone People Total Heat Gain, !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Zone Lights Total Heat Gain, !- Variable or Meter 2 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 2 + Zone Electric Equipment Total Heat Gain, !- Variable or Meter 3 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 3 + Zone Gas Equipment Total Heat Gain, !- Variable or Meter 4 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 4 + Zone Other Equipment Total Heat Gain, !- Variable or Meter 5 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 5 + Zone Total Internal Total Heat Gain, !- Variable or Meter 6 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 6 + + +!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:TABLE:STYLE =========== + +OutputControl:Table:Style, + CommaAndHTML, !- Column Separator + InchPound; !- Unit Conversion + + +!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLE =========== + +Output:Variable,*,Cooling Coil Sensible Cooling Rate,Hourly; +Output:Variable,*,Cooling Coil Latent Cooling Rate,Hourly; +Output:Variable,*,Cooling Coil Total Cooling Rate,Hourly; +Output:Variable,*,Heating Coil Heating Rate,Hourly; diff --git a/third_party/ssc/shared/CMakeLists.txt b/third_party/ssc/shared/CMakeLists.txt index 09ad25b32cf..171aa22c4be 100644 --- a/third_party/ssc/shared/CMakeLists.txt +++ b/third_party/ssc/shared/CMakeLists.txt @@ -31,6 +31,10 @@ set(SHARED_SRC # lib_battery_dispatch_manual.h lib_battery_lifetime.cpp lib_battery_lifetime.h + lib_battery_lifetime_calendar_cycle.cpp + lib_battery_lifetime_calendar_cycle.h + lib_battery_lifetime_nmc.cpp + lib_battery_lifetime_nmc.h lib_battery_powerflow.cpp lib_battery_powerflow.h lib_battery_voltage.cpp diff --git a/third_party/ssc/shared/lib_battery.cpp b/third_party/ssc/shared/lib_battery.cpp index fff5126ee05..c0b0262107c 100644 --- a/third_party/ssc/shared/lib_battery.cpp +++ b/third_party/ssc/shared/lib_battery.cpp @@ -30,14 +30,17 @@ Define Thermal Model */ void thermal_t::initialize() { - if (params->cap_vs_temp.nrows() < 2 || params->cap_vs_temp.ncols() != 2) { + if (!params->analytical_model && (params->cap_vs_temp.nrows() < 2 || params->cap_vs_temp.ncols() != 2)) { throw std::runtime_error("thermal_t: capacity vs temperature matrix must have two columns and at least two rows"); } - size_t n = params->cap_vs_temp.nrows(); - for (int i = 0; i < (int) n; i++) { - params->cap_vs_temp(i, 0); + if (!params->analytical_model) { + size_t n = params->cap_vs_temp.nrows(); + for (int i = 0; i < (int) n; i++) { + params->cap_vs_temp(i, 0); + } } + state = std::make_shared(); if (params->option == thermal_params::SCHEDULE) state->T_room = params->T_room_schedule[0]; @@ -48,7 +51,7 @@ void thermal_t::initialize() { state->T_batt_prev = state->T_room; state->heat_dissipated = 0; state->q_relative_thermal = 100; - dt_sec = params->dt_hour * 3600; + dt_sec = params->dt_hr * 3600; } thermal_t::thermal_t(double dt_hour, double mass, double surface_area, double R, double Cp, double h, @@ -65,7 +68,27 @@ thermal_t::thermal_t(double dt_hour, double mass, double surface_area, double R, params = std::shared_ptr(new thermal_params({dt_hour, mass, surface_area, Cp, h, R, c_vs_t})); params->option = thermal_params::VALUE; params->T_room_init = T_room_C; + params->analytical_model = false; + initialize(); +} + +thermal_t::thermal_t(double dt_hour, double mass, double surface_area, double R, double Cp, double h, + double T_room_C) { + params = std::shared_ptr(new thermal_params({dt_hour, mass, surface_area, Cp, h, R, util::matrix_t()})); + params->option = thermal_params::VALUE; + params->T_room_init = T_room_C; + params->analytical_model = true; + initialize(); +} + +thermal_t::thermal_t(double dt_hour, double mass, double surface_area, double R, double Cp, double h, + std::vector T_room_C) { + params = std::shared_ptr(new thermal_params({ dt_hour, mass, surface_area, Cp, h, R, util::matrix_t()})); + params->option = thermal_params::SCHEDULE; + params->T_room_schedule = std::move(T_room_C); + params->analytical_model = true; initialize(); + state->T_room = params->T_room_schedule[0]; } thermal_t::thermal_t(std::shared_ptr p) { @@ -101,7 +124,15 @@ void thermal_t::replace_battery(size_t lifetimeIndex) { } void thermal_t::calc_capacity() { - double percent = util::linterp_col(params->cap_vs_temp, 0, state->T_batt, 1); + double percent; + if (params->analytical_model) { + percent = 100. * exp(-(Ea_d0_1 / Rug) * (1 /( state->T_batt+273) - 1 / T_ref) - + (Ea_d0_2 / Rug) * pow((1 / (state->T_batt+273) - 1 / T_ref), 2)); + } + else + { + percent = util::linterp_col(params->cap_vs_temp, 0, state->T_batt, 1); + } if (std::isnan(percent) || percent < 0 || percent > 100) { percent = 100; @@ -167,7 +198,7 @@ void losses_t::initialize() { fail: throw std::runtime_error("losses_t error: loss arrays length must be 1 or 12 for monthly input mode"); } - else if (params->loss_choice == losses_params::SCHEDULE) { + else { if (params->schedule_loss.empty()) { throw std::runtime_error("losses_t error: loss length must be greater than 0 for schedule mode"); } @@ -322,7 +353,7 @@ battery_params::battery_params(const std::shared_ptr &cap, cons const std::shared_ptr &life, const std::shared_ptr &loss) { chem = -1; - dt_hour = 0.; + dt_hr = 0.; nominal_energy = 0; nominal_voltage = 0; capacity = cap; @@ -340,7 +371,7 @@ battery_params::battery_params(const battery_params& rhs) { battery_params &battery_params::operator=(const battery_params &rhs) { if (this != &rhs) { chem = rhs.chem; - dt_hour = rhs.dt_hour; + dt_hr = rhs.dt_hr; nominal_voltage = rhs.nominal_voltage; nominal_energy = rhs.nominal_energy; if (capacity) @@ -391,7 +422,10 @@ void battery_t::initialize() { } // lifetime - lifetime = std::unique_ptr(new lifetime_t(params->lifetime)); + if (params->lifetime->model_choice == lifetime_params::CALCYC) + lifetime = std::unique_ptr(new lifetime_calendar_cycle_t(params->lifetime)); + else + lifetime = std::unique_ptr(new lifetime_nmc_t(params->lifetime)); // thermal thermal = std::unique_ptr(new thermal_t(params->thermal)); @@ -408,11 +442,15 @@ battery_t::battery_t(double dt_hr, int chem, capacity_t *capacity_model, voltage voltage = std::unique_ptr(voltage_model); lifetime = std::unique_ptr(lifetime_model); thermal = std::unique_ptr(thermal_model); - losses = std::unique_ptr(losses_model); + if (losses_model == nullptr) { + losses = std::unique_ptr(new losses_t()); + } else { + losses = std::unique_ptr(losses_model); + } state = std::make_shared(capacity->state, voltage->state, thermal->state, lifetime->state, losses->state); params = std::make_shared(capacity->params, voltage->params, thermal->params, lifetime->params, losses->params); - params->dt_hour = dt_hr; + params->dt_hr = dt_hr; params->chem = chem; params->nominal_voltage = params->voltage->Vnom_default * params->voltage->num_cells_series; params->nominal_energy = params->nominal_voltage * params->voltage->num_strings * params->voltage->dynamic.Qfull * 1e-3; @@ -440,7 +478,7 @@ battery_t &battery_t::operator=(const battery_t& rhs) { capacity = std::unique_ptr(rhs.capacity->clone()); voltage = std::unique_ptr(rhs.voltage->clone()); thermal = std::unique_ptr(new thermal_t(*rhs.thermal)); - lifetime = std::unique_ptr(new lifetime_t(*rhs.lifetime)); + lifetime = std::unique_ptr(rhs.lifetime->clone()); losses = std::unique_ptr(new losses_t(*rhs.losses)); state = std::make_shared(capacity->state, voltage->state, thermal->state, lifetime->state, losses->state); *state->replacement = *rhs.state->replacement; @@ -536,6 +574,19 @@ double battery_t::calculate_max_discharge_kw(double *max_current_A) { return power_W / 1000.; } +void battery_t::ChangeTimestep(double dt_hr) { + if (dt_hr <= 0) + throw std::runtime_error("battery_t timestep must be greater than 0 hour"); + if (dt_hr > 1) + throw std::runtime_error("battery_t timestep must be less than or equal to 1 hour"); + params->dt_hr = dt_hr; + params->capacity->dt_hr = dt_hr; + params->voltage->dt_hr = dt_hr; + params->thermal->dt_hr = dt_hr; + thermal->dt_sec = dt_hr * 3600; + params->lifetime->dt_hr = dt_hr; +} + double battery_t::run(size_t lifetimeIndex, double &I) { // Temperature affects capacity, but capacity model can reduce current, which reduces temperature, need to iterate double I_initial = I; @@ -547,7 +598,8 @@ double battery_t::run(size_t lifetimeIndex, double &I) { runThermalModel(I, lifetimeIndex); runCapacityModel(I); - if (fabs(I - I_initial) / fabs(I_initial) > tolerance) { + double numerator = fabs(I - I_initial); + if ((numerator > 0.0) && (numerator / fabs(I_initial) > tolerance)) { *thermal->state = thermal_initial; *capacity->state = capacity_initial; I_initial = I; @@ -588,11 +640,11 @@ void battery_t::runCapacityModel(double &I) { // Need to first update capacity model to ensure temperature accounted for capacity->updateCapacityForThermal(thermal->capacity_percent()); } - capacity->updateCapacity(I, params->dt_hour); + capacity->updateCapacity(I, params->dt_hr); } void battery_t::runVoltageModel() { - voltage->updateVoltage(capacity->q0(), capacity->qmax(), capacity->I(), thermal->T_battery(), params->dt_hour); + voltage->updateVoltage(capacity->q0(), capacity->qmax(), capacity->I(), thermal->T_battery(), params->dt_hr); } void battery_t::runLifetimeModel(size_t lifetimeIndex) { @@ -604,7 +656,7 @@ void battery_t::runLifetimeModel(size_t lifetimeIndex) { void battery_t::runLossesModel(size_t idx) { if (idx > state->last_idx || idx == 0) { - losses->run_losses(idx, params->dt_hour, capacity->charge_operation()); + losses->run_losses(idx, params->dt_hr, capacity->charge_operation()); state->last_idx = idx; } } @@ -634,7 +686,7 @@ void battery_t::runReplacement(size_t year, size_t hour, size_t step) { if (replace) { state->replacement->n_replacements++; - state->replacement->indices_replaced.push_back(util::lifetimeIndex(year, hour, step, (size_t) (1 / params->dt_hour))); + state->replacement->indices_replaced.push_back(util::lifetimeIndex(year, hour, step, (size_t) (1 / params->dt_hr))); lifetime->replaceBattery(percent); capacity->replace_battery(percent); thermal->replace_battery(year); @@ -691,7 +743,7 @@ double battery_t::energy_available(double SOC_min) { double battery_t::power_to_fill(double SOC_max) { // in one time step - return (this->energy_to_fill(SOC_max) / params->dt_hour); + return (this->energy_to_fill(SOC_max) / params->dt_hr); } double battery_t::charge_total() { return capacity->q0(); } @@ -711,8 +763,8 @@ double battery_t::SOC() { return capacity->SOC(); } double battery_t::I() { return capacity->I(); } double battery_t::calculate_loss(double power, size_t lifetimeIndex) { - size_t indexYearOne = util::yearOneIndex(params->dt_hour, lifetimeIndex); - auto hourOfYear = (size_t)std::floor(indexYearOne * params->dt_hour); + size_t indexYearOne = util::yearOneIndex(params->dt_hr, lifetimeIndex); + auto hourOfYear = (size_t)std::floor(indexYearOne * params->dt_hr); size_t monthIndex = (size_t) util::month_of((double)(hourOfYear)) - 1; if (params->losses->loss_choice == losses_params::MONTHLY) { @@ -727,7 +779,7 @@ double battery_t::calculate_loss(double power, size_t lifetimeIndex) { } } - else if (params->losses->loss_choice == losses_params::SCHEDULE) { + else { return params->losses->schedule_loss[lifetimeIndex % params->losses->schedule_loss.size()]; } } diff --git a/third_party/ssc/shared/lib_battery.h b/third_party/ssc/shared/lib_battery.h index 55228dce1b9..f668eb5a375 100644 --- a/third_party/ssc/shared/lib_battery.h +++ b/third_party/ssc/shared/lib_battery.h @@ -33,7 +33,8 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "lib_util.h" #include "lib_battery_capacity.h" #include "lib_battery_voltage.h" -#include "lib_battery_lifetime.h" +#include "lib_battery_lifetime_calendar_cycle.h" +#include "lib_battery_lifetime_nmc.h" /** * \class thermal_t @@ -54,13 +55,15 @@ struct thermal_state { }; struct thermal_params { - double dt_hour; + double dt_hr; double mass; // [kg] double surface_area; // [m2] - exposed surface area double Cp; // [J/KgK] - battery specific heat capacity double h; // [W/m2/K] - general heat transfer coefficient double resistance; // [Ohm] - internal resistance + util::matrix_t cap_vs_temp; + bool analytical_model; // if true, do not use cap_vs_temp enum OPTIONS { VALUE, SCHEDULE @@ -74,12 +77,20 @@ struct thermal_params { class thermal_t { public: + // constructors for capacity as an entry from a cap_vs_temp table thermal_t(double dt_hour, double mass, double surface_area, double R, double Cp, double h, const util::matrix_t &c_vs_t, std::vector T_room_C); thermal_t(double dt_hour, double mass, double surface_area, double R, double Cp, double h, const util::matrix_t &c_vs_t, double T_room_C); + // constructors for capacity as an analytical function + thermal_t(double dt_hour, double mass, double surface_area, double R, double Cp, double h, + double T_room_C); + + thermal_t(double dt_hour, double mass, double surface_area, double R, double Cp, double h, + std::vector T_room_C); + explicit thermal_t(std::shared_ptr p); thermal_t(const thermal_t &rhs); @@ -108,6 +119,11 @@ class thermal_t { std::shared_ptr params; std::shared_ptr state; + double Ea_d0_1 = 4126.0; + double Ea_d0_2 = 9752000; + double Rug = 8.314; + double T_ref = 298.15; + private: void initialize(); @@ -133,7 +149,7 @@ struct losses_state { struct losses_params { enum OPTIONS { - MONTHLY, SCHEDULE, VALUE + MONTHLY, SCHEDULE }; int loss_choice; @@ -261,7 +277,7 @@ struct battery_params { LEAD_ACID, LITHIUM_ION, VANADIUM_REDOX, IRON_FLOW }; int chem; - double dt_hour; + double dt_hr; double nominal_energy; double nominal_voltage; std::shared_ptr capacity; @@ -287,11 +303,11 @@ struct battery_params { class battery_t { public: battery_t(double dt_hr, int chem, - capacity_t* capacity_model, - voltage_t* voltage_model, - lifetime_t* lifetime_model, - thermal_t* thermal_model, - losses_t* losses_model); + capacity_t* capacity_model, + voltage_t* voltage_model, + lifetime_t* lifetime_model, + thermal_t* thermal_model, + losses_t* losses_model); explicit battery_t(std::shared_ptr p); @@ -314,6 +330,9 @@ class battery_t { // Returns the % replacement if on a capacity schedule. Returns 0 for "none" or "calendar" double getReplacementPercent(); + // Change the timestep of the battery and its component models + void ChangeTimestep(double dt_hr); + // Run all for single time step, updating all component model states and return the dispatched power [kW] double run(size_t lifetimeIndex, double &I); diff --git a/third_party/ssc/shared/lib_battery_dispatch.cpp b/third_party/ssc/shared/lib_battery_dispatch.cpp index b1c71d9ed7f..2aa8bd739f1 100644 --- a/third_party/ssc/shared/lib_battery_dispatch.cpp +++ b/third_party/ssc/shared/lib_battery_dispatch.cpp @@ -840,7 +840,7 @@ bool byCost::operator() (grid_point const& a, grid_point const& b) bool byLowestMarginalCost::operator() (grid_point const& a, grid_point const& b) { - + if (fabs(a.MarginalCost() - b.MarginalCost()) < 1e-7) { if (fabs(a.Grid()) < 1e-7 || fabs(b.Grid()) < 1e-7) @@ -855,5 +855,5 @@ bool byLowestMarginalCost::operator() (grid_point const& a, grid_point const& b) } return a.MarginalCost() < b.MarginalCost(); - + } diff --git a/third_party/ssc/shared/lib_battery_dispatch_automatic_btm.cpp b/third_party/ssc/shared/lib_battery_dispatch_automatic_btm.cpp index 2ac57f61741..681e090ecd8 100644 --- a/third_party/ssc/shared/lib_battery_dispatch_automatic_btm.cpp +++ b/third_party/ssc/shared/lib_battery_dispatch_automatic_btm.cpp @@ -140,23 +140,22 @@ void dispatch_automatic_behind_the_meter_t::setup_rate_forecast() { // Process load and pv forecasts to get _monthly_ expected gen, load, and peak // Do we need new member variables, or can these just be passed off to UtilityRateForecast? - std::vector monthly_peaks; + std::vector monthly_gross_load; std::vector monthly_gen; - std::vector monthly_load; + std::vector monthly_net_load; // Load here is every step for the full analysis period. Load escalation has already been applied (TODO in compute modules) size_t num_recs = util::hours_per_year * _steps_per_hour * _nyears; size_t step = 0; size_t hour_of_year = 0; int curr_month = 1; - double load_during_month = 0.0; double gen_during_month = 0.0; double peak_during_month = 0.0; + double load_during_month = 0.0; double gen_during_month = 0.0; double gross_load_during_month = 0.0; size_t array_size = std::min(_P_pv_ac.size(), _P_load_ac.size()); // Cover smaller arrays to make testing easier for (size_t idx = 0; idx < num_recs && idx < array_size; idx++) { double grid_power = _P_pv_ac[idx] - _P_load_ac[idx]; - if (grid_power < peak_during_month) - { - peak_during_month = grid_power; - } + + gross_load_during_month += _P_load_ac[idx] * _dt_hour; + if (grid_power < 0) { @@ -180,16 +179,16 @@ void dispatch_automatic_behind_the_meter_t::setup_rate_forecast() { // Push back vectors // Note: this is a net-billing approach. To be accurate for net metering, we'd have to invoke tou periods here, this overestimates costs for NM - monthly_peaks.push_back(-1.0 * peak_during_month); - monthly_load.push_back(-1.0 * load_during_month); + monthly_gross_load.push_back(gross_load_during_month / util::hours_in_month(curr_month)); + monthly_net_load.push_back(-1.0 * load_during_month); monthly_gen.push_back(gen_during_month); - peak_during_month = 0.0; load_during_month = 0.0; gen_during_month = 0.0; + gross_load_during_month = 0.0; load_during_month = 0.0; gen_during_month = 0.0; curr_month < 12 ? curr_month++ : curr_month = 1; } } - rate_forecast = std::shared_ptr(new UtilityRateForecast(rate.get(), _steps_per_hour, monthly_load, monthly_gen, monthly_peaks, _nyears)); + rate_forecast = std::shared_ptr(new UtilityRateForecast(rate.get(), _steps_per_hour, monthly_net_load, monthly_gen, monthly_gross_load, _nyears)); rate_forecast->initializeMonth(0, 0); rate_forecast->copyTOUForecast(); } @@ -604,6 +603,7 @@ void dispatch_automatic_behind_the_meter_t::plan_dispatch_for_cost(dispatch_plan } } double remainingEnergy = E_max; + double powerAtMaxCost = 0; plan.lowestMarginalCost = sorted_grid[0].MarginalCost(); for (i = 0; i < (plan.dispatch_hours * _steps_per_hour) && (i < sorted_grid.size()); i++) { @@ -612,10 +612,17 @@ void dispatch_automatic_behind_the_meter_t::plan_dispatch_for_cost(dispatch_plan { double costPercent = costAtStep / costDuringDispatchHours; double desiredPower = remainingEnergy * costPercent / _dt_hour; + + // Prevent the wierd signals from demand charges from reducing dispatch (maybe fix this upstream in the future) + if (desiredPower < powerAtMaxCost && sorted_grid[i].Grid() >= powerAtMaxCost) { + desiredPower = powerAtMaxCost; + } + if (desiredPower > sorted_grid[i].Grid()) { desiredPower = sorted_grid[i].Grid(); } + // Account for discharging constraints assuming voltage is constant over forecast period check_power_restrictions(desiredPower); @@ -627,11 +634,24 @@ void dispatch_automatic_behind_the_meter_t::plan_dispatch_for_cost(dispatch_plan index = sorted_grid[i].Hour() * _steps_per_hour + sorted_grid[i].Step(); // Assumes we're always running this function on the hour plan.plannedDispatch[index] = desiredPower; + if (powerAtMaxCost == 0) { + powerAtMaxCost = desiredPower; + } + } + } + + for (i = 0; i < _steps_per_hour && (i < sorted_grid.size()); i++) + { + if (sorted_grid[i].Cost() > 0) + { if (sorted_grid[i].MarginalCost() < plan.lowestMarginalCost) { plan.lowestMarginalCost = sorted_grid[i].MarginalCost(); } } + else { + break; + } } // Aim to keep the battery at 50% diff --git a/third_party/ssc/shared/lib_battery_dispatch_automatic_btm.h b/third_party/ssc/shared/lib_battery_dispatch_automatic_btm.h index 649496aa7e7..3e6693c24ac 100644 --- a/third_party/ssc/shared/lib_battery_dispatch_automatic_btm.h +++ b/third_party/ssc/shared/lib_battery_dispatch_automatic_btm.h @@ -108,7 +108,7 @@ class dispatch_automatic_behind_the_meter_t : public dispatch_automatic_t double power_grid_target() override; /*! Return the calculated cost to cycle for battery outputs */ - double cost_to_cycle_per_kwh(); + double cost_to_cycle_per_kwh() override; enum BTM_TARGET_MODES {TARGET_SINGLE_MONTHLY, TARGET_TIME_SERIES}; diff --git a/third_party/ssc/shared/lib_battery_lifetime.cpp b/third_party/ssc/shared/lib_battery_lifetime.cpp index 15cbc09575c..6446519af73 100644 --- a/third_party/ssc/shared/lib_battery_lifetime.cpp +++ b/third_party/ssc/shared/lib_battery_lifetime.cpp @@ -9,7 +9,6 @@ and the following disclaimer. and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - 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 HOLDER, CONTRIBUTORS, UNITED STATES GOVERNMENT OR UNITED STATES @@ -20,597 +19,91 @@ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include - #include "lib_battery_lifetime.h" +#include "lib_battery_lifetime_calendar_cycle.h" +#include "lib_battery_lifetime_nmc.h" +#include -extern double tolerance; -extern double low_tolerance; - -bool cycle_state::operator==(const cycle_state &p) { - bool equal = (q_relative_cycle == p.q_relative_cycle); - equal &= (n_cycles == p.n_cycles); - equal &= (range == p.range); - equal &= (average_range == p.average_range); - equal &= (rainflow_Xlt == p.rainflow_Xlt); - equal &= (rainflow_Ylt == p.rainflow_Ylt); - equal &= (rainflow_jlt == p.rainflow_jlt); - equal &= (rainflow_peaks == p.rainflow_peaks); - return equal; -} - -void lifetime_cycle_t::initialize() { - if (params->cycling_matrix.nrows() < 3 || params->cycling_matrix.ncols() != 3) - throw std::runtime_error("lifetime_cycle_t error: Battery lifetime matrix must have three columns and at least three rows"); - state = std::make_shared(); - state->n_cycles = 0; - state->q_relative_cycle = bilinear(0., 0); - state->range = 0; - state->average_range = 0; - state->rainflow_jlt = 0; - state->rainflow_Xlt = 0; - state->rainflow_Ylt = 0; - state->rainflow_peaks.clear(); -} - -lifetime_cycle_t::lifetime_cycle_t(const util::matrix_t &batt_lifetime_matrix) { - params = std::make_shared(); - params->cycling_matrix = batt_lifetime_matrix; - initialize(); -} - -lifetime_cycle_t::lifetime_cycle_t(std::shared_ptr params_ptr) : - params(std::move(params_ptr)) { - initialize(); -} - -lifetime_cycle_t::lifetime_cycle_t(const lifetime_cycle_t &rhs) { - state = std::make_shared(*rhs.state); - operator=(rhs); -} - -lifetime_cycle_t &lifetime_cycle_t::operator=(const lifetime_cycle_t &rhs) { - if (this != &rhs) { - *state = *rhs.state; - *params = *rhs.params; - } - return *this; -} - -lifetime_cycle_t *lifetime_cycle_t::clone() { - return new lifetime_cycle_t(*this); -} - -double lifetime_cycle_t::estimateCycleDamage() { - // Initialize assuming 50% DOD - double DOD = 50; - if (state->average_range > 0) { - DOD = state->average_range; - } - return (bilinear(DOD, state->n_cycles + 1) - bilinear(DOD, state->n_cycles + 2)); -} - -double lifetime_cycle_t::runCycleLifetime(double DOD) { - rainflow(DOD); - - // return the effective capacity (Q_neg) - return state->q_relative_cycle; -} - -void lifetime_cycle_t::rainflow(double DOD) { - // initialize return code - int retCode = cycle_state::LT_GET_DATA; - - // Begin algorithm - state->rainflow_peaks.push_back(DOD); - bool atStepTwo = true; - - // Loop until break - while (atStepTwo) { - // Rainflow: Step 2: Form ranges X,Y - if (state->rainflow_jlt >= 2) - rainflow_ranges(); - else { - // Get more data (Step 1) - retCode = cycle_state::LT_GET_DATA; - break; - } - - // Rainflow: Step 3: Compare ranges - retCode = rainflow_compareRanges(); - - // We break to get more data, or if we are done with step 5 - if (retCode == cycle_state::LT_GET_DATA) - break; - } - - if (retCode == cycle_state::LT_GET_DATA) - state->rainflow_jlt++; -} - -void lifetime_cycle_t::rainflow_ranges() { - state->rainflow_Ylt = fabs(state->rainflow_peaks[state->rainflow_jlt - (size_t) 1] - state->rainflow_peaks[state->rainflow_jlt - (size_t) 2]); - state->rainflow_Xlt = fabs(state->rainflow_peaks[state->rainflow_jlt] - state->rainflow_peaks[state->rainflow_jlt - (size_t) 1]); -} - -void lifetime_cycle_t::rainflow_ranges_circular(int index) { - size_t end = state->rainflow_peaks.size() - 1; - if (index == 0) { - state->rainflow_Xlt = fabs(state->rainflow_peaks[0] - state->rainflow_peaks[end]); - state->rainflow_Ylt = fabs(state->rainflow_peaks[end] - state->rainflow_peaks[end - 1]); - } else if (index == 1) { - state->rainflow_Xlt = fabs(state->rainflow_peaks[1] - state->rainflow_peaks[0]); - state->rainflow_Ylt = fabs(state->rainflow_peaks[0] - state->rainflow_peaks[end]); - } else - rainflow_ranges(); -} - -int lifetime_cycle_t::rainflow_compareRanges() { - int retCode = cycle_state::LT_SUCCESS; - bool contained = true; - - // modified to disregard some of algorithm which doesn't work well - if (state->rainflow_Xlt < state->rainflow_Ylt) - retCode = cycle_state::LT_GET_DATA; - else if (state->rainflow_Xlt >= state->rainflow_Ylt) - contained = false; - - // Step 5: Count range Y, discard peak & valley of Y, go to Step 2 - if (!contained) { - state->range = state->rainflow_Ylt; - state->average_range = (state->average_range * state->n_cycles + state->range) / (state->n_cycles + (size_t) 1); - state->n_cycles++; - - // the capacity percent cannot increase - double dq = - bilinear(state->average_range, state->n_cycles) - bilinear(state->average_range, state->n_cycles + 1); - if (dq > 0) - state->q_relative_cycle -= dq; - - if (state->q_relative_cycle < 0) - state->q_relative_cycle = 0.; - - // discard peak & valley of Y - double save = state->rainflow_peaks[state->rainflow_jlt]; - state->rainflow_peaks.pop_back(); - state->rainflow_peaks.pop_back(); - state->rainflow_peaks.pop_back(); - state->rainflow_peaks.push_back(save); - state->rainflow_jlt -= 2; - // stay in while loop - retCode = cycle_state::LT_RERANGE; - } - - return retCode; -} - -void lifetime_cycle_t::replaceBattery(double replacement_percent) { - state->q_relative_cycle += replacement_percent; - state->q_relative_cycle = fmin(bilinear(0., 0), state->q_relative_cycle); - - // More work to figure out degradation of multiple-aged battery units - if (replacement_percent == 100) { - state->n_cycles = 0; - } - - state->rainflow_jlt = 0; - state->rainflow_Xlt = 0; - state->rainflow_Ylt = 0; - state->range = 0; - state->rainflow_peaks.clear(); -} - -int lifetime_cycle_t::cycles_elapsed() { return state->n_cycles; } - -double lifetime_cycle_t::cycle_range() { return state->range; } - -double lifetime_cycle_t::average_range() { return state->average_range; } - -double lifetime_cycle_t::capacity_percent() { return state->q_relative_cycle; } - -cycle_state lifetime_cycle_t::get_state() { return *state; } - -double lifetime_cycle_t::bilinear(double DOD, int cycle_number) { - /* - Work could be done to make this simpler - Current idea is to interpolate first along the C = f(n) curves for each DOD to get C_DOD_, C_DOD_+ - Then interpolate C_, C+ to get C at the DOD of interest - */ - - std::vector D_unique_vect; - std::vector C_n_low_vect; - std::vector D_high_vect; - std::vector C_n_high_vect; - std::vector low_indices; - std::vector high_indices; - double D = 0.; - size_t n = 0; - double C = 100; - size_t n_rows = params->cycling_matrix.nrows(); - - // get unique values of D - D_unique_vect.push_back(params->cycling_matrix.at(0, lifetime_params::DOD)); - for (size_t i = 0; i < n_rows; i++) { - bool contained = false; - for (int j = 0; j < (int) D_unique_vect.size(); j++) { - if (params->cycling_matrix.at(i, lifetime_params::DOD) == D_unique_vect[j]) { - contained = true; - break; - } - } - if (!contained) { - D_unique_vect.push_back(params->cycling_matrix.at(i, lifetime_params::DOD)); - } - } - n = D_unique_vect.size(); - - if (n > 1) { - // get where DOD is bracketed [D_lo, DOD, D_hi] - double D_lo = 0; - double D_hi = 100; - - for (size_t i = 0; i < n_rows; i++) { - D = params->cycling_matrix.at(i, lifetime_params::DOD); - if (D < DOD && D > D_lo) - D_lo = D; - else if (D >= DOD && D < D_hi) - D_hi = D; - } - - // Separate table into bins - double D_min = 100.; - double D_max = 0.; - - for (size_t i = 0; i < n_rows; i++) { - D = params->cycling_matrix.at(i, lifetime_params::DOD); - if (D == D_lo) - low_indices.push_back(i); - else if (D == D_hi) - high_indices.push_back(i); - - if (D < D_min) { D_min = D; } - else if (D > D_max) { D_max = D; } - } - - // if we're out of the bounds, just make the upper bound equal to the highest input - if (high_indices.empty()) { - for (size_t i = 0; i != n_rows; i++) { - if (params->cycling_matrix.at(i, lifetime_params::DOD) == D_max) - high_indices.push_back(i); - } - } - - size_t n_rows_lo = low_indices.size(); - size_t n_rows_hi = high_indices.size(); - size_t n_cols = 2; - - // If we aren't bounded, fill in values - if (n_rows_lo == 0) { - // Assumes 0% DOD - for (double i = 0; i < n_rows_hi; i++) { - C_n_low_vect.push_back(0. + i * 500); // cycles - C_n_low_vect.push_back(100.); // 100 % capacity - } - } - - if (n_rows_lo != 0) { - for (int i = 0; i < (int) n_rows_lo; i++) { - C_n_low_vect.push_back(params->cycling_matrix.at(low_indices[i], lifetime_params::CYCLE)); - C_n_low_vect.push_back(params->cycling_matrix.at(low_indices[i], lifetime_params::CAPACITY_CYCLE)); - } - } - if (n_rows_hi != 0) { - for (int i = 0; i < (int) n_rows_hi; i++) { - C_n_high_vect.push_back(params->cycling_matrix.at(high_indices[i], lifetime_params::CYCLE)); - C_n_high_vect.push_back(params->cycling_matrix.at(high_indices[i], lifetime_params::CAPACITY_CYCLE)); - } - } - n_rows_lo = C_n_low_vect.size() / n_cols; - n_rows_hi = C_n_high_vect.size() / n_cols; - - if (n_rows_lo == 0 || n_rows_hi == 0) { - // need a safeguard here - } - - util::matrix_t C_n_low(n_rows_lo, n_cols, &C_n_low_vect); - util::matrix_t C_n_high(n_rows_lo, n_cols, &C_n_high_vect); - - // Compute C(D_lo, n), C(D_hi, n) - double C_Dlo = util::linterp_col(C_n_low, 0, cycle_number, 1); - double C_Dhi = util::linterp_col(C_n_high, 0, cycle_number, 1); - - if (C_Dlo < 0.) - C_Dlo = 0.; - if (C_Dhi > 100.) - C_Dhi = 100.; - - // Interpolate to get C(D, n) - C = util::interpolate(D_lo, C_Dlo, D_hi, C_Dhi, DOD); - } - // just have one row, single level interpolation - else { - C = util::linterp_col(params->cycling_matrix, 1, cycle_number, 2); - } - - return C; -} - -/* -Lifetime Calendar Model -*/ - -bool calendar_state::operator==(const calendar_state &p) { - bool equal = (q_relative_calendar == p.q_relative_calendar); - equal &= (day_age_of_battery == p.day_age_of_battery); - equal &= (dq_relative_calendar_old == p.dq_relative_calendar_old); - return equal; -} - -void lifetime_calendar_t::initialize() { - state = std::make_shared(); - state->day_age_of_battery = 0; - state->q_relative_calendar = 100; - state->dq_relative_calendar_old = 0; - if (params->calendar_choice == lifetime_params::CALENDAR_CHOICE::MODEL) { - dt_day = params->dt_hour / util::hours_per_day; - state->q_relative_calendar = params->calendar_q0 * 100; - } - else if (params->calendar_choice == lifetime_params::CALENDAR_CHOICE::TABLE) { - if (params->calendar_matrix.nrows() < 2 || params->calendar_matrix.ncols() != 2) - throw std::runtime_error("lifetime_calendar_t error: Battery calendar lifetime matrix must have 2 columns and at least 2 rows"); - } -} - -lifetime_calendar_t::lifetime_calendar_t(double dt_hour, const util::matrix_t& calendar_matrix) { - params = std::make_shared(); - params->dt_hour = dt_hour; - params->calendar_choice = lifetime_params::CALENDAR_CHOICE::TABLE; - params->calendar_matrix = calendar_matrix; - - initialize(); -} - - -lifetime_calendar_t::lifetime_calendar_t(double dt_hour, double q0, double a, double b, double c) { - params = std::make_shared(); - params->dt_hour = dt_hour; - params->calendar_choice = lifetime_params::CALENDAR_CHOICE::MODEL; - params->calendar_q0 = q0; - params->calendar_a = a; - params->calendar_b = b; - params->calendar_c = c; - - initialize(); -} - -lifetime_calendar_t::lifetime_calendar_t(std::shared_ptr params_ptr) : - params(std::move(params_ptr)) { - initialize(); +lifetime_params::lifetime_params() { + model_choice = CALCYC; + cal_cyc = std::make_shared(); } -lifetime_calendar_t::lifetime_calendar_t(const lifetime_calendar_t &rhs) { - state = std::make_shared(*rhs.state); - params = std::make_shared(*rhs.params); - dt_day = rhs.dt_day; -} - -lifetime_calendar_t &lifetime_calendar_t::operator=(const lifetime_calendar_t &rhs) { +lifetime_params &lifetime_params::operator=(const lifetime_params &rhs) { if (this != &rhs) { - *params = *rhs.params; - *state = *rhs.state; - dt_day = rhs.dt_day; + model_choice = rhs.model_choice; + *cal_cyc = *rhs.cal_cyc; } return *this; } -lifetime_calendar_t *lifetime_calendar_t::clone() { - return new lifetime_calendar_t(*this); -} - -double lifetime_calendar_t::capacity_percent() { return state->q_relative_calendar; } - -calendar_state lifetime_calendar_t::get_state() { return *state; } - -double lifetime_calendar_t::runLifetimeCalendarModel(size_t lifetimeIndex, double T, double SOC) { - state->day_age_of_battery = (int)(lifetimeIndex / (util::hours_per_day / params->dt_hour)); - - if (params->calendar_choice == lifetime_params::CALENDAR_CHOICE::MODEL) - runLithiumIonModel(T, SOC); - else if (params->calendar_choice == lifetime_params::CALENDAR_CHOICE::TABLE) - runTableModel(); - else - state->q_relative_calendar = 100; - - return state->q_relative_calendar; -} - -void lifetime_calendar_t::runLithiumIonModel(double temp, double SOC) { - temp += 273.15; - SOC *= 0.01; - double k_cal = params->calendar_a * exp(params->calendar_b * (1. / temp - 1. / 296)) - * exp(params->calendar_c * (SOC / temp - 1. / 296)); - double dq_new; - if (state->dq_relative_calendar_old == 0) - dq_new = k_cal * sqrt(dt_day); - else - dq_new = (0.5 * pow(k_cal, 2) / state->dq_relative_calendar_old) * dt_day + state->dq_relative_calendar_old; - state->dq_relative_calendar_old = dq_new; - state->q_relative_calendar = (params->calendar_q0 - (dq_new)) * 100; -} - -void lifetime_calendar_t::runTableModel() { - size_t n_rows = params->calendar_matrix.nrows(); - size_t n = n_rows - 1; - size_t day_lo = 0; - size_t day_hi = (size_t) params->calendar_matrix.at(n, lifetime_params::DAYS); - double capacity_lo = 100; - double capacity_hi = 0; - - // interpolation mode - for (size_t i = 0; i != n_rows; i++) { - int day = (int)params->calendar_matrix.at(i, lifetime_params::DAYS); - double capacity = (int) params->calendar_matrix.at(i, lifetime_params::CAPACITY_CAL); - if (day <= state->day_age_of_battery) { - day_lo = day; - capacity_lo = capacity; - } - if (day > state->day_age_of_battery) { - day_hi = day; - capacity_hi = capacity; - break; - } - } - if (day_lo == day_hi) { - day_lo = (int) params->calendar_matrix.at(n - 1, lifetime_params::DAYS); - day_hi = (int) params->calendar_matrix.at(n, lifetime_params::DAYS); - capacity_lo = (int) params->calendar_matrix.at(n - 1, lifetime_params::CAPACITY_CAL); - capacity_hi = (int) params->calendar_matrix.at(n, lifetime_params::CAPACITY_CAL); - } - - state->q_relative_calendar = util::interpolate((double) day_lo, capacity_lo, (double) day_hi, capacity_hi, (double) state->day_age_of_battery); -} - -void lifetime_calendar_t::replaceBattery(double replacement_percent) { - state->day_age_of_battery = 0; - state->dq_relative_calendar_old = 0; - state->q_relative_calendar += replacement_percent; - if (params->calendar_choice == lifetime_params::CALENDAR_CHOICE::MODEL) - state->q_relative_calendar = fmin(params->calendar_q0 * 100, state->q_relative_calendar); - if (params->calendar_choice == lifetime_params::CALENDAR_CHOICE::TABLE) - state->q_relative_calendar = fmin(100, state->q_relative_calendar); -} - -/* -Define Lifetime Model -*/ - lifetime_state::lifetime_state(){ q_relative = 0; + n_cycles = 0; + range = 0; + average_range = 0; + day_age_of_battery = 0; cycle = std::make_shared(); calendar = std::make_shared(); + nmc_state = std::make_shared(); +} + +lifetime_state::lifetime_state(const lifetime_state &rhs) : + lifetime_state() { + operator=(rhs); } lifetime_state::lifetime_state(const std::shared_ptr& cyc, const std::shared_ptr& cal) { + q_relative = 0; + n_cycles = 0; + range = 0; + average_range = 0; + day_age_of_battery = 0; cycle = cyc; calendar = cal; q_relative = fmin(cycle->q_relative_cycle, calendar->q_relative_calendar); } +lifetime_state::lifetime_state(const std::shared_ptr& nmc) { + q_relative = 0; + n_cycles = 0; + range = 0; + average_range = 0; + day_age_of_battery = 0; + nmc_state = nmc; + q_relative = fmin(nmc->q_relative_li, nmc->q_relative_neg); +} + + lifetime_state &lifetime_state::operator=(const lifetime_state &rhs) { if (this != &rhs) { q_relative = rhs.q_relative; + n_cycles = rhs.n_cycles; + range = rhs.range; + average_range = rhs.average_range; + day_age_of_battery = rhs.day_age_of_battery; *cycle = *rhs.cycle; *calendar = *rhs.calendar; + *nmc_state = *rhs.nmc_state; } return *this; } -void lifetime_t::initialize() { - cycle_model = std::unique_ptr(new lifetime_cycle_t(params)); - calendar_model = std::unique_ptr(new lifetime_calendar_t(params)); - state = std::make_shared(cycle_model->state, calendar_model->state); - state->q_relative = fmin(state->cycle->q_relative_cycle, state->calendar->q_relative_calendar); -} - -lifetime_t::lifetime_t(const util::matrix_t &batt_lifetime_matrix, double dt_hour, - const util::matrix_t &calendar_matrix) { - params = std::make_shared(); - params->dt_hour = dt_hour; - params->cycling_matrix = batt_lifetime_matrix; - params->calendar_choice = lifetime_params::CALENDAR_CHOICE::TABLE; - params->calendar_matrix = calendar_matrix; - - initialize(); -} - -lifetime_t::lifetime_t(const util::matrix_t &batt_lifetime_matrix, double dt_hour, double q0, double a, double b, - double c) { - params = std::make_shared(); - params->dt_hour = dt_hour; - params->cycling_matrix = batt_lifetime_matrix; - params->calendar_choice = lifetime_params::CALENDAR_CHOICE::MODEL; - params->calendar_q0 = q0; - params->calendar_a = a; - params->calendar_b = b; - params->calendar_c = c; - - initialize(); -} - -lifetime_t::lifetime_t(const util::matrix_t &batt_lifetime_matrix, double dt_hour) { - params = std::make_shared(); - params->dt_hour = dt_hour; - params->cycling_matrix = batt_lifetime_matrix; - params->calendar_choice = lifetime_params::CALENDAR_CHOICE::NONE; - - initialize(); -} - -lifetime_t::lifetime_t(std::shared_ptr params_ptr): - params(std::move(params_ptr)) { - initialize(); -} - -lifetime_t::lifetime_t(const lifetime_t& rhs) { - state = std::make_shared(); - params = std::make_shared(); - operator=(rhs); +lifetime_t::lifetime_t(const lifetime_t &rhs) { + state = std::make_shared(*rhs.state); + params = std::make_shared(*rhs.params); } -lifetime_t& lifetime_t::operator=(const lifetime_t& rhs) { +lifetime_t &lifetime_t::operator=(const lifetime_t &rhs) { if (this != &rhs) { *params = *rhs.params; - calendar_model = std::unique_ptr(new lifetime_calendar_t(params)); - cycle_model = std::unique_ptr(new lifetime_cycle_t(params)); - state->q_relative = rhs.state->q_relative; - state->calendar = calendar_model->state; - state->cycle = cycle_model->state; + *state = *rhs.state; } return *this; } -lifetime_t *lifetime_t::clone() { - return new lifetime_t(*this); -} - double lifetime_t::capacity_percent() { return state->q_relative; } -double lifetime_t::capacity_percent_cycle() { return cycle_model->capacity_percent(); } - -double lifetime_t::capacity_percent_calendar() { return calendar_model->capacity_percent(); } - -void lifetime_t::runLifetimeModels(size_t lifetimeIndex, bool charge_changed, double prev_DOD, double DOD, double T_battery) { - double q_last = state->q_relative; - - if (q_last > 0) { - double q_cycle = cycle_model->capacity_percent(); - double q_calendar; - - if (charge_changed) - q_cycle = cycle_model->runCycleLifetime(prev_DOD); - else if (lifetimeIndex == 0) - q_cycle = cycle_model->runCycleLifetime(DOD); - - q_calendar = calendar_model->runLifetimeCalendarModel(lifetimeIndex, T_battery, 100. - DOD); - - // total capacity is min of cycle (Q_neg) and calendar (Q_li) capacity - state->q_relative = fmin(q_cycle, q_calendar); - } - state->q_relative = fmax(state->q_relative, 0); - - // capacity cannot increase - state->q_relative = fmin(state->q_relative, q_last); -} - -double lifetime_t::estimateCycleDamage() { - return cycle_model->estimateCycleDamage(); -} - -void lifetime_t::replaceBattery(double percent_to_replace) { - cycle_model->replaceBattery(percent_to_replace); - calendar_model->replaceBattery(percent_to_replace); - state->q_relative = fmin(cycle_model->capacity_percent(), calendar_model->capacity_percent()); -} lifetime_params lifetime_t::get_params() { return *params; } diff --git a/third_party/ssc/shared/lib_battery_lifetime.h b/third_party/ssc/shared/lib_battery_lifetime.h index 76e199032df..94860f41142 100644 --- a/third_party/ssc/shared/lib_battery_lifetime.h +++ b/third_party/ssc/shared/lib_battery_lifetime.h @@ -9,7 +9,6 @@ and the following disclaimer. and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - 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 HOLDER, CONTRIBUTORS, UNITED STATES GOVERNMENT OR UNITED STATES @@ -25,191 +24,52 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include -#include "lib_util.h" -/* -Lifetime cycling class. -*/ +struct calendar_cycle_params; struct lifetime_params { - // cycling - util::matrix_t cycling_matrix; - enum CYCLING_COLUMNS { - DOD, CYCLE, CAPACITY_CYCLE - }; - - // calendar - enum CALENDAR_CHOICE { - NONE, MODEL, TABLE - }; - int calendar_choice; - double dt_hour; - - // K. Smith: Life Prediction model coefficients - double calendar_q0; // unitless - double calendar_a; // 1/sqrt(day) - double calendar_b; // K - double calendar_c; // K - - // table entries - util::matrix_t calendar_matrix; - enum CALENDAR_COLUMNS { - DAYS, CAPACITY_CAL - }; - - friend std::ostream &operator<<(std::ostream &os, const lifetime_params &p); -}; - -struct cycle_state { - double q_relative_cycle; // % - int n_cycles; - double range; - double average_range; - enum RAINFLOW_CODES { - LT_SUCCESS, LT_GET_DATA, LT_RERANGE - }; - double rainflow_Xlt; - double rainflow_Ylt; - int rainflow_jlt; // last index in Peaks, i.e, if Peaks = [0,1], then jlt = 1 - std::vector rainflow_peaks; - - friend std::ostream &operator<<(std::ostream &os, const cycle_state &p); - - bool operator==(const cycle_state &p); -}; - -class lifetime_cycle_t { - -public: - /// Constructor for independent model, owning its state and params - lifetime_cycle_t(const util::matrix_t &batt_lifetime_matrix); - - /// Constructor as lifetime_t component - explicit lifetime_cycle_t(std::shared_ptr params_ptr); - - lifetime_cycle_t(const lifetime_cycle_t &rhs); - - lifetime_cycle_t &operator=(const lifetime_cycle_t &rhs); - - lifetime_cycle_t *clone(); - - /// return q, the effective capacity percent - double runCycleLifetime(double DOD); - - /// return hypothetical dq the average cycle - double estimateCycleDamage(); - - /// Return the relative capacity percentage of nominal (%) - double capacity_percent(); - - /// Run the rainflow counting algorithm at the current depth-of-discharge to determine cycle - void rainflow(double DOD); - - /// Replace or partially replace a batteyr - void replaceBattery(double replacement_percent); - - /// Return the total cycles elapse - int cycles_elapsed(); - - /// Return the range of the last cycle - double cycle_range(); - - /// Return the average cycle range - double average_range(); - - cycle_state get_state(); - -protected: - - void rainflow_ranges(); - - void rainflow_ranges_circular(int index); - - int rainflow_compareRanges(); - - /// Bilinear interpolation, given the depth-of-discharge and cycle number, return the capacity percent - double bilinear(double DOD, int cycle_number); - - std::shared_ptr state; - std::shared_ptr params; - -private: - void initialize(); - - friend class lifetime_t; -}; - -/* -Lifetime calendar model -*/ - -struct calendar_state { - double q_relative_calendar; // % - int day_age_of_battery; - double dq_relative_calendar_old; // (0 - 1) - - friend std::ostream &operator<<(std::ostream &os, const calendar_state &p); - - bool operator==(const calendar_state &p); -}; - -class lifetime_calendar_t { -public: - /// Constructors for independent models, owning its state and params - lifetime_calendar_t(double dt_hour, const util::matrix_t& calendar_matrix); - - explicit lifetime_calendar_t(double dt_hour, double q0= 1.02, double a= 2.66e-3, double b= -7280, double c= 930); - - /// Constructor as lifetime_t component - explicit lifetime_calendar_t(std::shared_ptr params_ptr); - - lifetime_calendar_t(const lifetime_calendar_t &rhs); - - lifetime_calendar_t &operator=(const lifetime_calendar_t &rhs); - - lifetime_calendar_t *clone(); - - /// Given the index of the simulation, the tempertature and SOC, return the effective capacity percent - double runLifetimeCalendarModel(size_t lifetimeIndex, double T, double SOC); - - /// Reset or augment the capacity - void replaceBattery(double replacement_percent); - - /// Return the relative capacity percentage of nominal (%) - double capacity_percent(); - - calendar_state get_state(); + double dt_hr; -protected: - void runLithiumIonModel(double temp_C, double SOC); - - void runTableModel(); + enum MODEL_CHOICE { + CALCYC, + NMCNREL // K. Smith: Life Prediction model coefficients + } model_choice; - double dt_day; + std::shared_ptr cal_cyc; - std::shared_ptr state; - std::shared_ptr params; + lifetime_params(); -private: - void initialize(); + lifetime_params &operator=(const lifetime_params &rhs); - friend class lifetime_t; + friend std::ostream &operator<<(std::ostream &os, const lifetime_params &p); }; -/* -Class to encapsulate multiple lifetime models, and linearly combined the associated degradation and handle replacements -*/ +struct cycle_state; +struct calendar_state; +struct lifetime_nmc_state; struct lifetime_state { double q_relative; // total lifetime relative capacity % + int n_cycles; + double range; + double average_range; + double day_age_of_battery; - std::shared_ptr cycle; + // CALCYC model state std::shared_ptr calendar; + std::shared_ptr cycle; + + // NREL NMC model state + std::shared_ptr nmc_state; lifetime_state(); + lifetime_state(const lifetime_state &rhs); + lifetime_state(const std::shared_ptr& cyc, const std::shared_ptr& cal); + lifetime_state(const std::shared_ptr& nmc); + lifetime_state &operator=(const lifetime_state &rhs); friend std::ostream &operator<<(std::ostream &os, const lifetime_state &p); @@ -217,42 +77,25 @@ struct lifetime_state { class lifetime_t { public: - /// Cycle with Calendar table - lifetime_t(const util::matrix_t &batt_lifetime_matrix, - double dt_hour, const util::matrix_t& calendar_matrix); - - /// Cycle with Calendar model - lifetime_t(const util::matrix_t &batt_lifetime_matrix, - double dt_hour, double q0, double a, double b, double c); - - /// Cycle with no Calendar - lifetime_t(const util::matrix_t &batt_lifetime_matrix, double dt_hour); + lifetime_t() = default; - explicit lifetime_t(std::shared_ptr params_ptr); + lifetime_t(const lifetime_t &rhs); - lifetime_t(const lifetime_t& rhs); + virtual lifetime_t &operator=(const lifetime_t &rhs); - lifetime_t &operator=(const lifetime_t& rhs); + virtual lifetime_t *clone() = 0; - virtual ~lifetime_t() {}; - - lifetime_t *clone(); + virtual ~lifetime_t() = default; /// Execute the lifetime models given the current lifetime run index, capacity model, and temperature - void runLifetimeModels(size_t lifetimeIndex, bool charge_changed, double prev_DOD, double DOD, double T_battery); - - double estimateCycleDamage(); - - void replaceBattery(double percent_to_replace); + virtual void runLifetimeModels(size_t lifetimeIndex, bool charge_changed, double prev_DOD, double DOD, double T_battery) = 0; /// Return the relative capacity percentage of nominal (%) double capacity_percent(); - /// Return the relative capacity percentage of nominal caused by cycle damage (%) - double capacity_percent_cycle(); + virtual double estimateCycleDamage() = 0; - /// Return the relative capacity percentage of nominal caused by calendar fade (%) - double capacity_percent_calendar(); + virtual void replaceBattery(double percent_to_replace) = 0; lifetime_params get_params(); @@ -263,12 +106,6 @@ class lifetime_t { std::shared_ptr state; std::shared_ptr params; - std::unique_ptr calendar_model; - std::unique_ptr cycle_model; - -private: - void initialize(); - friend class battery_t; }; diff --git a/third_party/ssc/shared/lib_battery_lifetime_calendar_cycle.cpp b/third_party/ssc/shared/lib_battery_lifetime_calendar_cycle.cpp new file mode 100644 index 00000000000..006ac515c64 --- /dev/null +++ b/third_party/ssc/shared/lib_battery_lifetime_calendar_cycle.cpp @@ -0,0 +1,590 @@ +/** +BSD-3-Clause +Copyright 2019 Alliance for Sustainable Energy, LLC +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 copyright holder nor the names of its contributors may be used to endorse +or promote products derived from this software without specific prior written permission. + +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 HOLDER, CONTRIBUTORS, UNITED STATES GOVERNMENT OR UNITED STATES +DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, 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. +*/ + +#include +#include + +#include "lib_battery_lifetime.h" +#include "lib_battery_lifetime_nmc.h" +#include "lib_battery_lifetime_calendar_cycle.h" + +extern double tolerance; +extern double low_tolerance; + +void lifetime_cycle_t::initialize() { + state->n_cycles = 0; + state->range = 0; + state->average_range = 0; + state->cycle->q_relative_cycle = bilinear(0., 0); + state->cycle->rainflow_jlt = 0; + state->cycle->rainflow_Xlt = 0; + state->cycle->rainflow_Ylt = 0; + state->cycle->rainflow_peaks.clear(); +} + +lifetime_cycle_t::lifetime_cycle_t(const util::matrix_t &batt_lifetime_matrix) { + params = std::make_shared(); + params->cal_cyc->cycling_matrix = batt_lifetime_matrix; + state = std::make_shared(); + initialize(); +} + +lifetime_cycle_t::lifetime_cycle_t(std::shared_ptr params_ptr) : + params(std::move(params_ptr)) { + state = std::make_shared(); + initialize(); +} + +lifetime_cycle_t::lifetime_cycle_t(std::shared_ptr params_ptr, std::shared_ptr state_ptr) : + params(std::move(params_ptr)), + state(std::move(state_ptr)){ + initialize(); +} + +lifetime_cycle_t::lifetime_cycle_t(const lifetime_cycle_t &rhs) { + state = std::make_shared(*rhs.state); + operator=(rhs); +} + +lifetime_cycle_t &lifetime_cycle_t::operator=(const lifetime_cycle_t &rhs) { + if (this != &rhs) { + *state = *rhs.state; + *params = *rhs.params; + } + return *this; +} + +lifetime_cycle_t *lifetime_cycle_t::clone() { + return new lifetime_cycle_t(*this); +} + +double lifetime_cycle_t::estimateCycleDamage() { + // Initialize assuming 50% DOD + double DOD = 50; + if (state->average_range > 0) { + DOD = state->average_range; + } + return (bilinear(DOD, state->n_cycles + 1) - bilinear(DOD, state->n_cycles + 2)); +} + +double lifetime_cycle_t::runCycleLifetime(double DOD) { + rainflow(DOD); + + // return the effective capacity (Q_neg) + return state->cycle->q_relative_cycle; +} + +void lifetime_cycle_t::rainflow(double DOD) { + // initialize return code + int retCode = cycle_state::LT_GET_DATA; + + // Begin algorithm + state->cycle->rainflow_peaks.push_back(DOD); + bool atStepTwo = true; + + // Loop until break + while (atStepTwo) { + // Rainflow: Step 2: Form ranges X,Y + if (state->cycle->rainflow_jlt >= 2) + rainflow_ranges(); + else { + // Get more data (Step 1) + retCode = cycle_state::LT_GET_DATA; + break; + } + + // Rainflow: Step 3: Compare ranges + retCode = rainflow_compareRanges(); + + // We break to get more data, or if we are done with step 5 + if (retCode == cycle_state::LT_GET_DATA) + break; + } + + if (retCode == cycle_state::LT_GET_DATA) + state->cycle->rainflow_jlt++; +} + +void lifetime_cycle_t::rainflow_ranges() { + state->cycle->rainflow_Ylt = fabs(state->cycle->rainflow_peaks[state->cycle->rainflow_jlt - (size_t) 1] - state->cycle->rainflow_peaks[state->cycle->rainflow_jlt - (size_t) 2]); + state->cycle->rainflow_Xlt = fabs(state->cycle->rainflow_peaks[state->cycle->rainflow_jlt] - state->cycle->rainflow_peaks[state->cycle->rainflow_jlt - (size_t) 1]); +} + +void lifetime_cycle_t::rainflow_ranges_circular(int index) { + size_t end = state->cycle->rainflow_peaks.size() - 1; + if (index == 0) { + state->cycle->rainflow_Xlt = fabs(state->cycle->rainflow_peaks[0] - state->cycle->rainflow_peaks[end]); + state->cycle->rainflow_Ylt = fabs(state->cycle->rainflow_peaks[end] - state->cycle->rainflow_peaks[end - 1]); + } else if (index == 1) { + state->cycle->rainflow_Xlt = fabs(state->cycle->rainflow_peaks[1] - state->cycle->rainflow_peaks[0]); + state->cycle->rainflow_Ylt = fabs(state->cycle->rainflow_peaks[0] - state->cycle->rainflow_peaks[end]); + } else + rainflow_ranges(); +} + +int lifetime_cycle_t::rainflow_compareRanges() { + int retCode = cycle_state::LT_SUCCESS; + bool contained = true; + + // modified to disregard some of algorithm which doesn't work well + if (state->cycle->rainflow_Xlt < state->cycle->rainflow_Ylt) + retCode = cycle_state::LT_GET_DATA; + else if (state->cycle->rainflow_Xlt >= state->cycle->rainflow_Ylt) + contained = false; + + // Step 5: Count range Y, discard peak & valley of Y, go to Step 2 + if (!contained) { + state->range = state->cycle->rainflow_Ylt; + state->average_range = (state->average_range * state->n_cycles + state->range) / (double)(state->n_cycles + (size_t) 1); + state->n_cycles++; + + // the capacity percent cannot increase + double dq = + bilinear(state->average_range, state->n_cycles) - bilinear(state->average_range, state->n_cycles + 1); + if (dq > 0) + state->cycle->q_relative_cycle -= dq; + + if (state->cycle->q_relative_cycle < 0) + state->cycle->q_relative_cycle = 0.; + + // discard peak & valley of Y + double save = state->cycle->rainflow_peaks[state->cycle->rainflow_jlt]; + state->cycle->rainflow_peaks.pop_back(); + state->cycle->rainflow_peaks.pop_back(); + state->cycle->rainflow_peaks.pop_back(); + state->cycle->rainflow_peaks.push_back(save); + state->cycle->rainflow_jlt -= 2; + // stay in while loop + retCode = cycle_state::LT_RERANGE; + } + + return retCode; +} + +void lifetime_cycle_t::replaceBattery(double replacement_percent) { + state->cycle->q_relative_cycle += replacement_percent; + state->cycle->q_relative_cycle = fmin(bilinear(0., 0), state->cycle->q_relative_cycle); + + // More work to figure out degradation of multiple-aged battery units + if (replacement_percent == 100) { + state->n_cycles = 0; + } + + state->cycle->rainflow_jlt = 0; + state->cycle->rainflow_Xlt = 0; + state->cycle->rainflow_Ylt = 0; + state->range = 0; + state->cycle->rainflow_peaks.clear(); +} + +int lifetime_cycle_t::cycles_elapsed() { return state->n_cycles; } + +double lifetime_cycle_t::cycle_range() { return state->range; } + +double lifetime_cycle_t::average_range() { return state->average_range; } + +double lifetime_cycle_t::capacity_percent() { return state->cycle->q_relative_cycle; } + +lifetime_state lifetime_cycle_t::get_state() { return *state; } + +double lifetime_cycle_t::bilinear(double DOD, int cycle_number) { + /* + Work could be done to make this simpler + Current idea is to interpolate first along the C = f(n) curves for each DOD to get C_DOD_, C_DOD_+ + Then interpolate C_, C+ to get C at the DOD of interest + */ + + std::vector D_unique_vect; + std::vector C_n_low_vect; + std::vector D_high_vect; + std::vector C_n_high_vect; + std::vector low_indices; + std::vector high_indices; + double D = 0.; + size_t n = 0; + double C = 100; + size_t n_rows = params->cal_cyc->cycling_matrix.nrows(); + + // get unique values of D + D_unique_vect.push_back(params->cal_cyc->cycling_matrix.at(0, calendar_cycle_params::DOD)); + for (size_t i = 0; i < n_rows; i++) { + bool contained = false; + for (double j : D_unique_vect) { + if (params->cal_cyc->cycling_matrix.at(i, calendar_cycle_params::DOD) == j) { + contained = true; + break; + } + } + if (!contained) { + D_unique_vect.push_back(params->cal_cyc->cycling_matrix.at(i, calendar_cycle_params::DOD)); + } + } + n = D_unique_vect.size(); + + if (n > 1) { + // get where DOD is bracketed [D_lo, DOD, D_hi] + double D_lo = 0; + double D_hi = 100; + + for (size_t i = 0; i < n_rows; i++) { + D = params->cal_cyc->cycling_matrix.at(i, calendar_cycle_params::DOD); + if (D < DOD && D > D_lo) + D_lo = D; + else if (D >= DOD && D < D_hi) + D_hi = D; + } + + // Separate table into bins + double D_min = 100.; + double D_max = 0.; + + for (size_t i = 0; i < n_rows; i++) { + D = params->cal_cyc->cycling_matrix.at(i, calendar_cycle_params::DOD); + if (D == D_lo) + low_indices.push_back(i); + else if (D == D_hi) + high_indices.push_back(i); + + if (D < D_min) { D_min = D; } + else if (D > D_max) { D_max = D; } + } + + // if we're out of the bounds, just make the upper bound equal to the highest input + if (high_indices.empty()) { + for (size_t i = 0; i != n_rows; i++) { + if (params->cal_cyc->cycling_matrix.at(i, calendar_cycle_params::DOD) == D_max) + high_indices.push_back(i); + } + } + + size_t n_rows_lo = low_indices.size(); + size_t n_rows_hi = high_indices.size(); + size_t n_cols = 2; + + // If we aren't bounded, fill in values + if (n_rows_lo == 0) { + // Assumes 0% DOD + for (int i = 0; i < n_rows_hi; i++) { + C_n_low_vect.push_back(0. + (double)i * 500); // cycles + C_n_low_vect.push_back(100.); // 100 % capacity + } + } + + if (n_rows_lo != 0) { + for (int i = 0; i < (int) n_rows_lo; i++) { + C_n_low_vect.push_back(params->cal_cyc->cycling_matrix.at(low_indices[i], calendar_cycle_params::CYCLE)); + C_n_low_vect.push_back(params->cal_cyc->cycling_matrix.at(low_indices[i], calendar_cycle_params::CAPACITY_CYCLE)); + } + } + if (n_rows_hi != 0) { + for (int i = 0; i < (int) n_rows_hi; i++) { + C_n_high_vect.push_back(params->cal_cyc->cycling_matrix.at(high_indices[i], calendar_cycle_params::CYCLE)); + C_n_high_vect.push_back(params->cal_cyc->cycling_matrix.at(high_indices[i], calendar_cycle_params::CAPACITY_CYCLE)); + } + } + n_rows_lo = C_n_low_vect.size() / n_cols; + n_rows_hi = C_n_high_vect.size() / n_cols; + + if (n_rows_lo == 0 || n_rows_hi == 0) { + // need a safeguard here + } + + util::matrix_t C_n_low(n_rows_lo, n_cols, &C_n_low_vect); + util::matrix_t C_n_high(n_rows_lo, n_cols, &C_n_high_vect); + + // Compute C(D_lo, n), C(D_hi, n) + double C_Dlo = util::linterp_col(C_n_low, 0, cycle_number, 1); + double C_Dhi = util::linterp_col(C_n_high, 0, cycle_number, 1); + + if (C_Dlo < 0.) + C_Dlo = 0.; + if (C_Dhi > 100.) + C_Dhi = 100.; + + // Interpolate to get C(D, n) + C = util::interpolate(D_lo, C_Dlo, D_hi, C_Dhi, DOD); + } + // just have one row, single level interpolation + else { + C = util::linterp_col(params->cal_cyc->cycling_matrix, 1, cycle_number, 2); + } + + return C; +} + +/* +Lifetime Calendar Model +*/ + +bool calendar_state::operator==(const calendar_state &p) const { + bool equal = (q_relative_calendar == p.q_relative_calendar); +// equal &= (day_age_of_battery == p.day_age_of_battery); + equal &= (dq_relative_calendar_old == p.dq_relative_calendar_old); + return equal; +} + +void lifetime_calendar_t::initialize() { + state->day_age_of_battery = 0; + state->calendar->q_relative_calendar = 100; + state->calendar->dq_relative_calendar_old = 0; + if (params->cal_cyc->calendar_choice == calendar_cycle_params::CALENDAR_CHOICE::MODEL) { + dt_day = params->dt_hr / util::hours_per_day; + state->calendar->q_relative_calendar = params->cal_cyc->calendar_q0 * 100; + } + else if (params->cal_cyc->calendar_choice == calendar_cycle_params::CALENDAR_CHOICE::TABLE) { + if (params->cal_cyc->calendar_matrix.nrows() < 2 || params->cal_cyc->calendar_matrix.ncols() != 2) + throw std::runtime_error("lifetime_calendar_t error: Battery calendar lifetime matrix must have 2 columns and at least 2 rows"); + } +} + +lifetime_calendar_t::lifetime_calendar_t(double dt_hour, const util::matrix_t& calendar_matrix) { + params = std::make_shared(); + params->dt_hr = dt_hour; + params->cal_cyc->calendar_choice = calendar_cycle_params::CALENDAR_CHOICE::TABLE; + params->cal_cyc->calendar_matrix = calendar_matrix; + state = std::make_shared(); + initialize(); +} + + +lifetime_calendar_t::lifetime_calendar_t(double dt_hour, double q0, double a, double b, double c) { + params = std::make_shared(); + params->dt_hr = dt_hour; + params->cal_cyc->calendar_choice = calendar_cycle_params::CALENDAR_CHOICE::MODEL; + params->cal_cyc->calendar_q0 = q0; + params->cal_cyc->calendar_a = a; + params->cal_cyc->calendar_b = b; + params->cal_cyc->calendar_c = c; + state = std::make_shared(); + initialize(); +} + +lifetime_calendar_t::lifetime_calendar_t(std::shared_ptr params_ptr, std::shared_ptr state_ptr) : + params(std::move(params_ptr)), + state(std::move(state_ptr)) +{ + initialize(); +} + +lifetime_calendar_t::lifetime_calendar_t(const lifetime_calendar_t &rhs) { + state = std::make_shared(*rhs.state); + params = std::make_shared(*rhs.params); + dt_day = rhs.dt_day; +} + +lifetime_calendar_t &lifetime_calendar_t::operator=(const lifetime_calendar_t &rhs) { + if (this != &rhs) { + *params = *rhs.params; + *state = *rhs.state; + dt_day = rhs.dt_day; + } + return *this; +} + +lifetime_calendar_t *lifetime_calendar_t::clone() { + return new lifetime_calendar_t(*this); +} + +double lifetime_calendar_t::capacity_percent() { return state->calendar->q_relative_calendar; } + +lifetime_state lifetime_calendar_t::get_state() { return *state; } + +double lifetime_calendar_t::runLifetimeCalendarModel(size_t lifetimeIndex, double T, double SOC) { + state->day_age_of_battery = lifetimeIndex / (util::hours_per_day / params->dt_hr); + + if (params->cal_cyc->calendar_choice == calendar_cycle_params::CALENDAR_CHOICE::MODEL) + runLithiumIonModel(T, SOC); + else if (params->cal_cyc->calendar_choice == calendar_cycle_params::CALENDAR_CHOICE::TABLE) + runTableModel(); + else + state->calendar->q_relative_calendar = 100; + + return state->calendar->q_relative_calendar; +} + +void lifetime_calendar_t::runLithiumIonModel(double temp, double SOC) { + temp += 273.15; + SOC *= 0.01; + double k_cal = params->cal_cyc->calendar_a * exp(params->cal_cyc->calendar_b * (1. / temp - 1. / 296)) + * exp(params->cal_cyc->calendar_c * (SOC / temp - 1. / 296)); + double dq_new; + if (state->calendar->dq_relative_calendar_old == 0) + dq_new = k_cal * sqrt(dt_day); + else + dq_new = (0.5 * pow(k_cal, 2) / state->calendar->dq_relative_calendar_old) * dt_day + state->calendar->dq_relative_calendar_old; + state->calendar->dq_relative_calendar_old = dq_new; + state->calendar->q_relative_calendar = (params->cal_cyc->calendar_q0 - (dq_new)) * 100; +} + +void lifetime_calendar_t::runTableModel() { + size_t n_rows = params->cal_cyc->calendar_matrix.nrows(); + size_t n = n_rows - 1; + size_t day_lo = 0; + auto day_hi = (size_t) params->cal_cyc->calendar_matrix.at(n, calendar_cycle_params::DAYS); + double capacity_lo = 100; + double capacity_hi = 0; + + // interpolation mode + for (size_t i = 0; i != n_rows; i++) { + int day = (int)params->cal_cyc->calendar_matrix.at(i, calendar_cycle_params::DAYS); + double capacity = (int) params->cal_cyc->calendar_matrix.at(i, calendar_cycle_params::CAPACITY_CAL); + if (day <= (int)state->day_age_of_battery) { + day_lo = day; + capacity_lo = capacity; + } + if (day > (int)state->day_age_of_battery) { + day_hi = day; + capacity_hi = capacity; + break; + } + } + if (day_lo == day_hi) { + day_lo = (int) params->cal_cyc->calendar_matrix.at(n - 1, calendar_cycle_params::DAYS); + day_hi = (int) params->cal_cyc->calendar_matrix.at(n, calendar_cycle_params::DAYS); + capacity_lo = (int) params->cal_cyc->calendar_matrix.at(n - 1, calendar_cycle_params::CAPACITY_CAL); + capacity_hi = (int) params->cal_cyc->calendar_matrix.at(n, calendar_cycle_params::CAPACITY_CAL); + } + + state->calendar->q_relative_calendar = util::interpolate((double) day_lo, capacity_lo, (double) day_hi, capacity_hi, state->day_age_of_battery); +} + +void lifetime_calendar_t::replaceBattery(double replacement_percent) { + state->day_age_of_battery = 0; + state->calendar->dq_relative_calendar_old = 0; + state->calendar->q_relative_calendar += replacement_percent; + if (params->cal_cyc->calendar_choice == calendar_cycle_params::MODEL) + state->calendar->q_relative_calendar = fmin(params->cal_cyc->calendar_q0 * 100, state->calendar->q_relative_calendar); + if (params->cal_cyc->calendar_choice == calendar_cycle_params::TABLE) + state->calendar->q_relative_calendar = fmin(100, state->calendar->q_relative_calendar); +} + +/* +Define Lifetime Model +*/ + +void lifetime_calendar_cycle_t::initialize() { + state = std::make_shared(); + if (params->cal_cyc->cycling_matrix.nrows() < 3 || params->cal_cyc->cycling_matrix.ncols() != 3) + throw std::runtime_error("lifetime_cycle_t error: Battery lifetime matrix must have three columns and at least three rows"); + cycle_model = std::unique_ptr(new lifetime_cycle_t(params, state)); + calendar_model = std::unique_ptr(new lifetime_calendar_t(params, state)); + state->q_relative = fmin(state->cycle->q_relative_cycle, state->calendar->q_relative_calendar); +} + +lifetime_calendar_cycle_t::lifetime_calendar_cycle_t(const util::matrix_t &batt_lifetime_matrix, double dt_hour, + const util::matrix_t &calendar_matrix) { + params = std::make_shared(); + params->model_choice = lifetime_params::CALCYC; + params->dt_hr = dt_hour; + params->cal_cyc->cycling_matrix = batt_lifetime_matrix; + params->cal_cyc->calendar_choice = calendar_cycle_params::CALENDAR_CHOICE::TABLE; + params->cal_cyc->calendar_matrix = calendar_matrix; + + initialize(); +} + +lifetime_calendar_cycle_t::lifetime_calendar_cycle_t(const util::matrix_t &batt_lifetime_matrix, double dt_hour, double q0, double a, double b, + double c) { + params = std::make_shared(); + params->model_choice = lifetime_params::CALCYC; + params->dt_hr = dt_hour; + params->cal_cyc->cycling_matrix = batt_lifetime_matrix; + params->cal_cyc->calendar_choice = calendar_cycle_params::CALENDAR_CHOICE::MODEL; + params->cal_cyc->calendar_q0 = q0; + params->cal_cyc->calendar_a = a; + params->cal_cyc->calendar_b = b; + params->cal_cyc->calendar_c = c; + + initialize(); +} + +lifetime_calendar_cycle_t::lifetime_calendar_cycle_t(const util::matrix_t &batt_lifetime_matrix, double dt_hour) { + params = std::make_shared(); + params->model_choice = lifetime_params::CALCYC;\ + params->dt_hr = dt_hour; + params->cal_cyc->cycling_matrix = batt_lifetime_matrix; + params->cal_cyc->calendar_choice = calendar_cycle_params::CALENDAR_CHOICE::NONE; + + initialize(); +} + +lifetime_calendar_cycle_t::lifetime_calendar_cycle_t(std::shared_ptr params_ptr) { + params = std::move(params_ptr); + initialize(); +} + +lifetime_calendar_cycle_t::lifetime_calendar_cycle_t(const lifetime_calendar_cycle_t& rhs) : + lifetime_t(rhs){ + operator=(rhs); +} + +lifetime_calendar_cycle_t& lifetime_calendar_cycle_t::operator=(const lifetime_calendar_cycle_t& rhs) { + if (this != &rhs) { + *params = *rhs.params; + *state = *rhs.state; + calendar_model = std::unique_ptr(new lifetime_calendar_t(params, state)); + cycle_model = std::unique_ptr(new lifetime_cycle_t(params, state)); + } + return *this; +} + +lifetime_calendar_cycle_t *lifetime_calendar_cycle_t::clone() { + return new lifetime_calendar_cycle_t(*this); +} + +double lifetime_calendar_cycle_t::capacity_percent_cycle() { return cycle_model->capacity_percent(); } + +double lifetime_calendar_cycle_t::capacity_percent_calendar() { return calendar_model->capacity_percent(); } + +void lifetime_calendar_cycle_t::runLifetimeModels(size_t lifetimeIndex, bool charge_changed, double prev_DOD, double DOD, double T_battery) { + double q_last = state->q_relative; + + if (q_last > 0) { + double q_cycle = cycle_model->capacity_percent(); + double q_calendar; + + if (charge_changed) + q_cycle = cycle_model->runCycleLifetime(prev_DOD); + else if (lifetimeIndex == 0) + q_cycle = cycle_model->runCycleLifetime(DOD); + + q_calendar = calendar_model->runLifetimeCalendarModel(lifetimeIndex, T_battery, 100. - DOD); + + // total capacity is min of cycle (Q_neg) and calendar (Q_li) capacity + state->q_relative = fmin(q_cycle, q_calendar); + } + state->q_relative = fmax(state->q_relative, 0); + + // capacity cannot increase + state->q_relative = fmin(state->q_relative, q_last); +} + +double lifetime_calendar_cycle_t::estimateCycleDamage() { + return cycle_model->estimateCycleDamage(); +} + +void lifetime_calendar_cycle_t::replaceBattery(double percent_to_replace) { + cycle_model->replaceBattery(percent_to_replace); + calendar_model->replaceBattery(percent_to_replace); + state->q_relative = fmin(cycle_model->capacity_percent(), calendar_model->capacity_percent()); +} + diff --git a/third_party/ssc/shared/lib_battery_lifetime_calendar_cycle.h b/third_party/ssc/shared/lib_battery_lifetime_calendar_cycle.h new file mode 100644 index 00000000000..2b2fe7630ff --- /dev/null +++ b/third_party/ssc/shared/lib_battery_lifetime_calendar_cycle.h @@ -0,0 +1,249 @@ +/** +BSD-3-Clause +Copyright 2019 Alliance for Sustainable Energy, LLC +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 copyright holder nor the names of its contributors may be used to endorse +or promote products derived from this software without specific prior written permission. + +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 HOLDER, CONTRIBUTORS, UNITED STATES GOVERNMENT OR UNITED STATES +DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, 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. +*/ + +#ifndef SAM_SIMULATION_CORE_LIB_BATTERY_LIFETIME_CALENDAR_CYCLE_H +#define SAM_SIMULATION_CORE_LIB_BATTERY_LIFETIME_CALENDAR_CYCLE_H + +#include + +#include "lib_util.h" +#include "lib_battery_lifetime.h" + + +/* +Lifetime cycling class. +*/ + +struct calendar_cycle_params { + // cycling + util::matrix_t cycling_matrix; + enum CYCLING_COLUMNS { + DOD, CYCLE, CAPACITY_CYCLE + }; + + // calendar + enum CALENDAR_CHOICE { + NONE, MODEL, TABLE + }; + int calendar_choice; + + double calendar_q0; // unitless + double calendar_a; // 1/sqrt(day) + double calendar_b; // K + double calendar_c; // K + + // table entries + util::matrix_t calendar_matrix; + enum CALENDAR_COLUMNS { + DAYS, CAPACITY_CAL + }; + + friend std::ostream &operator<<(std::ostream &os, const calendar_cycle_params &p); +}; + +struct cycle_state { + double q_relative_cycle; // % + enum RAINFLOW_CODES { + LT_SUCCESS, LT_GET_DATA, LT_RERANGE + }; + double rainflow_Xlt; + double rainflow_Ylt; + int rainflow_jlt; // last index in Peaks, i.e, if Peaks = [0,1], then jlt = 1 + std::vector rainflow_peaks; + + friend std::ostream &operator<<(std::ostream &os, const cycle_state &p); +}; + +class lifetime_cycle_t { + +public: + /// Constructor for independent model, owning its state and params + lifetime_cycle_t(const util::matrix_t &batt_lifetime_matrix); + + /// Constructor as lifetime_calendar_cycle_t component + explicit lifetime_cycle_t(std::shared_ptr params_ptr); + + lifetime_cycle_t(std::shared_ptr params_ptr, std::shared_ptr state_ptr); + + lifetime_cycle_t(const lifetime_cycle_t &rhs); + + lifetime_cycle_t &operator=(const lifetime_cycle_t &rhs); + + lifetime_cycle_t *clone(); + + /// return q, the effective capacity percent + double runCycleLifetime(double DOD); + + /// return hypothetical dq the average cycle + double estimateCycleDamage(); + + /// Return the relative capacity percentage of nominal (%) + double capacity_percent(); + + /// Run the rainflow counting algorithm at the current depth-of-discharge to determine cycle + void rainflow(double DOD); + + /// Replace or partially replace a batteyr + void replaceBattery(double replacement_percent); + + /// Return the total cycles elapse + int cycles_elapsed(); + + /// Return the range of the last cycle + double cycle_range(); + + /// Return the average cycle range + double average_range(); + + lifetime_state get_state(); + +protected: + + void rainflow_ranges(); + + void rainflow_ranges_circular(int index); + + int rainflow_compareRanges(); + + /// Bilinear interpolation, given the depth-of-discharge and cycle number, return the capacity percent + double bilinear(double DOD, int cycle_number); + + std::shared_ptr params; + + std::shared_ptr state; + +private: + void initialize(); + + friend class lifetime_t; +}; + +/* +Lifetime calendar model +*/ + +struct calendar_state { + double q_relative_calendar; // % + double dq_relative_calendar_old; // (0 - 1) +// int day_age_of_battery; + + friend std::ostream &operator<<(std::ostream &os, const calendar_state &p); + + bool operator==(const calendar_state &p) const; +}; + +class lifetime_calendar_t { +public: + /// Constructors for independent models, owning its state and params + lifetime_calendar_t(double dt_hour, const util::matrix_t& calendar_matrix); + + explicit lifetime_calendar_t(double dt_hour, double q0= 1.02, double a= 2.66e-3, double b= -7280, double c= 930); + + lifetime_calendar_t(std::shared_ptr params_ptr, std::shared_ptr state_ptr); + + lifetime_calendar_t(const lifetime_calendar_t &rhs); + + lifetime_calendar_t &operator=(const lifetime_calendar_t &rhs); + + lifetime_calendar_t *clone(); + + /// Given the index of the simulation, the tempertature and SOC, return the effective capacity percent + double runLifetimeCalendarModel(size_t lifetimeIndex, double T, double SOC); + + /// Reset or augment the capacity + void replaceBattery(double replacement_percent); + + /// Return the relative capacity percentage of nominal (%) + double capacity_percent(); + + lifetime_state get_state(); + +protected: + void runLithiumIonModel(double temp_C, double SOC); + + void runTableModel(); + + double dt_day; + + std::shared_ptr params; + + std::shared_ptr state; + +private: + void initialize(); + + friend class lifetime_calendar_cycle_t; +}; + +/* +Class to encapsulate multiple lifetime models, and linearly combined the associated degradation and handle replacements +*/ + +class lifetime_calendar_cycle_t : public lifetime_t { +public: + /// Cycle with Calendar table + lifetime_calendar_cycle_t(const util::matrix_t &batt_lifetime_matrix, + double dt_hour, const util::matrix_t& calendar_matrix); + + /// Cycle with Calendar model + lifetime_calendar_cycle_t(const util::matrix_t &batt_lifetime_matrix, + double dt_hour, double q0, double a, double b, double c); + + /// Cycle with no Calendar + lifetime_calendar_cycle_t(const util::matrix_t &batt_lifetime_matrix, double dt_hour); + + lifetime_calendar_cycle_t(std::shared_ptr params_ptr); + + lifetime_calendar_cycle_t(const lifetime_calendar_cycle_t& rhs); + + lifetime_calendar_cycle_t &operator=(const lifetime_calendar_cycle_t& rhs); + + lifetime_calendar_cycle_t *clone() override; + + ~lifetime_calendar_cycle_t() override = default; + + /// Execute the lifetime models given the current lifetime run index, capacity model, and temperature + void runLifetimeModels(size_t lifetimeIndex, bool charge_changed, double prev_DOD, double DOD, double T_battery) override; + + double estimateCycleDamage() override; + + void replaceBattery(double percent_to_replace) override; + + /// Return the relative capacity percentage of nominal caused by cycle damage (%) + double capacity_percent_cycle(); + + /// Return the relative capacity percentage of nominal caused by calendar fade (%) + double capacity_percent_calendar(); + +protected: + + std::unique_ptr calendar_model; + std::unique_ptr cycle_model; + +private: + void initialize(); + + friend class battery_t; +}; + + +#endif //SAM_SIMULATION_CORE_LIB_BATTERY_LIFETIME_CALENDAR_CYCLE_H diff --git a/third_party/ssc/shared/lib_battery_lifetime_nmc.cpp b/third_party/ssc/shared/lib_battery_lifetime_nmc.cpp new file mode 100644 index 00000000000..95ed1ad53e3 --- /dev/null +++ b/third_party/ssc/shared/lib_battery_lifetime_nmc.cpp @@ -0,0 +1,216 @@ +/** +BSD-3-Clause +Copyright 2019 Alliance for Sustainable Energy, LLC +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 copyright holder nor the names of its contributors may be used to endorse +or promote products derived from this software without specific prior written permission. +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 HOLDER, CONTRIBUTORS, UNITED STATES GOVERNMENT OR UNITED STATES +DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, 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. +*/ + + +#include "lib_battery_lifetime_calendar_cycle.h" +#include "lib_battery_lifetime_nmc.h" +#include "lib_battery_lifetime.h" +#include +#include + +void lifetime_nmc_t::initialize() { + + // cycle model for counting cycles only, no cycle-only degradation + cycle_model = std::unique_ptr(new lifetime_cycle_t(params, state)); + // do any state initialization here + state->q_relative = 100; + state->nmc_state->q_relative_li = 100; + state->nmc_state->q_relative_neg = 100; + state->nmc_state->dq_relative_li_old = 0; + state->nmc_state->dq_relative_neg_old = 0; + state->nmc_state->DOD_max = 50; + state->nmc_state->n_cycles_prev_day = 0; + state->nmc_state->b1_dt = 0; + state->nmc_state->b2_dt = 0; + state->nmc_state->b3_dt = 0; + state->nmc_state->c2_dt = 0; +} + +lifetime_nmc_t::lifetime_nmc_t(double dt_hr) { + params = std::make_shared(); + params->model_choice = lifetime_params::NMCNREL; + params->dt_hr = dt_hr; + state = std::make_shared(); + initialize(); +} + +lifetime_nmc_t::lifetime_nmc_t(std::shared_ptr params_pt) { + params = std::move(params_pt); + initialize(); +} + +lifetime_nmc_t::lifetime_nmc_t(const lifetime_nmc_t &rhs) : + lifetime_t(rhs){ + operator=(rhs); +} + +lifetime_nmc_t& lifetime_nmc_t::operator=(const lifetime_nmc_t& rhs) { + if (this != &rhs) { + *params = *rhs.params; + *state = *rhs.state; + } + return *this; +} + +lifetime_t * lifetime_nmc_t::clone() { + return new lifetime_nmc_t(*this); +} + +double lifetime_nmc_t::calculate_Uneg(double SOC) { + double Uneg; + if (SOC <= 0.1) + Uneg = ((0.2420 - 1.2868) / 0.1) * SOC + 1.2868; + else + Uneg = ((0.0859 - 0.2420) / 0.9) * (SOC - 0.1) + 0.2420; + return Uneg; +} + +double lifetime_nmc_t::calculate_Voc(double SOC) { + double Voc; + if (SOC <= 0.1) + Voc = ((0.4679) / 0.1) * SOC + 3; + else if (SOC <= 0.6) + Voc = ((3.747 - 3.4679) / 0.5) * (SOC - 0.1) + 3.4679; + else + Voc = ((4.1934 - 3.7469) / 0.4) * (SOC - 0.6) + 3.7469; + return Voc; +} + +double lifetime_nmc_t::runQli() { + double dt_day = 1; + int dn_cycles = state->n_cycles - state->nmc_state->n_cycles_prev_day; + double k_cal = 0; + //double b1 = std::accumulate(state->nmc_state->b1_dt.begin(), state->nmc_state->b1_dt.end(), 0); + double b1 = state->nmc_state->b1_dt; + double b2 = state->nmc_state->b2_dt; + double b3 = state->nmc_state->b3_dt; + + state->nmc_state->b1_dt = 0; + state->nmc_state->b2_dt = 0; + state->nmc_state->b3_dt = 0; + + if (state->day_age_of_battery > 0) + k_cal = (0.5 * b1) / (sqrt(state->day_age_of_battery)) + (b3 / tau_b3) * exp(-(state->day_age_of_battery / tau_b3)); + else + k_cal = 0; + + double dq_new; + if (state->nmc_state->dq_relative_li_old == 0) + dq_new = k_cal * dt_day + b2 * dn_cycles; + else + dq_new = k_cal * dt_day + b2 * dn_cycles + state->nmc_state->dq_relative_li_old; + state->nmc_state->dq_relative_li_old = dq_new; + state->nmc_state->q_relative_li = (1.07 - (dq_new)) * 100; + return state->nmc_state->q_relative_li; +} + +double lifetime_nmc_t::runQneg(double T_battery, double SOC) { + + int dn_cycles = state->n_cycles - state->nmc_state->n_cycles_prev_day; + + double c2 = state->nmc_state->c2_dt; + state->nmc_state->c2_dt = 0; + + double dq_new; + if (state->nmc_state->dq_relative_neg_old == 0) + dq_new = 1 - sqrt(1 - 2 * (c2 / c0_ref) * dn_cycles); + else + dq_new = 1 - sqrt(1 - 2 * (c2 / c0_ref) * dn_cycles) + state->nmc_state->dq_relative_neg_old; + + state->nmc_state->dq_relative_neg_old = dq_new; + + state->nmc_state->q_relative_neg = (1 - (dq_new)) * 100; + + //return state->nmc_state->q_relative_neg; + return 100; +} + +void lifetime_nmc_t::runLifetimeModels(size_t lifetimeIndex, bool charge_changed, double prev_DOD, double DOD, + double T_battery) { + double q_last = state->q_relative; + + // update day age of battery + size_t day_age_of_battery_old = (size_t)(state->day_age_of_battery); + state->day_age_of_battery += params->dt_hr / (double)util::hours_per_day; + auto ts_per_day = (size_t)(util::hours_per_day / params->dt_hr); + + // convert battery temperature to Kelvin + T_battery += 273; + if (charge_changed) + cycle_model->rainflow(prev_DOD); + + // update DOD_max if DOD > old DOD_max + if (DOD > state->nmc_state->DOD_max) + state->nmc_state->DOD_max = DOD; + + //compute open circuit and negative electrode voltage as function of SOC + double SOC = 0.01 * (100 - DOD); + double DOD_max = state->nmc_state->DOD_max * 0.01; + double U_neg = calculate_Uneg(SOC); + double V_oc = calculate_Voc(SOC); + + // compute lifetime degradation coefficients for current time step, + //multiply by timestep in days and populate corresponding vectors + double dt_day = (1. / 24) * params->dt_hr; + double b1_dt_el = b1_ref * exp(-(Ea_b_1 / Rug) * (1. / T_battery - 1. / T_ref)) + * exp((alpha_a_b1 * F / Rug) * (U_neg / T_battery - U_ref / T_ref)) + * exp(gamma * pow(DOD_max, beta_b1)) * dt_day; + double b2_dt_el = b2_ref * exp(-(Ea_b_2 / Rug) * (1. / T_battery - 1. / T_ref)) * dt_day; + double b3_dt_el = b3_ref * exp(-(Ea_b_3 / Rug) * (1. / T_battery - 1. / T_ref)) + * exp((alpha_a_b3 * F / Rug) * (V_oc / T_battery - V_ref / T_ref)) + * (1 + theta * DOD_max); + state->nmc_state->b1_dt += b1_dt_el; + state->nmc_state->b2_dt += b2_dt_el; + state->nmc_state->b3_dt += b3_dt_el; + + //computations for q_neg + double c2_dt_el = c2_ref * exp(-(Ea_c_2 / Rug) * (1. / T_battery - 1. / T_ref)) + * pow(0.01 * DOD, beta_c2); + state->nmc_state->c2_dt += c2_dt_el; + + //Run capacity degradation model after every 24 hours + if (lifetimeIndex % ts_per_day == 23) { + state->nmc_state->q_relative_li = runQli(); + state->nmc_state->q_relative_neg = runQneg(T_battery, SOC); + state->q_relative = fmin(state->nmc_state->q_relative_li, state->nmc_state->q_relative_neg); + state->nmc_state->n_cycles_prev_day = state->n_cycles; +// printf("%zu, %f, %zu, %f, %f, %f\n", lifetimeIndex, state->day_age_of_battery, (size_t)(day_age_of_battery_old), state->nmc_state->q_relative_li, state->nmc_state->q_relative_neg, state->q_relative); + } +// else +// printf("%zu, %f, %zu, %zu\n", lifetimeIndex, state->day_age_of_battery, (size_t)state->day_age_of_battery, day_age_of_battery_old); + + state->q_relative = fmin(state->q_relative, q_last); +} + +double lifetime_nmc_t::estimateCycleDamage() { + return 0; +} + +void lifetime_nmc_t::replaceBattery(double percent_to_replace) { + state->day_age_of_battery = 0; + state->nmc_state->dq_relative_li_old = 0; + state->nmc_state->dq_relative_neg_old = 0; + state->nmc_state->q_relative_li += percent_to_replace; + state->nmc_state->q_relative_neg += percent_to_replace; + state->nmc_state->q_relative_li = fmin(100, state->nmc_state->q_relative_li); + state->nmc_state->q_relative_neg = fmin(100, state->nmc_state->q_relative_neg); + state->q_relative = fmin(state->nmc_state->q_relative_li, state->nmc_state->q_relative_neg); +} diff --git a/third_party/ssc/shared/lib_battery_lifetime_nmc.h b/third_party/ssc/shared/lib_battery_lifetime_nmc.h new file mode 100644 index 00000000000..eb92977e92f --- /dev/null +++ b/third_party/ssc/shared/lib_battery_lifetime_nmc.h @@ -0,0 +1,115 @@ +/** +BSD-3-Clause +Copyright 2019 Alliance for Sustainable Energy, LLC +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 copyright holder nor the names of its contributors may be used to endorse +or promote products derived from this software without specific prior written permission. +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 HOLDER, CONTRIBUTORS, UNITED STATES GOVERNMENT OR UNITED STATES +DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, 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. +*/ + +#ifndef SAM_SIMULATION_CORE_LIB_BATTERY_LIFETIME_NMC_H +#define SAM_SIMULATION_CORE_LIB_BATTERY_LIFETIME_NMC_H + +#include + +#include "lib_util.h" +#include "lib_battery_lifetime_calendar_cycle.h" + +struct lifetime_nmc_state { + double q_relative_li; // %, SEI degradation + double q_relative_neg; // %, cycle degradation + double dq_relative_li_old; + double dq_relative_neg_old; + double DOD_max; + int n_cycles_prev_day; + + // for complex cycling of battery, b1 = summation of b1_dt * dt_day over a day + // lifetime capacity updated after 24 hours elapse. + + double b1_dt; + double b2_dt; + double b3_dt; + double c2_dt; + + friend std::ostream& operator<<(std::ostream& os, const lifetime_nmc_state& p); +}; + +class lifetime_nmc_t : public lifetime_t { +public: + lifetime_nmc_t(double dt_hr); + + lifetime_nmc_t(std::shared_ptr params_pt); + + lifetime_nmc_t(const lifetime_nmc_t& rhs); + + lifetime_nmc_t &operator=(const lifetime_nmc_t& rhs); + + lifetime_t *clone() override; + + /// Execute the lifetime models given the current lifetime run index, capacity model, and temperature + void runLifetimeModels(size_t lifetimeIndex, bool charge_changed, double prev_DOD, double DOD, double T_battery) override; + + double estimateCycleDamage() override; + + void replaceBattery(double percent_to_replace) override; + + /// Calculate negative electrode voltage from SOC + static double calculate_Uneg(double SOC); + + /// Calculate open circuit voltage from SOC + static double calculate_Voc(double SOC); + +protected: + + std::unique_ptr cycle_model; + + /// Capacity degradation due to SEI + double runQli(); + + /// Capacity degradation due to cycles + double runQneg(double T_battery, double SOC); + + void initialize(); + + /// NMC Kandler Smith parameters + double Ea_d0_1 = 4126.0; + double b1_ref = 0.003503; + double Ea_b_1 = 35392.; + double Rug = 8.314; + double T_ref = 298.15; + double alpha_a_b1 = -1; + double F = 96485; + double U_ref = 0.08; + double gamma = 2.472; + double beta_b1 = 2.157; + + double b2_ref = 0.00001541; + double Ea_b_2 = -42800.; + + double b3_ref = 0.003503; + double Ea_b_3 = 42800.; + double alpha_a_b3 = 0.0066; + double V_ref = 3.7; + double theta = 0.135; + double tau_b3 = 5; + + double c0_ref = 75.1; + double c2_ref = 0.0039193; + double Ea_c_2 = -48260; + double beta_c2 = 4.54; +}; + + +#endif //SAM_SIMULATION_CORE_LIB_BATTERY_LIFETIME_NMC_H diff --git a/third_party/ssc/shared/lib_battery_voltage.cpp b/third_party/ssc/shared/lib_battery_voltage.cpp index cff0e1dbde5..44fb7ed8f58 100644 --- a/third_party/ssc/shared/lib_battery_voltage.cpp +++ b/third_party/ssc/shared/lib_battery_voltage.cpp @@ -342,7 +342,7 @@ void voltage_dynamic_t::parameter_compute() { } void voltage_dynamic_t::set_initial_SOC(double init_soc) { - updateVoltage(init_soc * 0.01 * params->dynamic.Qfull, params->dynamic.Qfull, 0, 25, params->dt_hr); + updateVoltage(init_soc * 0.01 * params->dynamic.Qfull * params->num_strings, params->dynamic.Qfull * params->num_strings, 0, 25, params->dt_hr); } // everything in here is on a per-cell basis diff --git a/third_party/ssc/shared/lib_battery_voltage.h b/third_party/ssc/shared/lib_battery_voltage.h index a13308ceb71..a91db3084dd 100644 --- a/third_party/ssc/shared/lib_battery_voltage.h +++ b/third_party/ssc/shared/lib_battery_voltage.h @@ -188,8 +188,9 @@ class voltage_dynamic_t : public voltage_t { double calculate_voltage_for_current(double I, double q, double qmax, double T_k) override; - void updateVoltage(double q, double qmax, double I, double temp, double dt) override; - + + void updateVoltage(double q, double qmax, double I, double temp, double dt) override; //updates battery voltage based on system capacity (Ah), system maximum capacity (Ah), current (A), temperature (C), and time step (hr) + protected: double _A; diff --git a/third_party/ssc/shared/lib_irradproc.cpp b/third_party/ssc/shared/lib_irradproc.cpp index 52768a77041..52c687c77b6 100644 --- a/third_party/ssc/shared/lib_irradproc.cpp +++ b/third_party/ssc/shared/lib_irradproc.cpp @@ -995,7 +995,7 @@ double atmospheric_refraction_correction(double pressure, double temperature, double atmos_refract, double e0) //atmospheric refraction correction (degrees) { double del_e = 0; - int SUN_RADIUS = 0.26667; + double SUN_RADIUS = 0.26667; if (e0 >= -1 * (SUN_RADIUS + atmos_refract)) del_e = (pressure / 1010.0) * (283.0 / (273.0 + temperature)) * 1.02 / (60.0 * tan(DTOR * (e0 + 10.3 / (e0 + 5.11)))); diff --git a/third_party/ssc/shared/lib_util.h b/third_party/ssc/shared/lib_util.h index 9955b3fdc3b..d31c59294a1 100644 --- a/third_party/ssc/shared/lib_util.h +++ b/third_party/ssc/shared/lib_util.h @@ -816,7 +816,7 @@ namespace util bool translate_schedule(int tod[8760], const matrix_t &wkday, const matrix_t &wkend, int min_val, int max_val); std::vector frequency_table(double* values, size_t n_vals, double bin_width); -}; +} #endif diff --git a/third_party/ssc/shared/lib_utility_rate.cpp b/third_party/ssc/shared/lib_utility_rate.cpp index 845059252a7..daf0abc85a2 100644 --- a/third_party/ssc/shared/lib_utility_rate.cpp +++ b/third_party/ssc/shared/lib_utility_rate.cpp @@ -130,7 +130,7 @@ size_t UtilityRateCalculator::getEnergyPeriod(size_t hourOfYear) return period; } -UtilityRateForecast::UtilityRateForecast(rate_data* util_rate, size_t stepsPerHour, const std::vector& monthly_load_forecast, const std::vector& monthly_gen_forecast, const std::vector& monthly_peak_forecast, size_t analysis_period) : +UtilityRateForecast::UtilityRateForecast(rate_data* util_rate, size_t stepsPerHour, const std::vector& monthly_load_forecast, const std::vector& monthly_gen_forecast, const std::vector& monthly_avg_load_forecast, size_t analysis_period) : current_composite_buy_rates(), current_composite_sell_rates(), next_composite_buy_rates(), @@ -143,7 +143,7 @@ UtilityRateForecast::UtilityRateForecast(rate_data* util_rate, size_t stepsPerHo rate = std::shared_ptr(new rate_data(*util_rate)); m_monthly_load_forecast = monthly_load_forecast; m_monthly_gen_forecast = monthly_gen_forecast; - m_monthly_peak_forecast = monthly_peak_forecast; + m_monthly_avg_load_forecast = monthly_avg_load_forecast; nyears = analysis_period; } @@ -153,7 +153,7 @@ UtilityRateForecast::UtilityRateForecast(UtilityRateForecast& tmp) : last_step(tmp.last_step), m_monthly_load_forecast(tmp.m_monthly_load_forecast), m_monthly_gen_forecast(tmp.m_monthly_gen_forecast), - m_monthly_peak_forecast(tmp.m_monthly_peak_forecast), + m_monthly_avg_load_forecast(tmp.m_monthly_avg_load_forecast), current_composite_buy_rates(tmp.current_composite_buy_rates), current_composite_sell_rates(tmp.current_composite_sell_rates), next_composite_buy_rates(tmp.next_composite_buy_rates), @@ -198,10 +198,7 @@ double UtilityRateForecast::forecastCost(std::vector& predicted_loads, s if (crossing_month) { initializeMonth(month_at_end, year_at_end); - if (n > 1) - { - previousDemandCharge += rate->get_demand_charge(month_at_end, year_at_end); - } + previousDemandCharge += rate->get_demand_charge(month_at_end, year_at_end); } double newEnergyCharge = 0; @@ -248,9 +245,20 @@ double UtilityRateForecast::forecastCost(std::vector& predicted_loads, s } } - // Compute new peak cost - may need to run two months - double newDemandCharge = rate->get_demand_charge(month, year); - if (crossing_month && n > 1) + // Compute new peak cost - may need to run two months + double newDemandCharge = rate->get_demand_charge(month, year); + // If forecast length is 1, restartMonth won't be triggered on the next forecast. Trigger it now + if (crossing_month && n == 1) + { + if (rate->enable_nm) + { + newEnergyCharge += getEnergyChargeNetMetering(month, current_composite_buy_rates, current_composite_sell_rates); + } + restartMonth(month, month_at_end, year_at_end); + copyTOUForecast(); + } + + if (crossing_month) { newDemandCharge += rate->get_demand_charge(month_at_end, year_at_end); if (rate->enable_nm) @@ -263,13 +271,6 @@ double UtilityRateForecast::forecastCost(std::vector& predicted_loads, s newEnergyCharge += getEnergyChargeNetMetering(month, current_composite_buy_rates, current_composite_sell_rates); } - // If forecast length is 1, restartMonth won't be triggered on the next forecast. Trigger it now - if (crossing_month && n == 1) - { - restartMonth(month, month_at_end, year_at_end); - copyTOUForecast(); - } - cost += newDemandCharge + newEnergyCharge - previousDemandCharge - previousEnergyCharge; return cost; @@ -381,7 +382,8 @@ void UtilityRateForecast::initializeMonth(int month, size_t year) rate->init_dc_peak_vectors(month); compute_next_composite_tou(month, year); - double avg_load = m_monthly_load_forecast[year * 12 + month] / util::hours_in_month(month + (int) 1); + // Ignore any peak charges lower than the average gross load - this prevents the price signal from showing demand charges on the first hour of each month when the load is not really a peak + double avg_load = m_monthly_avg_load_forecast[year * 12 + month]; ur_month& curr_month = rate->m_month[month]; curr_month.dc_flat_peak = avg_load; @@ -405,7 +407,6 @@ void UtilityRateForecast::restartMonth(int prevMonth, int currentMonth, size_t y { ur_month& prev_month = rate->m_month[prevMonth]; ur_month& curr_month = rate->m_month[currentMonth]; - curr_month.reset(); rate->compute_surplus(prev_month); bool skip_rollover = (currentMonth == 0 && year == 0) || (currentMonth == rate->net_metering_credit_month + 1) || (currentMonth == 0 && rate->net_metering_credit_month == 11); @@ -413,6 +414,7 @@ void UtilityRateForecast::restartMonth(int prevMonth, int currentMonth, size_t y { rate->transfer_surplus(curr_month, prev_month); } + prev_month.reset(); } double UtilityRateForecast::getEnergyChargeNetMetering(int month, std::vector& buy_rates, std::vector& sell_rates) diff --git a/third_party/ssc/shared/lib_utility_rate.h b/third_party/ssc/shared/lib_utility_rate.h index 7ba78d078de..bd4f021826a 100644 --- a/third_party/ssc/shared/lib_utility_rate.h +++ b/third_party/ssc/shared/lib_utility_rate.h @@ -156,9 +156,12 @@ class UtilityRateForecast int last_month_init; size_t nyears; + // Load: total net energy from the grid over the month std::vector m_monthly_load_forecast; // Length is 12 * analysis period + // gen: total net energy to the grid (generation) over the month std::vector m_monthly_gen_forecast; // Length is 12 * analysis period - std::vector m_monthly_peak_forecast; // Length is 12 * analysis period + // Avg load: the average gross load (no gen) over the month. Used to establish a floor for peak shaving costs + std::vector m_monthly_avg_load_forecast; // Length is 12 * analysis period }; diff --git a/third_party/ssc/shared/logger.cpp b/third_party/ssc/shared/logger.cpp index 07f3079b1d6..0f3c5e3df6b 100644 --- a/third_party/ssc/shared/logger.cpp +++ b/third_party/ssc/shared/logger.cpp @@ -3,7 +3,7 @@ #include "lib_util.h" #include "lib_battery_capacity.h" #include "lib_battery_voltage.h" -#include "lib_battery_lifetime.h" +#include "lib_battery_lifetime_calendar_cycle.h" #include "lib_battery.h" /** @@ -88,9 +88,9 @@ std::ostream &operator<<(std::ostream &os, const capacity_params &p) { std::ostream &operator<<(std::ostream &os, const cycle_state &p) { char buf[1024]; - sprintf(buf, "\"cycle_state\": { \"q_relative_cycle\": %.3f, \"n_cycles\": %d, \"range\": %.3f, \"average_range\": %.3f, " + sprintf(buf, "\"cycle_state\": { \"q_relative_cycle\": %.3f, " "\"rainflow_Xlt\": %.3f, \"rainflow_Ylt\": %.3f, \"rainflow_jlt\": %d, \"rainflow_peaks\": ", - p.q_relative_cycle, p.n_cycles, p.range, p.average_range, + p.q_relative_cycle, p.rainflow_Xlt, p.rainflow_Ylt, p.rainflow_jlt); os << buf << p.rainflow_peaks << " }"; return os; @@ -98,32 +98,52 @@ std::ostream &operator<<(std::ostream &os, const cycle_state &p) { std::ostream &operator<<(std::ostream &os, const calendar_state &p) { char buf[1024]; - sprintf(buf, "\"calendar_state\": { \"q_relative_calendar\": %.3f, \"day_age_of_battery\": %d, " + sprintf(buf, "\"calendar_state\": { \"q_relative_calendar\": %.3f, " "\"dq_relative_calendar_old\": %.3f }", - p.q_relative_calendar, p.day_age_of_battery, p.dq_relative_calendar_old); + p.q_relative_calendar, p.dq_relative_calendar_old); os << buf; return os; } +std::ostream& operator<<(std::ostream& os, const lifetime_nmc_state& p) { + char buf[1024]; + sprintf(buf, "\"lifetime_nmc_state\": { \"q_relative_li\": %.3f, " + "\"q_relative_neg\": %.3f } ", + p.q_relative_li, p.q_relative_neg); + os << buf ; + return os; +} + std::ostream &operator<<(std::ostream &os, const lifetime_state &p) { os.precision(3); - os << R"("lifetime_state" : { "q_relative": )" << p.q_relative << ", " << *p.cycle << ", " << *p.calendar << " }"; + char buf[1024]; + sprintf(buf, R"("lifetime_state": { "q_relative": %f, "n_cycles": %d, "range": %.3f, "average_range": %.3f, )", + p.q_relative, p.n_cycles, p.range, p.average_range); + os << buf << *p.cycle << ", " << *p.calendar << ", " << *p.nmc_state << " }"; return os; } -std::ostream &operator<<(std::ostream &os, const lifetime_params &p) { - os << R"("lifetime_params": { "cycling_matrix": )" << p.cycling_matrix; +std::ostream &operator<<(std::ostream &os, const calendar_cycle_params &p) { + os << R"("calendar_cycle_params": { "cycling_matrix": )" << p.cycling_matrix; char buf[1024]; - sprintf(buf, ", \"calendar_choice\": %d, \"dt_hour\": %.3f, \"calendar_q0\": %.3f, " + sprintf(buf, ", \"calendar_choice\": %d, \"calendar_q0\": %.3f, " "\"calendar_a\": %.3f, \"calendar_b\": %.3f, " - "\"calendar_c\": %.3f, ", p.calendar_choice, p.dt_hour, p.calendar_q0, + "\"calendar_c\": %.3f, ", p.calendar_choice, p.calendar_q0, p.calendar_a, p.calendar_b, p.calendar_c); os << buf; os << R"("calendar_matrix": )" << p.calendar_matrix << " }"; return os; } +std::ostream &operator<<(std::ostream &os, const lifetime_params &p) { + os.precision(3); + char buf[1024]; + sprintf(buf, R"("lifetime_params": { "dt_hr": %.3f, "model_choice": %d, )", p.dt_hr, p.model_choice); + os << *p.cal_cyc << " }"; + return os; +} + std::ostream &operator<<(std::ostream &os, const replacement_state &p) { char buf[256]; sprintf(buf, R"("replacement_state": { "n_replacements": %d, "indices_replaced": )", p.n_replacements); @@ -150,10 +170,10 @@ std::ostream &operator<<(std::ostream &os, const thermal_state &p) { std::ostream &operator<<(std::ostream &os, const thermal_params &p) { char buf[1024]; - sprintf(buf, "\"thermal_params\": { \"dt_hour\": %.3f, \"mass\": %.3f, \"surface_area\": %.3f, " + sprintf(buf, "\"thermal_params\": { \"dt_hr\": %.3f, \"mass\": %.3f, \"surface_area\": %.3f, " "\"Cp\": %.3f, \"h\": %.3f, \"resistance\": %.3e, \"cap_vs_temp\": ", - p.dt_hour, p.mass, p.surface_area, - p.Cp, p.h, p.resistance); + p.dt_hr, p.mass, p.surface_area, + p.Cp, p.h, p.resistance); os << buf << p.cap_vs_temp; os.precision(3); os << R"(, "option": )" << p.option; @@ -198,8 +218,8 @@ std::ostream &operator<<(std::ostream &os, const battery_state &p) { std::ostream &operator<<(std::ostream &os, const battery_params &p) { char buf[1024]; - sprintf(buf, R"("battery_params": { "chem": %u, "dt_hour": %.3f, "nominal_voltage": %.3f, "nominal_energy": %.3f)", - p.chem, p.dt_hour, p.nominal_voltage, p.nominal_energy); + sprintf(buf, R"("battery_params": { "chem": %u, "dt_hr": %.3f, "nominal_voltage": %.3f, "nominal_energy": %.3f)", + p.chem, p.dt_hr, p.nominal_voltage, p.nominal_energy); os << buf << ", "; os << *p.capacity << ", "; os << *p.voltage << ", "; diff --git a/third_party/ssc/splinter/CMakeLists.txt b/third_party/ssc/splinter/CMakeLists.txt index 63c1072742f..fba7f7e5d00 100644 --- a/third_party/ssc/splinter/CMakeLists.txt +++ b/third_party/ssc/splinter/CMakeLists.txt @@ -37,6 +37,7 @@ set_default_compile_options(splinter) if(MSVC) set_additional_compile_options(splinter "/W2 /wd4267 /wd4244") endif(MSVC) +set_no_warnings(splinter) ##################################################################################################################### diff --git a/third_party/ssc/ssc/cmod_battery.cpp b/third_party/ssc/ssc/cmod_battery.cpp index 13aec760b6b..4e7214fa938 100644 --- a/third_party/ssc/ssc/cmod_battery.cpp +++ b/third_party/ssc/ssc/cmod_battery.cpp @@ -111,13 +111,14 @@ var_info vtab_battery_inputs[] = { { SSC_INPUT, SSC_NUMBER, "batt_minimum_modetime", "Minimum time at charge state", "min", "", "BatteryCell", "", "", "" }, // lifetime inputs - { SSC_INPUT, SSC_MATRIX, "batt_lifetime_matrix", "Cycles vs capacity at different depths-of-discharge", "", "", "BatteryCell", "", "", "" }, - { SSC_INPUT, SSC_NUMBER, "batt_calendar_choice", "Calendar life degradation input option", "0/1/2", "0=NoCalendarDegradation,1=LithiomIonModel,2=InputLossTable", "BatteryCell", "", "", "" }, - { SSC_INPUT, SSC_MATRIX, "batt_calendar_lifetime_matrix", "Days vs capacity", "", "", "BatteryCell", "", "", "" }, - { SSC_INPUT, SSC_NUMBER, "batt_calendar_q0", "Calendar life model initial capacity cofficient", "", "", "BatteryCell", "", "", "" }, - { SSC_INPUT, SSC_NUMBER, "batt_calendar_a", "Calendar life model coefficient", "1/sqrt(day)","", "BatteryCell", "", "", "" }, - { SSC_INPUT, SSC_NUMBER, "batt_calendar_b", "Calendar life model coefficient", "K", "", "BatteryCell", "", "", "" }, - { SSC_INPUT, SSC_NUMBER, "batt_calendar_c", "Calendar life model coefficient", "K", "", "BatteryCell", "", "", "" }, + { SSC_INPUT, SSC_NUMBER, "batt_life_model", "Battery life model specifier", "0/1", "0=calendar/cycle,1=NMC", "BatteryCell", "en_batt=1", "", "" }, + { SSC_INPUT, SSC_MATRIX, "batt_lifetime_matrix", "Cycles vs capacity at different depths-of-discharge", "", "", "BatteryCell", "en_batt=1&batt_life_model=0", "", "" }, + { SSC_INPUT, SSC_NUMBER, "batt_calendar_choice", "Calendar life degradation input option", "0/1/2", "0=NoCalendarDegradation,1=LithiomIonModel,2=InputLossTable", "BatteryCell", "en_batt=1&batt_life_model=0", "", "" }, + { SSC_INPUT, SSC_MATRIX, "batt_calendar_lifetime_matrix", "Days vs capacity", "", "", "BatteryCell", "en_batt=1&batt_life_model=0&batt_calendar_choice=2", "", "" }, + { SSC_INPUT, SSC_NUMBER, "batt_calendar_q0", "Calendar life model initial capacity cofficient", "", "", "BatteryCell", "en_batt=1&batt_life_model=0&batt_calendar_choice=1", "", "" }, + { SSC_INPUT, SSC_NUMBER, "batt_calendar_a", "Calendar life model coefficient", "1/sqrt(day)","", "BatteryCell", "en_batt=1&batt_life_model=0&batt_calendar_choice=1", "", "" }, + { SSC_INPUT, SSC_NUMBER, "batt_calendar_b", "Calendar life model coefficient", "K", "", "BatteryCell", "en_batt=1&batt_life_model=0&batt_calendar_choice=1", "", "" }, + { SSC_INPUT, SSC_NUMBER, "batt_calendar_c", "Calendar life model coefficient", "K", "", "BatteryCell", "en_batt=1&batt_life_model=0&batt_calendar_choice=1", "", "" }, // replacement inputs { SSC_INPUT, SSC_NUMBER, "batt_replacement_capacity", "Capacity degradation at which to replace battery", "%", "", "BatterySystem", "", "", "" }, @@ -160,8 +161,8 @@ var_info vtab_battery_inputs[] = { { SSC_INPUT, SSC_ARRAY, "batt_pv_ac_forecast", "PV ac power forecast", "kW", "", "BatteryDispatch", "", "", "" }, // cycle cost inputs - { SSC_INPUT, SSC_NUMBER, "batt_cycle_cost_choice", "Use SAM cost model for degradaton penalty or input custom via batt_cycle_cost", "0/1", "0=UseCostModel,1=InputCost", "BatterySystem", "", "", "" }, - { SSC_INPUT, SSC_ARRAY, "batt_cycle_cost", "Input battery cycle degradaton penalty per year", "$/cycle-kWh","length 1 or analysis_period, length 1 will be extended using inflation", "BatterySystem", "", "", "" }, + { SSC_INPUT, SSC_NUMBER, "batt_cycle_cost_choice", "Use SAM cost model for degradaton penalty or input custom via batt_cycle_cost", "0/1", "0=UseCostModel,1=InputCost", "BatterySystem", "?=0", "", "" }, + { SSC_INPUT, SSC_ARRAY, "batt_cycle_cost", "Input battery cycle degradaton penalty per year", "$/cycle-kWh","length 1 or analysis_period, length 1 will be extended using inflation", "BatterySystem", "batt_cycle_cost_choice=1", "", "" }, { SSC_INPUT, SSC_NUMBER, "inflation_rate", "Inflation rate", "%", "", "Lifetime", "?=0", "MIN=-99", "" }, { SSC_INPUT, SSC_ARRAY, "load_escalation", "Annual load escalation", "%/year", "", "Load", "?=0", "", "" }, @@ -319,6 +320,12 @@ battstor::battstor(var_table& vt, bool setup_model, size_t nrec, double dt_hr, c batt_vars->batt_Vfull = vt.as_double("batt_Vfull"); batt_vars->batt_Vexp = vt.as_double("batt_Vexp"); batt_vars->batt_Vnom = vt.as_double("batt_Vnom"); + //Voltage error checking + if (batt_vars->batt_voltage_choice==0 && + ((batt_vars->batt_Vfull < batt_vars->batt_Vexp) || + batt_vars->batt_Vexp < batt_vars->batt_Vnom)) { + throw exec_error("battery", "For the electrochemical battery voltage model, voltage inputs must meet the requirement Vfull > Vexp > Vnom."); + } batt_vars->batt_Qfull_flow = vt.as_double("batt_Qfull_flow"); batt_vars->batt_Qfull = vt.as_double("batt_Qfull"); batt_vars->batt_Qexp = vt.as_double("batt_Qexp"); @@ -373,29 +380,32 @@ battstor::battstor(var_table& vt, bool setup_model, size_t nrec, double dt_hr, c // compute utility rate out-years escalation multipliers std::vector cycle_cost(nyears); - ssc_number_t* parr = vt.as_array("batt_cycle_cost", &cnt); - if (cnt == 1) - { - for (i = 0; i < nyears; i++) - cycle_cost[i] = parr[0] * (ssc_number_t)pow((double)(inflation_rate + 1), (double)i); - } - else if (cnt < nyears) + if (batt_vars->batt_cycle_cost_choice == 1) { - throw exec_error("battery", "invalid number for batt_cycle_cost, must be 1 or equal to analysis_period"); - } - else - { - for (i = 0; i < nyears; i++) - cycle_cost[i] = parr[i]; + ssc_number_t* parr = vt.as_array("batt_cycle_cost", &cnt); + if (cnt == 1) + { + for (i = 0; i < nyears; i++) + cycle_cost[i] = parr[0] * (ssc_number_t)pow((double)(inflation_rate + 1), (double)i); + } + else if (cnt < nyears) + { + throw exec_error("battery", "Invalid number for batt_cycle_cost, must be 1 or equal to analysis_period."); + } + else + { + for (i = 0; i < nyears; i++) + cycle_cost[i] = parr[i]; + } } batt_vars->batt_cycle_cost = cycle_cost; - + // Battery bank replacement if (vt.is_assigned("om_replacement_cost1")) { std::vector replacement_cost(nyears); - parr = vt.as_array("om_replacement_cost1", &cnt); + ssc_number_t* parr = vt.as_array("om_replacement_cost1", &cnt); if (cnt == 1) { for (i = 0; i < nyears; i++) @@ -403,7 +413,7 @@ battstor::battstor(var_table& vt, bool setup_model, size_t nrec, double dt_hr, c } else if (cnt < nyears) { - throw exec_error("battery", "invalid number for om_replacement_cost1, must be 1 or equal to analysis_period"); + throw exec_error("battery", "Invalid number for om_replacement_cost1, must be 1 or equal to analysis_period."); } else { for (i = 0; i < nyears; i++) @@ -467,7 +477,7 @@ battstor::battstor(var_table& vt, bool setup_model, size_t nrec, double dt_hr, c if (vt.is_assigned("ur_ec_tou_mat")) { // Some tests don't have this assigned, ensure it is before setting up forecast rate batt_vars->ec_rate_defined = true; } - + if (batt_vars->batt_dispatch == dispatch_t::MAINTAIN_TARGET) { @@ -495,7 +505,7 @@ battstor::battstor(var_table& vt, bool setup_model, size_t nrec, double dt_hr, c target_power = batt_vars->target_power; if (target_power.size() != nrec) - throw exec_error("battery", "invalid number of target powers, must be equal to number of records in weather file"); + throw exec_error("battery", "Invalid number of target powers, must be equal to number of records in weather file."); // extend target power to lifetime internally for (size_t y = 1; y < nyears; y++) { @@ -552,14 +562,17 @@ battstor::battstor(var_table& vt, bool setup_model, size_t nrec, double dt_hr, c } // Battery lifetime - batt_vars->batt_calendar_choice = vt.as_integer("batt_calendar_choice"); - batt_vars->batt_lifetime_matrix = vt.as_matrix("batt_lifetime_matrix"); - batt_vars->batt_calendar_lifetime_matrix = vt.as_matrix("batt_calendar_lifetime_matrix"); - batt_vars->batt_voltage_matrix = vt.as_matrix("batt_voltage_matrix"); - batt_vars->batt_calendar_q0 = vt.as_double("batt_calendar_q0"); - batt_vars->batt_calendar_a = vt.as_double("batt_calendar_a"); - batt_vars->batt_calendar_b = vt.as_double("batt_calendar_b"); - batt_vars->batt_calendar_c = vt.as_double("batt_calendar_c"); + batt_vars->batt_life_model = vt.as_integer("batt_life_model"); + if (batt_vars->batt_life_model == 0) { + batt_vars->batt_calendar_choice = vt.as_integer("batt_calendar_choice"); + batt_vars->batt_lifetime_matrix = vt.as_matrix("batt_lifetime_matrix"); + batt_vars->batt_calendar_lifetime_matrix = vt.as_matrix("batt_calendar_lifetime_matrix"); + batt_vars->batt_voltage_matrix = vt.as_matrix("batt_voltage_matrix"); + batt_vars->batt_calendar_q0 = vt.as_double("batt_calendar_q0"); + batt_vars->batt_calendar_a = vt.as_double("batt_calendar_a"); + batt_vars->batt_calendar_b = vt.as_double("batt_calendar_b"); + batt_vars->batt_calendar_c = vt.as_double("batt_calendar_c"); + } // Thermal behavior batt_vars->batt_surface_area = vt.as_double("batt_surface_area"); @@ -677,7 +690,7 @@ battstor::battstor(var_table& vt, bool setup_model, size_t nrec, double dt_hr, c if (!batt_vars->system_use_lifetime_output){ if (batt_vars->batt_replacement_option > 0) - throw exec_error("battery", "Replacements are enabled without running lifetime simulation, please run over lifetime to consider battery replacements"); + throw exec_error("battery", "Battery replacements are enabled with single year simulation. You must enable lifetime simulations to model battery replacements."); } total_steps = nyears * 8760 * step_per_hour; chem = batt_vars->batt_chem; @@ -803,22 +816,43 @@ battstor::battstor(var_table& vt, bool setup_model, size_t nrec, double dt_hr, c batt_vars->batt_voltage_matrix, batt_vars->batt_resistance, dt_hr); - if (batt_vars->batt_calendar_choice == lifetime_params::CALENDAR_CHOICE::MODEL) { - lifetime_model = new lifetime_t(batt_vars->batt_lifetime_matrix, dt_hr, - batt_vars->batt_calendar_q0, batt_vars->batt_calendar_a, batt_vars->batt_calendar_b, batt_vars->batt_calendar_c); + if (batt_vars->batt_life_model == 0) { + if (batt_vars->batt_calendar_choice == calendar_cycle_params::CALENDAR_CHOICE::MODEL) { + lifetime_model = new lifetime_calendar_cycle_t(batt_vars->batt_lifetime_matrix, dt_hr, + batt_vars->batt_calendar_q0, batt_vars->batt_calendar_a, batt_vars->batt_calendar_b, batt_vars->batt_calendar_c); + } + else if (batt_vars->batt_calendar_choice == calendar_cycle_params::CALENDAR_CHOICE::TABLE) { + lifetime_model = new lifetime_calendar_cycle_t(batt_vars->batt_lifetime_matrix, dt_hr, batt_vars->batt_calendar_lifetime_matrix); + } + else { + lifetime_model = new lifetime_calendar_cycle_t(batt_vars->batt_lifetime_matrix, dt_hr); + } } - else if (batt_vars->batt_calendar_choice == lifetime_params::CALENDAR_CHOICE::TABLE) { - lifetime_model = new lifetime_t(batt_vars->batt_lifetime_matrix, dt_hr, batt_vars->batt_calendar_lifetime_matrix); + else if (batt_vars->batt_life_model == 1) { + lifetime_model = new lifetime_nmc_t(dt_hr); } else { - lifetime_model = new lifetime_t(batt_vars->batt_lifetime_matrix, dt_hr); + throw exec_error("battery", "Unrecognized `batt_life_model` option. Valid options are 0 for separate calendar & cycle models; " + "1 for NREL NMC life model."); } if (batt_vars->T_room.size() != nrec) { - throw exec_error("battery", "Environment temperature input length must equal number of weather file records"); + throw exec_error("battery", "Environment temperature input length must equal number of weather file records."); } - thermal_model = new thermal_t( + if (batt_vars->batt_life_model == 1) { + thermal_model = new thermal_t( + dt_hr, + batt_vars->batt_mass, // [kg] + batt_vars->batt_surface_area, // [m] + batt_vars->batt_resistance, // [J/kgK] + batt_vars->batt_Cp, + batt_vars->batt_h_to_ambient, + batt_vars->T_room + ); + } + else { + thermal_model = new thermal_t( dt_hr, batt_vars->batt_mass, // [kg] batt_vars->batt_surface_area, // [m] @@ -827,7 +861,9 @@ battstor::battstor(var_table& vt, bool setup_model, size_t nrec, double dt_hr, c batt_vars->batt_h_to_ambient, batt_vars->cap_vs_temp, batt_vars->T_room - ); + ); + } + if (chem == battery_params::LEAD_ACID) { @@ -858,7 +894,7 @@ battstor::battstor(var_table& vt, bool setup_model, size_t nrec, double dt_hr, c } else if (batt_vars->batt_loss_choice == losses_params::SCHEDULE) { if (!(batt_vars->batt_losses.size() == 1 || batt_vars->batt_losses.size() == nrec)) { - throw exec_error("battery", "system loss input length must be 1 or equal to weather file length for time series input mode"); + throw exec_error("battery", "System loss input length must be 1 or equal to weather file length for time series input mode."); } losses_model = new losses_t(batt_vars->batt_losses); } @@ -883,28 +919,28 @@ battstor::battstor(var_table& vt, bool setup_model, size_t nrec, double dt_hr, c { /*! Generic manual dispatch model inputs */ if (batt_vars->batt_can_charge.size() != 6 || batt_vars->batt_can_discharge.size() != 6 || batt_vars->batt_can_gridcharge.size() != 6) - throw exec_error("battery", "invalid manual dispatch control vector lengths, must be length 6"); + throw exec_error("battery", "Invalid manual dispatch control vector length, must be length 6."); if (batt_vars->batt_discharge_schedule_weekday.nrows() != 12 || batt_vars->batt_discharge_schedule_weekday.ncols() != 24) - throw exec_error("battery", "invalid manual dispatch schedule matrix dimensions, must be 12 x 24"); + throw exec_error("battery", "Invalid manual dispatch schedule matrix dimensions, must be 12 x 24."); size_t max_period = 6; size_t* discharge_schedule_vec = batt_vars->batt_discharge_schedule_weekday.data(); size_t* period_num = std::find_if(discharge_schedule_vec, discharge_schedule_vec + batt_vars->batt_discharge_schedule_weekday.ncells() - 1, [max_period](double element) { return (max_period < element); }); if (*period_num > max_period) - throw exec_error("battery", "invalid manual dispatch period in weekday schedule. Period numbers must be less than or equal to 6"); + throw exec_error("battery", "Invalid manual dispatch period in weekday schedule. Period numbers must be less than or equal to 6."); if (batt_vars->batt_discharge_schedule_weekend.nrows() != 12 || batt_vars->batt_discharge_schedule_weekend.ncols() != 24) - throw exec_error("battery", "invalid weekend manual dispatch schedule matrix dimensions, must be 12 x 24"); + throw exec_error("battery", "Invalid weekend manual dispatch schedule matrix dimensions, must be 12 x 24."); discharge_schedule_vec = batt_vars->batt_discharge_schedule_weekend.data(); period_num = std::find_if(discharge_schedule_vec, discharge_schedule_vec + batt_vars->batt_discharge_schedule_weekend.ncells() - 1, [max_period](double element) { return (max_period < element); }); if (*period_num > max_period) - throw exec_error("battery", "invalid manual dispatch period in weekend schedule. Period numbers must be less than or equal to 6"); + throw exec_error("battery", "Invalid manual dispatch period in weekend schedule. Period numbers must be less than or equal to 6."); if (batt_vars->en_fuelcell) { if (batt_vars->batt_can_fuelcellcharge.size() != 6) - throw exec_error("fuelcell", "invalid manual dispatch control vector lengths, must be length 6"); + throw exec_error("fuelcell", "Invalid manual dispatch control vector lengths, must be length 6."); } @@ -969,7 +1005,7 @@ battstor::battstor(var_table& vt, bool setup_model, size_t nrec, double dt_hr, c if (dispatch_automatic_front_of_meter_t * dispatch_fom = dynamic_cast(dispatch_model)) { if (batt_vars->batt_custom_dispatch.size() != 8760 * step_per_hour) { - throw exec_error("battery", "invalid custom dispatch, must be 8760 * steps_per_hour"); + throw exec_error("battery", "Invalid custom dispatch length, must be 8760 * steps_per_hour."); } dispatch_fom->set_custom_dispatch(batt_vars->batt_custom_dispatch); } @@ -999,7 +1035,7 @@ battstor::battstor(var_table& vt, bool setup_model, size_t nrec, double dt_hr, c if (dispatch_automatic_behind_the_meter_t * dispatch_btm = dynamic_cast(dispatch_model)) { if (batt_vars->batt_custom_dispatch.size() != 8760 * step_per_hour) { - throw exec_error("battery", "invalid custom dispatch, must be 8760 * steps_per_hour"); + throw exec_error("battery", "Invalid custom dispatch, must be 8760 * steps_per_hour."); } dispatch_btm->set_custom_dispatch(batt_vars->batt_custom_dispatch); } @@ -1391,10 +1427,10 @@ void battstor::outputs_fixed() outCurrent[index] = (ssc_number_t)(state.capacity->cell_current); outBatteryVoltage[index] = (ssc_number_t)(battery_model->V()); - outCycles[index] = (ssc_number_t)(state.lifetime->cycle->n_cycles); + outCycles[index] = (ssc_number_t)(state.lifetime->n_cycles); outSOC[index] = (ssc_number_t)(state.capacity->SOC); - outDOD[index] = (ssc_number_t)(state.lifetime->cycle->range); - outDODCycleAverage[index] = (ssc_number_t)(state.lifetime->cycle->average_range); + outDOD[index] = (ssc_number_t)(state.lifetime->range); + outDODCycleAverage[index] = (ssc_number_t)(state.lifetime->average_range); outCapacityPercent[index] = (ssc_number_t)(state.lifetime->q_relative); outCapacityPercentCycle[index] = (ssc_number_t)(state.lifetime->cycle->q_relative_cycle); outCapacityPercentCalendar[index] = (ssc_number_t)(state.lifetime->calendar->q_relative_calendar); @@ -1573,7 +1609,7 @@ class cm_battery : public compute_module size_t analysis_period = (size_t)as_integer("analysis_period"); if (use_lifetime && (double)(util::hours_per_year * analysis_period) / n_rec_lifetime > 1) - throw exec_error("battery", "`gen` input must be lifetime when system_use_lifetime_output=1."); + throw exec_error("battery", "Input gen must be from lifetime simulation when system_use_lifetime_output=1."); size_t n_rec_single_year; double dt_hour_gen; @@ -1603,10 +1639,10 @@ class cm_battery : public compute_module batt->initialize_automated_dispatch(power_input_lifetime, load_lifetime); if (load_lifetime.size() != n_rec_lifetime) { - throw exec_error("battery", "Load length does not match system generation length"); + throw exec_error("battery", "Load length does not match system generation length."); } if (batt->batt_vars->batt_topology == ChargeController::DC_CONNECTED) { - throw exec_error("battery", "Generic System must be AC connected to battery"); + throw exec_error("battery", "Generic System must be AC connected to battery."); } // resilience metrics for battery @@ -1616,7 +1652,7 @@ class cm_battery : public compute_module p_crit_load = as_vector_ssc_number_t("crit_load"); size_t nload = p_crit_load.size(); if (nload != n_rec_single_year) - throw exec_error("battery", "electric load profile must have same number of values as weather file, or 8760"); + throw exec_error("battery", "Electric load profile must have same number of values as weather file, or 8760."); if (!p_crit_load.empty() && *std::max_element(p_crit_load.begin(), p_crit_load.end()) > 0){ resilience = std::unique_ptr(new resilience_runner(batt)); auto logs = resilience->get_logs(); @@ -1662,7 +1698,7 @@ class cm_battery : public compute_module float techs = 3; percent = percent_complete + 100.0f * ((float)lifetime_idx + 1) / ((float)n_rec_lifetime) / techs; if (!update("", percent, (float)hour)) { - throw exec_error("battery", "simulation canceled at hour " + util::to_string(hour + 1.0)); + throw exec_error("battery", "Simulation canceled at hour " + util::to_string(hour + 1.0)); } } diff --git a/third_party/ssc/ssc/cmod_battery.h b/third_party/ssc/ssc/cmod_battery.h index 0c64897e5be..2da30b9586d 100644 --- a/third_party/ssc/ssc/cmod_battery.h +++ b/third_party/ssc/ssc/cmod_battery.h @@ -53,6 +53,7 @@ struct batt_variables int batt_meter_position; int batt_target_choice; int batt_loss_choice; + int batt_life_model; int batt_calendar_choice; ssc_number_t *pcharge = 0; diff --git a/third_party/ssc/ssc/cmod_battery_stateful.cpp b/third_party/ssc/ssc/cmod_battery_stateful.cpp index 8a7a1f18777..21f028ba090 100644 --- a/third_party/ssc/ssc/cmod_battery_stateful.cpp +++ b/third_party/ssc/ssc/cmod_battery_stateful.cpp @@ -69,13 +69,14 @@ var_info vtab_battery_stateful_inputs[] = { { SSC_INPUT, SSC_MATRIX, "cap_vs_temp", "Table with Temperature and Capacity % as columns", "[[C,%]]", "", "ParamsPack", "*", "", "" }, // lifetime inputs - { SSC_INPUT, SSC_MATRIX, "cycling_matrix", "Table with DOD %, Cycle #, and Capacity % columns", "[[%, #, %]]","", "ParamsCell", "*", "", "" }, - { SSC_INPUT, SSC_NUMBER, "calendar_choice", "Calendar life degradation input option", "0/1/2", "0=None,1=LithiomIonModel,2=InputLossTable", "ParamsCell", "*", "", "" }, - { SSC_INPUT, SSC_MATRIX, "calendar_matrix", "Table with Day # and Capacity % columns", "[[#, %]]", "", "ParamsCell", "calendar_choice=2", "", "" }, - { SSC_INPUT, SSC_NUMBER, "calendar_q0", "Calendar life model initial capacity cofficient", "", "", "ParamsCell", "calendar_choice=1", "", "" }, - { SSC_INPUT, SSC_NUMBER, "calendar_a", "Calendar life model coefficient", "1/sqrt(day)","", "ParamsCell", "calendar_choice=1", "", "" }, - { SSC_INPUT, SSC_NUMBER, "calendar_b", "Calendar life model coefficient", "K", "", "ParamsCell", "calendar_choice=1", "", "" }, - { SSC_INPUT, SSC_NUMBER, "calendar_c", "Calendar life model coefficient", "K", "", "ParamsCell", "calendar_choice=1", "", "" }, + { SSC_INPUT, SSC_NUMBER, "life_model", "Battery life model specifier", "0/1", "0=calendar/cycle,1=NMC", "ParamsCell", "*", "", "" }, + { SSC_INPUT, SSC_MATRIX, "cycling_matrix", "Table with DOD %, Cycle #, and Capacity % columns", "[[%, #, %]]","", "ParamsCell", "life_model=0", "", "" }, + { SSC_INPUT, SSC_NUMBER, "calendar_choice", "Calendar life degradation input option", "0/1/2", "0=None,1=LithiomIonModel,2=InputLossTable", "ParamsCell", "life_model=0", "", "" }, + { SSC_INPUT, SSC_MATRIX, "calendar_matrix", "Table with Day # and Capacity % columns", "[[#, %]]", "", "ParamsCell", "life_model=0&calendar_choice=2", "", "" }, + { SSC_INPUT, SSC_NUMBER, "calendar_q0", "Calendar life model initial capacity cofficient", "", "", "ParamsCell", "life_model=0&calendar_choice=1", "", "" }, + { SSC_INPUT, SSC_NUMBER, "calendar_a", "Calendar life model coefficient", "1/sqrt(day)","", "ParamsCell", "life_model=0&calendar_choice=1", "", "" }, + { SSC_INPUT, SSC_NUMBER, "calendar_b", "Calendar life model coefficient", "K", "", "ParamsCell", "life_model=0&calendar_choice=1", "", "" }, + { SSC_INPUT, SSC_NUMBER, "calendar_c", "Calendar life model coefficient", "K", "", "ParamsCell", "life_model=0&calendar_choice=1", "", "" }, // losses { SSC_INPUT, SSC_NUMBER, "loss_choice", "Loss power input option", "0/1", "0=Monthly,1=TimeSeries", "ParamsPack", "?=0", "", "" }, @@ -176,10 +177,15 @@ void write_battery_state(const battery_state& state, var_table* vt) { vt->assign_match_case("charge_mode", cap->charge_mode); vt->assign_match_case("prev_charge", cap->prev_charge); vt->assign_match_case("chargeChange", cap->chargeChange); - vt->assign_match_case("q1_0", cap->leadacid.q1_0); - vt->assign_match_case("q2_0", cap->leadacid.q2_0); - vt->assign_match_case("qn", cap->leadacid.q1); - vt->assign_match_case("q2", cap->leadacid.q2); + + int choice; + vt_get_int(vt, "chem", &choice); + if (choice == battery_params::CHEM::LEAD_ACID) { + vt->assign_match_case("q1_0", cap->leadacid.q1_0); + vt->assign_match_case("q2_0", cap->leadacid.q2_0); + vt->assign_match_case("qn", cap->leadacid.q1); + vt->assign_match_case("q2", cap->leadacid.q2); + } vt->assign_match_case("cell_voltage", state.voltage->cell_voltage); @@ -192,19 +198,26 @@ void write_battery_state(const battery_state& state, var_table* vt) { auto lifetime = state.lifetime; vt->assign_match_case("q_relative", lifetime->q_relative); - vt->assign_match_case("q_relative_cycle", lifetime->cycle->q_relative_cycle); - vt->assign_match_case("n_cycles", lifetime->cycle->n_cycles); - vt->assign_match_case("range", lifetime->cycle->range); - vt->assign_match_case("average_range", lifetime->cycle->average_range); - vt->assign_match_case("rainflow_Xlt", lifetime->cycle->rainflow_Xlt); - vt->assign_match_case("rainflow_Ylt", lifetime->cycle->rainflow_Ylt); - vt->assign_match_case("rainflow_jlt", lifetime->cycle->rainflow_jlt); - if (!lifetime->cycle->rainflow_peaks.empty()) { - vt->assign_match_case("rainflow_peaks", lifetime->cycle->rainflow_peaks); + vt->assign_match_case("n_cycles", lifetime->n_cycles); + vt->assign_match_case("range", lifetime->range); + vt->assign_match_case("average_range", lifetime->average_range); + vt->assign_match_case("day_age_of_battery", lifetime->day_age_of_battery); + + vt_get_int(vt, "life_model", &choice); + if (choice == lifetime_params::CALCYC) { + vt->assign_match_case("q_relative_cycle", lifetime->cycle->q_relative_cycle); + vt->assign_match_case("rainflow_Xlt", lifetime->cycle->rainflow_Xlt); + vt->assign_match_case("rainflow_Ylt", lifetime->cycle->rainflow_Ylt); + vt->assign_match_case("rainflow_jlt", lifetime->cycle->rainflow_jlt); + if (!lifetime->cycle->rainflow_peaks.empty()) { + vt->assign_match_case("rainflow_peaks", lifetime->cycle->rainflow_peaks); + } + vt->assign_match_case("q_relative_calendar", lifetime->calendar->q_relative_calendar); + vt->assign_match_case("dq_relative_calendar_old", lifetime->calendar->dq_relative_calendar_old); + } + else { + } - vt->assign_match_case("q_relative_calendar", lifetime->calendar->q_relative_calendar); - vt->assign_match_case("day_age_of_battery", lifetime->calendar->day_age_of_battery); - vt->assign_match_case("dq_relative_calendar_old", lifetime->calendar->dq_relative_calendar_old); vt->assign_match_case("loss_kw", state.losses->loss_kw); @@ -235,10 +248,15 @@ void read_battery_state(battery_state& state, var_table* vt) { vt_get_int(vt, "charge_mode", &cap->charge_mode); vt_get_int(vt, "prev_charge", &cap->prev_charge); vt_get_bool(vt, "chargeChange", &cap->chargeChange); - vt_get_number(vt, "q1_0", &cap->leadacid.q1_0); - vt_get_number(vt, "q2_0", &cap->leadacid.q2_0); - vt_get_number(vt, "qn", &cap->leadacid.q1); - vt_get_number(vt, "q2", &cap->leadacid.q2); + + int choice; + vt_get_int(vt, "chem", &choice); + if (choice == battery_params::CHEM::LEAD_ACID) { + vt_get_number(vt, "q1_0", &cap->leadacid.q1_0); + vt_get_number(vt, "q2_0", &cap->leadacid.q2_0); + vt_get_number(vt, "qn", &cap->leadacid.q1); + vt_get_number(vt, "q2", &cap->leadacid.q2); + } vt_get_number(vt, "cell_voltage", &state.voltage->cell_voltage); @@ -252,20 +270,27 @@ void read_battery_state(battery_state& state, var_table* vt) { auto lifetime = state.lifetime; vt_get_number(vt, "q_relative", &lifetime->q_relative); vt_get_number(vt, "q_relative_cycle", &lifetime->cycle->q_relative_cycle); - vt_get_int(vt, "n_cycles", &lifetime->cycle->n_cycles); - vt_get_number(vt, "range", &lifetime->cycle->range); - vt_get_number(vt, "average_range", &lifetime->cycle->average_range); - vt_get_number(vt, "rainflow_Xlt", &lifetime->cycle->rainflow_Xlt); - vt_get_number(vt, "rainflow_Ylt", &lifetime->cycle->rainflow_Ylt); - vt_get_int(vt, "rainflow_jlt", &lifetime->cycle->rainflow_jlt); - if (vt->is_assigned("rainflow_peaks")) - { - vt_get_array_vec(vt, "rainflow_peaks", lifetime->cycle->rainflow_peaks); - // If not assigned, leave empty + vt_get_int(vt, "n_cycles", &lifetime->n_cycles); + vt_get_number(vt, "range", &lifetime->range); + vt_get_number(vt, "average_range", &lifetime->average_range); + vt_get_number(vt, "day_age_of_battery", &lifetime->day_age_of_battery); + + vt_get_int(vt, "life_model", &choice); + if (choice == lifetime_params::CALCYC) { + vt_get_number(vt, "rainflow_Xlt", &lifetime->cycle->rainflow_Xlt); + vt_get_number(vt, "rainflow_Ylt", &lifetime->cycle->rainflow_Ylt); + vt_get_int(vt, "rainflow_jlt", &lifetime->cycle->rainflow_jlt); + if (vt->is_assigned("rainflow_peaks")) + { + vt_get_array_vec(vt, "rainflow_peaks", lifetime->cycle->rainflow_peaks); + // If not assigned, leave empty + } + vt_get_number(vt, "q_relative_calendar", &lifetime->calendar->q_relative_calendar); + vt_get_number(vt, "dq_relative_calendar_old", &lifetime->calendar->dq_relative_calendar_old); + } + else { + } - vt_get_number(vt, "q_relative_calendar", &lifetime->calendar->q_relative_calendar); - vt_get_int(vt, "day_age_of_battery", &lifetime->calendar->day_age_of_battery); - vt_get_number(vt, "dq_relative_calendar_old", &lifetime->calendar->dq_relative_calendar_old); vt_get_number(vt, "loss_kw", &state.losses->loss_kw); @@ -278,6 +303,7 @@ std::shared_ptr create_battery_params(var_table *vt, double dt_h int chem; vt_get_int(vt, "chem", &chem); params->chem = static_cast(chem); + params->dt_hr = dt_hr; // voltage auto voltage = params->voltage; @@ -317,7 +343,7 @@ std::shared_ptr create_battery_params(var_table *vt, double dt_h vt_get_number(vt, "initial_SOC", &capacity->initial_SOC); vt_get_number(vt, "maximum_soc", &capacity->maximum_SOC); vt_get_number(vt, "minimum_soc", &capacity->minimum_SOC); - params->dt_hour = dt_hr; + capacity->dt_hr = dt_hr; if (params->chem == battery_params::LEAD_ACID) { vt_get_number(vt, "leadacid_tn", &capacity->leadacid.tn); vt_get_number(vt, "leadacid_qn", &capacity->leadacid.qn); @@ -335,23 +361,27 @@ std::shared_ptr create_battery_params(var_table *vt, double dt_h // lifetime auto lifetime = params->lifetime; - vt_get_int(vt, "calendar_choice", &choice); - lifetime->calendar_choice = static_cast(choice); - lifetime->dt_hour = dt_hr; - vt_get_matrix(vt, "cycling_matrix", lifetime->cycling_matrix); - if (lifetime->calendar_choice == lifetime_params::CALENDAR_CHOICE::MODEL) { - vt_get_number(vt, "calendar_q0", &lifetime->calendar_q0); - vt_get_number(vt, "calendar_a", &lifetime->calendar_a); - vt_get_number(vt, "calendar_b", &lifetime->calendar_b); - vt_get_number(vt, "calendar_c", &lifetime->calendar_c); - } - else if (lifetime->calendar_choice == lifetime_params::CALENDAR_CHOICE::TABLE) { - vt_get_matrix(vt, "calendar_matrix", lifetime->calendar_matrix); + vt_get_int(vt, "life_model", &choice); + lifetime->model_choice = static_cast(choice); + if (lifetime->model_choice == lifetime_params::CALCYC) { + vt_get_int(vt, "calendar_choice", &choice); + lifetime->cal_cyc->calendar_choice = static_cast(choice); + lifetime->dt_hr = dt_hr; + vt_get_matrix(vt, "cycling_matrix", lifetime->cal_cyc->cycling_matrix); + if (lifetime->cal_cyc->calendar_choice == calendar_cycle_params::CALENDAR_CHOICE::MODEL) { + vt_get_number(vt, "calendar_q0", &lifetime->cal_cyc->calendar_q0); + vt_get_number(vt, "calendar_a", &lifetime->cal_cyc->calendar_a); + vt_get_number(vt, "calendar_b", &lifetime->cal_cyc->calendar_b); + vt_get_number(vt, "calendar_c", &lifetime->cal_cyc->calendar_c); + } + else if (lifetime->cal_cyc->calendar_choice == calendar_cycle_params::CALENDAR_CHOICE::TABLE) { + vt_get_matrix(vt, "calendar_matrix", lifetime->cal_cyc->calendar_matrix); + } } // thermal auto thermal = params->thermal; - thermal->dt_hour = dt_hr; + thermal->dt_hr = dt_hr; thermal->option = thermal_params::VALUE; thermal->resistance = params->voltage->resistance; vt_get_number(vt, "mass", &thermal->mass); @@ -389,7 +419,7 @@ std::shared_ptr create_battery_params(var_table *vt, double dt_h } cm_battery_stateful::cm_battery_stateful(): - dt_hour(0), + dt_hr(0), control_mode(0){ add_var_info(vtab_battery_stateful_inputs); add_var_info(vtab_battery_state); @@ -401,9 +431,9 @@ cm_battery_stateful::cm_battery_stateful(var_table* vt) : try { if (!compute_module::verify("precheck input", SSC_INPUT)) throw exec_error("battery_stateful", log(0)->text); - dt_hour = as_number("dt_hr"); + dt_hr = as_number("dt_hr"); control_mode = as_integer("control_mode"); - params = create_battery_params(m_vartab, dt_hour); + params = create_battery_params(m_vartab, dt_hr); battery = std::unique_ptr(new battery_t(params)); write_battery_state(battery->get_state(), m_vartab); } @@ -416,6 +446,7 @@ void cm_battery_stateful::exec() { if (!battery) throw exec_error("battery_stateful", "Battery model must be initialized first."); + // Update state battery_state state; try { read_battery_state(state, m_vartab); @@ -427,6 +458,15 @@ void cm_battery_stateful::exec() { throw runtime_error(err); } + // Update controls + control_mode = static_cast(as_integer("control_mode")); + double control_dt_hr = as_float("dt_hr"); + if (fabs(control_dt_hr - dt_hr) > 1e-7) { + dt_hr = control_dt_hr; + battery->ChangeTimestep(dt_hr); + } + + // Simulate if (static_cast(as_integer("control_mode")) == MODE::CURRENT) { double I = as_number("input_current"); battery->runCurrent(I); @@ -435,6 +475,7 @@ void cm_battery_stateful::exec() { double P = as_number("input_power"); battery->runPower(P); } + write_battery_state(battery->get_state(), m_vartab); } diff --git a/third_party/ssc/ssc/cmod_battery_stateful.h b/third_party/ssc/ssc/cmod_battery_stateful.h index e13f70509e8..c2ad5f6608e 100644 --- a/third_party/ssc/ssc/cmod_battery_stateful.h +++ b/third_party/ssc/ssc/cmod_battery_stateful.h @@ -36,7 +36,7 @@ void read_battery_state(const battery_state& state, var_table* vt); class cm_battery_stateful : public compute_module { public: - double dt_hour; + double dt_hr; enum MODE { CURRENT, POWER }; diff --git a/third_party/ssc/ssc/cmod_battwatts.cpp b/third_party/ssc/ssc/cmod_battwatts.cpp index 72e0d21a938..338c92537e5 100644 --- a/third_party/ssc/ssc/cmod_battwatts.cpp +++ b/third_party/ssc/ssc/cmod_battwatts.cpp @@ -228,7 +228,7 @@ battwatts_create(size_t n_recs, size_t n_years, int chem, int meter_pos, double batt_vars->batt_replacement_capacity = 0.; // Battery lifetime - batt_vars->batt_calendar_choice = lifetime_params::CALENDAR_CHOICE::NONE; + batt_vars->batt_calendar_choice = calendar_cycle_params::CALENDAR_CHOICE::NONE; batt_vars->batt_calendar_lifetime_matrix = util::matrix_t(); batt_vars->batt_calendar_q0 = 1.0; diff --git a/third_party/ssc/ssc/cmod_fuelcell.cpp b/third_party/ssc/ssc/cmod_fuelcell.cpp index 4714c786e2c..2fb598d476b 100644 --- a/third_party/ssc/ssc/cmod_fuelcell.cpp +++ b/third_party/ssc/ssc/cmod_fuelcell.cpp @@ -46,7 +46,7 @@ var_info vtab_fuelcell_input[] = { { SSC_INPUT, SSC_NUMBER, "fuelcell_degradation_restart_schedule","Fuel cell enable scheduled restarts", "0/1", "", "Fuel Cell", "", "", "" }, { SSC_INPUT, SSC_NUMBER, "fuelcell_degradation_restarts_per_year","Fuel cell scheduled restarts per year","", "", "Fuel Cell", "", "", "" }, { SSC_INPUT, SSC_NUMBER, "fuelcell_fixed_pct", "Fuel cell fixed operation percent", "%", "", "Fuel Cell", "", "", "" }, - { SSC_INPUT, SSC_NUMBER, "fuelcell_dynamic_response_up", "Fuel cell ramp rate limit up", "kW/h", "", "Fuel Cell", "", "", "" }, + { SSC_INPUT, SSC_NUMBER, "fuelcell_dynamic_response_up", "Fuel cell ramp rate limit up", "kW/h", "", "Fuel Cell", "", "", "" }, { SSC_INPUT, SSC_NUMBER, "fuelcell_dynamic_response_down", "Fuel cell ramp rate limit down", "kW/h", "", "Fuel Cell", "", "", "" }, { SSC_INPUT, SSC_MATRIX, "fuelcell_efficiency", "Fuel cell efficiency table ", "", "", "Fuel Cell", "", "", "" }, { SSC_INPUT, SSC_NUMBER, "fuelcell_efficiency_choice", "Fuel cell efficiency definition choice ","0/1", "0=OriginalNameplate,1=DegradedNameplate", "Fuel Cell", "", "", "" }, @@ -106,7 +106,7 @@ cm_fuelcell::cm_fuelcell() add_var_info(vtab_fuelcell_output); add_var_info(vtab_technology_outputs); } - + // Have to add this since compute module isn't actually fully constructed until compute is called with // a vartable. void cm_fuelcell::construct() @@ -116,8 +116,8 @@ void cm_fuelcell::construct() std::unique_ptr tmp2(new FuelCell(fcVars->unitPowerMax_kW, fcVars->unitPowerMin_kW, fcVars->startup_hours, fcVars->is_started, fcVars->shutdown_hours, - fcVars->dynamicResponseUp_kWperHour, fcVars->dynamicResponseDown_kWperHour, - fcVars->degradation_kWperHour, fcVars->degradationRestart_kW, + fcVars->dynamicResponseUp_kWperHour, fcVars->dynamicResponseDown_kWperHour, + fcVars->degradation_kWperHour, fcVars->degradationRestart_kW, fcVars->replacementOption, fcVars->replacement_percent, fcVars->replacementSchedule, fcVars->shutdownTable, fcVars->efficiencyChoice, fcVars->efficiencyTable, fcVars->lowerHeatingValue_BtuPerFt3, fcVars->higherHeatingValue_BtuPerFt3, fcVars->availableFuel_MCf, @@ -126,7 +126,7 @@ void cm_fuelcell::construct() std::unique_ptr tmp3(new FuelCellDispatch(fuelCell.get(), fcVars->numberOfUnits, fcVars->dispatchOption, fcVars->shutdownOption, fcVars->dt_hour, fcVars->fixed_percent, fcVars->dispatch_kW, - fcVars->canCharge, fcVars->canDischarge, fcVars->discharge_percentByPeriod, fcVars->discharge_unitsByPeriod, + fcVars->canCharge, fcVars->canDischarge, fcVars->discharge_percentByPeriod, fcVars->discharge_unitsByPeriod, fcVars->scheduleWeekday,fcVars->scheduleWeekend)); fuelCellDispatch = std::move(tmp3); @@ -138,7 +138,7 @@ void cm_fuelcell::exec() double annual_energy = 0.0; double annual_fuel = 0.0; // float percent_complete = 0.0; - float percent = 0.0; +// float percent = 0.0; // size_t nStatusUpdates = 50; /* @@ -150,7 +150,7 @@ void cm_fuelcell::exec() construct(); size_t idx = 0; for (size_t y = 0; y < fcVars->numberOfYears; y++) { - + size_t idx_year = 0; size_t annual_index; fcVars->numberOfYears > 1 ? annual_index = y + 1 : annual_index = 0; @@ -161,7 +161,7 @@ void cm_fuelcell::exec() if (h % (8760 / nStatusUpdates) == 0) { // assume that anyone using this module is chaining with two techs - float techs = 3; + float techs = 3; percent = percent_complete + 100.0f * ((float)idx + 1) / ((float)fcVars->numberOfLifetimeRecords) / techs; if (!update("", percent, (float)h)) { throw exec_error("fuelcell", "simulation canceled at hour " + util::to_string(h + 1.0)); @@ -184,7 +184,7 @@ void cm_fuelcell::exec() if (y == 0) { annual_energy += p_gen_kW[idx] * fcVars->dt_hour; } - + idx++; idx_year++; } @@ -197,7 +197,7 @@ void cm_fuelcell::exec() p_fuelCellReplacements[annual_index] = (ssc_number_t)(fuelCell->getTotalReplacements()); fuelCell->resetReplacements(); } - + // capacity factor update double capacity_factor_in, annual_energy_in, nameplate_in; capacity_factor_in = annual_energy_in = nameplate_in = 0; diff --git a/third_party/ssc/ssc/cmod_merchantplant.cpp b/third_party/ssc/ssc/cmod_merchantplant.cpp index fb5719c18f7..2353519034a 100644 --- a/third_party/ssc/ssc/cmod_merchantplant.cpp +++ b/third_party/ssc/ssc/cmod_merchantplant.cpp @@ -566,25 +566,25 @@ static var_info _cm_vtab_merchantplant[] = { { SSC_OUTPUT, SSC_NUMBER, "npv_thermal_value", "Present value of thermal value", "$", "", "Metrics", "*", "", "" }, // Additional lifetime outputs for data tables and plotting. // calculated revenue - { SSC_OUTPUT, SSC_ARRAY, "mp_energy_market_generated_revenue", "Energy market generated revenue", "$", "", "", "*", "", "" }, - { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services1_generated_revenue", "Ancillary services 1 generated revenue", "$", "", "", "*", "", "" }, - { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services2_generated_revenue", "Ancillary services 2 generated revenue", "$", "", "", "*", "", "" }, - { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services3_generated_revenue", "Ancillary services 3 generated revenue", "$", "", "", "*", "", "" }, - { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services4_generated_revenue", "Ancillary services 4 generated revenue", "$", "", "", "*", "", "" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_energy_market_generated_revenue", "Energy market generated revenue", "$", "", "", "*", "", "GROUP=LIFETIME_MP" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services1_generated_revenue", "Ancillary services 1 generated revenue", "$", "", "", "*", "", "GROUP=LIFETIME_MP" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services2_generated_revenue", "Ancillary services 2 generated revenue", "$", "", "", "*", "", "GROUP=LIFETIME_MP" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services3_generated_revenue", "Ancillary services 3 generated revenue", "$", "", "", "*", "", "GROUP=LIFETIME_MP" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services4_generated_revenue", "Ancillary services 4 generated revenue", "$", "", "", "*", "", "GROUP=LIFETIME_MP" }, // cleared capacity user input - { SSC_OUTPUT, SSC_ARRAY, "mp_energy_market_cleared_capacity", "Energy market cleared capacity", "MW", "", "", "*", "", "" }, - { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services1_cleared_capacity", "Ancillary services 1 cleared capacity", "MW", "", "", "*", "", "" }, - { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services2_cleared_capacity", "Ancillary services 2 cleared capacity", "MW", "", "", "*", "", "" }, - { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services3_cleared_capacity", "Ancillary services 3 cleared capacity", "MW", "", "", "*", "", "" }, - { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services4_cleared_capacity", "Ancillary services 4 cleared capacity", "MW", "", "", "*", "", "" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_energy_market_cleared_capacity", "Energy market cleared capacity", "MW", "", "", "*", "", "GROUP=LIFETIME_MP" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services1_cleared_capacity", "Ancillary services 1 cleared capacity", "MW", "", "", "*", "", "GROUP=LIFETIME_MP" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services2_cleared_capacity", "Ancillary services 2 cleared capacity", "MW", "", "", "*", "", "GROUP=LIFETIME_MP" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services3_cleared_capacity", "Ancillary services 3 cleared capacity", "MW", "", "", "*", "", "GROUP=LIFETIME_MP" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services4_cleared_capacity", "Ancillary services 4 cleared capacity", "MW", "", "", "*", "", "GROUP=LIFETIME_MP" }, // price user input - { SSC_OUTPUT, SSC_ARRAY, "mp_energy_market_price", "Energy market price", "$/MWh", "", "", "*", "", "" }, - { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services1_price", "Ancillary services 1 generated price", "$/MWh", "", "", "*", "", "" }, - { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services2_price", "Ancillary services 2 generated price", "$/MWh", "", "", "*", "", "" }, - { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services3_price", "Ancillary services 3 generated price", "$/MWh", "", "", "*", "", "" }, - { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services4_price", "Ancillary services 4 generated price", "$/MWh", "", "", "*", "", "" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_energy_market_price", "Energy market price", "$/MWh", "", "", "*", "", "GROUP=LIFETIME_MP" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services1_price", "Ancillary services 1 generated price", "$/MWh", "", "", "*", "", "GROUP=LIFETIME_MP" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services2_price", "Ancillary services 2 generated price", "$/MWh", "", "", "*", "", "GROUP=LIFETIME_MP" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services3_price", "Ancillary services 3 generated price", "$/MWh", "", "", "*", "", "GROUP=LIFETIME_MP" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_ancillary_services4_price", "Ancillary services 4 generated price", "$/MWh", "", "", "*", "", "GROUP=LIFETIME_MP" }, // sum of all cleared capacities - { SSC_OUTPUT, SSC_ARRAY, "mp_total_cleared_capacity", "Total cleared capacity", "MW", "", "", "*", "", "" }, + { SSC_OUTPUT, SSC_ARRAY, "mp_total_cleared_capacity", "Total cleared capacity", "MW", "", "", "*", "", "GROUP=LIFETIME_MP" }, diff --git a/third_party/ssc/ssc/cmod_pvsamv1.cpp b/third_party/ssc/ssc/cmod_pvsamv1.cpp index 2bd58204930..f81c3227cf6 100644 --- a/third_party/ssc/ssc/cmod_pvsamv1.cpp +++ b/third_party/ssc/ssc/cmod_pvsamv1.cpp @@ -969,10 +969,10 @@ void cm_pvsamv1::exec() { if (Subarrays[nn]->tiltEqualLatitude) Subarrays[nn]->tiltDegrees = fabs(Irradiance->weatherHeader.lat); - if (Subarrays[nn]->trackMode == irrad::SINGLE_AXIS && Subarrays[nn]->tiltDegrees > 0) - log(util::format("Subarray %d has one-axis tracking with a tilt angle of %f degrees. Large one-axis tracking arrays typically have a tilt angle of zero.", nn + 1, Subarrays[nn]->tiltDegrees), SSC_WARNING); - if (Subarrays[nn]->Module->isBifacial && (Subarrays[nn]->trackMode != irrad::FIXED_TILT)) - log(util::format("Subarray %d uses tracking with bifacial modules. The bifacial model is designed for fixed arrays and may not produce reliable results for tracking arrays.", nn + 1), SSC_WARNING); + if (Subarrays[nn]->trackMode == irrad::SINGLE_AXIS && Subarrays[nn]->tiltDegrees > 0 && !Subarrays[nn]->Module->isBifacial) + log(util::format("Subarray %d has one-axis tracking with a tilt angle of %f degrees. SAM can simulate one-axis tracking with non-zero tilt angles, but large one-axis tracking arrays typically have a tilt angle of zero. This message is a reminder in case you forgot to set the tilt angle to zero.", nn + 1, Subarrays[nn]->tiltDegrees), SSC_WARNING); + if (Subarrays[nn]->Module->isBifacial && Subarrays[nn]->trackMode == irrad::SINGLE_AXIS && Subarrays[nn]->tiltDegrees > 0) + log(util::format("Subarray %d uses bifacial modules with one-axis tracking and a tilt angle of %f degrees. The bifacial model is designed for one-axis tracking with a tilt angle of zero and may not produce reliable results for non-zero tilt angles.", nn + 1, Subarrays[nn]->tiltDegrees), SSC_WARNING); } // check for snow model with non-annual simulations: because snow model coefficients need to know the timestep, and we don't know timestep if non-annual @@ -2134,7 +2134,6 @@ void cm_pvsamv1::exec() dcPowerNetPerMppt_kW[m] = PVSystem->p_dcPowerNetPerMppt[m][idx] * util::watt_to_kilowatt; } - double power_before_battery = 0.0; //run AC power calculation if (en_batt && (batt_topology == ChargeController::DC_CONNECTED)) // DC-connected battery { diff --git a/third_party/ssc/ssc/cmod_pvwattsv5.cpp b/third_party/ssc/ssc/cmod_pvwattsv5.cpp index 9982ba048b5..28f3607ba66 100644 --- a/third_party/ssc/ssc/cmod_pvwattsv5.cpp +++ b/third_party/ssc/ssc/cmod_pvwattsv5.cpp @@ -674,7 +674,7 @@ class cm_pvwattsv5_1ts : public cm_pvwattsv5_base double tamb = as_double("tamb"); double wspd = as_double("wspd"); double alb = as_double("alb"); - double elev, tdry, pres; + double elev, pres; if (!is_assigned("elevation")) { elev = 0; //assume 0 meter elevation if none is provided } diff --git a/third_party/ssc/ssc/cmod_utilityrate5.cpp b/third_party/ssc/ssc/cmod_utilityrate5.cpp index c2ba7215c9f..bb613875b81 100644 --- a/third_party/ssc/ssc/cmod_utilityrate5.cpp +++ b/third_party/ssc/ssc/cmod_utilityrate5.cpp @@ -292,8 +292,6 @@ void rate_setup::setup(var_table* vt, int num_recs_yearly, int nyears, rate_data } else { // hourly or sub hourly loads for single year - size_t cnt; - ssc_number_t* ts_br; ts_br = vt->as_array("ur_ts_buy_rate", &cnt); size_t ts_step_per_hour = cnt / 8760; if (ts_step_per_hour < 1 || ts_step_per_hour > 60 || ts_step_per_hour * 8760 != cnt) diff --git a/third_party/ssc/ssc/cmod_windpower.cpp b/third_party/ssc/ssc/cmod_windpower.cpp index 2d173dc3f60..b14a016c36b 100644 --- a/third_party/ssc/ssc/cmod_windpower.cpp +++ b/third_party/ssc/ssc/cmod_windpower.cpp @@ -40,8 +40,8 @@ static var_info _cm_vtab_windpower[] = { { SSC_INPUT , SSC_NUMBER , "wind_resource_shear" , "Shear exponent" , "" ,"" , "Turbine" , "*" , "MIN=0" , "" } , { SSC_INPUT , SSC_NUMBER , "wind_turbine_rotor_diameter" , "Rotor diameter" , "m" ,"" , "Turbine" , "*" , "POSITIVE" , "" } , - { SSC_INOUT , SSC_ARRAY , "wind_turbine_powercurve_windspeeds" , "Power curve wind speed array" , "m/s" ,"" , "Turbine" , "*" , "" , "" } , - { SSC_INOUT , SSC_ARRAY , "wind_turbine_powercurve_powerout" , "Power curve turbine output array" , "kW" ,"" , "Turbine" , "*" , "LENGTH_EQUAL=wind_turbine_powercurve_windspeeds" , "" } , + { SSC_INOUT , SSC_ARRAY , "wind_turbine_powercurve_windspeeds" , "Power curve wind speed array" , "m/s" ,"" , "Turbine" , "*" , "" , "GROUP=WTPCD" } , + { SSC_INOUT , SSC_ARRAY , "wind_turbine_powercurve_powerout" , "Power curve turbine output array" , "kW" ,"" , "Turbine" , "*" , "LENGTH_EQUAL=wind_turbine_powercurve_windspeeds" , "GROUP=WTPCD" } , { SSC_INPUT , SSC_NUMBER , "wind_turbine_hub_ht" , "Hub height" , "m" ,"" , "Turbine" , "*" , "POSITIVE" , "" } , { SSC_INPUT , SSC_NUMBER , "wind_turbine_max_cp" , "Max Coefficient of Power" , "" ,"" , "Turbine" , "wind_resource_model_choice=1" , "MIN=0" , "" } , diff --git a/third_party/ssc/test/input_cases/battery_common_data.h b/third_party/ssc/test/input_cases/battery_common_data.h index a07a8c82fed..baf0e74b3a5 100644 --- a/third_party/ssc/test/input_cases/battery_common_data.h +++ b/third_party/ssc/test/input_cases/battery_common_data.h @@ -73,7 +73,8 @@ namespace { ssc_data_set_number(data, "batt_minimum_SOC", 15); ssc_data_set_number(data, "batt_maximum_SOC", 95); ssc_data_set_number(data, "batt_minimum_modetime", 10); - ssc_number_t p_batt_lifetime_matrix[18] = { 20, 0, 100, 20, 5000, 80, 20, 10000, 60, 80, 0, 100, 80, 1000, 80, 80, 2000, 60 }; + ssc_data_set_number(data, "batt_life_model", 0); + ssc_number_t p_batt_lifetime_matrix[18] = { 20, 0, 100, 20, 5000, 80, 20, 10000, 60, 80, 0, 100, 80, 1000, 80, 80, 2000, 60 }; ssc_data_set_matrix(data, "batt_lifetime_matrix", p_batt_lifetime_matrix, 6, 3); ssc_data_set_number(data, "batt_calendar_choice", 1); ssc_number_t p_batt_calendar_lifetime_matrix[6] = { 0, 100, 3650, 80, 7300, 50 }; @@ -123,8 +124,6 @@ namespace { ssc_number_t p_ur_ec_tou_mat[24] = { 1, 1, 200, 1, 0.21174600720405579, 0.028000000864267349, 1, 2, 400, 1, 0.057693801820278168, 0.028000000864267349, 1, 3, 600, 1, 0.052770901471376419, 0.028000000864267349, 1, 4, 10000, 1, 0.049003798514604568, 0.028000000864267349 }; ssc_data_set_matrix(data, "ur_ec_tou_mat", p_ur_ec_tou_mat, 4, 6); ssc_data_set_number(data, "batt_cycle_cost_choice", 0); - ssc_number_t p_batt_cycle_cost[1] = { 0.1 }; - ssc_data_set_array(data, "batt_cycle_cost", p_batt_cycle_cost, 1); } } #endif diff --git a/third_party/ssc/test/input_cases/csp_financial_defaults.cpp b/third_party/ssc/test/input_cases/csp_financial_defaults.cpp new file mode 100644 index 00000000000..260f41244c2 --- /dev/null +++ b/third_party/ssc/test/input_cases/csp_financial_defaults.cpp @@ -0,0 +1,260 @@ +#include "../input_cases/code_generator_utilities.h" + +/** +* Default parameters for the PPA singleowner (utility) financial model +*/ +ssc_data_t singleowner_defaults() +{ + ssc_data_t data = ssc_data_create(); + + ssc_data_set_number(data, "analysis_period", 25); + ssc_number_t p_federal_tax_rate[1] = { 21 }; + ssc_data_set_array(data, "federal_tax_rate", p_federal_tax_rate, 1); + ssc_number_t p_state_tax_rate[1] = { 7 }; + ssc_data_set_array(data, "state_tax_rate", p_state_tax_rate, 1); + ssc_data_set_number(data, "property_tax_rate", 0); + ssc_data_set_number(data, "prop_tax_cost_assessed_percent", 100); + ssc_data_set_number(data, "prop_tax_assessed_decline", 0); + ssc_data_set_number(data, "real_discount_rate", 6.4000000953674316); + ssc_data_set_number(data, "inflation_rate", 2.5); + ssc_data_set_number(data, "insurance_rate", 0.5); + ssc_data_set_number(data, "system_capacity", 99899.9921875); + ssc_number_t p_om_fixed[1] = { 0 }; + ssc_data_set_array(data, "om_fixed", p_om_fixed, 1); + ssc_data_set_number(data, "om_fixed_escal", 0); + ssc_number_t p_om_production[1] = { 4 }; + ssc_data_set_array(data, "om_production", p_om_production, 1); + ssc_data_set_number(data, "om_production_escal", 0); + ssc_number_t p_om_capacity[1] = { 66 }; + ssc_data_set_array(data, "om_capacity", p_om_capacity, 1); + ssc_data_set_number(data, "om_capacity_escal", 0); + ssc_number_t p_om_fuel_cost[1] = { 0 }; + ssc_data_set_array(data, "om_fuel_cost", p_om_fuel_cost, 1); + ssc_data_set_number(data, "om_fuel_cost_escal", 0); + ssc_number_t p_om_replacement_cost1[1] = { 0 }; + ssc_data_set_array(data, "om_replacement_cost1", p_om_replacement_cost1, 1); + ssc_data_set_number(data, "om_replacement_cost_escal", 0); + ssc_data_set_number(data, "itc_fed_amount", 0); + ssc_data_set_number(data, "itc_fed_amount_deprbas_fed", 1); + ssc_data_set_number(data, "itc_fed_amount_deprbas_sta", 1); + ssc_data_set_number(data, "itc_sta_amount", 0); + ssc_data_set_number(data, "itc_sta_amount_deprbas_fed", 0); + ssc_data_set_number(data, "itc_sta_amount_deprbas_sta", 0); + ssc_data_set_number(data, "itc_fed_percent", 30); + ssc_data_set_number(data, "itc_fed_percent_maxvalue", 9.9999996802856925e+37); + ssc_data_set_number(data, "itc_fed_percent_deprbas_fed", 1); + ssc_data_set_number(data, "itc_fed_percent_deprbas_sta", 1); + ssc_data_set_number(data, "itc_sta_percent", 0); + ssc_data_set_number(data, "itc_sta_percent_maxvalue", 9.9999996802856925e+37); + ssc_data_set_number(data, "itc_sta_percent_deprbas_fed", 0); + ssc_data_set_number(data, "itc_sta_percent_deprbas_sta", 0); + ssc_number_t p_ptc_fed_amount[1] = { 0 }; + ssc_data_set_array(data, "ptc_fed_amount", p_ptc_fed_amount, 1); + ssc_data_set_number(data, "ptc_fed_term", 10); + ssc_data_set_number(data, "ptc_fed_escal", 0); + ssc_number_t p_ptc_sta_amount[1] = { 0 }; + ssc_data_set_array(data, "ptc_sta_amount", p_ptc_sta_amount, 1); + ssc_data_set_number(data, "ptc_sta_term", 10); + ssc_data_set_number(data, "ptc_sta_escal", 0); + ssc_data_set_number(data, "ibi_fed_amount", 0); + ssc_data_set_number(data, "ibi_fed_amount_tax_fed", 1); + ssc_data_set_number(data, "ibi_fed_amount_tax_sta", 1); + ssc_data_set_number(data, "ibi_fed_amount_deprbas_fed", 0); + ssc_data_set_number(data, "ibi_fed_amount_deprbas_sta", 0); + ssc_data_set_number(data, "ibi_sta_amount", 0); + ssc_data_set_number(data, "ibi_sta_amount_tax_fed", 1); + ssc_data_set_number(data, "ibi_sta_amount_tax_sta", 1); + ssc_data_set_number(data, "ibi_sta_amount_deprbas_fed", 0); + ssc_data_set_number(data, "ibi_sta_amount_deprbas_sta", 0); + ssc_data_set_number(data, "ibi_uti_amount", 0); + ssc_data_set_number(data, "ibi_uti_amount_tax_fed", 1); + ssc_data_set_number(data, "ibi_uti_amount_tax_sta", 1); + ssc_data_set_number(data, "ibi_uti_amount_deprbas_fed", 0); + ssc_data_set_number(data, "ibi_uti_amount_deprbas_sta", 0); + ssc_data_set_number(data, "ibi_oth_amount", 0); + ssc_data_set_number(data, "ibi_oth_amount_tax_fed", 1); + ssc_data_set_number(data, "ibi_oth_amount_tax_sta", 1); + ssc_data_set_number(data, "ibi_oth_amount_deprbas_fed", 0); + ssc_data_set_number(data, "ibi_oth_amount_deprbas_sta", 0); + ssc_data_set_number(data, "ibi_fed_percent", 0); + ssc_data_set_number(data, "ibi_fed_percent_maxvalue", 9.9999996802856925e+37); + ssc_data_set_number(data, "ibi_fed_percent_tax_fed", 1); + ssc_data_set_number(data, "ibi_fed_percent_tax_sta", 1); + ssc_data_set_number(data, "ibi_fed_percent_deprbas_fed", 0); + ssc_data_set_number(data, "ibi_fed_percent_deprbas_sta", 0); + ssc_data_set_number(data, "ibi_sta_percent", 0); + ssc_data_set_number(data, "ibi_sta_percent_maxvalue", 9.9999996802856925e+37); + ssc_data_set_number(data, "ibi_sta_percent_tax_fed", 1); + ssc_data_set_number(data, "ibi_sta_percent_tax_sta", 1); + ssc_data_set_number(data, "ibi_sta_percent_deprbas_fed", 0); + ssc_data_set_number(data, "ibi_sta_percent_deprbas_sta", 0); + ssc_data_set_number(data, "ibi_uti_percent", 0); + ssc_data_set_number(data, "ibi_uti_percent_maxvalue", 9.9999996802856925e+37); + ssc_data_set_number(data, "ibi_uti_percent_tax_fed", 1); + ssc_data_set_number(data, "ibi_uti_percent_tax_sta", 1); + ssc_data_set_number(data, "ibi_uti_percent_deprbas_fed", 0); + ssc_data_set_number(data, "ibi_uti_percent_deprbas_sta", 0); + ssc_data_set_number(data, "ibi_oth_percent", 0); + ssc_data_set_number(data, "ibi_oth_percent_maxvalue", 9.9999996802856925e+37); + ssc_data_set_number(data, "ibi_oth_percent_tax_fed", 1); + ssc_data_set_number(data, "ibi_oth_percent_tax_sta", 1); + ssc_data_set_number(data, "ibi_oth_percent_deprbas_fed", 0); + ssc_data_set_number(data, "ibi_oth_percent_deprbas_sta", 0); + ssc_data_set_number(data, "cbi_fed_amount", 0); + ssc_data_set_number(data, "cbi_fed_maxvalue", 9.9999996802856925e+37); + ssc_data_set_number(data, "cbi_fed_tax_fed", 1); + ssc_data_set_number(data, "cbi_fed_tax_sta", 1); + ssc_data_set_number(data, "cbi_fed_deprbas_fed", 0); + ssc_data_set_number(data, "cbi_fed_deprbas_sta", 0); + ssc_data_set_number(data, "cbi_sta_amount", 0); + ssc_data_set_number(data, "cbi_sta_maxvalue", 9.9999996802856925e+37); + ssc_data_set_number(data, "cbi_sta_tax_fed", 1); + ssc_data_set_number(data, "cbi_sta_tax_sta", 1); + ssc_data_set_number(data, "cbi_sta_deprbas_fed", 0); + ssc_data_set_number(data, "cbi_sta_deprbas_sta", 0); + ssc_data_set_number(data, "cbi_uti_amount", 0); + ssc_data_set_number(data, "cbi_uti_maxvalue", 9.9999996802856925e+37); + ssc_data_set_number(data, "cbi_uti_tax_fed", 1); + ssc_data_set_number(data, "cbi_uti_tax_sta", 1); + ssc_data_set_number(data, "cbi_uti_deprbas_fed", 0); + ssc_data_set_number(data, "cbi_uti_deprbas_sta", 0); + ssc_data_set_number(data, "cbi_oth_amount", 0); + ssc_data_set_number(data, "cbi_oth_maxvalue", 9.9999996802856925e+37); + ssc_data_set_number(data, "cbi_oth_tax_fed", 1); + ssc_data_set_number(data, "cbi_oth_tax_sta", 1); + ssc_data_set_number(data, "cbi_oth_deprbas_fed", 0); + ssc_data_set_number(data, "cbi_oth_deprbas_sta", 0); + ssc_number_t p_pbi_fed_amount[1] = { 0 }; + ssc_data_set_array(data, "pbi_fed_amount", p_pbi_fed_amount, 1); + ssc_data_set_number(data, "pbi_fed_term", 0); + ssc_data_set_number(data, "pbi_fed_escal", 0); + ssc_data_set_number(data, "pbi_fed_tax_fed", 1); + ssc_data_set_number(data, "pbi_fed_tax_sta", 1); + ssc_number_t p_pbi_sta_amount[1] = { 0 }; + ssc_data_set_array(data, "pbi_sta_amount", p_pbi_sta_amount, 1); + ssc_data_set_number(data, "pbi_sta_term", 0); + ssc_data_set_number(data, "pbi_sta_escal", 0); + ssc_data_set_number(data, "pbi_sta_tax_fed", 1); + ssc_data_set_number(data, "pbi_sta_tax_sta", 1); + ssc_number_t p_pbi_uti_amount[1] = { 0 }; + ssc_data_set_array(data, "pbi_uti_amount", p_pbi_uti_amount, 1); + ssc_data_set_number(data, "pbi_uti_term", 0); + ssc_data_set_number(data, "pbi_uti_escal", 0); + ssc_data_set_number(data, "pbi_uti_tax_fed", 1); + ssc_data_set_number(data, "pbi_uti_tax_sta", 1); + ssc_number_t p_pbi_oth_amount[1] = { 0 }; + ssc_data_set_array(data, "pbi_oth_amount", p_pbi_oth_amount, 1); + ssc_data_set_number(data, "pbi_oth_term", 0); + ssc_data_set_number(data, "pbi_oth_escal", 0); + ssc_data_set_number(data, "pbi_oth_tax_fed", 1); + ssc_data_set_number(data, "pbi_oth_tax_sta", 1); + ssc_number_t p_degradation[1] = { 0 }; + ssc_data_set_array(data, "degradation", p_degradation, 1); + ssc_number_t p_roe_input[1] = { 0 }; + ssc_data_set_array(data, "roe_input", p_roe_input, 1); + ssc_data_set_number(data, "loan_moratorium", 0); + ssc_data_set_number(data, "system_use_recapitalization", 0); + ssc_data_set_number(data, "system_use_lifetime_output", 0); + ssc_data_set_number(data, "total_installed_cost", 562201472); + ssc_data_set_number(data, "reserves_interest", 1.75); + ssc_data_set_number(data, "equip1_reserve_cost", 0); + ssc_data_set_number(data, "equip1_reserve_freq", 12); + ssc_data_set_number(data, "equip2_reserve_cost", 0); + ssc_data_set_number(data, "equip2_reserve_freq", 15); + ssc_data_set_number(data, "equip3_reserve_cost", 0); + ssc_data_set_number(data, "equip3_reserve_freq", 3); + ssc_data_set_number(data, "equip_reserve_depr_sta", 0); + ssc_data_set_number(data, "equip_reserve_depr_fed", 0); + ssc_data_set_number(data, "salvage_percentage", 0); + ssc_data_set_number(data, "ppa_soln_mode", 0); + ssc_number_t p_ppa_price_input[1] = { 0.13 }; + ssc_data_set_array(data, "ppa_price_input", p_ppa_price_input, 1); + ssc_data_set_number(data, "cp_capacity_payment_esc", 0); + ssc_data_set_number(data, "cp_capacity_payment_type", 0); + ssc_data_set_number(data, "cp_system_nameplate", 0); + ssc_data_set_number(data, "cp_battery_nameplate", 0); + ssc_data_set_array(data, "cp_capacity_credit_percent", p_ppa_price_input, 1); + ssc_data_set_array(data, "cp_capacity_payment_amount", p_ppa_price_input, 1); + ssc_data_set_number(data, "ppa_escalation", 1); + ssc_data_set_number(data, "construction_financing_cost", 28110074); + ssc_data_set_number(data, "term_tenor", 18); + ssc_data_set_number(data, "term_int_rate", 7); + ssc_data_set_number(data, "dscr", 1.2999999523162842); + ssc_data_set_number(data, "dscr_reserve_months", 6); + ssc_data_set_number(data, "debt_percent", 50); + ssc_data_set_number(data, "debt_option", 1); + ssc_data_set_number(data, "payment_option", 0); + ssc_data_set_number(data, "cost_debt_closing", 450000); + ssc_data_set_number(data, "cost_debt_fee", 2.75); + ssc_data_set_number(data, "months_working_reserve", 6); + ssc_data_set_number(data, "months_receivables_reserve", 0); + ssc_data_set_number(data, "cost_other_financing", 0); + ssc_data_set_number(data, "flip_target_percent", 11); + ssc_data_set_number(data, "flip_target_year", 20); + ssc_data_set_number(data, "depr_alloc_macrs_5_percent", 90); + ssc_data_set_number(data, "depr_alloc_macrs_15_percent", 1.5); + ssc_data_set_number(data, "depr_alloc_sl_5_percent", 0); + ssc_data_set_number(data, "depr_alloc_sl_15_percent", 2.5); + ssc_data_set_number(data, "depr_alloc_sl_20_percent", 3); + ssc_data_set_number(data, "depr_alloc_sl_39_percent", 0); + ssc_data_set_number(data, "depr_alloc_custom_percent", 0); + ssc_number_t p_depr_custom_schedule[1] = { 0 }; + ssc_data_set_array(data, "depr_custom_schedule", p_depr_custom_schedule, 1); + ssc_data_set_number(data, "depr_bonus_sta", 0); + ssc_data_set_number(data, "depr_bonus_sta_macrs_5", 1); + ssc_data_set_number(data, "depr_bonus_sta_macrs_15", 1); + ssc_data_set_number(data, "depr_bonus_sta_sl_5", 0); + ssc_data_set_number(data, "depr_bonus_sta_sl_15", 0); + ssc_data_set_number(data, "depr_bonus_sta_sl_20", 0); + ssc_data_set_number(data, "depr_bonus_sta_sl_39", 0); + ssc_data_set_number(data, "depr_bonus_sta_custom", 0); + ssc_data_set_number(data, "depr_bonus_fed", 0); + ssc_data_set_number(data, "depr_bonus_fed_macrs_5", 1); + ssc_data_set_number(data, "depr_bonus_fed_macrs_15", 1); + ssc_data_set_number(data, "depr_bonus_fed_sl_5", 0); + ssc_data_set_number(data, "depr_bonus_fed_sl_15", 0); + ssc_data_set_number(data, "depr_bonus_fed_sl_20", 0); + ssc_data_set_number(data, "depr_bonus_fed_sl_39", 0); + ssc_data_set_number(data, "depr_bonus_fed_custom", 0); + ssc_data_set_number(data, "depr_itc_sta_macrs_5", 1); + ssc_data_set_number(data, "depr_itc_sta_macrs_15", 0); + ssc_data_set_number(data, "depr_itc_sta_sl_5", 0); + ssc_data_set_number(data, "depr_itc_sta_sl_15", 0); + ssc_data_set_number(data, "depr_itc_sta_sl_20", 0); + ssc_data_set_number(data, "depr_itc_sta_sl_39", 0); + ssc_data_set_number(data, "depr_itc_sta_custom", 0); + ssc_data_set_number(data, "depr_itc_fed_macrs_5", 1); + ssc_data_set_number(data, "depr_itc_fed_macrs_15", 0); + ssc_data_set_number(data, "depr_itc_fed_sl_5", 0); + ssc_data_set_number(data, "depr_itc_fed_sl_15", 0); + ssc_data_set_number(data, "depr_itc_fed_sl_20", 0); + ssc_data_set_number(data, "depr_itc_fed_sl_39", 0); + ssc_data_set_number(data, "depr_itc_fed_custom", 0); + ssc_data_set_number(data, "pbi_fed_for_ds", 0); + ssc_data_set_number(data, "pbi_sta_for_ds", 0); + ssc_data_set_number(data, "pbi_uti_for_ds", 0); + ssc_data_set_number(data, "pbi_oth_for_ds", 0); + ssc_data_set_number(data, "depr_stabas_method", 1); + ssc_data_set_number(data, "depr_fedbas_method", 1); + + return data; +} + +/** +* Default data for iph_to_lcoefcr +*/ +void convert_and_adjust_fixed_charge(ssc_data_t& data) +{ + ssc_data_set_number(data, "electricity_rate", 0.059999998658895493); + ssc_data_set_number(data, "fixed_operating_cost", 103758.203125); +} + +/** +* Default data for lcoefcr +*/ +void fixed_charge_rate_default(ssc_data_t& data) +{ + ssc_data_set_number(data, "capital_cost", 7263074); + ssc_data_set_number(data, "variable_operating_cost", 0.0010000000474974513); + ssc_data_set_number(data, "fixed_charge_rate", 0.10807877779006958); +} diff --git a/third_party/ssc/test/input_cases/generic_common_data.h b/third_party/ssc/test/input_cases/generic_common_data.h index 0426b656d83..c8924c27ff6 100644 --- a/third_party/ssc/test/input_cases/generic_common_data.h +++ b/third_party/ssc/test/input_cases/generic_common_data.h @@ -96,7 +96,8 @@ void generic_singleowner_battery_60min(ssc_data_t &data) ssc_data_set_number( data, "batt_minimum_SOC", 15 ); ssc_data_set_number( data, "batt_maximum_SOC", 95 ); ssc_data_set_number( data, "batt_minimum_modetime", 10 ); - ssc_number_t p_batt_lifetime_matrix[18] ={ 20, 0, 100, 20, 2500, 98, 20, 5000, 95, 80, 0, 100, 80, 500, 98, 80, 1000, 95 }; + ssc_data_set_number(data, "batt_life_model", 0); + ssc_number_t p_batt_lifetime_matrix[18] ={ 20, 0, 100, 20, 2500, 98, 20, 5000, 95, 80, 0, 100, 80, 500, 98, 80, 1000, 95 }; ssc_data_set_matrix( data, "batt_lifetime_matrix", p_batt_lifetime_matrix, 6, 3 ); ssc_data_set_number( data, "batt_calendar_choice", 1 ); ssc_number_t p_batt_calendar_lifetime_matrix[6] ={ 0, 100, 3650, 80, 7300, 50 }; @@ -466,6 +467,7 @@ void generic_commerical_battery_60min(ssc_data_t &data) ssc_data_set_number(data, "batt_minimum_SOC", 15); ssc_data_set_number(data, "batt_maximum_SOC", 95); ssc_data_set_number(data, "batt_minimum_modetime", 10); + ssc_data_set_number(data, "batt_life_model", 0); ssc_number_t p_batt_lifetime_matrix[18] = { 20, 0, 100, 20, 5000, 80, 20, 10000, 60, 80, 0, 100, 80, 1000, 80, 80, 2000, 60 }; ssc_data_set_matrix(data, "batt_lifetime_matrix", p_batt_lifetime_matrix, 6, 3); ssc_data_set_number(data, "batt_calendar_choice", 0); diff --git a/third_party/ssc/test/input_cases/pvsamv1_battery_common_data.h b/third_party/ssc/test/input_cases/pvsamv1_battery_common_data.h index b5d384fe2f0..fcc649c860e 100644 --- a/third_party/ssc/test/input_cases/pvsamv1_battery_common_data.h +++ b/third_party/ssc/test/input_cases/pvsamv1_battery_common_data.h @@ -415,7 +415,8 @@ void pvsamv1_battery_defaults(ssc_data_t& data) { ssc_data_set_number(data, "batt_minimum_SOC", 15); ssc_data_set_number(data, "batt_maximum_SOC", 95); ssc_data_set_number(data, "batt_minimum_modetime", 10); - ssc_number_t p_batt_lifetime_matrix[18] = { 20, 0, 100, 20, 5000, 80, 20, 10000, 60, 80, 0, 100, 80, 1000, 80, 80, 2000, 60 }; + ssc_data_set_number(data, "batt_life_model", 0); + ssc_number_t p_batt_lifetime_matrix[18] = { 20, 0, 100, 20, 5000, 80, 20, 10000, 60, 80, 0, 100, 80, 1000, 80, 80, 2000, 60 }; ssc_data_set_matrix(data, "batt_lifetime_matrix", p_batt_lifetime_matrix, 6, 3); ssc_data_set_number(data, "batt_calendar_choice", 0); ssc_number_t p_batt_calendar_lifetime_matrix[6] = { 0, 100, 3650, 80, 7300, 50 }; @@ -1131,6 +1132,7 @@ void commercial_multiarray_default(ssc_data_t& data) { ssc_data_set_number(data, "batt_minimum_SOC", 15); ssc_data_set_number(data, "batt_maximum_SOC", 95); ssc_data_set_number(data, "batt_minimum_modetime", 10); + ssc_data_set_number(data, "batt_life_model", 0 ); ssc_number_t p_batt_lifetime_matrix[18] = { 20, 0, 100, 20, 5000, 80, 20, 10000, 60, 80, 0, 100, 80, 1000, 80, 80, 2000, 60 }; ssc_data_set_matrix(data, "batt_lifetime_matrix", p_batt_lifetime_matrix, 6, 3); ssc_data_set_number(data, "batt_calendar_choice", 0); diff --git a/third_party/ssc/test/input_cases/pvsamv1_common_data.cpp b/third_party/ssc/test/input_cases/pvsamv1_common_data.cpp index 77b6384c6ae..b31f00bfb33 100644 --- a/third_party/ssc/test/input_cases/pvsamv1_common_data.cpp +++ b/third_party/ssc/test/input_cases/pvsamv1_common_data.cpp @@ -436,6 +436,7 @@ void battery_data_default(ssc_data_t& data) { ssc_data_set_number(data, "batt_minimum_SOC", 15); ssc_data_set_number(data, "batt_maximum_SOC", 95); ssc_data_set_number(data, "batt_minimum_modetime", 10); + ssc_data_set_number(data, "batt_life_model", 0); ssc_number_t p_batt_lifetime_matrix[18] = { 20, 0, 100, 20, 5000, 80, 20, 10000, 60, 80, 0, 100, 80, 1000, 80, 80, 2000, 60 }; ssc_data_set_matrix(data, "batt_lifetime_matrix", p_batt_lifetime_matrix, 6, 3); ssc_data_set_number(data, "batt_replacement_capacity", 50); diff --git a/third_party/ssc/test/tcs_test/tcsdirect_steam_common_data.h b/third_party/ssc/test/input_cases/tcsdirect_steam_defaults.h similarity index 98% rename from third_party/ssc/test/tcs_test/tcsdirect_steam_common_data.h rename to third_party/ssc/test/input_cases/tcsdirect_steam_defaults.h index 5314b99df57..3fb3fba1b0e 100644 --- a/third_party/ssc/test/tcs_test/tcsdirect_steam_common_data.h +++ b/third_party/ssc/test/input_cases/tcsdirect_steam_defaults.h @@ -1,8 +1,7 @@ -#ifndef _TCSDIRECT_STEAM_COMMON_DATA_H_ -#define _TCSDIRECT_STEAM_COMMON_DATA_H_ +#ifndef _TCSDIRECT_STEAM_DEFAULTS_H_ +#define _TCSDIRECT_STEAM_DEFAULTS_H_ #include - #include "../input_cases/code_generator_utilities.h" //const char * SSCDIR = std::getenv("SSCDIR"); @@ -10,22 +9,20 @@ char ndspt_dispatch_factors_path[512]; char ndspt_helio_positions_path[512]; - - int ndspt1 = sprintf(ndspt_dispatch_factors_path, "%s/test/input_cases/directsteam_data/dispatch_factors_ts.csv", std::getenv("SSCDIR")); int ndspt2 = sprintf(ndspt_helio_positions_path, "%s/test/input_cases/directsteam_data/helio_positions.csv", std::getenv("SSCDIR")); /** -* Default data for tcsdirect_steam run that can be further modified +* Default data for tcsdirect_steam technology model */ -void tcsdirect_steam_default(ssc_data_t &data) +ssc_data_t tcsdirect_steam_defaults() { + ssc_data_t data = ssc_data_create(); + char solar_resource_path_default[512]; int n1 = sprintf(solar_resource_path_default, "%s/test/input_cases/directsteam_data/daggett_ca_34.865371_-116.783023_psmv3_60_tmy.csv", std::getenv("SSCDIR")); ssc_data_set_string(data, "solar_resource_file", solar_resource_path_default); - - ssc_data_set_number(data, "system_capacity", 100125); ssc_number_t p_weekday_schedule[288] = { 6, 6, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 6, 6, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5 }; ssc_data_set_matrix(data, "weekday_schedule", p_weekday_schedule, 12, 24); @@ -191,9 +188,8 @@ void tcsdirect_steam_default(ssc_data_t &data) ssc_data_set_number(data, "bop_par_2", 0); ssc_data_set_number(data, "adjust:constant", 4); ssc_data_set_number(data, "sf_adjust:constant", 0); -} - - + return data; +} #endif diff --git a/third_party/ssc/test/tcs_test/tcsfresnel_molten_salt_common_data.h b/third_party/ssc/test/input_cases/tcsfresnel_molten_salt_defaults.h similarity index 98% rename from third_party/ssc/test/tcs_test/tcsfresnel_molten_salt_common_data.h rename to third_party/ssc/test/input_cases/tcsfresnel_molten_salt_defaults.h index 8cbeb293129..251554d1e52 100644 --- a/third_party/ssc/test/tcs_test/tcsfresnel_molten_salt_common_data.h +++ b/third_party/ssc/test/input_cases/tcsfresnel_molten_salt_defaults.h @@ -1,23 +1,22 @@ -#ifndef _TCSFRESNEL_MOLTEN_SALT_COMMON_DATA_H_ -#define _TCSFRESNEL_MOLTEN_SALT_COMMON_DATA_H_ +#ifndef _TCSFRESNEL_MOLTEN_SALT_DEFAULTS_H_ +#define _TCSFRESNEL_MOLTEN_SALT_DEFAULTS_H_ #include - #include "../input_cases/code_generator_utilities.h" //const char * SSCDIR = std::getenv("SSCDIR"); //const char * SAMNTDIR = std::getenv("SAMNTDIR"); char nlfms_ud_ind_od_path[512]; - - int nlfms1 = sprintf(nlfms_ud_ind_od_path, "%s/test/input_cases/linearfresnel_molten_salt_data/ud_ind_od.csv", std::getenv("SSCDIR")); /** -* Default data for tcsfresnel_molten_salt run that can be further modified +* Default data for tcsfresnel_molten_salt technology model */ -void tcsfresnel_molten_salt_default(ssc_data_t &data) +ssc_data_t tcsfresnel_molten_salt_defaults() { + ssc_data_t data = ssc_data_create(); + char solar_resource_path[512]; // This is a copy of the actual weather file used, which has been copied to the ssc repo so it can be found by Travis CI for its tests. // The actual weather file used by SAM could change and thus change the UI output values (different input (i.e., weather file) -> different outputs) @@ -253,6 +252,7 @@ void tcsfresnel_molten_salt_default(ssc_data_t &data) ssc_data_set_number(data, "T_htf_cold_ref", 293); ssc_data_set_number(data, "adjust:constant", 4); + return data; } #endif diff --git a/third_party/ssc/test/tcs_test/tcsmolten_salt_common_data.h b/third_party/ssc/test/input_cases/tcsmolten_salt_defaults.h similarity index 61% rename from third_party/ssc/test/tcs_test/tcsmolten_salt_common_data.h rename to third_party/ssc/test/input_cases/tcsmolten_salt_defaults.h index f1e5fee32c3..52384ec461a 100644 --- a/third_party/ssc/test/tcs_test/tcsmolten_salt_common_data.h +++ b/third_party/ssc/test/input_cases/tcsmolten_salt_defaults.h @@ -1,8 +1,7 @@ -#ifndef _TCSMOLTEN_SALT_COMMON_DATA_H_ -#define _TCSMOLTEN_SALT_COMMON_DATA_H_ +#ifndef _TCSMOLTEN_SALT_DEFAULTS_H_ +#define _TCSMOLTEN_SALT_DEFAULTS_H_ #include - #include "../input_cases/code_generator_utilities.h" //const char * SSCDIR = std::getenv("SSCDIR"); @@ -12,18 +11,18 @@ char dispatch_factors_path[512]; char ud_ind_od_path[512]; char wlim_series_path[512]; char helio_positions_path[512]; - - int nmspt1 = sprintf(dispatch_factors_path, "%s/test/input_cases/moltensalt_data/dispatch_factors_ts.csv", std::getenv("SSCDIR")); int nmspt2 = sprintf(ud_ind_od_path, "%s/test/input_cases/moltensalt_data/ud_ind_od.csv", std::getenv("SSCDIR")); int nmspt3 = sprintf(wlim_series_path, "%s/test/input_cases/moltensalt_data/wlim_series.csv", std::getenv("SSCDIR")); int nmspt4 = sprintf(helio_positions_path, "%s/test/input_cases/moltensalt_data/helio_positions.csv", std::getenv("SSCDIR")); /** -* Default data for tcsmolten_salt run that can be further modified +* Default parameters for tcsmolten_salt technology model */ -void tcsmolten_salt_default(ssc_data_t &data) +ssc_data_t tcsmolten_salt_defaults() { + ssc_data_t data = ssc_data_create(); + char solar_resource_path[512]; // This is a copy of the actual weather file used, which has been copied to the ssc repo so it can be found by Travis CI for its tests. // The actual weather file used by SAM could change and thus change the UI output values (different input (i.e., weather file) -> different outputs) @@ -312,239 +311,7 @@ void tcsmolten_salt_default(ssc_data_t &data) ssc_data_set_number(data, "adjust:constant", 4); ssc_data_set_number(data, "sf_adjust:constant", 0); -} - -/** -* Default data for the PPA single owner (utility) run that can be further modified -*/ -void single_owner_default(ssc_data_t &data) -{ - ssc_data_set_number(data, "analysis_period", 25); - ssc_number_t p_federal_tax_rate[1] = { 21 }; - ssc_data_set_array(data, "federal_tax_rate", p_federal_tax_rate, 1); - ssc_number_t p_state_tax_rate[1] = { 7 }; - ssc_data_set_array(data, "state_tax_rate", p_state_tax_rate, 1); - ssc_data_set_number(data, "property_tax_rate", 0); - ssc_data_set_number(data, "prop_tax_cost_assessed_percent", 100); - ssc_data_set_number(data, "prop_tax_assessed_decline", 0); - ssc_data_set_number(data, "real_discount_rate", 6.4); - ssc_data_set_number(data, "inflation_rate", 2.5); - ssc_data_set_number(data, "insurance_rate", 0.5); - ssc_data_set_number(data, "system_capacity", 103500); - ssc_number_t p_om_fixed[1] = { 0 }; - ssc_data_set_array(data, "om_fixed", p_om_fixed, 1); - ssc_data_set_number(data, "om_fixed_escal", 0); - ssc_number_t p_om_production[1] = { 3.5 }; - ssc_data_set_array(data, "om_production", p_om_production, 1); - ssc_data_set_number(data, "om_production_escal", 0); - ssc_number_t p_om_capacity[1] = { 66 }; - ssc_data_set_array(data, "om_capacity", p_om_capacity, 1); - ssc_data_set_number(data, "om_capacity_escal", 0); - ssc_number_t p_om_fuel_cost[1] = { 0 }; - ssc_data_set_array(data, "om_fuel_cost", p_om_fuel_cost, 1); - ssc_data_set_number(data, "om_fuel_cost_escal", 0); - ssc_data_set_number(data, "itc_fed_amount", 0); - ssc_data_set_number(data, "itc_fed_amount_deprbas_fed", 1); - ssc_data_set_number(data, "itc_fed_amount_deprbas_sta", 1); - ssc_data_set_number(data, "itc_sta_amount", 0); - ssc_data_set_number(data, "itc_sta_amount_deprbas_fed", 0); - ssc_data_set_number(data, "itc_sta_amount_deprbas_sta", 0); - ssc_data_set_number(data, "itc_fed_percent", 30); - ssc_data_set_number(data, "itc_fed_percent_maxvalue", 10e+37); - ssc_data_set_number(data, "itc_fed_percent_deprbas_fed", 1); - ssc_data_set_number(data, "itc_fed_percent_deprbas_sta", 1); - ssc_data_set_number(data, "itc_sta_percent", 0); - ssc_data_set_number(data, "itc_sta_percent_maxvalue", 10e+37); - ssc_data_set_number(data, "itc_sta_percent_deprbas_fed", 0); - ssc_data_set_number(data, "itc_sta_percent_deprbas_sta", 0); - ssc_number_t p_ptc_fed_amount[1] = { 0 }; - ssc_data_set_array(data, "ptc_fed_amount", p_ptc_fed_amount, 1); - ssc_data_set_number(data, "ptc_fed_term", 10); - ssc_data_set_number(data, "ptc_fed_escal", 0); - ssc_number_t p_ptc_sta_amount[1] = { 0 }; - ssc_data_set_array(data, "ptc_sta_amount", p_ptc_sta_amount, 1); - ssc_data_set_number(data, "ptc_sta_term", 10); - ssc_data_set_number(data, "ptc_sta_escal", 0); - ssc_data_set_number(data, "ibi_fed_amount", 0); - ssc_data_set_number(data, "ibi_fed_amount_tax_fed", 1); - ssc_data_set_number(data, "ibi_fed_amount_tax_sta", 1); - ssc_data_set_number(data, "ibi_fed_amount_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_fed_amount_deprbas_sta", 0); - ssc_data_set_number(data, "ibi_sta_amount", 0); - ssc_data_set_number(data, "ibi_sta_amount_tax_fed", 1); - ssc_data_set_number(data, "ibi_sta_amount_tax_sta", 1); - ssc_data_set_number(data, "ibi_sta_amount_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_sta_amount_deprbas_sta", 0); - ssc_data_set_number(data, "ibi_uti_amount", 0); - ssc_data_set_number(data, "ibi_uti_amount_tax_fed", 1); - ssc_data_set_number(data, "ibi_uti_amount_tax_sta", 1); - ssc_data_set_number(data, "ibi_uti_amount_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_uti_amount_deprbas_sta", 0); - ssc_data_set_number(data, "ibi_oth_amount", 0); - ssc_data_set_number(data, "ibi_oth_amount_tax_fed", 1); - ssc_data_set_number(data, "ibi_oth_amount_tax_sta", 1); - ssc_data_set_number(data, "ibi_oth_amount_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_oth_amount_deprbas_sta", 0); - ssc_data_set_number(data, "ibi_fed_percent", 0); - ssc_data_set_number(data, "ibi_fed_percent_maxvalue", 10e+37); - ssc_data_set_number(data, "ibi_fed_percent_tax_fed", 1); - ssc_data_set_number(data, "ibi_fed_percent_tax_sta", 1); - ssc_data_set_number(data, "ibi_fed_percent_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_fed_percent_deprbas_sta", 0); - ssc_data_set_number(data, "ibi_sta_percent", 0); - ssc_data_set_number(data, "ibi_sta_percent_maxvalue", 10e+37); - ssc_data_set_number(data, "ibi_sta_percent_tax_fed", 1); - ssc_data_set_number(data, "ibi_sta_percent_tax_sta", 1); - ssc_data_set_number(data, "ibi_sta_percent_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_sta_percent_deprbas_sta", 0); - ssc_data_set_number(data, "ibi_uti_percent", 0); - ssc_data_set_number(data, "ibi_uti_percent_maxvalue", 10e+37); - ssc_data_set_number(data, "ibi_uti_percent_tax_fed", 1); - ssc_data_set_number(data, "ibi_uti_percent_tax_sta", 1); - ssc_data_set_number(data, "ibi_uti_percent_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_uti_percent_deprbas_sta", 0); - ssc_data_set_number(data, "ibi_oth_percent", 0); - ssc_data_set_number(data, "ibi_oth_percent_maxvalue", 10e+37); - ssc_data_set_number(data, "ibi_oth_percent_tax_fed", 1); - ssc_data_set_number(data, "ibi_oth_percent_tax_sta", 1); - ssc_data_set_number(data, "ibi_oth_percent_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_oth_percent_deprbas_sta", 0); - ssc_data_set_number(data, "cbi_fed_amount", 0); - ssc_data_set_number(data, "cbi_fed_maxvalue", 10e+37); - ssc_data_set_number(data, "cbi_fed_tax_fed", 1); - ssc_data_set_number(data, "cbi_fed_tax_sta", 1); - ssc_data_set_number(data, "cbi_fed_deprbas_fed", 0); - ssc_data_set_number(data, "cbi_fed_deprbas_sta", 0); - ssc_data_set_number(data, "cbi_sta_amount", 0); - ssc_data_set_number(data, "cbi_sta_maxvalue", 10e+37); - ssc_data_set_number(data, "cbi_sta_tax_fed", 1); - ssc_data_set_number(data, "cbi_sta_tax_sta", 1); - ssc_data_set_number(data, "cbi_sta_deprbas_fed", 0); - ssc_data_set_number(data, "cbi_sta_deprbas_sta", 0); - ssc_data_set_number(data, "cbi_uti_amount", 0); - ssc_data_set_number(data, "cbi_uti_maxvalue", 10e+37); - ssc_data_set_number(data, "cbi_uti_tax_fed", 1); - ssc_data_set_number(data, "cbi_uti_tax_sta", 1); - ssc_data_set_number(data, "cbi_uti_deprbas_fed", 0); - ssc_data_set_number(data, "cbi_uti_deprbas_sta", 0); - ssc_data_set_number(data, "cbi_oth_amount", 0); - ssc_data_set_number(data, "cbi_oth_maxvalue", 10e+37); - ssc_data_set_number(data, "cbi_oth_tax_fed", 1); - ssc_data_set_number(data, "cbi_oth_tax_sta", 1); - ssc_data_set_number(data, "cbi_oth_deprbas_fed", 0); - ssc_data_set_number(data, "cbi_oth_deprbas_sta", 0); - ssc_number_t p_pbi_fed_amount[1] = { 0 }; - ssc_data_set_array(data, "pbi_fed_amount", p_pbi_fed_amount, 1); - ssc_data_set_number(data, "pbi_fed_term", 0); - ssc_data_set_number(data, "pbi_fed_escal", 0); - ssc_data_set_number(data, "pbi_fed_tax_fed", 1); - ssc_data_set_number(data, "pbi_fed_tax_sta", 1); - ssc_number_t p_pbi_sta_amount[1] = { 0 }; - ssc_data_set_array(data, "pbi_sta_amount", p_pbi_sta_amount, 1); - ssc_data_set_number(data, "pbi_sta_term", 0); - ssc_data_set_number(data, "pbi_sta_escal", 0); - ssc_data_set_number(data, "pbi_sta_tax_fed", 1); - ssc_data_set_number(data, "pbi_sta_tax_sta", 1); - ssc_number_t p_pbi_uti_amount[1] = { 0 }; - ssc_data_set_array(data, "pbi_uti_amount", p_pbi_uti_amount, 1); - ssc_data_set_number(data, "pbi_uti_term", 0); - ssc_data_set_number(data, "pbi_uti_escal", 0); - ssc_data_set_number(data, "pbi_uti_tax_fed", 1); - ssc_data_set_number(data, "pbi_uti_tax_sta", 1); - ssc_number_t p_pbi_oth_amount[1] = { 0 }; - ssc_data_set_array(data, "pbi_oth_amount", p_pbi_oth_amount, 1); - ssc_data_set_number(data, "pbi_oth_term", 0); - ssc_data_set_number(data, "pbi_oth_escal", 0); - ssc_data_set_number(data, "pbi_oth_tax_fed", 1); - ssc_data_set_number(data, "pbi_oth_tax_sta", 1); - ssc_number_t p_degradation[1] = { 0 }; - ssc_data_set_array(data, "degradation", p_degradation, 1); - ssc_number_t p_roe_input[1] = { 0 }; - ssc_data_set_array(data, "roe_input", p_roe_input, 1); - ssc_data_set_number(data, "loan_moratorium", 0); - ssc_data_set_number(data, "system_use_recapitalization", 0); - ssc_data_set_number(data, "system_use_lifetime_output", 0); - ssc_data_set_number(data, "total_installed_cost", 673465536); - ssc_data_set_number(data, "reserves_interest", 1.75); - ssc_data_set_number(data, "equip1_reserve_cost", 0); - ssc_data_set_number(data, "equip1_reserve_freq", 12); - ssc_data_set_number(data, "equip2_reserve_cost", 0); - ssc_data_set_number(data, "equip2_reserve_freq", 15); - ssc_data_set_number(data, "equip3_reserve_cost", 0); - ssc_data_set_number(data, "equip3_reserve_freq", 3); - ssc_data_set_number(data, "equip_reserve_depr_sta", 0); - ssc_data_set_number(data, "equip_reserve_depr_fed", 0); - ssc_data_set_number(data, "salvage_percentage", 0); - ssc_data_set_number(data, "ppa_soln_mode", 0); - ssc_number_t p_ppa_price_input[1] = { 0.13 }; - ssc_data_set_array(data, "ppa_price_input", p_ppa_price_input, 1); - ssc_data_set_number(data, "cp_capacity_payment_esc", 0); - ssc_data_set_number(data, "cp_capacity_payment_type", 0); - ssc_data_set_number(data, "cp_system_nameplate", 0); - ssc_data_set_number(data, "cp_battery_nameplate", 0); - ssc_data_set_array(data, "cp_capacity_credit_percent", p_ppa_price_input, 1); - ssc_data_set_array(data, "cp_capacity_payment_amount", p_ppa_price_input, 1); - ssc_data_set_number(data, "ppa_escalation", 1); - ssc_data_set_number(data, "construction_financing_cost", 33673276); - ssc_data_set_number(data, "term_tenor", 18); - ssc_data_set_number(data, "term_int_rate", 7); - ssc_data_set_number(data, "dscr", 1.3); - ssc_data_set_number(data, "dscr_reserve_months", 6); - ssc_data_set_number(data, "debt_percent", 50); - ssc_data_set_number(data, "debt_option", 1); - ssc_data_set_number(data, "payment_option", 0); - ssc_data_set_number(data, "cost_debt_closing", 450000); - ssc_data_set_number(data, "cost_debt_fee", 2.75); - ssc_data_set_number(data, "months_working_reserve", 6); - ssc_data_set_number(data, "months_receivables_reserve", 0); - ssc_data_set_number(data, "cost_other_financing", 0); - ssc_data_set_number(data, "flip_target_percent", 11); - ssc_data_set_number(data, "flip_target_year", 20); - ssc_data_set_number(data, "depr_alloc_macrs_5_percent", 90); - ssc_data_set_number(data, "depr_alloc_macrs_15_percent", 1.5); - ssc_data_set_number(data, "depr_alloc_sl_5_percent", 0); - ssc_data_set_number(data, "depr_alloc_sl_15_percent", 2.5); - ssc_data_set_number(data, "depr_alloc_sl_20_percent", 3); - ssc_data_set_number(data, "depr_alloc_sl_39_percent", 0); - ssc_data_set_number(data, "depr_alloc_custom_percent", 0); - ssc_number_t p_depr_custom_schedule[1] = { 0 }; - ssc_data_set_array(data, "depr_custom_schedule", p_depr_custom_schedule, 1); - ssc_data_set_number(data, "depr_bonus_sta", 0); - ssc_data_set_number(data, "depr_bonus_sta_macrs_5", 1); - ssc_data_set_number(data, "depr_bonus_sta_macrs_15", 1); - ssc_data_set_number(data, "depr_bonus_sta_sl_5", 0); - ssc_data_set_number(data, "depr_bonus_sta_sl_15", 0); - ssc_data_set_number(data, "depr_bonus_sta_sl_20", 0); - ssc_data_set_number(data, "depr_bonus_sta_sl_39", 0); - ssc_data_set_number(data, "depr_bonus_sta_custom", 0); - ssc_data_set_number(data, "depr_bonus_fed", 0); - ssc_data_set_number(data, "depr_bonus_fed_macrs_5", 1); - ssc_data_set_number(data, "depr_bonus_fed_macrs_15", 1); - ssc_data_set_number(data, "depr_bonus_fed_sl_5", 0); - ssc_data_set_number(data, "depr_bonus_fed_sl_15", 0); - ssc_data_set_number(data, "depr_bonus_fed_sl_20", 0); - ssc_data_set_number(data, "depr_bonus_fed_sl_39", 0); - ssc_data_set_number(data, "depr_bonus_fed_custom", 0); - ssc_data_set_number(data, "depr_itc_sta_macrs_5", 1); - ssc_data_set_number(data, "depr_itc_sta_macrs_15", 0); - ssc_data_set_number(data, "depr_itc_sta_sl_5", 0); - ssc_data_set_number(data, "depr_itc_sta_sl_15", 0); - ssc_data_set_number(data, "depr_itc_sta_sl_20", 0); - ssc_data_set_number(data, "depr_itc_sta_sl_39", 0); - ssc_data_set_number(data, "depr_itc_sta_custom", 0); - ssc_data_set_number(data, "depr_itc_fed_macrs_5", 1); - ssc_data_set_number(data, "depr_itc_fed_macrs_15", 0); - ssc_data_set_number(data, "depr_itc_fed_sl_5", 0); - ssc_data_set_number(data, "depr_itc_fed_sl_15", 0); - ssc_data_set_number(data, "depr_itc_fed_sl_20", 0); - ssc_data_set_number(data, "depr_itc_fed_sl_39", 0); - ssc_data_set_number(data, "depr_itc_fed_custom", 0); - ssc_data_set_number(data, "pbi_fed_for_ds", 0); - ssc_data_set_number(data, "pbi_sta_for_ds", 0); - ssc_data_set_number(data, "pbi_uti_for_ds", 0); - ssc_data_set_number(data, "pbi_oth_for_ds", 0); - ssc_data_set_number(data, "depr_stabas_method", 1); - ssc_data_set_number(data, "depr_fedbas_method", 1); + return data; } #endif diff --git a/third_party/ssc/test/tcs_test/tcstrough_empirical_common_data.h b/third_party/ssc/test/input_cases/tcstrough_empirical_defaults.h similarity index 97% rename from third_party/ssc/test/tcs_test/tcstrough_empirical_common_data.h rename to third_party/ssc/test/input_cases/tcstrough_empirical_defaults.h index e7f2669c9ce..3887bbc828c 100644 --- a/third_party/ssc/test/tcs_test/tcstrough_empirical_common_data.h +++ b/third_party/ssc/test/input_cases/tcstrough_empirical_defaults.h @@ -1,16 +1,16 @@ -#ifndef _TCSTROUGH_EMPIRICAL_COMMON_DATA_H -#define _TCSTROUGH_EMPIRICAL_COMMON_DATA_H +#ifndef _TCSTROUGH_EMPIRICAL_DEFAULTS_H +#define _TCSTROUGH_EMPIRICAL_DEFAULTS_H #include - #include "../input_cases/code_generator_utilities.h" - /** -* Default data for tcstrough_empirical run that can be further modified +* Default data for tcstrough_empirical technology model */ -void tcstrough_empirical_default(ssc_data_t &data) +ssc_data_t tcstrough_empirical_defaults() { + ssc_data_t data = ssc_data_create(); + char solar_resource_path[512]; int n1 = sprintf(solar_resource_path, "%s/test/input_cases/trough_empirical_data/tucson_az_32.116521_-110.933042_psmv3_60_tmy.csv", std::getenv("SSCDIR")); @@ -153,6 +153,8 @@ void tcstrough_empirical_default(ssc_data_t &data) ssc_data_set_number(data, "HhtfParF2", 0.79400000000000004); ssc_data_set_number(data, "PbFixPar", 0.61049997806549072); ssc_data_set_number(data, "adjust:constant", 4); + + return data; } #endif diff --git a/third_party/ssc/test/tcs_test/trough_physical_common_data.h b/third_party/ssc/test/input_cases/trough_physical_defaults.h similarity index 65% rename from third_party/ssc/test/tcs_test/trough_physical_common_data.h rename to third_party/ssc/test/input_cases/trough_physical_defaults.h index f5dcc8ad360..0b67d0d2026 100644 --- a/third_party/ssc/test/tcs_test/trough_physical_common_data.h +++ b/third_party/ssc/test/input_cases/trough_physical_defaults.h @@ -1,8 +1,7 @@ -#ifndef _TROUGH_PHYSICAL_COMMON_DATA_H_ -#define _TROUGH_PHYSICAL_COMMON_DATA_H_ +#ifndef _TROUGH_PHYSICAL_DEFAULTS_H_ +#define _TROUGH_PHYSICAL_DEFAULTS_H_ #include - #include "../input_cases/code_generator_utilities.h" //const char * SSCDIR = std::getenv("SSCDIR"); @@ -11,17 +10,17 @@ char dispatch_factors_path_tp[512]; char ud_ind_od_path_tp[512]; char wlim_series_path_tp[512]; - - int ntp1 = sprintf(dispatch_factors_path_tp, "%s/test/input_cases/moltensalt_data/dispatch_factors_ts.csv", std::getenv("SSCDIR")); int ntp2 = sprintf(ud_ind_od_path_tp, "%s/test/input_cases/moltensalt_data/ud_ind_od.csv", std::getenv("SSCDIR")); int ntp3 = sprintf(wlim_series_path_tp, "%s/test/input_cases/moltensalt_data/wlim_series.csv", std::getenv("SSCDIR")); /** -* Default data for trough_physical run that can be further modified +* Default data for trough_physical technology model */ -void trough_physical_default(ssc_data_t &data) +ssc_data_t trough_physical_defaults() { + ssc_data_t data = ssc_data_create(); + char solar_resource_path[512]; int n1 = sprintf(solar_resource_path, "%s/test/input_cases/tcstrough_data/tucson_az_32.116521_-110.933042_psmv3_60_tmy.csv", std::getenv("SSCDIR")); @@ -293,261 +292,8 @@ void trough_physical_default(ssc_data_t &data) ssc_data_set_matrix(data, "tes_lengths", p_tes_lengths, 1, 11); ssc_data_set_number(data, "DP_SGS", 0); ssc_data_set_number(data, "adjust:constant", 4); -} -/** -* Default data for the PPA single owner (utility) run that can be further modified -*/ -void trough_physical_single_owner_default(ssc_data_t &data) -{ - ssc_data_set_number(data, "analysis_period", 25); - ssc_number_t p_federal_tax_rate[1] = { 21 }; - ssc_data_set_array(data, "federal_tax_rate", p_federal_tax_rate, 1); - ssc_number_t p_state_tax_rate[1] = { 7 }; - ssc_data_set_array(data, "state_tax_rate", p_state_tax_rate, 1); - ssc_data_set_number(data, "property_tax_rate", 0); - ssc_data_set_number(data, "prop_tax_cost_assessed_percent", 100); - ssc_data_set_number(data, "prop_tax_assessed_decline", 0); - ssc_data_set_number(data, "real_discount_rate", 6.4000000953674316); - ssc_data_set_number(data, "inflation_rate", 2.5); - ssc_data_set_number(data, "insurance_rate", 0.5); - ssc_data_set_number(data, "system_capacity", 99899.9921875); - ssc_number_t p_om_fixed[1] = { 0 }; - ssc_data_set_array(data, "om_fixed", p_om_fixed, 1); - ssc_data_set_number(data, "om_fixed_escal", 0); - ssc_number_t p_om_production[1] = { 4 }; - ssc_data_set_array(data, "om_production", p_om_production, 1); - ssc_data_set_number(data, "om_production_escal", 0); - ssc_number_t p_om_capacity[1] = { 66 }; - ssc_data_set_array(data, "om_capacity", p_om_capacity, 1); - ssc_data_set_number(data, "om_capacity_escal", 0); - ssc_number_t p_om_fuel_cost[1] = { 0 }; - ssc_data_set_array(data, "om_fuel_cost", p_om_fuel_cost, 1); - ssc_data_set_number(data, "om_fuel_cost_escal", 0); - ssc_number_t p_om_replacement_cost1[1] = { 0 }; - ssc_data_set_array(data, "om_replacement_cost1", p_om_replacement_cost1, 1); - ssc_data_set_number(data, "om_replacement_cost_escal", 0); - ssc_data_set_number(data, "itc_fed_amount", 0); - ssc_data_set_number(data, "itc_fed_amount_deprbas_fed", 1); - ssc_data_set_number(data, "itc_fed_amount_deprbas_sta", 1); - ssc_data_set_number(data, "itc_sta_amount", 0); - ssc_data_set_number(data, "itc_sta_amount_deprbas_fed", 0); - ssc_data_set_number(data, "itc_sta_amount_deprbas_sta", 0); - ssc_data_set_number(data, "itc_fed_percent", 30); - ssc_data_set_number(data, "itc_fed_percent_maxvalue", 9.9999996802856925e+37); - ssc_data_set_number(data, "itc_fed_percent_deprbas_fed", 1); - ssc_data_set_number(data, "itc_fed_percent_deprbas_sta", 1); - ssc_data_set_number(data, "itc_sta_percent", 0); - ssc_data_set_number(data, "itc_sta_percent_maxvalue", 9.9999996802856925e+37); - ssc_data_set_number(data, "itc_sta_percent_deprbas_fed", 0); - ssc_data_set_number(data, "itc_sta_percent_deprbas_sta", 0); - ssc_number_t p_ptc_fed_amount[1] = { 0 }; - ssc_data_set_array(data, "ptc_fed_amount", p_ptc_fed_amount, 1); - ssc_data_set_number(data, "ptc_fed_term", 10); - ssc_data_set_number(data, "ptc_fed_escal", 0); - ssc_number_t p_ptc_sta_amount[1] = { 0 }; - ssc_data_set_array(data, "ptc_sta_amount", p_ptc_sta_amount, 1); - ssc_data_set_number(data, "ptc_sta_term", 10); - ssc_data_set_number(data, "ptc_sta_escal", 0); - ssc_data_set_number(data, "ibi_fed_amount", 0); - ssc_data_set_number(data, "ibi_fed_amount_tax_fed", 1); - ssc_data_set_number(data, "ibi_fed_amount_tax_sta", 1); - ssc_data_set_number(data, "ibi_fed_amount_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_fed_amount_deprbas_sta", 0); - ssc_data_set_number(data, "ibi_sta_amount", 0); - ssc_data_set_number(data, "ibi_sta_amount_tax_fed", 1); - ssc_data_set_number(data, "ibi_sta_amount_tax_sta", 1); - ssc_data_set_number(data, "ibi_sta_amount_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_sta_amount_deprbas_sta", 0); - ssc_data_set_number(data, "ibi_uti_amount", 0); - ssc_data_set_number(data, "ibi_uti_amount_tax_fed", 1); - ssc_data_set_number(data, "ibi_uti_amount_tax_sta", 1); - ssc_data_set_number(data, "ibi_uti_amount_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_uti_amount_deprbas_sta", 0); - ssc_data_set_number(data, "ibi_oth_amount", 0); - ssc_data_set_number(data, "ibi_oth_amount_tax_fed", 1); - ssc_data_set_number(data, "ibi_oth_amount_tax_sta", 1); - ssc_data_set_number(data, "ibi_oth_amount_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_oth_amount_deprbas_sta", 0); - ssc_data_set_number(data, "ibi_fed_percent", 0); - ssc_data_set_number(data, "ibi_fed_percent_maxvalue", 9.9999996802856925e+37); - ssc_data_set_number(data, "ibi_fed_percent_tax_fed", 1); - ssc_data_set_number(data, "ibi_fed_percent_tax_sta", 1); - ssc_data_set_number(data, "ibi_fed_percent_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_fed_percent_deprbas_sta", 0); - ssc_data_set_number(data, "ibi_sta_percent", 0); - ssc_data_set_number(data, "ibi_sta_percent_maxvalue", 9.9999996802856925e+37); - ssc_data_set_number(data, "ibi_sta_percent_tax_fed", 1); - ssc_data_set_number(data, "ibi_sta_percent_tax_sta", 1); - ssc_data_set_number(data, "ibi_sta_percent_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_sta_percent_deprbas_sta", 0); - ssc_data_set_number(data, "ibi_uti_percent", 0); - ssc_data_set_number(data, "ibi_uti_percent_maxvalue", 9.9999996802856925e+37); - ssc_data_set_number(data, "ibi_uti_percent_tax_fed", 1); - ssc_data_set_number(data, "ibi_uti_percent_tax_sta", 1); - ssc_data_set_number(data, "ibi_uti_percent_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_uti_percent_deprbas_sta", 0); - ssc_data_set_number(data, "ibi_oth_percent", 0); - ssc_data_set_number(data, "ibi_oth_percent_maxvalue", 9.9999996802856925e+37); - ssc_data_set_number(data, "ibi_oth_percent_tax_fed", 1); - ssc_data_set_number(data, "ibi_oth_percent_tax_sta", 1); - ssc_data_set_number(data, "ibi_oth_percent_deprbas_fed", 0); - ssc_data_set_number(data, "ibi_oth_percent_deprbas_sta", 0); - ssc_data_set_number(data, "cbi_fed_amount", 0); - ssc_data_set_number(data, "cbi_fed_maxvalue", 9.9999996802856925e+37); - ssc_data_set_number(data, "cbi_fed_tax_fed", 1); - ssc_data_set_number(data, "cbi_fed_tax_sta", 1); - ssc_data_set_number(data, "cbi_fed_deprbas_fed", 0); - ssc_data_set_number(data, "cbi_fed_deprbas_sta", 0); - ssc_data_set_number(data, "cbi_sta_amount", 0); - ssc_data_set_number(data, "cbi_sta_maxvalue", 9.9999996802856925e+37); - ssc_data_set_number(data, "cbi_sta_tax_fed", 1); - ssc_data_set_number(data, "cbi_sta_tax_sta", 1); - ssc_data_set_number(data, "cbi_sta_deprbas_fed", 0); - ssc_data_set_number(data, "cbi_sta_deprbas_sta", 0); - ssc_data_set_number(data, "cbi_uti_amount", 0); - ssc_data_set_number(data, "cbi_uti_maxvalue", 9.9999996802856925e+37); - ssc_data_set_number(data, "cbi_uti_tax_fed", 1); - ssc_data_set_number(data, "cbi_uti_tax_sta", 1); - ssc_data_set_number(data, "cbi_uti_deprbas_fed", 0); - ssc_data_set_number(data, "cbi_uti_deprbas_sta", 0); - ssc_data_set_number(data, "cbi_oth_amount", 0); - ssc_data_set_number(data, "cbi_oth_maxvalue", 9.9999996802856925e+37); - ssc_data_set_number(data, "cbi_oth_tax_fed", 1); - ssc_data_set_number(data, "cbi_oth_tax_sta", 1); - ssc_data_set_number(data, "cbi_oth_deprbas_fed", 0); - ssc_data_set_number(data, "cbi_oth_deprbas_sta", 0); - ssc_number_t p_pbi_fed_amount[1] = { 0 }; - ssc_data_set_array(data, "pbi_fed_amount", p_pbi_fed_amount, 1); - ssc_data_set_number(data, "pbi_fed_term", 0); - ssc_data_set_number(data, "pbi_fed_escal", 0); - ssc_data_set_number(data, "pbi_fed_tax_fed", 1); - ssc_data_set_number(data, "pbi_fed_tax_sta", 1); - ssc_number_t p_pbi_sta_amount[1] = { 0 }; - ssc_data_set_array(data, "pbi_sta_amount", p_pbi_sta_amount, 1); - ssc_data_set_number(data, "pbi_sta_term", 0); - ssc_data_set_number(data, "pbi_sta_escal", 0); - ssc_data_set_number(data, "pbi_sta_tax_fed", 1); - ssc_data_set_number(data, "pbi_sta_tax_sta", 1); - ssc_number_t p_pbi_uti_amount[1] = { 0 }; - ssc_data_set_array(data, "pbi_uti_amount", p_pbi_uti_amount, 1); - ssc_data_set_number(data, "pbi_uti_term", 0); - ssc_data_set_number(data, "pbi_uti_escal", 0); - ssc_data_set_number(data, "pbi_uti_tax_fed", 1); - ssc_data_set_number(data, "pbi_uti_tax_sta", 1); - ssc_number_t p_pbi_oth_amount[1] = { 0 }; - ssc_data_set_array(data, "pbi_oth_amount", p_pbi_oth_amount, 1); - ssc_data_set_number(data, "pbi_oth_term", 0); - ssc_data_set_number(data, "pbi_oth_escal", 0); - ssc_data_set_number(data, "pbi_oth_tax_fed", 1); - ssc_data_set_number(data, "pbi_oth_tax_sta", 1); - ssc_number_t p_degradation[1] = { 0 }; - ssc_data_set_array(data, "degradation", p_degradation, 1); - ssc_number_t p_roe_input[1] = { 0 }; - ssc_data_set_array(data, "roe_input", p_roe_input, 1); - ssc_data_set_number(data, "loan_moratorium", 0); - ssc_data_set_number(data, "system_use_recapitalization", 0); - ssc_data_set_number(data, "system_use_lifetime_output", 0); - ssc_data_set_number(data, "total_installed_cost", 562201472); - ssc_data_set_number(data, "reserves_interest", 1.75); - ssc_data_set_number(data, "equip1_reserve_cost", 0); - ssc_data_set_number(data, "equip1_reserve_freq", 12); - ssc_data_set_number(data, "equip2_reserve_cost", 0); - ssc_data_set_number(data, "equip2_reserve_freq", 15); - ssc_data_set_number(data, "equip3_reserve_cost", 0); - ssc_data_set_number(data, "equip3_reserve_freq", 3); - ssc_data_set_number(data, "equip_reserve_depr_sta", 0); - ssc_data_set_number(data, "equip_reserve_depr_fed", 0); - ssc_data_set_number(data, "salvage_percentage", 0); - ssc_data_set_number(data, "ppa_soln_mode", 0); - ssc_number_t p_ppa_price_input[1] = { 0.13 }; - ssc_data_set_array(data, "ppa_price_input", p_ppa_price_input, 1); - ssc_data_set_number(data, "cp_capacity_payment_esc", 0); - ssc_data_set_number(data, "cp_capacity_payment_type", 0); - ssc_data_set_number(data, "cp_system_nameplate", 0); - ssc_data_set_number(data, "cp_battery_nameplate", 0); - ssc_data_set_array(data, "cp_capacity_credit_percent", p_ppa_price_input, 1); - ssc_data_set_array(data, "cp_capacity_payment_amount", p_ppa_price_input, 1); - ssc_data_set_number(data, "ppa_escalation", 1); - ssc_data_set_number(data, "construction_financing_cost", 28110074); - ssc_data_set_number(data, "term_tenor", 18); - ssc_data_set_number(data, "term_int_rate", 7); - ssc_data_set_number(data, "dscr", 1.2999999523162842); - ssc_data_set_number(data, "dscr_reserve_months", 6); - ssc_data_set_number(data, "debt_percent", 50); - ssc_data_set_number(data, "debt_option", 1); - ssc_data_set_number(data, "payment_option", 0); - ssc_data_set_number(data, "cost_debt_closing", 450000); - ssc_data_set_number(data, "cost_debt_fee", 2.75); - ssc_data_set_number(data, "months_working_reserve", 6); - ssc_data_set_number(data, "months_receivables_reserve", 0); - ssc_data_set_number(data, "cost_other_financing", 0); - ssc_data_set_number(data, "flip_target_percent", 11); - ssc_data_set_number(data, "flip_target_year", 20); - ssc_data_set_number(data, "depr_alloc_macrs_5_percent", 90); - ssc_data_set_number(data, "depr_alloc_macrs_15_percent", 1.5); - ssc_data_set_number(data, "depr_alloc_sl_5_percent", 0); - ssc_data_set_number(data, "depr_alloc_sl_15_percent", 2.5); - ssc_data_set_number(data, "depr_alloc_sl_20_percent", 3); - ssc_data_set_number(data, "depr_alloc_sl_39_percent", 0); - ssc_data_set_number(data, "depr_alloc_custom_percent", 0); - ssc_number_t p_depr_custom_schedule[1] = { 0 }; - ssc_data_set_array(data, "depr_custom_schedule", p_depr_custom_schedule, 1); - ssc_data_set_number(data, "depr_bonus_sta", 0); - ssc_data_set_number(data, "depr_bonus_sta_macrs_5", 1); - ssc_data_set_number(data, "depr_bonus_sta_macrs_15", 1); - ssc_data_set_number(data, "depr_bonus_sta_sl_5", 0); - ssc_data_set_number(data, "depr_bonus_sta_sl_15", 0); - ssc_data_set_number(data, "depr_bonus_sta_sl_20", 0); - ssc_data_set_number(data, "depr_bonus_sta_sl_39", 0); - ssc_data_set_number(data, "depr_bonus_sta_custom", 0); - ssc_data_set_number(data, "depr_bonus_fed", 0); - ssc_data_set_number(data, "depr_bonus_fed_macrs_5", 1); - ssc_data_set_number(data, "depr_bonus_fed_macrs_15", 1); - ssc_data_set_number(data, "depr_bonus_fed_sl_5", 0); - ssc_data_set_number(data, "depr_bonus_fed_sl_15", 0); - ssc_data_set_number(data, "depr_bonus_fed_sl_20", 0); - ssc_data_set_number(data, "depr_bonus_fed_sl_39", 0); - ssc_data_set_number(data, "depr_bonus_fed_custom", 0); - ssc_data_set_number(data, "depr_itc_sta_macrs_5", 1); - ssc_data_set_number(data, "depr_itc_sta_macrs_15", 0); - ssc_data_set_number(data, "depr_itc_sta_sl_5", 0); - ssc_data_set_number(data, "depr_itc_sta_sl_15", 0); - ssc_data_set_number(data, "depr_itc_sta_sl_20", 0); - ssc_data_set_number(data, "depr_itc_sta_sl_39", 0); - ssc_data_set_number(data, "depr_itc_sta_custom", 0); - ssc_data_set_number(data, "depr_itc_fed_macrs_5", 1); - ssc_data_set_number(data, "depr_itc_fed_macrs_15", 0); - ssc_data_set_number(data, "depr_itc_fed_sl_5", 0); - ssc_data_set_number(data, "depr_itc_fed_sl_15", 0); - ssc_data_set_number(data, "depr_itc_fed_sl_20", 0); - ssc_data_set_number(data, "depr_itc_fed_sl_39", 0); - ssc_data_set_number(data, "depr_itc_fed_custom", 0); - ssc_data_set_number(data, "pbi_fed_for_ds", 0); - ssc_data_set_number(data, "pbi_sta_for_ds", 0); - ssc_data_set_number(data, "pbi_uti_for_ds", 0); - ssc_data_set_number(data, "pbi_oth_for_ds", 0); - ssc_data_set_number(data, "depr_stabas_method", 1); - ssc_data_set_number(data, "depr_fedbas_method", 1); + return data; } -///** -//* Default data for iph_to_lcoefcr run that can be further modified -//*/ -//void convert_and_adjust_fixed_charge(ssc_data_t &data) -//{ -// ssc_data_set_number(data, "electricity_rate", 0.059999998658895493); -// ssc_data_set_number(data, "fixed_operating_cost", 103758.203125); -//} -// -///** -//* Default data for lcoefcr run that can be further modified -//*/ -//void fixed_charge_rate_default(ssc_data_t &data) -//{ -// ssc_data_set_number(data, "capital_cost", 7263074); -// ssc_data_set_number(data, "variable_operating_cost", 0.0010000000474974513); -// ssc_data_set_number(data, "fixed_charge_rate", 0.10807877779006958); -//} - #endif diff --git a/third_party/ssc/test/tcs_test/trough_physical_iph_common_data.h b/third_party/ssc/test/input_cases/trough_physical_iph_defaults.h similarity index 97% rename from third_party/ssc/test/tcs_test/trough_physical_iph_common_data.h rename to third_party/ssc/test/input_cases/trough_physical_iph_defaults.h index 5e68fcad0c1..d23509fe42e 100644 --- a/third_party/ssc/test/tcs_test/trough_physical_iph_common_data.h +++ b/third_party/ssc/test/input_cases/trough_physical_iph_defaults.h @@ -2,24 +2,21 @@ #define _TROUGH_PHYSICAL_IPH_COMMON_DATA_H_ #include - #include "../input_cases/code_generator_utilities.h" char wlim_series_path2[512]; - int ntpiph1 = sprintf(wlim_series_path2, "%s/test/input_cases/tcstrough_data/wlim_series.csv", std::getenv("SSCDIR")); /** * Default data for trough_physical_process_heat run that can be further modified */ -void trough_physical_iph_default(ssc_data_t &data) +ssc_data_t trough_physical_iph_defaults() { - const char * SSCDIR = std::getenv("SSCDIR"); + ssc_data_t data = ssc_data_create(); - char solar_resource_path[512]; + const char * SSCDIR = std::getenv("SSCDIR"); + char solar_resource_path[512]; //char load_profile_path[512]; - - int n1 = sprintf(solar_resource_path, "%s/test/input_cases/tcstrough_data/tucson_az_32.116521_-110.933042_psmv3_60_tmy.csv", SSCDIR); //int n2 = sprintf(load_profile_path, "%s/test/input_cases/pvsamv1_data/pvsamv1_residential_load.csv", SSCDIR); @@ -238,25 +235,8 @@ void trough_physical_iph_default(ssc_data_t &data) ssc_number_t p_sf_hdr_lengths[1] = { -1 }; ssc_data_set_matrix(data, "sf_hdr_lengths", p_sf_hdr_lengths, 1, 1); ssc_data_set_number(data, "adjust:constant", 4); -} -/** -* Default data for iph_to_lcoefcr run that can be further modified -*/ -void convert_and_adjust_fixed_charge(ssc_data_t &data) -{ - ssc_data_set_number(data, "electricity_rate", 0.059999998658895493); - ssc_data_set_number(data, "fixed_operating_cost", 103758.203125); -} - -/** -* Default data for lcoefcr run that can be further modified -*/ -void fixed_charge_rate_default(ssc_data_t &data) -{ - ssc_data_set_number(data, "capital_cost", 7263074); - ssc_data_set_number(data, "variable_operating_cost", 0.0010000000474974513); - ssc_data_set_number(data, "fixed_charge_rate", 0.10807877779006958); + return data; } #endif diff --git a/third_party/ssc/test/tcs_test/csp_solver_core_test.cpp b/third_party/ssc/test/shared_test/csp_solver_core_test.cpp similarity index 100% rename from third_party/ssc/test/tcs_test/csp_solver_core_test.cpp rename to third_party/ssc/test/shared_test/csp_solver_core_test.cpp diff --git a/third_party/ssc/test/shared_test/lib_battery_dispatch_automatic_btm_test.cpp b/third_party/ssc/test/shared_test/lib_battery_dispatch_automatic_btm_test.cpp index c6879fb34f1..b064c214632 100644 --- a/third_party/ssc/test/shared_test/lib_battery_dispatch_automatic_btm_test.cpp +++ b/third_party/ssc/test/shared_test/lib_battery_dispatch_automatic_btm_test.cpp @@ -80,7 +80,7 @@ TEST_F(AutoBTMTest_lib_battery_dispatch, DispatchAutoBTMPVCharging) { batteryPower->connectionMode = ChargeController::AC_CONNECTED; // Load never peaks above average load, so battery never discharges - std::vector expectedPower = {0, 0, 0, 0, 0, 0, 0, -50, -50, -50, -50, -50, -1.63, 0, 0, 0, 0, 0, 0, 0, 0, 0, + std::vector expectedPower = {0, 0, 0, 0, 0, 0, 0, -50, -50, -50, -50, -50, -1.94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; for (size_t h = 0; h < 24; h++) { if (h > 6 && h < 18) { @@ -178,7 +178,7 @@ TEST_F(AutoBTMTest_lib_battery_dispatch, DispatchAutoBTMPVChargeAndDischargeSubh 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, -50.00, -50.00, -50.00, -50.00, -50.00, -50.00, -50.00, -50.00, -50.00, -50.00, -50.00, -50.00, -50.00, -50.00, -50.00, -50.00, -50.00, -50.00, - -50.00, -50.00, -5.19, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, + -50.00, -50.00, -6.40, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, @@ -247,7 +247,7 @@ TEST_F(AutoBTMTest_lib_battery_dispatch, DispatchAutoBTMDCClipCharge) { batteryPower->setSharedInverter(m_sharedInverter); // Battery will charge when PV is available, then discharge when load increases at 7 pm - std::vector expectedPower = {0, 0, 0, 0, 0, 0, 0, -47.93, -47.92, -47.92, -47.91, -48.0, -11.99, + std::vector expectedPower = {0, 0, 0, 0, 0, 0, 0, -47.93, -47.92, -47.92, -47.91, -48.0, -12.295, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50.25}; for (size_t h = 0; h < 24; h++) { batteryPower->powerLoad = 500; @@ -300,7 +300,7 @@ TEST_F(AutoBTMTest_lib_battery_dispatch, TestBasicForecast) { batteryPower->connectionMode = ChargeController::AC_CONNECTED; // Discharge first 4 hours to avoid peak demand charges. Charge while there's solar, then discharge again at 6 pm since this is a high TOU rate - std::vector expectedPower = { 50, 50, 50, 34.79, 0, 0, 0, -47.84, -47.84, -47.84, -47.84, -47.84, -47.84, -47.84, -47.84, -47.91, -10.0, 0, 50, 50, 50, + std::vector expectedPower = { 50, 50, 50, 34.79, 0, 0, 0, -47.84, -47.84, -47.84, -47.84, -47.84, -47.84, -47.84, -47.84, -47.91, -10.538, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50 }; for (size_t h = 0; h < 24; h++) { batteryPower->powerLoad = 500; @@ -332,7 +332,7 @@ TEST_F(AutoBTMTest_lib_battery_dispatch, TestSummerPeak) { 1.34971, 1.65378, 1.80832, 1.89189, 2.15165, 2.83263, 2.98228, 3.22567, 3.50516, 3.83516, 3.92251, 4.05548, 4.13676, 4.13277, 4.0915, 4.19724, 4.00006, 3.34509, 2.68845, 2.08509, 1.7126, }; pv_prediction = { -0.00116655, - 0.00116655, - 0.00116655, - 0.00116655, - 0.00116655, - 0.00116655, - 0.00116655, 0.129814, 0.75348, 1.47006, 2.45093, 2.9696, 3.30167, 3.47537, 3.42799, 3.14281, 2.59477, 1.83033, 0.857618, 0.176968, - 0.00116655, - 0.00116655, - 0.00116655 - - 0.00116655, - 0.00116655, - 0.00116655, - 0.00116655, - 0.00116655, - 0.00116655, - 0.00116655, - 0.00116655, 0.078559, 0.420793, 1.35006, 2.03824, 2.47638, 2.70446, 3.22802, 2.74022, 2.81986, 2.39299, 1.68699, 0.881843, + - 0.00116655, - 0.00116655, - 0.00116655, - 0.00116655, - 0.00116655, - 0.00116655, - 0.00116655, - 0.00116655, 0.078559, 0.420793, 1.35006, 2.03824, 2.47638, 2.70446, 3.22802, 2.74022, 2.81986, 2.39299, 1.68699, 0.881843, 0.169532, - 0.00116655, - 0.00116655, - 0.00116655, - 0.00116655 }; dispatchAutoBTM->update_load_data(load_prediction); @@ -342,8 +342,8 @@ TEST_F(AutoBTMTest_lib_battery_dispatch, TestSummerPeak) { batteryPower = dispatchAutoBTM->getBatteryPower(); batteryPower->connectionMode = ChargeController::AC_CONNECTED; - std::vector expectedPower = { 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.058, -0.0054, 0, 0, 0.0, 0.0, 2.3757, 0.0, - 4.122, 0.0, 0, 0, 0, 0 }; + std::vector expectedPower = { 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.058, -0.0054, 0, 0, 0.0, 1.564, 2.3757, + 3.368, 4.122, 0.0, 0, 0, 0, 0 }; for (size_t h = 0; h < 24; h++) { batteryPower->powerSystem = pv_prediction[h]; // Match the predicted PV batteryPower->powerLoad = load_prediction[h]; // Match the predicted load @@ -379,8 +379,8 @@ TEST_F(AutoBTMTest_lib_battery_dispatch, TestSummerPeakNetMeteringCredits) { batteryPower = dispatchAutoBTM->getBatteryPower(); batteryPower->connectionMode = ChargeController::AC_CONNECTED; - std::vector expectedPower = { 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.058, -0.0054, 0, 0, 0.0, 0.0, 2.3757, 0.0, - 4.122, 0.0, 0, 0, 0, 0 }; + std::vector expectedPower = { 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.058, -0.0054, 0, 0, 0.0, 1.564, 2.3757, + 3.368, 4.122, 0.0, 0, 0, 0, 0 }; for (size_t h = 0; h < 24; h++) { batteryPower->powerSystem = pv_prediction[h]; // Match the predicted PV batteryPower->powerLoad = load_prediction[h]; // Match the predicted load @@ -416,7 +416,8 @@ TEST_F(AutoBTMTest_lib_battery_dispatch, TestSummerPeakGridCharging) { batteryPower = dispatchAutoBTM->getBatteryPower(); batteryPower->connectionMode = ChargeController::AC_CONNECTED; - std::vector expectedPower = { -0.648, -0.813, -0.912, -0.984, -0.949, -0.695, -0.523, -0.124, -0.723, -1.093, -1.874, -2.092, -2.092, -1.872, -1.598, -1.21, -0.592, 2.3757, 3.3688, + std::vector expectedPower = { -0.648, -0.813, -0.912, -0.984, -0.949, -0.695, -0.523, -0.124, -0.723, + -1.093, -1.874, -2.092, -2.092, -1.872, -1.598, -1.21, -0.592, 0, 3.3688, 4.122, 0.0, 0.0, 0.0, -0.317}; for (size_t h = 0; h < 24; h++) { batteryPower->powerSystem = pv_prediction[h]; // Match the predicted PV @@ -465,7 +466,7 @@ TEST_F(AutoBTMTest_lib_battery_dispatch, TestSummerPeakGridChargingSubhourly) { batteryPower = dispatchAutoBTM->getBatteryPower(); batteryPower->connectionMode = ChargeController::AC_CONNECTED; - std::vector expectedPower = { -0.648, -0.813, -0.912, -0.984, -0.949, -0.695, -0.523, -0.124, -0.723, -1.093, -1.874, -2.092, -2.092, -1.872, -1.598, -1.21, 1.564, 2.3757, 3.3688, + std::vector expectedPower = { -0.648, -0.813, -0.912, -0.984, -0.949, -0.695, -0.523, -0.124, -0.723, -1.093, -1.874, -2.092, -2.092, -1.872, -1.598, 0.885, 1.564, 2.3757, 3.3688, 4.122, 0.0, 0.0, 0.0, -0.317 }; for (size_t h = 0; h < 24; h++) { batteryPower->powerSystem = pv_prediction[h]; // Match the predicted PV @@ -491,7 +492,7 @@ TEST_F(AutoBTMTest_lib_battery_dispatch, TestCommercialPeakForecasting) { true, true, false, util_rate, replacementCost, cyclingChoice, cyclingCost); load_prediction = { 49.9898, 42.4037, 42.1935, 43.3778, 39.4545, 59.3723, 84.6907, 180.423, 180.836, 186.225, 197.275, 205.302, 231.362, - 240.712, 249.681, 263.722, 249.91, 188.621, 173.452, 134.803, 121.631, 56.1207, 57.5053, 50.6343, 49.1768, 44.4999, 44.3999, + 240.712, 249.681, 263.722, 249.91, 188.621, 173.452, 134.803, 121.631, 56.1207, 57.5053, 50.6343, 49.1768, 44.4999, 44.3999, 44.3927, 42.8778, 61.4139, 86.7599, 186.891, 190.837, 198.747, 207.645, 211.838, 241.774, 262.163, 268.742, 274.231, 262.211, 199.747, 178.862, 145.017, 122.382, 55.8128, 58.1977, 51.3724, 48.2751, 42.5604, 39.8775, 38.8493, 38.2728, 62.2958, 66.9385, 99.3759, 111.364, 120.912, 129.247, 133.878, 135.635, 106.555, 114.328, 119.437, 104.461, 50.5622, 47.9985, 60.8511, 54.6621, @@ -511,8 +512,8 @@ TEST_F(AutoBTMTest_lib_battery_dispatch, TestCommercialPeakForecasting) { batteryPower = dispatchAutoBTM->getBatteryPower(); batteryPower->connectionMode = ChargeController::AC_CONNECTED; - std::vector expectedPower = { 50.02, 44.22, 44.00, 0, -46.0, 0, 0, 50.08, 41.45, 0, 0, -46.0, -46.0, 0, 0, 50.08, 38.49, 0, 0, - 0, 0, -46.0, -42.58, -46.0 }; + std::vector expectedPower = { 50.02, 44.22, 44.0, 45.24, 1.34, 0, 0, 0, 0, 0.0, 0, -46.0, -46.0, -45.39, -30.26, 50.08, 50.06, 50.15, 13.25, + 0, 0, -46.0, -46.0, -46.0 }; for (size_t h = 0; h < 24; h++) { batteryPower->powerSystem = pv_prediction[h]; // Match the predicted PV batteryPower->powerLoad = load_prediction[h]; // Match the predicted load @@ -635,7 +636,7 @@ TEST_F(AutoBTMTest_lib_battery_dispatch, DispatchAutoBTMCustomDispatch) { std::vector expectedPower = { 0, 0, 0, 0, 0, 0, 0, -50, -50, -50, -50, -50, -1.63, 0, 0, 0, 0, 0, 0, 9.479, 9.479, 9.479, 9.479, 9.479, 9.479, 9.479, 9.479 }; dispatchAutoBTM->set_custom_dispatch(expectedPower); - + batteryPower = dispatchAutoBTM->getBatteryPower(); batteryPower->connectionMode = ChargeController::AC_CONNECTED; diff --git a/third_party/ssc/test/shared_test/lib_battery_dispatch_automatic_btm_test.h b/third_party/ssc/test/shared_test/lib_battery_dispatch_automatic_btm_test.h index b8fb90adaff..b9e04f87556 100644 --- a/third_party/ssc/test/shared_test/lib_battery_dispatch_automatic_btm_test.h +++ b/third_party/ssc/test/shared_test/lib_battery_dispatch_automatic_btm_test.h @@ -47,12 +47,12 @@ class AutoBTMTest_lib_battery_dispatch : public BatteryProperties , public Dispa { // For Manual Dispatch Test BatteryProperties::SetUp(); - q = 1000. / 89.; + n_strings = 445; - capacityModel = new capacity_lithium_ion_t(q * n_strings, SOC_init, SOC_max, SOC_min, dtHour); + capacityModel = new capacity_lithium_ion_t(Qfull * n_strings, SOC_init, SOC_max, SOC_min, dtHour); voltageModel = new voltage_dynamic_t(n_series, n_strings, Vnom_default, Vfull, Vexp, Vnom, Qfull, Qexp, Qnom, C_rate, resistance, dtHour); - lifetimeModel = new lifetime_t(cycleLifeMatrix, dtHour, calendar_q0, calendar_a, calendar_b, calendar_c); + lifetimeModel = new lifetime_calendar_cycle_t(cycleLifeMatrix, dtHour, calendar_q0, calendar_a, calendar_b, calendar_c); thermalModel = new thermal_t(1.0, mass, surface_area, resistance, Cp, h, capacityVsTemperature, T_room); lossModel = new losses_t(); batteryModel = new battery_t(dtHour, chemistry, capacityModel, voltageModel, lifetimeModel, thermalModel, lossModel); @@ -80,7 +80,7 @@ class AutoBTMTest_lib_battery_dispatch : public BatteryProperties , public Dispa capacityModel = new capacity_lithium_ion_t(q * n_strings, SOC_init, SOC_max, SOC_min, dtHour); voltageModel = new voltage_dynamic_t(n_series, n_strings, Vnom_default, Vfull, Vexp, Vnom, Qfull, Qexp, Qnom, C_rate, resistance, dtHour); - lifetimeModel = new lifetime_t(cycleLifeMatrix, dtHour, calendar_q0, calendar_a, calendar_b, calendar_c); + lifetimeModel = new lifetime_calendar_cycle_t(cycleLifeMatrix, dtHour, calendar_q0, calendar_a, calendar_b, calendar_c); thermalModel = new thermal_t(1.0, mass, surface_area, resistance, Cp, h, capacityVsTemperature, T_room); std::vector charging_losses(12, 1); // Monthly losses diff --git a/third_party/ssc/test/shared_test/lib_battery_dispatch_automatic_fom_test.h b/third_party/ssc/test/shared_test/lib_battery_dispatch_automatic_fom_test.h index c8eaec284c9..a3179377d4d 100644 --- a/third_party/ssc/test/shared_test/lib_battery_dispatch_automatic_fom_test.h +++ b/third_party/ssc/test/shared_test/lib_battery_dispatch_automatic_fom_test.h @@ -46,7 +46,7 @@ class AutoFOM_lib_battery_dispatch : public BatteryProperties , public DispatchP capacityModel = new capacity_lithium_ion_t(2.25 * 133227, 50, 100, 10, dtHour); voltageModel = new voltage_dynamic_t(139, 133227, 3.6, 4.10, 4.05, 3.4, 2.25, 0.04, 2.00, 0.2, 0.2, dtHour); - lifetimeModel = new lifetime_t(cycleLifeMatrix, dtHour, calendar_q0, calendar_a, calendar_b, calendar_c); + lifetimeModel = new lifetime_calendar_cycle_t(cycleLifeMatrix, dtHour, calendar_q0, calendar_a, calendar_b, calendar_c); thermalModel = new thermal_t(1.0, mass, surface_area, resistance, Cp, h, capacityVsTemperature, T_room); lossModel = new losses_t(); batteryModel = new battery_t(dtHour, chemistry, capacityModel, voltageModel, lifetimeModel, thermalModel, lossModel); @@ -62,7 +62,7 @@ class AutoFOM_lib_battery_dispatch : public BatteryProperties , public DispatchP capacityModel = new capacity_lithium_ion_t(2.25 * 133227, 50, 100, 10, dtHour); voltageModel = new voltage_dynamic_t(139, 133227, 3.6, 4.10, 4.05, 3.4, 2.25, 0.04, 2.00, 0.2, 0.2, dtHour); - lifetimeModel = new lifetime_t(cycleLifeMatrix, dtHour, calendar_q0, calendar_a, calendar_b, calendar_c); + lifetimeModel = new lifetime_calendar_cycle_t(cycleLifeMatrix, dtHour, calendar_q0, calendar_a, calendar_b, calendar_c); thermalModel = new thermal_t(1.0, mass, surface_area, resistance, Cp, h, capacityVsTemperature, T_room); std::vector charging_losses(12, 10); // Monthly losses diff --git a/third_party/ssc/test/shared_test/lib_battery_dispatch_manual_test.cpp b/third_party/ssc/test/shared_test/lib_battery_dispatch_manual_test.cpp index ffdd840634d..f5e5b7f5dfb 100644 --- a/third_party/ssc/test/shared_test/lib_battery_dispatch_manual_test.cpp +++ b/third_party/ssc/test/shared_test/lib_battery_dispatch_manual_test.cpp @@ -468,7 +468,7 @@ TEST_F(ManualTest_lib_battery_dispatch, InverterEfficiencyCutoffDC) // Test discharge constraints. First constraint does not hit backoff batteryPower->powerSystem = 0; batteryPower->voltageSystem = 600; batteryPower->powerGridToBattery = 0; batteryPower->powerLoad = 7; dispatchManual->dispatch(year, 0, step_of_hour); - EXPECT_NEAR(batteryPower->sharedInverter->efficiencyAC, 36.05, 0.1); // Not enforced becasue no PV + EXPECT_NEAR(batteryPower->sharedInverter->efficiencyAC, 35.82, 0.1); // Not enforced becasue no PV EXPECT_NEAR(batteryPower->powerBatteryDC, 4.43, 0.1); batteryPower->powerSystem = 770; batteryPower->voltageSystem = 600; batteryPower->powerGridToBattery = 0; batteryPower->powerLoad = 1000; diff --git a/third_party/ssc/test/shared_test/lib_battery_dispatch_manual_test.h b/third_party/ssc/test/shared_test/lib_battery_dispatch_manual_test.h index cee87eed40d..82792260e84 100644 --- a/third_party/ssc/test/shared_test/lib_battery_dispatch_manual_test.h +++ b/third_party/ssc/test/shared_test/lib_battery_dispatch_manual_test.h @@ -48,12 +48,12 @@ class ManualTest_lib_battery_dispatch : public BatteryProperties, public Dispatc { // For Manual Dispatch Test BatteryProperties::SetUp(); - q = 1000. / 89.; + n_strings = 445; - capacityModel = new capacity_lithium_ion_t(q * n_strings, SOC_init, SOC_max, SOC_min, 1.0); + capacityModel = new capacity_lithium_ion_t(Qfull * n_strings, SOC_init, SOC_max, SOC_min, 1.0); voltageModel = new voltage_dynamic_t(n_series, n_strings, Vnom_default, Vfull, Vexp, Vnom, Qfull, Qexp, Qnom, C_rate, resistance, dtHour); - lifetimeModel = new lifetime_t(cycleLifeMatrix, dtHour, calendar_q0, calendar_a, calendar_b, calendar_c); + lifetimeModel = new lifetime_calendar_cycle_t(cycleLifeMatrix, dtHour, calendar_q0, calendar_a, calendar_b, calendar_c); thermalModel = new thermal_t(1.0, mass, surface_area, resistance, Cp, h, capacityVsTemperature, T_room); lossModel = new losses_t(); batteryModel = new battery_t(dtHour, chemistry, capacityModel, voltageModel, lifetimeModel, thermalModel, lossModel); @@ -83,7 +83,7 @@ class ManualTest_lib_battery_dispatch_losses : public ManualTest_lib_battery_dis capacityModel = new capacity_lithium_ion_t(q * n_strings, SOC_init, SOC_max, SOC_min, 1.0); voltageModel = new voltage_dynamic_t(n_series, n_strings, Vnom_default, Vfull, Vexp, Vnom, Qfull, Qexp, Qnom, C_rate, resistance, dtHour); - lifetimeModel = new lifetime_t(cycleLifeMatrix, dtHour, calendar_q0, calendar_a, calendar_b, calendar_c); + lifetimeModel = new lifetime_calendar_cycle_t(cycleLifeMatrix, dtHour, calendar_q0, calendar_a, calendar_b, calendar_c); thermalModel = new thermal_t(1.0, mass, surface_area, resistance, Cp, h, capacityVsTemperature, T_room); std::vector charging_losses(12, 1); // Monthly losses diff --git a/third_party/ssc/test/shared_test/lib_battery_lifetime_test.cpp b/third_party/ssc/test/shared_test/lib_battery_lifetime_test.cpp index 7bd62ab428b..fe38df55e71 100644 --- a/third_party/ssc/test/shared_test/lib_battery_lifetime_test.cpp +++ b/third_party/ssc/test/shared_test/lib_battery_lifetime_test.cpp @@ -33,11 +33,11 @@ TEST_F(lib_battery_lifetime_cycle_test, runCycleLifetimeTest) { cycle_model->runCycleLifetime(DOD); idx++; } - cycle_state s = cycle_model->get_state(); - EXPECT_NEAR(s.q_relative_cycle, 95.02, tol); - EXPECT_NEAR(s.rainflow_Xlt, 90, tol); - EXPECT_NEAR(s.rainflow_Ylt, 90, tol); - EXPECT_NEAR(s.rainflow_jlt, 2, tol); + lifetime_state s = cycle_model->get_state(); + EXPECT_NEAR(s.cycle->q_relative_cycle, 95.02, tol); + EXPECT_NEAR(s.cycle->rainflow_Xlt, 90, tol); + EXPECT_NEAR(s.cycle->rainflow_Ylt, 90, tol); + EXPECT_NEAR(s.cycle->rainflow_jlt, 2, tol); EXPECT_NEAR(s.range, 90, tol); EXPECT_NEAR(s.average_range, 90, tol); EXPECT_NEAR(s.n_cycles, 249, tol); @@ -50,10 +50,10 @@ TEST_F(lib_battery_lifetime_cycle_test, runCycleLifetimeTest) { idx++; } s = cycle_model->get_state(); - EXPECT_NEAR(s.q_relative_cycle, 91.244, tol); - EXPECT_NEAR(s.rainflow_Xlt, 0, tol); - EXPECT_NEAR(s.rainflow_Ylt, 0, tol); - EXPECT_NEAR(s.rainflow_jlt, 2, tol); + EXPECT_NEAR(s.cycle->q_relative_cycle, 91.244, tol); + EXPECT_NEAR(s.cycle->rainflow_Xlt, 0, tol); + EXPECT_NEAR(s.cycle->rainflow_Ylt, 0, tol); + EXPECT_NEAR(s.cycle->rainflow_jlt, 2, tol); EXPECT_NEAR(s.range, 0, tol); EXPECT_NEAR(s.average_range, 44.9098, tol); EXPECT_NEAR(s.n_cycles, 499, tol); @@ -66,11 +66,11 @@ TEST_F(lib_battery_lifetime_cycle_test, runCycleLifetimeTestJaggedProfile) { cycle_model->runCycleLifetime(DOD[idx]); idx++; } - cycle_state s = cycle_model->get_state(); - EXPECT_NEAR(s.q_relative_cycle, 99.95, tol); - EXPECT_NEAR(s.rainflow_Xlt, 90, tol); - EXPECT_NEAR(s.rainflow_Ylt, 90, tol); - EXPECT_NEAR(s.rainflow_jlt, 1, tol); + lifetime_state s = cycle_model->get_state(); + EXPECT_NEAR(s.cycle->q_relative_cycle, 99.95, tol); + EXPECT_NEAR(s.cycle->rainflow_Xlt, 90, tol); + EXPECT_NEAR(s.cycle->rainflow_Ylt, 90, tol); + EXPECT_NEAR(s.cycle->rainflow_jlt, 1, tol); EXPECT_NEAR(s.range, 90, tol); EXPECT_NEAR(s.average_range, 63.75, tol); EXPECT_NEAR(s.n_cycles, 4, tol); @@ -84,11 +84,11 @@ TEST_F(lib_battery_lifetime_cycle_test, runCycleLifetimeTestKokamProfile) { cycle_model->runCycleLifetime((1-DOD[idx]) * 100.0); idx++; } - cycle_state s = cycle_model->get_state(); - EXPECT_NEAR(s.q_relative_cycle, 99.79, tol); - EXPECT_NEAR(s.rainflow_Xlt, 75.09, tol); - EXPECT_NEAR(s.rainflow_Ylt, 75.27, tol); - EXPECT_NEAR(s.rainflow_jlt, 5, tol); + lifetime_state s = cycle_model->get_state(); + EXPECT_NEAR(s.cycle->q_relative_cycle, 99.79, tol); + EXPECT_NEAR(s.cycle->rainflow_Xlt, 75.09, tol); + EXPECT_NEAR(s.cycle->rainflow_Ylt, 75.27, tol); + EXPECT_NEAR(s.cycle->rainflow_jlt, 5, tol); EXPECT_NEAR(s.range, 75.07, tol); EXPECT_NEAR(s.average_range, 72.03, tol); EXPECT_NEAR(s.n_cycles, 13, tol); @@ -97,7 +97,7 @@ TEST_F(lib_battery_lifetime_cycle_test, runCycleLifetimeTestKokamProfile) { TEST_F(lib_battery_lifetime_cycle_test, runCycleLifetimeTestWithNoise) { int seed = 100; - double tol_high = 1.0; // Randomness will generate different results on different platforms + double tol_high = 1.6; // Randomness will generate different results on different platforms // Initialize a default_random_engine with the seed std::default_random_engine randomEngine(seed); @@ -117,9 +117,9 @@ TEST_F(lib_battery_lifetime_cycle_test, runCycleLifetimeTestWithNoise) { cycle_model->runCycleLifetime(DOD); idx++; } - cycle_state s = cycle_model->get_state(); - EXPECT_NEAR(s.q_relative_cycle, 95.06, tol_high); - EXPECT_NEAR(s.range, 89.06, tol_high); + lifetime_state s = cycle_model->get_state(); + EXPECT_NEAR(s.cycle->q_relative_cycle, 95.06, tol_high); + EXPECT_NEAR(s.range, 90.6, tol_high); EXPECT_NEAR(s.average_range, 90.02, tol_high); } @@ -137,11 +137,11 @@ TEST_F(lib_battery_lifetime_cycle_test, replaceBatteryTest) { idx++; } auto st = cycle_lifetime_state({85.02,90,90,90,90, 749, 2}); - cycle_state s = cycle_model->get_state(); - EXPECT_NEAR(s.q_relative_cycle, 85.02, tol); - EXPECT_NEAR(s.rainflow_Xlt, 90, tol); - EXPECT_NEAR(s.rainflow_Ylt, 90, tol); - EXPECT_NEAR(s.rainflow_jlt, 2, tol); + lifetime_state s = cycle_model->get_state(); + EXPECT_NEAR(s.cycle->q_relative_cycle, 85.02, tol); + EXPECT_NEAR(s.cycle->rainflow_Xlt, 90, tol); + EXPECT_NEAR(s.cycle->rainflow_Ylt, 90, tol); + EXPECT_NEAR(s.cycle->rainflow_jlt, 2, tol); EXPECT_NEAR(s.range, 90, tol); EXPECT_NEAR(s.average_range, 90, tol); EXPECT_NEAR(s.n_cycles, 749, tol); @@ -149,10 +149,10 @@ TEST_F(lib_battery_lifetime_cycle_test, replaceBatteryTest) { cycle_model->replaceBattery(5); s = cycle_model->get_state(); - EXPECT_NEAR(s.q_relative_cycle, 90.019, tol); - EXPECT_NEAR(s.rainflow_Xlt, 0, tol); - EXPECT_NEAR(s.rainflow_Ylt, 0, tol); - EXPECT_NEAR(s.rainflow_jlt, 0, tol); + EXPECT_NEAR(s.cycle->q_relative_cycle, 90.019, tol); + EXPECT_NEAR(s.cycle->rainflow_Xlt, 0, tol); + EXPECT_NEAR(s.cycle->rainflow_Ylt, 0, tol); + EXPECT_NEAR(s.cycle->rainflow_jlt, 0, tol); EXPECT_NEAR(s.range, 0, tol); EXPECT_NEAR(s.average_range, 90, tol); EXPECT_NEAR(s.n_cycles, 749, tol); @@ -168,10 +168,10 @@ TEST_F(lib_battery_lifetime_calendar_matrix_test, runCalendarMatrixTest) { cal_model->runLifetimeCalendarModel(idx, T, SOC); idx++; } - calendar_state s = cal_model->get_state(); - EXPECT_NEAR(s.day_age_of_battery, 20, tol); - EXPECT_NEAR(s.q_relative_calendar, 99.89, tol); - EXPECT_NEAR(s.dq_relative_calendar_old, 0, tol); + lifetime_state s = cal_model->get_state(); + EXPECT_NEAR(s.day_age_of_battery, 20.79, tol); + EXPECT_NEAR(s.calendar->q_relative_calendar, 99.89, tol); + EXPECT_NEAR(s.calendar->dq_relative_calendar_old, 0, tol); while (idx < 1000){ if (idx % 2 != 0){ @@ -181,9 +181,9 @@ TEST_F(lib_battery_lifetime_calendar_matrix_test, runCalendarMatrixTest) { idx++; } s = cal_model->get_state(); - EXPECT_NEAR(s.day_age_of_battery, 41, tol); - EXPECT_NEAR(s.q_relative_calendar, 99.775, tol); - EXPECT_NEAR(s.dq_relative_calendar_old, 0, tol); + EXPECT_NEAR(s.day_age_of_battery, 41.625, tol); + EXPECT_NEAR(s.calendar->q_relative_calendar, 99.775, tol); + EXPECT_NEAR(s.calendar->dq_relative_calendar_old, 0, tol); } TEST_F(lib_battery_lifetime_calendar_matrix_test, replaceBatteryTest) { @@ -196,17 +196,17 @@ TEST_F(lib_battery_lifetime_calendar_matrix_test, replaceBatteryTest) { cal_model->runLifetimeCalendarModel(idx, T, SOC); idx++; } - calendar_state s = cal_model->get_state(); - EXPECT_NEAR(s.day_age_of_battery, 8333, tol); - EXPECT_NEAR(s.q_relative_calendar, 41.51, tol); - EXPECT_NEAR(s.dq_relative_calendar_old, 0, tol); + lifetime_state s = cal_model->get_state(); + EXPECT_NEAR(s.day_age_of_battery, 8333.29, tol); + EXPECT_NEAR(s.calendar->q_relative_calendar, 41.51, tol); + EXPECT_NEAR(s.calendar->dq_relative_calendar_old, 0, tol); cal_model->replaceBattery(5); s = cal_model->get_state(); EXPECT_NEAR(s.day_age_of_battery, 0, tol); - EXPECT_NEAR(s.q_relative_calendar, 46.51, tol); - EXPECT_NEAR(s.dq_relative_calendar_old, 0, tol); + EXPECT_NEAR(s.calendar->q_relative_calendar, 46.51, tol); + EXPECT_NEAR(s.calendar->dq_relative_calendar_old, 0, tol); } TEST_F(lib_battery_lifetime_calendar_model_test, SetUpTest) { @@ -223,10 +223,10 @@ TEST_F(lib_battery_lifetime_calendar_model_test, runCalendarModelTest) { cal_model->runLifetimeCalendarModel(idx, T, SOC); idx++; } - calendar_state s = cal_model->get_state(); - EXPECT_NEAR(s.day_age_of_battery, 20, tol); - EXPECT_NEAR(s.q_relative_calendar, 101.78, tol); - EXPECT_NEAR(s.dq_relative_calendar_old, 0.00217, tol); + lifetime_state s = cal_model->get_state(); + EXPECT_NEAR(s.day_age_of_battery, 20.79, tol); + EXPECT_NEAR(s.calendar->q_relative_calendar, 101.78, tol); + EXPECT_NEAR(s.calendar->dq_relative_calendar_old, 0.00217, tol); while (idx < 1000){ if (idx % 2 != 0){ @@ -236,9 +236,9 @@ TEST_F(lib_battery_lifetime_calendar_model_test, runCalendarModelTest) { idx++; } s = cal_model->get_state(); - EXPECT_NEAR(s.day_age_of_battery, 41, tol); - EXPECT_NEAR(s.q_relative_calendar, 101.69, tol); - EXPECT_NEAR(s.dq_relative_calendar_old, 0.00306, tol); + EXPECT_NEAR(s.day_age_of_battery, 41.625, tol); + EXPECT_NEAR(s.calendar->q_relative_calendar, 101.69, tol); + EXPECT_NEAR(s.calendar->dq_relative_calendar_old, 0.00306, tol); } TEST_F(lib_battery_lifetime_calendar_model_test, replaceBatteryTest) { @@ -251,17 +251,17 @@ TEST_F(lib_battery_lifetime_calendar_model_test, replaceBatteryTest) { cal_model->runLifetimeCalendarModel(idx, T, SOC); idx++; } - calendar_state s = cal_model->get_state(); - EXPECT_NEAR(s.day_age_of_battery, 8333, tol); - EXPECT_NEAR(s.q_relative_calendar, 97.67, tol); - EXPECT_NEAR(s.dq_relative_calendar_old, 0.043, tol); + lifetime_state s = cal_model->get_state(); + EXPECT_NEAR(s.day_age_of_battery, 8333.29, tol); + EXPECT_NEAR(s.calendar->q_relative_calendar, 97.67, tol); + EXPECT_NEAR(s.calendar->dq_relative_calendar_old, 0.043, tol); cal_model->replaceBattery(5); s = cal_model->get_state(); EXPECT_NEAR(s.day_age_of_battery, 0, tol); - EXPECT_NEAR(s.q_relative_calendar, 102, tol); - EXPECT_NEAR(s.dq_relative_calendar_old, 0.0, tol); + EXPECT_NEAR(s.calendar->q_relative_calendar, 102, tol); + EXPECT_NEAR(s.calendar->dq_relative_calendar_old, 0.0, tol); } TEST_F(lib_battery_lifetime_calendar_matrix_test, TestLifetimeDegradation) { @@ -319,7 +319,6 @@ TEST_F(lib_battery_lifetime_test, updateCapacityTest) { idx ++; } - } TEST_F(lib_battery_lifetime_test, runCycleLifetimeTestWithRestPeriod) { @@ -338,15 +337,91 @@ TEST_F(lib_battery_lifetime_test, runCycleLifetimeTestWithRestPeriod) { idx++; } - - cycle_state s = *model->get_state().cycle; - EXPECT_NEAR(s.q_relative_cycle, 99.96, tol); - EXPECT_NEAR(s.rainflow_Xlt, 90, tol); - EXPECT_NEAR(s.rainflow_Ylt, 90, tol); - EXPECT_NEAR(s.rainflow_jlt, 2, tol); + + lifetime_state s = model->get_state(); + EXPECT_NEAR(s.cycle->q_relative_cycle, 99.96, tol); + EXPECT_NEAR(s.cycle->rainflow_Xlt, 90, tol); + EXPECT_NEAR(s.cycle->rainflow_Ylt, 90, tol); + EXPECT_NEAR(s.cycle->rainflow_jlt, 2, tol); EXPECT_NEAR(s.range, 90, tol); EXPECT_NEAR(s.average_range, 90, tol); EXPECT_NEAR(s.n_cycles, 2, tol); } +TEST_F(lib_battery_lifetime_nmc_test, updateCapacityTest) { + size_t idx = 0; + double tol = 0.01; + + //check lifetime_nmc_state_initialization + ASSERT_EQ(model->get_state().nmc_state->q_relative_neg, 100); + ASSERT_EQ(model->get_state().nmc_state->q_relative_li, 100); + ASSERT_EQ(model->get_state().nmc_state->b1_dt, 0); + ASSERT_EQ(model->get_state().nmc_state->b2_dt, 0); + ASSERT_EQ(model->get_state().nmc_state->b3_dt, 0); + ASSERT_EQ(model->get_state().day_age_of_battery, 0); + + //check U_neg, and Voc functions (SOC as a fractional input) + ASSERT_NEAR(model->calculate_Uneg(0.1), 0.242, tol); + ASSERT_NEAR(model->calculate_Voc(0.1), 3.4679, tol); + ASSERT_NEAR(model->calculate_Uneg(0.5), 0.1726, tol); + ASSERT_NEAR(model->calculate_Voc(0.5), 3.6912, tol); + ASSERT_NEAR(model->calculate_Uneg(0.9), 0.1032, tol); + ASSERT_NEAR(model->calculate_Voc(0.9), 4.0818, tol); + + // check number of cycles + while (idx < 876){ + model->runLifetimeModels(idx, true, 5,95, 25); + model->runLifetimeModels(idx, true, 95, 5, 25); + + auto state = model->get_state(); + + idx ++; + } + ASSERT_EQ(model->get_state().n_cycles, 875); + +} + +TEST_F(lib_battery_lifetime_nmc_test, NoCyclingCapacityTest) { + size_t idx = 0; + double tol = 0.001; + + // check capacity degradation with no cycling + while (idx < 2400) { + model->runLifetimeModels(idx, false, 50, 50, 25); + idx++; + } + + auto state = model->get_state(); + EXPECT_EQ(state.n_cycles, 0); + EXPECT_NEAR(state.day_age_of_battery, 100, tol); + EXPECT_NEAR(state.q_relative, 98.825, tol); + EXPECT_NEAR(state.nmc_state->q_relative_li, 98.825, tol); + EXPECT_NEAR(state.nmc_state->q_relative_neg, 100, tol); + EXPECT_NEAR(state.nmc_state->dq_relative_li_old, 0.082, tol); + EXPECT_EQ(state.nmc_state->b1_dt, 0); + EXPECT_EQ(state.nmc_state->b2_dt, 0); + EXPECT_EQ(state.nmc_state->b3_dt, 0); + EXPECT_EQ(state.nmc_state->c2_dt, 0); + + model = std::unique_ptr(new lifetime_nmc_t(dt_hour)); + idx = 0; + + // simulate at battery temperature 35 C for 300 days + while (idx < 7200) { + model->runLifetimeModels(idx, false, 50, 50, 35); + idx++; + } + + state = model->get_state(); + EXPECT_EQ(model->get_state().n_cycles, 0); + EXPECT_NEAR(state.day_age_of_battery, 300, tol); + EXPECT_NEAR(state.q_relative, 92.831, tol); + EXPECT_NEAR(state.nmc_state->q_relative_li, 92.831, tol); + EXPECT_NEAR(state.nmc_state->q_relative_neg, 100, tol); + EXPECT_NEAR(state.nmc_state->dq_relative_li_old, 0.142, tol); + EXPECT_EQ(state.nmc_state->b1_dt, 0); + EXPECT_EQ(state.nmc_state->b2_dt, 0); + EXPECT_EQ(state.nmc_state->b3_dt, 0); + EXPECT_EQ(state.nmc_state->c2_dt, 0); +} diff --git a/third_party/ssc/test/shared_test/lib_battery_lifetime_test.h b/third_party/ssc/test/shared_test/lib_battery_lifetime_test.h index 32d092a8f23..f043165f753 100644 --- a/third_party/ssc/test/shared_test/lib_battery_lifetime_test.h +++ b/third_party/ssc/test/shared_test/lib_battery_lifetime_test.h @@ -4,7 +4,7 @@ #include #include "lib_util.h" -//#include "lib_battery_lifetime.h" +//#include "lifetime_t.h" #include "lib_battery.h" class lib_battery_lifetime_cycle_test : public ::testing::Test @@ -85,7 +85,7 @@ class lib_battery_lifetime_calendar_model_test : public ::testing::Test class lib_battery_lifetime_test : public ::testing::Test{ protected: - std::unique_ptr model; + std::unique_ptr model; util::matrix_t cycles_vs_DOD; @@ -94,7 +94,19 @@ class lib_battery_lifetime_test : public ::testing::Test{ void SetUp() override { double table_vals[18] = {20, 0, 100, 20, 5000, 80, 20, 10000, 60, 80, 0, 100, 80, 1000, 80, 80, 2000, 60}; cycles_vs_DOD.assign(table_vals, 6, 3); - model = std::unique_ptr(new lifetime_t(cycles_vs_DOD, dt_hour,1.02, 2.66e-3, -7280, 930)); + model = std::unique_ptr(new lifetime_calendar_cycle_t(cycles_vs_DOD, dt_hour, 1.02, 2.66e-3, -7280, 930)); } }; + +class lib_battery_lifetime_nmc_test : public ::testing::Test{ +protected: + std::unique_ptr model; + + double dt_hour = 1; +public: + void SetUp() override { + model = std::unique_ptr(new lifetime_nmc_t(dt_hour)); + } +}; + #endif //SAM_SIMULATION_CORE_LIB_BATTERY_LIFETIME_TEST_H diff --git a/third_party/ssc/test/shared_test/lib_battery_properties.h b/third_party/ssc/test/shared_test/lib_battery_properties.h index 4ef6697e722..3736516fd9a 100644 --- a/third_party/ssc/test/shared_test/lib_battery_properties.h +++ b/third_party/ssc/test/shared_test/lib_battery_properties.h @@ -81,7 +81,7 @@ class BatteryProperties : public ::testing::Test double vals2[] = { 0, 100, 3650, 80, 7300, 50 }; calendarLifeMatrix.assign(vals2, 3, 2); - calendarChoice = lifetime_params::CALENDAR_CHOICE::MODEL; + calendarChoice = calendar_cycle_params::CALENDAR_CHOICE::MODEL; // thermal mass = 507; diff --git a/third_party/ssc/test/shared_test/lib_battery_test.cpp b/third_party/ssc/test/shared_test/lib_battery_test.cpp index dfc38ece157..45af7732231 100644 --- a/third_party/ssc/test/shared_test/lib_battery_test.cpp +++ b/third_party/ssc/test/shared_test/lib_battery_test.cpp @@ -213,12 +213,14 @@ TEST_F(lib_battery_test, runTestCycleAt1C){ capacity_passed += batteryModel->I() * batteryModel->V() / 1000.; // std::cerr << "\n" << idx << ": " << capacity_passed << "\n"; - auto s = battery_state_test({{479.75, 1000, 960.01, 20.25, 0, 49.97, 52.09, 2}, // cap - 550.65, // voltage - 100, {100, 0, 0, 0, 0, 0, 1, std::vector()}, // cycle - {102, 0, 0}, // calendar - {96.00, 20.00, 20}, // thermal - 0}); + auto s = battery_state_test(); + s.capacity = {479.75, 1000, 960.01, 20.25, 0, 49.97, 52.09, 2}; + s.batt_voltage = 550.65; + s.lifetime.calendar->q_relative_calendar = 102; + s.lifetime.cycle->q_relative_cycle = 100; + s.lifetime.cycle->rainflow_jlt = 1; + s.lifetime.q_relative = 100; + s.thermal = {96.00, 20.00, 20}; compareState(batteryModel, s, "runTestCycleAt1C: 1"); while (batteryModel->SOC() > SOC_min + 1){ @@ -227,12 +229,14 @@ TEST_F(lib_battery_test, runTestCycleAt1C){ } // std::cerr << idx << ": soc " << batteryModel->SOC() << ", cap " << capacity_passed << "\n"; // the SOC isn't at 5 so it means the controller is not able to calculate a current/voltage at which to discharge to 5 - s = battery_state_test({{54.5, 1000, 960.01, 20.25, 0, 5.67, 7.79, 2}, // cap - 366.96, // voltage - 100, {100, 0, 0, 0, 0, 0, 1, std::vector()}, // cycle - {101.976, 0, 0.0002}, // calendar - {96.01, 20.01, 20}, // thermal - 0}); + s.capacity = {54.5, 1000, 960.01, 20.25, 0, 5.67, 7.79, 2}; + s.batt_voltage = 366.96; + s.lifetime.day_age_of_battery = 0.875; + s.lifetime.q_relative = 100; + s.lifetime.cycle->q_relative_cycle = 100; + s.lifetime.calendar->q_relative_calendar = 101.976; + s.lifetime.calendar->dq_relative_calendar_old = 0.0002; + s.thermal = {96.01, 20.01, 20}; compareState(batteryModel, s, "runTestCycleAt1C: 2"); size_t n_cycles = 400; @@ -251,12 +255,22 @@ TEST_F(lib_battery_test, runTestCycleAt1C){ } // std::cerr << idx << ": soc " << batteryModel->SOC() << ", cap " << capacity_passed << "\n"; // the SOC isn't at 5 so it means the controller is not able to calculate a current/voltage at which to discharge to 5 - s = battery_state_test({{50.64, 920.75, 883.93, 8.917, 0, 5.73, 6.74, 2}, // cap - 368.90, // voltage - 93.08, {92.07, 397, 88.74, 88.72, 88.79, 89.30, 7, std::vector()}, // cycle - {98.0, 2739, 0.039}, // calendar - {96.0, 20.00, 20}, // thermal - 32991}); + s.capacity = {50.64, 920.75, 883.93, 8.917, 0, 5.73, 6.74, 2}; + s.batt_voltage = 368.90; + s.lifetime.q_relative = 93.08; + s.lifetime.cycle->q_relative_cycle = 92.07; + s.lifetime.n_cycles = 397; + s.lifetime.range = 88.74; + s.lifetime.average_range = 88.72; + s.lifetime.cycle->rainflow_Xlt = 88.79; + s.lifetime.cycle->rainflow_Ylt = 89.30; + s.lifetime.cycle->rainflow_jlt = 7; + s.lifetime.day_age_of_battery = 2739.71; + s.lifetime.calendar->q_relative_calendar = 98.0; + s.lifetime.calendar->dq_relative_calendar_old = 0.039; + s.thermal = {96.0, 20.00, 20}; + s.last_idx = 32991; + compareState(batteryModel, s, "runTestCycleAt1C: 3"); EXPECT_NEAR(capacity_passed, 352736, 1000) << "Current passing through cell"; @@ -272,12 +286,15 @@ TEST_F(lib_battery_test, runTestCycleAt3C){ capacity_passed += batteryModel->I() * batteryModel->V() / 1000.; // std::cerr << "\n" << idx << ": " << capacity_passed << "\n"; - auto s = battery_state_test({{439.25, 1000, 960.02, 60.75, 0, 45.75, 52.08, 2}, // cap - 548.35, // voltage - 100, {100, 0, 0, 0, 0, 0, 1, std::vector()}, // cycle - {102, 0}, // calendar - {96.01, 20.01, 20}, // thermal - 0}); + auto s = battery_state_test(); + s.capacity = {439.25, 1000, 960.02, 60.75, 0, 45.75, 52.08, 2}; + s.batt_voltage = 548.35; + s.lifetime.q_relative = 100; + s.lifetime.cycle->q_relative_cycle = 100; + s.lifetime.cycle->rainflow_jlt = 1; + s.lifetime.calendar->q_relative_calendar = 102; + s.thermal = {96.01, 20.01, 20}; + s.last_idx = 0; compareState(batteryModel, s, "runTest: 1"); while (batteryModel->SOC() > SOC_min + 1){ @@ -286,12 +303,12 @@ TEST_F(lib_battery_test, runTestCycleAt3C){ } // std::cerr << idx << ": soc " << batteryModel->SOC() << ", cap " << capacity_passed << "\n"; // the SOC isn't at 5 so it means the controller is not able to calculate a current/voltage at which to discharge to 5 - s = battery_state_test({{48.01, 1000, 960.11, 26.74, 0, 5.00, 7.78, 2}, // cap - 338.91, // voltage - 101.98, {100, 0, 0, 0, 0, 0, 1, std::vector()}, // cycle - {101.98, 0}, // calendar - {96.01, 20.01, 20}, // thermal - 0}); + s.capacity = {48.01, 1000, 960.11, 26.74, 0, 5.00, 7.78, 2}; + s.batt_voltage = 338.91; + s.lifetime.day_age_of_battery = 0.29; + s.lifetime.q_relative = 101.98; + s.lifetime.calendar->q_relative_calendar = 101.98; + s.last_idx = 0; compareState(batteryModel, s, "runTest: 2"); size_t n_cycles = 400; @@ -310,15 +327,24 @@ TEST_F(lib_battery_test, runTestCycleAt3C){ } // std::cerr << idx << ": soc " << batteryModel->SOC() << ", cap " << capacity_passed << "\n"; // the SOC isn't at 5 so it means the controller is not able to calculate a current/voltage at which to discharge to 5 - s = battery_state_test({{49.06, 920.77, 883.94, 8.89, 0, 5.55, 6.55, 2}, // cap - 362.25, // voltage - 93.08, {92.08, 397, 88.51, 89.14, 88.53, 89.45, 7, std::vector()}, // cycle - {98.11, 2613, 0.0393}, // calendar - {96.01, 20, 20}, // thermal - 32991}); + s.capacity = {49.06, 920.77, 883.94, 8.89, 0, 5.55, 6.55, 2}; + s.batt_voltage = 362.25; + s.lifetime.q_relative = 93.08; + s.lifetime.day_age_of_battery = 2613.08; + s.lifetime.cycle->q_relative_cycle = 92.08; + s.lifetime.n_cycles = 397; + s.lifetime.range = 88.51; + s.lifetime.average_range = 89.14; + s.lifetime.cycle->rainflow_Xlt = 88.53; + s.lifetime.cycle->rainflow_Ylt = 89.45; + s.lifetime.cycle->rainflow_jlt = 7; + s.lifetime.cycle->q_relative_cycle = 92.08; + s.lifetime.calendar->q_relative_calendar = 98.11; + s.lifetime.calendar->dq_relative_calendar_old = 0.0393; + s.thermal = {96.01, 20, 20}; + s.last_idx = 32991; compareState(batteryModel, s, "runTest: 3"); - EXPECT_NEAR(capacity_passed, 353328, 100) << "Current passing through cell"; double qmax = fmax(s.capacity.qmax_lifetime, s.capacity.qmax_thermal); EXPECT_NEAR(qmax/q, 0.9209, 0.01) << "capacity relative to max capacity"; @@ -355,10 +381,12 @@ TEST_F(lib_battery_test, createFromParams) { double current = 10; double P_orig = batteryModel->run(0, current); - current = 10; + double P_new = bat.run(0, current); EXPECT_EQ(P_orig, P_new); + EXPECT_EQ(batteryModel->I(), bat.I()); + EXPECT_EQ(batteryModel->charge_maximum(), bat.charge_maximum()); } TEST_F(lib_battery_test,logging) { @@ -570,6 +598,89 @@ TEST_F(lib_battery_test, HourlyVsSubHourly) } } +TEST_F(lib_battery_test, AdaptiveTimestep) { + size_t steps_per_hour = 4; + auto batt_subhourly = new battery_t(*batteryModel); + batt_subhourly->ChangeTimestep(1. / (double)steps_per_hour); + auto batt_adaptive = new battery_t(*batt_subhourly); + + EXPECT_EQ(batt_adaptive->charge_total(), batteryModel->charge_total()); + EXPECT_EQ(batt_adaptive->charge_maximum(), batteryModel->charge_maximum()); + EXPECT_EQ(batt_adaptive->V(), batteryModel->V()); + EXPECT_EQ(batt_adaptive->I(), batteryModel->I()); + + double kw_hourly = 100.; + size_t count = 0; + while (count < 2000){ + double hourly_E = 0; + double subhourly_E = 0; + double adaptive_E = 0; + while (batteryModel->SOC() > 15) { + // run hourly + batteryModel->runPower(kw_hourly); + hourly_E += batteryModel->get_state().P; + + // run subhourly + for (size_t i = 0; i < steps_per_hour; i++) { + batt_subhourly->runPower(kw_hourly); + subhourly_E += batt_subhourly->get_state().P / (double)steps_per_hour; + } + + // run adaptive + if (count % 2 == 0) { + batt_adaptive->ChangeTimestep(1); + batt_adaptive->runPower(kw_hourly); + adaptive_E += batt_adaptive->get_state().P; + } + else { + batt_adaptive->ChangeTimestep(1. / (double)steps_per_hour); + for (size_t i = 0; i < steps_per_hour; i++) { + batt_adaptive->runPower(kw_hourly); + adaptive_E += batt_adaptive->get_state().P / (double)steps_per_hour; + } + } + } + while (batteryModel->SOC() < 85) { + batteryModel->runPower(-kw_hourly); + hourly_E -= batteryModel->get_state().P; + + for (size_t i = 0; i < steps_per_hour; i++) { + batt_subhourly->runPower(-kw_hourly); + subhourly_E -= batt_subhourly->get_state().P / (double)steps_per_hour; + } + if (count % 2 == 0) { + batt_adaptive->ChangeTimestep(1); + batt_adaptive->runPower(-kw_hourly); + adaptive_E -= batt_adaptive->get_state().P; + } + else { + batt_adaptive->ChangeTimestep(1. / (double)steps_per_hour); + for (size_t i = 0; i < steps_per_hour; i++) { + batt_adaptive->runPower(-kw_hourly); + adaptive_E -= batt_adaptive->get_state().P / (double)steps_per_hour; + } + } + } + count++; + + // max energy throughput error is about 10% from hourly runs and 15% from 15 min runs + EXPECT_NEAR(hourly_E, adaptive_E, hourly_E * 0.10) << "At count " << count; + EXPECT_NEAR(subhourly_E, adaptive_E, subhourly_E * 0.15) << "At count " << count; + + // max lifetime degradation error is about 15, out of charge max of ~600 -> 20 / 600 = 3.3 % error + EXPECT_NEAR(batteryModel->charge_maximum(), batt_adaptive->charge_maximum(), 20) << "At count " << count; + EXPECT_NEAR(batt_subhourly->charge_maximum(), batt_adaptive->charge_maximum(), 20) << "At count " << count; + } + EXPECT_NEAR(batteryModel->charge_maximum(), 577.09, 1e-2); + EXPECT_NEAR(batt_subhourly->charge_maximum(), 582.22, 1e-2); + EXPECT_NEAR(batt_adaptive->charge_maximum(), 577.27, 1e-2); + + EXPECT_NEAR(batteryModel->SOC(), 94.97, 1e-2); + EXPECT_NEAR(batt_subhourly->SOC(), 88.14, 1e-2); + EXPECT_NEAR(batt_adaptive->SOC(), 88.67, 1e-2); +} + + TEST_F(lib_battery_test, AugmentCapacity) { std::vector augmentation_percent = {50, 40, 30}; batteryModel->setupReplacements(augmentation_percent); @@ -625,3 +736,18 @@ TEST_F(lib_battery_test, ReplaceByCapacityTest){ double rep = batteryModel->getNumReplacementYear(); EXPECT_EQ(rep, 1); } + +TEST_F(lib_battery_test, NMCLifeModel) { + auto lifetimeModelNMC = new lifetime_nmc_t(dtHour); + auto thermalModelNMC = new thermal_t(1.0, mass, surface_area, resistance, Cp, h, T_room); + auto capacityModelNMC = new capacity_lithium_ion_t(q, SOC_init, SOC_max, SOC_min, dtHour); + auto voltageModelNMC = new voltage_dynamic_t(n_series, n_strings, Vnom_default, Vfull, Vexp, Vnom, Qfull, Qexp, Qnom, + C_rate, resistance, dtHour); + auto lossModelNMC = new losses_t(monthlyLosses, monthlyLosses, monthlyLosses); + + auto batteryNMC = std::unique_ptr(new battery_t(dtHour, chemistry, capacityModelNMC, voltageModelNMC, lifetimeModelNMC, thermalModelNMC, lossModelNMC)); + double I = Qfull * n_strings * 2; + + batteryNMC->run(0, I); + +} diff --git a/third_party/ssc/test/shared_test/lib_battery_test.h b/third_party/ssc/test/shared_test/lib_battery_test.h index b8e2e5a5bed..781fe97b5f2 100644 --- a/third_party/ssc/test/shared_test/lib_battery_test.h +++ b/third_party/ssc/test/shared_test/lib_battery_test.h @@ -29,6 +29,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "lib_battery.h" #include "lib_battery_capacity_test.h" #include "lib_battery_lifetime_test.h" +#include "lib_battery_lifetime_nmc.h" static void compareState(thermal_state tested_state, thermal_state expected_state, const std::string& msg){ double tol = 0.02; @@ -109,9 +110,7 @@ class lib_battery_losses_test : public ::testing::Test struct battery_state_test{ capacity_state capacity; double batt_voltage; - double q_lifetime; - cycle_state cycle; - calendar_state cal; + lifetime_state lifetime; thermal_state thermal; size_t last_idx; @@ -125,18 +124,20 @@ static void compareState(std::unique_ptr&model, const battery_state_t double tol = 0.01; auto lifetime_tested = tested_state.lifetime; - auto cal_expected = expected_state.cal; - EXPECT_NEAR(lifetime_tested->calendar->day_age_of_battery, cal_expected.day_age_of_battery, tol) << msg; + auto lifetime_expected = expected_state.lifetime; + EXPECT_NEAR(lifetime_tested->day_age_of_battery, lifetime_expected.day_age_of_battery, tol) << msg; + EXPECT_NEAR(lifetime_tested->range, lifetime_expected.range, tol) << msg; + EXPECT_NEAR(lifetime_tested->average_range, lifetime_expected.average_range, tol) << msg; + EXPECT_NEAR(lifetime_tested->n_cycles, lifetime_expected.n_cycles, tol) << msg; + + auto cal_expected = *lifetime_expected.calendar; EXPECT_NEAR(lifetime_tested->calendar->q_relative_calendar, cal_expected.q_relative_calendar, tol) << msg; EXPECT_NEAR(lifetime_tested->calendar->dq_relative_calendar_old, cal_expected.dq_relative_calendar_old, tol) << msg; - auto cyc_expected = expected_state.cycle; + auto cyc_expected = *lifetime_expected.cycle; EXPECT_NEAR(lifetime_tested->cycle->q_relative_cycle, cyc_expected.q_relative_cycle, tol) << msg; EXPECT_NEAR(lifetime_tested->cycle->rainflow_Xlt, cyc_expected.rainflow_Xlt, tol) << msg; EXPECT_NEAR(lifetime_tested->cycle->rainflow_Ylt, cyc_expected.rainflow_Ylt, tol) << msg; - EXPECT_NEAR(lifetime_tested->cycle->range, cyc_expected.range, tol) << msg; - EXPECT_NEAR(lifetime_tested->cycle->average_range, cyc_expected.average_range, tol) << msg; - EXPECT_NEAR(lifetime_tested->cycle->n_cycles, cyc_expected.n_cycles, tol) << msg; EXPECT_NEAR(lifetime_tested->cycle->rainflow_jlt, cyc_expected.rainflow_jlt, tol) << msg; compareState(*tested_state.thermal, expected_state.thermal, msg); @@ -259,13 +260,13 @@ class lib_battery_test : public ::testing::Test capacityModel = new capacity_lithium_ion_t(q, SOC_init, SOC_max, SOC_min, dtHour); voltageModel = new voltage_dynamic_t(n_series, n_strings, Vnom_default, Vfull, Vexp, Vnom, Qfull, Qexp, Qnom, C_rate, resistance, dtHour); - lifetimeModel = new lifetime_t(cycleLifeMatrix, dtHour, 1.02, 2.66e-3, -7280, 930); - thermalModel = new thermal_t(1.0, mass, surface_area, resistance, Cp, h, capacityVsTemperature, T_room); + lifetimeModel = new lifetime_calendar_cycle_t(cycleLifeMatrix, dtHour, 1.02, 2.66e-3, -7280, 930); + thermalModel = new thermal_t(dtHour, mass, surface_area, resistance, Cp, h, capacityVsTemperature, T_room); lossModel = new losses_t(monthlyLosses, monthlyLosses, monthlyLosses); batteryModel = std::unique_ptr(new battery_t(dtHour, chemistry, capacityModel, voltageModel, lifetimeModel, thermalModel, lossModel)); } - void TearDown(){ + void TearDown() override { // batteryModel takes ownership of component models } diff --git a/third_party/ssc/test/shared_test/lib_csp_tes_test.cpp b/third_party/ssc/test/shared_test/lib_csp_tes_test.cpp new file mode 100644 index 00000000000..494c6563255 --- /dev/null +++ b/third_party/ssc/test/shared_test/lib_csp_tes_test.cpp @@ -0,0 +1,148 @@ +#include + +#include "lib_csp_tes_test.h" +#include "vs_google_test_explorer_namespace.h" + +using namespace csp_common; + +//========Tests=================================================================================== +//=== Using factory patterns to create the different physical and non-physical components========= + +// Test draining storage tank +NAMESPACE_TEST(csp_common, StorageTank, DrainingTank) +{ + bool is_hot_tank = false; + double dt = 3600.; + + DefaultTankFactory default_tank_factory = DefaultTankFactory(); + std::unique_ptr tank_specifications = default_tank_factory.MakeSpecifications(); + std::unique_ptr tank = default_tank_factory.MakeTank(tank_specifications.get()); + TankState tank_state = default_tank_factory.MakeTankState(); + TankExternalConditions external_conditions = default_tank_factory.MakeExternalConditions(); + + double T_ave, vol_ave, q_loss, T_fin, vol_fin, m_fin, q_heater; // outputs + + tank->mixed_tank( + is_hot_tank, dt, + tank_state.m_prev, tank_state.T_prev, + external_conditions.m_dot_in, external_conditions.m_dot_out, + external_conditions.T_in, external_conditions.T_amb, + T_ave, vol_ave, q_loss, T_fin, vol_fin, m_fin, q_heater); + + EXPECT_NEAR(T_ave, 563.7, 563.7 * kErrorToleranceLo); + EXPECT_NEAR(vol_ave, 892.30, 892.30 * kErrorToleranceLo); + EXPECT_NEAR(q_loss, 0.331, 0.331 * kErrorToleranceLo); + EXPECT_NEAR(T_fin, 558.9, 558.9 * kErrorToleranceLo); + EXPECT_NEAR(vol_fin, 0., 0. * kErrorToleranceLo); + EXPECT_NEAR(m_fin, 0., 0. * kErrorToleranceLo); + EXPECT_NEAR(q_heater, 0., 0. * kErrorToleranceLo); +} + +// Test an initially drained storage tank +NAMESPACE_TEST(csp_common, StorageTank, InitiallyDrainedTank) +{ + bool is_hot_tank = false; + double dt = 3600.; + + DefaultTankFactory default_tank_factory = DefaultTankFactory(); + std::unique_ptr tank_specifications = default_tank_factory.MakeSpecifications(); + std::unique_ptr tank = default_tank_factory.MakeTank(tank_specifications.get()); + TankState tank_state = default_tank_factory.MakeTankState(); + TankExternalConditions external_conditions = default_tank_factory.MakeExternalConditions(); + + tank_state.m_prev = 0.; + + double T_ave, vol_ave, q_loss, T_fin, vol_fin, m_fin, q_heater; // outputs + + tank->mixed_tank( + is_hot_tank, dt, + tank_state.m_prev, tank_state.T_prev, + external_conditions.m_dot_in, external_conditions.m_dot_out, + external_conditions.T_in, external_conditions.T_amb, + T_ave, vol_ave, q_loss, T_fin, vol_fin, m_fin, q_heater); + + EXPECT_NEAR(T_ave, 563.97, 563.97 * kErrorToleranceLo); + EXPECT_NEAR(vol_ave, 0., 0. * kErrorToleranceLo); + EXPECT_NEAR(q_loss, 0., 0. * kErrorToleranceLo); + EXPECT_NEAR(T_fin, 563.97, 563.97 * kErrorToleranceLo); + EXPECT_NEAR(vol_fin, 0., 0. * kErrorToleranceLo); + EXPECT_NEAR(m_fin, 0., 0. * kErrorToleranceLo); + EXPECT_NEAR(q_heater, 0., 0. * kErrorToleranceLo); +} + +//========/Tests================================================================================== + +//========TankFactory (super class)=============================================================== +//========/TankFactory (super class)============================================================== + +//========DefaultTankFactory (subclass)=========================================================== +std::unique_ptr DefaultTankFactory::MakeTank(TankSpecifications* tank_specifications) const +{ + auto tank = std::unique_ptr(new Tank); + + tank->define_storage( + tank_specifications->fluid_field, + tank_specifications->fluid_store, + tank_specifications->is_direct, + tank_specifications->config, + tank_specifications->duty_des, + tank_specifications->vol_des, + tank_specifications->h_des, + tank_specifications->u_des, + tank_specifications->tank_pairs_des, + tank_specifications->hot_htr_set_point_des, + tank_specifications->cold_htr_set_point_des, + tank_specifications->max_q_htr_cold, + tank_specifications->max_q_htr_hot, + tank_specifications->dt_hot_des, + tank_specifications->dt_cold_des, + tank_specifications->T_h_in_des, + tank_specifications->T_h_out_des); + + return tank; +} + +std::unique_ptr DefaultTankFactory::MakeSpecifications() const +{ + auto tank_specifications = std::unique_ptr(new TankSpecifications()); + tank_specifications->field_fluid = 18; + tank_specifications->store_fluid = 18; + tank_specifications->fluid_field.SetFluid(tank_specifications->field_fluid); + tank_specifications->fluid_store.SetFluid(tank_specifications->store_fluid); + tank_specifications->is_direct = true; + tank_specifications->config = 2; + tank_specifications->duty_des = 623595520.; + tank_specifications->vol_des = 17558.4; + tank_specifications->h_des = 12.; + tank_specifications->u_des = 0.4; + tank_specifications->tank_pairs_des = 1.; + tank_specifications->hot_htr_set_point_des = 638.15; + tank_specifications->cold_htr_set_point_des = 523.15; + tank_specifications->max_q_htr_cold = 25.; + tank_specifications->max_q_htr_hot = 25.; + tank_specifications->dt_hot_des = 5.; + tank_specifications->dt_cold_des = 5.; + tank_specifications->T_h_in_des = 703.15; + tank_specifications->T_h_out_des = 566.15; + + return tank_specifications; +} + +TankState DefaultTankFactory::MakeTankState() const +{ + TankState tank_state; + tank_state.m_prev = 3399727.; + tank_state.T_prev = 563.97; + return tank_state; +} + +TankExternalConditions DefaultTankFactory::MakeExternalConditions() const +{ + TankExternalConditions external_conditions; + external_conditions.m_dot_in = 0.; + external_conditions.m_dot_out = 1239.16; // this will more than drain the tank + external_conditions.T_in = 566.15; + external_conditions.T_amb = 296.15; + return external_conditions; +} +//========/DefaultTankFactory (subclass)========================================================== diff --git a/third_party/ssc/test/shared_test/lib_csp_tes_test.h b/third_party/ssc/test/shared_test/lib_csp_tes_test.h new file mode 100644 index 00000000000..f4fc24a4c5a --- /dev/null +++ b/third_party/ssc/test/shared_test/lib_csp_tes_test.h @@ -0,0 +1,74 @@ +#ifndef __LIB_CSP_TES_TEST_H__ +#define __LIB_CSP_TES_TEST_H__ + +#include +#include "../tcs/storage_hx.h" + +using Tank = Storage_HX; + +namespace csp_common +{ + struct TankSpecifications; // forward declaration + struct TankState; + struct TankExternalConditions; + + const double kErrorToleranceLo = 0.001; // 0.1% + const double kErrorToleranceHi = 0.01; // 1.0% + + class TankFactory { + public: + TankFactory() {}; + virtual std::unique_ptr MakeTank(TankSpecifications* tank_specifications) const = 0; + virtual std::unique_ptr MakeSpecifications() const = 0; + virtual TankState MakeTankState() const = 0; + virtual TankExternalConditions MakeExternalConditions() const = 0; + }; + + class DefaultTankFactory : public TankFactory { + public: + DefaultTankFactory() {}; + virtual std::unique_ptr MakeTank(TankSpecifications* tank_specifications) const; + virtual std::unique_ptr MakeSpecifications() const; + virtual TankState MakeTankState() const; + virtual TankExternalConditions MakeExternalConditions() const; + }; + + struct TankSpecifications + { + int field_fluid; + int store_fluid; + HTFProperties fluid_field; + HTFProperties fluid_store; + bool is_direct; + int config; + double duty_des; + double vol_des; + double h_des; + double u_des; + double tank_pairs_des; + double hot_htr_set_point_des; + double cold_htr_set_point_des; + double max_q_htr_cold; + double max_q_htr_hot; + double dt_hot_des; + double dt_cold_des; + double T_h_in_des; + double T_h_out_des; + }; + + struct TankState + { + double m_prev; + double T_prev; + }; + + struct TankExternalConditions + { + double m_dot_in; + double m_dot_out; + double T_in; + double T_amb; + }; +} + +#endif diff --git a/third_party/ssc/test/shared_test/lib_csp_test.cpp b/third_party/ssc/test/shared_test/lib_csp_test.cpp deleted file mode 100644 index 9623deab171..00000000000 --- a/third_party/ssc/test/shared_test/lib_csp_test.cpp +++ /dev/null @@ -1,230 +0,0 @@ -#include - -#include "lib_csp_test.h" - - -CollectorTestSpecifications default_collector_test_specifications() -{ - CollectorTestSpecifications collector_test_specifications; - collector_test_specifications.FRta = 0.689; - collector_test_specifications.FRUL = 3.85; - collector_test_specifications.iam = 0.2; - collector_test_specifications.area_coll = 2.98; - collector_test_specifications.m_dot = 0.045528; // kg/s - collector_test_specifications.heat_capacity = 4.182; // kJ/kg-K - - return collector_test_specifications; -} - -FlatPlateCollector* default_flat_plate_collector() -{ - CollectorTestSpecifications collector_test_specifications = default_collector_test_specifications(); - - return new FlatPlateCollector(collector_test_specifications); -} - -tm default_time() -{ - tm time; - // TODO - The timestamp should be generated from a string so all attributes are valid - time.tm_year = 2012 - 1900; // years since 1900 - time.tm_mon = 1 - 1; // months since Jan. (Jan. = 0) - time.tm_mday = 1; - time.tm_hour = 12; - time.tm_min = 30; - time.tm_sec = 0; - - return time; -} - -CollectorLocation default_location() -{ - CollectorLocation collector_location; - collector_location.latitude = 33.45000; - collector_location.longitude = -111.98000; - collector_location.timezone = -7; - - return collector_location; -} - -CollectorOrientation default_orientation() -{ - CollectorOrientation collector_orientation; - collector_orientation.tilt = 30.; - collector_orientation.azimuth = 180.; - - return collector_orientation; -} - -ArrayDimensions default_dimensions() -{ - ArrayDimensions array_dimensions; - array_dimensions.num_in_parallel = 1; - array_dimensions.num_in_series = 1; - - return array_dimensions; -} - -TimeAndPosition default_time_and_position() -{ - TimeAndPosition time_and_position; - time_and_position.timestamp = default_time(); - time_and_position.collector_location = default_location(); - time_and_position.collector_orientation = default_orientation(); - - return time_and_position; -} - -ExternalConditions default_external_conditions() -{ - ExternalConditions external_conditions; - external_conditions.weather.ambient_temp = 25.; - external_conditions.weather.dni = 935.; - external_conditions.weather.dhi = 84.; - external_conditions.weather.ghi = std::numeric_limits::quiet_NaN(); - external_conditions.weather.wind_speed = std::numeric_limits::quiet_NaN(); - external_conditions.weather.wind_direction = std::numeric_limits::quiet_NaN(); - external_conditions.inlet_fluid_flow.m_dot = 0.091056; // kg/s - external_conditions.inlet_fluid_flow.specific_heat = 4.182; // kJ/kg-K - external_conditions.inlet_fluid_flow.temp = 45.9; // from previous timestep - external_conditions.albedo = 0.2; - - return external_conditions; -} - -Pipe* default_pipe() -{ - double inner_diameter = 0.019; - double insulation_conductivity = 0.03; - double insulation_thickness = 0.006; - double length = 5; - - return new Pipe(inner_diameter, insulation_conductivity, insulation_thickness, length); -} - -void FlatPlateCollectorTest::SetUp() -{ - // Too much in the Setup; can't change the configuration in the tests - flat_plate_collector_ = default_flat_plate_collector(); -} - -TEST_F(FlatPlateCollectorTest, TestFlatPlateCollectorNominalOperation) -{ - TimeAndPosition time_and_position = default_time_and_position(); - ExternalConditions external_conditions = default_external_conditions(); - - double useful_power_gain = flat_plate_collector_->UsefulPowerGain(time_and_position, external_conditions); // [W] - double T_out = flat_plate_collector_->T_out(time_and_position, external_conditions); // [C] - - EXPECT_NEAR(useful_power_gain, 1.659e3, 1.659e3 * m_error_tolerance_hi); - EXPECT_NEAR(T_out, 50.26, 50.26 * m_error_tolerance_hi); -} - -void FlatPlateArrayTest::SetUp() -{ - // Too much in the Setup; can't change the configuration in the tests - flat_plate_collector_ = default_flat_plate_collector(); - collector_location_ = default_location(); - collector_orientation_ = default_orientation(); - array_dimensions_ = default_dimensions(); - - inlet_pipe_ = default_pipe(); - outlet_pipe_ = default_pipe(); - - flat_plate_array_ = new FlatPlateArray(*flat_plate_collector_, collector_location_, - collector_orientation_, array_dimensions_, *inlet_pipe_, *outlet_pipe_); -} - -TEST_F(FlatPlateArrayTest, TestFlatPlateArrayOfOneNominalOperation) -{ - tm timestamp = default_time(); - ExternalConditions external_conditions = default_external_conditions(); - external_conditions.inlet_fluid_flow.temp = 44.86; - - double useful_power_gain = flat_plate_array_->UsefulPowerGain(timestamp, external_conditions); // [W] - double T_out = flat_plate_array_->T_out(timestamp, external_conditions); // [C] - - EXPECT_NEAR(useful_power_gain, 1.587e3, 1.587e3 * m_error_tolerance_hi); - EXPECT_NEAR(T_out, 49.03, 49.03 * m_error_tolerance_hi); -} - - - -void StorageTankTest::SetUp() -{ - m_storage = new Storage_HX(); - - m_field_fluid = 18; - m_store_fluid = 18; - m_fluid_field; - m_fluid_store; - m_is_direct = true; - m_config = 2; - m_duty_des = 623595520.; - m_vol_des = 17558.4; - m_h_des = 12.; - m_u_des = 0.4; - m_tank_pairs_des = 1.; - m_hot_htr_set_point_des = 638.15; - m_cold_htr_set_point_des = 523.15; - m_max_q_htr_cold = 25.; - m_max_q_htr_hot = 25.; - m_dt_hot_des = 5.; - m_dt_cold_des = 5.; - m_T_h_in_des = 703.15; - m_T_h_out_des = 566.15; - - m_fluid_field.SetFluid(m_field_fluid); - m_fluid_store.SetFluid(m_store_fluid); - - m_storage->define_storage(m_fluid_field, m_fluid_store, m_is_direct, - m_config, m_duty_des, m_vol_des, m_h_des, - m_u_des, m_tank_pairs_des, m_hot_htr_set_point_des, m_cold_htr_set_point_des, - m_max_q_htr_cold, m_max_q_htr_hot, m_dt_hot_des, m_dt_cold_des, m_T_h_in_des, m_T_h_out_des); -} - -TEST_F(StorageTankTest, TestDrainingTank_storage_hx) -{ - m_is_hot_tank = false; - m_dt = 3600; - m_m_prev = 3399727.; - m_T_prev = 563.97; - m_m_dot_in = 0.; - m_m_dot_out = 1239.16; // this will more than drain the tank - m_T_in = 566.15; - m_T_amb = 296.15; - - m_storage->mixed_tank(m_is_hot_tank, m_dt, m_m_prev, m_T_prev, m_m_dot_in, m_m_dot_out, m_T_in, m_T_amb, - m_T_ave, m_vol_ave, m_q_loss, m_T_fin, m_vol_fin, m_m_fin, m_q_heater); - - EXPECT_NEAR(m_T_ave, 563.7, 563.7 * m_error_tolerance_lo); - EXPECT_NEAR(m_vol_ave, 892.30, 892.30 * m_error_tolerance_lo); - EXPECT_NEAR(m_q_loss, 0.331, 0.331 * m_error_tolerance_lo); - EXPECT_NEAR(m_T_fin, 558.9, 558.9 * m_error_tolerance_lo); - EXPECT_NEAR(m_vol_fin, 0., 0. * m_error_tolerance_lo); - EXPECT_NEAR(m_m_fin, 0., 0. * m_error_tolerance_lo); - EXPECT_NEAR(m_q_heater, 0., 0. * m_error_tolerance_lo); -} - -TEST_F(StorageTankTest, TestDrainedTank_storage_hx) -{ - m_is_hot_tank = false; - m_dt = 3600; - m_m_prev = 0.; - m_T_prev = 563.97; - m_m_dot_in = 0.; - m_m_dot_out = 1239.16; - m_T_in = 566.15; - m_T_amb = 296.15; - - m_storage->mixed_tank(m_is_hot_tank, m_dt, m_m_prev, m_T_prev, m_m_dot_in, m_m_dot_out, m_T_in, m_T_amb, - m_T_ave, m_vol_ave, m_q_loss, m_T_fin, m_vol_fin, m_m_fin, m_q_heater); - - EXPECT_NEAR(m_T_ave, 563.97, 563.97 * m_error_tolerance_lo); - EXPECT_NEAR(m_vol_ave, 0., 0. * m_error_tolerance_lo); - EXPECT_NEAR(m_q_loss, 0., 0. * m_error_tolerance_lo); - EXPECT_NEAR(m_T_fin, 563.97, 563.97 * m_error_tolerance_lo); - EXPECT_NEAR(m_vol_fin, 0., 0. * m_error_tolerance_lo); - EXPECT_NEAR(m_m_fin, 0., 0. * m_error_tolerance_lo); - EXPECT_NEAR(m_q_heater, 0., 0. * m_error_tolerance_lo); -} \ No newline at end of file diff --git a/third_party/ssc/test/shared_test/lib_csp_test.h b/third_party/ssc/test/shared_test/lib_csp_test.h deleted file mode 100644 index ec702281a10..00000000000 --- a/third_party/ssc/test/shared_test/lib_csp_test.h +++ /dev/null @@ -1,125 +0,0 @@ -#ifndef __LIB_CSP_TEST_H__ -#define __LIB_CSP_TEST_H__ - -#include -#include "../tcs/storage_hx.h" -#include "../tcs/flat_plate_solar_collector.h" - -class FlatPlateCollectorTest : public ::testing::Test -{ -public: - const double m_error_tolerance_lo = 0.001; // 0.1% - const double m_error_tolerance_hi = 0.01; // 1.0% - - void SetUp(); - - void TearDown() - { - if (flat_plate_collector_) { - delete flat_plate_collector_; - flat_plate_collector_ = nullptr; - } - } -protected: - FlatPlateCollector *flat_plate_collector_; - - // inputs - - // outputs - - // parameters for initialization - -}; - -class FlatPlateArrayTest : public ::testing::Test -{ -public: - const double m_error_tolerance_lo = 0.001; // 0.1% - const double m_error_tolerance_hi = 0.01; // 1.0% - - void SetUp(); - - void TearDown() - { - if (flat_plate_array_) { - delete flat_plate_array_; - flat_plate_array_ = nullptr; - } - } -protected: - FlatPlateArray *flat_plate_array_; - - // inputs - - // outputs - - // parameters for initialization - FlatPlateCollector *flat_plate_collector_; - CollectorLocation collector_location_; - CollectorOrientation collector_orientation_; - ArrayDimensions array_dimensions_; - Pipe *inlet_pipe_; - Pipe *outlet_pipe_; -}; - -class StorageTankTest : public ::testing::Test -{ -protected: - Storage_HX *m_storage; - - // inputs - bool m_is_hot_tank; - double m_dt; - double m_m_prev; - double m_T_prev; - double m_m_dot_in; - double m_m_dot_out; - double m_T_in; - double m_T_amb; - - //outputs - double m_T_ave; - double m_vol_ave; - double m_q_loss; - double m_T_fin; - double m_vol_fin; - double m_m_fin; - double m_q_heater; - - // parameters for initialization - int m_field_fluid; - int m_store_fluid; - HTFProperties m_fluid_field; - HTFProperties m_fluid_store; - bool m_is_direct; - int m_config; - double m_duty_des; - double m_vol_des; - double m_h_des; - double m_u_des; - double m_tank_pairs_des; - double m_hot_htr_set_point_des; - double m_cold_htr_set_point_des; - double m_max_q_htr_cold; - double m_max_q_htr_hot; - double m_dt_hot_des; - double m_dt_cold_des; - double m_T_h_in_des; - double m_T_h_out_des; - -public: - double m_error_tolerance_lo = 0.001; // 0.1% - double m_error_tolerance_hi = 0.01; // 1.0% - - void SetUp(); - - void TearDown() - { - if (m_storage) { - delete m_storage; - m_storage = nullptr; - } - } -}; - -#endif \ No newline at end of file diff --git a/third_party/ssc/test/shared_test/lib_csp_tower_shared_with_ui_test.cpp b/third_party/ssc/test/shared_test/lib_csp_tower_shared_with_ui_test.cpp new file mode 100644 index 00000000000..8b5b3a9cd3d --- /dev/null +++ b/third_party/ssc/test/shared_test/lib_csp_tower_shared_with_ui_test.cpp @@ -0,0 +1,533 @@ +#include +#include "cmod_csp_tower_eqns.h" +#include "cmod_financial_eqns.h" +#include "csp_common_test.h" +#include "vs_google_test_explorer_namespace.h" + +namespace csp_common {} +using namespace csp_common; + +double GetNum(var_table* vd, std::string name) { + return vd->lookup(name.c_str())->num; +} +double GetNum(ssc_data_t data, std::string name) { + auto data_vtab = static_cast(data); + return data_vtab->as_number(name.c_str()); +} + +//=======Testing Molten Salt Power Tower UI Equations============================================= +NAMESPACE_TEST(csp_common, TowerSharedWithUi, SystemDesign) { + double error_tolerance = 0.01; + var_table* vd = new var_table; + vd->assign("design_eff", 0.412); + vd->assign("gross_net_conversion_factor", 0.9); + vd->assign("P_ref", 115.); + vd->assign("solarm", 2.4); + vd->assign("tshours", 10.); + + MSPT_System_Design_Equations(vd); + + ASSERT_NEAR_FRAC(GetNum(vd, "nameplate"), 103.5, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "q_pb_design"), 279., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "q_rec_des"), 670., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "tshours_sf"), 4.16667, kErrorToleranceHi); +} + +NAMESPACE_TEST(csp_common, TowerSharedWithUi, SolarPilotField) { + double error_tolerance = 0.01; + var_table* vd = new var_table; + vd->assign("c_atm_0", 0.006789); + vd->assign("c_atm_1", 0.1046); + vd->assign("c_atm_2", -0.017); + vd->assign("c_atm_3", 0.002845); + vd->assign("csp_pt_sf_fixed_land_area", 45.); + vd->assign("csp_pt_sf_land_overhead_factor", 1.); + vd->assign("dens_mirror", 0.97); + vd->assign("dni_des", 950.); + vd->assign("h_tower", 193.458); + vd->assign("helio_height", 12.2); + vd->assign("helio_optical_error_mrad", 1.53); + util::matrix_t helio_positions(8790, 2, 1.e3); + vd->assign("helio_positions", helio_positions); + vd->assign("helio_width", 12.2); + vd->assign("land_area_base", 1847.04); + vd->assign("land_max", 9.5); + vd->assign("land_min", 0.75); + vd->assign("override_layout", 0); + vd->assign("override_opt", 0); + vd->assign("q_rec_des", 670.); + + Tower_SolarPilot_Solar_Field_Equations(vd); + + ASSERT_NEAR_FRAC(GetNum(vd, "a_sf_ui"), 1269055., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "c_atm_info"), 12.97, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_sf_heliostat_area"), 144.375, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_sf_total_land_area"), 1892., kErrorToleranceHi); + //ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_sf_total_reflective_area"), 1269056.25, kErrorToleranceHi); // This one is not being read in the UI + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_sf_tower_height"), 193.458, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "dni_des_calc"), 950., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "error_equiv"), 4.32749, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "field_model_type"), 2., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "helio_area_tot"), 1269055., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "is_optimize"), 0., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "land_max_calc"), 1837.85, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "land_min_calc"), 145.094, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "n_hel"), 8790., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "opt_algorithm"), 1., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "opt_flux_penalty"), 0.25, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "q_design"), 670., kErrorToleranceHi); +} + +NAMESPACE_TEST(csp_common, TowerSharedWithUi, SolarPilotFieldWithPeriodUse) { + // Testing period use in variable names + double error_tolerance = 0.01; + var_table* vd = new var_table; + vd->assign("c_atm_0", 0.006789); + vd->assign("c_atm_1", 0.1046); + vd->assign("c_atm_2", -0.017); + vd->assign("c_atm_3", 0.002845); + vd->assign("csp.pt.sf.fixed_land_area", 45.); + vd->assign("csp.pt.sf.land_overhead_factor", 1.); + vd->assign("dens_mirror", 0.97); + vd->assign("dni_des", 950.); + vd->assign("h_tower", 193.458); + vd->assign("helio_height", 12.2); + vd->assign("helio_optical_error_mrad", 1.53); + util::matrix_t helio_positions(8790, 2, 1.e3); + vd->assign("helio_positions", helio_positions); + vd->assign("helio_width", 12.2); + vd->assign("land_area_base", 1847.04); + vd->assign("land_max", 9.5); + vd->assign("land_min", 0.75); + vd->assign("override_layout", 0); + vd->assign("override_opt", 0); + vd->assign("q_rec_des", 670.); + + Tower_SolarPilot_Solar_Field_Equations(vd); + + ASSERT_NEAR_FRAC(GetNum(vd, "a_sf_ui"), 1269055., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "c_atm_info"), 12.97, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_sf_heliostat_area"), 144.375, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_sf_total_land_area"), 1892., kErrorToleranceHi); + //ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_sf_total_reflective_area"), 1269056.25, kErrorToleranceHi); // This one is not being read in the UI + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_sf_tower_height"), 193.458, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "dni_des_calc"), 950., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "error_equiv"), 4.32749, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "field_model_type"), 2., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "helio_area_tot"), 1269055., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "is_optimize"), 0., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "land_max_calc"), 1837.85, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "land_min_calc"), 145.094, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "n_hel"), 8790., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "opt_algorithm"), 1., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "opt_flux_penalty"), 0.25, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "q_design"), 670., kErrorToleranceHi); +} + +NAMESPACE_TEST(csp_common, TowerSharedWithUi, Receiver) { + double error_tolerance = 0.01; + var_table* vd = new var_table; + vd->assign("t_htf_cold_des", 290.); + vd->assign("t_htf_hot_des", 574.); + vd->assign("rec_htf", 17); + vd->assign("csp_pt_rec_max_oper_frac", 1.2); + vd->assign("q_rec_des", 660.9); + vd->assign("rec_d_spec", 15.); + vd->assign("csp_pt_rec_cav_ap_hw_ratio", 1.2); + vd->assign("d_rec", 17.65); + vd->assign("rec_height", 23.8084); + vd->assign("h_tower", 193.458); + vd->assign("piping_length_mult", 2.6); + vd->assign("piping_length_const", 0.); + vd->assign("piping_loss", 10200.); + std::vector field_fluid_properties{ 1, 7, 0, 0, 0, 0, 0, 0, 0 }; + util::matrix_t field_fl_props(1, 9, &field_fluid_properties); + vd->assign("field_fl_props", field_fl_props); + + MSPT_Receiver_Equations(vd); + + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_rec_htf_t_avg"), 432., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_rec_htf_c_avg"), 1.5066, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_rec_max_flow_to_rec"), 1853.5, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_rec_cav_ap_height"), 18., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "rec_aspect"), 1.349, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "piping_length"), 502.991, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "piping_loss_tot"), 5130.51, kErrorToleranceHi); +} + +NAMESPACE_TEST(csp_common, TowerSharedWithUi, ReceiverWithPeriodUse) { + double error_tolerance = 0.01; + var_table* vd = new var_table; + vd->assign("t_htf_cold_des", 290.); + vd->assign("t_htf_hot_des", 574.); + vd->assign("rec_htf", 17); + vd->assign("csp.pt.rec.max_oper_frac", 1.2); + vd->assign("q_rec_des", 660.9); + vd->assign("rec_d_spec", 15.); + vd->assign("csp.pt.rec.cav_ap_hw_ratio", 1.2); + vd->assign("d_rec", 17.65); + vd->assign("rec_height", 23.8084); + vd->assign("h_tower", 193.458); + vd->assign("piping_length_mult", 2.6); + vd->assign("piping_length_const", 0.); + vd->assign("piping_loss", 10200.); + std::vector field_fluid_properties{ 1, 7, 0, 0, 0, 0, 0, 0, 0 }; + util::matrix_t field_fl_props(1, 9, &field_fluid_properties); + vd->assign("field_fl_props", field_fl_props); + + MSPT_Receiver_Equations(vd); + + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_rec_htf_t_avg"), 432., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_rec_htf_c_avg"), 1.5066, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_rec_max_flow_to_rec"), 1853.5, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_rec_cav_ap_height"), 18., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "rec_aspect"), 1.349, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "piping_length"), 502.991, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "piping_loss_tot"), 5130.51, kErrorToleranceHi); +} + +NAMESPACE_TEST(csp_common, TowerSharedWithUi, Tes) { + double error_tolerance = 0.01; + ssc_data_t data = ssc_data_create(); + auto data_vtab = static_cast(data); + + data_vtab->assign("P_ref", 115.); + data_vtab->assign("design_eff", 0.412); + data_vtab->assign("tshours", 10.); + data_vtab->assign("T_htf_hot_des", 574.); + data_vtab->assign("T_htf_cold_des", 290.); + data_vtab->assign("rec_htf", 17); + std::vector field_fluid_properties{ 1, 7, 0, 0, 0, 0, 0, 0, 0 }; + util::matrix_t field_fl_props(1, 9, &field_fluid_properties); + data_vtab->assign("field_fl_props", field_fl_props); + data_vtab->assign("h_tank_min", 1.); + data_vtab->assign("h_tank", 12.); + data_vtab->assign("tank_pairs", 1.); + data_vtab->assign("u_tank", 0.4); + + int errors = run_module(data, "ui_tes_calcs"); + EXPECT_FALSE(errors); + + ASSERT_NEAR_FRAC(GetNum(data, "q_tes"), 2791.3, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(data, "tes_avail_vol"), 12986., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(data, "vol_tank"), 14166., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(data, "csp_pt_tes_tank_diameter"), 38.8, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(data, "q_dot_tes_est"), 0.73, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(data, "csp_pt_tes_htf_density"), 1808.48, kErrorToleranceHi); +} + +NAMESPACE_TEST(csp_common, TowerSharedWithUi, TesWithPeriodUse) { + double error_tolerance = 0.01; + ssc_data_t data = ssc_data_create(); + auto data_vtab = static_cast(data); + + data_vtab->assign("P_ref", 115.); + data_vtab->assign("design_eff", 0.412); + data_vtab->assign("tshours", 10.); + data_vtab->assign("T_htf_hot_des", 574.); + data_vtab->assign("T_htf_cold_des", 290.); + data_vtab->assign("rec_htf", 17); + std::vector field_fluid_properties{ 1, 7, 0, 0, 0, 0, 0, 0, 0 }; + util::matrix_t field_fl_props(1, 9, &field_fluid_properties); + data_vtab->assign("field_fl_props", field_fl_props); + data_vtab->assign("h_tank_min", 1.); + data_vtab->assign("h_tank", 12.); + data_vtab->assign("tank_pairs", 1.); + data_vtab->assign("u_tank", 0.4); + + int errors = run_module(data, "ui_tes_calcs"); + EXPECT_FALSE(errors); + + ASSERT_NEAR_FRAC(GetNum(data, "q_tes"), 2791.3, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(data, "tes_avail_vol"), 12986., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(data, "vol_tank"), 14166., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(data, "csp_pt_tes_tank_diameter"), 38.8, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(data, "q_dot_tes_est"), 0.73, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(data, "csp_pt_tes_htf_density"), 1808.48, kErrorToleranceHi); +} + +NAMESPACE_TEST(csp_common, TowerSharedWithUi, SystemControl) { + double error_tolerance = 0.01; + var_table* vd = new var_table; + vd->assign("bop_par", 0.); + vd->assign("bop_par_f", 1.); + vd->assign("bop_par_0", 0.); + vd->assign("bop_par_1", 0.483); + vd->assign("bop_par_2", 0.); + vd->assign("p_ref", 115.); + vd->assign("aux_par", 0.023); + vd->assign("aux_par_f", 1.); + vd->assign("aux_par_0", 0.483); + vd->assign("aux_par_1", 0.571); + vd->assign("aux_par_2", 0.); + vd->assign("disp_wlim_maxspec", 1.); + vd->assign("constant", 4.); + + MSPT_System_Control_Equations(vd); + + util::matrix_t wlim_series = vd->lookup("wlim_series")->num; + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_par_calc_bop"), 0., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_par_calc_aux"), 2.78783, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "disp_wlim_max"), 0.96, kErrorToleranceHi); + ASSERT_NEAR_FRAC(wlim_series.ncells(), 8760, 0.); + ASSERT_NEAR_FRAC(wlim_series.at(0, 0), 960., kErrorToleranceHi); +} + +NAMESPACE_TEST(csp_common, TowerSharedWithUi, SystemControlWithPeriods) { + double error_tolerance = 0.01; + var_table* vd = new var_table; + vd->assign("bop_par", 0.); + vd->assign("bop_par_f", 1.); + vd->assign("bop_par_0", 0.); + vd->assign("bop_par_1", 0.483); + vd->assign("bop_par_2", 0.); + vd->assign("p_ref", 115.); + vd->assign("aux_par", 0.023); + vd->assign("aux_par_f", 1.); + vd->assign("aux_par_0", 0.483); + vd->assign("aux_par_1", 0.571); + vd->assign("aux_par_2", 0.); + vd->assign("disp_wlim_maxspec", 1.); + vd->assign("constant", 4.); + + MSPT_System_Control_Equations(vd); + + util::matrix_t wlim_series = vd->lookup("wlim_series")->num; + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_par_calc_bop"), 0., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_par_calc_aux"), 2.78783, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "disp_wlim_max"), 0.96, kErrorToleranceHi); + ASSERT_NEAR_FRAC(wlim_series.ncells(), 8760, 0.); + ASSERT_NEAR_FRAC(wlim_series.at(0, 0), 960., kErrorToleranceHi); +} + +NAMESPACE_TEST(csp_common, TowerSharedWithUi, CapitalCosts) { + double error_tolerance = 0.01; + var_table* vd = new var_table; + vd->assign("d_rec", 17.65); + vd->assign("rec_height", 21.60); + vd->assign("receiver_type", 0); + vd->assign("rec_d_spec", 15.); + vd->assign("csp_pt_rec_cav_ap_height", 18.); + vd->assign("p_ref", 115.); + vd->assign("design_eff", 0.412); + vd->assign("tshours", 10.); + vd->assign("demand_var", 0); + vd->assign("a_sf_ui", 1269055.); + vd->assign("site_spec_cost", 16.); + vd->assign("heliostat_spec_cost", 140.); + vd->assign("cost_sf_fixed", 0.); + vd->assign("h_tower", 193.458); + vd->assign("rec_height", 21.6029); + vd->assign("helio_height", 12.2); + vd->assign("tower_fixed_cost", 3000000.); + vd->assign("tower_exp", 0.0113); + vd->assign("csp_pt_cost_receiver_area", 1269055.); + vd->assign("rec_ref_cost", 103000000.); + vd->assign("rec_ref_area", 1571.); + vd->assign("rec_cost_exp", 0.7); + vd->assign("csp_pt_cost_storage_mwht", 2791.26); + vd->assign("tes_spec_cost", 22.); + vd->assign("csp_pt_cost_power_block_mwe", 115.); + vd->assign("plant_spec_cost", 1040.); + vd->assign("bop_spec_cost", 290.); + vd->assign("fossil_spec_cost", 0.); + vd->assign("contingency_rate", 7.); + vd->assign("csp_pt_sf_total_land_area", 1892.); + vd->assign("nameplate", 104.); + vd->assign("csp_pt_cost_epc_per_acre", 0.); + vd->assign("csp_pt_cost_epc_percent", 13.); + vd->assign("csp_pt_cost_epc_per_watt", 0.); + vd->assign("csp_pt_cost_epc_fixed", 0.); + vd->assign("land_spec_cost", 10000.); + vd->assign("csp_pt_cost_plm_percent", 0.); + vd->assign("csp_pt_cost_plm_per_watt", 0.); + vd->assign("csp_pt_cost_plm_fixed", 0.); + vd->assign("sales_tax_frac", 80.); + vd->assign("sales_tax_rate", 5.); + + Tower_SolarPilot_Capital_Costs_MSPT_Equations(vd); + + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_receiver_area"), 1197.86, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_storage_mwht"), 2791.26, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_power_block_mwe"), 115., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_site_improvements"), 20304872., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_heliostats"), 177667632., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_tower"), 25319156., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_receiver"), 85191944., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_storage"), 61407768., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_power_block"), 119600000., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_bop"), 33350000., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_fossil"), 0., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "ui_direct_subtotal"), 522841376., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_contingency"), 36598896., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "total_direct_cost"), 559440256., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_epc_total"), 72727232., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_plm_total"), 18920378., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_sales_tax_total"), 22377610., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "total_indirect_cost"), 114025224., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "total_installed_cost"), 673465472., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_installed_per_capacity"), 6506.91, kErrorToleranceHi); +} + +NAMESPACE_TEST(csp_common, TowerSharedWithUi, CapitalCostsWithPeriods) { + double error_tolerance = 0.01; + var_table* vd = new var_table; + vd->assign("d_rec", 17.65); + vd->assign("rec_height", 21.60); + vd->assign("receiver_type", 0); + vd->assign("rec_d_spec", 15.); + vd->assign("csp.pt.rec.cav_ap_height", 18.); + vd->assign("p_ref", 115.); + vd->assign("design_eff", 0.412); + vd->assign("tshours", 10.); + vd->assign("demand_var", 0); + vd->assign("a_sf_ui", 1269055.); + vd->assign("site_spec_cost", 16.); + vd->assign("heliostat_spec_cost", 140.); + vd->assign("cost_sf_fixed", 0.); + vd->assign("h_tower", 193.458); + vd->assign("rec_height", 21.6029); + vd->assign("helio_height", 12.2); + vd->assign("tower_fixed_cost", 3000000.); + vd->assign("tower_exp", 0.0113); + vd->assign("csp.pt.cost.receiver.area", 1269055.); + vd->assign("rec_ref_cost", 103000000.); + vd->assign("rec_ref_area", 1571.); + vd->assign("rec_cost_exp", 0.7); + vd->assign("csp.pt.cost.storage_mwht", 2791.26); + vd->assign("tes_spec_cost", 22.); + vd->assign("csp.pt.cost.power_block_mwe", 115.); + vd->assign("plant_spec_cost", 1040.); + vd->assign("bop_spec_cost", 290.); + vd->assign("fossil_spec_cost", 0.); + vd->assign("contingency_rate", 7.); + vd->assign("csp.pt.sf.total_land_area", 1892.); + vd->assign("nameplate", 104.); + vd->assign("csp.pt.cost.epc.per_acre", 0.); + vd->assign("csp.pt.cost.epc.percent", 13.); + vd->assign("csp.pt.cost.epc.per_watt", 0.); + vd->assign("csp.pt.cost.epc.fixed", 0.); + vd->assign("land_spec_cost", 10000.); + vd->assign("csp.pt.cost.plm.percent", 0.); + vd->assign("csp.pt.cost.plm.per_watt", 0.); + vd->assign("csp.pt.cost.plm.fixed", 0.); + vd->assign("sales_tax_frac", 80.); + vd->assign("sales_tax_rate", 5.); + + Tower_SolarPilot_Capital_Costs_MSPT_Equations(vd); + + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_receiver_area"), 1197.86, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_storage_mwht"), 2791.26, kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_power_block_mwe"), 115., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_site_improvements"), 20304872., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_heliostats"), 177667632., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_tower"), 25319156., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_receiver"), 85191944., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_storage"), 61407768., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_power_block"), 119600000., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_bop"), 33350000., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_fossil"), 0., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "ui_direct_subtotal"), 522841376., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_contingency"), 36598896., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "total_direct_cost"), 559440256., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_epc_total"), 72727232., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_plm_total"), 18920378., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_sales_tax_total"), 22377610., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "total_indirect_cost"), 114025224., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "total_installed_cost"), 673465472., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "csp_pt_cost_installed_per_capacity"), 6506.91, kErrorToleranceHi); +} + +//======Financial Equations======================================================================= +NAMESPACE_TEST(csp_common, TowerSharedWithUi, FinancialCase1) { + double error_tolerance = 0.01; + var_table* vd = new var_table; + vd->assign("total_installed_cost", 673465536.); + + vd->assign("const_per_percent1", 100.); + vd->assign("const_per_upfront_rate1", 1.); + vd->assign("const_per_months1", 24.); + vd->assign("const_per_interest_rate1", 4.); + + vd->assign("const_per_percent2", 0.); + vd->assign("const_per_upfront_rate2", 0.); + vd->assign("const_per_months2", 0.); + vd->assign("const_per_interest_rate2", 0.); + + vd->assign("const_per_percent3", 0.); + vd->assign("const_per_upfront_rate3", 0.); + vd->assign("const_per_months3", 0.); + vd->assign("const_per_interest_rate3", 0.); + + vd->assign("const_per_percent4", 0.); + vd->assign("const_per_upfront_rate4", 0.); + vd->assign("const_per_months4", 0.); + vd->assign("const_per_interest_rate4", 0.); + + vd->assign("const_per_percent5", 0.); + vd->assign("const_per_upfront_rate5", 0.); + vd->assign("const_per_months5", 0.); + vd->assign("const_per_interest_rate5", 0.); + + Financial_Construction_Financing_Equations(vd); + + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_principal1"), 673465472., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_interest1"), 26938618., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_total1"), 33673272., kErrorToleranceHi); + + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_principal2"), 0., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_interest2"), 0., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_total2"), 0., kErrorToleranceHi); + + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_principal3"), 0., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_interest3"), 0., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_total3"), 0., kErrorToleranceHi); + + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_principal4"), 0., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_interest4"), 0., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_total4"), 0., kErrorToleranceHi); + + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_principal5"), 0., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_interest5"), 0., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_total5"), 0., kErrorToleranceHi); + + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_percent_total"), 100., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_principal_total"), 673465472., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "const_per_interest_total"), 26938618., kErrorToleranceHi); + ASSERT_NEAR_FRAC(GetNum(vd, "construction_financing_cost"), 33673272., kErrorToleranceHi); +} + +NAMESPACE_TEST(csp_common, TowerSharedWithUi, FinancialCase2) { + double error_tolerance = 0.01; + var_table* vd = new var_table; + vd->assign("system_capacity", 103500.); + + Financial_Capacity_Payments_Equations(vd); + + //double cp_system_nameplate = vd->lookup("cp_system_nameplate")->num; + ASSERT_NEAR_FRAC(GetNum(vd, "cp_system_nameplate"), 103.5, kErrorToleranceHi); +} + +//======/Testing Molten Salt Power Tower UI Equations============================================= + + +//TEST(Mspt_cmod_csp_tower_eqns, NoData) { +// ASSERT_THROW(MSPT_System_Design_Equations(nullptr), std::runtime_error); +// ASSERT_THROW(Tower_SolarPilot_Solar_Field_Equations(nullptr), std::runtime_error); +// //ASSERT_THROW(MSPT_Receiver_Equations(nullptr), std::runtime_error); +// //ASSERT_THROW(MSPT_System_Control_Equations(nullptr), std::runtime_error); +// //ASSERT_THROW(Tower_SolarPilot_Capital_Costs_MSPT_Equations(nullptr), std::runtime_error); +// //ASSERT_THROW(Tower_SolarPilot_Capital_Costs_DSPT_Equations(nullptr), std::runtime_error); +// //ASSERT_THROW(Tower_SolarPilot_Capital_Costs_ISCC_Equations(nullptr), std::runtime_error); +//} + +//TEST(Mspt_cmod_csp_tower_eqns, MissingVariables) { +// var_table* vd = new var_table; +// ASSERT_THROW(MSPT_System_Design_Equations(vd), std::runtime_error); +// ASSERT_THROW(Tower_SolarPilot_Solar_Field_Equations(vd), std::runtime_error); +// //ASSERT_THROW(MSPT_Receiver_Equations(vd), std::runtime_error); +// //ASSERT_THROW(MSPT_System_Control_Equations(vd), std::runtime_error); +// //ASSERT_THROW(Tower_SolarPilot_Capital_Costs_MSPT_Equations(vd), std::runtime_error); +// //ASSERT_THROW(Tower_SolarPilot_Capital_Costs_DSPT_Equations(vd), std::runtime_error); +// //ASSERT_THROW(Tower_SolarPilot_Capital_Costs_ISCC_Equations(vd), std::runtime_error); +//} diff --git a/third_party/ssc/test/shared_test/lib_csp_trough_test.cpp b/third_party/ssc/test/shared_test/lib_csp_trough_test.cpp new file mode 100644 index 00000000000..eb3f6598d57 --- /dev/null +++ b/third_party/ssc/test/shared_test/lib_csp_trough_test.cpp @@ -0,0 +1,726 @@ +#include + +#define private public // for setting private data members +#include "lib_csp_trough_test.h" +#include "vs_google_test_explorer_namespace.h" + +using namespace csp_trough; + +//========Tests=================================================================================== +//=== Using factory patterns to create the different physical and non-physical components========= + +// Test a standard trough loop at a single point in time +NAMESPACE_TEST(csp_trough, TroughLoop, DefaultTest) +{ + DefaultTroughFactory default_trough_factory = DefaultTroughFactory(); + Location location = default_trough_factory.MakeLocation(); + std::unique_ptr trough = default_trough_factory.MakeTrough(location); + std::unique_ptr trough_state = default_trough_factory.MakeTroughState(); + TroughFactory::SetTroughState(trough.get(), trough_state.get()); + + std::unique_ptr time_and_weather = default_trough_factory.MakeTimeLocationWeather(location); + FluidInletState fluid_inlet_state = default_trough_factory.MakeInletState(); + double defocus = default_trough_factory.MakeDefocus(); + TroughOutputs trough_outputs; + TimestepAndTou timestep_and_tou = default_trough_factory.MakeTimestepAndTou(); + + trough->on(*time_and_weather, fluid_inlet_state, defocus, trough_outputs, timestep_and_tou); + + EXPECT_NEAR(trough_outputs.m_T_salt_hot, 391.17, 391.17 * kErrorToleranceLo); + EXPECT_NEAR(trough_outputs.m_m_dot_salt_tot, 6568369, 6568369 * kErrorToleranceLo); +} + +// Test a standard trough loop from a homogenous initial condition to steady-state +NAMESPACE_TEST(csp_trough, TroughLoop, SteadyStateTest) +{ + DefaultTroughFactory default_trough_factory = DefaultTroughFactory(); + Location location = default_trough_factory.MakeLocation(); + std::unique_ptr trough = default_trough_factory.MakeTrough(location); + std::unique_ptr trough_state = default_trough_factory.MakeTroughState(); + TroughFactory::SetTroughState(trough.get(), trough_state.get()); + + std::unique_ptr time_and_weather = default_trough_factory.MakeTimeLocationWeather(location); + FluidInletState fluid_inlet_state = default_trough_factory.MakeInletState(); + double defocus = default_trough_factory.MakeDefocus(); + TroughOutputs trough_outputs; + TimestepAndTou timestep_and_tou = default_trough_factory.MakeTimestepAndTou(); + + trough->m_accept_mode = 1; // flag so solar zenith from weather is used instead of calc'd + trough->m_accept_init = false; // running at steady-state but keeping false to avoid side effects + trough->m_accept_loc = 1; // don't just model a single loop + trough->m_is_using_input_gen = false; // use parameter values set below instead + + // Design DNI and normal incidence angle + time_and_weather->m_beam = trough->m_I_bn_des; + time_and_weather->m_solazi = trough->m_ColAz; + time_and_weather->m_solzen = trough->m_ColTilt; + + // 5-minute timesteps + timestep_and_tou.ms_ts.m_step = 5. * 60.; + timestep_and_tou.ms_ts.m_time = timestep_and_tou.ms_ts.m_time_start + timestep_and_tou.ms_ts.m_step; + + // Initially set all fluid to design temperature + fluid_inlet_state.m_temp = trough->m_T_loop_in_des - 273.15; + trough->m_T_sys_c_t_end_converged = trough->m_T_loop_in_des; + trough->m_T_sys_h_t_end_converged = trough->m_T_loop_in_des; + trough->m_T_htf_out_t_end_converged.assign(trough->m_nSCA, trough->m_T_loop_in_des); + + // Values for checking whether steady-state + double ss_diff = std::numeric_limits::quiet_NaN(); + const double tol = 0.05; + std::vector T_htf_in_t_int_prev = trough->m_T_htf_in_t_int; + std::vector T_htf_out_t_int_prev = trough->m_T_htf_out_t_int; + double minutes2SS = 0.; + + do + { + trough->on(*time_and_weather, fluid_inlet_state, defocus, trough_outputs, timestep_and_tou); + + // Calculate metric for deciding whether steady-state is reached + ss_diff = 0.; + for (int i = 0; i < trough->m_nSCA; i++) { + ss_diff += fabs(trough->m_T_htf_in_t_int[i] - T_htf_in_t_int_prev[i]) + + fabs(trough->m_T_htf_out_t_int[i] - T_htf_out_t_int_prev[i]); + } + + // Set converged values so reset_last_temps() propagates the temps in time + trough->m_T_sys_c_t_end_converged = trough->m_T_sys_c_t_end; + trough->m_T_sys_h_t_end_converged = trough->m_T_sys_h_t_end; + // SCA temperatures - these set the values of m_T_htf_out_t_end_last[i] + trough->m_T_htf_out_t_end_converged = trough->m_T_htf_out_t_end; + + // Update 'last' values + T_htf_in_t_int_prev = trough->m_T_htf_in_t_int; + T_htf_out_t_int_prev = trough->m_T_htf_out_t_int; + + minutes2SS += timestep_and_tou.ms_ts.m_step / 60.; + + } while (ss_diff / 200. > tol); + + EXPECT_NEAR(trough->m_T_sys_h_t_end, 656.1, 656.1 * kErrorToleranceLo); // final loop outlet temperature + EXPECT_NEAR(minutes2SS, 35., 35. * kErrorToleranceLo); // time to steady-state +} +//========/Tests================================================================================== + +//========Factories:============================================================================== +//========TroughFactory (super class)============================================================= +std::unique_ptr TroughFactory::MakeTrough(TroughSpecifications* trough_specifications, + Location location) const +{ + auto trough = std::unique_ptr(new Trough); + + trough->m_nSCA = trough_specifications->nSCA; + trough->m_nHCEt = trough_specifications->nHCEt; + trough->m_nColt = trough_specifications->nColt; + trough->m_nHCEVar = trough_specifications->nHCEVar; + trough->m_nLoops = trough_specifications->nLoops; + trough->m_FieldConfig = trough_specifications->FieldConfig; + trough->m_L_power_block_piping = trough_specifications->L_power_block_piping; + trough->m_include_fixed_power_block_runner = trough_specifications->include_fixed_power_block_runner; + trough->m_eta_pump = trough_specifications->eta_pump; + trough->m_Fluid = trough_specifications->Fluid; + //trough->m_fthrok = trough_specifications->fthrok; + trough->m_fthrctrl = trough_specifications->fthrctrl; + trough->m_accept_loc = trough_specifications->accept_loc; + trough->m_HDR_rough = trough_specifications->HDR_rough; + trough->m_theta_stow = trough_specifications->theta_stow; + trough->m_theta_dep = trough_specifications->theta_dep; + trough->m_Row_Distance = trough_specifications->Row_Distance; + + trough->m_T_loop_in_des = trough_specifications->T_loop_in_des; + trough->m_T_loop_out_des = trough_specifications->T_loop_out_des; + trough->m_T_startup = trough_specifications->T_startup; + trough->m_m_dot_htfmin = trough_specifications->m_dot_htfmin; + trough->m_m_dot_htfmax = trough_specifications->m_dot_htfmax; + trough->m_field_fl_props = trough_specifications->field_fl_props; + trough->m_T_fp = trough_specifications->T_fp; + trough->m_I_bn_des = trough_specifications->I_bn_des; + trough->m_V_hdr_cold_max = trough_specifications->V_hdr_cold_max; + trough->m_V_hdr_cold_min = trough_specifications->V_hdr_cold_min; + trough->m_V_hdr_hot_max = trough_specifications->V_hdr_hot_max; + trough->m_V_hdr_hot_min = trough_specifications->V_hdr_hot_min; + trough->m_V_hdr_max = trough_specifications->V_hdr_max; + trough->m_V_hdr_min = trough_specifications->V_hdr_min; + trough->m_Pipe_hl_coef = trough_specifications->Pipe_hl_coef; + trough->m_SCA_drives_elec = trough_specifications->SCA_drives_elec; + trough->m_ColTilt = trough_specifications->ColTilt; + trough->m_ColAz = trough_specifications->ColAz; + trough->m_wind_stow_speed = trough_specifications->wind_stow_speed; + trough->m_accept_mode = trough_specifications->accept_mode; + trough->m_accept_init = trough_specifications->accept_init; + trough->m_solar_mult = trough_specifications->solar_mult; + trough->m_mc_bal_hot_per_MW = trough_specifications->mc_bal_hot_per_MW; + trough->m_mc_bal_cold_per_MW = trough_specifications->mc_bal_cold_per_MW; + trough->m_mc_bal_sca = trough_specifications->mc_bal_sca; + + trough->m_W_aperture = trough_specifications->W_aperture; + trough->m_A_aperture = trough_specifications->A_aperture; + trough->m_TrackingError = trough_specifications->TrackingError; + trough->m_GeomEffects = trough_specifications->GeomEffects; + trough->m_Rho_mirror_clean = trough_specifications->Rho_mirror_clean; + trough->m_Dirt_mirror = trough_specifications->Dirt_mirror; + trough->m_Error = trough_specifications->Error; + trough->m_Ave_Focal_Length = trough_specifications->Ave_Focal_Length; + trough->m_L_SCA = trough_specifications->L_SCA; + trough->m_L_aperture = trough_specifications->L_aperture; + trough->m_ColperSCA = trough_specifications->ColperSCA; + trough->m_Distance_SCA = trough_specifications->Distance_SCA; + + trough->m_IAM_matrix = trough_specifications->IAM_matrix; + trough->m_HCE_FieldFrac = trough_specifications->HCE_FieldFrac; + trough->m_D_2 = trough_specifications->D_2; + trough->m_D_3 = trough_specifications->D_3; + trough->m_D_4 = trough_specifications->D_4; + trough->m_D_5 = trough_specifications->D_5; + trough->m_D_p = trough_specifications->D_p; + trough->m_Flow_type = trough_specifications->Flow_type; + trough->m_Rough = trough_specifications->Rough; + trough->m_alpha_env = trough_specifications->alpha_env; + + trough->m_epsilon_3_11 = trough_specifications->epsilon_3_11; + trough->m_epsilon_3_12 = trough_specifications->epsilon_3_12; + trough->m_epsilon_3_13 = trough_specifications->epsilon_3_13; + trough->m_epsilon_3_14 = trough_specifications->epsilon_3_14; + trough->m_epsilon_3_21 = trough_specifications->epsilon_3_21; + trough->m_epsilon_3_22 = trough_specifications->epsilon_3_22; + trough->m_epsilon_3_23 = trough_specifications->epsilon_3_23; + trough->m_epsilon_3_24 = trough_specifications->epsilon_3_24; + trough->m_epsilon_3_31 = trough_specifications->epsilon_3_31; + trough->m_epsilon_3_32 = trough_specifications->epsilon_3_32; + trough->m_epsilon_3_33 = trough_specifications->epsilon_3_33; + trough->m_epsilon_3_34 = trough_specifications->epsilon_3_34; + trough->m_epsilon_3_41 = trough_specifications->epsilon_3_41; + trough->m_epsilon_3_42 = trough_specifications->epsilon_3_42; + trough->m_epsilon_3_43 = trough_specifications->epsilon_3_43; + trough->m_epsilon_3_44 = trough_specifications->epsilon_3_44; + + trough->m_alpha_abs = trough_specifications->alpha_abs; + trough->m_Tau_envelope = trough_specifications->Tau_envelope; + trough->m_EPSILON_4 = trough_specifications->EPSILON_4; + trough->m_EPSILON_5 = trough_specifications->EPSILON_5; + trough->m_GlazingIntact = trough_specifications->GlazingIntact; + trough->m_P_a = trough_specifications->P_a; + trough->m_AnnulusGas = trough_specifications->AnnulusGas; + trough->m_AbsorberMaterial = trough_specifications->AbsorberMaterial; + trough->m_Shadowing = trough_specifications->Shadowing; + trough->m_Dirt_HCE = trough_specifications->Dirt_HCE; + trough->m_Design_loss = trough_specifications->Design_loss; + trough->m_SCAInfoArray = trough_specifications->SCAInfoArray; + + trough->m_calc_design_pipe_vals = trough_specifications->calc_design_pipe_vals; + trough->m_L_rnr_pb = trough_specifications->L_rnr_pb; + trough->m_N_max_hdr_diams = trough_specifications->N_max_hdr_diams; + trough->m_L_rnr_per_xpan = trough_specifications->L_rnr_per_xpan; + trough->m_L_xpan_hdr = trough_specifications->L_xpan_hdr; + trough->m_L_xpan_rnr = trough_specifications->L_xpan_rnr; + trough->m_Min_rnr_xpans = trough_specifications->Min_rnr_xpans; + trough->m_northsouth_field_sep = trough_specifications->northsouth_field_sep; + trough->m_N_hdr_per_xpan = trough_specifications->N_hdr_per_xpan; + trough->m_K_cpnt = trough_specifications->K_cpnt; + trough->m_D_cpnt = trough_specifications->D_cpnt; + trough->m_L_cpnt = trough_specifications->L_cpnt; + trough->m_Type_cpnt = trough_specifications->Type_cpnt; + trough->m_custom_sf_pipe_sizes = trough_specifications->custom_sf_pipe_sizes; + trough->m_sf_rnr_diams = trough_specifications->sf_rnr_diams; + trough->m_sf_rnr_wallthicks = trough_specifications->sf_rnr_wallthicks; + trough->m_sf_rnr_lengths = trough_specifications->sf_rnr_lengths; + trough->m_sf_hdr_diams = trough_specifications->sf_hdr_diams; + trough->m_sf_hdr_wallthicks = trough_specifications->sf_hdr_wallthicks; + trough->m_sf_hdr_lengths = trough_specifications->sf_hdr_lengths; + + TroughSolvedParams trough_solved_params; + trough->init(location, trough_solved_params); + + return trough; +} + +// Set state by assigning previous (converged) trough HTF temperatures +void TroughFactory::SetTroughState(Trough* trough, TroughState* trough_state) +{ + std::size_t N_scas_trough = trough->m_T_htf_out_t_end_converged.size(); + std::size_t N_scas_state = trough_state->T_out_SCAs_prev.size(); + if (N_scas_trough != N_scas_state) { + throw "Incorrect trough state array length."; + } + + trough->m_T_sys_c_t_end_converged = trough_state->T_in_loop_prev; // this ends up setting m_T_sys_c_t_end_last + trough->m_T_sys_h_t_end_converged = trough_state->T_out_loop_prev; // this ends up setting m_T_sys_h_t_end_last + + // SCA temperatures - these end up setting m_T_htf_out_t_end_last[i] + for (std::vector::size_type i = 0; i != trough_state->T_out_SCAs_prev.size(); i++) { + trough->m_T_htf_out_t_end_converged[i] = trough_state->T_out_SCAs_prev[i]; + } +} +//========/TroughFactory========================================================================== + +//========DefaultTroughFactory (subclass)========================================================= +std::unique_ptr DefaultTroughFactory::MakeTrough(Location location) const +{ + std::unique_ptr trough_specifications = this->MakeSpecifications(); + std::unique_ptr trough = TroughFactory::MakeTrough(trough_specifications.get(), + location); + return trough; +} + +std::unique_ptr DefaultTroughFactory::MakeSpecifications() const +{ + auto trough_specifications = std::unique_ptr(new TroughSpecifications); + trough_specifications->nSCA = 8; + trough_specifications->nHCEt = 4; + trough_specifications->nColt = 4; + trough_specifications->nHCEVar = 4; + trough_specifications->nLoops = 181; + trough_specifications->FieldConfig = 2; + trough_specifications->L_power_block_piping = 50.; + trough_specifications->include_fixed_power_block_runner = true; + trough_specifications->eta_pump = 0.85; + trough_specifications->Fluid = 21; + trough_specifications->fthrctrl = 2; + trough_specifications->accept_loc = 1; + trough_specifications->HDR_rough = 4.57e-5; + trough_specifications->theta_stow = 170.; + trough_specifications->theta_dep = 10.; + trough_specifications->Row_Distance = 15.; + + trough_specifications->T_loop_in_des = 293.; + trough_specifications->T_loop_out_des = 391.; + trough_specifications->T_startup = 0.67 * trough_specifications->T_loop_in_des + 0.33 * trough_specifications->T_loop_out_des; //[C] + trough_specifications->m_dot_htfmin = 1.; + trough_specifications->m_dot_htfmax = 12.; + double vals[] = { 0 }; + trough_specifications->field_fl_props.assign(vals, 1, 1); + trough_specifications->T_fp = 150.; + trough_specifications->I_bn_des = 950.; + trough_specifications->V_hdr_cold_max = 3.; + trough_specifications->V_hdr_cold_min = 2.; + trough_specifications->V_hdr_hot_max = 3.; + trough_specifications->V_hdr_hot_min = 2.; + trough_specifications->V_hdr_max = std::min(trough_specifications->V_hdr_cold_max, trough_specifications->V_hdr_hot_max); + trough_specifications->V_hdr_min = std::max(trough_specifications->V_hdr_cold_min, trough_specifications->V_hdr_hot_min); + trough_specifications->Pipe_hl_coef = 0.45; + trough_specifications->SCA_drives_elec = 125.; + trough_specifications->ColTilt = 0.; + trough_specifications->ColAz = 0.; + trough_specifications->wind_stow_speed = 25.; + trough_specifications->accept_mode = 0; + trough_specifications->accept_init = false; + trough_specifications->solar_mult = 2.; + trough_specifications->mc_bal_hot_per_MW = 0.2; + trough_specifications->mc_bal_cold_per_MW = 0.2; + trough_specifications->mc_bal_sca = 4.5; + + trough_specifications->W_aperture = { 6, 6, 6, 6 }; + trough_specifications->A_aperture = { 656, 656, 656, 656 }; + trough_specifications->TrackingError = { 0.988, 0.988, 0.988, 0.988 }; + trough_specifications->GeomEffects = { 0.952, 0.952, 0.952, 0.952 }; + trough_specifications->Rho_mirror_clean = { 0.93, 0.93, 0.93, 0.93 }; + trough_specifications->Dirt_mirror = { 0.97, 0.97, 0.97, 0.97 }; + trough_specifications->Error = { 1., 1., 1., 1. }; + trough_specifications->Ave_Focal_Length = { 2.15, 2.15, 2.15, 2.15 }; + trough_specifications->L_SCA = { 115., 115., 115., 115. }; + trough_specifications->L_aperture = { 14.375, 14.375, 14.375, 14.375 }; + trough_specifications->ColperSCA = { 8., 8., 8., 8. }; + trough_specifications->Distance_SCA = { 1., 1., 1., 1. }; + + double vals2[] = { + 1, 0.0327, -0.1351, + 1, 0.0327, -0.1351, + 1, 0.0327, -0.1351, + 1, 0.0327, -0.1351 }; + trough_specifications->IAM_matrix.assign(vals2, 4, 3); + + double vals3[] = { + 0.985, 0.01, 0.005, 0., + 1., 0., 0., 0., + 1., 0., 0., 0., + 1., 0., 0., 0. }; + trough_specifications->HCE_FieldFrac.assign(vals3, 4, 4); + + double vals4[] = { + 0.076, 0.076, 0.076, 0.076, + 0.076, 0.076, 0.076, 0.076, + 0.076, 0.076, 0.076, 0.076, + 0.076, 0.076, 0.076, 0.076 }; + trough_specifications->D_2.assign(vals4, 4, 4); + + double vals5[] = { + 0.08, 0.08, 0.08, 0.08, + 0.08, 0.08, 0.08, 0.08, + 0.08, 0.08, 0.08, 0.08, + 0.08, 0.08, 0.08, 0.08 }; + trough_specifications->D_3.assign(vals5, 4, 4); + + double vals6[] = { + 0.115, 0.115, 0.115, 0.115, + 0.115, 0.115, 0.115, 0.115, + 0.115, 0.115, 0.115, 0.115, + 0.115, 0.115, 0.115, 0.115 }; + trough_specifications->D_4.assign(vals6, 4, 4); + + double vals7[] = { + 0.12, 0.12, 0.12, 0.12, + 0.12, 0.12, 0.12, 0.12, + 0.12, 0.12, 0.12, 0.12, + 0.12, 0.12, 0.12, 0.12 }; + trough_specifications->D_5.assign(vals7, 4, 4); + + double vals8[] = { + 0., 0., 0., 0., + 0., 0., 0., 0., + 0., 0., 0., 0., + 0., 0., 0., 0. }; + trough_specifications->D_p.assign(vals8, 4, 4); + + double vals9[] = { + 1., 1., 1., 1., + 1., 1., 1., 1., + 1., 1., 1., 1., + 1., 1., 1., 1. }; + trough_specifications->Flow_type.assign(vals9, 4, 4); + + double vals10[] = { + 4.5e-5, 4.5e-5, 4.5e-5, 4.5e-5, + 4.5e-5, 4.5e-5, 4.5e-5, 4.5e-5, + 4.5e-5, 4.5e-5, 4.5e-5, 4.5e-5, + 4.5e-5, 4.5e-5, 4.5e-5, 4.5e-5 }; + trough_specifications->Rough.assign(vals10, 4, 4); + + double vals11[] = { + 0.02, 0.02, 0., 0., + 0.02, 0.02, 0., 0., + 0.02, 0.02, 0., 0., + 0.02, 0.02, 0., 0. }; + trough_specifications->alpha_env.assign(vals11, 4, 4); + + double vals12[] = { + 100., 150., 200., 250., 300., 350., 400., 450., 500., + 0.064, 0.0665, 0.07, 0.0745, 0.08, 0.0865, 0.094, 0.1025, 0.112 }; + trough_specifications->epsilon_3_11.assign(vals12, 2, 9); + + double vals13[] = { 0.65 }; + trough_specifications->epsilon_3_12.assign(vals13, 1, 1); + + double vals14[] = { 0.65 }; + trough_specifications->epsilon_3_13.assign(vals14, 1, 1); + + double vals15[] = { 0. }; + trough_specifications->epsilon_3_14.assign(vals15, 0, 0); + + double vals16[] = { + 100., 150., 200., 250., 300., 350., 400., 450., 500., + 0.064, 0.0665, 0.07, 0.0745, 0.08, 0.0865, 0.094, 0.1025, 0.112 }; + trough_specifications->epsilon_3_21.assign(vals16, 2, 9); + + double vals17[] = { 0.65 }; + trough_specifications->epsilon_3_22.assign(vals17, 1, 1); + + double vals18[] = { 0.65 }; + trough_specifications->epsilon_3_23.assign(vals18, 1, 1); + + double vals19[] = { 0. }; + trough_specifications->epsilon_3_24.assign(vals19, 1, 1); + + double vals20[] = { + 100., 150., 200., 250., 300., 350., 400., 450., 500., + 0.064, 0.0665, 0.07, 0.0745, 0.08, 0.0865, 0.094, 0.1025, 0.112 }; + trough_specifications->epsilon_3_31.assign(vals20, 2, 9); + + double vals21[] = { 0.65 }; + trough_specifications->epsilon_3_32.assign(vals21, 1, 1); + + double vals22[] = { 0.65 }; + trough_specifications->epsilon_3_33.assign(vals22, 1, 1); + + double vals23[] = { 0. }; + trough_specifications->epsilon_3_34.assign(vals23, 1, 1); + + double vals24[] = { + 100., 150., 200., 250., 300., 350., 400., 450., 500., + 0.064, 0.0665, 0.07, 0.0745, 0.08, 0.0865, 0.094, 0.1025, 0.112 }; + trough_specifications->epsilon_3_41.assign(vals24, 2, 9); + + double vals25[] = { 0.65 }; + trough_specifications->epsilon_3_42.assign(vals25, 1, 1); + + double vals26[] = { 0.65 }; + trough_specifications->epsilon_3_43.assign(vals26, 1, 1); + + double vals27[] = { 0. }; + trough_specifications->epsilon_3_44.assign(vals27, 1, 1); + + double vals28[] = { + 0.963, 0.963, 0.8, 0., + 0.963, 0.963, 0.8, 0., + 0.963, 0.963, 0.8, 0., + 0.963, 0.963, 0.8, 0. }; + trough_specifications->alpha_abs.assign(vals28, 4, 4); + + double vals29[] = { + 0.964, 0.964, 1., 0., + 0.964, 0.964, 1., 0., + 0.964, 0.964, 1., 0., + 0.964, 0.964, 1., 0. }; + trough_specifications->Tau_envelope.assign(vals29, 4, 4); + + double vals30[] = { + 0.86, 0.86, 1., 0., + 0.86, 0.86, 1., 0., + 0.86, 0.86, 1., 0., + 0.86, 0.86, 1., 0. }; + trough_specifications->EPSILON_4.assign(vals30, 4, 4); + + double vals31[] = { + 0.86, 0.86, 1., 0., + 0.86, 0.86, 1., 0., + 0.86, 0.86, 1., 0., + 0.86, 0.86, 1., 0. }; + trough_specifications->EPSILON_5.assign(vals31, 4, 4); + + double vals32[] = { + 1., 1., 0., 1., + 1., 1., 0., 1., + 1., 1., 0., 1., + 1., 1., 0., 1. }; + + trough_specifications->GlazingIntact_dbl.assign(vals32, 4, 4); + // convert to + int n_gl_row = (int)trough_specifications->GlazingIntact_dbl.nrows(); + int n_gl_col = (int)trough_specifications->GlazingIntact_dbl.ncols(); + trough_specifications->GlazingIntact.resize(n_gl_row, n_gl_col); + for (int i = 0; i < n_gl_row; i++) { + for (int j = 0; j < n_gl_col; j++) { + trough_specifications->GlazingIntact(i, j) = (trough_specifications->GlazingIntact_dbl(i, j) > 0); + } + } + + double vals33[] = { + 1.e-4, 750., 750., 0., + 1.e-4, 750., 750., 0., + 1.e-4, 750., 750., 0., + 1.e-4, 750., 750., 0., }; + trough_specifications->P_a.assign(vals33, 4, 4); + + double vals34[] = { + 27., 1., 1., 27., + 27., 1., 1., 27., + 27., 1., 1., 27., + 27., 1., 1., 27., }; + trough_specifications->AnnulusGas.assign(vals34, 4, 4); + + double vals35[] = { + 1., 1., 1., 1., + 1., 1., 1., 1., + 1., 1., 1., 1., + 1., 1., 1., 1., }; + trough_specifications->AbsorberMaterial.assign(vals35, 4, 4); + + double vals36[] = { + 0.935, 0.935, 0.935, 0.963, + 0.935, 0.935, 0.935, 0.963, + 0.935, 0.935, 0.935, 0.963, + 0.935, 0.935, 0.935, 0.963 }; + trough_specifications->Shadowing.assign(vals36, 4, 4); + + double vals37[] = { + 0.98, 0.98, 1., 0.98, + 0.98, 0.98, 1., 0.98, + 0.98, 0.98, 1., 0.98, + 0.98, 0.98, 1., 0.98, }; + trough_specifications->Dirt_HCE.assign(vals37, 4, 4); + + double vals38[] = { + 190., 1270., 1500., 0., + 190., 1270., 1500., 0., + 190., 1270., 1500., 0., + 190., 1270., 1500., 0. }; + trough_specifications->Design_loss.assign(vals38, 4, 4); + + double vals39[] = { + 1., 1., + 1., 1., + 1., 1., + 1., 1., + 1., 1., + 1., 1., + 1., 1., + 1., 1. }; + trough_specifications->SCAInfoArray.assign(vals39, 8, 2); + + trough_specifications->calc_design_pipe_vals = true; + trough_specifications->L_rnr_pb = 25.; + trough_specifications->N_max_hdr_diams = 10.; + trough_specifications->L_rnr_per_xpan = 70.; + trough_specifications->L_xpan_hdr = 20.; + trough_specifications->L_xpan_rnr = 20.; + trough_specifications->Min_rnr_xpans = 1.; + trough_specifications->northsouth_field_sep = 20.; + trough_specifications->N_hdr_per_xpan = 2.; + + double vals40[] = { + 0.9, 0., 0.19, 0., 0.9, -1., -1., -1., -1., -1., -1., + 0., 0.6, 0.05, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, + 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, + 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, + 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, + 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, + 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, + 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, + 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, + 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.15, 0.6, 0., + 0.9, 0., 0.19, 0., 0.9, -1., -1., -1., -1., -1., -1. }; + trough_specifications->K_cpnt.assign(vals40, 11, 11); + + double vals41[] = { + 0.085, 0.0635, 0.085, 0.0635, 0.085, -1., -1., -1., -1., -1., -1., + 0.085, 0.085, 0.085, 0.0635, 0.0635, 0.0635,0.0635, 0.0635, 0.0635, 0.0635, 0.085, + 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.085, + 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.085, + 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.085, + 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.085, + 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.085, + 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.085, + 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.085, + 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635,0.0635, 0.0635, 0.085, 0.085, 0.085, + 0.085, 0.0635, 0.085, 0.0635, 0.085, -1., -1., -1., -1., -1., -1. }; + trough_specifications->D_cpnt.assign(vals41, 11, 11); + + double vals42[] = { + 0., 0., 0., 0., 0., -1., -1., -1., -1., -1., -1., + 0., 0., 0., 1., 0., 0., 0., 1., 0., 1., 0., + 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 0., + 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 0., + 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 0., + 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 0., + 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 0., + 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 0., + 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 0., + 0., 1., 0., 1., 0., 0., 0., 1., 0., 0., 0., + 0., 0., 0., 0., 0., -1., -1., -1., -1., -1., -1. }; + trough_specifications->L_cpnt.assign(vals42, 11, 11); + + double vals43[] = { + 0., 1., 0., 1., 0., -1., -1., -1., -1., -1., -1., + 1., 0., 0., 2., 0., 1., 0., 2., 0., 2., 0., + 0., 2., 0., 2., 0., 1., 0., 2., 0., 2., 0., + 0., 2., 0., 2., 0., 1., 0., 2., 0., 2., 0., + 0., 2., 0., 2., 0., 1., 0., 2., 0., 2., 0., + 0., 2., 0., 2., 0., 1., 0., 2., 0., 2., 0., + 0., 2., 0., 2., 0., 1., 0., 2., 0., 2., 0., + 0., 2., 0., 2., 0., 1., 0., 2., 0., 2., 0., + 0., 2., 0., 2., 0., 1., 0., 2., 0., 2., 0., + 0., 2., 0., 2., 0., 1., 0., 2., 0., 0., 1., + 0., 1., 0., 1., 0., -1., -1., -1., -1., -1., -1. }; + trough_specifications->Type_cpnt.assign(vals43, 11, 11); + + trough_specifications->custom_sf_pipe_sizes = false; + + double vals44[] = { -1. }; + trough_specifications->sf_rnr_diams.assign(vals44, 1, 1); + + double vals45[] = { -1 }; + trough_specifications->sf_rnr_wallthicks.assign(vals45, 1, 1); + + double vals46[] = { -1 }; + trough_specifications->sf_rnr_lengths.assign(vals46, 1, 1); + + double vals47[] = { -1 }; + trough_specifications->sf_hdr_diams.assign(vals47, 1, 1); + + double vals48[] = { -1 }; + trough_specifications->sf_hdr_wallthicks.assign(vals48, 1, 1); + + double vals49[] = { -1 }; + trough_specifications->sf_hdr_lengths.assign(vals49, 1, 1); + + return trough_specifications; +} + +std::unique_ptr DefaultTroughFactory::MakeTroughState() const +{ + auto trough_state = std::unique_ptr(new TroughState); + trough_state->T_in_loop_prev = 574.6; + trough_state->T_out_loop_prev = 664.5; + trough_state->T_out_SCAs_prev.push_back(586.5); + trough_state->T_out_SCAs_prev.push_back(598.4); + trough_state->T_out_SCAs_prev.push_back(610.0); + trough_state->T_out_SCAs_prev.push_back(621.4); + trough_state->T_out_SCAs_prev.push_back(632.5); + trough_state->T_out_SCAs_prev.push_back(643.4); + trough_state->T_out_SCAs_prev.push_back(654.1); + trough_state->T_out_SCAs_prev.push_back(664.5); + + return trough_state; +} + +std::unique_ptr DefaultTroughFactory::MakeTimeLocationWeather(Location location) const +{ + auto time_and_weather = std::unique_ptr(new TimeAndWeather); + time_and_weather->m_year = 2009; + time_and_weather->m_month = 2; + time_and_weather->m_day = 14; + time_and_weather->m_hour = 12; + time_and_weather->m_minute = 0; + time_and_weather->m_beam = 1016.0; + time_and_weather->m_tdry = 16.0; + time_and_weather->m_tdew = -14.0; + time_and_weather->m_wspd = 1.2; + time_and_weather->m_pres = 920.0; + time_and_weather->m_solazi = 167.06; + time_and_weather->m_solzen = 45.79; + time_and_weather->m_lat = location.m_latitude; + time_and_weather->m_lon = location.m_longitude; + time_and_weather->m_tz = location.m_tz; + time_and_weather->m_shift = location.m_shift; + time_and_weather->m_elev = location.m_elev; + time_and_weather->m_global = std::numeric_limits::quiet_NaN(); + time_and_weather->m_hor_beam = std::numeric_limits::quiet_NaN(); // 433.1 + time_and_weather->m_diffuse = std::numeric_limits::quiet_NaN(); // 282 + time_and_weather->m_twet = std::numeric_limits::quiet_NaN(); + time_and_weather->m_wdir = std::numeric_limits::quiet_NaN(); // 88 + time_and_weather->m_rhum = std::numeric_limits::quiet_NaN(); + time_and_weather->m_snow = std::numeric_limits::quiet_NaN(); + time_and_weather->m_albedo = std::numeric_limits::quiet_NaN(); // 0.213 + time_and_weather->m_aod = std::numeric_limits::quiet_NaN(); + time_and_weather->m_poa = std::numeric_limits::quiet_NaN(); // 715.1 + time_and_weather->m_time_rise = std::numeric_limits::quiet_NaN(); // 7.486443134 + time_and_weather->m_time_set = std::numeric_limits::quiet_NaN(); // 17.46109472 + + return time_and_weather; +} + +TimestepAndTou DefaultTroughFactory::MakeTimestepAndTou() const +{ + TimestepAndTou timestep_and_tou; + timestep_and_tou.ms_ts.m_time_start = 3844800.; + timestep_and_tou.ms_ts.m_step = 3600.; + timestep_and_tou.ms_ts.m_time = timestep_and_tou.ms_ts.m_time_start + timestep_and_tou.ms_ts.m_step; + timestep_and_tou.m_tou = 1.; + return timestep_and_tou; +} + +FluidInletState DefaultTroughFactory::MakeInletState() const +{ + FluidInletState fluid_inlet_state; + fluid_inlet_state.m_temp = 296.5; + fluid_inlet_state.m_pres = std::numeric_limits::quiet_NaN(); + fluid_inlet_state.m_qual = -1.; + fluid_inlet_state.m_m_dot = std::numeric_limits::quiet_NaN(); + return fluid_inlet_state; +} + +double DefaultTroughFactory::MakeDefocus() const +{ + return 1.; +} + +Location DefaultTroughFactory::MakeLocation() const +{ + Location location; + location.m_latitude = 32.13000107; + location.m_longitude = -110.9400024; + location.m_tz = -7; + location.m_shift = -5.940002441; + location.m_elev = -773; + return location; +} +//========/DefaultTroughFactory=================================================================== diff --git a/third_party/ssc/test/shared_test/lib_csp_trough_test.h b/third_party/ssc/test/shared_test/lib_csp_trough_test.h new file mode 100644 index 00000000000..515e2a550d5 --- /dev/null +++ b/third_party/ssc/test/shared_test/lib_csp_trough_test.h @@ -0,0 +1,186 @@ +#ifndef __LIB_TROUGH_TEST_H__ +#define __LIB_TROUGH_TEST_H__ + +#include +#include "csp_solver_trough_collector_receiver.h" + +// Aliases (e.g., typedef) +using Trough = C_csp_trough_collector_receiver; +using Location = C_csp_collector_receiver::S_csp_cr_init_inputs; +using TroughSolvedParams = C_csp_collector_receiver::S_csp_cr_solved_params; +using TimeAndWeather = C_csp_weatherreader::S_outputs; +using FluidInletState = C_csp_solver_htf_1state; +using TimestepAndTou = C_csp_solver_sim_info; +using TroughOutputs = C_csp_collector_receiver::S_csp_cr_out_solver; + +namespace csp_trough +{ + struct TroughSpecifications; // forward declaration + struct TroughState; + + const double kErrorToleranceLo = 0.001; // 0.1% + const double kErrorToleranceHi = 0.01; // 1.0% + + class TroughFactory { + public: + TroughFactory() {}; + + virtual std::unique_ptr MakeTrough(Location location) const = 0; + std::unique_ptr MakeTrough(TroughSpecifications* trough_specifications, + Location location) const; + virtual std::unique_ptr MakeSpecifications() const = 0; + virtual std::unique_ptr MakeTroughState() const = 0; + virtual std::unique_ptr MakeTimeLocationWeather(Location location) const = 0; + virtual TimestepAndTou MakeTimestepAndTou() const = 0; + virtual FluidInletState MakeInletState() const = 0; + virtual double MakeDefocus() const = 0; + virtual Location MakeLocation() const = 0; + + static void SetTroughState(Trough* trough, TroughState* trough_state); + }; + + class DefaultTroughFactory : public TroughFactory { + public: + DefaultTroughFactory() {}; + + virtual std::unique_ptr MakeTrough(Location location) const; + virtual std::unique_ptr MakeSpecifications() const; + virtual std::unique_ptr MakeTroughState() const; + virtual std::unique_ptr MakeTimeLocationWeather(Location location) const; + virtual TimestepAndTou MakeTimestepAndTou() const; + virtual FluidInletState MakeInletState() const; + virtual double MakeDefocus() const; + virtual Location MakeLocation() const; + }; + + struct TroughSpecifications + { + int nSCA; //[-] Number of SCA's in a loop + int nHCEt; //[-] Number of HCE types + int nColt; //[-] Number of collector types + int nHCEVar; //[-] Number of HCE variants per t + int nLoops; //[-] Number of loops in the field + int FieldConfig; //[-] Number of subfield headers + double L_power_block_piping; //[m] Length of piping (full mass flow) through power block (if applicable) + bool include_fixed_power_block_runner; //[-] Should model consider piping through power block (is_model_power_block_piping)? + double eta_pump; //[-] HTF pump efficiency + int Fluid; //[-] Field HTF fluid number + //int fthrok; //[-] Flag to allow partial defocusing of the collectors + int fthrctrl; //[-] Defocusing strategy; hardcode2 for now + int accept_loc; //[-] In acceptance testing mode - temperature sensor location (1=hx,2=loop) + double HDR_rough; //[m] Header pipe roughness + double theta_stow; //[deg] stow angle + double theta_dep; //[deg] deploy angle + double Row_Distance; //[m] Spacing between rows (centerline to centerline) + + double T_loop_in_des; //[C] Design loop inlet temperature, converted to K in init + double T_loop_out_des; //[C] Target loop outlet temperature, converted to K in init + double T_startup; //[C] The required temperature (converted to K in init) of the system before the power block can be switched on + double m_dot_htfmin; //[kg/s] Minimum loop HTF flow rate + double m_dot_htfmax; //[kg/s] Maximum loop HTF flow rate + util::matrix_t field_fl_props; //[-] User-defined field HTF properties + double T_fp; //[C] Freeze protection temperature (heat trace activation temperature), convert to K in init + double I_bn_des; //[W/m^2] Solar irradiation at design + double V_hdr_cold_max; //[m/s] Maximum HTF velocity in the cold header at design + double V_hdr_cold_min; //[m/s] Minimum HTF velocity in the cold header at design + double V_hdr_hot_max; //[m/s] Maximum HTF velocity in the hot header at design + double V_hdr_hot_min; //[m/s] Minimum HTF velocity in the hot header at design + double V_hdr_max; //[m/s] Maximum HTF velocity in the header at design, for backwards compatibility, marked for removal + double V_hdr_min; //[m/s] Minimum HTF velocity in the header at design, for backwards compatibility, marked for removal + double Pipe_hl_coef; //[W/m2-K] Loss coefficient from the header, runner pipe, and non-HCE piping + double SCA_drives_elec; //[W/SCA] Tracking power, in Watts per SCA drive + double ColTilt; //[deg] Collector tilt angle (0 is horizontal, 90deg is vertical) ("tilt") + double ColAz; //[deg] Collector azimuth angle ("azimuth") + double wind_stow_speed; //[m/s] Wind speed at and above which the collectors will be stowed + int accept_mode; //[-] Acceptance testing mode? (1=yes, 0=no) + bool accept_init; //[-] In acceptance testing mode - require steady-state startup + double solar_mult; //[-] Solar Multiple + double mc_bal_hot_per_MW; //[kWht/K-MWt] The heat capacity of the balance of plant on the hot side ("mc_bal_hot") + double mc_bal_cold_per_MW; //[kWht/K-MWt] The heat capacity of the balance of plant on the cold side ("mc_bal_cold") + double mc_bal_sca; //[Wht/K-m] Non-HTF heat capacity associated with each SCA - per meter basis + + std::vector W_aperture; //[m] The collector aperture width (Total structural area.. used for shadowing) + std::vector A_aperture; //[m^2] Reflective aperture area of the collector + std::vector TrackingError; //[-] Tracking error derate + std::vector GeomEffects; //[-] Geometry effects derate + std::vector Rho_mirror_clean; //[-] Clean mirror reflectivity + std::vector Dirt_mirror; //[-] Dirt on mirror derate + std::vector Error; //[-] General optical error derate + std::vector Ave_Focal_Length; //[m] The average focal length of the collector + std::vector L_SCA; //[m] The length of the SCA + std::vector L_aperture; //[m] The length of a single mirror/HCE unit + std::vector ColperSCA; //[-] The number of individual collector sections in an SCA + std::vector Distance_SCA; //[m] Piping distance between SCA's in the field + + util::matrix_t IAM_matrix; //[-] IAM coefficients, matrix for 4 collectors + util::matrix_t HCE_FieldFrac; //[-] Fraction of the field occupied by this HCE type + util::matrix_t D_2; //[m] Inner absorber tube diameter + util::matrix_t D_3; //[m] Outer absorber tube diameter + util::matrix_t D_4; //[m] Inner glass envelope diameter + util::matrix_t D_5; //[m] Outer glass envelope diameter + util::matrix_t D_p; //[m] Diameter of the absorber flow plug (optional) + util::matrix_t Flow_type; //[-] Flow type through the absorber + util::matrix_t Rough; //[m] Roughness of the internal surface + util::matrix_t alpha_env; //[-] Envelope absorptance + + util::matrix_t epsilon_3_11; //[-] Absorber emittance for receiver type 1 variation 1 + util::matrix_t epsilon_3_12; //[-] Absorber emittance for receiver type 1 variation 2 + util::matrix_t epsilon_3_13; //[-] Absorber emittance for receiver type 1 variation 3 + util::matrix_t epsilon_3_14; //[-] Absorber emittance for receiver type 1 variation 4 + util::matrix_t epsilon_3_21; //[-] Absorber emittance for receiver type 2 variation 1 + util::matrix_t epsilon_3_22; //[-] Absorber emittance for receiver type 2 variation 2 + util::matrix_t epsilon_3_23; //[-] Absorber emittance for receiver type 2 variation 3 + util::matrix_t epsilon_3_24; //[-] Absorber emittance for receiver type 2 variation 4 + util::matrix_t epsilon_3_31; //[-] Absorber emittance for receiver type 3 variation 1 + util::matrix_t epsilon_3_32; //[-] Absorber emittance for receiver type 3 variation 2 + util::matrix_t epsilon_3_33; //[-] Absorber emittance for receiver type 3 variation 3 + util::matrix_t epsilon_3_34; //[-] Absorber emittance for receiver type 3 variation 4 + util::matrix_t epsilon_3_41; //[-] Absorber emittance for receiver type 4 variation 1 + util::matrix_t epsilon_3_42; //[-] Absorber emittance for receiver type 4 variation 2 + util::matrix_t epsilon_3_43; //[-] Absorber emittance for receiver type 4 variation 3 + util::matrix_t epsilon_3_44; //[-] Absorber emittance for receiver type 4 variation 4 + + util::matrix_t alpha_abs; //[-] Absorber absorptance + util::matrix_t Tau_envelope; //[-] Envelope transmittance + util::matrix_t EPSILON_4; //[-] Inner glass envelope emissivities + util::matrix_t EPSILON_5; //[-] Outer glass envelope emissivities + util::matrix_t GlazingIntact_dbl; //[-] Glazing intact (broken glass) flag {1=true, else=false}, as double + util::matrix_t GlazingIntact; //[-] Glazing intact (broken glass) flag {1=true, else=false} + util::matrix_t P_a; //[torr] Annulus gas pressure + util::matrix_t AnnulusGas; //[-] Annulus gas type (1=air, 26=Ar, 27=H2) + util::matrix_t AbsorberMaterial; //[-] Absorber material type + util::matrix_t Shadowing; //[-] Receiver bellows shadowing loss factor + util::matrix_t Dirt_HCE; //[-] Loss due to dirt on the receiver envelope + util::matrix_t Design_loss; //[-] Receiver heat loss at design + util::matrix_t SCAInfoArray; //[-] Receiver (,1) and collector (,2) type for each assembly in loop + + bool calc_design_pipe_vals; //[-] Should the HTF state be calculated at design conditions + double L_rnr_pb; //[m] Length of hot or cold runner pipe around the power block + double N_max_hdr_diams; //[-] Maximum number of allowed diameters in each of the hot and cold headers + double L_rnr_per_xpan; //[m] Threshold length of straight runner pipe without an expansion loop + double L_xpan_hdr; //[m] Combined length in meters of the two perpendicular segments of a header expansion loop + double L_xpan_rnr; //[m] Combined length in meters of the two perpendicular segments of a runner expansion loop + double Min_rnr_xpans; //[-] Minimum number of expansion loops per single-diameter runner section + double northsouth_field_sep; //[m] Shortest north/south distance between SCAs in different subfields + double N_hdr_per_xpan; //[-] Number of collector loops per header expansion loops. 1expansion loop between every collector loop + util::matrix_t K_cpnt; //[-] Minor loss coefficients of the components in each loop interconnect + util::matrix_t D_cpnt; //[m] Inner diameters of the components in each loop interconnect + util::matrix_t L_cpnt; //[m] Lengths of the components in each loop interconnect + util::matrix_t Type_cpnt; //[-] Type of component in each loop interconnect [0=fitting | 1=pipe | 2=flex_hose] + bool custom_sf_pipe_sizes; //[-] Should the field pipe diameters, wall thickness and lengths be imported instead of calculated + util::matrix_t sf_rnr_diams; //[m] Imported runner diameters, used if custom_sf_pipe_sizes is true + util::matrix_t sf_rnr_wallthicks; //[m] Imported runner wall thicknesses, used if custom_sf_pipe_sizes is true + util::matrix_t sf_rnr_lengths; //[m] Imported runner lengths, used if custom_sf_pipe_sizes is true + util::matrix_t sf_hdr_diams; //[m] Imported header diameters, used if custom_sf_pipe_sizes is true + util::matrix_t sf_hdr_wallthicks; //[m] Imported header wall thicknesses, used if custom_sf_pipe_sizes is true + util::matrix_t sf_hdr_lengths; //[m] Imported header lengths, used if custom_sf_pipe_sizes is true + }; + + struct TroughState + { + double T_in_loop_prev; // corresponds to m_T_sys_c_t_end_converged + double T_out_loop_prev; // corresponds to m_T_sys_h_t_end_converged + std::vector T_out_SCAs_prev; // corresponds to m_T_htf_out_t_end_converged; + }; +} +#endif diff --git a/third_party/ssc/test/shared_test/lib_irradproc_test.cpp b/third_party/ssc/test/shared_test/lib_irradproc_test.cpp index e135bb25a27..4bdd6e0f4a6 100644 --- a/third_party/ssc/test/shared_test/lib_irradproc_test.cpp +++ b/third_party/ssc/test/shared_test/lib_irradproc_test.cpp @@ -15,7 +15,7 @@ TEST_F(NightCaseIrradProc, solarposTest_lib_irradproc) { double sun[9]; vector sunrise_times; vector sunset_times; - + e = 0.0001; /* Just before sunrise test case */ solarpos(year, month, day, 4, 30, lat, lon, tz, sun); vector solution = { 0.95662, 1.79457, -0.223771, 0.363938, 5.70882, 19.5183, 0.968276, 3.88646, 0 }; @@ -141,6 +141,21 @@ TEST_F(IrradTest, sunriseAndSunsetAlaskaTest_spa_lib_irradproc) { EXPECT_NEAR((double)sun_results[5], sunset_time, e) << "sunrise time for lat " << latitude << " long " << longitude << " failed\n"; } +TEST_F(IrradTest, atmos_refractionTest_spa_lib_irradproc) { + //Test to check for atmospheric refraction correction occuring only if sun is above horizon + double latitude = 31.6430; + double longitude = 74.8723; + double time_zone = 5.5; + double elevation_angle = -.00175; //topocentric elevation angle corrected for atmospheric refraction (radians) + //double sunset_time = 17.514; + int month = 7; + int day = 19; + double sun_results[9]; + double alt = 0; + solarpos_spa(2017, month, day, 5, 39, 0, latitude, longitude, time_zone, 0, 234, 1013.25, 15, latitude, 180, sun_results); + EXPECT_NEAR((double)sun_results[2], elevation_angle, e) << "elevation angle for lat " << latitude << " long " << longitude << " failed\n"; +} + TEST_F(DayCaseIrradProc, solarposTest_lib_irradproc) { double sun[9]; @@ -200,7 +215,7 @@ TEST_F(NightCaseIrradProc, solarpos_spaTest_lib_irradproc) { double needed[13]; vector sunrise_times; vector sunset_times; - + e = 0.0001; /* Just before sunrise test case */ solarpos_spa(year, month, day, 4, 30, 0, lat, lon, tz, 0, 0, 1016, 15, lat, 180, sun); vector solution = { 0.95668, 1.80432, -0.233522, 0.363905, 5.636927, 19.584888, 0.968276, 3.88691, 0 }; @@ -239,7 +254,7 @@ TEST_F(SunriseCaseIrradProc, solarpos_spaTest_lib_irradproc) { double needed[13]; vector sunrise_times; vector sunset_times; - + e = 0.0001; solarpos_spa(year, month, day, 5, 30, 0, lat, lon, tz, 0, 234, 1016, 15, lat, 180, sun); vector solution = { 1.11053, 1.61284, -0.0420474, 0.363777, 5.636927, 19.584888, 0.968281, 4.88686, 0 }; sunrise_times.push_back(solution[4]); @@ -286,7 +301,7 @@ TEST_F(SunsetCaseIrradProc, solarpos_spaTest_lib_irradproc) { double needed[13]; vector sunrise_times; vector sunset_times; - + e = 0.0001; solarpos_spa(year, month, day, 19, 30, 0, lat, lon, tz, 0, 234, 1016, 15, lat, 180, sun); vector solution = { 5.13951, 1.56025, 0.010544, 0.361913, 5.636927, 19.584888, 0.968356, 18.88622, 13.98903 }; sunrise_times.push_back(solution[4]); @@ -794,3 +809,5 @@ TEST(SingleAxisTrackingTest, SunBelowTiltedArray) { double bt = backtrack(tt, 0.4); ASSERT_NEAR(bt, 16.15566, 1e-4); } + + diff --git a/third_party/ssc/test/shared_test/lib_solar_thermal_test.cpp b/third_party/ssc/test/shared_test/lib_solar_thermal_test.cpp new file mode 100644 index 00000000000..72bb3140e8a --- /dev/null +++ b/third_party/ssc/test/shared_test/lib_solar_thermal_test.cpp @@ -0,0 +1,175 @@ +#include + +#include "lib_solar_thermal_test.h" +#include "vs_google_test_explorer_namespace.h" + +using namespace solar_thermal; + +//========Tests=================================================================================== +//=== Using factory patterns to create the different physical and non-physical components========= + +// Basic test of expected power gain and outlet temperature of a single flat plate collector +NAMESPACE_TEST(solar_thermal, FlatPlateCollectorTest, TestFlatPlateCollectorNominalOperation) +{ + DefaultFpcFactory default_fpc_factory = DefaultFpcFactory(); + std::unique_ptr flat_plate_collector = default_fpc_factory.MakeCollector(); + std::unique_ptr time_and_position = default_fpc_factory.MakeTimeAndPosition(); + std::unique_ptr external_conditions = default_fpc_factory.MakeExternalConditions(); + + double useful_power_gain = flat_plate_collector->UsefulPowerGain(*time_and_position, *external_conditions); // [W] + double T_out = flat_plate_collector->T_out(*time_and_position, *external_conditions); // [C] + + EXPECT_NEAR(useful_power_gain, 1.659e3, 1.659e3 * kErrorToleranceHi); + EXPECT_NEAR(T_out, 50.26, 50.26 * kErrorToleranceHi); +} + +// Basic test of expected power gain and outlet temperature of a flat plate collector array +// Uses a factory (abstract factory pattern) to create the different physical and non-physical components +NAMESPACE_TEST(solar_thermal, FlatPlateArrayTest, TestFlatPlateArrayOfOneNominalOperation) +{ + DefaultFpcFactory default_fpc_factory = DefaultFpcFactory(); + std::unique_ptr flat_plate_array = default_fpc_factory.MakeFpcArray(); + tm timestamp = default_fpc_factory.MakeTime(); + std::unique_ptr external_conditions = default_fpc_factory.MakeExternalConditions(); + external_conditions->inlet_fluid_flow.temp = 44.86; + + double useful_power_gain = flat_plate_array->UsefulPowerGain(timestamp, *external_conditions); // [W] + double T_out = flat_plate_array->T_out(timestamp, *external_conditions); // [C] + + EXPECT_NEAR(useful_power_gain, 1.587e3, 1.587e3 * kErrorToleranceHi); + EXPECT_NEAR(T_out, 49.03, 49.03 * kErrorToleranceHi); +} +//========/Tests================================================================================== + +//========Factories:============================================================================== +//========FpcFactory (super class)================================================================ +std::unique_ptr FpcFactory::MakeFpcArray(FlatPlateCollector* flat_plate_collector, + CollectorLocation* collector_location, + CollectorOrientation* collector_orientation, + ArrayDimensions* array_dimensions, + Pipe* inlet_pipe, + Pipe* outlet_pipe) const +{ + return std::unique_ptr(new FlatPlateArray(*flat_plate_collector, *collector_location, + *collector_orientation, *array_dimensions, *inlet_pipe, *outlet_pipe)); +} + +std::unique_ptr FpcFactory::MakeCollector(CollectorTestSpecifications* collector_test_specifications) const +{ + return std::unique_ptr(new FlatPlateCollector(*collector_test_specifications)); +} + +std::unique_ptr FpcFactory::MakeTimeAndPosition() const +{ + auto time_and_position = std::unique_ptr(new TimeAndPosition); + time_and_position->timestamp = this->MakeTime(); + time_and_position->collector_location = this->MakeLocation(); + time_and_position->collector_orientation = this->MakeOrientation(); + + return time_and_position; +} +//========/FpcFactory============================================================================ + +//========DefaultFPCFactory (subclass)=========================================================== +std::unique_ptr DefaultFpcFactory::MakeFpcArray() const +{ + std::unique_ptr flat_plate_collector = this->MakeCollector(); + CollectorLocation collector_location = this->MakeLocation(); + CollectorOrientation collector_orientation = this->MakeOrientation(); + ArrayDimensions array_dimensions = this->MakeArrayDimensions(); + + std::unique_ptr inlet_pipe = this->MakePipe(); + std::unique_ptr outlet_pipe = this->MakePipe(); + + return std::unique_ptr(new FlatPlateArray(*flat_plate_collector, collector_location, + collector_orientation, array_dimensions, *inlet_pipe, *outlet_pipe)); +} + +std::unique_ptr DefaultFpcFactory::MakeCollector() const +{ + std::unique_ptr collector_test_specifications = this->MakeTestSpecifications(); + return std::unique_ptr(new FlatPlateCollector(*collector_test_specifications)); +} + +std::unique_ptr DefaultFpcFactory::MakeTestSpecifications() const +{ + auto collector_test_specifications = std::unique_ptr(new CollectorTestSpecifications()); + collector_test_specifications->FRta = 0.689; + collector_test_specifications->FRUL = 3.85; + collector_test_specifications->iam = 0.2; + collector_test_specifications->area_coll = 2.98; + collector_test_specifications->m_dot = 0.045528; // kg/s + collector_test_specifications->heat_capacity = 4.182; // kJ/kg-K + + return collector_test_specifications; +} + +CollectorLocation DefaultFpcFactory::MakeLocation() const +{ + CollectorLocation collector_location; + collector_location.latitude = 33.45000; + collector_location.longitude = -111.98000; + collector_location.timezone = -7; + + return collector_location; +} + +CollectorOrientation DefaultFpcFactory::MakeOrientation() const +{ + CollectorOrientation collector_orientation; + collector_orientation.tilt = 30.; + collector_orientation.azimuth = 180.; + + return collector_orientation; +} + +std::unique_ptr DefaultFpcFactory::MakePipe() const +{ + double inner_diameter = 0.019; + double insulation_conductivity = 0.03; + double insulation_thickness = 0.006; + double length = 5; + + return std::unique_ptr(new Pipe(inner_diameter, insulation_conductivity, insulation_thickness, length)); +} + +std::unique_ptr DefaultFpcFactory::MakeExternalConditions() const +{ + auto external_conditions = std::unique_ptr(new ExternalConditions); + external_conditions->weather.ambient_temp = 25.; + external_conditions->weather.dni = 935.; + external_conditions->weather.dhi = 84.; + external_conditions->weather.ghi = std::numeric_limits::quiet_NaN(); + external_conditions->weather.wind_speed = std::numeric_limits::quiet_NaN(); + external_conditions->weather.wind_direction = std::numeric_limits::quiet_NaN(); + external_conditions->inlet_fluid_flow.m_dot = 0.091056; // kg/s + external_conditions->inlet_fluid_flow.specific_heat = 4.182; // kJ/kg-K + external_conditions->inlet_fluid_flow.temp = 45.9; // from previous timestep + external_conditions->albedo = 0.2; + + return external_conditions; +} + +tm DefaultFpcFactory::MakeTime() const +{ + tm time; + // TODO - The timestamp should be generated from a string so all attributes are valid + time.tm_year = 2012 - 1900; // years since 1900 + time.tm_mon = 1 - 1; // months since Jan. (Jan. = 0) + time.tm_mday = 1; + time.tm_hour = 12; + time.tm_min = 30; + time.tm_sec = 0; + + return time; +} + +ArrayDimensions DefaultFpcFactory::MakeArrayDimensions() const +{ + ArrayDimensions array_dimensions; + array_dimensions.num_in_parallel = 1; + array_dimensions.num_in_series = 1; + + return array_dimensions; +} +//========/DefaultFpcFactory====================================================================== diff --git a/third_party/ssc/test/shared_test/lib_solar_thermal_test.h b/third_party/ssc/test/shared_test/lib_solar_thermal_test.h new file mode 100644 index 00000000000..aa15759719b --- /dev/null +++ b/third_party/ssc/test/shared_test/lib_solar_thermal_test.h @@ -0,0 +1,53 @@ +#ifndef __LIB_CSP_TEST_H__ +#define __LIB_CSP_TEST_H__ + +#include +#include "../tcs/flat_plate_solar_collector.h" + +namespace solar_thermal +{ + const double kErrorToleranceLo = 0.001; // 0.1% + const double kErrorToleranceHi = 0.01; // 1.0% + + class FpcFactory { + public: + FpcFactory() {}; + + virtual std::unique_ptr MakeFpcArray() const = 0; + std::unique_ptr MakeFpcArray(FlatPlateCollector* flat_plate_collector, + CollectorLocation* collector_location, + CollectorOrientation* collector_orientation, + ArrayDimensions* array_dimensions, + Pipe* inlet_pipe, + Pipe* outlet_pipe) const; + virtual std::unique_ptr MakeCollector() const = 0; + std::unique_ptr MakeCollector(CollectorTestSpecifications* collector_test_specifications) const; + std::unique_ptr MakeTimeAndPosition() const; + + virtual std::unique_ptr MakeTestSpecifications() const = 0; + virtual CollectorLocation MakeLocation() const = 0; + virtual CollectorOrientation MakeOrientation() const = 0; + virtual std::unique_ptr MakePipe() const = 0; + virtual std::unique_ptr MakeExternalConditions() const = 0; + virtual tm MakeTime() const = 0; + virtual ArrayDimensions MakeArrayDimensions() const = 0; + }; + + class DefaultFpcFactory : public FpcFactory { + public: + DefaultFpcFactory() {}; + + virtual std::unique_ptr MakeFpcArray() const; + virtual std::unique_ptr MakeCollector() const; + + virtual std::unique_ptr MakeTestSpecifications() const; + virtual CollectorLocation MakeLocation() const; + virtual CollectorOrientation MakeOrientation() const; + virtual std::unique_ptr MakePipe() const; + virtual std::unique_ptr MakeExternalConditions() const; + virtual tm MakeTime() const; + virtual ArrayDimensions MakeArrayDimensions() const; + }; +} + +#endif diff --git a/third_party/ssc/test/shared_test/lib_utility_rate_test.cpp b/third_party/ssc/test/shared_test/lib_utility_rate_test.cpp index e84e5d74197..66761a3abf7 100644 --- a/third_party/ssc/test/shared_test/lib_utility_rate_test.cpp +++ b/third_party/ssc/test/shared_test/lib_utility_rate_test.cpp @@ -24,8 +24,8 @@ TEST(lib_utility_rate_test, test_copy) int steps_per_hour = 1; std::vector monthly_load_forecast = { 25, 25, 25, 25, 25, 25 }; std::vector monthly_gen_forecast = { 0, 0, 0, 0, 0, 0, }; - std::vector monthly_peak_forecast = { 25, 25, 25, 25, 25, 25 }; - UtilityRateForecast rate_forecast_1(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + std::vector monthly_avg_gross_load = { 25, 25, 25, 25, 25, 25 }; + UtilityRateForecast rate_forecast_1(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); UtilityRateForecast rate_forecast_2(rate_forecast_1); @@ -72,10 +72,10 @@ TEST(lib_utility_rate_test, test_tiered_tou_cost_estimates) monthly_load_forecast.push_back(25); // Rates above are kWh/day, but don't want to test that just yet std::vector monthly_gen_forecast; monthly_gen_forecast.push_back(0); - std::vector monthly_peak_forecast; - monthly_peak_forecast.push_back(7); + std::vector monthly_avg_gross_load; + monthly_avg_gross_load.push_back(7); - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); rate_forecast.compute_next_composite_tou(0, 0); @@ -117,10 +117,10 @@ TEST(lib_utility_rate_test, test_tiered_sell_rates) monthly_load_forecast.push_back(0); // Rates above are kWh/day, but don't want to test that just yet std::vector monthly_gen_forecast; monthly_gen_forecast.push_back(10); - std::vector monthly_peak_forecast; - monthly_peak_forecast.push_back(7); + std::vector monthly_avg_gross_load; + monthly_avg_gross_load.push_back(7); - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); rate_forecast.compute_next_composite_tou(0, 0); @@ -143,9 +143,9 @@ TEST(lib_utility_rate_test, test_simple_demand_charges) int steps_per_hour = 1; std::vector monthly_load_forecast = { 31 * 24, 28 * 24 }; // Average load is 1 kW std::vector monthly_gen_forecast = { 0, 0 }; - std::vector monthly_peak_forecast = { 1, 1 }; + std::vector monthly_avg_gross_load = { 1, 1 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { -1, -1, 0, -2 }; // Demand charge increases by 1 kW from average @@ -171,9 +171,9 @@ TEST(lib_utility_rate_test, test_demand_charges_crossing_months) int steps_per_hour = 1; std::vector monthly_load_forecast = { 150, 75 }; std::vector monthly_gen_forecast = { 0, 0 }; - std::vector monthly_peak_forecast = { 100, 50 }; + std::vector monthly_avg_gross_load = { 100, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = {-100, -50, -50, -25}; @@ -183,8 +183,33 @@ TEST(lib_utility_rate_test, test_demand_charges_crossing_months) int hour_of_year = 742; // 10 pm on Jan 31st double cost = rate_forecast.forecastCost(forecast, 0, hour_of_year, 0); - // Total cost for the months would be $1511.25, but this subtracts off the peaks predicted by average load ($3.12) - ASSERT_NEAR(1508.11, cost, 0.02); + // Total cost for the months would be $1511.25, but this subtracts off the peaks predicted by average gross load ($1500) + ASSERT_NEAR(11.25, cost, 0.02); +} + +// Test imperfect peak forecast +TEST(lib_utility_rate_test, test_demand_charges_inaccurate_forecast) +{ + rate_data data; + set_up_default_commercial_rate_data(data); // Net billing + + int steps_per_hour = 1; + std::vector monthly_load_forecast = { 150, 75 }; + std::vector monthly_gen_forecast = { 0, 0 }; + std::vector monthly_avg_gross_load = { 50, 0 }; + + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); + + // - is load + std::vector forecast = { -100, -50, -50, -25 }; + rate_forecast.initializeMonth(0, 0); + rate_forecast.copyTOUForecast(); + + int hour_of_year = 742; // 10 pm on Jan 31st + double cost = rate_forecast.forecastCost(forecast, 0, hour_of_year, 0); + + // Total cost for the months would be $1511.25, but this subtracts off the peaks predicted ($500) + ASSERT_NEAR(1011.25, cost, 0.02); } // Excel implementation of these results is available at https://github.com/NREL/SAM-documentation/blob/master/Unit%20Testing/Utility%20Rates/UtilityRateForecast/lib_utility_rate_test_cross_checks.xlsx @@ -196,9 +221,9 @@ TEST(lib_utility_rate_test, test_changing_rates_crossing_months) int steps_per_hour = 1; std::vector monthly_load_forecast = { 0, 0, 0, 150, 75 }; std::vector monthly_gen_forecast = { 0, 0, 0, 0, 0 }; - std::vector monthly_peak_forecast = { 0, 0, 0, 100, 50 }; + std::vector monthly_avg_gross_load = { 0, 0, 0, 100, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { -100, -50, -50, -25 }; @@ -208,8 +233,8 @@ TEST(lib_utility_rate_test, test_changing_rates_crossing_months) int hour_of_year = 2878; // 10 pm on Apr 30th double cost = rate_forecast.forecastCost(forecast, 0, hour_of_year, 0); - // Total cost for the months would be $1513.13, but this subtracts off the peaks predicted by average load ($3.09) - ASSERT_NEAR(1510.03, cost, 0.02); + // Total cost for the months would be $1513.13, but this subtracts off the peaks predicted by average gross load forecast ($1500) + ASSERT_NEAR(13.125, cost, 0.02); } TEST(lib_utility_rate_test, test_demand_charges_crossing_year) @@ -220,9 +245,9 @@ TEST(lib_utility_rate_test, test_demand_charges_crossing_year) int steps_per_hour = 1; std::vector monthly_load_forecast = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 75 }; std::vector monthly_gen_forecast = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - std::vector monthly_peak_forecast = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 50 }; + std::vector monthly_avg_gross_load = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { -100, -50, -50, -25 }; @@ -232,7 +257,7 @@ TEST(lib_utility_rate_test, test_demand_charges_crossing_year) int hour_of_year = 8758; // 10 pm on Dec 31st double cost = rate_forecast.forecastCost(forecast, 0, hour_of_year, 0); - ASSERT_NEAR(1520.79, cost, 0.02); + ASSERT_NEAR(11.34, cost, 0.02); } // Net billing with a sell rate @@ -277,9 +302,9 @@ TEST(lib_utility_rate_test, test_sell_rates) int steps_per_hour = 1; std::vector monthly_load_forecast = { 150, 75 }; std::vector monthly_gen_forecast = { 0, 100 }; - std::vector monthly_peak_forecast = { 100, 50 }; + std::vector monthly_avg_gross_load = { 100, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { -100, -50, -50, -25, 25, 50, 25 }; @@ -290,7 +315,7 @@ TEST(lib_utility_rate_test, test_sell_rates) double cost = rate_forecast.forecastCost(forecast, 0, hour_of_year, 0); - ASSERT_NEAR(1506.11, cost, 0.02); + ASSERT_NEAR(9.25, cost, 0.02); } TEST(lib_utility_rate_test, test_net_metering_one_tou_period) @@ -301,9 +326,9 @@ TEST(lib_utility_rate_test, test_net_metering_one_tou_period) int steps_per_hour = 1; std::vector monthly_load_forecast = { 150, 75 }; std::vector monthly_gen_forecast = { 0, 0 }; - std::vector monthly_peak_forecast = { 100, 50 }; + std::vector monthly_avg_gross_load = { 100, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { -100, -50, 50, 100 }; // Net zero load @@ -331,9 +356,9 @@ TEST(lib_utility_rate_test, test_net_metering_multiple_tou_periods) int steps_per_hour = 1; std::vector monthly_load_forecast = { 150, 75 }; std::vector monthly_gen_forecast = { 0, 0 }; // Test unexpected generation as well - std::vector monthly_peak_forecast = { 100, 50 }; + std::vector monthly_avg_gross_load = { 100, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { -100, -50, 50, 100 }; // Net zero load @@ -361,9 +386,9 @@ TEST(lib_utility_rate_test, test_net_metering_end_of_month_carryover) int steps_per_hour = 1; std::vector monthly_load_forecast = { 0, 150 }; std::vector monthly_gen_forecast = { 150, 0 }; - std::vector monthly_peak_forecast = { 0, 100 }; + std::vector monthly_avg_gross_load = { 0, 100 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { 100, 50, -50, -100 }; // Net zero load @@ -385,9 +410,9 @@ TEST(lib_utility_rate_test, test_net_metering_dollar_credits) int steps_per_hour = 1; std::vector monthly_load_forecast = { 0, 150 }; std::vector monthly_gen_forecast = { 150, 0 }; - std::vector monthly_peak_forecast = { 0, 100 }; + std::vector monthly_avg_gross_load = { 0, 100 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { 100, 50, -50, -100 }; // Net zero load, but credits expire with zero sell rate @@ -409,9 +434,9 @@ TEST(lib_utility_rate_test, test_net_metering_end_of_month_cashout) int steps_per_hour = 1; std::vector monthly_load_forecast = { 0, 150 }; std::vector monthly_gen_forecast = { 150, 0 }; - std::vector monthly_peak_forecast = { 0, 100 }; + std::vector monthly_avg_gross_load = { 0, 100 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { 100, 50, -50, -100 }; // Net zero load @@ -432,9 +457,9 @@ TEST(lib_utility_rate_test, test_net_metering_end_of_month_charges) int steps_per_hour = 1; std::vector monthly_load_forecast = { 150, 0 }; std::vector monthly_gen_forecast = { 0, 150 }; - std::vector monthly_peak_forecast = { 100, 0 }; + std::vector monthly_avg_gross_load = { 100, 0 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { -100, -50, 50, 100 }; // Net zero load, but charged at end of Jan @@ -455,9 +480,9 @@ TEST(lib_utility_rate_test, test_net_metering_end_of_month_charges_subhourly) int steps_per_hour = 2; std::vector monthly_load_forecast = { 150, 0 }; std::vector monthly_gen_forecast = { 0, 150 }; - std::vector monthly_peak_forecast = { 100, 0 }; + std::vector monthly_avg_gross_load = { 100, 0 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { -100, -100, -50, -50, 50, 50, 100, 100 }; // Net zero load, but charged at end of Jan @@ -478,9 +503,9 @@ TEST(lib_utility_rate_test, test_net_metering_charges_crossing_year) int steps_per_hour = 1; std::vector monthly_load_forecast = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25 }; std::vector monthly_gen_forecast = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0 }; - std::vector monthly_peak_forecast = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50 }; + std::vector monthly_avg_gross_load = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { -25, 25, 50, -25, -25 }; // Get charged for Jan at escalated rate (inflation) @@ -502,9 +527,9 @@ TEST(lib_utility_rate_test, test_net_metering_charges_crossing_year_other_cash_o int steps_per_hour = 1; std::vector monthly_load_forecast = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25 }; std::vector monthly_gen_forecast = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0 }; - std::vector monthly_peak_forecast = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50 }; + std::vector monthly_avg_gross_load = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { -25, 25, 50, -25, -25 }; @@ -525,9 +550,9 @@ TEST(lib_utility_rate_test, test_multiple_forecast_calls) int steps_per_hour = 1; std::vector monthly_load_forecast = { 100, 75 }; std::vector monthly_gen_forecast = { 175, 0 }; - std::vector monthly_peak_forecast = { 100, 50 }; + std::vector monthly_avg_gross_load = { 100, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { 25, 25, 25, 25 }; @@ -555,9 +580,9 @@ TEST(lib_utility_rate_test, test_one_at_a_time_vs_full_vector) int steps_per_hour = 1; std::vector monthly_load_forecast = { 150, 75 }; std::vector monthly_gen_forecast = { 50, 175 }; - std::vector monthly_peak_forecast = { 100, 50 }; + std::vector monthly_avg_gross_load = { 100, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { 50, -100, -50, -50, -25, 25, 50, 100 }; @@ -569,8 +594,8 @@ TEST(lib_utility_rate_test, test_one_at_a_time_vs_full_vector) int hour_of_year = 741; // 9 pm on Jan 31st double cost = rate_forecast.forecastCost(forecast, 0, hour_of_year, 0); - // Total cost for the months would be $1511.25, but this subtracts off the peaks predicted by average load ($3.12) - ASSERT_NEAR(1508.11, cost, 0.02); + // Total cost for the months would be $1511.25, but this subtracts off the peaks predicted by average gross load load ($3.12) + ASSERT_NEAR(11.25, cost, 0.02); cost = 0; for (int i = 0; i < forecast.size(); i++) @@ -579,7 +604,7 @@ TEST(lib_utility_rate_test, test_one_at_a_time_vs_full_vector) cost += forecast_copy.forecastCost(single_forecast, 0, hour_of_year + i, 0); } - ASSERT_NEAR(1508.11, cost, 0.02); + ASSERT_NEAR(11.25, cost, 0.02); } TEST(lib_utility_rate_test, test_one_at_a_time_vs_full_vector_nm_credits) @@ -590,9 +615,9 @@ TEST(lib_utility_rate_test, test_one_at_a_time_vs_full_vector_nm_credits) int steps_per_hour = 1; std::vector monthly_load_forecast = { 150, 75 }; std::vector monthly_gen_forecast = { 50, 175 }; - std::vector monthly_peak_forecast = { 100, 50 }; + std::vector monthly_avg_gross_load = { 100, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { 50, -100, -50, -50, -25, 25, 50, 100 }; @@ -624,9 +649,9 @@ TEST(lib_utility_rate_test, test_one_at_a_time_vs_full_vector_nm_credits_subhour int steps_per_hour = 2; std::vector monthly_load_forecast = { 150, 75 }; std::vector monthly_gen_forecast = { 50, 175 }; - std::vector monthly_peak_forecast = { 100, 50 }; + std::vector monthly_avg_gross_load = { 100, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { 50, 50, -100, -100, -50, -50, -50, -50, -25, -25, 25, 25, 50, 50, 100, 100 }; @@ -663,9 +688,9 @@ TEST(lib_utility_rate_test, test_end_of_analyis_period) int steps_per_hour = 1; std::vector monthly_load_forecast = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25 }; std::vector monthly_gen_forecast = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75 }; - std::vector monthly_peak_forecast = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50 }; + std::vector monthly_avg_gross_load = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 1); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 1); // - is load std::vector forecast = { -25, -25, 50 }; @@ -686,9 +711,9 @@ TEST(lib_utility_rate_test, test_one_at_a_time_vs_full_vector_buy_and_sell_rates int steps_per_hour = 1; std::vector monthly_load_forecast = { 150, 75 }; std::vector monthly_gen_forecast = { 50, 175 }; - std::vector monthly_peak_forecast = { 100, 50 }; + std::vector monthly_avg_gross_load = { 100, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { 50, -100, -50, -50, -25, 25, 50, 100 }; @@ -721,9 +746,9 @@ TEST(lib_utility_rate_test, test_ts_buy_only) int steps_per_hour = 1; std::vector monthly_load_forecast = { 150, 75 }; std::vector monthly_gen_forecast = { 50, 175 }; - std::vector monthly_peak_forecast = { 100, 50 }; + std::vector monthly_avg_gross_load = { 100, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { 50, -100, -50, -50, -25, 25, 50, 100 }; @@ -747,9 +772,9 @@ TEST(lib_utility_rate_test, test_ts_sell_only) int steps_per_hour = 1; std::vector monthly_load_forecast = { 150, 75 }; std::vector monthly_gen_forecast = { 50, 175 }; - std::vector monthly_peak_forecast = { 100, 50 }; + std::vector monthly_avg_gross_load = { 100, 50 }; - UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_peak_forecast, 2); + UtilityRateForecast rate_forecast(&data, steps_per_hour, monthly_load_forecast, monthly_gen_forecast, monthly_avg_gross_load, 2); // - is load std::vector forecast = { 50, -100, -50, -50, -25, 25, 50, 100 }; diff --git a/third_party/ssc/test/shared_test/vs_google_test_explorer_namespace.h b/third_party/ssc/test/shared_test/vs_google_test_explorer_namespace.h new file mode 100644 index 00000000000..6eb408bc863 --- /dev/null +++ b/third_party/ssc/test/shared_test/vs_google_test_explorer_namespace.h @@ -0,0 +1,48 @@ +// vs_google_test_explorer_namespace.h +// +// This is an example of a file/macro that could be used to trick the Google Test Adapter into +// sorting tests into namespaces in C++ +// + +#ifndef NAMESPACE_GTEST_INCLUDE_GTEST_GTEST_H_ +#define NAMESPACE_GTEST_INCLUDE_GTEST_GTEST_H_ + +#include + +// A copy of GTEST_TEST_CLASS_NAME_, but with handling for namespace name. + +#define NAMESPACE_GTEST_TEST_CLASS_NAME_(namespace_name, test_case_name, test_name) \ + namespace_name##_##test_case_name##_##test_name##_Test + +// A copy of GTEST_TEST_, but with handling for namespace name. + +#define NAMESPACE_GTEST_TEST_(namespace_name, test_case_name, test_name, parent_class, parent_id)\ +class NAMESPACE_GTEST_TEST_CLASS_NAME_(namespace_name, test_case_name, test_name) : public parent_class {\ + public:\ + NAMESPACE_GTEST_TEST_CLASS_NAME_(namespace_name, test_case_name, test_name)() {}\ + private:\ + virtual void TestBody();\ + static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\ + GTEST_DISALLOW_COPY_AND_ASSIGN_(\ + NAMESPACE_GTEST_TEST_CLASS_NAME_(namespace_name, test_case_name, test_name));\ +};\ +\ +::testing::TestInfo* const NAMESPACE_GTEST_TEST_CLASS_NAME_(namespace_name, test_case_name, test_name)\ + ::test_info_ =\ + ::testing::internal::MakeAndRegisterTestInfo(\ + #namespace_name "." #test_case_name, #test_name, NULL, NULL, /* <-- Defines the test as "Namespace.Classname" */ \ + ::testing::internal::CodeLocation(__FILE__, __LINE__), \ + (parent_id), \ + parent_class::SetUpTestCase, \ + parent_class::TearDownTestCase, \ + new ::testing::internal::TestFactoryImpl<\ + NAMESPACE_GTEST_TEST_CLASS_NAME_(namespace_name, test_case_name, test_name)>);\ +void NAMESPACE_GTEST_TEST_CLASS_NAME_(namespace_name, test_case_name, test_name)::TestBody() + +// Simple macro + +#define NAMESPACE_TEST(namespace_name, test_case_name, test_name) \ + NAMESPACE_GTEST_TEST_(namespace_name, test_case_name, test_name,\ + ::testing::Test, ::testing::internal::GetTestTypeId()) + +#endif // NAMESPACE_GTEST_INCLUDE_GTEST_GTEST_H_ diff --git a/third_party/ssc/test/ssc_test/cmod_battery_pvsamv1_test.cpp b/third_party/ssc/test/ssc_test/cmod_battery_pvsamv1_test.cpp index 5469811a25c..58937ca330c 100644 --- a/third_party/ssc/test/ssc_test/cmod_battery_pvsamv1_test.cpp +++ b/third_party/ssc/test/ssc_test/cmod_battery_pvsamv1_test.cpp @@ -398,12 +398,12 @@ TEST_F(CMPvsamv1BatteryIntegration_cmod_pvsamv1, PPA_ManualDispatchBatteryModelI grid_and_rate_defaults(data); singleowner_defaults(data); - ssc_number_t expectedEnergy = 37176158; + ssc_number_t expectedEnergy = 37175792; ssc_number_t expectedBatteryChargeEnergy = 1297985; - ssc_number_t expectedBatteryDischargeEnergy = 1166100; + ssc_number_t expectedBatteryDischargeEnergy = 1165634; ssc_number_t peakKwCharge = -1052.0; - ssc_number_t peakKwDischarge = 857.2; + ssc_number_t peakKwDischarge = 846.8; ssc_number_t peakCycles = 1; ssc_number_t avgCycles = 1; @@ -779,7 +779,7 @@ TEST_F(CMPvsamv1BatteryIntegration_cmod_pvsamv1, ResidentialDCBatteryModelPriceS ssc_number_t peakKwCharge = -3.914; ssc_number_t peakKwDischarge = 1.99; ssc_number_t peakCycles = 2; - ssc_number_t avgCycles = 0.4136; + ssc_number_t avgCycles = 0.41; pairs["batt_dispatch_choice"] = 5; @@ -805,7 +805,11 @@ TEST_F(CMPvsamv1BatteryIntegration_cmod_pvsamv1, ResidentialDCBatteryModelPriceS EXPECT_NEAR(batt_stats.peakKwCharge, peakKwCharge, m_error_tolerance_lo); EXPECT_NEAR(batt_stats.peakKwDischarge, peakKwDischarge, m_error_tolerance_lo); EXPECT_NEAR(batt_stats.peakCycles, peakCycles, m_error_tolerance_lo); - EXPECT_NEAR(batt_stats.avgCycles, avgCycles, 0.01); // As of 8-26-20 Linux cycles 2 more times in a year than Windows, this changes the NPV by $2 over 25 years - } + EXPECT_NEAR(batt_stats.avgCycles, avgCycles, 0.1); // As of 8-26-20 Linux cycles 2 more times in a year than Windows, this changes the NPV by $2 over 25 years + auto batt_q_rel = data_vtab->as_vector_ssc_number_t("batt_capacity_percent"); + auto batt_cyc_avg = data_vtab->as_vector_ssc_number_t("batt_DOD_cycle_average"); + EXPECT_NEAR(batt_q_rel.back(), 97.836, 1e-2); + EXPECT_NEAR(batt_cyc_avg.back(), 24.72, 0.5); + } } diff --git a/third_party/ssc/test/ssc_test/cmod_battery_stateful_test.cpp b/third_party/ssc/test/ssc_test/cmod_battery_stateful_test.cpp index 725247703c8..14c6086c83e 100644 --- a/third_party/ssc/test/ssc_test/cmod_battery_stateful_test.cpp +++ b/third_party/ssc/test/ssc_test/cmod_battery_stateful_test.cpp @@ -6,18 +6,28 @@ typedef std::chrono::high_resolution_clock Clock; TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, TestStep) { CreateModel(1); - double last_idx, current, SOC, V, P; + double last_idx, I, SOC, V, P, Q, I_d, I_c, P_d, P_c; ssc_module_exec(mod, data); ssc_data_get_number(data, "last_idx", &last_idx); - ssc_data_get_number(data, "I", ¤t); - ssc_data_get_number(data, "P", &P); ssc_data_get_number(data, "V", &V); + ssc_data_get_number(data, "P", &P); + ssc_data_get_number(data, "Q", &Q); + ssc_data_get_number(data, "I", &I); + ssc_data_get_number(data, "I_dischargeable", &I_d); + ssc_data_get_number(data, "I_chargeable", &I_c); + ssc_data_get_number(data, "P_dischargeable", &P_d); + ssc_data_get_number(data, "P_chargeable", &P_c); ssc_data_get_number(data, "SOC", &SOC); EXPECT_EQ(last_idx, 1); - EXPECT_NEAR(current, 1, 1e-2); - EXPECT_NEAR(P, 0.549, 1e-2); EXPECT_NEAR(V, 549.18, 1e-2); + EXPECT_NEAR(P, 0.549, 1e-2); + EXPECT_NEAR(Q, 9.125, 1e-2); + EXPECT_NEAR(I, 1, 1e-2); + EXPECT_NEAR(I_d, 7.30, 1e-2); + EXPECT_NEAR(I_c, -9.34, 1e-2); + EXPECT_NEAR(P_d, 3.36, 1e-2); + EXPECT_NEAR(P_c, -5.32, 1e-2); EXPECT_NEAR(SOC, 46.94, 1e-2); // make a copy @@ -26,27 +36,47 @@ TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, TestStep) { ssc_module_exec(mod, data); ssc_data_get_number(data, "last_idx", &last_idx); - ssc_data_get_number(data, "I", ¤t); - ssc_data_get_number(data, "P", &P); ssc_data_get_number(data, "V", &V); + ssc_data_get_number(data, "P", &P); + ssc_data_get_number(data, "Q", &Q); + ssc_data_get_number(data, "I", &I); + ssc_data_get_number(data, "I_dischargeable", &I_d); + ssc_data_get_number(data, "I_chargeable", &I_c); + ssc_data_get_number(data, "P_dischargeable", &P_d); + ssc_data_get_number(data, "P_chargeable", &P_c); ssc_data_get_number(data, "SOC", &SOC); EXPECT_EQ(last_idx, 2); - EXPECT_NEAR(current, 1, 1e-2); - EXPECT_NEAR(P, 0.546, 1e-2); EXPECT_NEAR(V, 546.09, 1e-2); + EXPECT_NEAR(P, 0.546, 1e-2); + EXPECT_NEAR(Q, 8.125, 1e-2); + EXPECT_NEAR(I, 1, 1e-2); + EXPECT_NEAR(I_d, 6.5, 1e-2); + EXPECT_NEAR(I_c, -10.34, 1e-2); + EXPECT_NEAR(P_d, 2.90, 1e-2); + EXPECT_NEAR(P_c, -5.89, 1e-2); EXPECT_NEAR(SOC, 41.79, 1e-2); // run the copy, should end up in same place ssc_module_exec(mod, copy); - ssc_data_get_number(data, "last_idx", &last_idx); - ssc_data_get_number(data, "I", ¤t); - ssc_data_get_number(data, "P", &P); - ssc_data_get_number(data, "V", &V); - ssc_data_get_number(data, "SOC", &SOC); + ssc_data_get_number(copy, "last_idx", &last_idx); + ssc_data_get_number(copy, "V", &V); + ssc_data_get_number(copy, "P", &P); + ssc_data_get_number(copy, "Q", &Q); + ssc_data_get_number(copy, "I", &I); + ssc_data_get_number(copy, "I_dischargeable", &I_d); + ssc_data_get_number(copy, "I_chargeable", &I_c); + ssc_data_get_number(copy, "P_dischargeable", &P_d); + ssc_data_get_number(copy, "P_chargeable", &P_c); + ssc_data_get_number(copy, "SOC", &SOC); EXPECT_EQ(last_idx, 2); - EXPECT_NEAR(current, 1, 1e-2); - EXPECT_NEAR(P, 0.546, 1e-2); EXPECT_NEAR(V, 546.09, 1e-2); + EXPECT_NEAR(P, 0.546, 1e-2); + EXPECT_NEAR(Q, 8.125, 1e-2); + EXPECT_NEAR(I, 1, 1e-2); + EXPECT_NEAR(I_d, 6.5, 1e-2); + EXPECT_NEAR(I_c, -10.34, 1e-2); + EXPECT_NEAR(P_d, 2.90, 1e-2); + EXPECT_NEAR(P_c, -5.89, 1e-2); EXPECT_NEAR(SOC, 41.79, 1e-2); } @@ -98,7 +128,7 @@ TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, SubMinute) { TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, ReadJson) { CreateModel(1./60.); - std::string js = "{\"control_mode\": 1.0, \"dt_hr\": 0.016666666666666666, \"input_power\": -1608.9696000000001, \"run_sequentially\": 1.0, \"C_rate\": 0.2, \"Qexp\": 0.04, \"Qfull\": 2.25, \"Qnom\": 2.0, \"Vexp\": 4.05, \"Vfull\": 4.1, \"Vnom\": 3.4, \"Vnom_default\": 3.6, \"calendar_a\": 0.003, \"calendar_b\": -7280.0, \"calendar_c\": 930.0, \"calendar_choice\": 1.0, \"calendar_matrix\": [[-3.1e+231]], \"calendar_q0\": 1.02, \"chem\": 1.0, \"cycling_matrix\": [[20.0, 0.0, 100.0], [20.0, 5000.0, 80.0], [20.0, 10000.0, 60.0], [80.0, 0.0, 100.0], [80.0, 1000.0, 80.0], [80.0, 2000.0, 60.0]], \"initial_SOC\": 50.0, \"maximum_SOC\": 90.0, \"minimum_SOC\": 10.0, \"resistance\": 0.0002, \"voltage_choice\": 0.0, \"Cp\": 1500.0, \"T_room_init\": 20.0, \"cap_vs_temp\": [[-10.0, 60.0], [0.0, 80.0], [25.0, 100.0], [40.0, 100.0]], \"h\": 7.5, \"loss_choice\": 0.0, \"mass\": 98980.0, \"monthly_charge_loss\": [0.0], \"monthly_discharge_loss\": [0.0], \"monthly_idle_loss\": [0.0], \"nominal_energy\": 10000.0, \"nominal_voltage\": 500.0, \"replacement_capacity\": 0.0, \"replacement_option\": 0.0, \"replacement_schedule\": [-1.4916681462400413e-154], \"replacement_schedule_percent\": [-1.4916681462400413e-154], \"schedule_loss\": [0.0], \"surface_area\": 2071.0, \"I\": 0.0, \"I_chargeable\": -939699.5036648216, \"I_dischargeable\": 0.0, \"P\": 0.0, \"P_chargeable\": -538310.3372051578, \"P_dischargeable\": 0.0, \"Q\": 1957.713280026735, \"Q_max\": 19577.07963826714, \"SOC\": 10.000027155224982, \"T_batt\": 54.667972372468775, \"T_room\": 16.5319492435796, \"V\": 0.0, \"heat_dissipated\": 592184.2210545398, \"indices_replaced\": [0.0], \"last_idx\": 1261.0, \"loss_kw\": 0.0, \"n_replacements\": 0.0, \"I_loss\": 0.0, \"SOC_prev\": 10.000026847325115, \"T_batt_prev\": 54.54844020525578, \"average_range\": 0.0, \"cell_current\": 0.0, \"cell_voltage\": 0.0, \"chargeChange\": 0.0, \"charge_mode\": 1.0, \"n_cycles\": 0.0, \"prev_charge\": 2.0, \"q0\": 1957.713280026735, \"q1_0\": 0.0, \"q2\": 0.0, \"q2_0\": 0.0, \"q_relative\": 97.96131821295074, \"q_relative_calendar\": 97.96131821295074, \"q_relative_cycle\": 100.0, \"q_relative_thermal\": 100.0, \"qmax_lifetime\": 19577.07963826714, \"qmax_thermal\": 19577.13280026734, \"qn\": 0.0, \"rainflow_Xlt\": 0.0, \"rainflow_Ylt\": 0.040386817870492635, \"rainflow_jlt\": 2.0, \"rainflow_peaks\": [0.0, 47.9929307855364, 10.000000000000014], \"range\": 0.0, \"day_age_of_battery\" : 3, \"dq_relative_calendar_old\" : 0.001}"; + std::string js = "{\"control_mode\": 1.0, \"dt_hr\": 0.016666666666666666, \"input_power\": -1608.9696000000001, \"run_sequentially\": 1.0, \"C_rate\": 0.2, \"Qexp\": 0.04, \"Qfull\": 2.25, \"Qnom\": 2.0, \"Vexp\": 4.05, \"Vfull\": 4.1, \"Vnom\": 3.4, \"Vnom_default\": 3.6, \"life_model\": 0, \"calendar_a\": 0.003, \"calendar_b\": -7280.0, \"calendar_c\": 930.0, \"calendar_choice\": 1.0, \"calendar_matrix\": [[-3.1e+231]], \"calendar_q0\": 1.02, \"chem\": 1.0, \"cycling_matrix\": [[20.0, 0.0, 100.0], [20.0, 5000.0, 80.0], [20.0, 10000.0, 60.0], [80.0, 0.0, 100.0], [80.0, 1000.0, 80.0], [80.0, 2000.0, 60.0]], \"initial_SOC\": 50.0, \"maximum_SOC\": 90.0, \"minimum_SOC\": 10.0, \"resistance\": 0.0002, \"voltage_choice\": 0.0, \"Cp\": 1500.0, \"T_room_init\": 20.0, \"cap_vs_temp\": [[-10.0, 60.0], [0.0, 80.0], [25.0, 100.0], [40.0, 100.0]], \"h\": 7.5, \"loss_choice\": 0.0, \"mass\": 98980.0, \"monthly_charge_loss\": [0.0], \"monthly_discharge_loss\": [0.0], \"monthly_idle_loss\": [0.0], \"nominal_energy\": 10000.0, \"nominal_voltage\": 500.0, \"replacement_capacity\": 0.0, \"replacement_option\": 0.0, \"replacement_schedule\": [-1.4916681462400413e-154], \"replacement_schedule_percent\": [-1.4916681462400413e-154], \"schedule_loss\": [0.0], \"surface_area\": 2071.0, \"I\": 0.0, \"I_chargeable\": -939699.5036648216, \"I_dischargeable\": 0.0, \"P\": 0.0, \"P_chargeable\": -538310.3372051578, \"P_dischargeable\": 0.0, \"Q\": 1957.713280026735, \"Q_max\": 19577.07963826714, \"SOC\": 10.000027155224982, \"T_batt\": 54.667972372468775, \"T_room\": 16.5319492435796, \"V\": 0.0, \"heat_dissipated\": 592184.2210545398, \"indices_replaced\": [0.0], \"last_idx\": 1261.0, \"loss_kw\": 0.0, \"n_replacements\": 0.0, \"I_loss\": 0.0, \"SOC_prev\": 10.000026847325115, \"T_batt_prev\": 54.54844020525578, \"average_range\": 0.0, \"cell_current\": 0.0, \"cell_voltage\": 0.0, \"chargeChange\": 0.0, \"charge_mode\": 1.0, \"n_cycles\": 0.0, \"prev_charge\": 2.0, \"q0\": 1957.713280026735, \"q1_0\": 0.0, \"q2\": 0.0, \"q2_0\": 0.0, \"q_relative\": 97.96131821295074, \"q_relative_calendar\": 97.96131821295074, \"q_relative_cycle\": 100.0, \"q_relative_thermal\": 100.0, \"qmax_lifetime\": 19577.07963826714, \"qmax_thermal\": 19577.13280026734, \"qn\": 0.0, \"rainflow_Xlt\": 0.0, \"rainflow_Ylt\": 0.040386817870492635, \"rainflow_jlt\": 2.0, \"rainflow_peaks\": [0.0, 47.9929307855364, 10.000000000000014], \"range\": 0.0, \"day_age_of_battery\" : 3, \"dq_relative_calendar_old\" : 0.001}"; auto copy = json_to_ssc_data(js.c_str()); double P, V, SOC; @@ -117,7 +147,7 @@ TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, ReadJson) { TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, RunCurrentControl) { CreateKokamModel(); - double range, avg_range, n_cycles; + double range, avg_range, n_cycles, q_max, q_rel; std::vector currents = getCurrentData(); @@ -130,11 +160,75 @@ TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, RunCurrentControl) { ssc_module_exec(mod, data); } + ssc_data_get_number(data, "range", &range); ssc_data_get_number(data, "average_range", &avg_range); ssc_data_get_number(data, "n_cycles", &n_cycles); + ssc_data_get_number(data, "Q_max", &q_max); + ssc_data_get_number(data, "q_relative", &q_rel); + + + EXPECT_NEAR(range, 75.34, 0.01); + EXPECT_NEAR(avg_range, 61.54, 0.01); + EXPECT_NEAR(n_cycles, 3.0, 0.01); + EXPECT_NEAR(q_max, 75.55, 0.01); + EXPECT_NEAR(q_rel, 99.99, 0.01); +} + +TEST_F(CMBatteryStatefulIntegration_cmod_battery_stateful, AdaptiveTimestep) { + CreateModel(1.); + + double power = 1; + ssc_data_set_number(data, "control_mode", 1); + ssc_data_set_number(data, "input_power", power); + + // create adaptive + var_table data_copy; + data_copy = *static_cast(data); + ssc_data_set_number(&data_copy, "input_power", power); + auto adaptive_batt = ssc_stateful_module_create("battery_stateful", &data_copy); + + double P, hourly_E = 0, adaptive_E = 0; + + // run both at hourly + ssc_module_exec(mod, data); + ssc_data_get_number(data, "P", &P); + hourly_E += P; + + ssc_module_exec(adaptive_batt, &data_copy); + ssc_data_get_number(&data_copy, "P", &P); + adaptive_E += P; + + // run at hourly and adaptive at 15 min + ssc_module_exec(mod, data); + ssc_data_get_number(data, "P", &P); + hourly_E += P; + + size_t steps_per_hour = 4; + ssc_data_set_number(&data_copy, "dt_hr", 1. / (double)steps_per_hour); + for (size_t i = 0; i < steps_per_hour; i++) { + ssc_module_exec(adaptive_batt, &data_copy); + ssc_data_get_number(&data_copy, "P", &P); + adaptive_E += P / (double)steps_per_hour; + } + + // run both at hourly + ssc_module_exec(mod, data); + ssc_data_get_number(data, "P", &P); + hourly_E += P; + + ssc_data_set_number(&data_copy, "dt_hr", 1.); + ssc_module_exec(adaptive_batt, &data_copy); + ssc_data_get_number(&data_copy, "P", &P); + adaptive_E += P; + + double hourly_SOC, adaptive_SOC; + ssc_data_get_number(data, "SOC", &hourly_SOC); + ssc_data_get_number(&data_copy, "SOC", &adaptive_SOC); + + EXPECT_NEAR(hourly_E, 2.994, 1e-3); + EXPECT_NEAR(adaptive_E, 2.994, 1e-3); + EXPECT_NEAR(hourly_SOC, 23.370, 1e-3); + EXPECT_NEAR(adaptive_SOC, 23.428, 1e-3); - EXPECT_NEAR(range, 75.0, 0.5); - EXPECT_NEAR(avg_range, 61.5, 0.1); - EXPECT_NEAR(n_cycles, 3.0, 0.1); } diff --git a/third_party/ssc/test/ssc_test/cmod_battery_stateful_test.h b/third_party/ssc/test/ssc_test/cmod_battery_stateful_test.h index 3e2cf640214..dd216be7807 100644 --- a/third_party/ssc/test/ssc_test/cmod_battery_stateful_test.h +++ b/third_party/ssc/test/ssc_test/cmod_battery_stateful_test.h @@ -17,7 +17,7 @@ class CMBatteryStatefulIntegration_cmod_battery_stateful : public ::testing::Tes double m_error_tolerance_lo = 0.1; void CreateModel(double dt_hour = 1.) { - params_str = R"({ "control_mode": 0, "input_current": 1, "chem": 1, "nominal_energy": 10, "nominal_voltage": 500, "qmax_init": 1000.000, "initial_SOC": 50.000, "maximum_SOC": 95.000, "minimum_SOC": 5.000, "dt_hr": 1.000, "leadacid_tn": 0.000, "leadacid_qn": 0.000, "leadacid_q10": 0.000, "leadacid_q20": 0.000, "voltage_choice": 0, "Vnom_default": 3.600, "resistance": 0.000, "Vfull": 4.100, "Vexp": 4.050, "Vnom": 3.400, "Qfull": 2.250, "Qexp": 0.040, "Qnom": 2.000, "C_rate": 0.200, "mass": 507.000, "surface_area": 2.018, "Cp": 1004.000, "h": 20.000, "cap_vs_temp": [ [ -10, 60 ], [ 0, 80 ], [ 25, 1E+2 ], [ 40, 1E+2 ] ], "option": 1, "T_room_init": 20, "cycling_matrix": [ [ 20, 0, 1E+2 ], [ 20, 5E+3, 80 ], [ 20, 1E+4, 60 ], [ 80, 0, 1E+2 ], [ 80, 1E+3, 80 ], [ 80, 2E+3, 60 ] ], "calendar_choice": 1, "calendar_q0": 1.020, "calendar_a": 0.003, "calendar_b": -7280.000, "calendar_c": 930.000, "calendar_matrix": [ [ -3.1E+231 ] ], "loss_choice": 0, "monthly_charge_loss": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ], "monthly_discharge_loss": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ], "monthly_idle_loss": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ], "schedule_loss": [], "replacement_option": 0, "replacement_capacity": 0.000, "replacement_schedule": [], "replacement_schedule_percent": [], "analysis_period": 1, "load_escalation": [0]})"; + params_str = R"({ "control_mode": 0, "input_current": 1, "chem": 1, "nominal_energy": 10, "nominal_voltage": 500, "qmax_init": 1000.000, "initial_SOC": 50.000, "maximum_SOC": 95.000, "minimum_SOC": 5.000, "dt_hr": 1.000, "leadacid_tn": 0.000, "leadacid_qn": 0.000, "leadacid_q10": 0.000, "leadacid_q20": 0.000, "voltage_choice": 0, "Vnom_default": 3.600, "resistance": 0.000, "Vfull": 4.100, "Vexp": 4.050, "Vnom": 3.400, "Qfull": 2.250, "Qexp": 0.040, "Qnom": 2.000, "C_rate": 0.200, "mass": 507.000, "surface_area": 2.018, "Cp": 1004.000, "h": 20.000, "cap_vs_temp": [ [ -10, 60 ], [ 0, 80 ], [ 25, 1E+2 ], [ 40, 1E+2 ] ], "option": 1, "T_room_init": 20, "life_model": 0, "cycling_matrix": [ [ 20, 0, 1E+2 ], [ 20, 5E+3, 80 ], [ 20, 1E+4, 60 ], [ 80, 0, 1E+2 ], [ 80, 1E+3, 80 ], [ 80, 2E+3, 60 ] ], "calendar_choice": 1, "calendar_q0": 1.020, "calendar_a": 0.003, "calendar_b": -7280.000, "calendar_c": 930.000, "calendar_matrix": [ [ -3.1E+231 ] ], "loss_choice": 0, "monthly_charge_loss": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ], "monthly_discharge_loss": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ], "monthly_idle_loss": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ], "schedule_loss": [], "replacement_option": 0, "replacement_capacity": 0.000, "replacement_schedule": [], "replacement_schedule_percent": [], "analysis_period": 1, "load_escalation": [0]})"; data = json_to_ssc_data(params_str.c_str()); ssc_data_set_number(data, "dt_hr", dt_hour); mod = ssc_stateful_module_create("battery_stateful", data); @@ -33,7 +33,7 @@ class CMBatteryStatefulIntegration_cmod_battery_stateful : public ::testing::Tes "\"Vnom_default\" : 3.6, \"resistance\" : 0.001155, \"Vfull\" : 4.200, \"Vexp\" : 3.529, \"Vnom\" : 3.35, \"Qfull\" : 75.56," "\"Qexp\" : 60.75, \"Qnom\" : 73.58, \"C_rate\" : 0.200, \"mass\" : 1.55417, \"surface_area\" : 0.1548, \"Cp\" : 980," "\"h\" : 8.066, \"cap_vs_temp\" : [[ 0, 80.200000000000003 ],[23, 100],[30, 103.09999999999999],[45, 105.40000000000001]], \"T_room_init\" : 23," - "\"cycling_matrix\" : [[ 20, 0, 107 ],[20, 1000, 101],[20, 2000, 98.5],[20, 3000, 96.3]," + "\"life_model\": 0, \"cycling_matrix\" : [[ 20, 0, 107 ],[20, 1000, 101],[20, 2000, 98.5],[20, 3000, 96.3]," "[80, 0, 107],[80, 1000, 95.6],[80, 2000, 91.1],[80, 3000, 87.3]," "[100, 0, 107],[100, 1000, 85.1],[100, 2000, 76.3],[100, 3000, 69.1]]," "\"calendar_choice\" : 1, \"calendar_q0\" : 1.03127097 , \"calendar_a\" : 1.35973301e-03," diff --git a/third_party/ssc/test/ssc_test/cmod_singleowner_test.cpp b/third_party/ssc/test/ssc_test/cmod_singleowner_test.cpp index 66f6c790a41..7d2f88b5740 100644 --- a/third_party/ssc/test/ssc_test/cmod_singleowner_test.cpp +++ b/third_party/ssc/test/ssc_test/cmod_singleowner_test.cpp @@ -1,6 +1,5 @@ #include "cmod_singleowner_test.h" -#include "cmod_financial_eqns.h" #include "gtest/gtest.h" @@ -14,97 +13,3 @@ TEST_F(CMSingleOwner, ResidentialDefault_cmod_swh) { EXPECT_NEAR(npv, -647727751.2, 0.1); } - -TEST(Mspt_cmod_financial_eqns, Case1) { - double error_tolerance = 0.01; - var_table* vd = new var_table; - vd->assign("total_installed_cost", 673465536.); - - vd->assign("const_per_percent1", 100.); - vd->assign("const_per_upfront_rate1", 1.); - vd->assign("const_per_months1", 24.); - vd->assign("const_per_interest_rate1", 4.); - - vd->assign("const_per_percent2", 0.); - vd->assign("const_per_upfront_rate2", 0.); - vd->assign("const_per_months2", 0.); - vd->assign("const_per_interest_rate2", 0.); - - vd->assign("const_per_percent3", 0.); - vd->assign("const_per_upfront_rate3", 0.); - vd->assign("const_per_months3", 0.); - vd->assign("const_per_interest_rate3", 0.); - - vd->assign("const_per_percent4", 0.); - vd->assign("const_per_upfront_rate4", 0.); - vd->assign("const_per_months4", 0.); - vd->assign("const_per_interest_rate4", 0.); - - vd->assign("const_per_percent5", 0.); - vd->assign("const_per_upfront_rate5", 0.); - vd->assign("const_per_months5", 0.); - vd->assign("const_per_interest_rate5", 0.); - - Financial_Construction_Financing_Equations(vd); - - double const_per_principal1 = vd->lookup("const_per_principal1")->num; - double const_per_interest1 = vd->lookup("const_per_interest1")->num; - double const_per_total1 = vd->lookup("const_per_total1")->num; - - double const_per_principal2 = vd->lookup("const_per_principal2")->num; - double const_per_interest2 = vd->lookup("const_per_interest2")->num; - double const_per_total2 = vd->lookup("const_per_total2")->num; - - double const_per_principal3 = vd->lookup("const_per_principal3")->num; - double const_per_interest3 = vd->lookup("const_per_interest3")->num; - double const_per_total3 = vd->lookup("const_per_total3")->num; - - double const_per_principal4 = vd->lookup("const_per_principal4")->num; - double const_per_interest4 = vd->lookup("const_per_interest4")->num; - double const_per_total4 = vd->lookup("const_per_total4")->num; - - double const_per_principal5 = vd->lookup("const_per_principal5")->num; - double const_per_interest5 = vd->lookup("const_per_interest5")->num; - double const_per_total5 = vd->lookup("const_per_total5")->num; - - double const_per_principal_total = vd->lookup("const_per_principal_total")->num; - double const_per_percent_total = vd->lookup("const_per_percent_total")->num; - double construction_financing_cost = vd->lookup("construction_financing_cost")->num; - double const_per_interest_total = vd->lookup("const_per_interest_total")->num; - - ASSERT_NEAR(const_per_principal1, 673465472., 673465472. * error_tolerance); - ASSERT_NEAR(const_per_interest1, 26938618., 26938618. * error_tolerance); - ASSERT_NEAR(const_per_total1, 33673272., 33673272. * error_tolerance); - - ASSERT_NEAR(const_per_principal2, 0., 0. * error_tolerance); - ASSERT_NEAR(const_per_interest2, 0., 0. * error_tolerance); - ASSERT_NEAR(const_per_total2, 0., 0. * error_tolerance); - - ASSERT_NEAR(const_per_principal3, 0., 0. * error_tolerance); - ASSERT_NEAR(const_per_interest3, 0., 0. * error_tolerance); - ASSERT_NEAR(const_per_total3, 0., 0. * error_tolerance); - - ASSERT_NEAR(const_per_principal4, 0., 0. * error_tolerance); - ASSERT_NEAR(const_per_interest4, 0., 0. * error_tolerance); - ASSERT_NEAR(const_per_total4, 0., 0. * error_tolerance); - - ASSERT_NEAR(const_per_principal5, 0., 0. * error_tolerance); - ASSERT_NEAR(const_per_interest5, 0., 0. * error_tolerance); - ASSERT_NEAR(const_per_total5, 0., 0. * error_tolerance); - - ASSERT_NEAR(const_per_percent_total, 100., 100. * error_tolerance); - ASSERT_NEAR(const_per_principal_total, 673465472., 673465472. * error_tolerance); - ASSERT_NEAR(const_per_interest_total, 26938618., 26938618. * error_tolerance); - ASSERT_NEAR(construction_financing_cost, 33673272., 33673272. * error_tolerance); -} - -TEST(Mspt_cmod_financial_eqns, Case2) { - double error_tolerance = 0.01; - var_table* vd = new var_table; - vd->assign("system_capacity", 103500.); - - Financial_Capacity_Payments_Equations(vd); - - double cp_system_nameplate = vd->lookup("cp_system_nameplate")->num; - ASSERT_NEAR(cp_system_nameplate, 103.5, 103.5 * error_tolerance); -} diff --git a/third_party/ssc/test/ssc_test/cmod_tcsdirect_steam_test.cpp b/third_party/ssc/test/ssc_test/cmod_tcsdirect_steam_test.cpp index 343e36beeda..d5e9b97f326 100644 --- a/third_party/ssc/test/ssc_test/cmod_tcsdirect_steam_test.cpp +++ b/third_party/ssc/test/ssc_test/cmod_tcsdirect_steam_test.cpp @@ -1,419 +1,221 @@ #include - -#include "cmod_tcsdirect_steam_test.h" -#include "../tcs_test/tcsdirect_steam_cases.h" -#include "../input_cases/weather_inputs.h" - -/// Test tcsdirect_steam with all defaults and the single owner financial model -TEST_F(CMTcsDirectSteam, DirectSteam_Default_SingleOwner_cmod_tcsdirect_steam) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcsdirect_steam_daggett_default(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 263818768.982372, 263818768.982372 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_fuel_usage; - ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); - EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 30.078699, 30.078699 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 296640437.816735, 296640437.816735 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 2634.894072, 2634.894072 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 92.641187, 92.641187 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_heat_rate; - ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); - EXPECT_NEAR(system_heat_rate, 3.413000, 3.413000 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_total_water_use; - ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); - EXPECT_NEAR(annual_total_water_use, 55716.172107, 55716.172107 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - } +#include "tcsdirect_steam_defaults.h" +#include "csp_common_test.h" +#include "vs_google_test_explorer_namespace.h" + + +namespace csp_tower {} +using namespace csp_tower; + +//========Tests=================================================================================== +NAMESPACE_TEST(csp_tower, SteamTowerCmod, Default_NoFinancial) +{ + ssc_data_t defaults = tcsdirect_steam_defaults(); + CmodUnderTest steam_tower = CmodUnderTest("tcsdirect_steam", defaults); + int errors = steam_tower.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_energy"), 263809742, kErrorToleranceLo); + EXPECT_NEAR(steam_tower.GetOutput("annual_fuel_usage"), 0., kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("capacity_factor"), 30.08, kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_W_cycle_gross"), 296630582, kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("kwh_per_kw"), 2635, kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("conversion_factor"), 92.64, kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("system_heat_rate"), 3.413, kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_total_water_use"), 55716, kErrorToleranceLo); + } } -/// Test tcsdirect_steam with alternative condenser type: Evaporative -/// Rest default configurations with respect to the single owner financial model -TEST_F(CMTcsDirectSteam, DirectSteam_Evap_Condenser_SingleOwner_cmod_tcsdirect_steam) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcsdirect_steam_daggett_evap_condenser(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 280986033.690457, 280986033.690457 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_fuel_usage; - ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); - EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 32.035986, 32.035986 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 307636143.733944, 307636143.733944 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 2806.352396, 2806.352396 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 95.142849, 95.142849 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_heat_rate; - ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); - EXPECT_NEAR(system_heat_rate, 3.413000, 3.413000 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_total_water_use; - ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); - EXPECT_NEAR(annual_total_water_use, 893438.592909, 893438.592909 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - - } +// Alternative condenser type : Evaporative +NAMESPACE_TEST(csp_tower, SteamTowerCmod, EvaporativeCondenser_NoFinancial) +{ + ssc_data_t defaults = tcsdirect_steam_defaults(); + CmodUnderTest steam_tower = CmodUnderTest("tcsdirect_steam", defaults); + steam_tower.SetInput("ct", 1); + steam_tower.SetInput("eta_ref", 0.404); + steam_tower.SetInput("startup_frac", 0.5); + steam_tower.SetInput("P_cond_min", 2); + + int errors = steam_tower.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_energy"), 280975356, kErrorToleranceLo); + EXPECT_NEAR(steam_tower.GetOutput("annual_fuel_usage"), 0., kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("capacity_factor"), 32.03, kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_W_cycle_gross"), 307624737, kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("kwh_per_kw"), 2806, kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("conversion_factor"), 95.14, kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("system_heat_rate"), 3.413, kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_total_water_use"), 893431, kErrorToleranceLo); + } } -/// Test tcsdirect_steam with alternative condenser type: Hybrid -/// Rest default configurations with respect to the single owner financial model -TEST_F(CMTcsDirectSteam, DirectSteam_Hybrid_Condenser_SingleOwner_cmod_tcsdirect_steam) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcsdirect_steam_daggett_hybrid_condenser(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 268125210.231106, 268125210.231106 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_fuel_usage; - ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); - EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 30.569689, 30.569689 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 304076894.573157, 304076894.573157 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 2677.904721, 2677.904721 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 91.850813, 91.850813 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_heat_rate; - ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); - EXPECT_NEAR(system_heat_rate, 3.413000, 3.413000 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_total_water_use; - ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); - EXPECT_NEAR(annual_total_water_use, 55716.584942, 55716.584942 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - - } +// Alternative condenser type : Hybrid +NAMESPACE_TEST(csp_tower, SteamTowerCmod, HybridCondenser_NoFinancial) +{ + ssc_data_t defaults = tcsdirect_steam_defaults(); + CmodUnderTest steam_tower = CmodUnderTest("tcsdirect_steam", defaults); + steam_tower.SetInput("ct", 3); + steam_tower.SetInput("eta_ref", 0.404); + steam_tower.SetInput("startup_frac", 0.5); + steam_tower.SetInput("P_cond_min", 2); + + int errors = steam_tower.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_energy"), 268116066, kErrorToleranceLo); + EXPECT_NEAR(steam_tower.GetOutput("annual_fuel_usage"), 0., kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("capacity_factor"), 30.57, kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_W_cycle_gross"), 304066728, kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("kwh_per_kw"), 2678, kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("conversion_factor"), 91.85, kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("system_heat_rate"), 3.413, kErrorToleranceLo); + EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_total_water_use"), 55716, kErrorToleranceLo); + } } -/// Test tcsdirect_steam with alternative fossil dispatch mode: Supplemental mode -/// Rest default configurations with respect to the single owner financial model -//TEST_F(CMTcsDirectSteam, DirectSteam_Fossil_Supplemental_SingleOwner_cmod_tcsdirect_steam) { -// -// ssc_data_t data = ssc_data_create(); -// int test_errors = tcsdirect_steam_daggett_fossil_dispatch_supplemental(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 268125210.231106, 268125210.231106 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_fuel_usage; -// ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); -// EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 30.569689, 30.569689 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 304076894.573157, 304076894.573157 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 2677.904721, 2677.904721 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 91.850813, 91.850813 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t system_heat_rate; -// ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); -// EXPECT_NEAR(system_heat_rate, 3.413000, 3.413000 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 55716.584942, 55716.584942 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// -// } +//// Fossil dispatch +//NAMESPACE_TEST(csp_tower, SteamTowerCmod, FossilDispatch_NoFinancial) +//{ +// ssc_data_t defaults = tcsdirect_steam_defaults(); +// CmodUnderTest steam_tower = CmodUnderTest("tcsdirect_steam", defaults); +// steam_tower.SetInput("fossil_mode", 2); +// steam_tower.SetInput("eta_ref", 0.404); +// steam_tower.SetInput("startup_frac", 0.5); +// steam_tower.SetInput("P_cond_min", 2); +// +// int errors = steam_tower.RunModule(); +// EXPECT_FALSE(errors); +// if (!errors) { +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_energy"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_fuel_usage"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("capacity_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_W_cycle_gross"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("kwh_per_kw"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("conversion_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("system_heat_rate"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_total_water_use"), 571408807, kErrorToleranceLo); +// } //} - -/// Test tcsdirect_steam with alternative Direct Steam Receiver material: T91 Steel -/// Rest default configurations with respect to the single owner financial model -//TEST_F(CMTcsDirectSteam, DirectSteam_Direct_Steam_Receiver_SingleOwner_cmod_tcsdirect_steam) { -// -// ssc_data_t data = ssc_data_create(); -// int test_errors = tcsdirect_steam_daggett_direct_steam_receiver(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 2.68312e8, 2.68312e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_fuel_usage; -// ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); -// EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 30.591, 30.591 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 3.01568e8, 3.01568e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 2679.77, 2679.77 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi // -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 92.6794, 92.6794 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t system_heat_rate; -// ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); -// EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 55574.5, 55574.5 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// -// } +//// Receiver material : T91 Steel +//NAMESPACE_TEST(csp_tower, SteamTowerCmod, ReceiverT91Steel_NoFinancial) +//{ +// ssc_data_t defaults = tcsdirect_steam_defaults(); +// CmodUnderTest steam_tower = CmodUnderTest("tcsdirect_steam", defaults); +// steam_tower.SetInput("mat_boiler", 28); +// steam_tower.SetInput("mat_sh", 28); +// steam_tower.SetInput("mat_rh", 28); +// steam_tower.SetInput("eta_ref", 0.404); +// steam_tower.SetInput("startup_frac", 0.5); +// steam_tower.SetInput("P_cond_min", 2); +// +// int errors = steam_tower.RunModule(); +// EXPECT_FALSE(errors); +// if (!errors) { +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_energy"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_fuel_usage"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("capacity_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_W_cycle_gross"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("kwh_per_kw"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("conversion_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("system_heat_rate"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_total_water_use"), 571408807, kErrorToleranceLo); +// } //} - -/// Test tcsdirect_steam with alternative flow pattern: 1 -/// Rest default configurations with respect to the single owner financial model -//TEST_F(CMTcsDirectSteam, DirectSteam_Flow_Pattern_SingleOwner_cmod_tcsdirect_steam) { -// -// ssc_data_t data = ssc_data_create(); -// int test_errors = tcsdirect_steam_daggett_flow_pattern(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 2.67815e8, 2.67815e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_fuel_usage; -// ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); -// EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 30.5343, 30.5343 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 3.01038e8, 3.01038e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 2674.81, 2674.81 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 92.6707, 92.6707 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t system_heat_rate; -// ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); -// EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi // -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 55540.2, 55540.2 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// -// } +//// Alternative receiver flow pattern +//NAMESPACE_TEST(csp_tower, SteamTowerCmod, FlowPattern1_NoFinancial) +//{ +// ssc_data_t defaults = tcsdirect_steam_defaults(); +// CmodUnderTest steam_tower = CmodUnderTest("tcsdirect_steam", defaults); +// steam_tower.SetInput("flowtype", 1); +// steam_tower.SetInput("eta_ref", 0.404); +// steam_tower.SetInput("startup_frac", 0.5); +// steam_tower.SetInput("P_cond_min", 2); +// +// int errors = steam_tower.RunModule(); +// EXPECT_FALSE(errors); +// if (!errors) { +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_energy"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_fuel_usage"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("capacity_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_W_cycle_gross"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("kwh_per_kw"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("conversion_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("system_heat_rate"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_total_water_use"), 571408807, kErrorToleranceLo); +// } //} - -/// Test tcsdirect_steam with alternative Heliostat focusing method: Flat -/// Rest default configurations with respect to the single owner financial model -//TEST_F(CMTcsDirectSteam, DirectSteam_Heliostat_Focusing_SingleOwner_cmod_tcsdirect_steam) { -// -// ssc_data_t data = ssc_data_create(); -// int test_errors = tcsdirect_steam_daggett_focusing_method(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 2.68027e8, 2.68027e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_fuel_usage; -// ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); -// EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 30.5585, 30.5585 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 3.01252e8, 3.01252e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 2676.92, 2676.92 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 92.678, 92.678 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t system_heat_rate; -// ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); -// EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 55547.3, 55547.3 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi // -// -// } +//// Alternative heliostat focusing method: Flat +//NAMESPACE_TEST(csp_tower, SteamTowerCmod, HeliostatFlatFocusing_NoFinancial) +//{ +// ssc_data_t defaults = tcsdirect_steam_defaults(); +// CmodUnderTest steam_tower = CmodUnderTest("tcsdirect_steam", defaults); +// steam_tower.SetInput("focus_type", 0); +// steam_tower.SetInput("eta_ref", 0.404); +// steam_tower.SetInput("startup_frac", 0.5); +// steam_tower.SetInput("P_cond_min", 2); +// +// int errors = steam_tower.RunModule(); +// EXPECT_FALSE(errors); +// if (!errors) { +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_energy"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_fuel_usage"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("capacity_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_W_cycle_gross"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("kwh_per_kw"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("conversion_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("system_heat_rate"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_total_water_use"), 571408807, kErrorToleranceLo); +// } //} - -/// Test tcsdirect_steam with alternative Heliostat canting method: Equinox -/// Rest default configurations with respect to the single owner financial model -//TEST_F(CMTcsDirectSteam, DirectSteam_Heliostat_Canting_SingleOwner_cmod_tcsdirect_steam) { -// -// ssc_data_t data = ssc_data_create(); -// int test_errors = tcsdirect_steam_daggett_canting_method(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 2.68848e8, 2.68848e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_fuel_usage; -// ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); -// EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 30.6521, 30.6521 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi // -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 3.02142e8, 3.02142e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi // -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 2685.12, 2685.12 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 92.6883, 92.6883 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t system_heat_rate; -// ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); -// EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 55606.8, 55606.8 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// -// } +//// Alternative heliostat canting method: Equinox +//NAMESPACE_TEST(csp_tower, SteamTowerCmod, HeliostatEquinoxCanting_NoFinancial) +//{ +// ssc_data_t defaults = tcsdirect_steam_defaults(); +// CmodUnderTest steam_tower = CmodUnderTest("tcsdirect_steam", defaults); +// steam_tower.SetInput("cant_type", 2); +// steam_tower.SetInput("eta_ref", 0.404); +// steam_tower.SetInput("startup_frac", 0.5); +// steam_tower.SetInput("P_cond_min", 2); +// +// int errors = steam_tower.RunModule(); +// EXPECT_FALSE(errors); +// if (!errors) { +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_energy"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_fuel_usage"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("capacity_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_W_cycle_gross"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("kwh_per_kw"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("conversion_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("system_heat_rate"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_total_water_use"), 571408807, kErrorToleranceLo); +// } //} - -/// Test tcsdirect_steam with alternative location: Tucson, AZ -/// Rest default configurations with respect to the single owner financial model -//TEST_F(CMTcsDirectSteam, DirectSteam_Location_Tucson_AZ_SingleOwner_cmod_tcsdirect_steam) { // -// ssc_data_t data = ssc_data_create(); -// int test_errors = tcsdirect_steam_daggett_tucson_AZ(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 2.55075e8, 2.55075e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_fuel_usage; -// ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); -// EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 29.0817, 29.0817 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 2.87524e8, 2.87524e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 2547.56, 2547.56 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 92.4107, 92.4107 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t system_heat_rate; -// ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); -// EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 54685.3, 54685.3 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// -// } +//// Phoenix, AZ +//NAMESPACE_TEST(csp_tower, SteamTowerCmod, Phoeniz_NoFinancial) +//{ +// ssc_data_t defaults = tcsdirect_steam_defaults(); +// CmodUnderTest steam_tower = CmodUnderTest("tcsdirect_steam", defaults); +// char solar_resource_path_tucson[512]; +// int n2 = sprintf(solar_resource_path_tucson, "%s/test/input_cases/directsteam_data/tucson_az_32.116521_-110.933042_psmv3_60_tmy.csv", std::getenv("SSCDIR")); +// steam_tower.SetInput("solar_resource_file", solar_resource_path_tucson); +// +// int errors = steam_tower.RunModule(); +// EXPECT_FALSE(errors); +// if (!errors) { +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_energy"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_fuel_usage"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("capacity_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_W_cycle_gross"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("kwh_per_kw"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("conversion_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("system_heat_rate"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(steam_tower.GetOutput("annual_total_water_use"), 571408807, kErrorToleranceLo); +// } //} - - diff --git a/third_party/ssc/test/ssc_test/cmod_tcsdirect_steam_test.h b/third_party/ssc/test/ssc_test/cmod_tcsdirect_steam_test.h deleted file mode 100644 index 6d62233aa75..00000000000 --- a/third_party/ssc/test/ssc_test/cmod_tcsdirect_steam_test.h +++ /dev/null @@ -1,54 +0,0 @@ -#include - -#include "core.h" -#ifndef _CMOD_TCSDIRECT_STEAM_TEST_H_ -#define _CMOD_TCSDIRECT_STEAM_TEST_H_ - -#include "vartab.h" -#include "../ssc/common.h" -#include "../tcs_test/tcsdirect_steam_cases.h" - -/** - * CMtcsDirectSteam tests the cmod_tcsdirect_steam using the SAM code generator to generate data - * Eventually a method can be written to write this data to a vartable so that lower-level methods of - * tcsdirect_steam can be tested - * For now, this uses the SSCAPI interfaces to run the compute module and compare results - */ -class CMTcsDirectSteam : public ::testing::Test { - -public: - - ssc_data_t data; - ssc_number_t calculated_value; - ssc_number_t * calculated_array; - double m_error_tolerance_hi = 0.01; // 1.0% - double m_error_tolerance_lo = 0.001; // 0.1% - - void SetUp() - { - data = ssc_data_create(); - tcsdirect_steam_default(data); - calculated_array = new ssc_number_t[8760]; - } - void TearDown() { - if (data) { - ssc_data_free(data); - data = nullptr; - } - if (calculated_array) { - delete[] calculated_array; - } - } - void SetCalculated(std::string name) - { - ssc_data_get_number(data, const_cast(name.c_str()), &calculated_value); - } - void SetCalculatedArray(std::string name) - { - int n; - calculated_array = ssc_data_get_array(data, const_cast(name.c_str()), &n); - } -}; - -#endif // !_CMOD_TCSDIRECT_STEAM_TEST_H_ - diff --git a/third_party/ssc/test/ssc_test/cmod_tcsfresnel_molten_salt_test.cpp b/third_party/ssc/test/ssc_test/cmod_tcsfresnel_molten_salt_test.cpp index afd79eea8b2..036165f1da7 100644 --- a/third_party/ssc/test/ssc_test/cmod_tcsfresnel_molten_salt_test.cpp +++ b/third_party/ssc/test/ssc_test/cmod_tcsfresnel_molten_salt_test.cpp @@ -1,489 +1,244 @@ #include - -#include "cmod_tcsfresnel_molten_salt_test.h" -#include "../tcs_test/tcsfresnel_molten_salt_cases.h" -#include "../input_cases/weather_inputs.h" - - -/// Test tcsfresnel_molten_salt with all default configurations with respect to the No Finanical model -TEST_F(CMTcsFresnelMoltenSalt, Rankine_Default_No_Financial_cmod_tcsfresnel_molten_salt) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcsfresnel_molten_salt_tucson_default(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 337260930.158212, 337260930.158212 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_fuel_usage; - ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); - EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 38.500145, 38.500145 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 372651034.745992, 372651034.745992 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 3372.612727, 3372.612727 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 94.274118, 94.274118 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_heat_rate; - ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); - EXPECT_NEAR(system_heat_rate, 3.413000, 3.413000 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_total_water_use; - ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); - EXPECT_NEAR(annual_total_water_use, 30058.992530, 30058.992530 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - } +#include "tcsfresnel_molten_salt_defaults.h" +#include "csp_common_test.h" +#include "vs_google_test_explorer_namespace.h" + +namespace csp_tower {} +using namespace csp_tower; + +//========Tests=================================================================================== +NAMESPACE_TEST(csp_fresnel, PowerFresnelCmod, Default_NoFinancial) +{ + ssc_data_t defaults = tcsfresnel_molten_salt_defaults(); + CmodUnderTest power_fresnel = CmodUnderTest("tcsmslf", defaults); + int errors = power_fresnel.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_energy"), 337249089, kErrorToleranceLo); + EXPECT_NEAR(power_fresnel.GetOutput("annual_fuel_usage"), 0, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("capacity_factor"), 38.50, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_W_cycle_gross"), 372639466, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("kwh_per_kw"), 3372, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("conversion_factor"), 94.27, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("system_heat_rate"), 3.413, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_total_water_use"), 30058, kErrorToleranceLo); + } } -/// Test tcsfresnel_molten_salt with alternative defocusing strategy: Sequenced -/// Rest default configurations with respect to the No Financial model -TEST_F(CMTcsFresnelMoltenSalt, Rankine_Defocusing_Strategy_No_Financial_cmod_tcsfresnel_molten_salt) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcsfresnel_molten_salt_tucson_defocusing_strategy(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 337260930.158212, 337260930.158212 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_fuel_usage; - ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); - EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 38.500145, 38.500145 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 372651034.745992, 372651034.745992 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 3372.612727, 3372.612727 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 94.274118, 94.274118 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_heat_rate; - ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); - EXPECT_NEAR(system_heat_rate, 3.413000, 3.413000 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_total_water_use; - ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); - EXPECT_NEAR(annual_total_water_use, 30058.992530, 30058.992530 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - } +// Defocusing strategy: Sequenced +NAMESPACE_TEST(csp_fresnel, PowerFresnelCmod, SequencedDefocusing_NoFinancial) +{ + ssc_data_t defaults = tcsfresnel_molten_salt_defaults(); + CmodUnderTest power_fresnel = CmodUnderTest("tcsmslf", defaults); + power_fresnel.SetInput("fthrctrl", 1); + + int errors = power_fresnel.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_energy"), 337249089, kErrorToleranceLo); + EXPECT_NEAR(power_fresnel.GetOutput("annual_fuel_usage"), 0, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("capacity_factor"), 38.50, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_W_cycle_gross"), 372639466, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("kwh_per_kw"), 3372, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("conversion_factor"), 94.27, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("system_heat_rate"), 3.413, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_total_water_use"), 30058, kErrorToleranceLo); + } } -/// Test tcsfresnel_molten_salt with alternative Field HTF: Therminol VP-1 -/// Rest default configurations with respect to the No Financial model -TEST_F(CMTcsFresnelMoltenSalt, Rankine_Field_HTF_No_Financial_cmod_tcsfresnel_molten_salt) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcsfresnel_molten_salt_tucson_field_HTF(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 336220223.708381, 336220223.708381 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_fuel_usage; - ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); - EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 38.381343, 38.381343 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 371358844.515444, 371358844.515444 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 3362.205652, 3362.205652 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 94.310237, 94.310237 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_heat_rate; - ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); - EXPECT_NEAR(system_heat_rate, 3.413000, 3.413000 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_total_water_use; - ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); - EXPECT_NEAR(annual_total_water_use, 29948.205347, 29948.205347 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - } +// Field HTF: Therminol VP-1 +NAMESPACE_TEST(csp_fresnel, PowerFresnelCmod, TherminolVp1Htf_NoFinancial) +{ + ssc_data_t defaults = tcsfresnel_molten_salt_defaults(); + CmodUnderTest power_fresnel = CmodUnderTest("tcsmslf", defaults); + power_fresnel.SetInput("Fluid", 21); + power_fresnel.SetInput("field_fluid", 21); + power_fresnel.SetInput("is_hx", 1); + power_fresnel.SetInput("V_tank_hot_ini", 1290.5642); + power_fresnel.SetInput("vol_tank", 6452.821); + + int errors = power_fresnel.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_energy"), 336171001, kErrorToleranceLo); + EXPECT_NEAR(power_fresnel.GetOutput("annual_fuel_usage"), 0, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("capacity_factor"), 38.38, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_W_cycle_gross"), 371306661, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("kwh_per_kw"), 3362, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("conversion_factor"), 94.31, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("system_heat_rate"), 3.413, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_total_water_use"), 29944, kErrorToleranceLo); + } } -/// Test tcsfresnel_molten_salt with alternative optical characterization method: Solar position -/// Rest default configurations with respect to the No Financial model -TEST_F(CMTcsFresnelMoltenSalt, Rankine_Optical_Char_No_Financial_cmod_tcsfresnel_molten_salt) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcsfresnel_molten_salt_tucson_optical_char_solar(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 228402762.335069, 228402762.335069 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_fuel_usage; - ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); - EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 26.073401, 26.073401 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 255099173.098881, 255099173.098881 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 2284.029943, 2284.029943 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 93.265512, 93.265512 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_heat_rate; - ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); - EXPECT_NEAR(system_heat_rate, 3.413000, 3.413000 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_total_water_use; - ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); - EXPECT_NEAR(annual_total_water_use, 21782.647609, 21782.647609 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - } +// Optical characterization method: Solar position +NAMESPACE_TEST(csp_fresnel, PowerFresnelCmod, SolarPositioinOpticalChar_NoFinancial) +{ + ssc_data_t defaults = tcsfresnel_molten_salt_defaults(); + CmodUnderTest power_fresnel = CmodUnderTest("tcsmslf", defaults); + power_fresnel.SetInput("opt_model", 1); + + int errors = power_fresnel.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_energy"), 228344862, kErrorToleranceLo); + EXPECT_NEAR(power_fresnel.GetOutput("annual_fuel_usage"), 0, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("capacity_factor"), 26.07, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_W_cycle_gross"), 255036717, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("kwh_per_kw"), 2283, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("conversion_factor"), 93.26, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("system_heat_rate"), 3.413, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_total_water_use"), 21776, kErrorToleranceLo); + } } -/// Test tcsfresnel_molten_salt with alternative receiver model type: Polynomial Heat Loss model -/// Rest default configurations with respect to the No Financial model -//TEST_F(CMTcsFresnelMoltenSalt, Rankine_Polynomial_Heat_Loss_No_Financial_cmod_tcsfresnel_molten_salt) { -// -// ssc_data_t data = ssc_data_create(); -// int test_errors = tcsfresnel_molten_salt_tucson_polynomial_heat_loss_model(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 3.3431e8, 3.3431e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_fuel_usage; -// ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); -// EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 38.1633, 38.1633 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 3.70549e8, 3.70549e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 3343.1, 3343.1 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 93.9793, 93.9793 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t system_heat_rate; -// ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); -// EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 29823.1, 29823.1 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// } +//// Receiver model type: Polynomial heat loss model +//NAMESPACE_TEST(csp_fresnel, PowerFresnelCmod, PolynomialHeatLoss_NoFinancial) +//{ +// ssc_data_t defaults = tcsfresnel_molten_salt_defaults(); +// CmodUnderTest power_fresnel = CmodUnderTest("tcsmslf", defaults); +// power_fresnel.SetInput("nLoops", 148); +// power_fresnel.SetInput("rec_model", 1); +// +// int errors = power_fresnel.RunModule(); +// EXPECT_FALSE(errors); +// if (!errors) { +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_energy"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_fuel_usage"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("capacity_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_W_cycle_gross"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("kwh_per_kw"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("conversion_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("system_heat_rate"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_total_water_use"), 571408807, kErrorToleranceLo); +// } //} - -/// Test tcsfresnel_molten_salt with alternative condenser type: Evaporative -/// Rest default configurations with respect to the No Financial model -//TEST_F(CMTcsFresnelMoltenSalt, Rankine_Evap_Condenser_No_Financial_cmod_tcsfresnel_molten_salt) { -// -// ssc_data_t data = ssc_data_create(); -// int test_errors = tcsfresnel_molten_salt_tucson_evap_condenser(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 3.54549e8, 3.54549e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_fuel_usage; -// ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); -// EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi // -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 40.4736, 40.4736 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 3.84127e8, 3.84127e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 3545.49, 3545.49 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 96.1456, 96.1456 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t system_heat_rate; -// ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); -// EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 998592, 998592 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// } +//// Condenser type: Evaporative +//NAMESPACE_TEST(csp_fresnel, PowerFresnelCmod, EvaporativeCondenser_NoFinancial) +//{ +// ssc_data_t defaults = tcsfresnel_molten_salt_defaults(); +// CmodUnderTest power_fresnel = CmodUnderTest("tcsmslf", defaults); +// power_fresnel.SetInput("CT", 1); +// +// int errors = power_fresnel.RunModule(); +// EXPECT_FALSE(errors); +// if (!errors) { +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_energy"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_fuel_usage"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("capacity_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_W_cycle_gross"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("kwh_per_kw"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("conversion_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("system_heat_rate"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_total_water_use"), 571408807, kErrorToleranceLo); +// } //} - -/// Test tcsfresnel_molten_salt with alternative condenser type: Hybrid -/// Rest default configurations with respect to the No Financial model -//TEST_F(CMTcsFresnelMoltenSalt, Rankine_Hybrid_Condenser_No_Financial_cmod_tcsfresnel_molten_salt) { -// -// ssc_data_t data = ssc_data_create(); -// int test_errors = tcsfresnel_molten_salt_tucson_hybrid_condenser(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 3.30518e8, 3.30518e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_fuel_usage; -// ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); -// EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 37.7304, 37.7304 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 3.68433e8, 3.68433e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 3305.18, 3305.18 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 93.447, 93.447 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi // -// ssc_number_t system_heat_rate; -// ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); -// EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 29597.1, 29597.1 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// } +//// Condenser type: Hybrid +//NAMESPACE_TEST(csp_fresnel, PowerFresnelCmod, HybridCondenser_NoFinancial) +//{ +// ssc_data_t defaults = tcsfresnel_molten_salt_defaults(); +// CmodUnderTest power_fresnel = CmodUnderTest("tcsmslf", defaults); +// power_fresnel.SetInput("CT", 3); +// +// int errors = power_fresnel.RunModule(); +// EXPECT_FALSE(errors); +// if (!errors) { +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_energy"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_fuel_usage"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("capacity_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_W_cycle_gross"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("kwh_per_kw"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("conversion_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("system_heat_rate"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_total_water_use"), 571408807, kErrorToleranceLo); +// } //} - -/// Test tcsfresnel_molten_salt with alternative turbine inlet pressure control: Sliding pressure -/// Rest default configurations with respect to the No Financial model -//TEST_F(CMTcsFresnelMoltenSalt, Rankine_Sliding_P_No_Financial_cmod_tcsfresnel_molten_salt) { -// -// ssc_data_t data = ssc_data_create(); -// int test_errors = tcsfresnel_molten_salt_tucson_sliding_p(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 3.14357e8, 3.14357e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_fuel_usage; -// ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); -// EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 35.8856, 35.8856 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 3.49548e8, 3.49548e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi // -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 3143.58, 3143.58 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 93.6795, 93.6795 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t system_heat_rate; -// ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); -// EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 28264.2, 28264.2 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// } +//// Turbine inlet pressure control: Sliding pressure +//NAMESPACE_TEST(csp_fresnel, PowerFresnelCmod, TurbineSlidingPressure_NoFinancial) +//{ +// ssc_data_t defaults = tcsfresnel_molten_salt_defaults(); +// CmodUnderTest power_fresnel = CmodUnderTest("tcsmslf", defaults); +// power_fresnel.SetInput("tech_type", 3); +// +// int errors = power_fresnel.RunModule(); +// EXPECT_FALSE(errors); +// if (!errors) { +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_energy"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_fuel_usage"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("capacity_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_W_cycle_gross"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("kwh_per_kw"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("conversion_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("system_heat_rate"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_total_water_use"), 571408807, kErrorToleranceLo); +// } //} - -/// Test tcsfresnel_molten_salt with alternative HTF freeze protection mode: Electric heating -/// Rest default configurations with respect to the No Financial model -//TEST_F(CMTcsFresnelMoltenSalt, Rankine_HTF_Freeze_Protection_No_Financial_cmod_tcsfresnel_molten_salt) { -// -// ssc_data_t data = ssc_data_create(); -// int test_errors = tcsfresnel_molten_salt_tucson_HTF_freeze_protection(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 2.95735e8, 2.95735e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi // -// ssc_number_t annual_fuel_usage; -// ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); -// EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 33.7597, 33.7597 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 3.68433e8, 3.68433e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 2957.35, 2957.35 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 83.6129, 83.6129 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t system_heat_rate; -// ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); -// EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 29597.1, 29597.1 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// } +//// HTF freeze protection mode: Electric heating +//NAMESPACE_TEST(csp_fresnel, PowerFresnelCmod, ElectricFreezeProtection_NoFinancial) +//{ +// ssc_data_t defaults = tcsfresnel_molten_salt_defaults(); +// CmodUnderTest power_fresnel = CmodUnderTest("tcsmslf", defaults); +// power_fresnel.SetInput("fp_mode", 1); +// +// int errors = power_fresnel.RunModule(); +// EXPECT_FALSE(errors); +// if (!errors) { +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_energy"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_fuel_usage"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("capacity_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_W_cycle_gross"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("kwh_per_kw"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("conversion_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("system_heat_rate"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_total_water_use"), 571408807, kErrorToleranceLo); +// } //} - -/// Test tcsfresnel_molten_salt with alternative storage HTF: Therminol VP-1 -/// Rest default configurations with respect to the No Financial model -//TEST_F(CMTcsFresnelMoltenSalt, Rankine_Storage_HTF_No_Financial_cmod_tcsfresnel_molten_salt) { -// -// ssc_data_t data = ssc_data_create(); -// int test_errors = tcsfresnel_molten_salt_tucson_storage_HTF(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 3.35099e8, 3.35099e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_fuel_usage; -// ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); -// EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 38.2534, 38.2534 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 3.72551e8, 3.72551e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 3351, 3351 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi // -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 93.6951, 93.6951 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t system_heat_rate; -// ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); -// EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 29869.8, 29869.8 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// } +//// Storage HTF: Therminol VP-1 +//NAMESPACE_TEST(csp_fresnel, PowerFresnelCmod, TherminolVp1Storage_NoFinancial) +//{ +// ssc_data_t defaults = tcsfresnel_molten_salt_defaults(); +// CmodUnderTest power_fresnel = CmodUnderTest("tcsmslf", defaults); +// power_fresnel.SetInput("store_fluid", 21); +// power_fresnel.SetInput("is_hx", 1); +// power_fresnel.SetInput("V_tank_hot_ini", 1963.66443); +// power_fresnel.SetInput("vol_tank", 9818.3223); +// +// int errors = power_fresnel.RunModule(); +// EXPECT_FALSE(errors); +// if (!errors) { +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_energy"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_fuel_usage"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("capacity_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_W_cycle_gross"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("kwh_per_kw"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("conversion_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("system_heat_rate"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_total_water_use"), 571408807, kErrorToleranceLo); +// } //} - -/// Test tcsfresnel_molten_salt with alternative Power Cycle: User Defined -/// Rest default configurations with respect to the No Financial model -//TEST_F(CMTcsFresnelMoltenSalt, UserDefined_Default_No_Financial_cmod_tcsfresnel_molten_salt) { -// -// ssc_data_t data = ssc_data_create(); -// int test_errors = tcsfresnel_molten_salt_tucson_userdefined_default(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 3.29573e8, 3.29573e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_fuel_usage; -// ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); -// EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi // -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 37.6225, 37.6225 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 3.53789e8, 3.53789e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 3295.73, 3295.73 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 97.0368, 97.0368 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t system_heat_rate; -// ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); -// EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 2708.93, 2708.93 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// } -//} \ No newline at end of file +//// Power Cycle: User Defined +//NAMESPACE_TEST(csp_fresnel, PowerFresnelCmod, UserDefinedPowerCycle_NoFinancial) +//{ +// ssc_data_t defaults = tcsfresnel_molten_salt_defaults(); +// CmodUnderTest power_fresnel = CmodUnderTest("tcsmslf", defaults); +// power_fresnel.SetInput("pc_config", 1); +// +// int errors = power_fresnel.RunModule(); +// EXPECT_FALSE(errors); +// if (!errors) { +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_energy"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_fuel_usage"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("capacity_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_W_cycle_gross"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("kwh_per_kw"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("conversion_factor"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("system_heat_rate"), 571408807, kErrorToleranceLo); +// EXPECT_NEAR_FRAC(power_fresnel.GetOutput("annual_total_water_use"), 571408807, kErrorToleranceLo); +// } +//} diff --git a/third_party/ssc/test/ssc_test/cmod_tcsfresnel_molten_salt_test.h b/third_party/ssc/test/ssc_test/cmod_tcsfresnel_molten_salt_test.h deleted file mode 100644 index 95cb1bf09fb..00000000000 --- a/third_party/ssc/test/ssc_test/cmod_tcsfresnel_molten_salt_test.h +++ /dev/null @@ -1,53 +0,0 @@ -#include - -#include "core.h" -#ifndef _CMOD_TCSFRESNEL_MOLTEN_SALT_TEST_H_ -#define _CMOD_TCSFRESNEL_MOLTEN_SALT_TEST_H_ - -#include "vartab.h" -#include "../ssc/common.h" -#include "../tcs_test/tcsfresnel_molten_salt_cases.h" - -/** - * CMTcsFresnelMoltenSalt tests the cmod_tcsfesnel_molten_salt using the SAM code generator to generate data - * Eventually a method can be written to write this data to a vartable so that lower-level methods of - * tcsfesnel_molten_salt can be tested - * For now, this uses the SSCAPI interfaces to run the compute module and compare results - */ -class CMTcsFresnelMoltenSalt : public ::testing::Test { - -public: - - ssc_data_t data; - ssc_number_t calculated_value; - ssc_number_t * calculated_array; - double m_error_tolerance_hi = 0.01; // 1.0% - double m_error_tolerance_lo = 0.001; // 0.1% - - void SetUp() - { - data = ssc_data_create(); - tcsfresnel_molten_salt_default(data); - calculated_array = new ssc_number_t[8760]; - } - void TearDown() { - if (data) { - ssc_data_free(data); - data = nullptr; - } - if (calculated_array) { - delete[] calculated_array; - } - } - void SetCalculated(std::string name) - { - ssc_data_get_number(data, const_cast(name.c_str()), &calculated_value); - } - void SetCalculatedArray(std::string name) - { - int n; - calculated_array = ssc_data_get_array(data, const_cast(name.c_str()), &n); - } -}; - -#endif // !_CMOD_TCSFRESNEL_MOLTEN_SALT_TEST_H_ diff --git a/third_party/ssc/test/ssc_test/cmod_tcsmolten_salt_test.cpp b/third_party/ssc/test/ssc_test/cmod_tcsmolten_salt_test.cpp index 25f1544fe87..48e00f90cf2 100644 --- a/third_party/ssc/test/ssc_test/cmod_tcsmolten_salt_test.cpp +++ b/third_party/ssc/test/ssc_test/cmod_tcsmolten_salt_test.cpp @@ -1,765 +1,92 @@ #include - -#include "cmod_tcsmolten_salt_test.h" -#include "../tcs_test/tcsmolten_salt_cases.h" -#include "../input_cases/weather_inputs.h" - -/// Test tcsmolten_salt with all defaults and the single owner financial model -TEST_F(CMTcsMoltenSalt, Rankine_Default_SingleOwner_cmod_tcsmolten_salt) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcsmolten_salt_daggett_default(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 571408807.373179, 571408807.373179 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t land_area_base; - ssc_data_get_number(data, "land_area_base", &land_area_base); - EXPECT_NEAR(land_area_base, 1847.040000, 1847.040000 * m_error_tolerance_hi) << "Land Area Base"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 63.023494, 63.023494 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 642428580.492706, 642428580.492706 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 5520.858042, 5520.858042 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 88.945110, 88.945110 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t N_hel; - ssc_data_get_number(data, "N_hel", &N_hel); - EXPECT_NEAR(N_hel, 8790, 8790 * m_error_tolerance_hi) << "Number of Heliostats"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t rec_height; - ssc_data_get_number(data, "rec_height", &rec_height); - EXPECT_NEAR(rec_height, 21.602900, 21.602900 * m_error_tolerance_hi) << "Rec Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t A_sf; - ssc_data_get_number(data, "A_sf", &A_sf); - EXPECT_NEAR(A_sf, 1269054.492000, 1269054.492000 * m_error_tolerance_hi) << "Solar Field Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t D_rec; - ssc_data_get_number(data, "D_rec", &D_rec); - EXPECT_NEAR(D_rec, 17.650000, 17.650000 * m_error_tolerance_hi) << "Receiver Outer Diameter"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_total_water_use; - ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); - EXPECT_NEAR(annual_total_water_use, 98221.126175, 98221.126175 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t csp_pt_cost_total_land_area; - ssc_data_get_number(data, "csp.pt.cost.total_land_area", &csp_pt_cost_total_land_area); - EXPECT_NEAR(csp_pt_cost_total_land_area, 1892.040000, 1892.040000 * m_error_tolerance_hi) << "Total Land Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t h_tower; - ssc_data_get_number(data, "h_tower", &h_tower); - EXPECT_NEAR(h_tower, 193.458000, 193.458000 * m_error_tolerance_hi) << "Tower Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - //ssc_number_t VARIABLE; - //ssc_data_get_number(data, "VARIABLE", &VARIABLE); - //EXPECT_NEAR(VARIABLE, EXP_VAL, EXP_VAL * m_error_tolerance_hi) << "DESCRIPTION"; // choose either m_error_tolerance_lo or m_error_tolerance_hi +#include "tcsmolten_salt_defaults.h" +#include "cmod_csp_tower_eqns.h" +#include "csp_common_test.h" +#include "vs_google_test_explorer_namespace.h" + +namespace csp_tower {} +using namespace csp_tower; + +//========Tests=================================================================================== +NAMESPACE_TEST(csp_tower, PowerTowerCmod, Default_NoFinancial) +{ + ssc_data_t defaults = tcsmolten_salt_defaults(); + CmodUnderTest power_tower = CmodUnderTest("tcsmolten_salt", defaults); + int errors = power_tower.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(power_tower.GetOutput("annual_energy"), 571408807, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("land_area_base"), 1847, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("capacity_factor"), 63.02, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("annual_W_cycle_gross"), 638478912, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("kwh_per_kw"), 5521, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("conversion_factor"), 89.55, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("N_hel"), 8790, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("rec_height"), 21.60, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("A_sf"), 1269054, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("D_rec"), 17.65, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("annual_total_water_use"), 98402, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("csp.pt.cost.total_land_area"), 1892, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("h_tower"), 193.5, kErrorToleranceLo); } -} - -/// Test tcsmolten_salt with alternative turbine inlet pressure control: Sliding pressure -/// Rest default configurations with respect to the single owner financial model -TEST_F(CMTcsMoltenSalt, Rankine_Sliding_P_SingleOwner_cmod_tcsmolten_salt) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcsmolten_salt_daggett_sliding_pressure(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 576302445.677569, 576302445.677569 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t land_area_base; - ssc_data_get_number(data, "land_area_base", &land_area_base); - EXPECT_NEAR(land_area_base, 1847.040000, 1847.040000 * m_error_tolerance_hi) << "Land Area Base"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 63.563237, 63.563237 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 647174668.052062, 647174668.052062 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 5568.139572, 5568.139572 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 89.048981, 89.048981 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t N_hel; - ssc_data_get_number(data, "N_hel", &N_hel); - EXPECT_NEAR(N_hel, 8790, 8790 * m_error_tolerance_hi) << "Number of Heliostats"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t rec_height; - ssc_data_get_number(data, "rec_height", &rec_height); - EXPECT_NEAR(rec_height, 21.602900, 21.602900 * m_error_tolerance_hi) << "Rec Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t A_sf; - ssc_data_get_number(data, "A_sf", &A_sf); - EXPECT_NEAR(A_sf, 1269054.492000, 1269054.492000 * m_error_tolerance_hi) << "Solar Field Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t D_rec; - ssc_data_get_number(data, "D_rec", &D_rec); - EXPECT_NEAR(D_rec, 17.650000, 17.650000 * m_error_tolerance_hi) << "Receiver Outer Diameter"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_total_water_use; - ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); - EXPECT_NEAR(annual_total_water_use, 98238.031245, 98238.031245 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t csp_pt_cost_total_land_area; - ssc_data_get_number(data, "csp.pt.cost.total_land_area", &csp_pt_cost_total_land_area); - EXPECT_NEAR(csp_pt_cost_total_land_area, 1892.040000, 1892.040000 * m_error_tolerance_hi) << "Total Land Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t h_tower; - ssc_data_get_number(data, "h_tower", &h_tower); - EXPECT_NEAR(h_tower, 193.458000, 193.458000 * m_error_tolerance_hi) << "Tower Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - //ssc_number_t VARIABLE; - //ssc_data_get_number(data, "VARIABLE", &VARIABLE); - //EXPECT_NEAR(VARIABLE, EXP_VAL, EXP_VAL * m_error_tolerance_hi) << "DESCRIPTION"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - } -} - -/// Test tcsmolten_salt with alternative flow pattern: Flow pattern 8 -/// Rest default configurations with respect to the single owner financial model -TEST_F(CMTcsMoltenSalt, Rankine_Flow_Pattern_SingleOwner_cmod_tcsmolten_salt) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcsmolten_salt_daggett_flow_pattern(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 518055493.136035, 518055493.136035 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t land_area_base; - ssc_data_get_number(data, "land_area_base", &land_area_base); - EXPECT_NEAR(land_area_base, 1847.040000, 1847.040000 * m_error_tolerance_hi) << "Land Area Base"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 57.138894, 57.138894 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 646287965.853696, 646287965.853696 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 5005.367083, 5005.367083 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 80.158617, 80.158617 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t N_hel; - ssc_data_get_number(data, "N_hel", &N_hel); - EXPECT_NEAR(N_hel, 8790, 8790 * m_error_tolerance_hi) << "Number of Heliostats"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t rec_height; - ssc_data_get_number(data, "rec_height", &rec_height); - EXPECT_NEAR(rec_height, 21.602900, 21.602900 * m_error_tolerance_hi) << "Rec Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t A_sf; - ssc_data_get_number(data, "A_sf", &A_sf); - EXPECT_NEAR(A_sf, 1269054.492000, 1269054.492000 * m_error_tolerance_hi) << "Solar Field Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t D_rec; - ssc_data_get_number(data, "D_rec", &D_rec); - EXPECT_NEAR(D_rec, 17.650000, 17.650000 * m_error_tolerance_hi) << "Receiver Outer Diameter"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_total_water_use; - ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); - EXPECT_NEAR(annual_total_water_use, 98470.230665, 98470.230665 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t csp_pt_cost_total_land_area; - ssc_data_get_number(data, "csp.pt.cost.total_land_area", &csp_pt_cost_total_land_area); - EXPECT_NEAR(csp_pt_cost_total_land_area, 1892.040000, 1892.040000 * m_error_tolerance_hi) << "Total Land Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t h_tower; - ssc_data_get_number(data, "h_tower", &h_tower); - EXPECT_NEAR(h_tower, 193.458000, 193.458000 * m_error_tolerance_hi) << "Tower Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - //ssc_number_t VARIABLE; - //ssc_data_get_number(data, "VARIABLE", &VARIABLE); - //EXPECT_NEAR(VARIABLE, EXP_VAL, EXP_VAL * m_error_tolerance_hi) << "DESCRIPTION"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - } -} - -/// Testing Molten Salt Power Tower UI Equations - -TEST(Mspt_cmod_csp_tower_eqns, NoData) { - ASSERT_THROW(MSPT_System_Design_Equations(nullptr), std::runtime_error); - ASSERT_THROW(Tower_SolarPilot_Solar_Field_Equations(nullptr), std::runtime_error); - //ASSERT_THROW(MSPT_Receiver_Equations(nullptr), std::runtime_error); - //ASSERT_THROW(MSPT_System_Control_Equations(nullptr), std::runtime_error); - //ASSERT_THROW(Tower_SolarPilot_Capital_Costs_MSPT_Equations(nullptr), std::runtime_error); - //ASSERT_THROW(Tower_SolarPilot_Capital_Costs_DSPT_Equations(nullptr), std::runtime_error); - //ASSERT_THROW(Tower_SolarPilot_Capital_Costs_ISCC_Equations(nullptr), std::runtime_error); -} -//TEST(Mspt_cmod_csp_tower_eqns, MissingVariables) { -// var_table* vd = new var_table; -// ASSERT_THROW(MSPT_System_Design_Equations(vd), std::runtime_error); -// ASSERT_THROW(Tower_SolarPilot_Solar_Field_Equations(vd), std::runtime_error); -// //ASSERT_THROW(MSPT_Receiver_Equations(vd), std::runtime_error); -// //ASSERT_THROW(MSPT_System_Control_Equations(vd), std::runtime_error); -// //ASSERT_THROW(Tower_SolarPilot_Capital_Costs_MSPT_Equations(vd), std::runtime_error); -// //ASSERT_THROW(Tower_SolarPilot_Capital_Costs_DSPT_Equations(vd), std::runtime_error); -// //ASSERT_THROW(Tower_SolarPilot_Capital_Costs_ISCC_Equations(vd), std::runtime_error); -//} - -TEST(Mspt_cmod_csp_tower_eqns, Case1) { - double error_tolerance = 0.01; - var_table* vd = new var_table; - vd->assign("design_eff", 0.412); - vd->assign("gross_net_conversion_factor", 0.9); - vd->assign("P_ref", 115.); - vd->assign("solarm", 2.4); - vd->assign("tshours", 10.); - - MSPT_System_Design_Equations(vd); - - double nameplate = vd->lookup("nameplate")->num; - double q_pb_design = vd->lookup("q_pb_design")->num; - double q_rec_des = vd->lookup("q_rec_des")->num; - double tshours_sf = vd->lookup("tshours_sf")->num; - ASSERT_NEAR(nameplate, 103.5, 103.5 * error_tolerance); - ASSERT_NEAR(q_pb_design, 279., 279. * error_tolerance); - ASSERT_NEAR(q_rec_des, 670., 670. * error_tolerance); - ASSERT_NEAR(tshours_sf, 4.16667, 4.16667 * error_tolerance); -} - -TEST(Mspt_cmod_csp_tower_eqns, Case2) { - double error_tolerance = 0.01; - var_table* vd = new var_table; - vd->assign("c_atm_0", 0.006789); - vd->assign("c_atm_1", 0.1046); - vd->assign("c_atm_2", -0.017); - vd->assign("c_atm_3", 0.002845); - vd->assign("csp_pt_sf_fixed_land_area", 45.); - vd->assign("csp_pt_sf_land_overhead_factor", 1.); - vd->assign("dens_mirror", 0.97); - vd->assign("dni_des", 950.); - vd->assign("h_tower", 193.458); - vd->assign("helio_height", 12.2); - vd->assign("helio_optical_error_mrad", 1.53); - util::matrix_t helio_positions(8790, 2, 1.e3); - vd->assign("helio_positions", helio_positions); - vd->assign("helio_width", 12.2); - vd->assign("land_area_base", 1847.04); - vd->assign("land_max", 9.5); - vd->assign("land_min", 0.75); - vd->assign("override_layout", 0); - vd->assign("override_opt", 0); - vd->assign("q_rec_des", 670.); - - Tower_SolarPilot_Solar_Field_Equations(vd); - - double a_sf_ui = vd->lookup("a_sf_ui")->num; - double c_atm_info = vd->lookup("c_atm_info")->num; - double csp_pt_sf_heliostat_area = vd->lookup("csp_pt_sf_heliostat_area")->num; - double csp_pt_sf_total_land_area = vd->lookup("csp_pt_sf_total_land_area")->num; - //double csp_pt_sf_total_reflective_area = vd->lookup("csp_pt_sf_total_reflective_area")->num; // This one is not being read in the UI - double csp_pt_sf_tower_height = vd->lookup("csp_pt_sf_tower_height")->num; - double dni_des_calc = vd->lookup("dni_des_calc")->num; - double error_equiv = vd->lookup("error_equiv")->num; - double field_model_type = vd->lookup("field_model_type")->num; - double helio_area_tot = vd->lookup("helio_area_tot")->num; - double is_optimize = vd->lookup("is_optimize")->num; - double land_max_calc = vd->lookup("land_max_calc")->num; - double land_min_calc = vd->lookup("land_min_calc")->num; - double n_hel = vd->lookup("n_hel")->num; - double opt_algorithm = vd->lookup("opt_algorithm")->num; - double opt_flux_penalty = vd->lookup("opt_flux_penalty")->num; - double q_design = vd->lookup("q_design")->num; - ASSERT_NEAR(a_sf_ui, 1269055., 1269055. * error_tolerance); - ASSERT_NEAR(c_atm_info, 12.97, 12.97 * error_tolerance); - ASSERT_NEAR(csp_pt_sf_heliostat_area, 144.375, 144.375 * error_tolerance); - ASSERT_NEAR(csp_pt_sf_total_land_area, 1892., 1892. * error_tolerance); - //ASSERT_NEAR(csp_pt_sf_total_reflective_area, 1269056.25, 1269056.25 * error_tolerance); // This one is not being read in the UI - ASSERT_NEAR(csp_pt_sf_tower_height, 193.458, 193.458 * error_tolerance); - ASSERT_NEAR(dni_des_calc, 950., 950. * error_tolerance); - ASSERT_NEAR(error_equiv, 4.32749, 4.32749 * error_tolerance); - ASSERT_NEAR(field_model_type, 2., 2. * error_tolerance); - ASSERT_NEAR(helio_area_tot, 1269055., 1269055. * error_tolerance); - ASSERT_NEAR(is_optimize, 0., 0. * error_tolerance); - ASSERT_NEAR(land_max_calc, 1837.85, 1837.85 * error_tolerance); - ASSERT_NEAR(land_min_calc, 145.094, 145.094 * error_tolerance); - ASSERT_NEAR(n_hel, 8790., 8790. * error_tolerance); - ASSERT_NEAR(opt_algorithm, 1., 1. * error_tolerance); - ASSERT_NEAR(opt_flux_penalty, 0.25, 0.25 * error_tolerance); - ASSERT_NEAR(q_design, 670., 670. * error_tolerance); -} - -TEST(Mspt_cmod_csp_tower_eqns, Case2b) { - // Testing period use in variable names - double error_tolerance = 0.01; - var_table* vd = new var_table; - vd->assign("c_atm_0", 0.006789); - vd->assign("c_atm_1", 0.1046); - vd->assign("c_atm_2", -0.017); - vd->assign("c_atm_3", 0.002845); - vd->assign("csp.pt.sf.fixed_land_area", 45.); - vd->assign("csp.pt.sf.land_overhead_factor", 1.); - vd->assign("dens_mirror", 0.97); - vd->assign("dni_des", 950.); - vd->assign("h_tower", 193.458); - vd->assign("helio_height", 12.2); - vd->assign("helio_optical_error_mrad", 1.53); - util::matrix_t helio_positions(8790, 2, 1.e3); - vd->assign("helio_positions", helio_positions); - vd->assign("helio_width", 12.2); - vd->assign("land_area_base", 1847.04); - vd->assign("land_max", 9.5); - vd->assign("land_min", 0.75); - vd->assign("override_layout", 0); - vd->assign("override_opt", 0); - vd->assign("q_rec_des", 670.); - - Tower_SolarPilot_Solar_Field_Equations(vd); - - double a_sf_ui = vd->lookup("a_sf_ui")->num; - double c_atm_info = vd->lookup("c_atm_info")->num; - double csp_pt_sf_heliostat_area = vd->lookup("csp.pt.sf.heliostat_area")->num; - double csp_pt_sf_total_land_area = vd->lookup("csp.pt.sf.total_land_area")->num; - //double csp_pt_sf_total_reflective_area = vd->lookup("csp.pt.sf.total_reflective_area")->num; // This one is not being read in the UI - double csp_pt_sf_tower_height = vd->lookup("csp.pt.sf.tower_height")->num; - double dni_des_calc = vd->lookup("dni_des_calc")->num; - double error_equiv = vd->lookup("error_equiv")->num; - double field_model_type = vd->lookup("field_model_type")->num; - double helio_area_tot = vd->lookup("helio_area_tot")->num; - double is_optimize = vd->lookup("is_optimize")->num; - double land_max_calc = vd->lookup("land_max_calc")->num; - double land_min_calc = vd->lookup("land_min_calc")->num; - double n_hel = vd->lookup("n_hel")->num; - double opt_algorithm = vd->lookup("opt_algorithm")->num; - double opt_flux_penalty = vd->lookup("opt_flux_penalty")->num; - double q_design = vd->lookup("q_design")->num; - ASSERT_NEAR(a_sf_ui, 1269055., 1269055. * error_tolerance); - ASSERT_NEAR(c_atm_info, 12.97, 12.97 * error_tolerance); - ASSERT_NEAR(csp_pt_sf_heliostat_area, 144.375, 144.375 * error_tolerance); - ASSERT_NEAR(csp_pt_sf_total_land_area, 1892., 1892. * error_tolerance); - //ASSERT_NEAR(csp_pt_sf_total_reflective_area, 1269056.25, 1269056.25 * error_tolerance); // This one is not being read in the UI - ASSERT_NEAR(csp_pt_sf_tower_height, 193.458, 193.458 * error_tolerance); - ASSERT_NEAR(dni_des_calc, 950., 950. * error_tolerance); - ASSERT_NEAR(error_equiv, 4.32749, 4.32749 * error_tolerance); - ASSERT_NEAR(field_model_type, 2., 2. * error_tolerance); - ASSERT_NEAR(helio_area_tot, 1269055., 1269055. * error_tolerance); - ASSERT_NEAR(is_optimize, 0., 0. * error_tolerance); - ASSERT_NEAR(land_max_calc, 1837.85, 1837.85 * error_tolerance); - ASSERT_NEAR(land_min_calc, 145.094, 145.094 * error_tolerance); - ASSERT_NEAR(n_hel, 8790., 8790. * error_tolerance); - ASSERT_NEAR(opt_algorithm, 1., 1. * error_tolerance); - ASSERT_NEAR(opt_flux_penalty, 0.25, 0.25 * error_tolerance); - ASSERT_NEAR(q_design, 670., 670. * error_tolerance); -} - -TEST(Mspt_cmod_csp_tower_eqns, Case3) { - double error_tolerance = 0.01; - var_table* vd = new var_table; - vd->assign("t_htf_cold_des", 290.); - vd->assign("t_htf_hot_des", 574.); - vd->assign("rec_htf", 17); - vd->assign("csp_pt_rec_max_oper_frac", 1.2); - vd->assign("q_rec_des", 660.9); - vd->assign("rec_d_spec", 15.); - vd->assign("csp_pt_rec_cav_ap_hw_ratio", 1.2); - vd->assign("d_rec", 17.65); - vd->assign("rec_height", 23.8084); - vd->assign("h_tower", 193.458); - vd->assign("piping_length_mult", 2.6); - vd->assign("piping_length_const", 0.); - vd->assign("piping_loss", 10200.); - std::vector field_fluid_properties{ 1, 7, 0, 0, 0, 0, 0, 0, 0 }; - util::matrix_t field_fl_props(1, 9, &field_fluid_properties); - vd->assign("field_fl_props", field_fl_props); - - MSPT_Receiver_Equations(vd); - - double csp_pt_rec_htf_t_avg = vd->lookup("csp_pt_rec_htf_t_avg")->num; - double csp_pt_rec_htf_c_avg = vd->lookup("csp_pt_rec_htf_c_avg")->num; - double csp_pt_rec_max_flow_to_rec = vd->lookup("csp_pt_rec_max_flow_to_rec")->num; - double csp_pt_rec_cav_ap_height = vd->lookup("csp_pt_rec_cav_ap_height")->num; - double rec_aspect = vd->lookup("rec_aspect")->num; - double piping_length = vd->lookup("piping_length")->num; - double piping_loss_tot = vd->lookup("piping_loss_tot")->num; - ASSERT_NEAR(csp_pt_rec_htf_t_avg, 432., 432. * error_tolerance); - ASSERT_NEAR(csp_pt_rec_htf_c_avg, 1.5066, 1.5066 * error_tolerance); - ASSERT_NEAR(csp_pt_rec_max_flow_to_rec, 1853.5, 1853.5 * error_tolerance); - ASSERT_NEAR(csp_pt_rec_cav_ap_height, 18., 18. * error_tolerance); - ASSERT_NEAR(rec_aspect, 1.349, 1.349 * error_tolerance); - ASSERT_NEAR(piping_length, 502.991, 502.991 * error_tolerance); - ASSERT_NEAR(piping_loss_tot, 5130.51, 5130.51 * error_tolerance); -} - -TEST(Mspt_cmod_csp_tower_eqns, Case3b) { - double error_tolerance = 0.01; - var_table* vd = new var_table; - vd->assign("t_htf_cold_des", 290.); - vd->assign("t_htf_hot_des", 574.); - vd->assign("rec_htf", 17); - vd->assign("csp.pt.rec.max_oper_frac", 1.2); - vd->assign("q_rec_des", 660.9); - vd->assign("rec_d_spec", 15.); - vd->assign("csp.pt.rec.cav_ap_hw_ratio", 1.2); - vd->assign("d_rec", 17.65); - vd->assign("rec_height", 23.8084); - vd->assign("h_tower", 193.458); - vd->assign("piping_length_mult", 2.6); - vd->assign("piping_length_const", 0.); - vd->assign("piping_loss", 10200.); - std::vector field_fluid_properties{ 1, 7, 0, 0, 0, 0, 0, 0, 0 }; - util::matrix_t field_fl_props(1, 9, &field_fluid_properties); - vd->assign("field_fl_props", field_fl_props); - - MSPT_Receiver_Equations(vd); - - double csp_pt_rec_htf_t_avg = vd->lookup("csp.pt.rec.htf_t_avg")->num; - double csp_pt_rec_htf_c_avg = vd->lookup("csp.pt.rec.htf_c_avg")->num; - double csp_pt_rec_max_flow_to_rec = vd->lookup("csp.pt.rec.max_flow_to_rec")->num; - double csp_pt_rec_cav_ap_height = vd->lookup("csp.pt.rec.cav_ap_height")->num; - double rec_aspect = vd->lookup("rec_aspect")->num; - double piping_length = vd->lookup("piping_length")->num; - double piping_loss_tot = vd->lookup("piping_loss_tot")->num; - ASSERT_NEAR(csp_pt_rec_htf_t_avg, 432., 432. * error_tolerance); - ASSERT_NEAR(csp_pt_rec_htf_c_avg, 1.5066, 1.5066 * error_tolerance); - ASSERT_NEAR(csp_pt_rec_max_flow_to_rec, 1853.5, 1853.5 * error_tolerance); - ASSERT_NEAR(csp_pt_rec_cav_ap_height, 18., 18. * error_tolerance); - ASSERT_NEAR(rec_aspect, 1.349, 1.349 * error_tolerance); - ASSERT_NEAR(piping_length, 502.991, 502.991 * error_tolerance); - ASSERT_NEAR(piping_loss_tot, 5130.51, 5130.51 * error_tolerance); + //ssc_data_t defaults = singleowner_defaults(); + //CmodUnderTest singleowner = CmodUnderTest("singleowner", defaults); + //int errors = singleowner.RunModule(); + //EXPECT_FALSE(errors); + //if (!errors) { + // EXPECT_NEAR_FRAC(singleowner.GetOutput(""), , kErrorToleranceLo); + //} } -TEST(Mspt_cmod_csp_tower_eqns, Case4) { - double error_tolerance = 0.01; - ssc_data_t data = ssc_data_create(); - auto data_vtab = static_cast(data); - - data_vtab->assign("P_ref", 115.); - data_vtab->assign("design_eff", 0.412); - data_vtab->assign("tshours", 10.); - data_vtab->assign("T_htf_hot_des", 574.); - data_vtab->assign("T_htf_cold_des", 290.); - data_vtab->assign("rec_htf", 17); - std::vector field_fluid_properties{ 1, 7, 0, 0, 0, 0, 0, 0, 0 }; - util::matrix_t field_fl_props(1, 9, &field_fluid_properties); - data_vtab->assign("field_fl_props", field_fl_props); - data_vtab->assign("h_tank_min", 1.); - data_vtab->assign("h_tank", 12.); - data_vtab->assign("tank_pairs", 1.); - data_vtab->assign("u_tank", 0.4); - - int errors = run_module(data, "ui_tes_calcs"); - EXPECT_FALSE(errors); - - double q_tes = data_vtab->as_number("q_tes"); - double tes_avail_vol = data_vtab->as_number("tes_avail_vol"); - double vol_tank = data_vtab->as_number("vol_tank"); - double csp_pt_tes_tank_diameter = data_vtab->as_number("csp_pt_tes_tank_diameter"); - double q_dot_tes_est = data_vtab->as_number("q_dot_tes_est"); - double csp_pt_tes_htf_density = data_vtab->as_number("csp_pt_tes_htf_density"); - ASSERT_NEAR(q_tes, 2791.3, 2791.3 * error_tolerance); - ASSERT_NEAR(tes_avail_vol, 12986., 12986. * error_tolerance); - ASSERT_NEAR(vol_tank, 14166., 14166. * error_tolerance); - ASSERT_NEAR(csp_pt_tes_tank_diameter, 38.8, 38.8 * error_tolerance); - ASSERT_NEAR(q_dot_tes_est, 0.73, 0.73 * error_tolerance); - ASSERT_NEAR(csp_pt_tes_htf_density, 1808.48, 1808.48 * error_tolerance); -} - -TEST(Mspt_cmod_csp_tower_eqns, Case4b) { - double error_tolerance = 0.01; - ssc_data_t data = ssc_data_create(); - auto data_vtab = static_cast(data); - - data_vtab->assign("P_ref", 115.); - data_vtab->assign("design_eff", 0.412); - data_vtab->assign("tshours", 10.); - data_vtab->assign("T_htf_hot_des", 574.); - data_vtab->assign("T_htf_cold_des", 290.); - data_vtab->assign("rec_htf", 17); - std::vector field_fluid_properties{ 1, 7, 0, 0, 0, 0, 0, 0, 0 }; - util::matrix_t field_fl_props(1, 9, &field_fluid_properties); - data_vtab->assign("field_fl_props", field_fl_props); - data_vtab->assign("h_tank_min", 1.); - data_vtab->assign("h_tank", 12.); - data_vtab->assign("tank_pairs", 1.); - data_vtab->assign("u_tank", 0.4); - - int errors = run_module(data, "ui_tes_calcs"); +NAMESPACE_TEST(csp_tower, PowerTowerCmod, SlidingPressure_NoFinancial) +{ + ssc_data_t defaults = tcsmolten_salt_defaults(); + CmodUnderTest power_tower = CmodUnderTest("tcsmolten_salt", defaults); + power_tower.SetInput("tech_type", 3); // change to sliding pressure + int errors = power_tower.RunModule(); EXPECT_FALSE(errors); - - double q_tes = data_vtab->as_number("q_tes"); - double tes_avail_vol = data_vtab->as_number("tes_avail_vol"); - double vol_tank = data_vtab->as_number("vol_tank"); - double csp_pt_tes_tank_diameter = data_vtab->as_number("csp.pt.tes.tank_diameter"); - double q_dot_tes_est = data_vtab->as_number("q_dot_tes_est"); - double csp_pt_tes_htf_density = data_vtab->as_number("csp.pt.tes.htf_density"); - ASSERT_NEAR(q_tes, 2791.3, 2791.3 * error_tolerance); - ASSERT_NEAR(tes_avail_vol, 12986., 12986. * error_tolerance); - ASSERT_NEAR(vol_tank, 14166., 14166. * error_tolerance); - ASSERT_NEAR(csp_pt_tes_tank_diameter, 38.8, 38.8 * error_tolerance); - ASSERT_NEAR(q_dot_tes_est, 0.73, 0.73 * error_tolerance); - ASSERT_NEAR(csp_pt_tes_htf_density, 1808.48, 1808.48 * error_tolerance); -} - -TEST(Mspt_cmod_csp_tower_eqns, Case5) { - double error_tolerance = 0.01; - var_table* vd = new var_table; - vd->assign("bop_par", 0.); - vd->assign("bop_par_f", 1.); - vd->assign("bop_par_0", 0.); - vd->assign("bop_par_1", 0.483); - vd->assign("bop_par_2", 0.); - vd->assign("p_ref", 115.); - vd->assign("aux_par", 0.023); - vd->assign("aux_par_f", 1.); - vd->assign("aux_par_0", 0.483); - vd->assign("aux_par_1", 0.571); - vd->assign("aux_par_2", 0.); - vd->assign("disp_wlim_maxspec", 1.); - vd->assign("constant", 4.); - - MSPT_System_Control_Equations(vd); - - double csp_pt_par_calc_bop = vd->lookup("csp_pt_par_calc_bop")->num; - double csp_pt_par_calc_aux = vd->lookup("csp_pt_par_calc_aux")->num; - double disp_wlim_max = vd->lookup("disp_wlim_max")->num; - util::matrix_t wlim_series = vd->lookup("wlim_series")->num; - ASSERT_NEAR(csp_pt_par_calc_bop, 0., 0. * error_tolerance); - ASSERT_NEAR(csp_pt_par_calc_aux, 2.78783, 2.78783 * error_tolerance); - ASSERT_NEAR(disp_wlim_max, 0.96, 0.96 * error_tolerance); - ASSERT_NEAR(wlim_series.ncells(), 8760, 0.); - ASSERT_NEAR(wlim_series.at(0, 0), 960., 960. * error_tolerance); -} - -TEST(Mspt_cmod_csp_tower_eqns, Case5b) { - double error_tolerance = 0.01; - var_table* vd = new var_table; - vd->assign("bop_par", 0.); - vd->assign("bop_par_f", 1.); - vd->assign("bop_par_0", 0.); - vd->assign("bop_par_1", 0.483); - vd->assign("bop_par_2", 0.); - vd->assign("p_ref", 115.); - vd->assign("aux_par", 0.023); - vd->assign("aux_par_f", 1.); - vd->assign("aux_par_0", 0.483); - vd->assign("aux_par_1", 0.571); - vd->assign("aux_par_2", 0.); - vd->assign("disp_wlim_maxspec", 1.); - vd->assign("constant", 4.); - - MSPT_System_Control_Equations(vd); - - double csp_pt_par_calc_bop = vd->lookup("csp.pt.par.calc.bop")->num; - double csp_pt_par_calc_aux = vd->lookup("csp.pt.par.calc.aux")->num; - double disp_wlim_max = vd->lookup("disp_wlim_max")->num; - util::matrix_t wlim_series = vd->lookup("wlim_series")->num; - ASSERT_NEAR(csp_pt_par_calc_bop, 0., 0. * error_tolerance); - ASSERT_NEAR(csp_pt_par_calc_aux, 2.78783, 2.78783 * error_tolerance); - ASSERT_NEAR(disp_wlim_max, 0.96, 0.96 * error_tolerance); - ASSERT_NEAR(wlim_series.ncells(), 8760, 0.); - ASSERT_NEAR(wlim_series.at(0, 0), 960., 960. * error_tolerance); -} - -TEST(Mspt_cmod_csp_tower_eqns, Case6) { - double error_tolerance = 0.01; - var_table* vd = new var_table; - vd->assign("d_rec", 17.65); - vd->assign("rec_height", 21.60); - vd->assign("receiver_type", 0); - vd->assign("rec_d_spec", 15.); - vd->assign("csp_pt_rec_cav_ap_height", 18.); - vd->assign("p_ref", 115.); - vd->assign("design_eff", 0.412); - vd->assign("tshours", 10.); - vd->assign("demand_var", 0); - vd->assign("a_sf_ui", 1269055.); - vd->assign("site_spec_cost", 16.); - vd->assign("heliostat_spec_cost", 140.); - vd->assign("cost_sf_fixed", 0.); - vd->assign("h_tower", 193.458); - vd->assign("rec_height", 21.6029); - vd->assign("helio_height", 12.2); - vd->assign("tower_fixed_cost", 3000000.); - vd->assign("tower_exp", 0.0113); - vd->assign("csp_pt_cost_receiver_area", 1269055.); - vd->assign("rec_ref_cost", 103000000.); - vd->assign("rec_ref_area", 1571.); - vd->assign("rec_cost_exp", 0.7); - vd->assign("csp_pt_cost_storage_mwht", 2791.26); - vd->assign("tes_spec_cost", 22.); - vd->assign("csp_pt_cost_power_block_mwe", 115.); - vd->assign("plant_spec_cost", 1040.); - vd->assign("bop_spec_cost", 290.); - vd->assign("fossil_spec_cost", 0.); - vd->assign("contingency_rate", 7.); - vd->assign("csp_pt_sf_total_land_area", 1892.); - vd->assign("nameplate", 104.); - vd->assign("csp_pt_cost_epc_per_acre", 0.); - vd->assign("csp_pt_cost_epc_percent", 13.); - vd->assign("csp_pt_cost_epc_per_watt", 0.); - vd->assign("csp_pt_cost_epc_fixed", 0.); - vd->assign("land_spec_cost", 10000.); - vd->assign("csp_pt_cost_plm_percent", 0.); - vd->assign("csp_pt_cost_plm_per_watt", 0.); - vd->assign("csp_pt_cost_plm_fixed", 0.); - vd->assign("sales_tax_frac", 80.); - vd->assign("sales_tax_rate", 5.); - - Tower_SolarPilot_Capital_Costs_MSPT_Equations(vd); - - double csp_pt_cost_receiver_area = vd->lookup("csp_pt_cost_receiver_area")->num; - double csp_pt_cost_storage_mwht = vd->lookup("csp_pt_cost_storage_mwht")->num; - double csp_pt_cost_power_block_mwe = vd->lookup("csp_pt_cost_power_block_mwe")->num; - double csp_pt_cost_site_improvements = vd->lookup("csp_pt_cost_site_improvements")->num; - double csp_pt_cost_heliostats = vd->lookup("csp_pt_cost_heliostats")->num; - double csp_pt_cost_tower = vd->lookup("csp_pt_cost_tower")->num; - double csp_pt_cost_receiver = vd->lookup("csp_pt_cost_receiver")->num; - double csp_pt_cost_storage = vd->lookup("csp_pt_cost_storage")->num; - double csp_pt_cost_power_block = vd->lookup("csp_pt_cost_power_block")->num; - double csp_pt_cost_bop = vd->lookup("csp_pt_cost_bop")->num; - double csp_pt_cost_fossil = vd->lookup("csp_pt_cost_fossil")->num; - double ui_direct_subtotal = vd->lookup("ui_direct_subtotal")->num; - double csp_pt_cost_contingency = vd->lookup("csp_pt_cost_contingency")->num; - double total_direct_cost = vd->lookup("total_direct_cost")->num; - double csp_pt_cost_epc_total = vd->lookup("csp_pt_cost_epc_total")->num; - double csp_pt_cost_plm_total = vd->lookup("csp_pt_cost_plm_total")->num; - double csp_pt_cost_sales_tax_total = vd->lookup("csp_pt_cost_sales_tax_total")->num; - double total_indirect_cost = vd->lookup("total_indirect_cost")->num; - double total_installed_cost = vd->lookup("total_installed_cost")->num; - double csp_pt_cost_installed_per_capacity = vd->lookup("csp_pt_cost_installed_per_capacity")->num; - ASSERT_NEAR(csp_pt_cost_receiver_area, 1197.86, 1197.86 * error_tolerance); - ASSERT_NEAR(csp_pt_cost_storage_mwht, 2791.26, 2791.26 * error_tolerance); - ASSERT_NEAR(csp_pt_cost_power_block_mwe, 115., 115. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_site_improvements, 20304872., 20304872. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_heliostats, 177667632., 177667632. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_tower, 25319156., 25319156. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_receiver, 85191944., 85191944. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_storage, 61407768., 61407768. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_power_block, 119600000., 119600000. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_bop, 33350000., 33350000. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_fossil, 0., 0. * error_tolerance); - ASSERT_NEAR(ui_direct_subtotal, 522841376., 522841376. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_contingency, 36598896., 36598896. * error_tolerance); - ASSERT_NEAR(total_direct_cost, 559440256., 559440256. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_epc_total, 72727232., 72727232. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_plm_total, 18920378., 18920378. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_sales_tax_total, 22377610., 22377610. * error_tolerance); - ASSERT_NEAR(total_indirect_cost, 114025224., 114025224. * error_tolerance); - ASSERT_NEAR(total_installed_cost, 673465472., 673465472. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_installed_per_capacity, 6506.91, 6506.91 * error_tolerance); + if (!errors) + { + EXPECT_NEAR_FRAC(power_tower.GetOutput("annual_energy"), 578111750, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("land_area_base"), 1847, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("capacity_factor"), 63.76, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("annual_W_cycle_gross"), 645396296, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("kwh_per_kw"), 5586, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("conversion_factor"), 89.57, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("N_hel"), 8790, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("rec_height"), 21.60, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("A_sf"), 1269054, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("D_rec"), 17.65, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("annual_total_water_use"), 98238, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("csp.pt.cost.total_land_area"), 1892, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("h_tower"), 193.5, kErrorToleranceLo); + } } -TEST(Mspt_cmod_csp_tower_eqns, Case6b) { - double error_tolerance = 0.01; - var_table* vd = new var_table; - vd->assign("d_rec", 17.65); - vd->assign("rec_height", 21.60); - vd->assign("receiver_type", 0); - vd->assign("rec_d_spec", 15.); - vd->assign("csp.pt.rec.cav_ap_height", 18.); - vd->assign("p_ref", 115.); - vd->assign("design_eff", 0.412); - vd->assign("tshours", 10.); - vd->assign("demand_var", 0); - vd->assign("a_sf_ui", 1269055.); - vd->assign("site_spec_cost", 16.); - vd->assign("heliostat_spec_cost", 140.); - vd->assign("cost_sf_fixed", 0.); - vd->assign("h_tower", 193.458); - vd->assign("rec_height", 21.6029); - vd->assign("helio_height", 12.2); - vd->assign("tower_fixed_cost", 3000000.); - vd->assign("tower_exp", 0.0113); - vd->assign("csp.pt.cost.receiver.area", 1269055.); - vd->assign("rec_ref_cost", 103000000.); - vd->assign("rec_ref_area", 1571.); - vd->assign("rec_cost_exp", 0.7); - vd->assign("csp.pt.cost.storage_mwht", 2791.26); - vd->assign("tes_spec_cost", 22.); - vd->assign("csp.pt.cost.power_block_mwe", 115.); - vd->assign("plant_spec_cost", 1040.); - vd->assign("bop_spec_cost", 290.); - vd->assign("fossil_spec_cost", 0.); - vd->assign("contingency_rate", 7.); - vd->assign("csp.pt.sf.total_land_area", 1892.); - vd->assign("nameplate", 104.); - vd->assign("csp.pt.cost.epc.per_acre", 0.); - vd->assign("csp.pt.cost.epc.percent", 13.); - vd->assign("csp.pt.cost.epc.per_watt", 0.); - vd->assign("csp.pt.cost.epc.fixed", 0.); - vd->assign("land_spec_cost", 10000.); - vd->assign("csp.pt.cost.plm.percent", 0.); - vd->assign("csp.pt.cost.plm.per_watt", 0.); - vd->assign("csp.pt.cost.plm.fixed", 0.); - vd->assign("sales_tax_frac", 80.); - vd->assign("sales_tax_rate", 5.); - - Tower_SolarPilot_Capital_Costs_MSPT_Equations(vd); - - double csp_pt_cost_receiver_area = vd->lookup("csp.pt.cost.receiver.area")->num; - double csp_pt_cost_storage_mwht = vd->lookup("csp.pt.cost.storage_mwht")->num; - double csp_pt_cost_power_block_mwe = vd->lookup("csp.pt.cost.power_block_mwe")->num; - double csp_pt_cost_site_improvements = vd->lookup("csp.pt.cost.site_improvements")->num; - double csp_pt_cost_heliostats = vd->lookup("csp.pt.cost.heliostats")->num; - double csp_pt_cost_tower = vd->lookup("csp.pt.cost.tower")->num; - double csp_pt_cost_receiver = vd->lookup("csp.pt.cost.receiver")->num; - double csp_pt_cost_storage = vd->lookup("csp.pt.cost.storage")->num; - double csp_pt_cost_power_block = vd->lookup("csp.pt.cost.power_block")->num; - double csp_pt_cost_bop = vd->lookup("csp.pt.cost.bop")->num; - double csp_pt_cost_fossil = vd->lookup("csp.pt.cost.fossil")->num; - double ui_direct_subtotal = vd->lookup("ui_direct_subtotal")->num; - double csp_pt_cost_contingency = vd->lookup("csp.pt.cost.contingency")->num; - double total_direct_cost = vd->lookup("total_direct_cost")->num; - double csp_pt_cost_epc_total = vd->lookup("csp.pt.cost.epc.total")->num; - double csp_pt_cost_plm_total = vd->lookup("csp.pt.cost.plm.total")->num; - double csp_pt_cost_sales_tax_total = vd->lookup("csp.pt.cost.sales_tax.total")->num; - double total_indirect_cost = vd->lookup("total_indirect_cost")->num; - double total_installed_cost = vd->lookup("total_installed_cost")->num; - double csp_pt_cost_installed_per_capacity = vd->lookup("csp.pt.cost.installed_per_capacity")->num; - ASSERT_NEAR(csp_pt_cost_receiver_area, 1197.86, 1197.86 * error_tolerance); - ASSERT_NEAR(csp_pt_cost_storage_mwht, 2791.26, 2791.26 * error_tolerance); - ASSERT_NEAR(csp_pt_cost_power_block_mwe, 115., 115. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_site_improvements, 20304872., 20304872. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_heliostats, 177667632., 177667632. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_tower, 25319156., 25319156. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_receiver, 85191944., 85191944. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_storage, 61407768., 61407768. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_power_block, 119600000., 119600000. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_bop, 33350000., 33350000. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_fossil, 0., 0. * error_tolerance); - ASSERT_NEAR(ui_direct_subtotal, 522841376., 522841376. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_contingency, 36598896., 36598896. * error_tolerance); - ASSERT_NEAR(total_direct_cost, 559440256., 559440256. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_epc_total, 72727232., 72727232. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_plm_total, 18920378., 18920378. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_sales_tax_total, 22377610., 22377610. * error_tolerance); - ASSERT_NEAR(total_indirect_cost, 114025224., 114025224. * error_tolerance); - ASSERT_NEAR(total_installed_cost, 673465472., 673465472. * error_tolerance); - ASSERT_NEAR(csp_pt_cost_installed_per_capacity, 6506.91, 6506.91 * error_tolerance); +NAMESPACE_TEST(csp_tower, PowerTowerCmod, FlowPattern_NoFinancial) +{ + ssc_data_t defaults = tcsmolten_salt_defaults(); + CmodUnderTest power_tower = CmodUnderTest("tcsmolten_salt", defaults); + power_tower.SetInput("Flow_type", 8); + int errors = power_tower.RunModule(); + EXPECT_FALSE(errors); + if (!errors) + { + EXPECT_NEAR_FRAC(power_tower.GetOutput("annual_energy"), 519995603, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("land_area_base"), 1847, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("capacity_factor"), 57.35, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("annual_W_cycle_gross"), 642716926, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("kwh_per_kw"), 5024, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("conversion_factor"), 80.90, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("N_hel"), 8790, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("rec_height"), 21.60, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("A_sf"), 1269054, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("D_rec"), 17.65, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("annual_total_water_use"), 98678, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("csp.pt.cost.total_land_area"), 1892, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_tower.GetOutput("h_tower"), 193.5, kErrorToleranceLo); + } } void CopyVarTableAndGetValue(var_table* vartab, std::string var_name, double* var_value) { @@ -770,13 +97,12 @@ void CopyVarTableAndGetValue(var_table* vartab, std::string var_name, double* va return; } -TEST(Mspt_cmod_csp_tower_eqns, VarTableCopyAssignmentOperator) { +NAMESPACE_TEST(csp_tower, PowerTowerCmod, CopyingVarTable) { // Get an ssc_data_t with default input values for the molten salt tower model - ssc_data_t data = ssc_data_create(); - tcsmolten_salt_default(data); + ssc_data_t data = tcsmolten_salt_defaults(); // Verify var_tables can be copied by first converting the ssc_data_t to a var_table - var_table *vartab = static_cast(data); + var_table* vartab = static_cast(data); std::string test_variable_name = "tower_exp"; double test_value = vartab->as_double(test_variable_name); @@ -790,9 +116,8 @@ TEST(Mspt_cmod_csp_tower_eqns, VarTableCopyAssignmentOperator) { try { test_value_from_orig_table_after_copied_and_fun_returned = vartab->as_double(test_variable_name); // throws error - } - catch (std::exception& e) { + catch (...) { test_value_from_orig_table_after_copied_and_fun_returned = std::numeric_limits::quiet_NaN(); } @@ -805,404 +130,118 @@ TEST(Mspt_cmod_csp_tower_eqns, VarTableCopyAssignmentOperator) { //TEST_F(CMTcsMoltenSalt, Rankine_Evap_Condenser_SingleOwner_cmod_tcsmolten_salt) { // // ssc_data_t data = ssc_data_create(); -// int test_errors = tcsmolten_salt_daggett_evap_condenser(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 571408807.373179, 571408807.373179 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t land_area_base; -// ssc_data_get_number(data, "land_area_base", &land_area_base); -// EXPECT_NEAR(land_area_base, 1847.040000, 1847.040000 * m_error_tolerance_hi) << "Land Area Base"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 63.023494, 63.023494 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 642428580.492706, 642428580.492706 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 5520.858042, 5520.858042 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 88.945110, 88.945110 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t N_hel; -// ssc_data_get_number(data, "N_hel", &N_hel); -// EXPECT_NEAR(N_hel, 8790, 8790 * m_error_tolerance_hi) << "Number of Heliostats"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t rec_height; -// ssc_data_get_number(data, "rec_height", &rec_height); -// EXPECT_NEAR(rec_height, 21.602900, 21.602900 * m_error_tolerance_hi) << "Rec Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t A_sf; -// ssc_data_get_number(data, "A_sf", &A_sf); -// EXPECT_NEAR(A_sf, 1269054.492000, 1269054.492000 * m_error_tolerance_hi) << "Solar Field Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t D_rec; -// ssc_data_get_number(data, "D_rec", &D_rec); -// EXPECT_NEAR(D_rec, 17.650000, 17.650000 * m_error_tolerance_hi) << "Receiver Outer Diameter"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 98221.126175, 98221.126175 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t csp_pt_cost_total_land_area; -// ssc_data_get_number(data, "csp.pt.cost.total_land_area", &csp_pt_cost_total_land_area); -// EXPECT_NEAR(csp_pt_cost_total_land_area, 1892.040000, 1892.040000 * m_error_tolerance_hi) << "Total Land Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi +// ssc_data_set_number(data, "CT", 1); // -// ssc_number_t h_tower; -// ssc_data_get_number(data, "h_tower", &h_tower); -// EXPECT_NEAR(h_tower, 193.458000, 193.458000 * m_error_tolerance_hi) << "Tower Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// //ssc_number_t VARIABLE; -// //ssc_data_get_number(data, "VARIABLE", &VARIABLE); -// //EXPECT_NEAR(VARIABLE, EXP_VAL, EXP_VAL * m_error_tolerance_hi) << "DESCRIPTION"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// } -//} +// ... /// Test tcsmolten_salt with alternative condenser type: Hybrid /// Rest default configurations with respect to the single owner financial model //TEST_F(CMTcsMoltenSalt, Rankine_Hybrid_Condenser_SingleOwner_cmod_tcsmolten_salt) { // // ssc_data_t data = ssc_data_create(); -// int test_errors = tcsmolten_salt_daggett_hybrid_condenser(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 571408807.373179, 571408807.373179 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t land_area_base; -// ssc_data_get_number(data, "land_area_base", &land_area_base); -// EXPECT_NEAR(land_area_base, 1847.040000, 1847.040000 * m_error_tolerance_hi) << "Land Area Base"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 63.023494, 63.023494 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 642428580.492706, 642428580.492706 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 5520.858042, 5520.858042 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 88.945110, 88.945110 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t N_hel; -// ssc_data_get_number(data, "N_hel", &N_hel); -// EXPECT_NEAR(N_hel, 8790, 8790 * m_error_tolerance_hi) << "Number of Heliostats"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t rec_height; -// ssc_data_get_number(data, "rec_height", &rec_height); -// EXPECT_NEAR(rec_height, 21.602900, 21.602900 * m_error_tolerance_hi) << "Rec Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t A_sf; -// ssc_data_get_number(data, "A_sf", &A_sf); -// EXPECT_NEAR(A_sf, 1269054.492000, 1269054.492000 * m_error_tolerance_hi) << "Solar Field Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t D_rec; -// ssc_data_get_number(data, "D_rec", &D_rec); -// EXPECT_NEAR(D_rec, 17.650000, 17.650000 * m_error_tolerance_hi) << "Receiver Outer Diameter"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 98221.126175, 98221.126175 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t csp_pt_cost_total_land_area; -// ssc_data_get_number(data, "csp.pt.cost.total_land_area", &csp_pt_cost_total_land_area); -// EXPECT_NEAR(csp_pt_cost_total_land_area, 1892.040000, 1892.040000 * m_error_tolerance_hi) << "Total Land Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi +// ssc_data_set_number(data, "CT", 3); // -// ssc_number_t h_tower; -// ssc_data_get_number(data, "h_tower", &h_tower); -// EXPECT_NEAR(h_tower, 193.458000, 193.458000 * m_error_tolerance_hi) << "Tower Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// //ssc_number_t VARIABLE; -// //ssc_data_get_number(data, "VARIABLE", &VARIABLE); -// //EXPECT_NEAR(VARIABLE, EXP_VAL, EXP_VAL * m_error_tolerance_hi) << "DESCRIPTION"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// } -//} +// ... /// Test tcsmolten_salt with alternative condenser type: Radiative /// Rest default configurations with respect to the single owner financial model //TEST_F(CMTcsMoltenSalt, Rankine_Radiative_Condenser_SingleOwner_cmod_tcsmolten_salt) { // // ssc_data_t data = ssc_data_create(); -// int test_errors = tcsmolten_salt_daggett_radiative_condenser(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 6.11007e8, 6.11007e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t land_area_base; -// ssc_data_get_number(data, "land_area_base", &land_area_base); -// EXPECT_NEAR(land_area_base, 1847.04, 1847.04 * m_error_tolerance_hi) << "Land Area Base"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 67.391, 67.391 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 6.68005e8, 6.68005e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 5903.45, 5903.45 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 91.4676, 91.4676 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t N_hel; -// ssc_data_get_number(data, "N_hel", &N_hel); -// EXPECT_NEAR(N_hel, 8790, 8790 * m_error_tolerance_hi) << "Number of Heliostats"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t rec_height; -// ssc_data_get_number(data, "rec_height", &rec_height); -// EXPECT_NEAR(rec_height, 21.6029, 21.6029 * m_error_tolerance_hi) << "Rec Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t A_sf; -// ssc_data_get_number(data, "A_sf", &A_sf); -// EXPECT_NEAR(A_sf, 1.26905e6, 1.26905e6 * m_error_tolerance_hi) << "Solar Field Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t D_rec; -// ssc_data_get_number(data, "D_rec", &D_rec); -// EXPECT_NEAR(D_rec, 17.65, 17.65 * m_error_tolerance_hi) << "Receiver Outer Diameter"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 97830.1, 97830.1 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t csp_pt_cost_total_land_area; -// ssc_data_get_number(data, "csp.pt.cost.total_land_area", &csp_pt_cost_total_land_area); -// EXPECT_NEAR(csp_pt_cost_total_land_area, 2362.53, 2362.53 * m_error_tolerance_hi) << "Total Land Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t h_tower; -// ssc_data_get_number(data, "h_tower", &h_tower); -// EXPECT_NEAR(h_tower, 193.458, 193.458 * m_error_tolerance_hi) << "Tower Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// //ssc_number_t VARIABLE; -// //ssc_data_get_number(data, "VARIABLE", &VARIABLE); -// //EXPECT_NEAR(VARIABLE, EXP_VAL, EXP_VAL * m_error_tolerance_hi) << "DESCRIPTION"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// } -//} +// ssc_data_set_number(data, "h_ctes_tank_min", 1); +// ssc_data_set_number(data, "ctes_tshours", 15); +// ssc_data_set_number(data, "ctes_field_fl", 4); +// ssc_data_set_number(data, "h_ctes_tank", 30); +// ssc_data_set_number(data, "u_ctes_tank", 0.4); +// ssc_data_set_number(data, "ctes_tankpairs", 1); +// ssc_data_set_number(data, "T_ctes_cold_design", 5); +// ssc_data_set_number(data, "T_ctes_warm_design", 10); +// ssc_data_set_number(data, "T_ctes_warm_ini", 20); +// ssc_data_set_number(data, "T_ctes_cold_ini", 10); +// ssc_data_set_number(data, "f_ctes_warm_ini", 0); +// ssc_data_set_number(data, "rad_multiplier", 1.5); +// ssc_data_set_number(data, "m_dot_radpanel", 8); +// ssc_data_set_number(data, "n_rad_tubes", 100); +// ssc_data_set_number(data, "W_rad_tubes", 0.05); +// ssc_data_set_number(data, "L_rad", 100); +// ssc_data_set_number(data, "th_rad_panel", 0.002); +// ssc_data_set_number(data, "D_rad_tubes", 0.02); +// ssc_data_set_number(data, "k_panel", 235); +// ssc_data_set_number(data, "epsilon_radtop", 0.95); +// ssc_data_set_number(data, "epsilon_radbot", 0.07); +// ssc_data_set_number(data, "epsilon_radgrnd", 0.9); +// ssc_data_set_number(data, "L_rad_sections", 10); +// ssc_data_set_number(data, "epsilon_radHX", 0.8); +// ssc_data_set_number(data, "ctes_type", 0); +// ssc_data_set_number(data, "helio_area_tot", 1269054.5); +// ssc_data_set_number(data, "radiator_unitcost", 13); +// ssc_data_set_number(data, "radiator_installcost", 22); +// ssc_data_set_number(data, "radiator_fluidcost", 0.34); +// ssc_data_set_number(data, "radfluid_vol_ratio", 3); +// ssc_data_set_number(data, "ctes_cost", 0.7); +// ssc_data_set_number(data, "rad_pressuredrop", 75); +// ssc_data_set_number(data, "CT", 4); +// +// ... /// Test tcsmolten_salt with alternative Location: Tucson, Arizona /// Rest default configurations with respect to the single owner financial model //TEST_F(CMTcsMoltenSalt, Rankine_Location_SingleOwner_cmod_tcsmolten_salt) { // // ssc_data_t data = ssc_data_create(); -// int test_errors = tcsmolten_salt_Tucson_AZ(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 5.60538e8, 5.60538e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t land_area_base; -// ssc_data_get_number(data, "land_area_base", &land_area_base); -// EXPECT_NEAR(land_area_base, 1847.04, 1847.04 * m_error_tolerance_hi) << "Land Area Base"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 61.8245, 61.8245 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 6.29388e8, 6.29388e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 5415.83, 5415.83 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 89.0609, 89.0609 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t N_hel; -// ssc_data_get_number(data, "N_hel", &N_hel); -// EXPECT_NEAR(N_hel, 8790, 8790 * m_error_tolerance_hi) << "Number of Heliostats"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t rec_height; -// ssc_data_get_number(data, "rec_height", &rec_height); -// EXPECT_NEAR(rec_height, 21.6029, 21.6029 * m_error_tolerance_hi) << "Rec Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t A_sf; -// ssc_data_get_number(data, "A_sf", &A_sf); -// EXPECT_NEAR(A_sf, 1.26905e6, 1.26905e6 * m_error_tolerance_hi) << "Solar Field Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi +// char solar_resource_path_tucson[512]; +// int n = sprintf(solar_resource_path_tucson, "%s/test/input_cases/moltensalt_data/tucson_az_32.116521_-110.933042_psmv3_60_tmy.csv", std::getenv("SSCDIR")); +// ssc_data_set_string(data, "solar_resource_file", solar_resource_path_tucson); // -// ssc_number_t D_rec; -// ssc_data_get_number(data, "D_rec", &D_rec); -// EXPECT_NEAR(D_rec, 17.65, 17.65 * m_error_tolerance_hi) << "Receiver Outer Diameter"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 96449.7, 96449.7 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t csp_pt_cost_total_land_area; -// ssc_data_get_number(data, "csp.pt.cost.total_land_area", &csp_pt_cost_total_land_area); -// EXPECT_NEAR(csp_pt_cost_total_land_area, 1892.04, 1892.04 * m_error_tolerance_hi) << "Total Land Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t h_tower; -// ssc_data_get_number(data, "h_tower", &h_tower); -// EXPECT_NEAR(h_tower, 193.458, 193.458 * m_error_tolerance_hi) << "Tower Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// //ssc_number_t VARIABLE; -// //ssc_data_get_number(data, "VARIABLE", &VARIABLE); -// //EXPECT_NEAR(VARIABLE, EXP_VAL, EXP_VAL * m_error_tolerance_hi) << "DESCRIPTION"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// } -//} +// ... /// Test tcsmolten_salt with power cycle alternative: User Defined /// Rest default configurations with respect to the single owner financial model //TEST_F(CMTcsMoltenSalt, User_Defined_SingleOwner_cmod_tcsmolten_salt) { // // ssc_data_t data = ssc_data_create(); -// int test_errors = tcsmolten_salt_daggett_UD_default(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 5.9082e8, 5.9082e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t land_area_base; -// ssc_data_get_number(data, "land_area_base", &land_area_base); -// EXPECT_NEAR(land_area_base, 1847.04, 1847.04 * m_error_tolerance_hi) << "Land Area Base"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 65.1644, 65.1644 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 6.4659e8, 6.4659e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 5708.4, 5708.4 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 91.3747, 91.3747 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t N_hel; -// ssc_data_get_number(data, "N_hel", &N_hel); -// EXPECT_NEAR(N_hel, 8790, 8790 * m_error_tolerance_hi) << "Number of Heliostats"; // choose either m_error_tolerance_lo or m_error_tolerance_hi +// set_matrix(data, "ud_ind_od", ud_ind_od_path, 180, 7); +// ssc_data_set_number(data, "pc_config", 1); +// ssc_data_set_number(data, "ud_m_dot_htf_low", 0.3); +// ssc_data_set_number(data, "ud_m_dot_htf_high", 1.2); // -// ssc_number_t rec_height; -// ssc_data_get_number(data, "rec_height", &rec_height); -// EXPECT_NEAR(rec_height, 21.6029, 21.6029 * m_error_tolerance_hi) << "Rec Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t A_sf; -// ssc_data_get_number(data, "A_sf", &A_sf); -// EXPECT_NEAR(A_sf, 1.26905e6, 1.26905e6 * m_error_tolerance_hi) << "Solar Field Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t D_rec; -// ssc_data_get_number(data, "D_rec", &D_rec); -// EXPECT_NEAR(D_rec, 17.65, 17.65 * m_error_tolerance_hi) << "Receiver Outer Diameter"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 55965.3, 55965.3 * m_error_tolerance_hi) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t csp_pt_cost_total_land_area; -// ssc_data_get_number(data, "csp.pt.cost.total_land_area", &csp_pt_cost_total_land_area); -// EXPECT_NEAR(csp_pt_cost_total_land_area, 1892.04, 1892.04 * m_error_tolerance_hi) << "Total Land Area"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t h_tower; -// ssc_data_get_number(data, "h_tower", &h_tower); -// EXPECT_NEAR(h_tower, 193.458, 193.458 * m_error_tolerance_hi) << "Tower Height"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// //ssc_number_t VARIABLE; -// //ssc_data_get_number(data, "VARIABLE", &VARIABLE); -// //EXPECT_NEAR(VARIABLE, EXP_VAL, EXP_VAL * m_error_tolerance_hi) << "DESCRIPTION"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// } -//} +// ... /// Test tcsmolten_salt with alternative power cycle: Super Critical CO2 /// Rest default configurations with respect to the single owner financial model //TEST_F(CMTcsMoltenSalt, SCO2_Default_SingleOwner_cmod_tcsmolten_salt) { // // ssc_data_t data = ssc_data_create(); -// int test_errors = tcsmolten_salt_daggett_SCO2_default(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 5.14776e8, 5.14776e8 * m_error_tolerance_hi) << "Annual Energy"; // choose m_error_tolerance_hi -// -// ssc_number_t land_area_base; -// ssc_data_get_number(data, "land_area_base", &land_area_base); -// EXPECT_NEAR(land_area_base, 1847.04, 1847.04 * m_error_tolerance_hi) << "Land Area Base"; -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 56.7772, 56.7772 * m_error_tolerance_hi) << "Capacity Factor"; // choose m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 6.1858e8, 6.1858e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 4973.68, 4973.68 * m_error_tolerance_hi) << "kwh per kw"; // choose m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 83.219, 83.219 * m_error_tolerance_hi) << "Conversion Factor"; // choose m_error_tolerance_hi -// -// ssc_number_t N_hel; -// ssc_data_get_number(data, "N_hel", &N_hel); -// EXPECT_NEAR(N_hel, 8790, 8790 * m_error_tolerance_hi) << "Number of Heliostats"; -// -// ssc_number_t rec_height; -// ssc_data_get_number(data, "rec_height", &rec_height); -// EXPECT_NEAR(rec_height, 21.6029, 21.6029 * m_error_tolerance_hi) << "Rec Height"; -// -// ssc_number_t A_sf; -// ssc_data_get_number(data, "A_sf", &A_sf); -// EXPECT_NEAR(A_sf, 1.26905e6, 1.26905e6 * m_error_tolerance_hi) << "Solar Field Area"; -// -// ssc_number_t D_rec; -// ssc_data_get_number(data, "D_rec", &D_rec); -// EXPECT_NEAR(D_rec, 17.65, 17.65 * m_error_tolerance_hi) << "Receiver Outer Diameter"; -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 55965.3, 55965.3 * m_error_tolerance_hi) << "Annual Total Water Use"; -// -// ssc_number_t csp_pt_cost_total_land_area; -// ssc_data_get_number(data, "csp.pt.cost.total_land_area", &csp_pt_cost_total_land_area); -// EXPECT_NEAR(csp_pt_cost_total_land_area, 1892.04, 1892.04 * m_error_tolerance_hi) << "Total Land Area"; -// -// ssc_number_t h_tower; -// ssc_data_get_number(data, "h_tower", &h_tower); -// EXPECT_NEAR(h_tower, 193.458, 193.458 * m_error_tolerance_hi) << "Tower Height"; -// } -//} +// ssc_data_set_number(data, "is_sco2_preprocess", 1); +// +// ssc_data_set_number(data, "pc_config", 2); +// ssc_data_set_number(data, "cycle_cutoff_frac", 0.5); +// // Start of super critical CO2 metrics +// ssc_data_set_number(data, "sco2ud_T_htf_cold_calc", 406.04); +// ssc_data_set_number(data, "sco2ud_T_htf_low", 554); +// ssc_data_set_number(data, "sco2ud_T_htf_high", 589); +// ssc_data_set_number(data, "sco2ud_T_amb_high", 45); +// ssc_data_set_number(data, "sco2ud_m_dot_htf_low", 0.5); +// ssc_data_set_number(data, "sco2ud_m_dot_htf_high", 1.05); +// ssc_number_t p_sco2ud_T_htf_ind_od[65] = { 554, 0.50001432179685623, 0.96932004909372826, 0.97558944094670463, 0.56452945008574118, 0.99212119137385479, 0.9938261663184943, 0.071046760698792344, 1.0516901234966409, 1.0396677815546937, 1, 1, 1, 562.75, 0.50000677254611736, 0.98273822965810698, 0.98931005948737616, 0.55442312464765453, 0.99593839560635933, 0.99813862855158975, 0.060760248142716182, 1.0280675561194188, 1.0216094704370726, 1, 1, 1, 571.5, 0.49997035485832741, 0.99560036541912367, 1.0030665958141747, 0.54540906175814596, 0.99964495720997093, 1.0023929148428683, 0.052633463645261176, 1.0056543163255209, 1.0033307681195913, 1, 1, 1, 580.25, 0.50001678576431519, 0.99981330235493204, 1.0149012834308118, 0.53755371644427918, 0.99437061481748712, 1.0057187757624548, 0.046124783184180999, 0.93267305740289486, 0.97564080126247599, 1, 1, 1, 589, 0.49998766910986947, 0.99997642865903091, 1.0280965929880774, 0.53035396718324523, 0.98587808938966315, 1.0103635810622889, 0.040778740942652915, 0.84986379353651254, 0.96107738725047209, 1, 1, 1 }; +// ssc_data_set_matrix(data, "sco2ud_T_htf_ind_od", p_sco2ud_T_htf_ind_od, 5, 13); +// ssc_number_t p_sco2ud_T_amb_ind_od[130] = { 0, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.059164848919520591, 0.049933864673572616, 0.04548467867978704, 1, 1, 1, 5, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.097133136927079936, 0.082248959886362452, 0.075269394493921518, 1, 1, 1, 10, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.17314165365655804, 0.14726896648379706, 0.13576325670205261, 1, 1, 1, 15, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.3481506775773433, 0.29853487098289033, 0.27855988861884273, 1, 1, 1, 20, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.85719459330059711, 0.74767538224853725, 0.71410844002614948, 1, 1, 1, 25, 0.99998860165458137, 0.99998405506376475, 0.99994129487763628, 0.97834420606252215, 0.9592086954026382, 0.94639328546002388, 1.4397512132898596, 1.1099623611534934, 0.9289610766286478, 1, 1, 1, 30, 0.99997868773200105, 1.0000128744625323, 0.99987390166815182, 0.99986135777103136, 0.97846151925556812, 0.96428182700735732, 1.2885473732704416, 1.0097961360792755, 0.85212892165494525, 1, 1, 1, 35, 0.96932004909372826, 0.99995022500741981, 0.99997642865903091, 0.99212119137385479, 0.99999459906789145, 0.98587808938966315, 1.0516901234966409, 1.0033307681195913, 0.84986379353651254, 1, 1, 1, 40, 0.85681928090544024, 0.88648580427756085, 0.90755440545490784, 0.8967547597723905, 0.90655814175453875, 0.91360819421216066, 0.54638640488302492, 0.52332590711799631, 0.50841120332212841, 1, 1, 1, 45, 0.76192612755033284, 0.78992076166486025, 0.81009772614290565, 0.81887517513574226, 0.82799762047592962, 0.83504194672755783, 0.32667431104075889, 0.31463845368914112, 0.30664767313185981, 1, 1, 1 }; +// ssc_data_set_matrix(data, "sco2ud_T_amb_ind_od", p_sco2ud_T_amb_ind_od, 10, 13); +// ssc_number_t p_sco2ud_m_dot_htf_ind_od[130] = { 0.5, 0.50000238394483887, 0.50002030400496988, 0.5000072744279479, 0.49996830468452913, 0.54311461140321193, 0.58949291750771449, 0.0023965079935530688, 0.050651289208334289, 0.085268991630535099, 1, 1, 1, 0.56111111111111112, 0.56107350053341665, 0.56109752841228611, 0.56110469253490813, 0.55257347648896971, 0.59674948077268875, 0.64372698634700765, 0.0035623149303332731, 0.076089576895326735, 0.12158112224599875, 1, 1, 1, 0.62222222222222223, 0.62224697121064898, 0.62224996267725707, 0.62219761804463092, 0.60616131300962228, 0.65145619071565242, 0.69969734374588888, 0.0052256619247860641, 0.11370919032872756, 0.17234788816884622, 1, 1, 1, 0.68333333333333335, 0.68334763160686485, 0.68332772806833242, 0.68334268666386189, 0.66063755666452395, 0.70667012650879169, 0.75616720875118448, 0.0076071355040999147, 0.16722335929420953, 0.24228904960439612, 1, 1, 1, 0.74444444444444446, 0.74441099641078146, 0.74443754704645426, 0.73579757426674453, 0.7154614610083625, 0.76238207877819242, 0.80635338615523044, 0.010993657103543011, 0.24183918938496599, 0.28923568019902324, 1, 1, 1, 0.80555555555555558, 0.80548586203577432, 0.80556625128549619, 0.7607325689541361, 0.7709115279333274, 0.81874600280477805, 0.81846324371170665, 0.015863026451133713, 0.34650772248743805, 0.32712367869313513, 1, 1, 1, 0.8666666666666667, 0.86665068706416915, 0.86667726624963815, 0.77310372269008887, 0.82666048629288214, 0.87575544351530044, 0.82250334117333646, 0.022915833888653158, 0.49058181757621305, 0.32138671984149092, 1, 1, 1, 0.92777777777777781, 0.92781567340041837, 0.92781937609673271, 0.78228939831004085, 0.88241774237123771, 0.93313651551826904, 0.82559824503018264, 0.033028022568911568, 0.6869968410833619, 0.31804744512991351, 1, 1, 1, 0.98888888888888893, 0.98860321834099996, 0.98888850977399578, 0.78897052574490523, 0.93832104872570143, 0.99049121752897784, 0.82770087400040337, 0.049618846148749549, 0.94725737476210103, 0.31520682775233339, 1, 1, 1, 1.05, 1.0487348778724641, 1.0062218585376423, 0.79376542360284852, 1.0039295318936428, 1.0043865029637598, 0.82928412460314016, 0.049807927876335194, 0.99339517007581468, 0.31300940662606114, 1, 1, 1 }; +// ssc_data_set_matrix(data, "sco2ud_m_dot_htf_ind_od", p_sco2ud_m_dot_htf_ind_od, 10, 13); +// +// ssc_data_set_number(data, "_sco2_P_high_limit", 25); +// ssc_data_set_number(data, "_sco2_P_ref", 115); +// ssc_data_set_number(data, "_sco2_T_amb_des", 35); +// ssc_data_set_number(data, "_sco2_T_approach", 10); +// ssc_data_set_number(data, "_sco2_T_htf_hot_des", 574); +// ssc_data_set_number(data, "_sco2_deltaT_PHX", 20); +// ssc_data_set_number(data, "_sco2_design_eff", 0.41200000047683716); +// ssc_data_set_number(data, "_sco2_eta_c", 0.88999998569488525); +// ssc_data_set_number(data, "_sco2_eta_t", 0.89999997615814209); +// ssc_data_set_number(data, "_sco2_recup_eff_max", 0.95999997854232788); +// +// ... /// Test tcsmolten_salt with alternative power cycle: Super Critical CO2 /// Cycle Configuration alternative: Partial Cooling @@ -1210,64 +249,33 @@ TEST(Mspt_cmod_csp_tower_eqns, VarTableCopyAssignmentOperator) { //TEST_F(CMTcsMoltenSalt, SCO2_Partial_Cooling_SingleOwner_cmod_tcsmolten_salt) { // // ssc_data_t data = ssc_data_create(); -// int test_errors = tcsmolten_salt_daggett_SCO2_partial_cooling(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 5.43316e8, 5.43316e8 * m_error_tolerance_hi) << "Annual Energy"; // choose m_error_tolerance_hi -// -// ssc_number_t land_area_base; -// ssc_data_get_number(data, "land_area_base", &land_area_base); -// EXPECT_NEAR(land_area_base, 1847.04, 1847.04 * m_error_tolerance_hi) << "Land Area Base"; -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 59.925, 59.925 * m_error_tolerance_hi) << "Capacity Factor"; // choose m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 6.15469e8, 6.15469e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 5249.43, 5249.43 * m_error_tolerance_hi) << "kwh per kw"; // choose m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 88.2767, 88.2767 * m_error_tolerance_hi) << "Conversion Factor"; // choose m_error_tolerance_hi -// -// ssc_number_t N_hel; -// ssc_data_get_number(data, "N_hel", &N_hel); -// EXPECT_NEAR(N_hel, 8790, 8790 * m_error_tolerance_hi) << "Number of Heliostats"; -// -// ssc_number_t rec_height; -// ssc_data_get_number(data, "rec_height", &rec_height); -// EXPECT_NEAR(rec_height, 21.6029, 21.6029 * m_error_tolerance_hi) << "Rec Height"; -// -// ssc_number_t A_sf; -// ssc_data_get_number(data, "A_sf", &A_sf); -// EXPECT_NEAR(A_sf, 1.26905e6, 1.26905e6 * m_error_tolerance_hi) << "Solar Field Area"; -// -// ssc_number_t D_rec; -// ssc_data_get_number(data, "D_rec", &D_rec); -// EXPECT_NEAR(D_rec, 17.65, 17.65 * m_error_tolerance_hi) << "Receiver Outer Diameter"; -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 55965.3, 55965.3 * m_error_tolerance_hi) << "Annual Total Water Use"; -// -// ssc_number_t csp_pt_cost_total_land_area; -// ssc_data_get_number(data, "csp.pt.cost.total_land_area", &csp_pt_cost_total_land_area); -// EXPECT_NEAR(csp_pt_cost_total_land_area, 1892.04, 1892.04 * m_error_tolerance_hi) << "Total Land Area"; -// -// ssc_number_t h_tower; -// ssc_data_get_number(data, "h_tower", &h_tower); -// EXPECT_NEAR(h_tower, 193.458, 193.458 * m_error_tolerance_hi) << "Tower Height"; -// } -//} +// ssc_data_set_number(data, "pc_config", 2); +// ssc_data_set_number(data, "cycle_cutoff_frac", 0.5); +// ssc_data_set_number(data, "sco2_cycle_config", 2); +// ssc_data_set_number(data, "sco2ud_T_htf_cold_calc", 354.84); +// ssc_data_set_number(data, "sco2ud_T_htf_low", 554); +// ssc_data_set_number(data, "sco2ud_T_htf_high", 589); +// ssc_data_set_number(data, "sco2ud_T_amb_high", 45); +// ssc_data_set_number(data, "sco2ud_m_dot_htf_low", 0.5); +// ssc_data_set_number(data, "sco2ud_m_dot_htf_high", 1.05); +// ssc_number_t p_sco2ud_T_htf_ind_od[65] = { 554, 0.49999352886459142, 0.96525561209463806, 0.97453395561145839, 0.62911366508823352, 0.98998074672002789, 0.99261217903413035, 0.20247797682275048, 1.0571168076843547, 1.0432895732028127, 1, 1, 1, 562.75, 0.49999364663999546, 0.98061760093183636, 0.98945608039614341, 0.59967747034505758, 0.99410410545590111, 0.99692477104310284, 0.17800016270512209, 1.0348516156853151, 1.0211725729287384, 1, 1, 1, 571.5, 0.49999395161728027, 0.99563145139446119, 1.0038535082905322, 0.58306031118146817, 0.99832427864796236, 1.001449148486844, 0.16124320857207705, 1.0092594720500885, 1.0025470111145369, 1, 1, 1, 580.25, 0.49999438710690025, 1.0000368631016281, 1.0187996347167014, 0.57310398959762909, 0.99215602847837348, 1.0059800813551822, 0.14338401700982784, 0.9341583009417217, 0.98266060214587514, 1, 1, 1, 589, 0.50001605482790912, 0.99999012779922869, 1.0325220180423378, 0.56534529941933243, 0.9816011558820481, 1.0098950333460388, 0.12932201013498895, 0.84387453074601659, 0.96199109269179472, 1, 1, 1 }; +// ssc_data_set_matrix(data, "sco2ud_T_htf_ind_od", p_sco2ud_T_htf_ind_od, 5, 13); +// ssc_number_t p_sco2ud_T_amb_ind_od[130] = { 0, 0.99997428799188914, 0.99999000874401356, 0.99999963664033542, 1.0096260890795448, 0.97647524655927898, 0.95539332954343525, 0.035964053686654389, 0.030460203665356428, 0.028191373083630726, 1, 1, 1, 5, 0.99997428799188914, 0.99999000874401356, 0.99999963664033542, 1.0096260890795448, 0.97647524655927898, 0.95539332954343525, 0.054169401117576316, 0.046164874738715223, 0.043090992060877832, 1, 1, 1, 10, 0.99997428799188914, 0.99999000874401356, 0.99999963664033542, 1.0096260890795448, 0.97647524655927898, 0.95539332954343525, 0.086054162974292386, 0.074011959990269383, 0.069988333857598825, 1, 1, 1, 15, 0.99997428799188914, 0.99999000874401356, 0.99999963664033542, 1.0096260890795448, 0.97647524655927898, 0.95539332954343525, 0.14717747411619553, 0.12834741606804084, 0.12359755317608473, 1, 1, 1, 20, 0.99997428799188914, 0.99999000874401356, 0.99999963664033542, 1.0096260890795448, 0.97647524655927898, 0.95539332954343525, 0.27882175950298732, 0.24810999613169693, 0.24587350287625651, 1, 1, 1, 25, 0.99998001476123333, 0.99998252902816598, 0.99991197104226259, 1.0098815301216097, 0.97647895095481074, 0.9554677877793778, 0.59120853683278496, 0.54403699709247888, 0.56813028411712974, 1, 1, 1, 30, 0.99998001476123333, 0.99998700539505325, 1.000003594937197, 1.0098815301216097, 0.97801555014110308, 0.95937811970467868, 1.6874663271788872, 1.1677785621376786, 0.92812586911858419, 1, 1, 1, 35, 0.96525561209463806, 0.99994365838368371, 0.99999012779922869, 0.98998074672002789, 1.0001162551906568, 0.9816011558820481, 1.0571168076843547, 1.0070553661423967, 0.84387453074601659, 1, 1, 1, 40, 0.88091956289263618, 0.91354408714037638, 0.93692898396657309, 0.92804590812890486, 0.93898338187710573, 0.94720156997882032, 0.77791598161892206, 0.7475571669584532, 0.72852820207159907, 1, 1, 1, 45, 0.80443081580069309, 0.83588054350931573, 0.85830802419616214, 0.87954062349121198, 0.89162501172294772, 0.90100255955577613, 0.71796263227634882, 0.69604875226586571, 0.68078331511457812, 1, 1, 1 }; +// ssc_data_set_matrix(data, "sco2ud_T_amb_ind_od", p_sco2ud_T_amb_ind_od, 10, 13); +// ssc_number_t p_sco2ud_m_dot_htf_ind_od[130] = { 0.5, 0.50001158587629013, 0.49999335234425468, 0.500009458086906, 0.52092523582781203, 0.580310601704488, 0.67277741730869234, 0.0066297710364970602, 0.15612995926951076, 0.42538208998154886, 1, 1, 1, 0.56111111111111112, 0.56112632572922161, 0.56109347634533013, 0.56112858298132773, 0.5676475361894191, 0.62646030027815847, 0.70338416085113653, 0.0079531402579119982, 0.18764587089730347, 0.43103981940440877, 1, 1, 1, 0.62222222222222223, 0.62221611814605471, 0.62221274231112988, 0.62222151074161314, 0.61455395777278332, 0.67446637440230506, 0.74670855688273574, 0.0093884633943930561, 0.22842611147672137, 0.48833317891759392, 1, 1, 1, 0.68333333333333335, 0.68329224890757501, 0.68333522189257412, 0.68331145370876678, 0.66231318458618582, 0.72371156880387011, 0.7949045334243946, 0.011139413945746518, 0.28028443088130395, 0.57482477745595617, 1, 1, 1, 0.74444444444444446, 0.74445060439362043, 0.74444232493970608, 0.74442697568885108, 0.71280359548337557, 0.77393932493368434, 0.84599994004797685, 0.01370986733027353, 0.34683195143613776, 0.69088300755849497, 1, 1, 1, 0.80555555555555558, 0.80554205452706595, 0.80553118613158747, 0.78568541702380978, 0.76617945177385471, 0.82545035439296532, 0.87282832981226932, 0.018334310087357693, 0.43577215265376867, 0.73125604358596707, 1, 1, 1, 0.8666666666666667, 0.86667780683097451, 0.86669111505864649, 0.80779790168115828, 0.82501645350095432, 0.8784837343548566, 0.88083521806059473, 0.031013715053052799, 0.55720344212317163, 0.71564348223866958, 1, 1, 1, 0.92777777777777781, 0.92778930075110044, 0.92781165563938151, 0.82346900197673678, 0.89420782417679856, 0.9332817335240674, 0.88681855363756823, 0.030225663571636099, 0.72555609695067691, 0.70381015654357315, 1, 1, 1, 0.98888888888888893, 0.98891033574992371, 0.98886027855958214, 0.8342986400696234, 0.96400610586573099, 0.98968856703989938, 0.89098743214344123, 0.030057676976388854, 0.95810218483069376, 0.69690700803894567, 1, 1, 1, 1.05, 1.0499204736064125, 1.0082881287098067, 0.84167433259869806, 1.0322051570968707, 1.002564506765949, 0.89389762859965882, 0.034640376520654041, 0.99538596406341329, 0.69252556580813951, 1, 1, 1 }; +// ssc_data_set_matrix(data, "sco2ud_m_dot_htf_ind_od", p_sco2ud_m_dot_htf_ind_od, 10, 13); +// ssc_data_set_number(data, "_sco2_P_high_limit", 25); +// ssc_data_set_number(data, "_sco2_P_ref", 115); +// ssc_data_set_number(data, "_sco2_T_amb_des", 35); +// ssc_data_set_number(data, "_sco2_T_approach", 10); +// ssc_data_set_number(data, "_sco2_T_htf_hot_des", 574); +// ssc_data_set_number(data, "_sco2_deltaT_PHX", 20); +// ssc_data_set_number(data, "_sco2_design_eff", 0.412); +// ssc_data_set_number(data, "_sco2_eta_c", 0.89); +// ssc_data_set_number(data, "_sco2_eta_t", 0.9); +// ssc_data_set_number(data, "_sco2_recup_eff_max", 0.96); +// +// ... /// Test tcsmolten_salt with alternative power cycle: Super Critical CO2 /// Materials and Flow alternative: Flow pattern 2 instead of 1 @@ -1275,68 +283,139 @@ TEST(Mspt_cmod_csp_tower_eqns, VarTableCopyAssignmentOperator) { //TEST_F(CMTcsMoltenSalt, SCO2_Flow_Pattern_Alternative_SingleOwner_cmod_tcsmolten_salt) { // // ssc_data_t data = ssc_data_create(); -// int test_errors = tcsmolten_salt_daggett_SCO2_flow_pattern_2(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 5.15291e8, 5.15291e8 * m_error_tolerance_hi) << "Annual Energy"; // choose m_error_tolerance_hi -// -// ssc_number_t land_area_base; -// ssc_data_get_number(data, "land_area_base", &land_area_base); -// EXPECT_NEAR(land_area_base, 1847.04, 1847.04 * m_error_tolerance_hi) << "Land Area Base"; -// -// ssc_number_t capacity_factor; -// ssc_data_get_number(data, "capacity_factor", &capacity_factor); -// EXPECT_NEAR(capacity_factor, 56.834, 56.834 * m_error_tolerance_hi) << "Capacity Factor"; // choose m_error_tolerance_hi -// -// ssc_number_t annual_W_cycle_gross; -// ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); -// EXPECT_NEAR(annual_W_cycle_gross, 6.19302e8, 6.19302e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose m_error_tolerance_hi -// -// ssc_number_t kwh_per_kw; -// ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); -// EXPECT_NEAR(kwh_per_kw, 4978.66, 4978.66 * m_error_tolerance_hi) << "kwh per kw"; // choose m_error_tolerance_hi -// -// ssc_number_t conversion_factor; -// ssc_data_get_number(data, "conversion_factor", &conversion_factor); -// EXPECT_NEAR(conversion_factor, 83.7374, 83.7374 * m_error_tolerance_hi) << "Conversion Factor"; // choose m_error_tolerance_hi -// -// ssc_number_t N_hel; -// ssc_data_get_number(data, "N_hel", &N_hel); -// EXPECT_NEAR(N_hel, 8790, 8790 * m_error_tolerance_hi) << "Number of Heliostats"; -// -// ssc_number_t rec_height; -// ssc_data_get_number(data, "rec_height", &rec_height); -// EXPECT_NEAR(rec_height, 21.6029, 21.6029 * m_error_tolerance_hi) << "Rec Height"; -// -// ssc_number_t A_sf; -// ssc_data_get_number(data, "A_sf", &A_sf); -// EXPECT_NEAR(A_sf, 1.26905e6, 1.26905e6 * m_error_tolerance_hi) << "Solar Field Area"; -// -// ssc_number_t D_rec; -// ssc_data_get_number(data, "D_rec", &D_rec); -// EXPECT_NEAR(D_rec, 17.65, 17.65 * m_error_tolerance_hi) << "Receiver Outer Diameter"; -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 55965.3, 55965.3 * m_error_tolerance_hi) << "Annual Total Water Use"; -// -// ssc_number_t csp_pt_cost_total_land_area; -// ssc_data_get_number(data, "csp.pt.cost.total_land_area", &csp_pt_cost_total_land_area); -// EXPECT_NEAR(csp_pt_cost_total_land_area, 1892.04, 1892.04 * m_error_tolerance_hi) << "Total Land Area"; -// -// ssc_number_t h_tower; -// ssc_data_get_number(data, "h_tower", &h_tower); -// EXPECT_NEAR(h_tower, 193.458, 193.458 * m_error_tolerance_hi) << "Tower Height"; -// } -//} +// ssc_data_set_number(data, "Flow_type", 2); +// ssc_data_set_number(data, "pc_config", 2); +// ssc_data_set_number(data, "cycle_cutoff_frac", 0.5); +// +// // Start of super critical CO2 metrics +// ssc_data_set_number(data, "sco2ud_T_htf_cold_calc", 406.04); +// ssc_data_set_number(data, "sco2ud_T_htf_low", 554); +// ssc_data_set_number(data, "sco2ud_T_htf_high", 589); +// ssc_data_set_number(data, "sco2ud_T_amb_high", 45); +// ssc_data_set_number(data, "sco2ud_m_dot_htf_low", 0.5); +// ssc_data_set_number(data, "sco2ud_m_dot_htf_high", 1.05); +// ssc_number_t p_sco2ud_T_htf_ind_od[65] = { 554, 0.50001432179685623, 0.96932004909372826, 0.97558944094670463, 0.56452945008574118, 0.99212119137385479, 0.9938261663184943, 0.071046760698792344, 1.0516901234966409, 1.0396677815546937, 1, 1, 1, 562.75, 0.50000677254611736, 0.98273822965810698, 0.98931005948737616, 0.55442312464765453, 0.99593839560635933, 0.99813862855158975, 0.060760248142716182, 1.0280675561194188, 1.0216094704370726, 1, 1, 1, 571.5, 0.49997035485832741, 0.99560036541912367, 1.0030665958141747, 0.54540906175814596, 0.99964495720997093, 1.0023929148428683, 0.052633463645261176, 1.0056543163255209, 1.0033307681195913, 1, 1, 1, 580.25, 0.50001678576431519, 0.99981330235493204, 1.0149012834308118, 0.53755371644427918, 0.99437061481748712, 1.0057187757624548, 0.046124783184180999, 0.93267305740289486, 0.97564080126247599, 1, 1, 1, 589, 0.49998766910986947, 0.99997642865903091, 1.0280965929880774, 0.53035396718324523, 0.98587808938966315, 1.0103635810622889, 0.040778740942652915, 0.84986379353651254, 0.96107738725047209, 1, 1, 1 }; +// ssc_data_set_matrix(data, "sco2ud_T_htf_ind_od", p_sco2ud_T_htf_ind_od, 5, 13); +// ssc_number_t p_sco2ud_T_amb_ind_od[130] = { 0, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.059164848919520591, 0.049933864673572616, 0.04548467867978704, 1, 1, 1, 5, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.097133136927079936, 0.082248959886362452, 0.075269394493921518, 1, 1, 1, 10, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.17314165365655804, 0.14726896648379706, 0.13576325670205261, 1, 1, 1, 15, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.3481506775773433, 0.29853487098289033, 0.27855988861884273, 1, 1, 1, 20, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.85719459330059711, 0.74767538224853725, 0.71410844002614948, 1, 1, 1, 25, 0.99998860165458137, 0.99998405506376475, 0.99994129487763628, 0.97834420606252215, 0.9592086954026382, 0.94639328546002388, 1.4397512132898596, 1.1099623611534934, 0.9289610766286478, 1, 1, 1, 30, 0.99997868773200105, 1.0000128744625323, 0.99987390166815182, 0.99986135777103136, 0.97846151925556812, 0.96428182700735732, 1.2885473732704416, 1.0097961360792755, 0.85212892165494525, 1, 1, 1, 35, 0.96932004909372826, 0.99995022500741981, 0.99997642865903091, 0.99212119137385479, 0.99999459906789145, 0.98587808938966315, 1.0516901234966409, 1.0033307681195913, 0.84986379353651254, 1, 1, 1, 40, 0.85681928090544024, 0.88648580427756085, 0.90755440545490784, 0.8967547597723905, 0.90655814175453875, 0.91360819421216066, 0.54638640488302492, 0.52332590711799631, 0.50841120332212841, 1, 1, 1, 45, 0.76192612755033284, 0.78992076166486025, 0.81009772614290565, 0.81887517513574226, 0.82799762047592962, 0.83504194672755783, 0.32667431104075889, 0.31463845368914112, 0.30664767313185981, 1, 1, 1 }; +// ssc_data_set_matrix(data, "sco2ud_T_amb_ind_od", p_sco2ud_T_amb_ind_od, 10, 13); +// ssc_number_t p_sco2ud_m_dot_htf_ind_od[130] = { 0.5, 0.50000238394483887, 0.50002030400496988, 0.5000072744279479, 0.49996830468452913, 0.54311461140321193, 0.58949291750771449, 0.0023965079935530688, 0.050651289208334289, 0.085268991630535099, 1, 1, 1, 0.56111111111111112, 0.56107350053341665, 0.56109752841228611, 0.56110469253490813, 0.55257347648896971, 0.59674948077268875, 0.64372698634700765, 0.0035623149303332731, 0.076089576895326735, 0.12158112224599875, 1, 1, 1, 0.62222222222222223, 0.62224697121064898, 0.62224996267725707, 0.62219761804463092, 0.60616131300962228, 0.65145619071565242, 0.69969734374588888, 0.0052256619247860641, 0.11370919032872756, 0.17234788816884622, 1, 1, 1, 0.68333333333333335, 0.68334763160686485, 0.68332772806833242, 0.68334268666386189, 0.66063755666452395, 0.70667012650879169, 0.75616720875118448, 0.0076071355040999147, 0.16722335929420953, 0.24228904960439612, 1, 1, 1, 0.74444444444444446, 0.74441099641078146, 0.74443754704645426, 0.73579757426674453, 0.7154614610083625, 0.76238207877819242, 0.80635338615523044, 0.010993657103543011, 0.24183918938496599, 0.28923568019902324, 1, 1, 1, 0.80555555555555558, 0.80548586203577432, 0.80556625128549619, 0.7607325689541361, 0.7709115279333274, 0.81874600280477805, 0.81846324371170665, 0.015863026451133713, 0.34650772248743805, 0.32712367869313513, 1, 1, 1, 0.8666666666666667, 0.86665068706416915, 0.86667726624963815, 0.77310372269008887, 0.82666048629288214, 0.87575544351530044, 0.82250334117333646, 0.022915833888653158, 0.49058181757621305, 0.32138671984149092, 1, 1, 1, 0.92777777777777781, 0.92781567340041837, 0.92781937609673271, 0.78228939831004085, 0.88241774237123771, 0.93313651551826904, 0.82559824503018264, 0.033028022568911568, 0.6869968410833619, 0.31804744512991351, 1, 1, 1, 0.98888888888888893, 0.98860321834099996, 0.98888850977399578, 0.78897052574490523, 0.93832104872570143, 0.99049121752897784, 0.82770087400040337, 0.049618846148749549, 0.94725737476210103, 0.31520682775233339, 1, 1, 1, 1.05, 1.0487348778724641, 1.0062218585376423, 0.79376542360284852, 1.0039295318936428, 1.0043865029637598, 0.82928412460314016, 0.049807927876335194, 0.99339517007581468, 0.31300940662606114, 1, 1, 1 }; +// ssc_data_set_matrix(data, "sco2ud_m_dot_htf_ind_od", p_sco2ud_m_dot_htf_ind_od, 10, 13); +// +// ... /// Test series of Advanced Combinatorial Testing System (ACTS) runs //TEST_F(CMTcsMoltenSalt, ACTS_sCO2_recompression) { // +// Molten Salt power tower - Super-critical CO2 power cycle +// ACTS framework driven testing +//int ACTS_sCO2_testing(ssc_data_t &data, int test_case) +//{ +// tcsmolten_salt_default(data); +// +// //ssc_data_set_number(data, "T_htf_cold_des", 414.53549194335938); // Different values each run ... But have no effect on outputs +// +// ssc_data_set_number(data, "pc_config", 2); +// +// ssc_data_set_number(data, "cycle_cutoff_frac", 0.5); +// +// //ssc_data_set_number(data, "sco2ud_T_htf_cold_calc", 414.53549194335938); // Different values each run ... But have no effect on outputs +// ssc_data_set_number(data, "sco2ud_T_htf_low", 554); +// ssc_data_set_number(data, "sco2ud_T_htf_high", 589); +// +// ssc_data_set_number(data, "sco2ud_T_amb_high", 45); +// ssc_data_set_number(data, "sco2ud_m_dot_htf_low", 0.5); +// ssc_data_set_number(data, "sco2ud_m_dot_htf_high", 1.05); +// ssc_number_t p_sco2ud_T_htf_ind_od[65] = { 554, 0.50001432179685623, 0.96932004909372826, 0.97558944094670463, 0.56452945008574118, 0.99212119137385479, 0.9938261663184943, 0.071046760698792344, 1.0516901234966409, 1.0396677815546937, 1, 1, 1, 562.75, 0.50000677254611736, 0.98273822965810698, 0.98931005948737616, 0.55442312464765453, 0.99593839560635933, 0.99813862855158975, 0.060760248142716182, 1.0280675561194188, 1.0216094704370726, 1, 1, 1, 571.5, 0.49997035485832741, 0.99560036541912367, 1.0030665958141747, 0.54540906175814596, 0.99964495720997093, 1.0023929148428683, 0.052633463645261176, 1.0056543163255209, 1.0033307681195913, 1, 1, 1, 580.25, 0.50001678576431519, 0.99981330235493204, 1.0149012834308118, 0.53755371644427918, 0.99437061481748712, 1.0057187757624548, 0.046124783184180999, 0.93267305740289486, 0.97564080126247599, 1, 1, 1, 589, 0.49998766910986947, 0.99997642865903091, 1.0280965929880774, 0.53035396718324523, 0.98587808938966315, 1.0103635810622889, 0.040778740942652915, 0.84986379353651254, 0.96107738725047209, 1, 1, 1 }; +// ssc_data_set_matrix(data, "sco2ud_T_htf_ind_od", p_sco2ud_T_htf_ind_od, 5, 13); +// ssc_number_t p_sco2ud_T_amb_ind_od[130] = { 0, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.059164848919520591, 0.049933864673572616, 0.04548467867978704, 1, 1, 1, 5, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.097133136927079936, 0.082248959886362452, 0.075269394493921518, 1, 1, 1, 10, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.17314165365655804, 0.14726896648379706, 0.13576325670205261, 1, 1, 1, 15, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.3481506775773433, 0.29853487098289033, 0.27855988861884273, 1, 1, 1, 20, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.85719459330059711, 0.74767538224853725, 0.71410844002614948, 1, 1, 1, 25, 0.99998860165458137, 0.99998405506376475, 0.99994129487763628, 0.97834420606252215, 0.9592086954026382, 0.94639328546002388, 1.4397512132898596, 1.1099623611534934, 0.9289610766286478, 1, 1, 1, 30, 0.99997868773200105, 1.0000128744625323, 0.99987390166815182, 0.99986135777103136, 0.97846151925556812, 0.96428182700735732, 1.2885473732704416, 1.0097961360792755, 0.85212892165494525, 1, 1, 1, 35, 0.96932004909372826, 0.99995022500741981, 0.99997642865903091, 0.99212119137385479, 0.99999459906789145, 0.98587808938966315, 1.0516901234966409, 1.0033307681195913, 0.84986379353651254, 1, 1, 1, 40, 0.85681928090544024, 0.88648580427756085, 0.90755440545490784, 0.8967547597723905, 0.90655814175453875, 0.91360819421216066, 0.54638640488302492, 0.52332590711799631, 0.50841120332212841, 1, 1, 1, 45, 0.76192612755033284, 0.78992076166486025, 0.81009772614290565, 0.81887517513574226, 0.82799762047592962, 0.83504194672755783, 0.32667431104075889, 0.31463845368914112, 0.30664767313185981, 1, 1, 1 }; +// ssc_data_set_matrix(data, "sco2ud_T_amb_ind_od", p_sco2ud_T_amb_ind_od, 10, 13); +// ssc_number_t p_sco2ud_m_dot_htf_ind_od[130] = { 0.5, 0.50000238394483887, 0.50002030400496988, 0.5000072744279479, 0.49996830468452913, 0.54311461140321193, 0.58949291750771449, 0.0023965079935530688, 0.050651289208334289, 0.085268991630535099, 1, 1, 1, 0.56111111111111112, 0.56107350053341665, 0.56109752841228611, 0.56110469253490813, 0.55257347648896971, 0.59674948077268875, 0.64372698634700765, 0.0035623149303332731, 0.076089576895326735, 0.12158112224599875, 1, 1, 1, 0.62222222222222223, 0.62224697121064898, 0.62224996267725707, 0.62219761804463092, 0.60616131300962228, 0.65145619071565242, 0.69969734374588888, 0.0052256619247860641, 0.11370919032872756, 0.17234788816884622, 1, 1, 1, 0.68333333333333335, 0.68334763160686485, 0.68332772806833242, 0.68334268666386189, 0.66063755666452395, 0.70667012650879169, 0.75616720875118448, 0.0076071355040999147, 0.16722335929420953, 0.24228904960439612, 1, 1, 1, 0.74444444444444446, 0.74441099641078146, 0.74443754704645426, 0.73579757426674453, 0.7154614610083625, 0.76238207877819242, 0.80635338615523044, 0.010993657103543011, 0.24183918938496599, 0.28923568019902324, 1, 1, 1, 0.80555555555555558, 0.80548586203577432, 0.80556625128549619, 0.7607325689541361, 0.7709115279333274, 0.81874600280477805, 0.81846324371170665, 0.015863026451133713, 0.34650772248743805, 0.32712367869313513, 1, 1, 1, 0.8666666666666667, 0.86665068706416915, 0.86667726624963815, 0.77310372269008887, 0.82666048629288214, 0.87575544351530044, 0.82250334117333646, 0.022915833888653158, 0.49058181757621305, 0.32138671984149092, 1, 1, 1, 0.92777777777777781, 0.92781567340041837, 0.92781937609673271, 0.78228939831004085, 0.88241774237123771, 0.93313651551826904, 0.82559824503018264, 0.033028022568911568, 0.6869968410833619, 0.31804744512991351, 1, 1, 1, 0.98888888888888893, 0.98860321834099996, 0.98888850977399578, 0.78897052574490523, 0.93832104872570143, 0.99049121752897784, 0.82770087400040337, 0.049618846148749549, 0.94725737476210103, 0.31520682775233339, 1, 1, 1, 1.05, 1.0487348778724641, 1.0062218585376423, 0.79376542360284852, 1.0039295318936428, 1.0043865029637598, 0.82928412460314016, 0.049807927876335194, 0.99339517007581468, 0.31300940662606114, 1, 1, 1 }; +// ssc_data_set_matrix(data, "sco2ud_m_dot_htf_ind_od", p_sco2ud_m_dot_htf_ind_od, 10, 13); +// // sco2 default configuration preprocessing parameters +// ssc_data_set_number(data, "_sco2_P_high_limit", 25); +// ssc_data_set_number(data, "_sco2_P_ref", 115); +// ssc_data_set_number(data, "_sco2_T_amb_des", 35); +// ssc_data_set_number(data, "_sco2_T_approach", 10); +// ssc_data_set_number(data, "_sco2_T_htf_hot_des", 574); +// ssc_data_set_number(data, "_sco2_deltaT_PHX", 20); +// ssc_data_set_number(data, "_sco2_design_eff", 0.412); +// ssc_data_set_number(data, "_sco2_eta_c", 0.89); +// ssc_data_set_number(data, "_sco2_eta_t", 0.9); +// ssc_data_set_number(data, "_sco2_recup_eff_max", 0.96); +// +// // Testing level to vector index map +// std::unordered_map idx = +// { +// {-1, 0}, +// { 0, 1}, +// { 1, 2} +// }; +// +// // Parameter test range values +// std::vector sco2_T_amb_des_vals{ 20.98, 35, 60 }; // Ambient temperature at design // SAM SSC - "sco2_T_amb_des" +// std::vector sco2_T_approach_vals{ 1, 10, 30 }; // Air cooler aproach temperature // SAM SSC - "sco2_T_approach" +// std::vector deltaT_PHX_vals{ 1, 20, 50 }; // PHX approach temperature // SAM SSC - "deltaT_PHX" +// std::vector eta_c_vals{ 0.70, 0.89, 1.0 }; // Compressor(s) Isentropic efficiency // SAM SSC - "eta_c" +// std::vector eta_t_vals{ 0.70, 0.90, 1.0 }; // Turbine Isentropic efficiency // SAM SSC - "eta_t" +// std::vector fan_power_perc_net_vals{ 0.25, 1.5, 5 }; // Cooling fan electricity consumption // SAM SSC - "fan_power_perc_net" +// +// // Full ACTS sCO2 framework - 15 total tests, where 6/15 tests are actually able to simulate on the SAM UI +// +// // Test case pass/fail summary 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +// // P = Pass & F = Fail in SAM UI F P F P P F P F F F F P F F P +// // std::vector sco2_T_amb_des_lvls{ -1, -1, -1, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, -1, 1 }; +// // std::vector sco2_T_approach_lvls{ -1, 0, 1, -1, 0, 1, -1, 0, 1, -1, 0, 0, 1, -1, 1 }; +// // std::vector deltaT_PHX_lvls{ 0, 1, -1, 1, -1, 0, -1, 0, 1, 0, 1, -1, 1, -1, 0 }; +// // std::vector eta_c_lvls{ 0, 1, -1, -1, 0, 1, 1, -1, 0, 0, 1, 1, -1, 1, 1 }; +// // std::vector eta_t_lvls{ 0, 1, -1, 0, 1, -1, 0, 1, -1, -1, -1, 0, 0, 1, 1 }; +// // std::vector fan_power_perc_net_lvls{ 0, 1, -1, 1, -1, 0, -1, 0, 1, -1, -1 , 0, 0, 1, 1 }; +// +// +// // Passing ACTS sco2 tests within the SAM UI +// // NOTE: +// // Certain tests are able to completely pass the unit tests +// // using high tolerances while some tests still are +// // unable to pass using the high tolerances when testing outputs +// +// // Unit test case pass/fall summary 2 4 5 7 12 15 +// // P = Pass & F = Fail for tested outputs F F P P P F +// // std::vector sco2_T_amb_des_lvls{ -1, 0, 0, 1, 1, 1 }; +// // std::vector sco2_T_approach_lvls{ 0, -1, 0, -1, 0, 1 }; +// // std::vector deltaT_PHX_lvls{ 1, 1, -1, -1, -1, 0 }; +// // std::vector eta_c_lvls{ 1, -1, 0, 1, 1, 1 }; +// // std::vector eta_t_lvls{ 1, 0, 1, 0, 0, 1 }; +// // std::vector fan_power_perc_net_lvls{ 1, 1, 1, -1, 0, 1 }; +// +// +// // Passing SAM UI configurations 5 7 12 +// // P = Pass & F = Fail for tested outputs P P P +// std::vector sco2_T_amb_des_lvls{ 0, 1, 1 }; +// std::vector sco2_T_approach_lvls{ 0, -1, 0 }; +// std::vector deltaT_PHX_lvls{ -1, -1, -1 }; +// std::vector eta_c_lvls{ 0, 1, 1 }; +// std::vector eta_t_lvls{ 1, 0, 0 }; +// std::vector fan_power_perc_net_lvls{ 1, -1, 0 }; +// +// // Get test case values from index +// double sco2_T_amb_des_ACTS = sco2_T_amb_des_vals.at(idx.find(sco2_T_amb_des_lvls.at(test_case))->second); +// double sco2_T_approach_ACTS = sco2_T_approach_vals.at(idx.find(sco2_T_approach_lvls.at(test_case))->second); +// double deltaT_PHX_ACTS = deltaT_PHX_vals.at(idx.find(deltaT_PHX_lvls.at(test_case))->second); +// double eta_c_ACTS = eta_c_vals.at(idx.find(eta_c_lvls.at(test_case))->second); +// double eta_t_ACTS = eta_t_vals.at(idx.find(eta_t_lvls.at(test_case))->second); +// double fan_power_perc_net_ACTS = fan_power_perc_net_vals.at(idx.find(fan_power_perc_net_lvls.at(test_case))->second); +// +// // Assigning values to variables +// ssc_data_set_number(data, "sco2_T_amb_des", sco2_T_amb_des_ACTS); +// ssc_data_set_number(data, "sco2_T_approach", sco2_T_approach_ACTS); +// ssc_data_set_number(data, "deltaT_PHX", deltaT_PHX_ACTS); +// ssc_data_set_number(data, "eta_c", eta_c_ACTS); +// ssc_data_set_number(data, "eta_t", eta_t_ACTS); +// ssc_data_set_number(data, "fan_power_perc_net", fan_power_perc_net_ACTS); +// +// int status = run_module(data, "tcsmolten_salt"); +// +// return status; +//} // // Outputs of 6/15 total ACTS tests for the sCO2 model // // The other 9 test case scenarios were unable to simulate properly // // on the SAM UI. diff --git a/third_party/ssc/test/ssc_test/cmod_tcsmolten_salt_test.h b/third_party/ssc/test/ssc_test/cmod_tcsmolten_salt_test.h deleted file mode 100644 index fd293c5dd2a..00000000000 --- a/third_party/ssc/test/ssc_test/cmod_tcsmolten_salt_test.h +++ /dev/null @@ -1,54 +0,0 @@ -#include - -#include "core.h" -#ifndef _CMOD_TCSMOLTEN_SALT_TEST_H_ -#define _CMOD_TCSMOLTEN_SALT_TEST_H_ - -#include "vartab.h" -#include "../ssc/common.h" -#include "../tcs_test/tcsmolten_salt_cases.h" -#include "cmod_csp_tower_eqns.h" - -/** - * CMtcsMoltenSalt tests the cmod_tcsmolten_salt using the SAM code generator to generate data - * Eventually a method can be written to write this data to a vartable so that lower-level methods of - * tcsmolten_salt can be tested - * For now, this uses the SSCAPI interfaces to run the compute module and compare results - */ -class CMTcsMoltenSalt : public ::testing::Test{ - -public: - - ssc_data_t data; - ssc_number_t calculated_value; - ssc_number_t * calculated_array; - double m_error_tolerance_hi = 0.01; // 1.0% - double m_error_tolerance_lo = 0.001; // 0.1% - - void SetUp() - { - data = ssc_data_create(); - tcsmolten_salt_default(data); - calculated_array = new ssc_number_t[8760]; - } - void TearDown() { - if (data) { - ssc_data_free(data); - data = nullptr; - } - if (calculated_array) { - delete[] calculated_array; - } - } - void SetCalculated(std::string name) - { - ssc_data_get_number(data, const_cast(name.c_str()), &calculated_value); - } - void SetCalculatedArray(std::string name) - { - int n; - calculated_array = ssc_data_get_array(data, const_cast(name.c_str()), &n); - } -}; - -#endif // !_CMOD_TCSMOLTEN_SALT_TEST_H_ diff --git a/third_party/ssc/test/ssc_test/cmod_tcstrough_empirical_test.cpp b/third_party/ssc/test/ssc_test/cmod_tcstrough_empirical_test.cpp index 21a877fd7ed..ba5e008d12a 100644 --- a/third_party/ssc/test/ssc_test/cmod_tcstrough_empirical_test.cpp +++ b/third_party/ssc/test/ssc_test/cmod_tcstrough_empirical_test.cpp @@ -1,373 +1,278 @@ #include - -#include "cmod_tcstrough_empirical_test.h" -#include "../tcs_test/tcstrough_empirical_cases.h" -#include "../input_cases/weather_inputs.h" - -/// Test tcstrough_empirical with all defaults with respect to the No Financial model -TEST_F(CMTcsTroughEmpirical, TroughEmpirical_Default_No_Financial_cmod_tcstrough_empirical) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcstrough_empirical_tucson_default(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 3.44335e8, 3.44335e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_fuel_usage; - ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); - EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 39.347, 39.347 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 4.04116e8, 4.04116e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 3446.8, 3446.8 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 88.7574, 88.7574 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_heat_rate; - ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); - EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_use_lifetime_output; - ssc_data_get_number(data, "system_use_lifetime_output", &system_use_lifetime_output); - EXPECT_NEAR(system_use_lifetime_output, 0, 0 * m_error_tolerance_hi) << "Use lifetime output"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - } +#include "tcstrough_empirical_defaults.h" +#include "csp_common_test.h" +#include "vs_google_test_explorer_namespace.h" + +namespace csp_trough {} +using namespace csp_trough; + +//========Tests=================================================================================== +NAMESPACE_TEST(csp_trough, EmpiricalTroughCmod, Default_NoFinancial) +{ + ssc_data_t defaults = tcstrough_empirical_defaults(); + CmodUnderTest empirical_trough = CmodUnderTest("tcstrough_empirical", defaults); + int errors = empirical_trough.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_energy"), 344049128, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("annual_fuel_usage"), 0., kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("capacity_factor"), 39.31, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_W_cycle_gross"), 403814011, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("kwh_per_kw"), 3444, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("conversion_factor"), 88.75, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("system_heat_rate"), 3.413, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("system_use_lifetime_output"), 0., kErrorToleranceLo); + } } -/// Test tcstrough_empirical with alternative Solar Field HTF type: Hitec Solar Salt -/// Rest default configurations with respect to the No Financial model -TEST_F(CMTcsTroughEmpirical, TroughEmpirical_Solar_Field_HTF_No_Financial_cmod_tcstrough_empirical) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcstrough_empirical_tucson_solar_field_HTF(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 3.40714e8, 3.40714e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_fuel_usage; - ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); - EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 38.9332, 38.9332 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 3.9992e8, 3.9992e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 3410.55, 3410.55 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 88.7454, 88.7454 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_heat_rate; - ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); - EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_use_lifetime_output; - ssc_data_get_number(data, "system_use_lifetime_output", &system_use_lifetime_output); - EXPECT_NEAR(system_use_lifetime_output, 0, 0 * m_error_tolerance_hi) << "Use lifetime output"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - } +// Alternative solar field HTF type: Hitec Solar Salt +NAMESPACE_TEST(csp_trough, EmpiricalTroughCmod, SolarSaltHtf_NoFinancial) +{ + ssc_data_t defaults = tcstrough_empirical_defaults(); + CmodUnderTest empirical_trough = CmodUnderTest("tcstrough_empirical", defaults); + empirical_trough.SetInput("HTFFluid", 18); + empirical_trough.SetInput("PTSmax", 676.471); + empirical_trough.SetInput("PFSmax", 342.699); + + int errors = empirical_trough.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_energy"), 340377809, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("annual_fuel_usage"), 0., kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("capacity_factor"), 38.89, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_W_cycle_gross"), 399556634, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("kwh_per_kw"), 3407, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("conversion_factor"), 88.74, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("system_heat_rate"), 3.413, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("system_use_lifetime_output"), 0., kErrorToleranceLo); + } } -/// Passed with m_error_tolerance_hi used for: -/// annual_W_cycle_gross & conversion_factor & kwh_per_kw - -/// Test tcstrough_empirical with alternative Solar Collector Assembly (SCA): EuroTrough ET150 -/// Rest default configurations with respect to the No Financial model -TEST_F(CMTcsTroughEmpirical, TroughEmpirical_SCA_No_Financial_cmod_tcstrough_empirical) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcstrough_empirical_tucson_SCA(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 3.44114e8, 3.44114e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_fuel_usage; - ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); - EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 39.3217, 39.3217 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 4.03352e8, 4.03352e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 3444.58, 3444.58 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 88.8683, 88.8683 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_heat_rate; - ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); - EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_use_lifetime_output; - ssc_data_get_number(data, "system_use_lifetime_output", &system_use_lifetime_output); - EXPECT_NEAR(system_use_lifetime_output, 0, 0 * m_error_tolerance_hi) << "Use lifetime output"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - } +// Alternative solar collector assembly (SCA): EuroTrough ET150 +NAMESPACE_TEST(csp_trough, EmpiricalTroughCmod, EuroTrough_NoFinancial) +{ + ssc_data_t defaults = tcstrough_empirical_defaults(); + CmodUnderTest empirical_trough = CmodUnderTest("tcstrough_empirical", defaults); + empirical_trough.SetInput("Solar_Field_Area", 856740); + empirical_trough.SetInput("Ave_Focal_Length", 2.1); + empirical_trough.SetInput("ScaLen", 150); + empirical_trough.SetInput("SCA_aper", 5.75); + empirical_trough.SetInput("TrkTwstErr", 0.99); + empirical_trough.SetInput("MirCln", 0.97); + empirical_trough.SetInput("HCEdust", { 0.98, 0.98, 0.98, 0.98 }); + empirical_trough.SetInput("RefMirrAper", { 5.75, 5.75, 5.75, 5.75 }); + empirical_trough.SetInput("SfPar", 0.228); + empirical_trough.SetInput("ChtfPar", 9.013); + empirical_trough.SetInput("AntiFrPar", 0.9013); + + int errors = empirical_trough.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_energy"), 343687390, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("annual_fuel_usage"), 0., kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("capacity_factor"), 39.27, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_W_cycle_gross"), 402926405, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("kwh_per_kw"), 3440, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("conversion_factor"), 88.85, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("system_heat_rate"), 3.413, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("system_use_lifetime_output"), 0., kErrorToleranceLo); + } } -/// Passed with m_error_tolerance_hi used for: -/// conversion_factor - -/// Test tcstrough_empirical with alternative Heat Collection Element (HCE): Luz Cermet Vacuum, Luz Cermet Hydrogren, and Luz Cermet Broken Glass -/// Rest default configurations with respect to the No Financial model -TEST_F(CMTcsTroughEmpirical, TroughEmpirical_HCE_No_Financial_cmod_tcstrough_empirical) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcstrough_empirical_tucson_HCE(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 3.11168e8, 3.11168e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_fuel_usage; - ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); - EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 35.557, 35.557 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 3.69939e8, 3.69939e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 3114.8, 3114.8 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 87.618, 87.618 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_heat_rate; - ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); - EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_use_lifetime_output; - ssc_data_get_number(data, "system_use_lifetime_output", &system_use_lifetime_output); - EXPECT_NEAR(system_use_lifetime_output, 0, 0 * m_error_tolerance_hi) << "Use lifetime output"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - } +// Alternative heat collection element (HCE): Luz Cermet Vacuum, Luz Cermet Hydrogren, and Luz Cermet Broken Glass +NAMESPACE_TEST(csp_trough, EmpiricalTroughCmod, LuzCermetHce_NoFinancial) +{ + ssc_data_t defaults = tcstrough_empirical_defaults(); + CmodUnderTest empirical_trough = CmodUnderTest("tcstrough_empirical", defaults); + empirical_trough.SetInput("Solar_Field_Area", 1015848); + empirical_trough.SetInput("HCEBelShad", { 0.971, 0.971, 0.971, 0 }); + empirical_trough.SetInput("HCEEnvTrans", { 0.935, 0.935, 1, 0 }); + empirical_trough.SetInput("HCEabs", { 0.925, 0.925, 0.8, 0 }); + empirical_trough.SetInput("PerfFac", { 1.25, 1.25, 1.25, 0 }); + empirical_trough.SetInput("HCE_A0", { 2.424, 7.0233, 100.05, 0 }); + empirical_trough.SetInput("HCE_A1", { 0.214, 1.275, -0.7351, 0 }); + empirical_trough.SetInput("HCE_A2", { -0.00047461, 0.0015105, -0.008635, 0 }); + empirical_trough.SetInput("HCE_A3", { 6.88e-06, 5.05e-06, 2.67e-05, 0 }); + empirical_trough.SetInput("HCE_A4", { 9.62e-08, 7.03e-08, 6.65e-07, 0 }); + empirical_trough.SetInput("HCE_A5", { -2.2423, -4.284, -99.043, 0 }); + empirical_trough.SetInput("HCE_A6", { 0.032325, 0.39685, 5.1672, 0 }); + empirical_trough.SetInput("SfPar", 0.270); + empirical_trough.SetInput("ChtfPar", 10.687); + empirical_trough.SetInput("AntiFrPar", 1.069); + + int errors = empirical_trough.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_energy"), 310891768, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("annual_fuel_usage"), 0., kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("capacity_factor"), 35.53, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_W_cycle_gross"), 369630914, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("kwh_per_kw"), 3112, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("conversion_factor"), 87.61, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("system_heat_rate"), 3.413, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("system_use_lifetime_output"), 0., kErrorToleranceLo); + } } -/// Test tcstrough_empirical with alternative Power Cycle: APS Ormat 1MWe 300C -/// Rest default configurations with respect to the No Financial model -TEST_F(CMTcsTroughEmpirical, TroughEmpirical_Power_Cycle_No_Financial_cmod_tcstrough_empirical) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcstrough_empirical_tucson_power_cycle(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 3.5066e8, 3.5066e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_fuel_usage; - ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); - EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 40.0698, 40.0698 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 4.27665e8, 4.27665e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 3510.11, 3510.11 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 85.4106, 85.4106 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_heat_rate; - ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); - EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_use_lifetime_output; - ssc_data_get_number(data, "system_use_lifetime_output", &system_use_lifetime_output); - EXPECT_NEAR(system_use_lifetime_output, 0, 0 * m_error_tolerance_hi) << "Use lifetime output"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - } +// Alternative power cycle: APS Ormat 1MWe 300C +NAMESPACE_TEST(csp_trough, EmpiricalTroughCmod, PowerCycle_NoFinancial) +{ + ssc_data_t defaults = tcstrough_empirical_defaults(); + CmodUnderTest empirical_trough = CmodUnderTest("tcstrough_empirical", defaults); + empirical_trough.SetInput("Solar_Field_Area", 1599020); + empirical_trough.SetInput("TurbEffG", 0.2071); + empirical_trough.SetInput("TurSUE", 0.05); + empirical_trough.SetInput("T2EPLF0", -0.1594); + empirical_trough.SetInput("T2EPLF1", 0.9262); + empirical_trough.SetInput("T2EPLF2", 1.1349); + empirical_trough.SetInput("T2EPLF3", -1.3606); + empirical_trough.SetInput("T2EPLF4", 0.4588); + empirical_trough.SetInput("E2TPLF0", 0.1492); + empirical_trough.SetInput("E2TPLF1", 0.8522); + empirical_trough.SetInput("E2TPLF2", -0.3247); + empirical_trough.SetInput("E2TPLF3", 0.44863); + empirical_trough.SetInput("E2TPLF4", -0.1256); + empirical_trough.SetInput("TempCorrF", 0); + empirical_trough.SetInput("TempCorr0", 1); + empirical_trough.SetInput("TempCorr1", 0); + empirical_trough.SetInput("TempCorr2", 0); + empirical_trough.SetInput("TempCorr3", 0); + empirical_trough.SetInput("TempCorr4", 0); + empirical_trough.SetInput("PTSmax", 535.973); + empirical_trough.SetInput("PFSmax", 543.0467); + empirical_trough.SetInput("SfPar", 0.42534); + empirical_trough.SetInput("ChtfPar", 16.8217); + empirical_trough.SetInput("AntiFrPar", 1.6822); + + int errors = empirical_trough.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_energy"), 350313341, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("annual_fuel_usage"), 0., kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("capacity_factor"), 40.03, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_W_cycle_gross"), 427283458, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("kwh_per_kw"), 3507, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("conversion_factor"), 85.40, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("system_heat_rate"), 3.413, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("system_use_lifetime_output"), 0., kErrorToleranceLo); + } } -/// Test tcstrough_empirical with alternative Thermal Storage Fluid Type: Therminol VP-1 -/// Rest default configurations with respect to the No Financial model -TEST_F(CMTcsTroughEmpirical, TroughEmpirical_Thermal_Storage_Fluid_No_Financial_cmod_tcstrough_empirical) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcstrough_empirical_tucson_thermal_storage(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 3.4418e8, 3.4418e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_fuel_usage; - ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); - EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 39.3292, 39.3292 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 4.03784e8, 4.03784e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 3445.24, 3445.24 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 88.7901, 88.7901 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_heat_rate; - ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); - EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_use_lifetime_output; - ssc_data_get_number(data, "system_use_lifetime_output", &system_use_lifetime_output); - EXPECT_NEAR(system_use_lifetime_output, 0, 0 * m_error_tolerance_hi) << "Use lifetime output"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - } +// Alternative thermal stoage fluid type: Therminol VP-1 +NAMESPACE_TEST(csp_trough, EmpiricalTroughCmod, TherminolHtf_NoFinancial) +{ + ssc_data_t defaults = tcstrough_empirical_defaults(); + CmodUnderTest empirical_trough = CmodUnderTest("tcstrough_empirical", defaults); + empirical_trough.SetInput("PTSmax", 676.4706); + empirical_trough.SetInput("PFSmax", 342.699); + + int errors = empirical_trough.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_energy"), 343856219, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("annual_fuel_usage"), 0., kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("capacity_factor"), 39.29, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_W_cycle_gross"), 403443026, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("kwh_per_kw"), 3444, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("conversion_factor"), 88.78, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("system_heat_rate"), 3.413, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("system_use_lifetime_output"), 0., kErrorToleranceLo); + } } -/// Test tcstrough_empirical with alternative Parasitic Electric Energy Use: 500C Molten Salt HTF -/// Rest default configurations with respect to the No Financial model -TEST_F(CMTcsTroughEmpirical, TroughEmpirical_Parasitic_No_Financial_cmod_tcstrough_empirical) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcstrough_empirical_tucson_parasitic(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 3.58145e8, 3.58145e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_fuel_usage; - ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); - EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 40.9251, 40.9251 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 4.04116e8, 4.04116e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 3585.04, 3585.04 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 92.3171, 92.3171 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_heat_rate; - ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); - EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_use_lifetime_output; - ssc_data_get_number(data, "system_use_lifetime_output", &system_use_lifetime_output); - EXPECT_NEAR(system_use_lifetime_output, 0, 0 * m_error_tolerance_hi) << "Use lifetime output"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - } +// Alternative parasitic electric energy use +NAMESPACE_TEST(csp_trough, EmpiricalTroughCmod, ParasiticElectric_NoFinancial) +{ + ssc_data_t defaults = tcstrough_empirical_defaults(); + CmodUnderTest empirical_trough = CmodUnderTest("tcstrough_empirical", defaults); + empirical_trough.SetInput("SfPar", 0.117); + empirical_trough.SetInput("SfParPF", 0.5); + empirical_trough.SetInput("ChtfPar", 3.231); + empirical_trough.SetInput("ChtfParPF", 0.35); + empirical_trough.SetInput("AntiFrPar", 0.323); + empirical_trough.SetInput("HhtfPar", 0.777); + empirical_trough.SetInput("HhtfParPF", 0.35); + + int errors = empirical_trough.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_energy"), 357850265, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("annual_fuel_usage"), 0., kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("capacity_factor"), 40.89, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_W_cycle_gross"), 403814011, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("kwh_per_kw"), 3582, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("conversion_factor"), 92.31, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("system_heat_rate"), 3.413, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("system_use_lifetime_output"), 0., kErrorToleranceLo); + } } -/// Test tcstrough_empirical with alternativelocation: Phoenix, AZ -/// Rest default configurations with respect to the No Financial model -TEST_F(CMTcsTroughEmpirical, TroughEmpirical_Location_No_Financial_cmod_tcstrough_empirical) { - - ssc_data_t data = ssc_data_create(); - int test_errors = tcstrough_empirical_phoenix(data); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 3.3255e8, 3.3255e8 * m_error_tolerance_hi) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_fuel_usage; - ssc_data_get_number(data, "annual_fuel_usage", &annual_fuel_usage); - EXPECT_NEAR(annual_fuel_usage, 0, 0 * m_error_tolerance_hi) << "Annual fuel usage"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 38.0003, 38.0003 * m_error_tolerance_hi) << "Capacity Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 3.91116e8, 3.91116e8 * m_error_tolerance_hi) << "Annual W_cycle Gross"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 3328.83, 3328.83 * m_error_tolerance_hi) << "kwh per kw"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 88.5687, 88.5687 * m_error_tolerance_hi) << "Conversion Factor"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - - ssc_number_t system_heat_rate; - ssc_data_get_number(data, "system_heat_rate", &system_heat_rate); - EXPECT_NEAR(system_heat_rate, 3.413, 3.413 * m_error_tolerance_hi) << "System heat rate"; // choose either m_error_tolerance_lo or m_error_tolerance_hi +// Alternative location: Phoenix, AZ +NAMESPACE_TEST(csp_trough, EmpiricalTroughCmod, Phoenix_NoFinancial) +{ + ssc_data_t defaults = tcstrough_empirical_defaults(); + CmodUnderTest empirical_trough = CmodUnderTest("tcstrough_empirical", defaults); + char solar_resource_path_phoenix[512]; + int n = sprintf(solar_resource_path_phoenix, "%s/test/input_cases/trough_empirical_data/phoenix_az_33.450495_-111.983688_psmv3_60_tmy.csv", std::getenv("SSCDIR")); + empirical_trough.SetInput("file_name", solar_resource_path_phoenix); + + int errors = empirical_trough.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_energy"), 332549669, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("annual_fuel_usage"), 0., kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("capacity_factor"), 38.00, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("annual_W_cycle_gross"), 391115710, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("kwh_per_kw"), 3329, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("conversion_factor"), 88.56, kErrorToleranceLo); + EXPECT_NEAR_FRAC(empirical_trough.GetOutput("system_heat_rate"), 3.413, kErrorToleranceLo); + EXPECT_NEAR(empirical_trough.GetOutput("system_use_lifetime_output"), 0., kErrorToleranceLo); + } +} - ssc_number_t system_use_lifetime_output; - ssc_data_get_number(data, "system_use_lifetime_output", &system_use_lifetime_output); - EXPECT_NEAR(system_use_lifetime_output, 0, 0 * m_error_tolerance_hi) << "Use lifetime output"; // choose either m_error_tolerance_lo or m_error_tolerance_hi +// Test series of Advanced Combinatorial Testing System (ACTS) runs +// Parabolic trough (empirical) +//int ACTS_test_empirical(ssc_data_t &data, int test_case) +//{ +// tcstrough_empirical_default(data); +// +// // Testing level to vector index map +// std::unordered_map idx = +// { +// {-1, 0}, +// { 0, 1}, +// { 1, 2} +// }; +// +// // Parameter test range values +// std::vector Distance_SCA_vals{ 0.5, 1 , 2 }; // Distance Between SCAs in Row // SAM SSC - "Distance_SCA" +// std::vector NumScas_vals{ 1, 4, 8 }; // Number of SCAs per Row // SAM SSC - "NumScas" +// std::vector DepAngle_vals{ 5, 10, 20 }; // Deploy Angle // SAM SSC - "DepAngle" +// std::vector Stow_Angle_vals{ 160, 170, 175 }; // Stow Angle // SAM SSC - "Stow_Angle" +// +// // ACTS transposed covering array 1 2 3 4 5 6 7 8 9 +// std::vector Distance_SCA_lvls{ -1, -1, -1, 0, 0, 0, 1, 1, 1 }; +// std::vector NumScas_lvls{ -1, 0, 1, -1, 0, 1, -1, 0, 1 }; +// std::vector DepAngle_lvls{ 0, 1, -1, 1, -1, 0, -1, 0, 1 }; +// std::vector Stow_Angle_lvls{ 0, 1, -1, -1, 0, 1, 1, -1, 0 }; +// +// // Get test case values from index +// double Distance_SCA_ACTS = Distance_SCA_vals.at(idx.find(Distance_SCA_lvls.at(test_case))->second); +// double NumScas_ACTS = NumScas_vals.at(idx.find(NumScas_lvls.at(test_case))->second); +// double DepAngle_ACTS = DepAngle_vals.at(idx.find(DepAngle_lvls.at(test_case))->second); +// double Stow_Angle_ACTS = Stow_Angle_vals.at(idx.find(Stow_Angle_lvls.at(test_case))->second); +// +// // Assigning values to variables +// ssc_data_set_number(data, "Distance_SCA", Distance_SCA_ACTS); +// ssc_data_set_number(data, "NumScas", NumScas_ACTS); +// ssc_data_set_number(data, "DepAngle", DepAngle_ACTS); +// ssc_data_set_number(data, "Stow_Angle", Stow_Angle_ACTS); +// +// int status = run_module(data, "tcstrough_empirical"); +// +// return status; +//} - } -} /// Test series of Advanced Combinatorial Testing System (ACTS) runs //TEST_F(CMTcsTroughEmpirical, ACTS_Test_Empirical) { @@ -423,6 +328,3 @@ TEST_F(CMTcsTroughEmpirical, TroughEmpirical_Location_No_Financial_cmod_tcstroug // } // } //} - - - diff --git a/third_party/ssc/test/ssc_test/cmod_tcstrough_empirical_test.h b/third_party/ssc/test/ssc_test/cmod_tcstrough_empirical_test.h deleted file mode 100644 index 3b10d7e8301..00000000000 --- a/third_party/ssc/test/ssc_test/cmod_tcstrough_empirical_test.h +++ /dev/null @@ -1,53 +0,0 @@ -#include - -#include "core.h" -#ifndef _CMOD_TCSTROUGH_EMPIRICAL_TEST_H_ -#define _CMOD_TCSTROUGH_EMPIRICAL_TEST_H_ - -#include "vartab.h" -#include "../ssc/common.h" -#include "../tcs_test/tcstrough_empirical_cases.h" - -/** - * CMtcsTroughEmpirical tests the cmod_tcstrough_empirical using the SAM code generator to generate data - * Eventually a method can be written to write this data to a vartable so that lower-level methods of - * tcstrough_empirical can be tested - * For now, this uses the SSCAPI interfaces to run the compute module and compare results - */ -class CMTcsTroughEmpirical : public ::testing::Test { - -public: - - ssc_data_t data; - ssc_number_t calculated_value; - ssc_number_t * calculated_array; - double m_error_tolerance_hi = 0.01; // 1.0% - double m_error_tolerance_lo = 0.001; // 0.1% - - void SetUp() - { - data = ssc_data_create(); - tcstrough_empirical_default(data); - calculated_array = new ssc_number_t[8760]; - } - void TearDown() { - if (data) { - ssc_data_free(data); - data = nullptr; - } - if (calculated_array) { - delete[] calculated_array; - } - } - void SetCalculated(std::string name) - { - ssc_data_get_number(data, const_cast(name.c_str()), &calculated_value); - } - void SetCalculatedArray(std::string name) - { - int n; - calculated_array = ssc_data_get_array(data, const_cast(name.c_str()), &n); - } -}; - -#endif // !_CMOD_TCSTROUGH_EMPIRICAL_TEST_H diff --git a/third_party/ssc/test/ssc_test/cmod_trough_physical_iph_test.cpp b/third_party/ssc/test/ssc_test/cmod_trough_physical_iph_test.cpp index 2251ce11494..6ce20846cfc 100644 --- a/third_party/ssc/test/ssc_test/cmod_trough_physical_iph_test.cpp +++ b/third_party/ssc/test/ssc_test/cmod_trough_physical_iph_test.cpp @@ -1,119 +1,25 @@ #include - -#include "cmod_trough_physical_iph_test.h" -#include "../tcs_test/trough_physical_iph_cases.h" -#include "../input_cases/weather_inputs.h" - -/// Test trough_physical_iph with all defaults and no-financial model -TEST_F(CMTroughPhysicalIPH, DefaultNoFinancialModel_cmod_trough_physical_iph){ - - int test_errors = run_module(data, "trough_physical_process_heat"); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - ssc_number_t annual_gross_energy; - ssc_data_get_number(data, "annual_gross_energy", &annual_gross_energy); - EXPECT_NEAR(annual_gross_energy, 24480390.431956, 24480390.431956 * m_error_tolerance_hi) << "Annual Gross Energy"; - - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 24480390.431956, 24480390.431956 * m_error_tolerance_hi) << "Annual Energy"; - - ssc_number_t annual_electricity_consumption; - ssc_data_get_number(data, "annual_electricity_consumption", &annual_electricity_consumption); - EXPECT_NEAR(annual_electricity_consumption, 93788., 93788. * m_error_tolerance_hi) << "Annual Electricity Consumption"; - - //ssc_number_t fixed_operating_cost; - //ssc_data_get_number(data, "fixed_operating_cost", &fixed_operating_cost); - //EXPECT_NEAR(fixed_operating_cost, 111118, 111118 * m_error_tolerance_hi) << "Fixed Operating Cost"; - - ssc_number_t annual_thermal_consumption; - ssc_data_get_number(data, "annual_thermal_consumption", &annual_thermal_consumption); - EXPECT_NEAR(annual_thermal_consumption, 247.65286, 247.65286 * m_error_tolerance_hi) << "Annual Thermal Consumption"; - - ssc_number_t annual_tes_freeze_protection; - ssc_data_get_number(data, "annual_tes_freeze_protection", &annual_tes_freeze_protection); - EXPECT_NEAR(annual_tes_freeze_protection, 247.65286, 247.65286 * m_error_tolerance_hi) << "Annual TES Freeze Protection"; - - ssc_number_t annual_field_freeze_protection; - ssc_data_get_number(data, "annual_field_freeze_protection", &annual_field_freeze_protection); - EXPECT_NEAR(annual_field_freeze_protection, 0., m_error_tolerance_hi) << "Annual Field Freeze Protection"; - - //ssc_number_t lcoe_fcr; - //ssc_data_get_number(data, "lcoe_fcr", &lcoe_fcr); - //EXPECT_NEAR(lcoe_fcr, 0.0375859, 0.0375859 * m_error_tolerance_hi) << "LCOE FCR"; - - ssc_number_t annual_total_water_use; - ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); - EXPECT_NEAR(annual_total_water_use, 176.332800, 176.332800 * m_error_tolerance_hi) << "Annual Total Water Use"; - - //ssc_number_t VARIABLE; - //ssc_data_get_number(data, "VARIABLE", &VARIABLE); - //EXPECT_NEAR(VARIABLE, EXP_VAL, EXP_VAL * m_error_tolerance_hi) << "DESCRIPTION"; - } +#include "trough_physical_iph_defaults.h" +#include "csp_common_test.h" +#include "vs_google_test_explorer_namespace.h" + +namespace csp_trough {} +using namespace csp_trough; + +//========Tests=================================================================================== +NAMESPACE_TEST(csp_trough, HeatTroughCmod, Default_NoFinancial) +{ + ssc_data_t defaults = trough_physical_iph_defaults(); + CmodUnderTest heat_trough = CmodUnderTest("trough_physical_process_heat", defaults); + int errors = heat_trough.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(heat_trough.GetOutput("annual_gross_energy"), 24328026, kErrorToleranceLo); + EXPECT_NEAR_FRAC(heat_trough.GetOutput("annual_energy"), 24327778, kErrorToleranceLo); + EXPECT_NEAR_FRAC(heat_trough.GetOutput("annual_electricity_consumption"), 93310, kErrorToleranceLo); + EXPECT_NEAR_FRAC(heat_trough.GetOutput("annual_thermal_consumption"), 247.67, kErrorToleranceLo); + EXPECT_NEAR_FRAC(heat_trough.GetOutput("annual_tes_freeze_protection"), 247.67, kErrorToleranceLo); + EXPECT_NEAR(heat_trough.GetOutput("annual_field_freeze_protection"), 0., kErrorToleranceLo); + EXPECT_NEAR_FRAC(heat_trough.GetOutput("annual_total_water_use"), 176.3, kErrorToleranceLo); + } } - -/// Test trough_physical_iph with all defaults and the financial model in the LCOH Calculator -//TEST_F(CMTroughPhysicalIPH, DefaultLCOHFinancialModel_cmod_trough_physical_iph) { -// -// ssc_data_t data = ssc_data_create(); -// int test_errors = trough_physical_iph_tucson(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_gross_energy; -// ssc_data_get_number(data, "annual_gross_energy", &annual_gross_energy); -// EXPECT_NEAR(annual_gross_energy, 2.44933e7, 2.44933e7 * m_error_tolerance_lo) << "Annual Gross Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 2.44931e7, 2.44931e7 * m_error_tolerance_lo) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_electricity_consumption; -// ssc_data_get_number(data, "annual_electricity_consumption", &annual_electricity_consumption); -// EXPECT_NEAR(annual_electricity_consumption, 132796, 132796 * m_error_tolerance_lo) << "Annual Electricity Consumption"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t fixed_operating_cost; -// ssc_data_get_number(data, "fixed_operating_cost", &fixed_operating_cost); -// EXPECT_NEAR(fixed_operating_cost, 111726, 111726 * m_error_tolerance_lo) << "Fixed Operating Cost"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_thermal_consumption; -// ssc_data_get_number(data, "annual_thermal_consumption", &annual_thermal_consumption); -// EXPECT_NEAR(annual_thermal_consumption, 232.282, 232.282 * m_error_tolerance_lo) << "Annual Thermal Consumption"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_tes_freeze_protection; -// ssc_data_get_number(data, "annual_tes_freeze_protection", &annual_tes_freeze_protection); -// EXPECT_NEAR(annual_tes_freeze_protection, 232.282, 232.282 * m_error_tolerance_lo) << "Annual TES Freeze Protection"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_field_freeze_protection; -// ssc_data_get_number(data, "annual_field_freeze_protection", &annual_field_freeze_protection); -// EXPECT_NEAR(annual_field_freeze_protection, 0., m_error_tolerance_lo) << "Annual Field Freeze Protection"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t lcoe_fcr; -// ssc_data_get_number(data, "lcoe_fcr", &lcoe_fcr); -// EXPECT_NEAR(lcoe_fcr, 0.0376277, 0.0376277 * m_error_tolerance_lo) << "LCOE FCR"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 176.333, 176.333 * m_error_tolerance_lo) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// //ssc_number_t VARIABLE; -// //ssc_data_get_number(data, "VARIABLE", &VARIABLE); -// //EXPECT_NEAR(VARIABLE, EXP_VAL, EXP_VAL * m_error_tolerance_lo) << "DESCRIPTION"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// } -//} - -//TestResult iphTroughLCOHDefaultResult[] = { -// /* SSC Var Name Test Type Test Result Error Bound % */ -// { "annual_gross_energy", NR, 2.44933e7, 0.1 }, // Annual Gross Thermal Energy Production w/ avail derate [kWt-hr] -// { "annual_energy", NR, 2.44931e7, 0.1 }, // Annual Net Thermal Energy Production w/ avail derate [kWt-hr] -// { "annual_electricity_consumption", NR, 122659, 0.1 }, // Annual electricity consumptoin w/ avail derate [kWe-hr] -// { "fixed_operating_cost", NR, 111118, 0.1 }, // Annual fixed operating cost [$/kW] -// { "annual_thermal_consumption", NR, 236.609, 0.1 }, // Annual thermal freeze protection required [kWt-hr] -// { "annual_tes_freeze_protection", NR, 236.609, 0.1 }, // Annual thermal power for TES freeze protection [kWt-hr] -// { "annual_field_freeze_protection", NR, 0., 0.1 }, // Annual thermal power for field freeze protection [kWt-hr] -// { "lcoe_fcr", NR, 0.0375859, 0.1 }, // Levelized cost of energy [$/kWh] -// { "annual_total_water_use", NR, 176.333, 0.1 }, // Total Annual Water Usage [m^3] -//}; diff --git a/third_party/ssc/test/ssc_test/cmod_trough_physical_iph_test.h b/third_party/ssc/test/ssc_test/cmod_trough_physical_iph_test.h deleted file mode 100644 index faaa108be6e..00000000000 --- a/third_party/ssc/test/ssc_test/cmod_trough_physical_iph_test.h +++ /dev/null @@ -1,53 +0,0 @@ -#include - -#include "core.h" -#ifndef _CMOD_TROUGH_PHYSICAL_IPH_TEST_H_ -#define _CMOD_TROUGH_PHYSICAL_IPH_TEST_H_ - -#include "vartab.h" -#include "../ssc/common.h" -#include "../tcs_test/trough_physical_iph_cases.h" - -/** - * CMTroughPhysicalIPH tests the cmod_trough_physical_iph using the SAM code generator to generate data - * Eventually a method can be written to write this data to a vartable so that lower-level methods of - * trough_physical_process_heat can be tested - * For now, this uses the SSCAPI interfaces to run the compute module and compare results - */ -class CMTroughPhysicalIPH : public ::testing::Test{ - -public: - - ssc_data_t data; - ssc_number_t calculated_value; - ssc_number_t * calculated_array; - double m_error_tolerance_hi = 0.01; // 1.0% - double m_error_tolerance_lo = 0.001; // 0.1% - - void SetUp() - { - data = ssc_data_create(); - trough_physical_iph_default(data); - calculated_array = new ssc_number_t[8760]; - } - void TearDown() { - if (data) { - ssc_data_free(data); - data = nullptr; - } - if (calculated_array) { - delete[] calculated_array; - } - } - void SetCalculated(std::string name) - { - ssc_data_get_number(data, const_cast(name.c_str()), &calculated_value); - } - void SetCalculatedArray(std::string name) - { - int n; - calculated_array = ssc_data_get_array(data, const_cast(name.c_str()), &n); - } -}; - -#endif // !_CMOD_TROUGH_PHYSICAL_IPH_TEST_H_ diff --git a/third_party/ssc/test/ssc_test/cmod_trough_physical_test.cpp b/third_party/ssc/test/ssc_test/cmod_trough_physical_test.cpp index adfd797571a..e5a11f7011a 100644 --- a/third_party/ssc/test/ssc_test/cmod_trough_physical_test.cpp +++ b/third_party/ssc/test/ssc_test/cmod_trough_physical_test.cpp @@ -1,110 +1,35 @@ #include - -#include "cmod_trough_physical_test.h" -#include "../tcs_test/trough_physical_cases.h" -#include "../input_cases/weather_inputs.h" - -/// Test trough_physical with all defaults and no-financial model -TEST_F(CMTroughPhysical, DefaultNoFinancialModel_cmod_trough_physical){ - - int test_errors = run_module(data, "trough_physical"); - - EXPECT_FALSE(test_errors); - if (!test_errors) - { - //ssc_number_t annual_gross_energy; - //ssc_data_get_number(data, "annual_gross_energy", &annual_gross_energy); - //EXPECT_NEAR(annual_gross_energy, 3.671e8, 3.671e8 * m_error_tolerance_lo) << "Annual Gross Thermal Energy Production"; - - ssc_number_t annual_energy; - ssc_data_get_number(data, "annual_energy", &annual_energy); - EXPECT_NEAR(annual_energy, 369175344., 369175344. * m_error_tolerance_hi) << "Annual Net Thermal Energy Production"; - - ssc_number_t annual_thermal_consumption; - ssc_data_get_number(data, "annual_thermal_consumption", &annual_thermal_consumption); - EXPECT_NEAR(annual_thermal_consumption, 599751.371423, 599751.371423 * m_error_tolerance_hi) << "Annual Thermal Freeze Protection"; - - ssc_number_t annual_tes_freeze_protection; - ssc_data_get_number(data, "annual_tes_freeze_protection", &annual_tes_freeze_protection); - EXPECT_NEAR(annual_tes_freeze_protection, 561717.769603, 561717.769603 * m_error_tolerance_hi) << "Annual TES Freeze Protection"; - - ssc_number_t annual_field_freeze_protection; - ssc_data_get_number(data, "annual_field_freeze_protection", &annual_field_freeze_protection); - EXPECT_NEAR(annual_field_freeze_protection, 38036.686198, 38036.686198 * m_error_tolerance_hi) << "Annual Field Freeze Protection"; - - ssc_number_t capacity_factor; - ssc_data_get_number(data, "capacity_factor", &capacity_factor); - EXPECT_NEAR(capacity_factor, 42.18, 42.18 * m_error_tolerance_hi) << "Capacity factor"; - - ssc_number_t annual_W_cycle_gross; - ssc_data_get_number(data, "annual_W_cycle_gross", &annual_W_cycle_gross); - EXPECT_NEAR(annual_W_cycle_gross, 424232748.142327, 424232748.142327 * m_error_tolerance_hi) << "Power cycle gross electrical output"; - - ssc_number_t kwh_per_kw; - ssc_data_get_number(data, "kwh_per_kw", &kwh_per_kw); - EXPECT_NEAR(kwh_per_kw, 3695., 3695. * m_error_tolerance_hi) << "First year kWh/kW"; - - ssc_number_t conversion_factor; - ssc_data_get_number(data, "conversion_factor", &conversion_factor); - EXPECT_NEAR(conversion_factor, 87.92, 87.92 * m_error_tolerance_hi) << "Gross to Net Conversion Factor"; - - ssc_number_t annual_total_water_use; - ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); - EXPECT_NEAR(annual_total_water_use, 81059.873491, 81059.873491 * m_error_tolerance_hi) << "Annual Total Water Use"; - - //ssc_number_t VARIABLE; - //ssc_data_get_number(data, "VARIABLE", &VARIABLE); - //EXPECT_NEAR(VARIABLE, EXP_VAL, EXP_VAL * m_error_tolerance_lo) << "DESCRIPTION"; // choose either m_error_tolerance_lo or m_error_tolerance_hi - } +#include "trough_physical_defaults.h" +#include "csp_common_test.h" +#include "vs_google_test_explorer_namespace.h" + +namespace csp_trough {} +using namespace csp_trough; + +//========Tests=================================================================================== +NAMESPACE_TEST(csp_trough, PowerTroughCmod, Default_NoFinancial) +{ + ssc_data_t defaults = trough_physical_defaults(); + CmodUnderTest power_trough = CmodUnderTest("trough_physical", defaults); + int errors = power_trough.RunModule(); + EXPECT_FALSE(errors); + if (!errors) { + EXPECT_NEAR_FRAC(power_trough.GetOutput("annual_energy"), 369272759, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_trough.GetOutput("annual_thermal_consumption"), 596547, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_trough.GetOutput("annual_tes_freeze_protection"), 558505, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_trough.GetOutput("annual_field_freeze_protection"), 38042, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_trough.GetOutput("capacity_factor"), 42.20, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_trough.GetOutput("annual_W_cycle_gross"), 420379150, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_trough.GetOutput("kwh_per_kw"), 3696, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_trough.GetOutput("conversion_factor"), 87.84, kErrorToleranceLo); + EXPECT_NEAR_FRAC(power_trough.GetOutput("annual_total_water_use"), 80708, kErrorToleranceLo); + } + + //ssc_data_t defaults = singleowner_defaults(); + //CmodUnderTest singleowner = CmodUnderTest("singleowner", defaults); + //int errors = singleowner.RunModule(); + //EXPECT_FALSE(errors); + //if (!errors) { + // EXPECT_NEAR_FRAC(singleowner.GetOutput(""), , kErrorToleranceLo); + //} } - -/// Test trough_physical with all defaults and the financial model in the LCOH Calculator -//TEST_F(CMTroughPhysical, DefaultLCOHFinancialModel) { -// -// ssc_data_t data = ssc_data_create(); -// int test_errors = trough_physical_tucson(data); -// -// EXPECT_FALSE(test_errors); -// if (!test_errors) -// { -// ssc_number_t annual_gross_energy; -// ssc_data_get_number(data, "annual_gross_energy", &annual_gross_energy); -// EXPECT_NEAR(annual_gross_energy, 2.44933e7, 2.44933e7 * m_error_tolerance_lo) << "Annual Gross Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_energy; -// ssc_data_get_number(data, "annual_energy", &annual_energy); -// EXPECT_NEAR(annual_energy, 2.44931e7, 2.44931e7 * m_error_tolerance_lo) << "Annual Energy"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_electricity_consumption; -// ssc_data_get_number(data, "annual_electricity_consumption", &annual_electricity_consumption); -// EXPECT_NEAR(annual_electricity_consumption, 122659, 122659 * m_error_tolerance_lo) << "Annual Electricity Consumption"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t fixed_operating_cost; -// ssc_data_get_number(data, "fixed_operating_cost", &fixed_operating_cost); -// EXPECT_NEAR(fixed_operating_cost, 111118, 111118 * m_error_tolerance_lo) << "Fixed Operating Cost"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_thermal_consumption; -// ssc_data_get_number(data, "annual_thermal_consumption", &annual_thermal_consumption); -// EXPECT_NEAR(annual_thermal_consumption, 236.609, 236.609 * m_error_tolerance_lo) << "Annual Thermal Consumption"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_tes_freeze_protection; -// ssc_data_get_number(data, "annual_tes_freeze_protection", &annual_tes_freeze_protection); -// EXPECT_NEAR(annual_tes_freeze_protection, 236.609, 236.609 * m_error_tolerance_lo) << "Annual TES Freeze Protection"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_field_freeze_protection; -// ssc_data_get_number(data, "annual_field_freeze_protection", &annual_field_freeze_protection); -// EXPECT_NEAR(annual_field_freeze_protection, 0., m_error_tolerance_lo) << "Annual Field Freeze Protection"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t lcoe_fcr; -// ssc_data_get_number(data, "lcoe_fcr", &lcoe_fcr); -// EXPECT_NEAR(lcoe_fcr, 0.0375859, 0.0375859 * m_error_tolerance_lo) << "LCOE FCR"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// ssc_number_t annual_total_water_use; -// ssc_data_get_number(data, "annual_total_water_use", &annual_total_water_use); -// EXPECT_NEAR(annual_total_water_use, 176.333, 176.333 * m_error_tolerance_lo) << "Annual Total Water Use"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// -// //ssc_number_t VARIABLE; -// //ssc_data_get_number(data, "VARIABLE", &VARIABLE); -// //EXPECT_NEAR(VARIABLE, EXP_VAL, EXP_VAL * m_error_tolerance_lo) << "DESCRIPTION"; // choose either m_error_tolerance_lo or m_error_tolerance_hi -// } -//} diff --git a/third_party/ssc/test/ssc_test/cmod_trough_physical_test.h b/third_party/ssc/test/ssc_test/cmod_trough_physical_test.h deleted file mode 100644 index 959097d6efb..00000000000 --- a/third_party/ssc/test/ssc_test/cmod_trough_physical_test.h +++ /dev/null @@ -1,54 +0,0 @@ -#include - -#include "core.h" -#ifndef _CMOD_TROUGH_PHYSICAL_TEST_H_ -#define _CMOD_TROUGH_PHYSICAL_TEST_H_ - -#include "vartab.h" -#include "../ssc/common.h" -#include "../tcs_test/trough_physical_cases.h" - -/** - * CMTroughPhysical tests the cmod_trough_physical using the SAM code generator to generate data - * Eventually a method can be written to write this data to a vartable so that lower-level methods of - * trough_physical can be tested - * For now, this uses the SSCAPI interfaces to run the compute module and compare results - */ -class CMTroughPhysical : public ::testing::Test{ - -public: - - ssc_data_t data; - ssc_number_t calculated_value; - ssc_number_t * calculated_array; - double m_error_tolerance_hi = 0.01; // 1.0% - double m_error_tolerance_lo = 0.001; // 0.1% - - void SetUp() - { - data = ssc_data_create(); - trough_physical_default(data); - calculated_array = new ssc_number_t[8760]; - } - void TearDown() { - if (data) { - ssc_data_free(data); - data = nullptr; - } - if (calculated_array) { - delete[] calculated_array; - calculated_array = nullptr; - } - } - void SetCalculated(std::string name) - { - ssc_data_get_number(data, const_cast(name.c_str()), &calculated_value); - } - void SetCalculatedArray(std::string name) - { - int n; - calculated_array = ssc_data_get_array(data, const_cast(name.c_str()), &n); - } -}; - -#endif // !_CMOD_TROUGH_PHYSICAL_TEST_H_ diff --git a/third_party/ssc/test/ssc_test/cmod_windpower_test.cpp b/third_party/ssc/test/ssc_test/cmod_windpower_test.cpp index 723aee57fa0..b12b2c6b87d 100644 --- a/third_party/ssc/test/ssc_test/cmod_windpower_test.cpp +++ b/third_party/ssc/test/ssc_test/cmod_windpower_test.cpp @@ -145,7 +145,6 @@ TEST_F(CMWindPowerIntegration, UsingInterpolatedSubhourly_cmod_windpower) { EXPECT_TRUE(success) << "Computation 3 should succeed"; - check_annual_energy; ssc_data_get_number(data, "annual_energy", &check_annual_energy); EXPECT_NEAR(check_annual_energy, hourly_annual_energy, 0.005 * check_annual_energy); @@ -188,7 +187,6 @@ TEST_F(CMWindPowerIntegration, UsingDataArray_cmod_windpower) { compute(); - annual_energy; ssc_data_get_number(data, "annual_energy", &annual_energy); EXPECT_NEAR(annual_energy, expectedAnnualEnergy, relErr); diff --git a/third_party/ssc/test/ssc_test/csp_common_test.h b/third_party/ssc/test/ssc_test/csp_common_test.h new file mode 100644 index 00000000000..d33711efad2 --- /dev/null +++ b/third_party/ssc/test/ssc_test/csp_common_test.h @@ -0,0 +1,56 @@ +#ifndef _CSP_COMMON_TEST_H_ +#define _CSP_COMMON_TEST_H_ + +#include +#include +#include "../ssc/common.h" +//#include "csp_financial_defaults.h" +#include "../input_cases/code_generator_utilities.h" + +#define EXPECT_NEAR_FRAC(val1, val2, frac_error) EXPECT_NEAR(val1, val2, val2 * frac_error) +#define ASSERT_NEAR_FRAC(val1, val2, frac_error) ASSERT_NEAR(val1, val2, val2 * frac_error) + +const double kErrorToleranceLo = 0.001; // 0.1% +const double kErrorToleranceHi = 0.01; // 1.0% + +class CmodUnderTest { +public: + CmodUnderTest(std::string module_name, ssc_data_t defaults) + : module_name_{ module_name }, data_{ defaults } {} + ~CmodUnderTest() { + if (data_) { + ssc_data_free(data_); + data_ = nullptr; + } + } + int RunModule() { + int errors = run_module(this->data_, this->module_name_); + return errors; + } + void SetInput(std::string name, ssc_number_t value) { + ssc_data_set_number(this->data_, name.c_str(), value); + } + void SetInput(std::string name, std::string value) { + ssc_data_set_string(this->data_, name.c_str(), value.c_str()); + } + void SetInput(std::string name, ssc_number_t values[], int size) { + // deprecated, replaced by the following that uses initializer_list + ssc_data_set_array(this->data_, name.c_str(), values, size); + } + void SetInput(std::string name, const std::initializer_list& values) { + ssc_data_set_array(this->data_, name.c_str(), (ssc_number_t*)(values.begin()), values.size()); + } + ssc_number_t GetOutput(std::string name) const { + ssc_number_t output; + ssc_data_get_number(this->data_, name.c_str(), &output); + return output; + } +private: + const std::string module_name_; + ssc_data_t data_; +}; + + +ssc_data_t singleowner_defaults(); + +#endif diff --git a/third_party/ssc/test/tcs_test/lib_trough_properties.h b/third_party/ssc/test/tcs_test/lib_trough_properties.h deleted file mode 100644 index f676456578a..00000000000 --- a/third_party/ssc/test/tcs_test/lib_trough_properties.h +++ /dev/null @@ -1,506 +0,0 @@ -#ifndef __LIB_TROUGH_PROPERTIES__ -#define __LIB_TROUGH_PROPERTIES__ - -#include -#include - - -// Generic physical trough for the csp solver to be re-used -class TroughProperties : public ::testing::Test -{ -public: - - int nSCA; //[-] Number of SCA's in a loop - int nHCEt; //[-] Number of HCE types - int nColt; //[-] Number of collector types - int nHCEVar; //[-] Number of HCE variants per t - int nLoops; //[-] Number of loops in the field - int FieldConfig; //[-] Number of subfield headers - double L_power_block_piping; //[m] Length of piping (full mass flow) through power block (if applicable) - bool include_fixed_power_block_runner; //[-] Should model consider piping through power block (is_model_power_block_piping)? - double eta_pump; //[-] HTF pump efficiency - int Fluid; //[-] Field HTF fluid number - //int fthrok; //[-] Flag to allow partial defocusing of the collectors - int fthrctrl; //[-] Defocusing strategy; hardcode2 for now - int accept_loc; //[-] In acceptance testing mode - temperature sensor location (1=hx,2=loop) - double HDR_rough; //[m] Header pipe roughness - double theta_stow; //[deg] stow angle - double theta_dep; //[deg] deploy angle - double Row_Distance; //[m] Spacing between rows (centerline to centerline) - - double T_loop_in_des; //[C] Design loop inlet temperature, converted to K in init - double T_loop_out_des; //[C] Target loop outlet temperature, converted to K in init - double T_startup; //[C] The required temperature (converted to K in init) of the system before the power block can be switched on - double m_dot_htfmin; //[kg/s] Minimum loop HTF flow rate - double m_dot_htfmax; //[kg/s] Maximum loop HTF flow rate - util::matrix_t field_fl_props; //[-] User-defined field HTF properties - double T_fp; //[C] Freeze protection temperature (heat trace activation temperature), convert to K in init - double I_bn_des; //[W/m^2] Solar irradiation at design - double V_hdr_cold_max; //[m/s] Maximum HTF velocity in the cold header at design - double V_hdr_cold_min; //[m/s] Minimum HTF velocity in the cold header at design - double V_hdr_hot_max; //[m/s] Maximum HTF velocity in the hot header at design - double V_hdr_hot_min; //[m/s] Minimum HTF velocity in the hot header at design - double V_hdr_max; //[m/s] Maximum HTF velocity in the header at design, for backwards compatibility, marked for removal - double V_hdr_min; //[m/s] Minimum HTF velocity in the header at design, for backwards compatibility, marked for removal - double Pipe_hl_coef; //[W/m2-K] Loss coefficient from the header, runner pipe, and non-HCE piping - double SCA_drives_elec; //[W/SCA] Tracking power, in Watts per SCA drive - double ColTilt; //[deg] Collector tilt angle (0 is horizontal, 90deg is vertical) ("tilt") - double ColAz; //[deg] Collector azimuth angle ("azimuth") - double wind_stow_speed; //[m/s] Wind speed at and above which the collectors will be stowed - int accept_mode; //[-] Acceptance testing mode? (1=yes, 0=no) - bool accept_init; //[-] In acceptance testing mode - require steady-state startup - double solar_mult; //[-] Solar Multiple - double mc_bal_hot_per_MW; //[kWht/K-MWt] The heat capacity of the balance of plant on the hot side ("mc_bal_hot") - double mc_bal_cold_per_MW; //[kWht/K-MWt] The heat capacity of the balance of plant on the cold side ("mc_bal_cold") - double mc_bal_sca; //[Wht/K-m] Non-HTF heat capacity associated with each SCA - per meter basis - - std::vector W_aperture; //[m] The collector aperture width (Total structural area.. used for shadowing) - std::vector A_aperture; //[m^2] Reflective aperture area of the collector - std::vector TrackingError; //[-] Tracking error derate - std::vector GeomEffects; //[-] Geometry effects derate - std::vector Rho_mirror_clean; //[-] Clean mirror reflectivity - std::vector Dirt_mirror; //[-] Dirt on mirror derate - std::vector Error; //[-] General optical error derate - std::vector Ave_Focal_Length; //[m] The average focal length of the collector - std::vector L_SCA; //[m] The length of the SCA - std::vector L_aperture; //[m] The length of a single mirror/HCE unit - std::vector ColperSCA; //[-] The number of individual collector sections in an SCA - std::vector Distance_SCA; //[m] Piping distance between SCA's in the field - - util::matrix_t IAM_matrix; //[-] IAM coefficients, matrix for 4 collectors - util::matrix_t HCE_FieldFrac; //[-] Fraction of the field occupied by this HCE type - util::matrix_t D_2; //[m] Inner absorber tube diameter - util::matrix_t D_3; //[m] Outer absorber tube diameter - util::matrix_t D_4; //[m] Inner glass envelope diameter - util::matrix_t D_5; //[m] Outer glass envelope diameter - util::matrix_t D_p; //[m] Diameter of the absorber flow plug (optional) - util::matrix_t Flow_type; //[-] Flow type through the absorber - util::matrix_t Rough; //[m] Roughness of the internal surface - util::matrix_t alpha_env; //[-] Envelope absorptance - - util::matrix_t epsilon_3_11; //[-] Absorber emittance for receiver type 1 variation 1 - util::matrix_t epsilon_3_12; //[-] Absorber emittance for receiver type 1 variation 2 - util::matrix_t epsilon_3_13; //[-] Absorber emittance for receiver type 1 variation 3 - util::matrix_t epsilon_3_14; //[-] Absorber emittance for receiver type 1 variation 4 - util::matrix_t epsilon_3_21; //[-] Absorber emittance for receiver type 2 variation 1 - util::matrix_t epsilon_3_22; //[-] Absorber emittance for receiver type 2 variation 2 - util::matrix_t epsilon_3_23; //[-] Absorber emittance for receiver type 2 variation 3 - util::matrix_t epsilon_3_24; //[-] Absorber emittance for receiver type 2 variation 4 - util::matrix_t epsilon_3_31; //[-] Absorber emittance for receiver type 3 variation 1 - util::matrix_t epsilon_3_32; //[-] Absorber emittance for receiver type 3 variation 2 - util::matrix_t epsilon_3_33; //[-] Absorber emittance for receiver type 3 variation 3 - util::matrix_t epsilon_3_34; //[-] Absorber emittance for receiver type 3 variation 4 - util::matrix_t epsilon_3_41; //[-] Absorber emittance for receiver type 4 variation 1 - util::matrix_t epsilon_3_42; //[-] Absorber emittance for receiver type 4 variation 2 - util::matrix_t epsilon_3_43; //[-] Absorber emittance for receiver type 4 variation 3 - util::matrix_t epsilon_3_44; //[-] Absorber emittance for receiver type 4 variation 4 - - util::matrix_t alpha_abs; //[-] Absorber absorptance - util::matrix_t Tau_envelope; //[-] Envelope transmittance - util::matrix_t EPSILON_4; //[-] Inner glass envelope emissivities - util::matrix_t EPSILON_5; //[-] Outer glass envelope emissivities - util::matrix_t GlazingIntact_dbl; //[-] Glazing intact (broken glass) flag {1=true, else=false}, as double - util::matrix_t GlazingIntact; //[-] Glazing intact (broken glass) flag {1=true, else=false} - util::matrix_t P_a; //[torr] Annulus gas pressure - util::matrix_t AnnulusGas; //[-] Annulus gas type (1=air, 26=Ar, 27=H2) - util::matrix_t AbsorberMaterial; //[-] Absorber material type - util::matrix_t Shadowing; //[-] Receiver bellows shadowing loss factor - util::matrix_t Dirt_HCE; //[-] Loss due to dirt on the receiver envelope - util::matrix_t Design_loss; //[-] Receiver heat loss at design - util::matrix_t SCAInfoArray; //[-] Receiver (,1) and collector (,2) type for each assembly in loop - - bool calc_design_pipe_vals; //[-] Should the HTF state be calculated at design conditions - double L_rnr_pb; //[m] Length of hot or cold runner pipe around the power block - double N_max_hdr_diams; //[-] Maximum number of allowed diameters in each of the hot and cold headers - double L_rnr_per_xpan; //[m] Threshold length of straight runner pipe without an expansion loop - double L_xpan_hdr; //[m] Combined length in meters of the two perpendicular segments of a header expansion loop - double L_xpan_rnr; //[m] Combined length in meters of the two perpendicular segments of a runner expansion loop - double Min_rnr_xpans; //[-] Minimum number of expansion loops per single-diameter runner section - double northsouth_field_sep; //[m] Shortest north/south distance between SCAs in different subfields - double N_hdr_per_xpan; //[-] Number of collector loops per header expansion loops. 1expansion loop between every collector loop - util::matrix_t K_cpnt; //[-] Minor loss coefficients of the components in each loop interconnect - util::matrix_t D_cpnt; //[m] Inner diameters of the components in each loop interconnect - util::matrix_t L_cpnt; //[m] Lengths of the components in each loop interconnect - util::matrix_t Type_cpnt; //[-] Type of component in each loop interconnect [0=fitting | 1=pipe | 2=flex_hose] - bool custom_sf_pipe_sizes; //[-] Should the field pipe diameters, wall thickness and lengths be imported instead of calculated - util::matrix_t sf_rnr_diams; //[m] Imported runner diameters, used if custom_sf_pipe_sizes is true - util::matrix_t sf_rnr_wallthicks; //[m] Imported runner wall thicknesses, used if custom_sf_pipe_sizes is true - util::matrix_t sf_rnr_lengths; //[m] Imported runner lengths, used if custom_sf_pipe_sizes is true - util::matrix_t sf_hdr_diams; //[m] Imported header diameters, used if custom_sf_pipe_sizes is true - util::matrix_t sf_hdr_wallthicks; //[m] Imported header wall thicknesses, used if custom_sf_pipe_sizes is true - util::matrix_t sf_hdr_lengths; //[m] Imported header lengths, used if custom_sf_pipe_sizes is true - - void SetUp() - { - nSCA = 8; - nHCEt = 4; - nColt = 4; - nHCEVar = 4; - nLoops = 181; - FieldConfig = 2; - L_power_block_piping = 50.; - include_fixed_power_block_runner = true; - eta_pump = 0.85; - Fluid = 21; - fthrctrl = 2; - accept_loc = 1; - HDR_rough = 4.57e-5; - theta_stow = 170.; - theta_dep = 10.; - Row_Distance = 15.; - - T_loop_in_des = 293.; - T_loop_out_des = 391.; - T_startup = 0.67*T_loop_in_des + 0.33*T_loop_out_des; //[C] - m_dot_htfmin = 1.; - m_dot_htfmax = 12.; - double vals[] = { 0 }; - field_fl_props.assign(vals, 1, 1); - T_fp = 150.; - I_bn_des = 950.; - V_hdr_cold_max = 3.; - V_hdr_cold_min = 2.; - V_hdr_hot_max = 3.; - V_hdr_hot_min = 2.; - V_hdr_max = std::min(V_hdr_cold_max, V_hdr_hot_max); - V_hdr_min = std::max(V_hdr_cold_min, V_hdr_hot_min); - Pipe_hl_coef = 0.45; - SCA_drives_elec = 125.; - ColTilt = 0.; - ColAz = 0.; - wind_stow_speed = 25.; - accept_mode = 0; - accept_init = false; - solar_mult = 2.; - mc_bal_hot_per_MW = 0.2; - mc_bal_cold_per_MW = 0.2; - mc_bal_sca = 4.5; - - W_aperture = { 6, 6, 6, 6 }; - A_aperture = { 656, 656, 656, 656 }; - TrackingError = { 0.988, 0.988, 0.988, 0.988 }; - GeomEffects = { 0.952, 0.952, 0.952, 0.952 }; - Rho_mirror_clean = { 0.93, 0.93, 0.93, 0.93 }; - Dirt_mirror = { 0.97, 0.97, 0.97, 0.97 }; - Error = { 1., 1., 1., 1. }; - Ave_Focal_Length = { 2.15, 2.15, 2.15, 2.15 }; - L_SCA = { 115., 115., 115., 115. }; - L_aperture = { 14.375, 14.375, 14.375, 14.375 }; - ColperSCA = { 8., 8., 8., 8. }; - Distance_SCA = { 1., 1., 1., 1. }; - - double vals2[] = { - 1, 0.0327, -0.1351, - 1, 0.0327, -0.1351, - 1, 0.0327, -0.1351, - 1, 0.0327, -0.1351 }; - IAM_matrix.assign(vals2, 4, 3); - - double vals3[] = { - 0.985, 0.01, 0.005, 0., - 1., 0., 0., 0., - 1., 0., 0., 0., - 1., 0., 0., 0. }; - HCE_FieldFrac.assign(vals3, 4, 4); - - double vals4[] = { - 0.076, 0.076, 0.076, 0.076, - 0.076, 0.076, 0.076, 0.076, - 0.076, 0.076, 0.076, 0.076, - 0.076, 0.076, 0.076, 0.076 }; - D_2.assign(vals4, 4, 4); - - double vals5[] = { - 0.08, 0.08, 0.08, 0.08, - 0.08, 0.08, 0.08, 0.08, - 0.08, 0.08, 0.08, 0.08, - 0.08, 0.08, 0.08, 0.08 }; - D_3.assign(vals5, 4, 4); - - double vals6[] = { - 0.115, 0.115, 0.115, 0.115, - 0.115, 0.115, 0.115, 0.115, - 0.115, 0.115, 0.115, 0.115, - 0.115, 0.115, 0.115, 0.115 }; - D_4.assign(vals6, 4, 4); - - double vals7[] = { - 0.12, 0.12, 0.12, 0.12, - 0.12, 0.12, 0.12, 0.12, - 0.12, 0.12, 0.12, 0.12, - 0.12, 0.12, 0.12, 0.12 }; - D_5.assign(vals7, 4, 4); - - double vals8[] = { - 0., 0., 0., 0., - 0., 0., 0., 0., - 0., 0., 0., 0., - 0., 0., 0., 0. }; - D_p.assign(vals8, 4, 4); - - double vals9[] = { - 1., 1., 1., 1., - 1., 1., 1., 1., - 1., 1., 1., 1., - 1., 1., 1., 1. }; - Flow_type.assign(vals9, 4, 4); - - double vals10[] = { - 4.5e-5, 4.5e-5, 4.5e-5, 4.5e-5, - 4.5e-5, 4.5e-5, 4.5e-5, 4.5e-5, - 4.5e-5, 4.5e-5, 4.5e-5, 4.5e-5, - 4.5e-5, 4.5e-5, 4.5e-5, 4.5e-5 }; - Rough.assign(vals10, 4, 4); - - double vals11[] = { - 0.02, 0.02, 0., 0., - 0.02, 0.02, 0., 0., - 0.02, 0.02, 0., 0., - 0.02, 0.02, 0., 0. }; - alpha_env.assign(vals11, 4, 4); - - double vals12[] = { - 100., 150., 200., 250., 300., 350., 400., 450., 500., - 0.064, 0.0665, 0.07, 0.0745, 0.08, 0.0865, 0.094, 0.1025, 0.112 }; - epsilon_3_11.assign(vals12, 2, 9); - - double vals13[] = { 0.65 }; - epsilon_3_12.assign(vals13, 1, 1); - - double vals14[] = { 0.65 }; - epsilon_3_13.assign(vals14, 1, 1); - - double vals15[] = { 0. }; - epsilon_3_14.assign(vals15, 0, 0); - - double vals16[] = { - 100., 150., 200., 250., 300., 350., 400., 450., 500., - 0.064, 0.0665, 0.07, 0.0745, 0.08, 0.0865, 0.094, 0.1025, 0.112 }; - epsilon_3_21.assign(vals16, 2, 9); - - double vals17[] = { 0.65 }; - epsilon_3_22.assign(vals17, 1, 1); - - double vals18[] = { 0.65 }; - epsilon_3_23.assign(vals18, 1, 1); - - double vals19[] = { 0. }; - epsilon_3_24.assign(vals19, 1, 1); - - double vals20[] = { - 100., 150., 200., 250., 300., 350., 400., 450., 500., - 0.064, 0.0665, 0.07, 0.0745, 0.08, 0.0865, 0.094, 0.1025, 0.112 }; - epsilon_3_31.assign(vals20, 2, 9); - - double vals21[] = { 0.65 }; - epsilon_3_32.assign(vals21, 1, 1); - - double vals22[] = { 0.65 }; - epsilon_3_33.assign(vals22, 1, 1); - - double vals23[] = { 0. }; - epsilon_3_34.assign(vals23, 1, 1); - - double vals24[] = { - 100., 150., 200., 250., 300., 350., 400., 450., 500., - 0.064, 0.0665, 0.07, 0.0745, 0.08, 0.0865, 0.094, 0.1025, 0.112 }; - epsilon_3_41.assign(vals24, 2, 9); - - double vals25[] = { 0.65 }; - epsilon_3_42.assign(vals25, 1, 1); - - double vals26[] = { 0.65 }; - epsilon_3_43.assign(vals26, 1, 1); - - double vals27[] = { 0. }; - epsilon_3_44.assign(vals27, 1, 1); - - double vals28[] = { - 0.963, 0.963, 0.8, 0., - 0.963, 0.963, 0.8, 0., - 0.963, 0.963, 0.8, 0., - 0.963, 0.963, 0.8, 0.}; - alpha_abs.assign(vals28, 4, 4); - - double vals29[] = { - 0.964, 0.964, 1., 0., - 0.964, 0.964, 1., 0., - 0.964, 0.964, 1., 0., - 0.964, 0.964, 1., 0.}; - Tau_envelope.assign(vals29, 4, 4); - - double vals30[] = { - 0.86, 0.86, 1., 0., - 0.86, 0.86, 1., 0., - 0.86, 0.86, 1., 0., - 0.86, 0.86, 1., 0.}; - EPSILON_4.assign(vals30, 4, 4); - - double vals31[] = { - 0.86, 0.86, 1., 0., - 0.86, 0.86, 1., 0., - 0.86, 0.86, 1., 0., - 0.86, 0.86, 1., 0. }; - EPSILON_5.assign(vals31, 4, 4); - - double vals32[] = { - 1., 1., 0., 1., - 1., 1., 0., 1., - 1., 1., 0., 1., - 1., 1., 0., 1.}; - GlazingIntact_dbl.assign(vals32, 4, 4); - // convert to - int n_gl_row = (int)GlazingIntact_dbl.nrows(); - int n_gl_col = (int)GlazingIntact_dbl.ncols(); - GlazingIntact.resize(n_gl_row, n_gl_col); - for (int i = 0; i < n_gl_row; i++) { - for (int j = 0; j < n_gl_col; j++) { - GlazingIntact(i, j) = (GlazingIntact_dbl(i, j) > 0); - } - } - - double vals33[] = { - 1.e-4, 750., 750., 0., - 1.e-4, 750., 750., 0., - 1.e-4, 750., 750., 0., - 1.e-4, 750., 750., 0., }; - P_a.assign(vals33, 4, 4); - - double vals34[] = { - 27., 1., 1., 27., - 27., 1., 1., 27., - 27., 1., 1., 27., - 27., 1., 1., 27., }; - AnnulusGas.assign(vals34, 4, 4); - - double vals35[] = { - 1., 1., 1., 1., - 1., 1., 1., 1., - 1., 1., 1., 1., - 1., 1., 1., 1., }; - AbsorberMaterial.assign(vals35, 4, 4); - - double vals36[] = { - 0.935, 0.935, 0.935, 0.963, - 0.935, 0.935, 0.935, 0.963, - 0.935, 0.935, 0.935, 0.963, - 0.935, 0.935, 0.935, 0.963}; - Shadowing.assign(vals36, 4, 4); - - double vals37[] = { - 0.98, 0.98, 1., 0.98, - 0.98, 0.98, 1., 0.98, - 0.98, 0.98, 1., 0.98, - 0.98, 0.98, 1., 0.98, }; - Dirt_HCE.assign(vals37, 4, 4); - - double vals38[] = { - 190., 1270., 1500., 0., - 190., 1270., 1500., 0., - 190., 1270., 1500., 0., - 190., 1270., 1500., 0.}; - Design_loss.assign(vals38, 4, 4); - - double vals39[] = { - 1., 1., - 1., 1., - 1., 1., - 1., 1., - 1., 1., - 1., 1., - 1., 1., - 1., 1.}; - SCAInfoArray.assign(vals39, 8, 2); - - calc_design_pipe_vals = true; - L_rnr_pb = 25.; - N_max_hdr_diams = 10.; - L_rnr_per_xpan = 70.; - L_xpan_hdr = 20.; - L_xpan_rnr = 20.; - Min_rnr_xpans = 1.; - northsouth_field_sep = 20.; - N_hdr_per_xpan = 2.; - - double vals40[] = { - 0.9, 0., 0.19, 0., 0.9, -1., -1., -1., -1., -1., -1., - 0., 0.6, 0.05, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, - 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, - 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, - 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, - 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, - 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, - 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, - 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.42, 0., 0.15, - 0.05, 0., 0.42, 0., 0.6, 0., 0.6, 0., 0.15, 0.6, 0., - 0.9, 0., 0.19, 0., 0.9, -1., -1., -1., -1., -1., -1.}; - K_cpnt.assign(vals40, 11, 11); - - double vals41[] = { - 0.085, 0.0635, 0.085, 0.0635, 0.085, -1., -1., -1., -1., -1., -1., - 0.085, 0.085, 0.085, 0.0635, 0.0635, 0.0635,0.0635, 0.0635, 0.0635, 0.0635, 0.085, - 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.085, - 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.085, - 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.085, - 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.085, - 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.085, - 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.085, - 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635, 0.085, - 0.085, 0.0635, 0.0635, 0.0635, 0.0635, 0.0635,0.0635, 0.0635, 0.085, 0.085, 0.085, - 0.085, 0.0635, 0.085, 0.0635, 0.085, -1., -1., -1., -1., -1., -1.}; - D_cpnt.assign(vals41, 11, 11); - - double vals42[] = { - 0., 0., 0., 0., 0., -1., -1., -1., -1., -1., -1., - 0., 0., 0., 1., 0., 0., 0., 1., 0., 1., 0., - 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 0., - 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 0., - 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 0., - 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 0., - 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 0., - 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 0., - 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 0., - 0., 1., 0., 1., 0., 0., 0., 1., 0., 0., 0., - 0., 0., 0., 0., 0., -1., -1., -1., -1., -1., -1.}; - L_cpnt.assign(vals42, 11, 11); - - double vals43[] = { - 0., 1., 0., 1., 0., -1., -1., -1., -1., -1., -1., - 1., 0., 0., 2., 0., 1., 0., 2., 0., 2., 0., - 0., 2., 0., 2., 0., 1., 0., 2., 0., 2., 0., - 0., 2., 0., 2., 0., 1., 0., 2., 0., 2., 0., - 0., 2., 0., 2., 0., 1., 0., 2., 0., 2., 0., - 0., 2., 0., 2., 0., 1., 0., 2., 0., 2., 0., - 0., 2., 0., 2., 0., 1., 0., 2., 0., 2., 0., - 0., 2., 0., 2., 0., 1., 0., 2., 0., 2., 0., - 0., 2., 0., 2., 0., 1., 0., 2., 0., 2., 0., - 0., 2., 0., 2., 0., 1., 0., 2., 0., 0., 1., - 0., 1., 0., 1., 0., -1., -1., -1., -1., -1., -1.}; - Type_cpnt.assign(vals43, 11, 11); - - custom_sf_pipe_sizes = false; - - double vals44[] = { -1. }; - sf_rnr_diams.assign(vals44, 1, 1); - - double vals45[] = { -1 }; - sf_rnr_wallthicks.assign(vals45, 1, 1); - - double vals46[] = { -1 }; - sf_rnr_lengths.assign(vals46, 1, 1); - - double vals47[] = { -1 }; - sf_hdr_diams.assign(vals47, 1, 1); - - double vals48[] = { -1 }; - sf_hdr_wallthicks.assign(vals48, 1, 1); - - double vals49[] = { -1 }; - sf_hdr_lengths.assign(vals49, 1, 1); - } - - //nothing to do - void TearDown(){} -}; - -#endif \ No newline at end of file diff --git a/third_party/ssc/test/tcs_test/lib_trough_test.cpp b/third_party/ssc/test/tcs_test/lib_trough_test.cpp deleted file mode 100644 index 48388afcfe5..00000000000 --- a/third_party/ssc/test/tcs_test/lib_trough_test.cpp +++ /dev/null @@ -1,174 +0,0 @@ -#include - -#define private public // for setting private data members -#include "lib_trough_test.h" -/* -TEST_F(TroughTest, DefocusTest_csp_solver_trough_collector_receiver) -{ - // at time 1476 (1477 end time listed in output) - weatherValues.m_year = 2009; - weatherValues.m_month = 3; - weatherValues.m_day = 3; - weatherValues.m_hour = 12; - weatherValues.m_minute = 0; - weatherValues.m_beam = 488; - weatherValues.m_tdry = 27; - weatherValues.m_tdew = -4; - weatherValues.m_wspd = 3; - weatherValues.m_pres = 920; - weatherValues.m_solazi = 166.04812459961; - weatherValues.m_solzen = 39.5823887774745; - - htfInletState.m_temp = 297.95980959101303; //297.95980959101303; - defocus = 0.77316; - - troughInfo.ms_ts.m_time_start = 5313600.; - troughInfo.ms_ts.m_time = 5317200.; - troughInfo.ms_ts.m_step = 3600.; - troughInfo.m_tou = 1.; - - // previous HTF temperatures [K] - troughModel->m_T_sys_c_t_end_converged = 571.979992782819; // this sets m_T_sys_c_t_end_last - troughModel->m_T_sys_h_t_end_converged = 663.79113603342; // this sets m_T_sys_h_t_end_last - // SCA temperatures - these set the values of m_T_htf_out_t_end_last[i] - troughModel->m_T_htf_out_t_end_converged[0] = 585.2012765; - troughModel->m_T_htf_out_t_end_converged[1] = 597.5706153; - troughModel->m_T_htf_out_t_end_converged[2] = 609.5327793; - troughModel->m_T_htf_out_t_end_converged[3] = 621.1103321; - troughModel->m_T_htf_out_t_end_converged[4] = 632.2659289; - troughModel->m_T_htf_out_t_end_converged[5] = 643.1282423; - troughModel->m_T_htf_out_t_end_converged[6] = 653.6533931; - troughModel->m_T_htf_out_t_end_converged[7] = 663.8068978; - - - troughModel->on(weatherValues, htfInletState, defocus, troughOutputs, troughInfo); - - EXPECT_NEAR(troughOutputs.m_T_salt_hot, 390.98, 390.98 * m_error_tolerance_lo); - EXPECT_NEAR(troughOutputs.m_m_dot_salt_tot, 2443500., 2443500. * m_error_tolerance_lo); - - - //// Change defocus, increase by 0.0013% - //defocus = 0.77317; - //troughModel->on(weatherValues, htfInletState, defocus, troughOutputs, troughInfo); - - //EXPECT_NEAR(troughOutputs.m_T_salt_hot, 390.39, 390.39 * m_error_tolerance_lo); - //EXPECT_NEAR(troughOutputs.m_m_dot_salt_tot, 2494962., 2494962. * m_error_tolerance_lo); - //// mass flow increases by 2.1% -} - -TEST_F(TroughTest, DefocusTest2_csp_solver_trough_collector_receiver) -{ - // at time 1068 (1069 end time listed in output) - weatherValues.m_year = 2009; - weatherValues.m_month = 2; - weatherValues.m_day = 14; - weatherValues.m_hour = 12; - weatherValues.m_minute = 0; - weatherValues.m_beam = 1016.0; - weatherValues.m_tdry = 16.0; - weatherValues.m_tdew = -14.0; - weatherValues.m_wspd = 1.2; - weatherValues.m_pres = 920.0; - weatherValues.m_solazi = 167.05961724080794; - weatherValues.m_solzen = 45.793932659900818; - - htfInletState.m_temp = 296.47387218057872; // 289.38622217774684; - defocus = 0.31113892655015696; - - troughInfo.ms_ts.m_time_start = 3844800.; - troughInfo.ms_ts.m_time = 3848400.; - troughInfo.ms_ts.m_step = 3600.; - troughInfo.m_tou = 1.; - - // previous HTF temperatures [K] - troughModel->m_T_sys_c_t_end_converged = 574.56624498543692; // this sets m_T_sys_c_t_end_last - troughModel->m_T_sys_h_t_end_converged = 664.49041436768960; // this sets m_T_sys_h_t_end_last - // SCA temperatures - these set the values of m_T_htf_out_t_end_last[i] - troughModel->m_T_htf_out_t_end_converged[0] = 586.54320898265996; - troughModel->m_T_htf_out_t_end_converged[1] = 598.40229621263472; - troughModel->m_T_htf_out_t_end_converged[2] = 610.02021991454296; - troughModel->m_T_htf_out_t_end_converged[3] = 621.40305775456318; - troughModel->m_T_htf_out_t_end_converged[4] = 632.53459357521194; - troughModel->m_T_htf_out_t_end_converged[5] = 643.46237590525539; - troughModel->m_T_htf_out_t_end_converged[6] = 654.17081551318063; - troughModel->m_T_htf_out_t_end_converged[7] = 664.58682197556709; - - - troughModel->on(weatherValues, htfInletState, defocus, troughOutputs, troughInfo); - - EXPECT_NEAR(troughOutputs.m_T_salt_hot, 390.96, 390.96 * m_error_tolerance_lo); - EXPECT_NEAR(troughOutputs.m_m_dot_salt_tot, 1705004.8, 1705004.8 * m_error_tolerance_lo); -} - -TEST_F(TroughTest, SteadyStateTest_csp_solver_trough_collector_receiver) -{ - troughModel->m_accept_mode = 1; // flag so solar zenith from weather is used instead of calc'd - troughModel->m_accept_init = false; // running at steady-state but keeping false to avoid side effects - troughModel->m_accept_loc = 1; // don't just model a single loop - troughModel->m_is_using_input_gen = false; // use parameter values set below instead - - // at time 1476 (1477 end time listed in output) - weatherValues.m_year = 2009; - weatherValues.m_month = 6; - weatherValues.m_day = 21; - weatherValues.m_hour = 12; - weatherValues.m_minute = 0; - weatherValues.m_beam = troughModel->m_I_bn_des; - weatherValues.m_tdry = 30; - weatherValues.m_tdew = 30 - 10; - weatherValues.m_wspd = 5; - weatherValues.m_pres = 1013; - weatherValues.m_solazi = troughModel->m_ColAz; - weatherValues.m_solzen = troughModel->m_ColTilt; - - //htfInletState.m_m_dot = troughModel->m_m_dot_design; - //htfInletState.m_pres = 101.3; - //htfInletState.m_qual = 0; - htfInletState.m_temp = troughModel->m_T_loop_in_des - 273.15; - defocus = 1.0; - - troughInfo.ms_ts.m_time_start = 14817600.; - troughInfo.ms_ts.m_step = 5.*60.; // 5-minute timesteps - troughInfo.ms_ts.m_time = troughInfo.ms_ts.m_time_start + troughInfo.ms_ts.m_step; - troughInfo.m_tou = 1.; - - troughModel->m_T_sys_c_t_end_converged = htfInletState.m_temp + 273.15; // this sets m_T_sys_c_t_end_last - troughModel->m_T_sys_h_t_end_converged = htfInletState.m_temp + 273.15; // this sets m_T_sys_h_t_end_last - troughModel->m_T_htf_out_t_end_converged.assign(troughModel->m_nSCA, htfInletState.m_temp + 273.15); - - // Values for checking whether steady-state - double ss_diff = std::numeric_limits::quiet_NaN(); - const double tol = 0.05; - std::vector T_htf_in_t_int_prev = troughModel->m_T_htf_in_t_int; - std::vector T_htf_out_t_int_prev = troughModel->m_T_htf_out_t_int; - double minutes2SS = 0.; - - do - { - troughModel->on(weatherValues, htfInletState, defocus, troughOutputs, troughInfo); - - // Calculate metric for deciding whether steady-state is reached - ss_diff = 0.; - for (int i = 0; i < troughModel->m_nSCA; i++) { - ss_diff += fabs(troughModel->m_T_htf_in_t_int[i] - T_htf_in_t_int_prev[i]) + - fabs(troughModel->m_T_htf_out_t_int[i] - T_htf_out_t_int_prev[i]); - } - - // Set converged values so reset_last_temps() propagates the temps in time - troughModel->m_T_sys_c_t_end_converged = troughModel->m_T_sys_c_t_end; - troughModel->m_T_sys_h_t_end_converged = troughModel->m_T_sys_h_t_end; - // SCA temperatures - these set the values of m_T_htf_out_t_end_last[i] - troughModel->m_T_htf_out_t_end_converged = troughModel->m_T_htf_out_t_end; - - // Update 'last' values - T_htf_in_t_int_prev = troughModel->m_T_htf_in_t_int; - T_htf_out_t_int_prev = troughModel->m_T_htf_out_t_int; - - minutes2SS += troughInfo.ms_ts.m_step / 60.; - - } while (ss_diff / 200. > tol); - - EXPECT_NEAR(troughModel->m_T_sys_h_t_end, 656.3, 656.3 * m_error_tolerance_lo); - EXPECT_NEAR(minutes2SS, 40., 40. * m_error_tolerance_hi); -} -*/ \ No newline at end of file diff --git a/third_party/ssc/test/tcs_test/lib_trough_test.h b/third_party/ssc/test/tcs_test/lib_trough_test.h deleted file mode 100644 index f93eb5f5f8a..00000000000 --- a/third_party/ssc/test/tcs_test/lib_trough_test.h +++ /dev/null @@ -1,193 +0,0 @@ -#ifndef __LIB_TROUGH_TEST_H__ -#define __LIB_TROUGH_TEST_H__ - -#include -#include "csp_solver_trough_collector_receiver.h" - -#include "lib_trough_properties.h" - -class TroughTest : public TroughProperties -{ -protected: - C_csp_trough_collector_receiver *troughModel; - C_csp_collector_receiver::S_csp_cr_init_inputs troughInitInputs; // for init() - C_csp_collector_receiver::S_csp_cr_solved_params troughSolvedParams; // for init() - - C_csp_weatherreader::S_outputs weatherValues; - C_csp_solver_htf_1state htfInletState; - double defocus; - C_csp_solver_sim_info troughInfo; - C_csp_collector_receiver::S_csp_cr_out_solver troughOutputs; - -public: - double m_error_tolerance_lo = 0.001; // 0.1% - double m_error_tolerance_hi = 0.01; // 1.0% - - void SetUp() { - TroughProperties::SetUp(); - troughModel = new C_csp_trough_collector_receiver(); - - troughModel->m_nSCA = nSCA; - troughModel->m_nHCEt = nHCEt; - troughModel->m_nColt = nColt; - troughModel->m_nHCEVar = nHCEVar; - troughModel->m_nLoops = nLoops; - troughModel->m_FieldConfig = FieldConfig; - troughModel->m_L_power_block_piping = L_power_block_piping; - troughModel->m_include_fixed_power_block_runner = include_fixed_power_block_runner; - troughModel->m_eta_pump = eta_pump; - troughModel->m_Fluid = Fluid; - //troughModel->m_fthrok = fthrok; - troughModel->m_fthrctrl = fthrctrl; - troughModel->m_accept_loc = accept_loc; - troughModel->m_HDR_rough = HDR_rough; - troughModel->m_theta_stow = theta_stow; - troughModel->m_theta_dep = theta_dep; - troughModel->m_Row_Distance = Row_Distance; - - troughModel->m_T_loop_in_des = T_loop_in_des; - troughModel->m_T_loop_out_des = T_loop_out_des; - troughModel->m_T_startup = T_startup; - troughModel->m_m_dot_htfmin = m_dot_htfmin; - troughModel->m_m_dot_htfmax = m_dot_htfmax; - troughModel->m_field_fl_props = field_fl_props; - troughModel->m_T_fp = T_fp; - troughModel->m_I_bn_des = I_bn_des; - troughModel->m_V_hdr_cold_max = V_hdr_cold_max; - troughModel->m_V_hdr_cold_min = V_hdr_cold_min; - troughModel->m_V_hdr_hot_max = V_hdr_hot_max; - troughModel->m_V_hdr_hot_min = V_hdr_hot_min; - troughModel->m_V_hdr_max = V_hdr_max; - troughModel->m_V_hdr_min = V_hdr_min; - troughModel->m_Pipe_hl_coef = Pipe_hl_coef; - troughModel->m_SCA_drives_elec = SCA_drives_elec; - troughModel->m_ColTilt = ColTilt; - troughModel->m_ColAz = ColAz; - troughModel->m_wind_stow_speed = wind_stow_speed; - troughModel->m_accept_mode = accept_mode; - troughModel->m_accept_init = accept_init; - troughModel->m_solar_mult = solar_mult; - troughModel->m_mc_bal_hot_per_MW = mc_bal_hot_per_MW; - troughModel->m_mc_bal_cold_per_MW = mc_bal_cold_per_MW; - troughModel->m_mc_bal_sca = mc_bal_sca; - - troughModel->m_W_aperture = W_aperture; - troughModel->m_A_aperture = A_aperture; - troughModel->m_TrackingError = TrackingError; - troughModel->m_GeomEffects = GeomEffects; - troughModel->m_Rho_mirror_clean = Rho_mirror_clean; - troughModel->m_Dirt_mirror = Dirt_mirror; - troughModel->m_Error = Error; - troughModel->m_Ave_Focal_Length = Ave_Focal_Length; - troughModel->m_L_SCA = L_SCA; - troughModel->m_L_aperture = L_aperture; - troughModel->m_ColperSCA = ColperSCA; - troughModel->m_Distance_SCA = Distance_SCA; - - troughModel->m_IAM_matrix = IAM_matrix; - troughModel->m_HCE_FieldFrac = HCE_FieldFrac; - troughModel->m_D_2 = D_2; - troughModel->m_D_3 = D_3; - troughModel->m_D_4 = D_4; - troughModel->m_D_5 = D_5; - troughModel->m_D_p = D_p; - troughModel->m_Flow_type = Flow_type; - troughModel->m_Rough = Rough; - troughModel->m_alpha_env = alpha_env; - - troughModel->m_epsilon_3_11 = epsilon_3_11; - troughModel->m_epsilon_3_12 = epsilon_3_12; - troughModel->m_epsilon_3_13 = epsilon_3_13; - troughModel->m_epsilon_3_14 = epsilon_3_14; - troughModel->m_epsilon_3_21 = epsilon_3_21; - troughModel->m_epsilon_3_22 = epsilon_3_22; - troughModel->m_epsilon_3_23 = epsilon_3_23; - troughModel->m_epsilon_3_24 = epsilon_3_24; - troughModel->m_epsilon_3_31 = epsilon_3_31; - troughModel->m_epsilon_3_32 = epsilon_3_32; - troughModel->m_epsilon_3_33 = epsilon_3_33; - troughModel->m_epsilon_3_34 = epsilon_3_34; - troughModel->m_epsilon_3_41 = epsilon_3_41; - troughModel->m_epsilon_3_42 = epsilon_3_42; - troughModel->m_epsilon_3_43 = epsilon_3_43; - troughModel->m_epsilon_3_44 = epsilon_3_44; - - troughModel->m_alpha_abs = alpha_abs; - troughModel->m_Tau_envelope = Tau_envelope; - troughModel->m_EPSILON_4 = EPSILON_4; - troughModel->m_EPSILON_5 = EPSILON_5; - troughModel->m_GlazingIntact = GlazingIntact; - troughModel->m_P_a = P_a; - troughModel->m_AnnulusGas = AnnulusGas; - troughModel->m_AbsorberMaterial = AbsorberMaterial; - troughModel->m_Shadowing = Shadowing; - troughModel->m_Dirt_HCE = Dirt_HCE; - troughModel->m_Design_loss = Design_loss; - troughModel->m_SCAInfoArray = SCAInfoArray; - - troughModel->m_calc_design_pipe_vals = calc_design_pipe_vals; - troughModel->m_L_rnr_pb = L_rnr_pb; - troughModel->m_N_max_hdr_diams = N_max_hdr_diams; - troughModel->m_L_rnr_per_xpan = L_rnr_per_xpan; - troughModel->m_L_xpan_hdr = L_xpan_hdr; - troughModel->m_L_xpan_rnr = L_xpan_rnr; - troughModel->m_Min_rnr_xpans = Min_rnr_xpans; - troughModel->m_northsouth_field_sep = northsouth_field_sep; - troughModel->m_N_hdr_per_xpan = N_hdr_per_xpan; - troughModel->m_K_cpnt = K_cpnt; - troughModel->m_D_cpnt = D_cpnt; - troughModel->m_L_cpnt = L_cpnt; - troughModel->m_Type_cpnt = Type_cpnt; - troughModel->m_custom_sf_pipe_sizes = custom_sf_pipe_sizes; - troughModel->m_sf_rnr_diams = sf_rnr_diams; - troughModel->m_sf_rnr_wallthicks = sf_rnr_wallthicks; - troughModel->m_sf_rnr_lengths = sf_rnr_lengths; - troughModel->m_sf_hdr_diams = sf_hdr_diams; - troughModel->m_sf_hdr_wallthicks = sf_hdr_wallthicks; - troughModel->m_sf_hdr_lengths = sf_hdr_lengths; - - // init inputs - troughInitInputs.m_latitude = 32.13000107; - troughInitInputs.m_longitude = -110.9400024; - troughInitInputs.m_tz = -7; - troughInitInputs.m_shift = -5.940002441; - troughInitInputs.m_elev = -773; - - troughModel->init(troughInitInputs, troughSolvedParams); - - // inputs, constant or unused - weatherValues.m_lat = 32.13000107; - weatherValues.m_lon = -110.9400024; - weatherValues.m_tz = -7; - weatherValues.m_shift = -5.940002441; - weatherValues.m_elev = 773; - weatherValues.m_global = std::numeric_limits::quiet_NaN(); - weatherValues.m_hor_beam = std::numeric_limits::quiet_NaN(); // 433.1 - weatherValues.m_diffuse = std::numeric_limits::quiet_NaN(); // 282 - weatherValues.m_twet = std::numeric_limits::quiet_NaN(); - weatherValues.m_wdir = std::numeric_limits::quiet_NaN(); // 88 - weatherValues.m_rhum = std::numeric_limits::quiet_NaN(); - weatherValues.m_snow = std::numeric_limits::quiet_NaN(); - weatherValues.m_albedo = std::numeric_limits::quiet_NaN(); // 0.213 - weatherValues.m_aod = std::numeric_limits::quiet_NaN(); - weatherValues.m_poa = std::numeric_limits::quiet_NaN(); // 715.1 - weatherValues.m_time_rise = std::numeric_limits::quiet_NaN(); // 7.486443134 - weatherValues.m_time_set = std::numeric_limits::quiet_NaN(); // 17.46109472 - - htfInletState.m_pres = std::numeric_limits::quiet_NaN(); - htfInletState.m_qual = -1.; - htfInletState.m_m_dot = std::numeric_limits::quiet_NaN(); - } - - void TearDown() - { - TroughProperties::TearDown(); - if (troughModel) { - delete troughModel; - troughModel = nullptr; - } - } - -}; - -#endif diff --git a/third_party/ssc/test/tcs_test/tcsdirect_steam_cases.h b/third_party/ssc/test/tcs_test/tcsdirect_steam_cases.h deleted file mode 100644 index 6786842b892..00000000000 --- a/third_party/ssc/test/tcs_test/tcsdirect_steam_cases.h +++ /dev/null @@ -1,168 +0,0 @@ -#ifndef _TCSDIRECT_STEAM_CASES_H_ -#define _TCSDIRECT_STEAM_CASES_H_ - -#include -#include "../input_cases/code_generator_utilities.h" -#include "tcsdirect_steam_common_data.h" - -/** -* Data for high-level integration tests that verifies whether results for a direct steam power tower -* plant in Tucson, AZ matches expected results. -* Data generated from code-generator (Shift+F5) within SAM UI. -* Test uses SSCAPI interfaces (similiar to SDK usage) to pass and receive data to tcsdirect_steam -*/ - -// Power Tower direct steam default congifuration -int tcsdirect_steam_daggett_default(ssc_data_t &data) -{ - tcsdirect_steam_default(data); - - int status = run_module(data, "tcsdirect_steam"); - - //single_owner_default(data); - //status += run_module(data, "singleowner"); - - return status; -} - -// Power Tower direct steam with alternative condenser type -// Condenser type: Evaporative -// Rest default configurations -int tcsdirect_steam_daggett_evap_condenser(ssc_data_t &data) -{ - tcsdirect_steam_default(data); - - ssc_data_set_number(data, "ct", 1); - ssc_data_set_number(data, "eta_ref", 0.404); - ssc_data_set_number(data, "startup_frac", 0.5); - ssc_data_set_number(data, "P_cond_min", 2); - - int status = run_module(data, "tcsdirect_steam"); - - return status; -} - -// Power Tower direct steam with alternative condenser type -// Condenser type: Hybrid -// Rest default configurations -int tcsdirect_steam_daggett_hybrid_condenser(ssc_data_t &data) -{ - tcsdirect_steam_default(data); - - ssc_data_set_number(data, "ct", 3); - ssc_data_set_number(data, "eta_ref", 0.404); - ssc_data_set_number(data, "startup_frac", 0.5); - ssc_data_set_number(data, "P_cond_min", 2); - - int status = run_module(data, "tcsdirect_steam"); - - return status; -} - -// Power Tower direct steam with alternative fossil dispatch mode -// Fossil dispatch mode: Supplemental operation -// Rest default configurations -//int tcsdirect_steam_daggett_fossil_dispatch_supplemental(ssc_data_t &data) -//{ -// tcsdirect_steam_default(data); -// -// ssc_data_set_number(data, "fossil_mode", 2); -// ssc_data_set_number(data, "eta_ref", 0.404); -// ssc_data_set_number(data, "startup_frac", 0.5); -// ssc_data_set_number(data, "P_cond_min", 2); -// -// int status = run_module(data, "tcsdirect_steam"); -// -// return status; -//} - -// Power Tower direct steam with alternative Direct Steam Receiver material -// Direct Steam Receiver material: T91 Steel -// Rest default configurations -//int tcsdirect_steam_daggett_direct_steam_receiver(ssc_data_t &data) -//{ -// tcsdirect_steam_default(data); -// -// ssc_data_set_number(data, "mat_boiler", 28); -// ssc_data_set_number(data, "mat_sh", 28); -// ssc_data_set_number(data, "mat_rh", 28); -// ssc_data_set_number(data, "eta_ref", 0.404); -// ssc_data_set_number(data, "startup_frac", 0.5); -// ssc_data_set_number(data, "P_cond_min", 2); -// -// int status = run_module(data, "tcsdirect_steam"); -// -// return status; -//} - -// Power Tower direct steam with alternative flow pattern -// Flow pattern: 1 -// Rest default configurations -//int tcsdirect_steam_daggett_flow_pattern(ssc_data_t &data) -//{ -// tcsdirect_steam_default(data); -// -// ssc_data_set_number(data, "flowtype", 1); -// ssc_data_set_number(data, "eta_ref", 0.404); -// ssc_data_set_number(data, "startup_frac", 0.5); -// ssc_data_set_number(data, "P_cond_min", 2); -// -// int status = run_module(data, "tcsdirect_steam"); -// -// return status; -//} - -// Power Tower direct steam with alternative Heliostat focusing method -// Heliostat focusing method: Flat -// Rest default configurations -//int tcsdirect_steam_daggett_focusing_method(ssc_data_t &data) -//{ -// tcsdirect_steam_default(data); -// -// ssc_data_set_number(data, "focus_type", 0); -// ssc_data_set_number(data, "eta_ref", 0.404); -// ssc_data_set_number(data, "startup_frac", 0.5); -// ssc_data_set_number(data, "P_cond_min", 2); -// -// int status = run_module(data, "tcsdirect_steam"); -// -// return status; -//} - -// Power Tower direct steam with alternative Heliostat canting method -// Heliostat canting method: Equinox -// Rest default configurations -//int tcsdirect_steam_daggett_canting_method(ssc_data_t &data) -//{ -// tcsdirect_steam_default(data); -// -// ssc_data_set_number(data, "cant_type", 2); -// ssc_data_set_number(data, "eta_ref", 0.404); -// ssc_data_set_number(data, "startup_frac", 0.5); -// ssc_data_set_number(data, "P_cond_min", 2); -// -// int status = run_module(data, "tcsdirect_steam"); -// -// return status; -//} - -// Power Tower direct steam with alternative location -// Location: Tucson, AZ -// Rest default configurations -//int tcsdirect_steam_daggett_tucson_AZ(ssc_data_t &data) -//{ -// tcsdirect_steam_default(data); -// -// char solar_resource_path_tucson[512]; -// int n2 = sprintf(solar_resource_path_tucson, "%s/test/input_cases/directsteam_data/tucson_az_32.116521_-110.933042_psmv3_60_tmy.csv", std::getenv("SSCDIR")); -// ssc_data_set_string(data, "solar_resource_file", solar_resource_path_tucson); -// -// int status = run_module(data, "tcsdirect_steam"); -// -// return status; -//} - - - - -#endif \ No newline at end of file diff --git a/third_party/ssc/test/tcs_test/tcsfresnel_molten_salt_cases.h b/third_party/ssc/test/tcs_test/tcsfresnel_molten_salt_cases.h deleted file mode 100644 index bf1a420d1a4..00000000000 --- a/third_party/ssc/test/tcs_test/tcsfresnel_molten_salt_cases.h +++ /dev/null @@ -1,177 +0,0 @@ -#ifndef _TCSFRESNEL_MOLTEN_SALT_CASES_H_ -#define _TCSFRESNEL_MOLTEN_SALT_CASES_H_ - -#include -#include "../input_cases/code_generator_utilities.h" -#include "tcsfresnel_molten_salt_common_data.h" - -/** -* Data for high-level integration tests that verifies whether results for a liner Fresnel molten -* salt plant in Tucson, AZ matches expected results. -* Data generated from code-generator (Shift+F5) within SAM UI. -* Test uses SSCAPI interfaces (similiar to SDK usage) to pass and receive data to tcsfresnel_molten_salt -*/ - - -// Linear Fresnel molten salt default congifuration -int tcsfresnel_molten_salt_tucson_default(ssc_data_t &data) -{ - tcsfresnel_molten_salt_default(data); - - int status = run_module(data, "tcsmslf"); - - //single_owner_default(data); - //status += run_module(data, "singleowner"); - - return status; -} - -// Linear Fresnel molten salt with alternative defocusing strategy -// Defocusing strategy: Sequenced -// Rest default configurations with respect to the No Finanical model -int tcsfresnel_molten_salt_tucson_defocusing_strategy(ssc_data_t &data) -{ - tcsfresnel_molten_salt_default(data); - - ssc_data_set_number( data, "fthrctrl", 1 ); - - int status = run_module(data, "tcsmslf"); - - return status; -} - -// Linear Fresnel molten salt with alternative Field HTF -// Field HTF: Therminol VP-1 -// Rest default configurations with respect to the No Finanical model -int tcsfresnel_molten_salt_tucson_field_HTF(ssc_data_t &data) -{ - tcsfresnel_molten_salt_default(data); - - ssc_data_set_number(data, "Fluid", 21); - ssc_data_set_number(data, "field_fluid", 21); - ssc_data_set_number(data, "is_hx", 1); - ssc_data_set_number(data, "V_tank_hot_ini", 1290.5642); - ssc_data_set_number(data, "vol_tank", 6452.821); - - int status = run_module(data, "tcsmslf"); - - return status; -} - -// Linear Fresnel molten salt with alternative optical characterization method -// Optical characterization method: Solar position -// Rest default configurations with respect to the No Finanical model -int tcsfresnel_molten_salt_tucson_optical_char_solar(ssc_data_t &data) -{ - tcsfresnel_molten_salt_default(data); - - ssc_data_set_number(data, "opt_model", 1); - - int status = run_module(data, "tcsmslf"); - - return status; -} - -// Linear Fresnel molten salt with alternative receiver model type -// Receiver model type: Polynomial heat loss model -// Rest default configurations with respect to the No Finanical model -//int tcsfresnel_molten_salt_tucson_polynomial_heat_loss_model(ssc_data_t &data) -//{ -// tcsfresnel_molten_salt_default(data); -// -// ssc_data_set_number(data, "nLoops", 148); -// ssc_data_set_number(data, "rec_model", 1); -// -// int status = run_module(data, "tcsmslf"); -// -// return status; -//} - -// Linear Fresnel molten salt with alternative condenser type -// Condenser type: Evaporative -// Rest default configurations with respect to the No Finanical model -//int tcsfresnel_molten_salt_tucson_evap_condenser(ssc_data_t &data) -//{ -// tcsfresnel_molten_salt_default(data); -// -// ssc_data_set_number(data, "CT", 1); -// -// int status = run_module(data, "tcsmslf"); -// -// return status; -//} - -// Linear Fresnel molten salt with alternative condenser type -// Condenser type: Hybrid -// Rest default configurations with respect to the No Finanical model -//int tcsfresnel_molten_salt_tucson_hybrid_condenser(ssc_data_t &data) -//{ -// tcsfresnel_molten_salt_default(data); -// -// ssc_data_set_number(data, "CT", 3); -// -// int status = run_module(data, "tcsmslf"); -// -// return status; -//} - -// Linear Fresnel molten salt with alternative turbine inlet pressure control -// Turbine inlet pressure control: Sliding pressure -// Rest default configurations with respect to the No Finanical model -//int tcsfresnel_molten_salt_tucson_sliding_p(ssc_data_t &data) -//{ -// tcsfresnel_molten_salt_default(data); -// -// ssc_data_set_number(data, "tech_type", 3); -// -// int status = run_module(data, "tcsmslf"); -// -// return status; -//} - -// Linear Fresnel molten salt with alternative HTF freeze protection mode -// HTF freeze protection mode: Electric heating -// Rest default configurations with respect to the No Finanical model -//int tcsfresnel_molten_salt_tucson_HTF_freeze_protection(ssc_data_t &data) -//{ -// tcsfresnel_molten_salt_default(data); -// -// ssc_data_set_number(data, "fp_mode", 1); -// -// int status = run_module(data, "tcsmslf"); -// -// return status; -//} - -// Linear Fresnel molten salt with alternative storage HTF -// Storage HTF: Therminol VP-1 -// Rest default configurations with respect to the No Finanical model -//int tcsfresnel_molten_salt_tucson_storage_HTF(ssc_data_t &data) -//{ -// tcsfresnel_molten_salt_default(data); -// -// ssc_data_set_number(data, "store_fluid", 21); -// ssc_data_set_number(data, "is_hx", 1); -// ssc_data_set_number(data, "V_tank_hot_ini", 1963.66443); -// ssc_data_set_number(data, "vol_tank", 9818.3223); -// -// int status = run_module(data, "tcsmslf"); -// -// return status; -//} - -// Linear Fresnel molten salt with alternative Power Cycle -// Power Cycle: User Defined -// Rest default configurations with respect to the No Finanical model -//int tcsfresnel_molten_salt_tucson_userdefined_default(ssc_data_t &data) -//{ -// tcsfresnel_molten_salt_default(data); -// -// ssc_data_set_number(data, "pc_config", 1); -// -// int status = run_module(data, "tcsmslf"); -// -// return status; -//} - -#endif diff --git a/third_party/ssc/test/tcs_test/tcsmolten_salt_cases.h b/third_party/ssc/test/tcs_test/tcsmolten_salt_cases.h deleted file mode 100644 index f7bb68c5eca..00000000000 --- a/third_party/ssc/test/tcs_test/tcsmolten_salt_cases.h +++ /dev/null @@ -1,385 +0,0 @@ -#ifndef _TCSMOLTEN_SALT_CASES_H_ -#define _TCSMOLTEN_SALT_CASES_H_ - -#include -#include "../input_cases/code_generator_utilities.h" -#include "tcsmolten_salt_common_data.h" - -/** -* Data for high-level integration tests that verifies whether results for a molten salt power tower -* plant in Daggett, CA matches expected results. -* Data generated from code-generator (Shift+F5) within SAM UI. -* Test uses SSCAPI interfaces (similiar to SDK usage) to pass and receive data to tcsmolten_salt -*/ - -// Power Tower molten salt default congifuration -int tcsmolten_salt_daggett_default(ssc_data_t &data) -{ - tcsmolten_salt_default(data); - - int status = run_module(data, "tcsmolten_salt"); - - //single_owner_default(data); - //status += run_module(data, "singleowner"); - - return status; -} - -// Power Tower molten salt with alternative turbine inlet pressure control -// Turbine inlet pressure control: Sliding pressure -// Rest default configurations -int tcsmolten_salt_daggett_sliding_pressure(ssc_data_t &data) -{ - tcsmolten_salt_default(data); - - ssc_data_set_number(data, "tech_type", 3); - - int status = run_module(data, "tcsmolten_salt"); - - return status; -} - -// Power tower molten salt with alternative condenser type -// Condenser type: Evaporative -// Rest default configurations -//int tcsmolten_salt_daggett_evap_condenser(ssc_data_t &data) -//{ -// tcsmolten_salt_default(data); -// -// ssc_data_set_number(data, "CT", 1); -// -// int status = run_module(data, "tcsmolten_salt"); -// -// return status; -//} - -// Power tower molten salt with alternative condenser type -// Condenser type: Hybrid -// Rest default configurations -//int tcsmolten_salt_daggett_hybrid_condenser(ssc_data_t &data) -//{ -// tcsmolten_salt_default(data); -// -// ssc_data_set_number(data, "CT", 3); -// -// int status = run_module(data, "tcsmolten_salt"); -// -// return status; -//} - -// Power tower molten salt with alternative condenser type -// Condenser type: Radiative -// Rest default configurations -//int tcsmolten_salt_daggett_radiative_condenser(ssc_data_t &data) -//{ -// tcsmolten_salt_default(data); -// -// // Start of radiative-cooling metrics -// ssc_data_set_number(data, "h_ctes_tank_min", 1); -// ssc_data_set_number(data, "ctes_tshours", 15); -// ssc_data_set_number(data, "ctes_field_fl", 4); -// ssc_data_set_number(data, "h_ctes_tank", 30); -// ssc_data_set_number(data, "u_ctes_tank", 0.4); -// ssc_data_set_number(data, "ctes_tankpairs", 1); -// ssc_data_set_number(data, "T_ctes_cold_design", 5); -// ssc_data_set_number(data, "T_ctes_warm_design", 10); -// ssc_data_set_number(data, "T_ctes_warm_ini", 20); -// ssc_data_set_number(data, "T_ctes_cold_ini", 10); -// ssc_data_set_number(data, "f_ctes_warm_ini", 0); -// ssc_data_set_number(data, "rad_multiplier", 1.5); -// ssc_data_set_number(data, "m_dot_radpanel", 8); -// ssc_data_set_number(data, "n_rad_tubes", 100); -// ssc_data_set_number(data, "W_rad_tubes", 0.05); -// ssc_data_set_number(data, "L_rad", 100); -// ssc_data_set_number(data, "th_rad_panel", 0.002); -// ssc_data_set_number(data, "D_rad_tubes", 0.02); -// ssc_data_set_number(data, "k_panel", 235); -// ssc_data_set_number(data, "epsilon_radtop", 0.95); -// ssc_data_set_number(data, "epsilon_radbot", 0.07); -// ssc_data_set_number(data, "epsilon_radgrnd", 0.9); -// ssc_data_set_number(data, "L_rad_sections", 10); -// ssc_data_set_number(data, "epsilon_radHX", 0.8); -// ssc_data_set_number(data, "ctes_type", 0); -// ssc_data_set_number(data, "helio_area_tot", 1269054.5); -// ssc_data_set_number(data, "radiator_unitcost", 13); -// ssc_data_set_number(data, "radiator_installcost", 22); -// ssc_data_set_number(data, "radiator_fluidcost", 0.34); -// ssc_data_set_number(data, "radfluid_vol_ratio", 3); -// ssc_data_set_number(data, "ctes_cost", 0.7); -// ssc_data_set_number(data, "rad_pressuredrop", 75); -// //End of radiative-cooling metrics -// ssc_data_set_number(data, "CT", 4); -// -// int status = run_module(data, "tcsmolten_salt"); -// -// return status; -//} - -// Power Tower molten salt with alternative flow pattern -// Flow pattern: 8 -// Rest default configurations -int tcsmolten_salt_daggett_flow_pattern(ssc_data_t &data) -{ - tcsmolten_salt_default(data); - - ssc_data_set_number(data, "Flow_type", 8); - - int status = run_module(data, "tcsmolten_salt"); - - return status; -} - -// Power Tower molten salt with alternative location -// Location: Tucson, Arizona -// Rest default configurations -//int tcsmolten_salt_Tucson_AZ(ssc_data_t &data) -//{ -// tcsmolten_salt_default(data); -// -// char solar_resource_path_tucson[512]; -// int n = sprintf(solar_resource_path_tucson, "%s/test/input_cases/moltensalt_data/tucson_az_32.116521_-110.933042_psmv3_60_tmy.csv", std::getenv("SSCDIR")); -// ssc_data_set_string(data, "solar_resource_file", solar_resource_path_tucson); -// -// int status = run_module(data, "tcsmolten_salt"); -// -// return status; -//} - -// Power Tower molten salt with alternative power cycle: User Defined -// Rest default configurations -//int tcsmolten_salt_daggett_UD_default(ssc_data_t &data) -//{ -// tcsmolten_salt_default(data); -// -// set_matrix(data, "ud_ind_od", ud_ind_od_path, 180, 7); -// ssc_data_set_number(data, "pc_config", 1); -// ssc_data_set_number(data, "ud_m_dot_htf_low", 0.3); -// ssc_data_set_number(data, "ud_m_dot_htf_high", 1.2); -// -// int status = run_module(data, "tcsmolten_salt"); -// -// return status; -//} - -// Power Tower molten salt with alternative power cycle: Super Critical CO2 -// Rest default configurations -//int tcsmolten_salt_daggett_SCO2_default(ssc_data_t &data) -//{ -// tcsmolten_salt_default(data); -// -// ssc_data_set_number(data, "is_sco2_preprocess", 1); -// -// ssc_data_set_number(data, "pc_config", 2); -// ssc_data_set_number(data, "cycle_cutoff_frac", 0.5); -// // Start of super critical CO2 metrics -// ssc_data_set_number(data, "sco2ud_T_htf_cold_calc", 406.04); -// ssc_data_set_number(data, "sco2ud_T_htf_low", 554); -// ssc_data_set_number(data, "sco2ud_T_htf_high", 589); -// ssc_data_set_number(data, "sco2ud_T_amb_high", 45); -// ssc_data_set_number(data, "sco2ud_m_dot_htf_low", 0.5); -// ssc_data_set_number(data, "sco2ud_m_dot_htf_high", 1.05); -// ssc_number_t p_sco2ud_T_htf_ind_od[65] = { 554, 0.50001432179685623, 0.96932004909372826, 0.97558944094670463, 0.56452945008574118, 0.99212119137385479, 0.9938261663184943, 0.071046760698792344, 1.0516901234966409, 1.0396677815546937, 1, 1, 1, 562.75, 0.50000677254611736, 0.98273822965810698, 0.98931005948737616, 0.55442312464765453, 0.99593839560635933, 0.99813862855158975, 0.060760248142716182, 1.0280675561194188, 1.0216094704370726, 1, 1, 1, 571.5, 0.49997035485832741, 0.99560036541912367, 1.0030665958141747, 0.54540906175814596, 0.99964495720997093, 1.0023929148428683, 0.052633463645261176, 1.0056543163255209, 1.0033307681195913, 1, 1, 1, 580.25, 0.50001678576431519, 0.99981330235493204, 1.0149012834308118, 0.53755371644427918, 0.99437061481748712, 1.0057187757624548, 0.046124783184180999, 0.93267305740289486, 0.97564080126247599, 1, 1, 1, 589, 0.49998766910986947, 0.99997642865903091, 1.0280965929880774, 0.53035396718324523, 0.98587808938966315, 1.0103635810622889, 0.040778740942652915, 0.84986379353651254, 0.96107738725047209, 1, 1, 1 }; -// ssc_data_set_matrix(data, "sco2ud_T_htf_ind_od", p_sco2ud_T_htf_ind_od, 5, 13); -// ssc_number_t p_sco2ud_T_amb_ind_od[130] = { 0, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.059164848919520591, 0.049933864673572616, 0.04548467867978704, 1, 1, 1, 5, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.097133136927079936, 0.082248959886362452, 0.075269394493921518, 1, 1, 1, 10, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.17314165365655804, 0.14726896648379706, 0.13576325670205261, 1, 1, 1, 15, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.3481506775773433, 0.29853487098289033, 0.27855988861884273, 1, 1, 1, 20, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.85719459330059711, 0.74767538224853725, 0.71410844002614948, 1, 1, 1, 25, 0.99998860165458137, 0.99998405506376475, 0.99994129487763628, 0.97834420606252215, 0.9592086954026382, 0.94639328546002388, 1.4397512132898596, 1.1099623611534934, 0.9289610766286478, 1, 1, 1, 30, 0.99997868773200105, 1.0000128744625323, 0.99987390166815182, 0.99986135777103136, 0.97846151925556812, 0.96428182700735732, 1.2885473732704416, 1.0097961360792755, 0.85212892165494525, 1, 1, 1, 35, 0.96932004909372826, 0.99995022500741981, 0.99997642865903091, 0.99212119137385479, 0.99999459906789145, 0.98587808938966315, 1.0516901234966409, 1.0033307681195913, 0.84986379353651254, 1, 1, 1, 40, 0.85681928090544024, 0.88648580427756085, 0.90755440545490784, 0.8967547597723905, 0.90655814175453875, 0.91360819421216066, 0.54638640488302492, 0.52332590711799631, 0.50841120332212841, 1, 1, 1, 45, 0.76192612755033284, 0.78992076166486025, 0.81009772614290565, 0.81887517513574226, 0.82799762047592962, 0.83504194672755783, 0.32667431104075889, 0.31463845368914112, 0.30664767313185981, 1, 1, 1 }; -// ssc_data_set_matrix(data, "sco2ud_T_amb_ind_od", p_sco2ud_T_amb_ind_od, 10, 13); -// ssc_number_t p_sco2ud_m_dot_htf_ind_od[130] = { 0.5, 0.50000238394483887, 0.50002030400496988, 0.5000072744279479, 0.49996830468452913, 0.54311461140321193, 0.58949291750771449, 0.0023965079935530688, 0.050651289208334289, 0.085268991630535099, 1, 1, 1, 0.56111111111111112, 0.56107350053341665, 0.56109752841228611, 0.56110469253490813, 0.55257347648896971, 0.59674948077268875, 0.64372698634700765, 0.0035623149303332731, 0.076089576895326735, 0.12158112224599875, 1, 1, 1, 0.62222222222222223, 0.62224697121064898, 0.62224996267725707, 0.62219761804463092, 0.60616131300962228, 0.65145619071565242, 0.69969734374588888, 0.0052256619247860641, 0.11370919032872756, 0.17234788816884622, 1, 1, 1, 0.68333333333333335, 0.68334763160686485, 0.68332772806833242, 0.68334268666386189, 0.66063755666452395, 0.70667012650879169, 0.75616720875118448, 0.0076071355040999147, 0.16722335929420953, 0.24228904960439612, 1, 1, 1, 0.74444444444444446, 0.74441099641078146, 0.74443754704645426, 0.73579757426674453, 0.7154614610083625, 0.76238207877819242, 0.80635338615523044, 0.010993657103543011, 0.24183918938496599, 0.28923568019902324, 1, 1, 1, 0.80555555555555558, 0.80548586203577432, 0.80556625128549619, 0.7607325689541361, 0.7709115279333274, 0.81874600280477805, 0.81846324371170665, 0.015863026451133713, 0.34650772248743805, 0.32712367869313513, 1, 1, 1, 0.8666666666666667, 0.86665068706416915, 0.86667726624963815, 0.77310372269008887, 0.82666048629288214, 0.87575544351530044, 0.82250334117333646, 0.022915833888653158, 0.49058181757621305, 0.32138671984149092, 1, 1, 1, 0.92777777777777781, 0.92781567340041837, 0.92781937609673271, 0.78228939831004085, 0.88241774237123771, 0.93313651551826904, 0.82559824503018264, 0.033028022568911568, 0.6869968410833619, 0.31804744512991351, 1, 1, 1, 0.98888888888888893, 0.98860321834099996, 0.98888850977399578, 0.78897052574490523, 0.93832104872570143, 0.99049121752897784, 0.82770087400040337, 0.049618846148749549, 0.94725737476210103, 0.31520682775233339, 1, 1, 1, 1.05, 1.0487348778724641, 1.0062218585376423, 0.79376542360284852, 1.0039295318936428, 1.0043865029637598, 0.82928412460314016, 0.049807927876335194, 0.99339517007581468, 0.31300940662606114, 1, 1, 1 }; -// ssc_data_set_matrix(data, "sco2ud_m_dot_htf_ind_od", p_sco2ud_m_dot_htf_ind_od, 10, 13); -// -// ssc_data_set_number(data, "_sco2_P_high_limit", 25); -// ssc_data_set_number(data, "_sco2_P_ref", 115); -// ssc_data_set_number(data, "_sco2_T_amb_des", 35); -// ssc_data_set_number(data, "_sco2_T_approach", 10); -// ssc_data_set_number(data, "_sco2_T_htf_hot_des", 574); -// ssc_data_set_number(data, "_sco2_deltaT_PHX", 20); -// ssc_data_set_number(data, "_sco2_design_eff", 0.41200000047683716); -// ssc_data_set_number(data, "_sco2_eta_c", 0.88999998569488525); -// ssc_data_set_number(data, "_sco2_eta_t", 0.89999997615814209); -// ssc_data_set_number(data, "_sco2_recup_eff_max", 0.95999997854232788); -// -// int status = run_module(data, "tcsmolten_salt"); -// -// return status; -//} - -// Power Tower molten salt with alternative power cycle: Super Critical CO2 -// Cycle Configuration alternative: Partial Cooling -// Rest default configurations -//int tcsmolten_salt_daggett_SCO2_partial_cooling(ssc_data_t &data) -//{ -// tcsmolten_salt_default(data); -// -// ssc_data_set_number(data, "pc_config", 2); -// ssc_data_set_number(data, "cycle_cutoff_frac", 0.5); -// // Start of super critical CO2 metrics -// ssc_data_set_number(data, "sco2_cycle_config", 2); -// ssc_data_set_number(data, "sco2ud_T_htf_cold_calc", 354.84); -// ssc_data_set_number(data, "sco2ud_T_htf_low", 554); -// ssc_data_set_number(data, "sco2ud_T_htf_high", 589); -// ssc_data_set_number(data, "sco2ud_T_amb_high", 45); -// ssc_data_set_number(data, "sco2ud_m_dot_htf_low", 0.5); -// ssc_data_set_number(data, "sco2ud_m_dot_htf_high", 1.05); -// ssc_number_t p_sco2ud_T_htf_ind_od[65] = { 554, 0.49999352886459142, 0.96525561209463806, 0.97453395561145839, 0.62911366508823352, 0.98998074672002789, 0.99261217903413035, 0.20247797682275048, 1.0571168076843547, 1.0432895732028127, 1, 1, 1, 562.75, 0.49999364663999546, 0.98061760093183636, 0.98945608039614341, 0.59967747034505758, 0.99410410545590111, 0.99692477104310284, 0.17800016270512209, 1.0348516156853151, 1.0211725729287384, 1, 1, 1, 571.5, 0.49999395161728027, 0.99563145139446119, 1.0038535082905322, 0.58306031118146817, 0.99832427864796236, 1.001449148486844, 0.16124320857207705, 1.0092594720500885, 1.0025470111145369, 1, 1, 1, 580.25, 0.49999438710690025, 1.0000368631016281, 1.0187996347167014, 0.57310398959762909, 0.99215602847837348, 1.0059800813551822, 0.14338401700982784, 0.9341583009417217, 0.98266060214587514, 1, 1, 1, 589, 0.50001605482790912, 0.99999012779922869, 1.0325220180423378, 0.56534529941933243, 0.9816011558820481, 1.0098950333460388, 0.12932201013498895, 0.84387453074601659, 0.96199109269179472, 1, 1, 1 }; -// ssc_data_set_matrix(data, "sco2ud_T_htf_ind_od", p_sco2ud_T_htf_ind_od, 5, 13); -// ssc_number_t p_sco2ud_T_amb_ind_od[130] = { 0, 0.99997428799188914, 0.99999000874401356, 0.99999963664033542, 1.0096260890795448, 0.97647524655927898, 0.95539332954343525, 0.035964053686654389, 0.030460203665356428, 0.028191373083630726, 1, 1, 1, 5, 0.99997428799188914, 0.99999000874401356, 0.99999963664033542, 1.0096260890795448, 0.97647524655927898, 0.95539332954343525, 0.054169401117576316, 0.046164874738715223, 0.043090992060877832, 1, 1, 1, 10, 0.99997428799188914, 0.99999000874401356, 0.99999963664033542, 1.0096260890795448, 0.97647524655927898, 0.95539332954343525, 0.086054162974292386, 0.074011959990269383, 0.069988333857598825, 1, 1, 1, 15, 0.99997428799188914, 0.99999000874401356, 0.99999963664033542, 1.0096260890795448, 0.97647524655927898, 0.95539332954343525, 0.14717747411619553, 0.12834741606804084, 0.12359755317608473, 1, 1, 1, 20, 0.99997428799188914, 0.99999000874401356, 0.99999963664033542, 1.0096260890795448, 0.97647524655927898, 0.95539332954343525, 0.27882175950298732, 0.24810999613169693, 0.24587350287625651, 1, 1, 1, 25, 0.99998001476123333, 0.99998252902816598, 0.99991197104226259, 1.0098815301216097, 0.97647895095481074, 0.9554677877793778, 0.59120853683278496, 0.54403699709247888, 0.56813028411712974, 1, 1, 1, 30, 0.99998001476123333, 0.99998700539505325, 1.000003594937197, 1.0098815301216097, 0.97801555014110308, 0.95937811970467868, 1.6874663271788872, 1.1677785621376786, 0.92812586911858419, 1, 1, 1, 35, 0.96525561209463806, 0.99994365838368371, 0.99999012779922869, 0.98998074672002789, 1.0001162551906568, 0.9816011558820481, 1.0571168076843547, 1.0070553661423967, 0.84387453074601659, 1, 1, 1, 40, 0.88091956289263618, 0.91354408714037638, 0.93692898396657309, 0.92804590812890486, 0.93898338187710573, 0.94720156997882032, 0.77791598161892206, 0.7475571669584532, 0.72852820207159907, 1, 1, 1, 45, 0.80443081580069309, 0.83588054350931573, 0.85830802419616214, 0.87954062349121198, 0.89162501172294772, 0.90100255955577613, 0.71796263227634882, 0.69604875226586571, 0.68078331511457812, 1, 1, 1 }; -// ssc_data_set_matrix(data, "sco2ud_T_amb_ind_od", p_sco2ud_T_amb_ind_od, 10, 13); -// ssc_number_t p_sco2ud_m_dot_htf_ind_od[130] = { 0.5, 0.50001158587629013, 0.49999335234425468, 0.500009458086906, 0.52092523582781203, 0.580310601704488, 0.67277741730869234, 0.0066297710364970602, 0.15612995926951076, 0.42538208998154886, 1, 1, 1, 0.56111111111111112, 0.56112632572922161, 0.56109347634533013, 0.56112858298132773, 0.5676475361894191, 0.62646030027815847, 0.70338416085113653, 0.0079531402579119982, 0.18764587089730347, 0.43103981940440877, 1, 1, 1, 0.62222222222222223, 0.62221611814605471, 0.62221274231112988, 0.62222151074161314, 0.61455395777278332, 0.67446637440230506, 0.74670855688273574, 0.0093884633943930561, 0.22842611147672137, 0.48833317891759392, 1, 1, 1, 0.68333333333333335, 0.68329224890757501, 0.68333522189257412, 0.68331145370876678, 0.66231318458618582, 0.72371156880387011, 0.7949045334243946, 0.011139413945746518, 0.28028443088130395, 0.57482477745595617, 1, 1, 1, 0.74444444444444446, 0.74445060439362043, 0.74444232493970608, 0.74442697568885108, 0.71280359548337557, 0.77393932493368434, 0.84599994004797685, 0.01370986733027353, 0.34683195143613776, 0.69088300755849497, 1, 1, 1, 0.80555555555555558, 0.80554205452706595, 0.80553118613158747, 0.78568541702380978, 0.76617945177385471, 0.82545035439296532, 0.87282832981226932, 0.018334310087357693, 0.43577215265376867, 0.73125604358596707, 1, 1, 1, 0.8666666666666667, 0.86667780683097451, 0.86669111505864649, 0.80779790168115828, 0.82501645350095432, 0.8784837343548566, 0.88083521806059473, 0.031013715053052799, 0.55720344212317163, 0.71564348223866958, 1, 1, 1, 0.92777777777777781, 0.92778930075110044, 0.92781165563938151, 0.82346900197673678, 0.89420782417679856, 0.9332817335240674, 0.88681855363756823, 0.030225663571636099, 0.72555609695067691, 0.70381015654357315, 1, 1, 1, 0.98888888888888893, 0.98891033574992371, 0.98886027855958214, 0.8342986400696234, 0.96400610586573099, 0.98968856703989938, 0.89098743214344123, 0.030057676976388854, 0.95810218483069376, 0.69690700803894567, 1, 1, 1, 1.05, 1.0499204736064125, 1.0082881287098067, 0.84167433259869806, 1.0322051570968707, 1.002564506765949, 0.89389762859965882, 0.034640376520654041, 0.99538596406341329, 0.69252556580813951, 1, 1, 1 }; -// ssc_data_set_matrix(data, "sco2ud_m_dot_htf_ind_od", p_sco2ud_m_dot_htf_ind_od, 10, 13); -// ssc_data_set_number(data, "_sco2_P_high_limit", 25); -// ssc_data_set_number(data, "_sco2_P_ref", 115); -// ssc_data_set_number(data, "_sco2_T_amb_des", 35); -// ssc_data_set_number(data, "_sco2_T_approach", 10); -// ssc_data_set_number(data, "_sco2_T_htf_hot_des", 574); -// ssc_data_set_number(data, "_sco2_deltaT_PHX", 20); -// ssc_data_set_number(data, "_sco2_design_eff", 0.412); -// ssc_data_set_number(data, "_sco2_eta_c", 0.89); -// ssc_data_set_number(data, "_sco2_eta_t", 0.9); -// ssc_data_set_number(data, "_sco2_recup_eff_max", 0.96); -// //End of super critical CO2 metrics -// -// int status = run_module(data, "tcsmolten_salt"); -// -// return status; -//} - -// Power Tower molten salt with alternative power cycle: Super Critical CO2 -// Materials and Flow alternative: Flow pattern 2 instead of 1 -// Rest default configurations -//int tcsmolten_salt_daggett_SCO2_flow_pattern_2(ssc_data_t &data) -//{ -// tcsmolten_salt_default(data); -// -// ssc_data_set_number(data, "Flow_type", 2); -// ssc_data_set_number(data, "pc_config", 2); -// ssc_data_set_number(data, "cycle_cutoff_frac", 0.5); -// -// // Start of super critical CO2 metrics -// ssc_data_set_number(data, "sco2ud_T_htf_cold_calc", 406.04); -// ssc_data_set_number(data, "sco2ud_T_htf_low", 554); -// ssc_data_set_number(data, "sco2ud_T_htf_high", 589); -// ssc_data_set_number(data, "sco2ud_T_amb_high", 45); -// ssc_data_set_number(data, "sco2ud_m_dot_htf_low", 0.5); -// ssc_data_set_number(data, "sco2ud_m_dot_htf_high", 1.05); -// ssc_number_t p_sco2ud_T_htf_ind_od[65] = { 554, 0.50001432179685623, 0.96932004909372826, 0.97558944094670463, 0.56452945008574118, 0.99212119137385479, 0.9938261663184943, 0.071046760698792344, 1.0516901234966409, 1.0396677815546937, 1, 1, 1, 562.75, 0.50000677254611736, 0.98273822965810698, 0.98931005948737616, 0.55442312464765453, 0.99593839560635933, 0.99813862855158975, 0.060760248142716182, 1.0280675561194188, 1.0216094704370726, 1, 1, 1, 571.5, 0.49997035485832741, 0.99560036541912367, 1.0030665958141747, 0.54540906175814596, 0.99964495720997093, 1.0023929148428683, 0.052633463645261176, 1.0056543163255209, 1.0033307681195913, 1, 1, 1, 580.25, 0.50001678576431519, 0.99981330235493204, 1.0149012834308118, 0.53755371644427918, 0.99437061481748712, 1.0057187757624548, 0.046124783184180999, 0.93267305740289486, 0.97564080126247599, 1, 1, 1, 589, 0.49998766910986947, 0.99997642865903091, 1.0280965929880774, 0.53035396718324523, 0.98587808938966315, 1.0103635810622889, 0.040778740942652915, 0.84986379353651254, 0.96107738725047209, 1, 1, 1 }; -// ssc_data_set_matrix(data, "sco2ud_T_htf_ind_od", p_sco2ud_T_htf_ind_od, 5, 13); -// ssc_number_t p_sco2ud_T_amb_ind_od[130] = { 0, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.059164848919520591, 0.049933864673572616, 0.04548467867978704, 1, 1, 1, 5, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.097133136927079936, 0.082248959886362452, 0.075269394493921518, 1, 1, 1, 10, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.17314165365655804, 0.14726896648379706, 0.13576325670205261, 1, 1, 1, 15, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.3481506775773433, 0.29853487098289033, 0.27855988861884273, 1, 1, 1, 20, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.85719459330059711, 0.74767538224853725, 0.71410844002614948, 1, 1, 1, 25, 0.99998860165458137, 0.99998405506376475, 0.99994129487763628, 0.97834420606252215, 0.9592086954026382, 0.94639328546002388, 1.4397512132898596, 1.1099623611534934, 0.9289610766286478, 1, 1, 1, 30, 0.99997868773200105, 1.0000128744625323, 0.99987390166815182, 0.99986135777103136, 0.97846151925556812, 0.96428182700735732, 1.2885473732704416, 1.0097961360792755, 0.85212892165494525, 1, 1, 1, 35, 0.96932004909372826, 0.99995022500741981, 0.99997642865903091, 0.99212119137385479, 0.99999459906789145, 0.98587808938966315, 1.0516901234966409, 1.0033307681195913, 0.84986379353651254, 1, 1, 1, 40, 0.85681928090544024, 0.88648580427756085, 0.90755440545490784, 0.8967547597723905, 0.90655814175453875, 0.91360819421216066, 0.54638640488302492, 0.52332590711799631, 0.50841120332212841, 1, 1, 1, 45, 0.76192612755033284, 0.78992076166486025, 0.81009772614290565, 0.81887517513574226, 0.82799762047592962, 0.83504194672755783, 0.32667431104075889, 0.31463845368914112, 0.30664767313185981, 1, 1, 1 }; -// ssc_data_set_matrix(data, "sco2ud_T_amb_ind_od", p_sco2ud_T_amb_ind_od, 10, 13); -// ssc_number_t p_sco2ud_m_dot_htf_ind_od[130] = { 0.5, 0.50000238394483887, 0.50002030400496988, 0.5000072744279479, 0.49996830468452913, 0.54311461140321193, 0.58949291750771449, 0.0023965079935530688, 0.050651289208334289, 0.085268991630535099, 1, 1, 1, 0.56111111111111112, 0.56107350053341665, 0.56109752841228611, 0.56110469253490813, 0.55257347648896971, 0.59674948077268875, 0.64372698634700765, 0.0035623149303332731, 0.076089576895326735, 0.12158112224599875, 1, 1, 1, 0.62222222222222223, 0.62224697121064898, 0.62224996267725707, 0.62219761804463092, 0.60616131300962228, 0.65145619071565242, 0.69969734374588888, 0.0052256619247860641, 0.11370919032872756, 0.17234788816884622, 1, 1, 1, 0.68333333333333335, 0.68334763160686485, 0.68332772806833242, 0.68334268666386189, 0.66063755666452395, 0.70667012650879169, 0.75616720875118448, 0.0076071355040999147, 0.16722335929420953, 0.24228904960439612, 1, 1, 1, 0.74444444444444446, 0.74441099641078146, 0.74443754704645426, 0.73579757426674453, 0.7154614610083625, 0.76238207877819242, 0.80635338615523044, 0.010993657103543011, 0.24183918938496599, 0.28923568019902324, 1, 1, 1, 0.80555555555555558, 0.80548586203577432, 0.80556625128549619, 0.7607325689541361, 0.7709115279333274, 0.81874600280477805, 0.81846324371170665, 0.015863026451133713, 0.34650772248743805, 0.32712367869313513, 1, 1, 1, 0.8666666666666667, 0.86665068706416915, 0.86667726624963815, 0.77310372269008887, 0.82666048629288214, 0.87575544351530044, 0.82250334117333646, 0.022915833888653158, 0.49058181757621305, 0.32138671984149092, 1, 1, 1, 0.92777777777777781, 0.92781567340041837, 0.92781937609673271, 0.78228939831004085, 0.88241774237123771, 0.93313651551826904, 0.82559824503018264, 0.033028022568911568, 0.6869968410833619, 0.31804744512991351, 1, 1, 1, 0.98888888888888893, 0.98860321834099996, 0.98888850977399578, 0.78897052574490523, 0.93832104872570143, 0.99049121752897784, 0.82770087400040337, 0.049618846148749549, 0.94725737476210103, 0.31520682775233339, 1, 1, 1, 1.05, 1.0487348778724641, 1.0062218585376423, 0.79376542360284852, 1.0039295318936428, 1.0043865029637598, 0.82928412460314016, 0.049807927876335194, 0.99339517007581468, 0.31300940662606114, 1, 1, 1 }; -// ssc_data_set_matrix(data, "sco2ud_m_dot_htf_ind_od", p_sco2ud_m_dot_htf_ind_od, 10, 13); -// -// int status = run_module(data, "tcsmolten_salt"); -// -// return status; -//} - -// Molten Salt power tower - Super-critical CO2 power cycle -// ACTS framework driven testing -//int ACTS_sCO2_testing(ssc_data_t &data, int test_case) -//{ -// tcsmolten_salt_default(data); -// -// //ssc_data_set_number(data, "T_htf_cold_des", 414.53549194335938); // Different values each run ... But have no effect on outputs -// -// ssc_data_set_number(data, "pc_config", 2); -// -// ssc_data_set_number(data, "cycle_cutoff_frac", 0.5); -// -// //ssc_data_set_number(data, "sco2ud_T_htf_cold_calc", 414.53549194335938); // Different values each run ... But have no effect on outputs -// ssc_data_set_number(data, "sco2ud_T_htf_low", 554); -// ssc_data_set_number(data, "sco2ud_T_htf_high", 589); -// -// ssc_data_set_number(data, "sco2ud_T_amb_high", 45); -// ssc_data_set_number(data, "sco2ud_m_dot_htf_low", 0.5); -// ssc_data_set_number(data, "sco2ud_m_dot_htf_high", 1.05); -// ssc_number_t p_sco2ud_T_htf_ind_od[65] = { 554, 0.50001432179685623, 0.96932004909372826, 0.97558944094670463, 0.56452945008574118, 0.99212119137385479, 0.9938261663184943, 0.071046760698792344, 1.0516901234966409, 1.0396677815546937, 1, 1, 1, 562.75, 0.50000677254611736, 0.98273822965810698, 0.98931005948737616, 0.55442312464765453, 0.99593839560635933, 0.99813862855158975, 0.060760248142716182, 1.0280675561194188, 1.0216094704370726, 1, 1, 1, 571.5, 0.49997035485832741, 0.99560036541912367, 1.0030665958141747, 0.54540906175814596, 0.99964495720997093, 1.0023929148428683, 0.052633463645261176, 1.0056543163255209, 1.0033307681195913, 1, 1, 1, 580.25, 0.50001678576431519, 0.99981330235493204, 1.0149012834308118, 0.53755371644427918, 0.99437061481748712, 1.0057187757624548, 0.046124783184180999, 0.93267305740289486, 0.97564080126247599, 1, 1, 1, 589, 0.49998766910986947, 0.99997642865903091, 1.0280965929880774, 0.53035396718324523, 0.98587808938966315, 1.0103635810622889, 0.040778740942652915, 0.84986379353651254, 0.96107738725047209, 1, 1, 1 }; -// ssc_data_set_matrix(data, "sco2ud_T_htf_ind_od", p_sco2ud_T_htf_ind_od, 5, 13); -// ssc_number_t p_sco2ud_T_amb_ind_od[130] = { 0, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.059164848919520591, 0.049933864673572616, 0.04548467867978704, 1, 1, 1, 5, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.097133136927079936, 0.082248959886362452, 0.075269394493921518, 1, 1, 1, 10, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.17314165365655804, 0.14726896648379706, 0.13576325670205261, 1, 1, 1, 15, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.3481506775773433, 0.29853487098289033, 0.27855988861884273, 1, 1, 1, 20, 0.99994012767121321, 0.99974326147411507, 0.99987485850649338, 0.970379288808072, 0.95027470619969945, 0.93683012616718919, 0.85719459330059711, 0.74767538224853725, 0.71410844002614948, 1, 1, 1, 25, 0.99998860165458137, 0.99998405506376475, 0.99994129487763628, 0.97834420606252215, 0.9592086954026382, 0.94639328546002388, 1.4397512132898596, 1.1099623611534934, 0.9289610766286478, 1, 1, 1, 30, 0.99997868773200105, 1.0000128744625323, 0.99987390166815182, 0.99986135777103136, 0.97846151925556812, 0.96428182700735732, 1.2885473732704416, 1.0097961360792755, 0.85212892165494525, 1, 1, 1, 35, 0.96932004909372826, 0.99995022500741981, 0.99997642865903091, 0.99212119137385479, 0.99999459906789145, 0.98587808938966315, 1.0516901234966409, 1.0033307681195913, 0.84986379353651254, 1, 1, 1, 40, 0.85681928090544024, 0.88648580427756085, 0.90755440545490784, 0.8967547597723905, 0.90655814175453875, 0.91360819421216066, 0.54638640488302492, 0.52332590711799631, 0.50841120332212841, 1, 1, 1, 45, 0.76192612755033284, 0.78992076166486025, 0.81009772614290565, 0.81887517513574226, 0.82799762047592962, 0.83504194672755783, 0.32667431104075889, 0.31463845368914112, 0.30664767313185981, 1, 1, 1 }; -// ssc_data_set_matrix(data, "sco2ud_T_amb_ind_od", p_sco2ud_T_amb_ind_od, 10, 13); -// ssc_number_t p_sco2ud_m_dot_htf_ind_od[130] = { 0.5, 0.50000238394483887, 0.50002030400496988, 0.5000072744279479, 0.49996830468452913, 0.54311461140321193, 0.58949291750771449, 0.0023965079935530688, 0.050651289208334289, 0.085268991630535099, 1, 1, 1, 0.56111111111111112, 0.56107350053341665, 0.56109752841228611, 0.56110469253490813, 0.55257347648896971, 0.59674948077268875, 0.64372698634700765, 0.0035623149303332731, 0.076089576895326735, 0.12158112224599875, 1, 1, 1, 0.62222222222222223, 0.62224697121064898, 0.62224996267725707, 0.62219761804463092, 0.60616131300962228, 0.65145619071565242, 0.69969734374588888, 0.0052256619247860641, 0.11370919032872756, 0.17234788816884622, 1, 1, 1, 0.68333333333333335, 0.68334763160686485, 0.68332772806833242, 0.68334268666386189, 0.66063755666452395, 0.70667012650879169, 0.75616720875118448, 0.0076071355040999147, 0.16722335929420953, 0.24228904960439612, 1, 1, 1, 0.74444444444444446, 0.74441099641078146, 0.74443754704645426, 0.73579757426674453, 0.7154614610083625, 0.76238207877819242, 0.80635338615523044, 0.010993657103543011, 0.24183918938496599, 0.28923568019902324, 1, 1, 1, 0.80555555555555558, 0.80548586203577432, 0.80556625128549619, 0.7607325689541361, 0.7709115279333274, 0.81874600280477805, 0.81846324371170665, 0.015863026451133713, 0.34650772248743805, 0.32712367869313513, 1, 1, 1, 0.8666666666666667, 0.86665068706416915, 0.86667726624963815, 0.77310372269008887, 0.82666048629288214, 0.87575544351530044, 0.82250334117333646, 0.022915833888653158, 0.49058181757621305, 0.32138671984149092, 1, 1, 1, 0.92777777777777781, 0.92781567340041837, 0.92781937609673271, 0.78228939831004085, 0.88241774237123771, 0.93313651551826904, 0.82559824503018264, 0.033028022568911568, 0.6869968410833619, 0.31804744512991351, 1, 1, 1, 0.98888888888888893, 0.98860321834099996, 0.98888850977399578, 0.78897052574490523, 0.93832104872570143, 0.99049121752897784, 0.82770087400040337, 0.049618846148749549, 0.94725737476210103, 0.31520682775233339, 1, 1, 1, 1.05, 1.0487348778724641, 1.0062218585376423, 0.79376542360284852, 1.0039295318936428, 1.0043865029637598, 0.82928412460314016, 0.049807927876335194, 0.99339517007581468, 0.31300940662606114, 1, 1, 1 }; -// ssc_data_set_matrix(data, "sco2ud_m_dot_htf_ind_od", p_sco2ud_m_dot_htf_ind_od, 10, 13); -// // sco2 default configuration preprocessing parameters -// ssc_data_set_number(data, "_sco2_P_high_limit", 25); -// ssc_data_set_number(data, "_sco2_P_ref", 115); -// ssc_data_set_number(data, "_sco2_T_amb_des", 35); -// ssc_data_set_number(data, "_sco2_T_approach", 10); -// ssc_data_set_number(data, "_sco2_T_htf_hot_des", 574); -// ssc_data_set_number(data, "_sco2_deltaT_PHX", 20); -// ssc_data_set_number(data, "_sco2_design_eff", 0.412); -// ssc_data_set_number(data, "_sco2_eta_c", 0.89); -// ssc_data_set_number(data, "_sco2_eta_t", 0.9); -// ssc_data_set_number(data, "_sco2_recup_eff_max", 0.96); -// -// // Testing level to vector index map -// std::unordered_map idx = -// { -// {-1, 0}, -// { 0, 1}, -// { 1, 2} -// }; -// -// // Parameter test range values -// std::vector sco2_T_amb_des_vals{ 20.98, 35, 60 }; // Ambient temperature at design // SAM SSC - "sco2_T_amb_des" -// std::vector sco2_T_approach_vals{ 1, 10, 30 }; // Air cooler aproach temperature // SAM SSC - "sco2_T_approach" -// std::vector deltaT_PHX_vals{ 1, 20, 50 }; // PHX approach temperature // SAM SSC - "deltaT_PHX" -// std::vector eta_c_vals{ 0.70, 0.89, 1.0 }; // Compressor(s) Isentropic efficiency // SAM SSC - "eta_c" -// std::vector eta_t_vals{ 0.70, 0.90, 1.0 }; // Turbine Isentropic efficiency // SAM SSC - "eta_t" -// std::vector fan_power_perc_net_vals{ 0.25, 1.5, 5 }; // Cooling fan electricity consumption // SAM SSC - "fan_power_perc_net" -// -// // Full ACTS sCO2 framework - 15 total tests, where 6/15 tests are actually able to simulate on the SAM UI -// -// // Test case pass/fail summary 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 -// // P = Pass & F = Fail in SAM UI F P F P P F P F F F F P F F P -// // std::vector sco2_T_amb_des_lvls{ -1, -1, -1, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, -1, 1 }; -// // std::vector sco2_T_approach_lvls{ -1, 0, 1, -1, 0, 1, -1, 0, 1, -1, 0, 0, 1, -1, 1 }; -// // std::vector deltaT_PHX_lvls{ 0, 1, -1, 1, -1, 0, -1, 0, 1, 0, 1, -1, 1, -1, 0 }; -// // std::vector eta_c_lvls{ 0, 1, -1, -1, 0, 1, 1, -1, 0, 0, 1, 1, -1, 1, 1 }; -// // std::vector eta_t_lvls{ 0, 1, -1, 0, 1, -1, 0, 1, -1, -1, -1, 0, 0, 1, 1 }; -// // std::vector fan_power_perc_net_lvls{ 0, 1, -1, 1, -1, 0, -1, 0, 1, -1, -1 , 0, 0, 1, 1 }; -// -// -// // Passing ACTS sco2 tests within the SAM UI -// // NOTE: -// // Certain tests are able to completely pass the unit tests -// // using high tolerances while some tests still are -// // unable to pass using the high tolerances when testing outputs -// -// // Unit test case pass/fall summary 2 4 5 7 12 15 -// // P = Pass & F = Fail for tested outputs F F P P P F -// // std::vector sco2_T_amb_des_lvls{ -1, 0, 0, 1, 1, 1 }; -// // std::vector sco2_T_approach_lvls{ 0, -1, 0, -1, 0, 1 }; -// // std::vector deltaT_PHX_lvls{ 1, 1, -1, -1, -1, 0 }; -// // std::vector eta_c_lvls{ 1, -1, 0, 1, 1, 1 }; -// // std::vector eta_t_lvls{ 1, 0, 1, 0, 0, 1 }; -// // std::vector fan_power_perc_net_lvls{ 1, 1, 1, -1, 0, 1 }; -// -// -// // Passing SAM UI configurations 5 7 12 -// // P = Pass & F = Fail for tested outputs P P P -// std::vector sco2_T_amb_des_lvls{ 0, 1, 1 }; -// std::vector sco2_T_approach_lvls{ 0, -1, 0 }; -// std::vector deltaT_PHX_lvls{ -1, -1, -1 }; -// std::vector eta_c_lvls{ 0, 1, 1 }; -// std::vector eta_t_lvls{ 1, 0, 0 }; -// std::vector fan_power_perc_net_lvls{ 1, -1, 0 }; -// -// // Get test case values from index -// double sco2_T_amb_des_ACTS = sco2_T_amb_des_vals.at(idx.find(sco2_T_amb_des_lvls.at(test_case))->second); -// double sco2_T_approach_ACTS = sco2_T_approach_vals.at(idx.find(sco2_T_approach_lvls.at(test_case))->second); -// double deltaT_PHX_ACTS = deltaT_PHX_vals.at(idx.find(deltaT_PHX_lvls.at(test_case))->second); -// double eta_c_ACTS = eta_c_vals.at(idx.find(eta_c_lvls.at(test_case))->second); -// double eta_t_ACTS = eta_t_vals.at(idx.find(eta_t_lvls.at(test_case))->second); -// double fan_power_perc_net_ACTS = fan_power_perc_net_vals.at(idx.find(fan_power_perc_net_lvls.at(test_case))->second); -// -// // Assigning values to variables -// ssc_data_set_number(data, "sco2_T_amb_des", sco2_T_amb_des_ACTS); -// ssc_data_set_number(data, "sco2_T_approach", sco2_T_approach_ACTS); -// ssc_data_set_number(data, "deltaT_PHX", deltaT_PHX_ACTS); -// ssc_data_set_number(data, "eta_c", eta_c_ACTS); -// ssc_data_set_number(data, "eta_t", eta_t_ACTS); -// ssc_data_set_number(data, "fan_power_perc_net", fan_power_perc_net_ACTS); -// -// int status = run_module(data, "tcsmolten_salt"); -// -// return status; -//} - -#endif diff --git a/third_party/ssc/test/tcs_test/tcstrough_empirical_cases.h b/third_party/ssc/test/tcs_test/tcstrough_empirical_cases.h deleted file mode 100644 index 7e535117408..00000000000 --- a/third_party/ssc/test/tcs_test/tcstrough_empirical_cases.h +++ /dev/null @@ -1,241 +0,0 @@ -#ifndef _TCSTROUGH_EMPIRICAL_CASES_H -#define _TCSTROUGH_EMPIRICAL_CASES_H - -#include -#include "../input_cases/code_generator_utilities.h" -#include "tcstrough_empirical_common_data.h" - -/** -* Data for high-level integration tests that verifies whether results for a parabolic trough (empirical) -* plant in Tucson, AZ matches expected results. -* Data generated from code-generator (Shift+F5) within SAM UI. -* Test uses SSCAPI interfaces (similiar to SDK usage) to pass and receive data to tcstrough_empirical -*/ - -// Parabolic trough (empirical) default configuration -int tcstrough_empirical_tucson_default(ssc_data_t &data) -{ - tcstrough_empirical_default(data); - - int status = run_module(data, "tcstrough_empirical"); - - //single_owner_default(data); - //status += run_module(data, "singleowner"); - - return status; -} - -// Parabolic trough (empirical) with alternative Solar Field HTF type -// Solar Field HTF type: Hitec Solar Salt -// Rest default configurations -int tcstrough_empirical_tucson_solar_field_HTF(ssc_data_t &data) -{ - tcstrough_empirical_default(data); - - ssc_data_set_number(data, "HTFFluid", 18); - ssc_data_set_number(data, "PTSmax", 676.471); - ssc_data_set_number(data, "PFSmax", 342.699); - - int status = run_module(data, "tcstrough_empirical"); - - return status; -} - -// Parabolic trough (empirical) with alternative Solar Collector Assembly (SCA) -// Solar collector assembly (SCA): EuroTrough ET150 -// Rest default configurations -int tcstrough_empirical_tucson_SCA(ssc_data_t &data) -{ - tcstrough_empirical_default(data); - - ssc_data_set_number(data, "Solar_Field_Area", 856740); - ssc_data_set_number(data, "Ave_Focal_Length", 2.1); - ssc_data_set_number(data, "ScaLen", 150); - ssc_data_set_number(data, "SCA_aper", 5.75); - ssc_data_set_number(data, "TrkTwstErr", 0.99); - ssc_data_set_number(data, "MirCln", 0.97); - ssc_number_t p_HCEdust[4] = { 0.98, 0.98, 0.98, 0.98 }; - ssc_data_set_array(data, "HCEdust", p_HCEdust, 4); - ssc_number_t p_RefMirrAper[4] = { 5.75, 5.75, 5.75, 5.75 }; - ssc_data_set_array(data, "RefMirrAper", p_RefMirrAper, 4); - ssc_data_set_number(data, "SfPar", 0.228); - ssc_data_set_number(data, "ChtfPar", 9.013); - ssc_data_set_number(data, "AntiFrPar", 0.9013); - - int status = run_module(data, "tcstrough_empirical"); - - return status; -} - -// Parabolic trough (empirical) with alternative Heat Collection Element (HCE) -// Heat Collection Element (HCE): Luz Cermet Vacuum, Luz Cermet Hydrogren, and Luz Cermet Broken Glass -// Rest default configurations -int tcstrough_empirical_tucson_HCE(ssc_data_t &data) -{ - tcstrough_empirical_default(data); - - ssc_data_set_number(data, "Solar_Field_Area", 1015848); - ssc_number_t p_HCEBelShad[4] = { 0.971, 0.971, 0.971, 0 }; - ssc_data_set_array(data, "HCEBelShad", p_HCEBelShad, 4); - ssc_number_t p_HCEEnvTrans[4] = { 0.935, 0.935, 1, 0 }; - ssc_data_set_array(data, "HCEEnvTrans", p_HCEEnvTrans, 4); - ssc_number_t p_HCEabs[4] = { 0.925, 0.925, 0.8, 0 }; - ssc_data_set_array(data, "HCEabs", p_HCEabs, 4); - ssc_number_t p_PerfFac[4] = { 1.25, 1.25, 1.25, 0 }; - ssc_data_set_array(data, "PerfFac", p_PerfFac, 4); - ssc_number_t p_HCE_A0[4] = { 2.424, 7.0233, 100.05, 0 }; - ssc_data_set_array(data, "HCE_A0", p_HCE_A0, 4); - ssc_number_t p_HCE_A1[4] = { 0.214, 1.275, -0.7351, 0 }; - ssc_data_set_array(data, "HCE_A1", p_HCE_A1, 4); - ssc_number_t p_HCE_A2[4] = { -0.00047461, 0.0015105, -0.008635, 0 }; - ssc_data_set_array(data, "HCE_A2", p_HCE_A2, 4); - ssc_number_t p_HCE_A3[4] = { 6.88e-06, 5.05e-06, 2.67e-05, 0 }; - ssc_data_set_array(data, "HCE_A3", p_HCE_A3, 4); - ssc_number_t p_HCE_A4[4] = { 9.62e-08, 7.03e-08, 6.65e-07, 0 }; - ssc_data_set_array(data, "HCE_A4", p_HCE_A4, 4); - ssc_number_t p_HCE_A5[4] = { -2.2423, -4.284, -99.043, 0 }; - ssc_data_set_array(data, "HCE_A5", p_HCE_A5, 4); - ssc_number_t p_HCE_A6[4] = { 0.032325, 0.39685, 5.1672, 0 }; - ssc_data_set_array(data, "HCE_A6", p_HCE_A6, 4); - ssc_data_set_number(data, "SfPar", 0.270); - ssc_data_set_number(data, "ChtfPar", 10.687); - ssc_data_set_number(data, "AntiFrPar", 1.069); - - - int status = run_module(data, "tcstrough_empirical"); - - return status; -} - -// Parabolic trough (empirical) with alternative Power Cycle -// Power Cycle: APS Ormat 1MWe 300C -// Rest default configurations -int tcstrough_empirical_tucson_power_cycle(ssc_data_t &data) -{ - tcstrough_empirical_default(data); - - ssc_data_set_number(data, "Solar_Field_Area", 1599020); - ssc_data_set_number(data, "TurbEffG", 0.2071); - ssc_data_set_number(data, "TurSUE", 0.05); - ssc_data_set_number(data, "T2EPLF0", -0.1594); - ssc_data_set_number(data, "T2EPLF1", 0.9262); - ssc_data_set_number(data, "T2EPLF2", 1.1349); - ssc_data_set_number(data, "T2EPLF3", -1.3606); - ssc_data_set_number(data, "T2EPLF4", 0.4588); - ssc_data_set_number(data, "E2TPLF0", 0.1492); - ssc_data_set_number(data, "E2TPLF1", 0.8522); - ssc_data_set_number(data, "E2TPLF2", -0.3247); - ssc_data_set_number(data, "E2TPLF3", 0.44863); - ssc_data_set_number(data, "E2TPLF4", -0.1256); - ssc_data_set_number(data, "TempCorrF", 0); - ssc_data_set_number(data, "TempCorr0", 1); - ssc_data_set_number(data, "TempCorr1", 0); - ssc_data_set_number(data, "TempCorr2", 0); - ssc_data_set_number(data, "TempCorr3", 0); - ssc_data_set_number(data, "TempCorr4", 0); - ssc_data_set_number(data, "PTSmax", 535.973); - ssc_data_set_number(data, "PFSmax", 543.0467); - ssc_data_set_number(data, "SfPar", 0.42534); - ssc_data_set_number(data, "ChtfPar", 16.8217); - ssc_data_set_number(data, "AntiFrPar", 1.6822); - - int status = run_module(data, "tcstrough_empirical"); - - return status; -} - -// Parabolic trough (empirical) with alternative Thermal Stoage Fluid Type -// Thermal Storage Fluid Type: Therminol VP-1 -// Rest default configurations -int tcstrough_empirical_tucson_thermal_storage(ssc_data_t &data) -{ - tcstrough_empirical_default(data); - - ssc_data_set_number(data, "PTSmax", 676.4706); - ssc_data_set_number(data, "PFSmax", 342.699); - - int status = run_module(data, "tcstrough_empirical"); - - return status; -} - -// Parabolic trough (empirical) with alternative Parasitic Electric Energy Use -// Parasitic Electric Energy Use: 500C Molten Salt HTF -// Rest default configurations -int tcstrough_empirical_tucson_parasitic(ssc_data_t &data) -{ - tcstrough_empirical_default(data); - - ssc_data_set_number(data, "SfPar", 0.117); - ssc_data_set_number(data, "SfParPF", 0.5); - ssc_data_set_number(data, "ChtfPar", 3.231); - ssc_data_set_number(data, "ChtfParPF", 0.35); - ssc_data_set_number(data, "AntiFrPar", 0.323); - ssc_data_set_number(data, "HhtfPar", 0.777); - ssc_data_set_number(data, "HhtfParPF", 0.35); - - int status = run_module(data, "tcstrough_empirical"); - - return status; -} - -// Parabolic trough (empirical) with alternative location -// Location: Phoenix, AZ -// Rest default configurations -int tcstrough_empirical_phoenix(ssc_data_t &data) -{ - tcstrough_empirical_default(data); - - char solar_resource_path_phoenix[512]; - int n = sprintf(solar_resource_path_phoenix, "%s/test/input_cases/trough_empirical_data/phoenix_az_33.450495_-111.983688_psmv3_60_tmy.csv", std::getenv("SSCDIR")); - ssc_data_set_string(data, "file_name", solar_resource_path_phoenix); - - int status = run_module(data, "tcstrough_empirical"); - - return status; -} - -// Test series of Advanced Combinatorial Testing System (ACTS) runs -// Parabolic trough (empirical) -//int ACTS_test_empirical(ssc_data_t &data, int test_case) -//{ -// tcstrough_empirical_default(data); -// -// // Testing level to vector index map -// std::unordered_map idx = -// { -// {-1, 0}, -// { 0, 1}, -// { 1, 2} -// }; -// -// // Parameter test range values -// std::vector Distance_SCA_vals{ 0.5, 1 , 2 }; // Distance Between SCAs in Row // SAM SSC - "Distance_SCA" -// std::vector NumScas_vals{ 1, 4, 8 }; // Number of SCAs per Row // SAM SSC - "NumScas" -// std::vector DepAngle_vals{ 5, 10, 20 }; // Deploy Angle // SAM SSC - "DepAngle" -// std::vector Stow_Angle_vals{ 160, 170, 175 }; // Stow Angle // SAM SSC - "Stow_Angle" -// -// // ACTS transposed covering array 1 2 3 4 5 6 7 8 9 -// std::vector Distance_SCA_lvls{ -1, -1, -1, 0, 0, 0, 1, 1, 1 }; -// std::vector NumScas_lvls{ -1, 0, 1, -1, 0, 1, -1, 0, 1 }; -// std::vector DepAngle_lvls{ 0, 1, -1, 1, -1, 0, -1, 0, 1 }; -// std::vector Stow_Angle_lvls{ 0, 1, -1, -1, 0, 1, 1, -1, 0 }; -// -// // Get test case values from index -// double Distance_SCA_ACTS = Distance_SCA_vals.at(idx.find(Distance_SCA_lvls.at(test_case))->second); -// double NumScas_ACTS = NumScas_vals.at(idx.find(NumScas_lvls.at(test_case))->second); -// double DepAngle_ACTS = DepAngle_vals.at(idx.find(DepAngle_lvls.at(test_case))->second); -// double Stow_Angle_ACTS = Stow_Angle_vals.at(idx.find(Stow_Angle_lvls.at(test_case))->second); -// -// // Assigning values to variables -// ssc_data_set_number(data, "Distance_SCA", Distance_SCA_ACTS); -// ssc_data_set_number(data, "NumScas", NumScas_ACTS); -// ssc_data_set_number(data, "DepAngle", DepAngle_ACTS); -// ssc_data_set_number(data, "Stow_Angle", Stow_Angle_ACTS); -// -// int status = run_module(data, "tcstrough_empirical"); -// -// return status; -//} - -#endif diff --git a/third_party/ssc/test/tcs_test/trough_physical_cases.h b/third_party/ssc/test/tcs_test/trough_physical_cases.h deleted file mode 100644 index db4195fb39b..00000000000 --- a/third_party/ssc/test/tcs_test/trough_physical_cases.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _TROUGH_PHYSICAL_CASES_H_ -#define _TROUGH_PHYSICAL_CASES_H_ - -#include -#include "../input_cases/code_generator_utilities.h" -#include "trough_physical_common_data.h" - -/** -* Data for high-level integration tests that verifies whether results for a parabolic trough -* plant in Tucson matches expected results. -* Data generated from code-generator (Shift+F5) within SAM UI. -* Test uses SSCAPI interfaces (similiar to SDK usage) to pass and receive data to trough_physical -*/ -int trough_physical_tucson(ssc_data_t &data) -{ - trough_physical_default(data); - int status = run_module(data, "trough_physical"); - - //convert_and_adjust_fixed_charge(data); - //status += run_module(data, "iph_to_lcoefcr"); - - //fixed_charge_rate_default(data); - //status += run_module(data, "lcoefcr"); - - return status; -} - -#endif diff --git a/third_party/ssc/test/tcs_test/trough_physical_iph_cases.h b/third_party/ssc/test/tcs_test/trough_physical_iph_cases.h deleted file mode 100644 index 61acccbdd64..00000000000 --- a/third_party/ssc/test/tcs_test/trough_physical_iph_cases.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _TROUGH_PHYSICAL_IPH_CASES_H_ -#define _TROUGH_PHYSICAL_IPH_CASES_H_ - -#include -#include "../input_cases/code_generator_utilities.h" -#include "trough_physical_iph_common_data.h" - -/** -* Data for high-level integration tests that verifies whether results for a parabolic trough -* industrial process heat (iph) plant in Tucson matches expected results. -* Data generated from code-generator (Shift+F5) within SAM UI. -* Test uses SSCAPI interfaces (similiar to SDK usage) to pass and receive data to trough_physical_iph -*/ -//int trough_physical_iph_tucson(ssc_data_t &data) -//{ -// trough_physical_iph_default(data); -// int status = run_module(data, "trough_physical_process_heat"); -// -// convert_and_adjust_fixed_charge(data); -// status += run_module(data, "iph_to_lcoefcr"); -// -// fixed_charge_rate_default(data); -// status += run_module(data, "lcoefcr"); -// -// return status; -//} - -#endif diff --git a/tst/EnergyPlus/unit/AirflowNetworkBalanceManager.unit.cc b/tst/EnergyPlus/unit/AirflowNetworkBalanceManager.unit.cc index 79a9756fb4a..7eab2503fe4 100644 --- a/tst/EnergyPlus/unit/AirflowNetworkBalanceManager.unit.cc +++ b/tst/EnergyPlus/unit/AirflowNetworkBalanceManager.unit.cc @@ -68,6 +68,8 @@ #include #include #include +#include +#include #include #include #include @@ -77,6 +79,7 @@ #include #include #include +#include #include #include "Fixtures/EnergyPlusFixture.hh" @@ -88,6 +91,9 @@ using namespace DataHeatBalance; using namespace EnergyPlus::DataLoopNode; using namespace EnergyPlus::ScheduleManager; using namespace OutAirNodeManager; +using namespace EnergyPlus::Fans; +using namespace EnergyPlus::HVACStandAloneERV; +using namespace EnergyPlus::DataHVACGlobals; namespace EnergyPlus { @@ -20137,5 +20143,736 @@ TEST_F(EnergyPlusFixture, AirflowNetwork_TestZoneVentingAirBoundary) EXPECT_EQ(0, AirflowNetwork::MultizoneSurfaceData(2).VentingSchNum); EXPECT_EQ(AirflowNetwork::MultizoneSurfaceData(2).VentSurfCtrNum, AirflowNetwork::VentControlType::Const); } -} // namespace EnergyPlus +TEST_F(EnergyPlusFixture, AirflowNetworkBalanceManager_TestNoZoneEqpSupportZoneERV) +{ + // Create zone + state->dataGlobal->NumOfZones = 1; + DataHeatBalance::Zone.allocate(1); + DataHeatBalance::Zone(1).Name = "ZONE 1"; + + // Create surfaces + DataSurfaces::Surface.allocate(1); + DataSurfaces::Surface(1).Name = "ZN004:ROOF001"; + DataSurfaces::Surface(1).Zone = 1; + DataSurfaces::Surface(1).ZoneName = "ZONE 1"; + DataSurfaces::Surface(1).Azimuth = 0.0; + DataSurfaces::Surface(1).ExtBoundCond = 0; + DataSurfaces::Surface(1).HeatTransSurf = true; + DataSurfaces::Surface(1).Tilt = 180.0; + DataSurfaces::Surface(1).Sides = 4; + DataSurfaces::Surface(1).Name = "ZN004:ROOF002"; + DataSurfaces::Surface(1).Zone = 1; + DataSurfaces::Surface(1).ZoneName = "ZONE 1"; + DataSurfaces::Surface(1).Azimuth = 0.0; + DataSurfaces::Surface(1).ExtBoundCond = 0; + DataSurfaces::Surface(1).HeatTransSurf = true; + DataSurfaces::Surface(1).Tilt = 180.0; + DataSurfaces::Surface(1).Sides = 4; + + DataSurfaces::SurfWinOriginalClass.allocate(1); + DataSurfaces::SurfWinOriginalClass(1) = DataSurfaces::SurfaceClass::Window; + + // Create air system + state->dataAirSystemsData->PrimaryAirSystems.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).NumBranches = 1; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).TotalComponents = 1; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp(1).TypeOf = "Fan:ConstantVolume"; + + // Create air nodes + DataLoopNode::NumOfNodes = 5; + DataLoopNode::Node.allocate(5); + DataLoopNode::Node(1).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(2).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(3).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(4).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(5).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::NodeID.allocate(5); + DataLoopNode::NodeID(1) = "ZONE 1 AIR NODE"; + bool errFlag{false}; + BranchNodeConnections::RegisterNodeConnection(*state, 1, "ZONE 1 AIR NODE", "Type1", "Object1", "ZoneNode", 1, false, errFlag); + EXPECT_FALSE(errFlag); + + // Connect zone to air node + state->dataZoneEquip->ZoneEquipConfig.allocate(1); + state->dataZoneEquip->ZoneEquipConfig(1).IsControlled = true; + state->dataZoneEquip->ZoneEquipConfig(1).ZoneName = "ZONE 1"; + state->dataZoneEquip->ZoneEquipConfig(1).ActualZoneNum = 1; + state->dataZoneEquip->ZoneEquipConfig(1).ZoneNode = 1; + state->dataZoneEquip->ZoneEquipConfig(1).NumInletNodes = 0; + state->dataZoneEquip->ZoneEquipConfig(1).NumReturnNodes = 0; + state->dataZoneEquip->ZoneEquipConfig(1).IsControlled = true; + + // One AirflowNetwork:MultiZone:Zone object + AirflowNetwork::AirflowNetworkNumOfZones = 1; + AirflowNetwork::MultizoneZoneData.allocate(1); + AirflowNetwork::MultizoneZoneData(1).ZoneNum = 1; + AirflowNetwork::MultizoneZoneData(1).ZoneName = "ZONE 1"; + + // Assume only one AirflowNetwork:Distribution:Node object is set for the Zone Air Node + AirflowNetwork::AirflowNetworkNumOfNodes = 1; + AirflowNetwork::AirflowNetworkNodeData.allocate(1); + AirflowNetwork::AirflowNetworkNodeData(1).Name = "ZONE 1"; + AirflowNetwork::AirflowNetworkNodeData(1).EPlusZoneNum = 1; + + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers.allocate(2); + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers(1) = 0; + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers(2) = 0; + + // Set flag to support zone equipment + AirflowNetwork::AirflowNetworkSimu.AllowSupportZoneEqp = false; + + // Create Fans + Real64 supplyFlowRate = 0.005; + Real64 exhaustFlowRate = 0.005; + Fan.allocate(2); + Fan(1).InletNodeNum = 2; + Fan(1).OutletNodeNum = 3; + Fan(1).FanType_Num = FanType_SimpleOnOff; + Fan(1).FanName = "SupplyFan"; + Fan(1).MaxAirFlowRate = supplyFlowRate; + DataLoopNode::NodeID(2) = "SupplyFanInletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 2, NodeID(2), "Fan:OnOff", Fan(1).FanName, "Inlet", 1, false, errFlag); + DataLoopNode::NodeID(3) = "SupplyFanOutletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 3, NodeID(3), "Fan:OnOff", Fan(1).FanName, "Outlet", 1, false, errFlag); + Fan(2).InletNodeNum = 4; + Fan(2).OutletNodeNum = 5; + Fan(2).FanType_Num = FanType_SimpleOnOff; + Fan(2).FanName = "ExhaustFan"; + Fan(2).MaxAirFlowRate = exhaustFlowRate; + DataLoopNode::NodeID(4) = "SupplyExhaustInletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 4, NodeID(4), "Fan:OnOff", Fan(2).FanName, "Inlet", 1, false, errFlag); + DataLoopNode::NodeID(5) = "SupplyExhaustOutletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 5, NodeID(5), "Fan:OnOff", Fan(2).FanName, "Outlet", 1, false, errFlag); + + // Create ERV + state->dataHVACStandAloneERV->StandAloneERV.allocate(1); + state->dataHVACStandAloneERV->GetERVInputFlag = false; + state->dataHVACStandAloneERV->NumStandAloneERVs = 1; + state->dataHVACStandAloneERV->StandAloneERV(1).SupplyAirVolFlow = 0.005; + state->dataHVACStandAloneERV->StandAloneERV(1).ExhaustAirVolFlow = 0.005; + state->dataHVACStandAloneERV->StandAloneERV(1).DesignSAFanVolFlowRate = 0.005; + state->dataHVACStandAloneERV->StandAloneERV(1).DesignEAFanVolFlowRate = 0.005; + state->dataHVACStandAloneERV->StandAloneERV(1).DesignHXVolFlowRate = 0.005; + state->dataHVACStandAloneERV->StandAloneERV(1).SupplyAirFanName = Fan(1).FanName; + state->dataHVACStandAloneERV->StandAloneERV(1).SupplyAirFanIndex = 1; + state->dataHVACStandAloneERV->StandAloneERV(1).SupplyAirInletNode = 2; + state->dataHVACStandAloneERV->StandAloneERV(1).ExhaustAirFanName = Fan(2).FanName; + state->dataHVACStandAloneERV->StandAloneERV(1).ExhaustAirFanIndex = 2; + state->dataHVACStandAloneERV->StandAloneERV(1).HeatExchangerTypeNum = HX_AIRTOAIR_GENERIC; + state->dataHVACStandAloneERV->StandAloneERV(1).HeatExchangerName = "ERV Heat Exchanger"; + + // Check validation and expected errors + ASSERT_THROW(ValidateDistributionSystem(*state), std::runtime_error); + std::string const error_string = delimited_string({ + " ** Severe ** ValidateDistributionSystem: 'SupplyFanInletNode' is not defined as an AirflowNetwork:Distribution:Node object.", + " ** Severe ** ValidateDistributionSystem: 'SupplyFanOutletNode' is not defined as an AirflowNetwork:Distribution:Node object.", + " ** Severe ** ValidateDistributionSystem: 'SupplyExhaustInletNode' is not defined as an AirflowNetwork:Distribution:Node object.", + " ** Severe ** ValidateDistributionSystem: 'SupplyExhaustOutletNode' is not defined as an AirflowNetwork:Distribution:Node object.", + " ** Fatal ** ValidateDistributionSystem: Program terminates for preceding reason(s).", + " ...Summary of Errors that led to program termination:", + " ..... Reference severe error count=4", + " ..... Last severe error=ValidateDistributionSystem: 'SupplyExhaustOutletNode' is not defined as an AirflowNetwork:Distribution:Node " + "object.", + }); + + EXPECT_TRUE(compare_err_stream(error_string, true)); +} + +TEST_F(EnergyPlusFixture, AirflowNetworkBalanceManager_TestZoneEqpSupportZoneERV) +{ + // Create zone + state->dataGlobal->NumOfZones = 1; + DataHeatBalance::Zone.allocate(1); + DataHeatBalance::Zone(1).Name = "ZONE 1"; + + // Create surfaces + DataSurfaces::Surface.allocate(1); + DataSurfaces::Surface(1).Name = "ZN004:ROOF001"; + DataSurfaces::Surface(1).Zone = 1; + DataSurfaces::Surface(1).ZoneName = "ZONE 1"; + DataSurfaces::Surface(1).Azimuth = 0.0; + DataSurfaces::Surface(1).ExtBoundCond = 0; + DataSurfaces::Surface(1).HeatTransSurf = true; + DataSurfaces::Surface(1).Tilt = 180.0; + DataSurfaces::Surface(1).Sides = 4; + DataSurfaces::Surface(1).Name = "ZN004:ROOF002"; + DataSurfaces::Surface(1).Zone = 1; + DataSurfaces::Surface(1).ZoneName = "ZONE 1"; + DataSurfaces::Surface(1).Azimuth = 0.0; + DataSurfaces::Surface(1).ExtBoundCond = 0; + DataSurfaces::Surface(1).HeatTransSurf = true; + DataSurfaces::Surface(1).Tilt = 180.0; + DataSurfaces::Surface(1).Sides = 4; + + DataSurfaces::SurfWinOriginalClass.allocate(1); + DataSurfaces::SurfWinOriginalClass(1) = DataSurfaces::SurfaceClass::Window; + + // Create air system + state->dataAirSystemsData->PrimaryAirSystems.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).NumBranches = 1; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).TotalComponents = 1; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp(1).TypeOf = "Fan:ConstantVolume"; + + // Create air nodes + DataLoopNode::NumOfNodes = 5; + DataLoopNode::Node.allocate(5); + DataLoopNode::Node(1).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(2).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(3).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(4).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(5).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::NodeID.allocate(5); + DataLoopNode::NodeID(1) = "ZONE 1 AIR NODE"; + bool errFlag{false}; + BranchNodeConnections::RegisterNodeConnection(*state, 1, "ZONE 1 AIR NODE", "Type1", "Object1", "ZoneNode", 1, false, errFlag); + EXPECT_FALSE(errFlag); + + // Connect zone to air node + state->dataZoneEquip->ZoneEquipConfig.allocate(1); + state->dataZoneEquip->ZoneEquipConfig(1).IsControlled = true; + state->dataZoneEquip->ZoneEquipConfig(1).ZoneName = "ZONE 1"; + state->dataZoneEquip->ZoneEquipConfig(1).ActualZoneNum = 1; + state->dataZoneEquip->ZoneEquipConfig(1).ZoneNode = 1; + state->dataZoneEquip->ZoneEquipConfig(1).NumInletNodes = 0; + state->dataZoneEquip->ZoneEquipConfig(1).NumReturnNodes = 0; + state->dataZoneEquip->ZoneEquipConfig(1).IsControlled = true; + + // One AirflowNetwork:MultiZone:Zone object + AirflowNetwork::AirflowNetworkNumOfZones = 1; + AirflowNetwork::MultizoneZoneData.allocate(1); + AirflowNetwork::MultizoneZoneData(1).ZoneNum = 1; + AirflowNetwork::MultizoneZoneData(1).ZoneName = "ZONE 1"; + + // Assume only one AirflowNetwork:Distribution:Node object is set for the Zone Air Node + AirflowNetwork::AirflowNetworkNumOfNodes = 1; + AirflowNetwork::AirflowNetworkNodeData.allocate(1); + AirflowNetwork::AirflowNetworkNodeData(1).Name = "ZONE 1"; + AirflowNetwork::AirflowNetworkNodeData(1).EPlusZoneNum = 1; + + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers.allocate(2); + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers(1) = 0; + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers(2) = 0; + + // Set flag to support zone equipment + AirflowNetwork::AirflowNetworkSimu.AllowSupportZoneEqp = true; + + // Create Fans + Real64 supplyFlowRate = 0.005; + Real64 exhaustFlowRate = 0.005; + Fan.allocate(2); + Fan(1).InletNodeNum = 2; + Fan(1).OutletNodeNum = 3; + Fan(1).FanType_Num = FanType_SimpleOnOff; + Fan(1).FanName = "SupplyFan"; + Fan(1).MaxAirFlowRate = supplyFlowRate; + DataLoopNode::NodeID(2) = "SupplyFanInletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 2, NodeID(2), "Fan:OnOff", Fan(1).FanName, "Inlet", 1, false, errFlag); + DataLoopNode::NodeID(3) = "SupplyFanOutletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 3, NodeID(3), "Fan:OnOff", Fan(1).FanName, "Outlet", 1, false, errFlag); + Fan(2).InletNodeNum = 4; + Fan(2).OutletNodeNum = 5; + Fan(2).FanType_Num = FanType_SimpleOnOff; + Fan(2).FanName = "ExhaustFan"; + Fan(2).MaxAirFlowRate = exhaustFlowRate; + DataLoopNode::NodeID(4) = "SupplyExhaustInletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 4, NodeID(4), "Fan:OnOff", Fan(2).FanName, "Inlet", 1, false, errFlag); + DataLoopNode::NodeID(5) = "SupplyExhaustOutletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 5, NodeID(5), "Fan:OnOff", Fan(2).FanName, "Outlet", 1, false, errFlag); + + // Create ERV + state->dataHVACStandAloneERV->StandAloneERV.allocate(1); + state->dataHVACStandAloneERV->GetERVInputFlag = false; + state->dataHVACStandAloneERV->NumStandAloneERVs = 1; + state->dataHVACStandAloneERV->StandAloneERV(1).SupplyAirVolFlow = 0.005; + state->dataHVACStandAloneERV->StandAloneERV(1).ExhaustAirVolFlow = 0.005; + state->dataHVACStandAloneERV->StandAloneERV(1).DesignSAFanVolFlowRate = 0.005; + state->dataHVACStandAloneERV->StandAloneERV(1).DesignEAFanVolFlowRate = 0.005; + state->dataHVACStandAloneERV->StandAloneERV(1).DesignHXVolFlowRate = 0.005; + state->dataHVACStandAloneERV->StandAloneERV(1).SupplyAirFanName = Fan(1).FanName; + state->dataHVACStandAloneERV->StandAloneERV(1).SupplyAirFanIndex = 1; + state->dataHVACStandAloneERV->StandAloneERV(1).SupplyAirInletNode = 2; + state->dataHVACStandAloneERV->StandAloneERV(1).ExhaustAirFanName = Fan(2).FanName; + state->dataHVACStandAloneERV->StandAloneERV(1).ExhaustAirFanIndex = 2; + state->dataHVACStandAloneERV->StandAloneERV(1).HeatExchangerTypeNum = HX_AIRTOAIR_GENERIC; + state->dataHVACStandAloneERV->StandAloneERV(1).HeatExchangerName = "ERV Heat Exchanger"; + + // Check validation and expected warning + ValidateDistributionSystem(*state); + + EXPECT_TRUE(compare_err_stream(" ** Warning ** ValidateDistributionSystem: A ZoneHVAC:EnergyRecoveryVentilator is simulated along with an " + "AirflowNetwork but is not included in the AirflowNetwork.\n", + true)); +} + +TEST_F(EnergyPlusFixture, AirflowNetworkBalanceManager_TestZoneEqpSupportUnbalancedZoneERV) +{ + // Create zone + state->dataGlobal->NumOfZones = 1; + DataHeatBalance::Zone.allocate(1); + DataHeatBalance::Zone(1).Name = "ZONE 1"; + + // Create surfaces + DataSurfaces::Surface.allocate(1); + DataSurfaces::Surface(1).Name = "ZN004:ROOF001"; + DataSurfaces::Surface(1).Zone = 1; + DataSurfaces::Surface(1).ZoneName = "ZONE 1"; + DataSurfaces::Surface(1).Azimuth = 0.0; + DataSurfaces::Surface(1).ExtBoundCond = 0; + DataSurfaces::Surface(1).HeatTransSurf = true; + DataSurfaces::Surface(1).Tilt = 180.0; + DataSurfaces::Surface(1).Sides = 4; + DataSurfaces::Surface(1).Name = "ZN004:ROOF002"; + DataSurfaces::Surface(1).Zone = 1; + DataSurfaces::Surface(1).ZoneName = "ZONE 1"; + DataSurfaces::Surface(1).Azimuth = 0.0; + DataSurfaces::Surface(1).ExtBoundCond = 0; + DataSurfaces::Surface(1).HeatTransSurf = true; + DataSurfaces::Surface(1).Tilt = 180.0; + DataSurfaces::Surface(1).Sides = 4; + + DataSurfaces::SurfWinOriginalClass.allocate(1); + DataSurfaces::SurfWinOriginalClass(1) = DataSurfaces::SurfaceClass::Window; + + // Create air system + state->dataAirSystemsData->PrimaryAirSystems.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).NumBranches = 1; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).TotalComponents = 1; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp(1).TypeOf = "Fan:ConstantVolume"; + + // Create air nodes + DataLoopNode::NumOfNodes = 5; + DataLoopNode::Node.allocate(5); + DataLoopNode::Node(1).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(2).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(3).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(4).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(5).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::NodeID.allocate(5); + DataLoopNode::NodeID(1) = "ZONE 1 AIR NODE"; + bool errFlag{false}; + BranchNodeConnections::RegisterNodeConnection(*state, 1, "ZONE 1 AIR NODE", "Type1", "Object1", "ZoneNode", 1, false, errFlag); + EXPECT_FALSE(errFlag); + + // Connect zone to air node + state->dataZoneEquip->ZoneEquipConfig.allocate(1); + state->dataZoneEquip->ZoneEquipConfig(1).IsControlled = true; + state->dataZoneEquip->ZoneEquipConfig(1).ZoneName = "ZONE 1"; + state->dataZoneEquip->ZoneEquipConfig(1).ActualZoneNum = 1; + state->dataZoneEquip->ZoneEquipConfig(1).ZoneNode = 1; + state->dataZoneEquip->ZoneEquipConfig(1).NumInletNodes = 0; + state->dataZoneEquip->ZoneEquipConfig(1).NumReturnNodes = 0; + state->dataZoneEquip->ZoneEquipConfig(1).IsControlled = true; + + // One AirflowNetwork:MultiZone:Zone object + AirflowNetwork::AirflowNetworkNumOfZones = 1; + AirflowNetwork::MultizoneZoneData.allocate(1); + AirflowNetwork::MultizoneZoneData(1).ZoneNum = 1; + AirflowNetwork::MultizoneZoneData(1).ZoneName = "ZONE 1"; + + // Assume only one AirflowNetwork:Distribution:Node object is set for the Zone Air Node + AirflowNetwork::AirflowNetworkNumOfNodes = 1; + AirflowNetwork::AirflowNetworkNodeData.allocate(1); + AirflowNetwork::AirflowNetworkNodeData(1).Name = "ZONE 1"; + AirflowNetwork::AirflowNetworkNodeData(1).EPlusZoneNum = 1; + + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers.allocate(2); + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers(1) = 0; + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers(2) = 0; + + // Set flag to support zone equipment + AirflowNetwork::AirflowNetworkSimu.AllowSupportZoneEqp = true; + + // Create Fans + Real64 supplyFlowRate = 0.005; + Real64 exhaustFlowRate = 0.003; + Fan.allocate(2); + Fan(1).InletNodeNum = 2; + Fan(1).OutletNodeNum = 3; + Fan(1).FanType_Num = FanType_SimpleOnOff; + Fan(1).FanName = "SupplyFan"; + Fan(1).MaxAirFlowRate = supplyFlowRate; + DataLoopNode::NodeID(2) = "SupplyFanInletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 2, NodeID(2), "Fan:OnOff", Fan(1).FanName, "Inlet", 1, false, errFlag); + DataLoopNode::NodeID(3) = "SupplyFanOutletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 3, NodeID(3), "Fan:OnOff", Fan(1).FanName, "Outlet", 1, false, errFlag); + Fan(2).InletNodeNum = 4; + Fan(2).OutletNodeNum = 5; + Fan(2).FanType_Num = FanType_SimpleOnOff; + Fan(2).FanName = "ExhaustFan"; + Fan(2).MaxAirFlowRate = exhaustFlowRate; + DataLoopNode::NodeID(4) = "SupplyExhaustInletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 4, NodeID(4), "Fan:OnOff", Fan(2).FanName, "Inlet", 1, false, errFlag); + DataLoopNode::NodeID(5) = "SupplyExhaustOutletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 5, NodeID(5), "Fan:OnOff", Fan(2).FanName, "Outlet", 1, false, errFlag); + + // Create ERV + state->dataHVACStandAloneERV->StandAloneERV.allocate(1); + state->dataHVACStandAloneERV->GetERVInputFlag = false; + state->dataHVACStandAloneERV->NumStandAloneERVs = 1; + state->dataHVACStandAloneERV->StandAloneERV(1).SupplyAirVolFlow = 0.005; + state->dataHVACStandAloneERV->StandAloneERV(1).ExhaustAirVolFlow = 0.005; + state->dataHVACStandAloneERV->StandAloneERV(1).DesignSAFanVolFlowRate = 0.005; + state->dataHVACStandAloneERV->StandAloneERV(1).DesignEAFanVolFlowRate = 0.005; + state->dataHVACStandAloneERV->StandAloneERV(1).DesignHXVolFlowRate = 0.005; + state->dataHVACStandAloneERV->StandAloneERV(1).SupplyAirFanName = Fan(1).FanName; + state->dataHVACStandAloneERV->StandAloneERV(1).SupplyAirFanIndex = 1; + state->dataHVACStandAloneERV->StandAloneERV(1).SupplyAirInletNode = 2; + state->dataHVACStandAloneERV->StandAloneERV(1).ExhaustAirFanName = Fan(2).FanName; + state->dataHVACStandAloneERV->StandAloneERV(1).ExhaustAirFanIndex = 2; + state->dataHVACStandAloneERV->StandAloneERV(1).HeatExchangerTypeNum = HX_AIRTOAIR_GENERIC; + state->dataHVACStandAloneERV->StandAloneERV(1).HeatExchangerName = "ERV Heat Exchanger"; + + // Check validation and expected errors + ASSERT_THROW(ValidateDistributionSystem(*state), std::runtime_error); + std::string const error_string = delimited_string({ + " ** Severe ** ValidateDistributionSystem: 'SupplyFanInletNode' is not defined as an AirflowNetwork:Distribution:Node object.", + " ** Severe ** ValidateDistributionSystem: 'SupplyFanOutletNode' is not defined as an AirflowNetwork:Distribution:Node object.", + " ** Severe ** ValidateDistributionSystem: 'SupplyExhaustInletNode' is not defined as an AirflowNetwork:Distribution:Node object.", + " ** Severe ** ValidateDistributionSystem: 'SupplyExhaustOutletNode' is not defined as an AirflowNetwork:Distribution:Node object.", + " ** Fatal ** ValidateDistributionSystem: Program terminates for preceding reason(s).", + " ...Summary of Errors that led to program termination:", + " ..... Reference severe error count=4", + " ..... Last severe error=ValidateDistributionSystem: 'SupplyExhaustOutletNode' is not defined as an AirflowNetwork:Distribution:Node " + "object.", + }); + + EXPECT_TRUE(compare_err_stream(error_string, true)); +} + +TEST_F(EnergyPlusFixture, AirflowNetworkBalanceManager_TestNoZoneEqpSupportHPWH) +{ + // Create zone + state->dataGlobal->NumOfZones = 1; + DataHeatBalance::Zone.allocate(1); + DataHeatBalance::Zone(1).Name = "ZONE 1"; + + // Create surfaces + DataSurfaces::Surface.allocate(1); + DataSurfaces::Surface(1).Name = "ZN004:ROOF001"; + DataSurfaces::Surface(1).Zone = 1; + DataSurfaces::Surface(1).ZoneName = "ZONE 1"; + DataSurfaces::Surface(1).Azimuth = 0.0; + DataSurfaces::Surface(1).ExtBoundCond = 0; + DataSurfaces::Surface(1).HeatTransSurf = true; + DataSurfaces::Surface(1).Tilt = 180.0; + DataSurfaces::Surface(1).Sides = 4; + DataSurfaces::Surface(1).Name = "ZN004:ROOF002"; + DataSurfaces::Surface(1).Zone = 1; + DataSurfaces::Surface(1).ZoneName = "ZONE 1"; + DataSurfaces::Surface(1).Azimuth = 0.0; + DataSurfaces::Surface(1).ExtBoundCond = 0; + DataSurfaces::Surface(1).HeatTransSurf = true; + DataSurfaces::Surface(1).Tilt = 180.0; + DataSurfaces::Surface(1).Sides = 4; + + DataSurfaces::SurfWinOriginalClass.allocate(1); + DataSurfaces::SurfWinOriginalClass(1) = DataSurfaces::SurfaceClass::Window; + + // Create air system + state->dataAirSystemsData->PrimaryAirSystems.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).NumBranches = 1; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).TotalComponents = 1; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp(1).TypeOf = "Fan:ConstantVolume"; + + // Create air nodes + DataLoopNode::NumOfNodes = 3; + DataLoopNode::Node.allocate(3); + DataLoopNode::Node(1).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(2).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(3).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::NodeID.allocate(3); + DataLoopNode::NodeID(1) = "ZONE 1 AIR NODE"; + bool errFlag{false}; + BranchNodeConnections::RegisterNodeConnection(*state, 1, "ZONE 1 AIR NODE", "Type1", "Object1", "ZoneNode", 1, false, errFlag); + EXPECT_FALSE(errFlag); + + // Connect zone to air node + state->dataZoneEquip->ZoneEquipConfig.allocate(1); + state->dataZoneEquip->ZoneEquipConfig(1).IsControlled = true; + state->dataZoneEquip->ZoneEquipConfig(1).ZoneName = "ZONE 1"; + state->dataZoneEquip->ZoneEquipConfig(1).ActualZoneNum = 1; + state->dataZoneEquip->ZoneEquipConfig(1).ZoneNode = 1; + state->dataZoneEquip->ZoneEquipConfig(1).NumInletNodes = 0; + state->dataZoneEquip->ZoneEquipConfig(1).NumReturnNodes = 0; + state->dataZoneEquip->ZoneEquipConfig(1).IsControlled = true; + + // One AirflowNetwork:MultiZone:Zone object + AirflowNetwork::AirflowNetworkNumOfZones = 1; + AirflowNetwork::MultizoneZoneData.allocate(1); + AirflowNetwork::MultizoneZoneData(1).ZoneNum = 1; + AirflowNetwork::MultizoneZoneData(1).ZoneName = "ZONE 1"; + + // Assume only one AirflowNetwork:Distribution:Node object is set for the Zone Air Node + AirflowNetwork::AirflowNetworkNumOfNodes = 1; + AirflowNetwork::AirflowNetworkNodeData.allocate(1); + AirflowNetwork::AirflowNetworkNodeData(1).Name = "ZONE 1"; + AirflowNetwork::AirflowNetworkNodeData(1).EPlusZoneNum = 1; + + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers.allocate(2); + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers(1) = 0; + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers(2) = 0; + + // Set flag to support zone equipment + AirflowNetwork::AirflowNetworkSimu.AllowSupportZoneEqp = false; + + // Create Fan + Fan.allocate(1); + Fan(1).InletNodeNum = 2; + Fan(1).OutletNodeNum = 3; + Fan(1).FanType_Num = FanType_SimpleOnOff; + Fan(1).FanName = "SupplyFan"; + DataLoopNode::NodeID(2) = "SupplyFanInletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 2, NodeID(2), "Fan:OnOff", Fan(1).FanName, "Inlet", 1, false, errFlag); + DataLoopNode::NodeID(3) = "SupplyFanOutletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 3, NodeID(3), "Fan:OnOff", Fan(1).FanName, "Outlet", 1, false, errFlag); + + // Create HPWH + state->dataWaterThermalTanks->HPWaterHeater.allocate(1); + state->dataWaterThermalTanks->getWaterThermalTankInputFlag = false; + state->dataWaterThermalTanks->numHeatPumpWaterHeater = 1; + state->dataWaterThermalTanks->HPWaterHeater(1).InletAirConfiguration = WaterThermalTanks::AmbientTempEnum::TempZone; + state->dataWaterThermalTanks->HPWaterHeater(1).FanName = Fan(1).FanName; + state->dataWaterThermalTanks->HPWaterHeater(1).FanType = "Fan:OnOff"; + state->dataWaterThermalTanks->HPWaterHeater(1).FanOutletNode = 3; + + // Check validation and expected errors + ASSERT_THROW(ValidateDistributionSystem(*state), std::runtime_error); + std::string const error_string = delimited_string({ + " ** Severe ** ValidateDistributionSystem: 'SupplyFanInletNode' is not defined as an AirflowNetwork:Distribution:Node object.", + " ** Severe ** ValidateDistributionSystem: 'SupplyFanOutletNode' is not defined as an AirflowNetwork:Distribution:Node object.", + " ** Fatal ** ValidateDistributionSystem: Program terminates for preceding reason(s).", + " ...Summary of Errors that led to program termination:", + " ..... Reference severe error count=2", + " ..... Last severe error=ValidateDistributionSystem: 'SupplyFanOutletNode' is not defined as an AirflowNetwork:Distribution:Node object.", + }); + + EXPECT_TRUE(compare_err_stream(error_string, true)); +} + +TEST_F(EnergyPlusFixture, AirflowNetworkBalanceManager_TestZoneEqpSupportHPWH) +{ + // Create zone + state->dataGlobal->NumOfZones = 1; + DataHeatBalance::Zone.allocate(1); + DataHeatBalance::Zone(1).Name = "ZONE 1"; + + // Create surfaces + DataSurfaces::Surface.allocate(1); + DataSurfaces::Surface(1).Name = "ZN004:ROOF001"; + DataSurfaces::Surface(1).Zone = 1; + DataSurfaces::Surface(1).ZoneName = "ZONE 1"; + DataSurfaces::Surface(1).Azimuth = 0.0; + DataSurfaces::Surface(1).ExtBoundCond = 0; + DataSurfaces::Surface(1).HeatTransSurf = true; + DataSurfaces::Surface(1).Tilt = 180.0; + DataSurfaces::Surface(1).Sides = 4; + DataSurfaces::Surface(1).Name = "ZN004:ROOF002"; + DataSurfaces::Surface(1).Zone = 1; + DataSurfaces::Surface(1).ZoneName = "ZONE 1"; + DataSurfaces::Surface(1).Azimuth = 0.0; + DataSurfaces::Surface(1).ExtBoundCond = 0; + DataSurfaces::Surface(1).HeatTransSurf = true; + DataSurfaces::Surface(1).Tilt = 180.0; + DataSurfaces::Surface(1).Sides = 4; + + DataSurfaces::SurfWinOriginalClass.allocate(1); + DataSurfaces::SurfWinOriginalClass(1) = DataSurfaces::SurfaceClass::Window; + + // Create air system + state->dataAirSystemsData->PrimaryAirSystems.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).NumBranches = 1; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).TotalComponents = 1; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp(1).TypeOf = "Fan:ConstantVolume"; + + // Create air nodes + DataLoopNode::NumOfNodes = 3; + DataLoopNode::Node.allocate(3); + DataLoopNode::Node(1).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(2).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(3).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::NodeID.allocate(3); + DataLoopNode::NodeID(1) = "ZONE 1 AIR NODE"; + bool errFlag{false}; + BranchNodeConnections::RegisterNodeConnection(*state, 1, "ZONE 1 AIR NODE", "Type1", "Object1", "ZoneNode", 1, false, errFlag); + EXPECT_FALSE(errFlag); + + // Connect zone to air node + state->dataZoneEquip->ZoneEquipConfig.allocate(1); + state->dataZoneEquip->ZoneEquipConfig(1).IsControlled = true; + state->dataZoneEquip->ZoneEquipConfig(1).ZoneName = "ZONE 1"; + state->dataZoneEquip->ZoneEquipConfig(1).ActualZoneNum = 1; + state->dataZoneEquip->ZoneEquipConfig(1).ZoneNode = 1; + state->dataZoneEquip->ZoneEquipConfig(1).NumInletNodes = 0; + state->dataZoneEquip->ZoneEquipConfig(1).NumReturnNodes = 0; + state->dataZoneEquip->ZoneEquipConfig(1).IsControlled = true; + + // One AirflowNetwork:MultiZone:Zone object + AirflowNetwork::AirflowNetworkNumOfZones = 1; + AirflowNetwork::MultizoneZoneData.allocate(1); + AirflowNetwork::MultizoneZoneData(1).ZoneNum = 1; + AirflowNetwork::MultizoneZoneData(1).ZoneName = "ZONE 1"; + + // Assume only one AirflowNetwork:Distribution:Node object is set for the Zone Air Node + AirflowNetwork::AirflowNetworkNumOfNodes = 1; + AirflowNetwork::AirflowNetworkNodeData.allocate(1); + AirflowNetwork::AirflowNetworkNodeData(1).Name = "ZONE 1"; + AirflowNetwork::AirflowNetworkNodeData(1).EPlusZoneNum = 1; + + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers.allocate(2); + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers(1) = 0; + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers(2) = 0; + + // Set flag to support zone equipment + AirflowNetwork::AirflowNetworkSimu.AllowSupportZoneEqp = true; + + // Create Fan + Fan.allocate(1); + Fan(1).InletNodeNum = 2; + Fan(1).OutletNodeNum = 3; + Fan(1).FanType_Num = FanType_SimpleOnOff; + Fan(1).FanName = "SupplyFan"; + DataLoopNode::NodeID(2) = "SupplyFanInletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 2, NodeID(2), "Fan:OnOff", Fan(1).FanName, "Inlet", 1, false, errFlag); + DataLoopNode::NodeID(3) = "SupplyFanOutletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 3, NodeID(3), "Fan:OnOff", Fan(1).FanName, "Outlet", 1, false, errFlag); + + // Create HPWH + state->dataWaterThermalTanks->HPWaterHeater.allocate(1); + state->dataWaterThermalTanks->getWaterThermalTankInputFlag = false; + state->dataWaterThermalTanks->numHeatPumpWaterHeater = 1; + state->dataWaterThermalTanks->HPWaterHeater(1).InletAirConfiguration = WaterThermalTanks::AmbientTempEnum::TempZone; + state->dataWaterThermalTanks->HPWaterHeater(1).FanName = Fan(1).FanName; + state->dataWaterThermalTanks->HPWaterHeater(1).FanType = "Fan:OnOff"; + state->dataWaterThermalTanks->HPWaterHeater(1).FanOutletNode = 3; + + // Check validation and expected warning + ValidateDistributionSystem(*state); + EXPECT_TRUE(compare_err_stream(" ** Warning ** ValidateDistributionSystem: Heat pump water heater is simulated along with an AirflowNetwork " + "but is not included in the AirflowNetwork.\n", + true)); +} + +TEST_F(EnergyPlusFixture, AirflowNetworkBalanceManager_TestZoneEqpSupportHPWHZoneAndOA) +{ + // Create zone + state->dataGlobal->NumOfZones = 1; + DataHeatBalance::Zone.allocate(1); + DataHeatBalance::Zone(1).Name = "ZONE 1"; + + // Create surfaces + DataSurfaces::Surface.allocate(1); + DataSurfaces::Surface(1).Name = "ZN004:ROOF001"; + DataSurfaces::Surface(1).Zone = 1; + DataSurfaces::Surface(1).ZoneName = "ZONE 1"; + DataSurfaces::Surface(1).Azimuth = 0.0; + DataSurfaces::Surface(1).ExtBoundCond = 0; + DataSurfaces::Surface(1).HeatTransSurf = true; + DataSurfaces::Surface(1).Tilt = 180.0; + DataSurfaces::Surface(1).Sides = 4; + DataSurfaces::Surface(1).Name = "ZN004:ROOF002"; + DataSurfaces::Surface(1).Zone = 1; + DataSurfaces::Surface(1).ZoneName = "ZONE 1"; + DataSurfaces::Surface(1).Azimuth = 0.0; + DataSurfaces::Surface(1).ExtBoundCond = 0; + DataSurfaces::Surface(1).HeatTransSurf = true; + DataSurfaces::Surface(1).Tilt = 180.0; + DataSurfaces::Surface(1).Sides = 4; + + DataSurfaces::SurfWinOriginalClass.allocate(1); + DataSurfaces::SurfWinOriginalClass(1) = DataSurfaces::SurfaceClass::Window; + + // Create air system + state->dataAirSystemsData->PrimaryAirSystems.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).NumBranches = 1; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).TotalComponents = 1; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp(1).TypeOf = "Fan:ConstantVolume"; + + // Create air nodes + DataLoopNode::NumOfNodes = 3; + DataLoopNode::Node.allocate(3); + DataLoopNode::Node(1).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(2).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::Node(3).FluidType = DataLoopNode::NodeType_Air; + DataLoopNode::NodeID.allocate(3); + DataLoopNode::NodeID(1) = "ZONE 1 AIR NODE"; + bool errFlag{false}; + BranchNodeConnections::RegisterNodeConnection(*state, 1, "ZONE 1 AIR NODE", "Type1", "Object1", "ZoneNode", 1, false, errFlag); + EXPECT_FALSE(errFlag); + + // Connect zone to air node + state->dataZoneEquip->ZoneEquipConfig.allocate(1); + state->dataZoneEquip->ZoneEquipConfig(1).IsControlled = true; + state->dataZoneEquip->ZoneEquipConfig(1).ZoneName = "ZONE 1"; + state->dataZoneEquip->ZoneEquipConfig(1).ActualZoneNum = 1; + state->dataZoneEquip->ZoneEquipConfig(1).ZoneNode = 1; + state->dataZoneEquip->ZoneEquipConfig(1).NumInletNodes = 0; + state->dataZoneEquip->ZoneEquipConfig(1).NumReturnNodes = 0; + state->dataZoneEquip->ZoneEquipConfig(1).IsControlled = true; + + // One AirflowNetwork:MultiZone:Zone object + AirflowNetwork::AirflowNetworkNumOfZones = 1; + AirflowNetwork::MultizoneZoneData.allocate(1); + AirflowNetwork::MultizoneZoneData(1).ZoneNum = 1; + AirflowNetwork::MultizoneZoneData(1).ZoneName = "ZONE 1"; + + // Assume only one AirflowNetwork:Distribution:Node object is set for the Zone Air Node + AirflowNetwork::AirflowNetworkNumOfNodes = 1; + AirflowNetwork::AirflowNetworkNodeData.allocate(1); + AirflowNetwork::AirflowNetworkNodeData(1).Name = "ZONE 1"; + AirflowNetwork::AirflowNetworkNodeData(1).EPlusZoneNum = 1; + + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers.allocate(2); + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers(1) = 0; + state->dataAirflowNetworkBalanceManager->SplitterNodeNumbers(2) = 0; + + // Set flag to support zone equipment + AirflowNetwork::AirflowNetworkSimu.AllowSupportZoneEqp = true; + + // Create Fan + Fan.allocate(1); + Fan(1).InletNodeNum = 2; + Fan(1).OutletNodeNum = 3; + Fan(1).FanType_Num = FanType_SimpleOnOff; + Fan(1).FanName = "SupplyFan"; + DataLoopNode::NodeID(2) = "SupplyFanInletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 2, NodeID(2), "Fan:OnOff", Fan(1).FanName, "Inlet", 1, false, errFlag); + DataLoopNode::NodeID(3) = "SupplyFanOutletNode"; + BranchNodeConnections::RegisterNodeConnection(*state, 3, NodeID(3), "Fan:OnOff", Fan(1).FanName, "Outlet", 1, false, errFlag); + + // Create HPWH + state->dataWaterThermalTanks->HPWaterHeater.allocate(1); + state->dataWaterThermalTanks->getWaterThermalTankInputFlag = false; + state->dataWaterThermalTanks->numHeatPumpWaterHeater = 1; + state->dataWaterThermalTanks->HPWaterHeater(1).InletAirConfiguration = WaterThermalTanks::AmbientTempEnum::ZoneAndOA; + state->dataWaterThermalTanks->HPWaterHeater(1).FanName = Fan(1).FanName; + state->dataWaterThermalTanks->HPWaterHeater(1).FanType = "Fan:OnOff"; + state->dataWaterThermalTanks->HPWaterHeater(1).FanOutletNode = 3; + + // Check validation and expected errors + ASSERT_THROW(ValidateDistributionSystem(*state), std::runtime_error); + std::string const error_string = delimited_string({ + " ** Severe ** ValidateDistributionSystem: 'SupplyFanInletNode' is not defined as an AirflowNetwork:Distribution:Node object.", + " ** Severe ** ValidateDistributionSystem: 'SupplyFanOutletNode' is not defined as an AirflowNetwork:Distribution:Node object.", + " ** Fatal ** ValidateDistributionSystem: Program terminates for preceding reason(s).", + " ...Summary of Errors that led to program termination:", + " ..... Reference severe error count=2", + " ..... Last severe error=ValidateDistributionSystem: 'SupplyFanOutletNode' is not defined as an AirflowNetwork:Distribution:Node object.", + }); + + EXPECT_TRUE(compare_err_stream(error_string, true)); +} + +} // namespace EnergyPlus diff --git a/tst/EnergyPlus/unit/DaylightingManager.unit.cc b/tst/EnergyPlus/unit/DaylightingManager.unit.cc index 9e79edfd4a9..a239865639d 100644 --- a/tst/EnergyPlus/unit/DaylightingManager.unit.cc +++ b/tst/EnergyPlus/unit/DaylightingManager.unit.cc @@ -1380,12 +1380,12 @@ TEST_F(EnergyPlusFixture, DaylightingManager_DayltgInteriorIllum_Test) // Window5 model - expect 100 for unshaded and 50 for shaded (10 and 5 for RefPt2) SurfWinWindowModelType(IWin) = Window5DetailedModel; - SurfWinShadingFlag(IWin) = DataSurfaces::NoShade; + SurfWinShadingFlag(IWin) = DataSurfaces::WinShadingType::NoShade; DaylightingManager::DayltgInteriorIllum(*state, ZoneNum); EXPECT_NEAR(state->dataDaylightingManager->DaylIllum(1), 100.0, 0.001); EXPECT_NEAR(state->dataDaylightingManager->DaylIllum(2), 10.0, 0.001); - SurfWinShadingFlag(IWin) = DataSurfaces::ExtBlindOn; + SurfWinShadingFlag(IWin) = DataSurfaces::WinShadingType::ExtBlind; DaylightingManager::DayltgInteriorIllum(*state, ZoneNum); EXPECT_NEAR(state->dataDaylightingManager->DaylIllum(1), 50.0, 0.001); EXPECT_NEAR(state->dataDaylightingManager->DaylIllum(2), 5.0, 0.001); @@ -1393,12 +1393,12 @@ TEST_F(EnergyPlusFixture, DaylightingManager_DayltgInteriorIllum_Test) // BSDF model - expect 100 for unshaded and 100 for shaded (10 for RefPt2 // BSDF does shading differently, it's integrated in the base state SurfWinWindowModelType(IWin) = WindowBSDFModel; - SurfWinShadingFlag(IWin) = DataSurfaces::NoShade; + SurfWinShadingFlag(IWin) = DataSurfaces::WinShadingType::NoShade; DaylightingManager::DayltgInteriorIllum(*state, ZoneNum); EXPECT_NEAR(state->dataDaylightingManager->DaylIllum(1), 100.0, 0.001); EXPECT_NEAR(state->dataDaylightingManager->DaylIllum(2), 10.0, 0.001); - SurfWinShadingFlag(IWin) = DataSurfaces::ExtBlindOn; + SurfWinShadingFlag(IWin) = DataSurfaces::WinShadingType::ExtBlind; DaylightingManager::DayltgInteriorIllum(*state, ZoneNum); EXPECT_NEAR(state->dataDaylightingManager->DaylIllum(1), 100.0, 0.001); EXPECT_NEAR(state->dataDaylightingManager->DaylIllum(2), 10.0, 0.001); diff --git a/tst/EnergyPlus/unit/EMSManager.unit.cc b/tst/EnergyPlus/unit/EMSManager.unit.cc index 75b929afefb..8d074cf5257 100644 --- a/tst/EnergyPlus/unit/EMSManager.unit.cc +++ b/tst/EnergyPlus/unit/EMSManager.unit.cc @@ -1621,8 +1621,8 @@ TEST_F(EnergyPlusFixture, EMSManager_TestWindowShadingControlExteriorScreenOptio state->dataConstruction->Construct(1).Name = "Construction1"; - DataSurfaces::WindowShadingControl(1).ShadingType = 0; - DataSurfaces::WindowShadingControl(2).ShadingType = DataSurfaces::WSC_ST_ExteriorScreen; + DataSurfaces::WindowShadingControl(1).ShadingType = DataSurfaces::WinShadingType::NoShade; + DataSurfaces::WindowShadingControl(2).ShadingType = DataSurfaces::WinShadingType::ExtScreen; DataSurfaces::TotSurfaces = 2; @@ -1634,16 +1634,16 @@ TEST_F(EnergyPlusFixture, EMSManager_TestWindowShadingControlExteriorScreenOptio SetupWindowShadingControlActuators(*state); EXPECT_FALSE(DataSurfaces::SurfWinShadingFlagEMSOn(2)); - EXPECT_EQ(DataSurfaces::SurfWinShadingFlagEMSValue(2), 0); + EXPECT_EQ(DataSurfaces::SurfWinShadingFlagEMSValue(2), 0.0); DataHeatBalance::Zone.allocate(1); DataHeatBalance::Zone(1).WindowSurfaceFirst = 1; DataHeatBalance::Zone(1).WindowSurfaceLast = 2; state->dataGlobal->NumOfZones = 1; DataSurfaces::SurfWinShadingFlagEMSOn(2) = true; - DataSurfaces::SurfWinShadingFlagEMSValue(2) = 1.0; + DataSurfaces::SurfWinShadingFlagEMSValue(2) = 1.0; // WinShadingType::IntShade SolarShading::WindowShadingManager(*state); - EXPECT_EQ(DataSurfaces::SurfWinShadingFlag(2), DataSurfaces::SurfWinShadingFlagEMSValue(2)); + EXPECT_EQ(DataSurfaces::SurfWinShadingFlag(2), DataSurfaces::WinShadingType::IntShade); } TEST_F(EnergyPlusFixture, EMS_WeatherDataActuators) { diff --git a/tst/EnergyPlus/unit/ElectricPowerServiceManager.unit.cc b/tst/EnergyPlus/unit/ElectricPowerServiceManager.unit.cc index 0d681313592..a1a6ec66add 100644 --- a/tst/EnergyPlus/unit/ElectricPowerServiceManager.unit.cc +++ b/tst/EnergyPlus/unit/ElectricPowerServiceManager.unit.cc @@ -1023,3 +1023,147 @@ TEST_F(EnergyPlusFixture, ElectricLoadCenter_WarnAvailabilitySchedule_PVWatts) EXPECT_TRUE(compare_err_stream(error_string, true)); } + +TEST_F(EnergyPlusFixture, Battery_LiIonNmc_Constructor) +{ + std::string const idf_objects = delimited_string({ + "ElectricLoadCenter:Storage:LiIonNMCBattery,", + " Battery1, !- Name", + " , !- Availability Schedule Name", + " , !- Zone Name", + " , !- Radiative Fraction", + " KandlerSmith, !- Lifetime Model", + " 139, !- Number of Cells in Series", + " 8, !- Number of Strings in Parallel", + " 0.95, !- Initial Fractional State of Charge", + " , !- DC to DC Charging Efficiency", + " 100, !- Battery Mass", + " 0.75, !- Battery Surface Area", + " 1500, !- Battery Specific Heat Capacity", + " 8.1; !- Heat Transfer Coefficient Between Battery and Ambient", + + "ElectricLoadCenter:Storage:LiIonNMCBattery,", + " Battery2, !- Name", + " , !- Availability Schedule Name", + " , !- Zone Name", + " , !- Radiative Fraction", + " None, !- Lifetime Model", + " 139, !- Number of Cells in Series", + " 10, !- Number of Strings in Parallel", + " 0.5, !- Initial Fractional State of Charge", + " , !- DC to DC Charging Efficiency", + " 100, !- Battery Mass", + " 0.75, !- Battery Surface Area", + " , !- Battery Specific Heat Capacity", + " , !- Heat Transfer Coefficient Between Battery and Ambient", + " 1, !- Fully Charged Cell Voltage", + " 2, !- Cell Voltage at End of Exponential Zone", + " 3, !- Cell Voltage at End of Nominal Zone", + " , !- Default Nominal Cell Voltage", + " , !- Fully Charged Cell Capacity", + " 0.9, !- Fraction of Cell Capacity Removed at the End of Exponential Zone", + " 0.8; !- Fraction of Cell Capacity Removed at the End of Nominal Zone", + }); + + ASSERT_TRUE(process_idf(idf_objects)); + ElectricStorage battery1{*state, "Battery1"}; + ASSERT_TRUE(UtilityRoutines::SameString(battery1.name(), "Battery1")); + + ASSERT_THROW(ElectricStorage battery2(*state, "Battery2"), EnergyPlus::FatalError); + std::string const error_string = delimited_string({ + " ** Severe ** ElectricStorage constructor ElectricLoadCenter:Storage:LiIonNMCBattery=\"BATTERY2\", invalid entry.", + " ** ~~~ ** Fully Charged Cell Voltage must be greater than Cell Voltage at End of Exponential Zone,", + " ** ~~~ ** which must be greater than Cell Voltage at End of Nominal Zone.", + " ** ~~~ ** Fully Charged Cell Voltage = 1.000", + " ** ~~~ ** Cell Voltage at End of Exponential Zone = 2.000", + " ** ~~~ ** Cell Voltage at End of Nominal Zone = 3.000", + " ** Severe ** ElectricStorage constructor ElectricLoadCenter:Storage:LiIonNMCBattery=\"BATTERY2\", invalid entry.", + " ** ~~~ ** Fraction of Cell Capacity Removed at the End of Nominal Zone must be greater than Fraction of Cell Capacity Removed at the End of Exponential Zone.", + " ** ~~~ ** Fraction of Cell Capacity Removed at the End of Exponential Zone = 0.900", + " ** ~~~ ** Fraction of Cell Capacity Removed at the End of Nominal Zone = 0.800", + " ** Fatal ** ElectricStorage constructor Preceding errors terminate program.", + " ...Summary of Errors that led to program termination:", + " ..... Reference severe error count=2", + " ..... Last severe error=ElectricStorage constructor ElectricLoadCenter:Storage:LiIonNMCBattery=\"BATTERY2\", invalid entry." + }); + EXPECT_TRUE(compare_err_stream(error_string, true)); +} + +TEST_F(EnergyPlusFixture, Battery_LiIonNmc_Simulate) +{ + std::string const idf_objects = delimited_string({ + "ElectricLoadCenter:Storage:LiIonNMCBattery,", + " Battery1, !- Name", + " , !- Availability Schedule Name", + " , !- Zone Name", + " , !- Radiative Fraction", + " KandlerSmith, !- Lifetime Model", + " 139, !- Number of Cells in Series", + " 8, !- Number of Strings in Parallel", + " 0.95, !- Initial Fractional State of Charge", + " , !- DC to DC Charging Efficiency", + " 100, !- Battery Mass", + " 0.75, !- Battery Surface Area", + " , !- Battery Specific Heat Capacity", + " ; !- Heat Transfer Coefficient Between Battery and Ambient", + }); + ASSERT_TRUE(process_idf(idf_objects)); + + ElectricStorage battery{*state, "Battery1"}; + + DataHVACGlobals::TimeStepSys = 0.25; + state->dataEnvrn->OutDryBulbTemp = 23.0; + Real64 socMin = 0.1; + Real64 socMax = 0.95; + + Real64 powerCharge = 0.0; + Real64 powerDischarge = 3000.0; + bool charging = false; + bool discharging = true; + + battery.simulate(*state, powerCharge, powerDischarge, charging, discharging, socMax, socMin); + + ASSERT_NEAR(battery.storedPower(), 0.0, 0.1); + ASSERT_NEAR(battery.storedEnergy(), 0.0, 0.1); + ASSERT_NEAR(battery.drawnPower(), powerDischarge, 0.1); + ASSERT_NEAR(battery.drawnEnergy(), powerDischarge * 15 * 60, 0.1); + ASSERT_NEAR(battery.stateOfChargeFraction(), 0.929, 0.01); + ASSERT_NEAR(battery.batteryTemperature(), 20.1, 0.1); + + DataHVACGlobals::SysTimeElapsed += DataHVACGlobals::TimeStepSys; + powerDischarge = 0.0; + powerCharge = 5000.0; + charging = true; + discharging = false; + + battery.timeCheckAndUpdate(*state); + battery.simulate(*state, powerCharge, powerDischarge, charging, discharging, socMax, socMin); + + // Doesn't accept all the power, because the battery will be at capacity. + ASSERT_NEAR(battery.storedPower(), 1330.35, 0.1); + ASSERT_NEAR(battery.storedEnergy(), 1197315.3, 0.1); + ASSERT_NEAR(battery.drawnPower(), 0.0, 0.1); + ASSERT_NEAR(battery.drawnEnergy(), 0.0, 0.1); + ASSERT_NEAR(battery.stateOfChargeFraction(), socMax, 0.01); + + // Discharge the battery some more (redo of last timestep) + powerDischarge = 5000.0; + powerCharge = 0.0; + charging = false; + discharging = true; + battery.timeCheckAndUpdate(*state); + battery.simulate(*state, powerCharge, powerDischarge, charging, discharging, socMax, socMin); + ASSERT_NEAR(battery.stateOfChargeFraction(), 0.837, 0.01); + + // See that the battery state is reset at the beginning of a new environment (and also at the end of warmup) + DataHVACGlobals::SysTimeElapsed = 0.0; + battery.reinitAtBeginEnvironment(); + battery.timeCheckAndUpdate(*state); + powerDischarge = 0.0; + powerCharge = 0.0; + charging = false; + discharging = false; + battery.simulate(*state, powerCharge, powerDischarge, charging, discharging, socMax, socMin); + ASSERT_NEAR(battery.stateOfChargeFraction(), 0.95, 0.1); + +} \ No newline at end of file diff --git a/tst/EnergyPlus/unit/HeatBalanceManager.unit.cc b/tst/EnergyPlus/unit/HeatBalanceManager.unit.cc index 09e5c738b72..bdd53f53f42 100644 --- a/tst/EnergyPlus/unit/HeatBalanceManager.unit.cc +++ b/tst/EnergyPlus/unit/HeatBalanceManager.unit.cc @@ -380,7 +380,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceManager_ZoneAirMassFlowConservationData1) "25, !- Maximum Number of Warmup Days", "6; !- Minimum Number of Warmup Days", "ZoneAirMassFlowConservation,", - "Yes, !- Adjust Zone Mixing For Zone Air Mass Flow Balance", + "AdjustMixingOnly, !- Adjust Zone Mixing and Return For Air Mass Flow Balance", "AddInfiltrationFlow, !- Infiltration Balancing Method", "MixingSourceZonesOnly; !- Infiltration Balancing Zones", }); @@ -394,7 +394,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceManager_ZoneAirMassFlowConservationData1) GetProjectControlData(*state, ErrorsFound); // returns ErrorsFound false, ZoneAirMassFlowConservation never sets it EXPECT_FALSE(ErrorsFound); EXPECT_TRUE(ZoneAirMassFlow.EnforceZoneMassBalance); - EXPECT_TRUE(ZoneAirMassFlow.BalanceMixing); + EXPECT_EQ(ZoneAirMassFlow.ZoneFlowAdjustment, AdjustMixingOnly); EXPECT_EQ(ZoneAirMassFlow.InfiltrationTreatment, AddInfiltrationFlow); EXPECT_EQ(ZoneAirMassFlow.InfiltrationZoneType, MixingSourceZonesOnly); } @@ -414,7 +414,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceManager_ZoneAirMassFlowConservationData2) "25, !- Maximum Number of Warmup Days", "6; !- Minimum Number of Warmup Days", "ZoneAirMassFlowConservation,", - "No, !- Adjust Zone Mixing For Zone Air Mass Flow Balance", + "None, !- Adjust Zone Mixing and Return For Air Mass Flow Balance", "AdjustInfiltrationFlow, !- Infiltration Balancing Method", "AllZones; !- Infiltration Balancing Zones", "Zone, Zone 1;", @@ -457,7 +457,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceManager_ZoneAirMassFlowConservationData2) GetProjectControlData(*state, ErrorsFound); // returns ErrorsFound false, ZoneAirMassFlowConservation never sets it EXPECT_FALSE(ErrorsFound); EXPECT_TRUE(ZoneAirMassFlow.EnforceZoneMassBalance); - EXPECT_FALSE(ZoneAirMassFlow.BalanceMixing); + EXPECT_EQ(ZoneAirMassFlow.ZoneFlowAdjustment, NoAdjustReturnAndMixing); EXPECT_EQ(ZoneAirMassFlow.InfiltrationTreatment, AdjustInfiltrationFlow); EXPECT_EQ(ZoneAirMassFlow.InfiltrationZoneType, AllZones); @@ -590,7 +590,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceManager_ZoneAirMassFlowConservationData3) "25, !- Maximum Number of Warmup Days", "6; !- Minimum Number of Warmup Days", "ZoneAirMassFlowConservation,", - "No, !- Adjust Zone Mixing For Zone Air Mass Flow Balance", + "None, !- Adjust Zone Mixing and Return For Air Mass Flow Balance", "None, !- Infiltration Balancing Method", "; !- Infiltration Balancing Zones" }); @@ -604,7 +604,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceManager_ZoneAirMassFlowConservationData3) GetProjectControlData(*state, ErrorsFound); // returns ErrorsFound false, ZoneAirMassFlowConservation never sets it EXPECT_FALSE(ErrorsFound); EXPECT_FALSE(ZoneAirMassFlow.EnforceZoneMassBalance); - EXPECT_FALSE(ZoneAirMassFlow.BalanceMixing); + EXPECT_EQ(ZoneAirMassFlow.ZoneFlowAdjustment, NoAdjustReturnAndMixing); EXPECT_EQ(ZoneAirMassFlow.InfiltrationTreatment, NoInfiltrationFlow); EXPECT_EQ(ZoneAirMassFlow.InfiltrationZoneType, 0); } @@ -624,7 +624,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceManager_ZoneAirMassFlowConservationReportVa "25, !- Maximum Number of Warmup Days", "6; !- Minimum Number of Warmup Days", "ZoneAirMassFlowConservation,", - "Yes, !- Adjust Zone Mixing For Zone Air Mass Flow Balance", + "AdjustMixingOnly, !- Adjust Zone Mixing and Return For Air Mass Flow Balance", "AdjustInfiltrationFlow, !- Infiltration Balancing Method", "AllZones; !- Infiltration Balancing Zones", @@ -1312,7 +1312,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceManager_HVACSystemRootFindingAlgorithmInput "25, !- Maximum Number of Warmup Days", "6; !- Minimum Number of Warmup Days", "ZoneAirMassFlowConservation,", - "No, !- Adjust Zone Mixing For Zone Air Mass Flow Balance", + "None, !- Adjust Zone Mixing and Return For Air Mass Flow Balance", "None, !- Infiltration Balancing Method", "; !- Infiltration Balancing Zones", " HVACSystemRootFindingAlgorithm,", @@ -1345,7 +1345,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceManager_HVACSystemRootFindingAlgorithmNoInp "25, !- Maximum Number of Warmup Days", "6; !- Minimum Number of Warmup Days", "ZoneAirMassFlowConservation,", - "No, !- Adjust Zone Mixing For Zone Air Mass Flow Balance", + "None, !- Adjust Zone Mixing and Return For Air Mass Flow Balance", "None, !- Infiltration Balancing Method", "; !- Infiltration Balancing Zones", @@ -1938,7 +1938,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceManager_HVACSystemRootFindingAlgorithmBisec "25, !- Maximum Number of Warmup Days", "6; !- Minimum Number of Warmup Days", "ZoneAirMassFlowConservation,", - "No, !- Adjust Zone Mixing For Zone Air Mass Flow Balance", + "None, !- Adjust Zone Mixing and Return For Air Mass Flow Balance", "None, !- Infiltration Balancing Method", "; !- Infiltration Balancing Zones", " HVACSystemRootFindingAlgorithm,", diff --git a/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc b/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc index 8642a7112c3..31409ad9446 100644 --- a/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc +++ b/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc @@ -280,7 +280,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceSurfaceManager_ComputeIntThermalAbsorpFacto DataSurfaces::Surface(1).HeatTransSurf = true; DataSurfaces::Surface(1).Construction = 1; - DataSurfaces::SurfWinShadingFlag(1) = 0; + DataSurfaces::SurfWinShadingFlag(1) = DataSurfaces::WinShadingType::ShadeOff; state->dataConstruction->Construct(1).InsideAbsorpThermal = 0.9; state->dataConstruction->Construct(1).TransDiff = 0.0; DataSurfaces::Surface(1).MaterialMovInsulInt = 1; diff --git a/tst/EnergyPlus/unit/OutputReportTabular.unit.cc b/tst/EnergyPlus/unit/OutputReportTabular.unit.cc index 347f47a4912..57d62042485 100644 --- a/tst/EnergyPlus/unit/OutputReportTabular.unit.cc +++ b/tst/EnergyPlus/unit/OutputReportTabular.unit.cc @@ -1487,7 +1487,7 @@ TEST_F(EnergyPlusFixture, OutputReportTabular_ZoneMultiplierTest) EXPECT_EQ(DataHeatBalance::ZonePreDefRep(1).NumOccAccum, DataHeatBalance::ZonePreDefRep(2).NumOccAccum); // expect energy to report according to multipliers - EXPECT_NEAR(10.0, (DataHeatBalance::ZonePreDefRep(2).MechVentVolTotal / DataHeatBalance::ZonePreDefRep(1).MechVentVolTotal), 0.00001); + EXPECT_NEAR(10.0, (DataHeatBalance::ZonePreDefRep(2).MechVentVolTotalOcc / DataHeatBalance::ZonePreDefRep(1).MechVentVolTotalOcc), 0.00001); EXPECT_NEAR(10.0, (DataHeatBalance::ZonePreDefRep(2).MechVentVolMin / DataHeatBalance::ZonePreDefRep(1).MechVentVolMin), 0.00001); EXPECT_NEAR(10.0, (DataHeatBalance::ZonePreDefRep(2).SHGSAnZoneEqCl / DataHeatBalance::ZonePreDefRep(1).SHGSAnZoneEqCl), 0.00001); EXPECT_NEAR(10.0, (DataHeatBalance::ZonePreDefRep(2).SHGSAnPeoplAdd / DataHeatBalance::ZonePreDefRep(1).SHGSAnPeoplAdd), 0.00001); diff --git a/tst/EnergyPlus/unit/SolarShading.unit.cc b/tst/EnergyPlus/unit/SolarShading.unit.cc index 3917d42c9b4..671a2f16630 100644 --- a/tst/EnergyPlus/unit/SolarShading.unit.cc +++ b/tst/EnergyPlus/unit/SolarShading.unit.cc @@ -2613,3 +2613,22 @@ TEST_F(EnergyPlusFixture, SolarShadingTest_selectActiveWindowShadingControl) activeWindowShadingControl = DataSurfaces::Surface(curSurface).windowShadingControlList[curIndexActiveWindowShadingControl]; EXPECT_EQ(activeWindowShadingControl, 1); } + +TEST_F(EnergyPlusFixture, SolarShadingTest_ShadingFlagTest) +{ + WinShadingType ShadingFlag = WinShadingType::IntShade; + EXPECT_TRUE(IS_SHADED(ShadingFlag)); + EXPECT_TRUE(ANY_SHADE(ShadingFlag)); + EXPECT_TRUE(ANY_SHADE_SCREEN(ShadingFlag)); + EXPECT_TRUE(ANY_INTERIOR_SHADE_BLIND(ShadingFlag)); + EXPECT_FALSE(ANY_BLIND(ShadingFlag)); + EXPECT_FALSE(ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadingFlag)); + EXPECT_FALSE(ANY_BETWEENGLASS_SHADE_BLIND(ShadingFlag)); + + ShadingFlag = WinShadingType::ExtBlind; + EXPECT_TRUE(ANY_BLIND(ShadingFlag)); + EXPECT_TRUE(ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadingFlag)); + + ShadingFlag = WinShadingType::GlassConditionallyLightened; + IS_SHADED_NO_GLARE_CTRL(ANY_BETWEENGLASS_SHADE_BLIND(ShadingFlag)); +} \ No newline at end of file diff --git a/tst/EnergyPlus/unit/SurfaceGeometry.unit.cc b/tst/EnergyPlus/unit/SurfaceGeometry.unit.cc index c97cd19a63a..ea8e30901cf 100644 --- a/tst/EnergyPlus/unit/SurfaceGeometry.unit.cc +++ b/tst/EnergyPlus/unit/SurfaceGeometry.unit.cc @@ -3474,9 +3474,9 @@ TEST_F(EnergyPlusFixture, SurfaceGeometry_isWindowShadingControlSimilar_Test) WindowShadingControl(1).Name = "TheShadingControl"; WindowShadingControl(1).ZoneIndex = 57; WindowShadingControl(1).SequenceNumber = 3; - WindowShadingControl(1).ShadingType = WSC_ST_ExteriorShade; + WindowShadingControl(1).ShadingType = WinShadingType::ExtShade; WindowShadingControl(1).ShadingDevice = 17; - WindowShadingControl(1).ShadingControlType = WSCT_OnIfScheduled; + WindowShadingControl(1).ShadingControlType = WindowShadingControlType::OnIfScheduled; WindowShadingControl(1).Schedule = 83; WindowShadingControl(1).SetPoint = 200; WindowShadingControl(1).SetPoint2 = 170; @@ -3546,11 +3546,11 @@ TEST_F(EnergyPlusFixture, SurfaceGeometry_isWindowShadingControlSimilar_Test) EXPECT_FALSE(isWindowShadingControlSimilar(1, 2)); WindowShadingControl(2) = WindowShadingControl(1); - WindowShadingControl(2).ShadingType = WSC_ST_BetweenGlassBlind; + WindowShadingControl(2).ShadingType = WinShadingType::BGBlind; EXPECT_FALSE(isWindowShadingControlSimilar(1, 2)); WindowShadingControl(2) = WindowShadingControl(1); - WindowShadingControl(2).ShadingControlType = WSCT_OffNight_OnDay_HiSolarWindow; + WindowShadingControl(2).ShadingControlType = WindowShadingControlType::OffNight_OnDay_HiSolarWindow; EXPECT_FALSE(isWindowShadingControlSimilar(1, 2)); WindowShadingControl(2) = WindowShadingControl(1); @@ -3601,9 +3601,9 @@ TEST_F(EnergyPlusFixture, SurfaceGeometry_CheckWindowShadingControlSimilarForWin WindowShadingControl(1).Name = "TheShadingControl"; WindowShadingControl(1).ZoneIndex = 57; WindowShadingControl(1).SequenceNumber = 3; - WindowShadingControl(1).ShadingType = WSC_ST_ExteriorShade; + WindowShadingControl(1).ShadingType = WinShadingType::ExtShade; WindowShadingControl(1).ShadingDevice = 17; - WindowShadingControl(1).ShadingControlType = WSCT_OnIfScheduled; + WindowShadingControl(1).ShadingControlType = WindowShadingControlType::OnIfScheduled; WindowShadingControl(1).Schedule = 83; WindowShadingControl(1).SetPoint = 200; WindowShadingControl(1).SetPoint2 = 170; diff --git a/tst/EnergyPlus/unit/UnitaryHybridAirConditioner.unit.cc b/tst/EnergyPlus/unit/UnitaryHybridAirConditioner.unit.cc index 5229061e46f..f4436f2393b 100644 --- a/tst/EnergyPlus/unit/UnitaryHybridAirConditioner.unit.cc +++ b/tst/EnergyPlus/unit/UnitaryHybridAirConditioner.unit.cc @@ -404,19 +404,10 @@ TEST_F(EnergyPlusFixture, Test_UnitaryHybridAirConditioner_Unittest) EXPECT_FALSE(ErrorsFound); // expect no errors DataZoneEquipment::GetZoneEquipmentData(*state); // read zone equipment SystemReports::ReportMaxVentilationLoads(); state->dataZoneEquip->ZoneEquipInputsFilled = true; - state->dataSysRpts->ZoneOAMassFlow.allocate(state->dataGlobal->NumOfZones); - state->dataSysRpts->ZoneOAMass.allocate(state->dataGlobal->NumOfZones); - state->dataSysRpts->ZoneOAVolFlowStdRho.allocate(state->dataGlobal->NumOfZones); - state->dataSysRpts->ZoneOAVolFlowCrntRho.allocate(state->dataGlobal->NumOfZones); - state->dataSysRpts->ZoneOAVolStdRho.allocate(state->dataGlobal->NumOfZones); - state->dataSysRpts->ZoneOAVolCrntRho.allocate(state->dataGlobal->NumOfZones); - state->dataSysRpts->ZoneMechACH.allocate(state->dataGlobal->NumOfZones); + DataHeatBalance::ZnAirRpt.allocate(state->dataGlobal->NumOfZones); MAT.allocate(state->dataGlobal->NumOfZones); ZoneAirHumRatAvg.allocate(state->dataGlobal->NumOfZones); - state->dataSysRpts->MaxHeatingLoadMetByVent.allocate(state->dataGlobal->NumOfZones); - state->dataSysRpts->MaxOverheatingByVent.allocate(state->dataGlobal->NumOfZones); - state->dataSysRpts->MaxCoolingLoadMetByVent.allocate(state->dataGlobal->NumOfZones); - state->dataSysRpts->MaxOvercoolingByVent.allocate(state->dataGlobal->NumOfZones); + SystemReports::AllocateAndSetUpVentReports(*state); state->dataZoneEnergyDemand->ZoneSysEnergyDemand(1).TotalOutputRequired = 58469.99445; state->dataZoneEnergyDemand->DeadBandOrSetback(1) = false; state->dataZoneEquip->ZoneEquipList(state->dataZoneEquip->ZoneEquipConfig(1).EquipListIndex).EquipIndex(1) = 1; diff --git a/tst/EnergyPlus/unit/ZoneEquipmentManager.unit.cc b/tst/EnergyPlus/unit/ZoneEquipmentManager.unit.cc index 2f75ac247ee..8803c15a28b 100644 --- a/tst/EnergyPlus/unit/ZoneEquipmentManager.unit.cc +++ b/tst/EnergyPlus/unit/ZoneEquipmentManager.unit.cc @@ -2924,7 +2924,7 @@ TEST_F(EnergyPlusFixture, ZoneEquipmentManager_ZoneMassBalance_wAdjustInfiltrati std::string const idf_objects = delimited_string({ "ZoneAirMassFlowConservation,", - " Yes, !- Adjust Zone Mixing For Zone Air Mass Flow Balance", + " AdjustMixingOnly, !- Adjust Zone Mixing and Return For Air Mass Flow Balance", " AdjustInfiltrationFlow, !- Infiltration Balancing Method", " AllZones; !- Infiltration Balancing Zones", @@ -3045,7 +3045,7 @@ TEST_F(EnergyPlusFixture, ZoneEquipmentManager_ZoneMassBalance_wAdjustInfiltrati "Fraction,", "1.0;", - }); + }); ASSERT_TRUE(process_idf(idf_objects)); EXPECT_FALSE(has_err_output()); @@ -3062,7 +3062,7 @@ TEST_F(EnergyPlusFixture, ZoneEquipmentManager_ZoneMassBalance_wAdjustInfiltrati GetProjectControlData(*state, ErrorsFound); EXPECT_FALSE(ErrorsFound); EXPECT_TRUE(DataHeatBalance::ZoneAirMassFlow.EnforceZoneMassBalance); - EXPECT_TRUE(DataHeatBalance::ZoneAirMassFlow.BalanceMixing); + EXPECT_EQ(DataHeatBalance::ZoneAirMassFlow.ZoneFlowAdjustment, DataHeatBalance::AdjustMixingOnly); EXPECT_EQ(DataHeatBalance::ZoneAirMassFlow.InfiltrationTreatment, DataHeatBalance::AdjustInfiltrationFlow); EXPECT_EQ(DataHeatBalance::ZoneAirMassFlow.InfiltrationZoneType, DataHeatBalance::AllZones); GetSimpleAirModelInputs(*state, ErrorsFound); @@ -3162,3 +3162,795 @@ TEST_F(EnergyPlusFixture, ZoneEquipmentManager_ZoneMassBalance_wAdjustInfiltrati EXPECT_EQ(DataHeatBalance::MassConservation(2).MixingMassFlowRate, 2.0); // receiving zone mixing mass flow rate EXPECT_EQ(DataHeatBalance::MassConservation(2).InfiltrationMassFlowRate, 0.0); // zone infiltration mass flow rate } + +TEST_F(EnergyPlusFixture, ZoneAirMassFlowBalance_wAdjustReturnOnly) +{ + + std::string const idf_objects = delimited_string({ + + "ZoneAirMassFlowConservation,", + " AdjustReturnOnly, !- Adjust Zone Mixing and Return For Air Mass Flow Balance", + " AdjustInfiltrationFlow, !- Infiltration Balancing Method", + " AllZones; !- Infiltration Balancing Zones", + + "Zone,", + " SZone; !- Name", + + "Zone,", + " RZone; !- Name", + + "ZoneHVAC:EquipmentConnections,", + " SZone, !- Zone Name", + " SZone Equipment, !- Zone Conditioning Equipment List Name", + " SZone In Node, !- Zone Air Inlet Node or NodeList Name", + " SZone Exh Nodes, !- Zone Air Exhaust Node or NodeList Name", + " SZone Node, !- Zone Air Node Name", + " SZone Ret Node; !- Zone Return Air Node Name", + + "ZoneHVAC:EquipmentConnections,", + " RZone, !- Zone Name", + " RZone Equipment, !- Zone Conditioning Equipment List Name", + " RZone In Node, !- Zone Air Inlet Node or NodeList Name", + " RZone Exh Nodes, !- Zone Air Exhaust Node or NodeList Name", + " RZone Node, !- Zone Air Node Name", + " RZone Ret Node; !- Zone Return Air Node Name", + + "ZoneHVAC:EquipmentList,", + " SZone Equipment, !- Name", + " SequentialLoad, !- Load Distribution Scheme", + " Fan:ZoneExhaust, !- Zone Equipment 1 Object Type", + " SZone ExhaustFan, !- 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", + " ; !- Zone Equipment 1 Sequential Heating or No-Load Fraction", + + "ZoneHVAC:EquipmentList,", + " RZone Equipment, !- Name", + " SequentialLoad, !- Load Distribution Scheme", + " Fan:ZoneExhaust, !- Zone Equipment 1 Object Type", + " RZone ExhaustFan, !- 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", + " ; !- Zone Equipment 1 Sequential Heating or No-Load Fraction", + + "Fan:ZoneExhaust,", + " SZone ExhaustFan, !- Name", + " , !- Availability Schedule Name", + " 0.30, !- Fan Total Efficiency", + " 0.0, !- Pressure Rise{Pa}", + " 0.0, !- Maximum Flow Rate{m3/s}", + " SZoneExhaustFan Inlet Node, !- Air Inlet Node Name", + " SZoneExhaustFan Outlet Node, !- Air Outlet Node Name", + " Zones Exhaust Fans; !- End - Use Subcategory", + + "Fan:ZoneExhaust,", + " RZone ExhaustFan, !- Name", + " , !- Availability Schedule Name", + " 0.30, !- Fan Total Efficiency", + " 100.0, !- Pressure Rise{Pa}", + " 0.0, !- Maximum Flow Rate{m3/s}", + " RZoneExhaustFan Inlet Node, !- Air Inlet Node Name", + " RZoneExhaustFan Outlet Node, !- Air Outlet Node Name", + " Zones Exhaust Fans; !- End - Use Subcategory", + + "NodeList,", + " SZone Exh Nodes, !- Name", + " SZone ZoneHVAC Exh Node, !- Node 1 Name", + " SZoneExhaustFan Inlet Node; !- Node 1 Name", + + "NodeList,", + " RZone Exh Nodes, !- Name", + " RZone ZoneHVAC Exh Node, !- Node 1 Name", + " RZoneExhaustFan Inlet Node; !- Node 1 Name", + + "ZoneMixing,", + " RZone ZoneMixing, !- Name", + " RZone, !- Zone Name", + " AlwaysOn, !- Schedule Name", + " Flow/Zone, !- Design Flow Rate Calculation Method", + " 0.5, !- Design Flow Rate{m3/s}", + " , !- Flow Rate per Zone Floor Area{m3/s-m2}", + " , !- Flow Rate per Person{m3/s-person}", + " , !- Air Changes per Hour{1/hr}", + " SZone, !- Source Zone Name", + " 0.0; !- Delta Temperature{deltaC}", + + "ZoneInfiltration:DesignFlowRate,", + " SZone Infiltration, !- Name", + " SZone, !- Zone or ZoneList Name", + " AlwaysOn, !- Schedule Name", + " flow/zone, !- Design Flow Rate Calculation Method", + " 0.05, !- Design Flow Rate{ m3 / s }", + " , !- Flow per Zone Floor Area{ m3 / s - m2 }", + " , !- Flow per Exterior Surface Area{ m3 / s - m2 }", + " , !- Air Changes per Hour{ 1 / hr }", + " 1, !- Constant Term Coefficient", + " 0, !- Temperature Term Coefficient", + " 0, !- Velocity Term Coefficient", + " 0; !- Velocity Squared Term Coefficient", + + "ZoneInfiltration:DesignFlowRate,", + " RZone Infiltration, !- Name", + " RZone, !- Zone or ZoneList Name", + " AlwaysOn, !- Schedule Name", + " flow/zone, !- Design Flow Rate Calculation Method", + " 0.05, !- Design Flow Rate{ m3 / s }", + " , !- Flow per Zone Floor Area{ m3 / s - m2 }", + " , !- Flow per Exterior Surface Area{ m3 / s - m2 }", + " , !- Air Changes per Hour{ 1 / hr }", + " 1, !- Constant Term Coefficient", + " 0, !- Temperature Term Coefficient", + " 0, !- Velocity Term Coefficient", + " 0; !- Velocity Squared Term Coefficient", + + "Schedule:Constant,", + "AlwaysOn,", + "Fraction,", + "1.0;", + + }); + + ASSERT_TRUE(process_idf(idf_objects)); + + int ZoneNum; + int NodeNum; + bool ErrorsFound = false; + ScheduleManager::ProcessScheduleInput(*state); + GetZoneData(*state, ErrorsFound); + AllocateHeatBalArrays(*state); + GetZoneEquipmentData(*state); + state->dataZoneEquip->ZoneEquipInputsFilled = true; + ErrorsFound = false; + GetProjectControlData(*state, ErrorsFound); + EXPECT_FALSE(ErrorsFound); + EXPECT_TRUE(DataHeatBalance::ZoneAirMassFlow.EnforceZoneMassBalance); + EXPECT_EQ(DataHeatBalance::ZoneAirMassFlow.ZoneFlowAdjustment, DataHeatBalance::AdjustReturnOnly); + EXPECT_EQ(DataHeatBalance::ZoneAirMassFlow.InfiltrationTreatment, DataHeatBalance::AdjustInfiltrationFlow); + EXPECT_EQ(DataHeatBalance::ZoneAirMassFlow.InfiltrationZoneType, DataHeatBalance::AllZones); + GetSimpleAirModelInputs(*state, ErrorsFound); + SetZoneMassConservationFlag(); + ScheduleManager::Schedule(1).CurrentValue = 1.0; + DataHeatBalance::AirFlowFlag = 1; + // set zone conditions + state->dataEnvrn->StdRhoAir = 1.2; + state->dataEnvrn->OutBaroPress = 101325.0; + Node(state->dataZoneEquip->ZoneEquipConfig(1).ZoneNode).Temp = 20.0; + Node(state->dataZoneEquip->ZoneEquipConfig(1).ZoneNode).HumRat = 0.004; + Node(state->dataZoneEquip->ZoneEquipConfig(2).ZoneNode).Temp = 20.0; + Node(state->dataZoneEquip->ZoneEquipConfig(2).ZoneNode).HumRat = 0.004; + + // set number of airloops + DataHVACGlobals::NumPrimaryAirSys = 2; + state->dataAirSystemsData->PrimaryAirSystems.allocate(DataHVACGlobals::NumPrimaryAirSys); + state->dataAirLoop->AirLoopFlow.allocate(DataHVACGlobals::NumPrimaryAirSys); + // set airloops design supply air flow rate to 1.0 + state->dataAirLoop->AirLoopFlow(1).DesSupply = 1.0; + state->dataAirLoop->AirLoopFlow(2).DesSupply = 1.0; + // set airloop numbers + state->dataZoneEquip->ZoneEquipConfig(1).ReturnNodeAirLoopNum(1) = 1; + state->dataZoneEquip->ZoneEquipConfig(2).ReturnNodeAirLoopNum(1) = 2; + ; + ; + // Test 1: set receiving zone exhaust fan flow to supply air flow rate + // set source zone (RZone) exhaust fan flow to zero + // set supply air flow rates for source (SZone) and receiving (RZone) zones + for (ZoneNum = 1; ZoneNum <= state->dataGlobal->NumOfZones; ++ZoneNum) { + for (NodeNum = 1; NodeNum <= state->dataZoneEquip->ZoneEquipConfig(ZoneNum).NumInletNodes; ++NodeNum) { + Node(state->dataZoneEquip->ZoneEquipConfig(ZoneNum).InletNode(NodeNum)).MassFlowRate = 1.0; + } + } + // set exhaust nodes to zero and exhaust fan node flow to zero for source zone + Node(state->dataZoneEquip->ZoneEquipConfig(1).ExhaustNode(1)).MassFlowRate = 0.0; + Node(state->dataZoneEquip->ZoneEquipConfig(1).ExhaustNode(2)).MassFlowRate = 0.0; + // set zone exhaust nodes to zero and exhaust fan node flow to 1.0 for receiving zone + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(1)).MassFlowRate = 0.0; + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(2)).MassFlowRate = 1.0; + ; + InitAirHeatBalance(*state); + CalcAirFlowSimple(*state); + CalcZoneMassBalance(*state, false); + EXPECT_FALSE(has_err_output()); + // SZone, source zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(1).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).ExhMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).RetMassFlowRate, 0.413368, 0.000001); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).MixingSourceMassFlowRate, 0.586632, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(1).MixingMassFlowRate, 0.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).InfiltrationMassFlowRate, 0.0); + // RZone, receiving zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(2).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(2).ExhMassFlowRate, 1.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).RetMassFlowRate, 0.586632, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(2).MixingSourceMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).MixingMassFlowRate, 0.586632, 0.000001); + // zone mixing object is defined in the receiving zone and the flow is not adjusted + EXPECT_NEAR(DataHeatBalFanSys::MixingMassFlowZone(2), 0.586632, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(2).InfiltrationMassFlowRate, 0.0); + ; + ; + // Test 2: set receiving zone exhaust fan flow 2 times supply flow rate + // set source zone exhaust fan flow to zero and receiving zone exhaust fan flow to 2.0 + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(1)).MassFlowRate = 0.0; + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(2)).MassFlowRate = 2.0; + + CalcAirFlowSimple(*state); + CalcZoneMassBalance(*state, false); + EXPECT_FALSE(has_err_output()); + // SZone, source zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(1).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).ExhMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).RetMassFlowRate, 0.413368, 0.000001); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).MixingSourceMassFlowRate, 0.586632, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(1).MixingMassFlowRate, 0.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).InfiltrationMassFlowRate, 0.0); + // RZone, receiving zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(2).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(2).ExhMassFlowRate, 2.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).RetMassFlowRate, 0.0, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(2).MixingSourceMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).MixingMassFlowRate, 0.586632, 0.000001); + // zone mixing object is defined in the receiving zone and the flow is not adjusted + EXPECT_NEAR(DataHeatBalFanSys::MixingMassFlowZone(2), 0.586632, 0.000001); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).InfiltrationMassFlowRate, 0.413368, 0.000001); + ; + ; + // Test 3: set receiving zone exhaust fan flow 3 times supply flow rate + // set source zone exhaust fan flow to zero and receiving zone exhaust fan flow to 3.0 + // double zone mixing flow rate to trigger infiltration air flow in the source zone + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(1)).MassFlowRate = 0.0; + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(2)).MassFlowRate = 3.0; + DataHeatBalance::Mixing(1).DesiredAirFlowRate = 1.0; + DataHeatBalance::Mixing(1).DesiredAirFlowRateSaved = 1.0; + ; + CalcAirFlowSimple(*state); + CalcZoneMassBalance(*state, false); + EXPECT_FALSE(has_err_output()); + // SZone, source zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(1).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).ExhMassFlowRate, 0.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).RetMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).MixingSourceMassFlowRate, 1.173265, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(1).MixingMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).InfiltrationMassFlowRate, 0.173265, 0.000001); + // RZone, receiving zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(2).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(2).ExhMassFlowRate, 3.0); + EXPECT_EQ(DataHeatBalance::MassConservation(2).RetMassFlowRate, 0.0); + EXPECT_EQ(DataHeatBalance::MassConservation(2).MixingSourceMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).MixingMassFlowRate, 1.173265, 0.000001); + // zone mixing object is defined in the receiving zone and the flow is not adjusted + EXPECT_NEAR(DataHeatBalFanSys::MixingMassFlowZone(2), 1.173265, 0.000001); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).InfiltrationMassFlowRate, 0.826735, 0.000001); +} + +TEST_F(EnergyPlusFixture, ZoneAirMassFlowBalance_wAdjustReturnThenMixing) +{ + + std::string const idf_objects = delimited_string({ + + "ZoneAirMassFlowConservation,", + " AdjustReturnThenMixing, !- Adjust Zone Mixing and Return For Air Mass Flow Balance", + " AdjustInfiltrationFlow, !- Infiltration Balancing Method", + " AllZones; !- Infiltration Balancing Zones", + + "Zone,", + " SZone; !- Name", + + "Zone,", + " RZone; !- Name", + + "ZoneHVAC:EquipmentConnections,", + " SZone, !- Zone Name", + " SZone Equipment, !- Zone Conditioning Equipment List Name", + " SZone In Node, !- Zone Air Inlet Node or NodeList Name", + " SZone Exh Nodes, !- Zone Air Exhaust Node or NodeList Name", + " SZone Node, !- Zone Air Node Name", + " SZone Ret Node; !- Zone Return Air Node Name", + + "ZoneHVAC:EquipmentConnections,", + " RZone, !- Zone Name", + " RZone Equipment, !- Zone Conditioning Equipment List Name", + " RZone In Node, !- Zone Air Inlet Node or NodeList Name", + " RZone Exh Nodes, !- Zone Air Exhaust Node or NodeList Name", + " RZone Node, !- Zone Air Node Name", + " RZone Ret Node; !- Zone Return Air Node Name", + + "ZoneHVAC:EquipmentList,", + " SZone Equipment, !- Name", + " SequentialLoad, !- Load Distribution Scheme", + " Fan:ZoneExhaust, !- Zone Equipment 1 Object Type", + " SZone ExhaustFan, !- 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", + " ; !- Zone Equipment 1 Sequential Heating or No-Load Fraction", + + "ZoneHVAC:EquipmentList,", + " RZone Equipment, !- Name", + " SequentialLoad, !- Load Distribution Scheme", + " Fan:ZoneExhaust, !- Zone Equipment 1 Object Type", + " RZone ExhaustFan, !- 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", + " ; !- Zone Equipment 1 Sequential Heating or No-Load Fraction", + + "Fan:ZoneExhaust,", + " SZone ExhaustFan, !- Name", + " , !- Availability Schedule Name", + " 0.30, !- Fan Total Efficiency", + " 0.0, !- Pressure Rise{Pa}", + " 0.0, !- Maximum Flow Rate{m3/s}", + " SZoneExhaustFan Inlet Node, !- Air Inlet Node Name", + " SZoneExhaustFan Outlet Node, !- Air Outlet Node Name", + " Zones Exhaust Fans; !- End - Use Subcategory", + + "Fan:ZoneExhaust,", + " RZone ExhaustFan, !- Name", + " , !- Availability Schedule Name", + " 0.30, !- Fan Total Efficiency", + " 100.0, !- Pressure Rise{Pa}", + " 0.0, !- Maximum Flow Rate{m3/s}", + " RZoneExhaustFan Inlet Node, !- Air Inlet Node Name", + " RZoneExhaustFan Outlet Node, !- Air Outlet Node Name", + " Zones Exhaust Fans; !- End - Use Subcategory", + + "NodeList,", + " SZone Exh Nodes, !- Name", + " SZone ZoneHVAC Exh Node, !- Node 1 Name", + " SZoneExhaustFan Inlet Node; !- Node 1 Name", + + "NodeList,", + " RZone Exh Nodes, !- Name", + " RZone ZoneHVAC Exh Node, !- Node 1 Name", + " RZoneExhaustFan Inlet Node; !- Node 1 Name", + + "ZoneMixing,", + " RZone ZoneMixing, !- Name", + " RZone, !- Zone Name", + " AlwaysOn, !- Schedule Name", + " Flow/Zone, !- Design Flow Rate Calculation Method", + " 0.5, !- Design Flow Rate{m3/s}", + " , !- Flow Rate per Zone Floor Area{m3/s-m2}", + " , !- Flow Rate per Person{m3/s-person}", + " , !- Air Changes per Hour{1/hr}", + " SZone, !- Source Zone Name", + " 0.0; !- Delta Temperature{deltaC}", + + "ZoneInfiltration:DesignFlowRate,", + " SZone Infiltration, !- Name", + " SZone, !- Zone or ZoneList Name", + " AlwaysOn, !- Schedule Name", + " flow/zone, !- Design Flow Rate Calculation Method", + " 0.05, !- Design Flow Rate{ m3 / s }", + " , !- Flow per Zone Floor Area{ m3 / s - m2 }", + " , !- Flow per Exterior Surface Area{ m3 / s - m2 }", + " , !- Air Changes per Hour{ 1 / hr }", + " 1, !- Constant Term Coefficient", + " 0, !- Temperature Term Coefficient", + " 0, !- Velocity Term Coefficient", + " 0; !- Velocity Squared Term Coefficient", + + "ZoneInfiltration:DesignFlowRate,", + " RZone Infiltration, !- Name", + " RZone, !- Zone or ZoneList Name", + " AlwaysOn, !- Schedule Name", + " flow/zone, !- Design Flow Rate Calculation Method", + " 0.05, !- Design Flow Rate{ m3 / s }", + " , !- Flow per Zone Floor Area{ m3 / s - m2 }", + " , !- Flow per Exterior Surface Area{ m3 / s - m2 }", + " , !- Air Changes per Hour{ 1 / hr }", + " 1, !- Constant Term Coefficient", + " 0, !- Temperature Term Coefficient", + " 0, !- Velocity Term Coefficient", + " 0; !- Velocity Squared Term Coefficient", + + "Schedule:Constant,", + "AlwaysOn,", + "Fraction,", + "1.0;", + + }); + + ASSERT_TRUE(process_idf(idf_objects)); + + int ZoneNum; + int NodeNum; + bool ErrorsFound = false; + ScheduleManager::ProcessScheduleInput(*state); + GetZoneData(*state, ErrorsFound); + AllocateHeatBalArrays(*state); + GetZoneEquipmentData(*state); + state->dataZoneEquip->ZoneEquipInputsFilled = true; + ErrorsFound = false; + GetProjectControlData(*state, ErrorsFound); + EXPECT_FALSE(ErrorsFound); + EXPECT_TRUE(DataHeatBalance::ZoneAirMassFlow.EnforceZoneMassBalance); + EXPECT_EQ(DataHeatBalance::ZoneAirMassFlow.ZoneFlowAdjustment, DataHeatBalance::AdjustReturnThenMixing); + EXPECT_EQ(DataHeatBalance::ZoneAirMassFlow.InfiltrationTreatment, DataHeatBalance::AdjustInfiltrationFlow); + EXPECT_EQ(DataHeatBalance::ZoneAirMassFlow.InfiltrationZoneType, DataHeatBalance::AllZones); + GetSimpleAirModelInputs(*state, ErrorsFound); + SetZoneMassConservationFlag(); + ScheduleManager::Schedule(1).CurrentValue = 1.0; + DataHeatBalance::AirFlowFlag = 1; + // set zone conditions + state->dataEnvrn->StdRhoAir = 1.2; + state->dataEnvrn->OutBaroPress = 101325.0; + Node(state->dataZoneEquip->ZoneEquipConfig(1).ZoneNode).Temp = 20.0; + Node(state->dataZoneEquip->ZoneEquipConfig(1).ZoneNode).HumRat = 0.004; + Node(state->dataZoneEquip->ZoneEquipConfig(2).ZoneNode).Temp = 20.0; + Node(state->dataZoneEquip->ZoneEquipConfig(2).ZoneNode).HumRat = 0.004; + + // set number of airloops + DataHVACGlobals::NumPrimaryAirSys = 2; + state->dataAirSystemsData->PrimaryAirSystems.allocate(DataHVACGlobals::NumPrimaryAirSys); + state->dataAirLoop->AirLoopFlow.allocate(DataHVACGlobals::NumPrimaryAirSys); + // set airloops design supply air flow rate to 1.0 + state->dataAirLoop->AirLoopFlow(1).DesSupply = 1.0; + state->dataAirLoop->AirLoopFlow(2).DesSupply = 1.0; + // set airloop numbers + state->dataZoneEquip->ZoneEquipConfig(1).ReturnNodeAirLoopNum(1) = 1; + state->dataZoneEquip->ZoneEquipConfig(2).ReturnNodeAirLoopNum(1) = 2; + ; + ; + // Test 1: set receiving zone exhaust fan flow to supply air flow rate + // set source zone (RZone) exhaust fan flow to zero + // set supply air flow rates for source (SZone) and receiving (RZone) zones + for (ZoneNum = 1; ZoneNum <= state->dataGlobal->NumOfZones; ++ZoneNum) { + for (NodeNum = 1; NodeNum <= state->dataZoneEquip->ZoneEquipConfig(ZoneNum).NumInletNodes; ++NodeNum) { + Node(state->dataZoneEquip->ZoneEquipConfig(ZoneNum).InletNode(NodeNum)).MassFlowRate = 1.0; + } + } + // set exhaust nodes to zero and exhaust fan node flow to zero for source zone + Node(state->dataZoneEquip->ZoneEquipConfig(1).ExhaustNode(1)).MassFlowRate = 0.0; + Node(state->dataZoneEquip->ZoneEquipConfig(1).ExhaustNode(2)).MassFlowRate = 0.0; + // set zone exhaust nodes to zero and exhaust fan node flow to 1.0 for receiving zone + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(1)).MassFlowRate = 0.0; + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(2)).MassFlowRate = 1.0; + ; + InitAirHeatBalance(*state); + CalcAirFlowSimple(*state); + CalcZoneMassBalance(*state, false); + CalcAirFlowSimple(*state, 0, true, true); + EXPECT_FALSE(has_err_output()); + // SZone, source zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(1).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).ExhMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).RetMassFlowRate, 0.413368, 0.000001); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).MixingSourceMassFlowRate, 0.586632, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(1).MixingMassFlowRate, 0.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).InfiltrationMassFlowRate, 0.0); + // RZone, receiving zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(2).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(2).ExhMassFlowRate, 1.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).RetMassFlowRate, 0.586632, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(2).MixingSourceMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).MixingMassFlowRate, 0.586632, 0.000001); + // zone mixing object is defined in the receiving zone and the flow is not adjusted + EXPECT_NEAR(DataHeatBalFanSys::MixingMassFlowZone(2), 0.586632, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(2).InfiltrationMassFlowRate, 0.0); + ; + ; + // Test 2: set receiving zone exhaust fan flow 2 times supply flow rate + // set source zone exhaust fan flow to zero and receiving zone exhaust fan flow to 2.0 + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(1)).MassFlowRate = 0.0; + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(2)).MassFlowRate = 2.0; + + CalcAirFlowSimple(*state); + CalcZoneMassBalance(*state, false); + CalcAirFlowSimple(*state, 0, true, true); + EXPECT_FALSE(has_err_output()); + // SZone, source zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(1).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).ExhMassFlowRate, 0.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).RetMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).MixingSourceMassFlowRate, 1.0, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(1).MixingMassFlowRate, 0.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).InfiltrationMassFlowRate, 0.0); + // RZone, receiving zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(2).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(2).ExhMassFlowRate, 2.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).RetMassFlowRate, 0.0, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(2).MixingSourceMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).MixingMassFlowRate, 1.0, 0.000001); + // zone mixing object flow is modified + EXPECT_NEAR(DataHeatBalFanSys::MixingMassFlowZone(2), 1.0, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(2).InfiltrationMassFlowRate, 0.0); + ; + ; + // Test 3: set receiving zone exhaust fan flow 3 times supply flow rate + // set source zone exhaust fan flow to zero and receiving zone exhaust fan flow to 3.0 + // double zone mixing flow rate to trigger infiltration air flow in the source zone + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(1)).MassFlowRate = 0.0; + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(2)).MassFlowRate = 3.0; + DataHeatBalance::Mixing(1).DesiredAirFlowRate = 1.0; + DataHeatBalance::Mixing(1).DesiredAirFlowRateSaved = 1.0; + ; + CalcAirFlowSimple(*state); + CalcZoneMassBalance(*state, false); + CalcAirFlowSimple(*state, 0, true, true); + EXPECT_FALSE(has_err_output()); + // SZone, source zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(1).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).ExhMassFlowRate, 0.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).RetMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).MixingSourceMassFlowRate, 2.0, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(1).MixingMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).InfiltrationMassFlowRate, 1.0, 0.000001); + // RZone, receiving zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(2).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(2).ExhMassFlowRate, 3.0); + EXPECT_EQ(DataHeatBalance::MassConservation(2).RetMassFlowRate, 0.0); + EXPECT_EQ(DataHeatBalance::MassConservation(2).MixingSourceMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).MixingMassFlowRate, 2.0, 0.000001); + // zone mixing object flow is modified + EXPECT_NEAR(DataHeatBalFanSys::MixingMassFlowZone(2), 2.0, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(2).InfiltrationMassFlowRate, 0.0); +} + +TEST_F(EnergyPlusFixture, ZoneAirMassFlowBalance_wAdjustMixingThenReturn) +{ + + std::string const idf_objects = delimited_string({ + + "ZoneAirMassFlowConservation,", + " AdjustMixingThenReturn, !- Adjust Zone Mixing and Return For Air Mass Flow Balance", + " AdjustInfiltrationFlow, !- Infiltration Balancing Method", + " AllZones; !- Infiltration Balancing Zones", + + "Zone,", + " SZone; !- Name", + + "Zone,", + " RZone; !- Name", + + "ZoneHVAC:EquipmentConnections,", + " SZone, !- Zone Name", + " SZone Equipment, !- Zone Conditioning Equipment List Name", + " SZone In Node, !- Zone Air Inlet Node or NodeList Name", + " SZone Exh Nodes, !- Zone Air Exhaust Node or NodeList Name", + " SZone Node, !- Zone Air Node Name", + " SZone Ret Node; !- Zone Return Air Node Name", + + "ZoneHVAC:EquipmentConnections,", + " RZone, !- Zone Name", + " RZone Equipment, !- Zone Conditioning Equipment List Name", + " RZone In Node, !- Zone Air Inlet Node or NodeList Name", + " RZone Exh Nodes, !- Zone Air Exhaust Node or NodeList Name", + " RZone Node, !- Zone Air Node Name", + " RZone Ret Node; !- Zone Return Air Node Name", + + "ZoneHVAC:EquipmentList,", + " SZone Equipment, !- Name", + " SequentialLoad, !- Load Distribution Scheme", + " Fan:ZoneExhaust, !- Zone Equipment 1 Object Type", + " SZone ExhaustFan, !- 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", + " ; !- Zone Equipment 1 Sequential Heating or No-Load Fraction", + + "ZoneHVAC:EquipmentList,", + " RZone Equipment, !- Name", + " SequentialLoad, !- Load Distribution Scheme", + " Fan:ZoneExhaust, !- Zone Equipment 1 Object Type", + " RZone ExhaustFan, !- 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", + " ; !- Zone Equipment 1 Sequential Heating or No-Load Fraction", + + "Fan:ZoneExhaust,", + " SZone ExhaustFan, !- Name", + " , !- Availability Schedule Name", + " 0.30, !- Fan Total Efficiency", + " 0.0, !- Pressure Rise{Pa}", + " 0.0, !- Maximum Flow Rate{m3/s}", + " SZoneExhaustFan Inlet Node, !- Air Inlet Node Name", + " SZoneExhaustFan Outlet Node, !- Air Outlet Node Name", + " Zones Exhaust Fans; !- End - Use Subcategory", + + "Fan:ZoneExhaust,", + " RZone ExhaustFan, !- Name", + " , !- Availability Schedule Name", + " 0.30, !- Fan Total Efficiency", + " 100.0, !- Pressure Rise{Pa}", + " 0.0, !- Maximum Flow Rate{m3/s}", + " RZoneExhaustFan Inlet Node, !- Air Inlet Node Name", + " RZoneExhaustFan Outlet Node, !- Air Outlet Node Name", + " Zones Exhaust Fans; !- End - Use Subcategory", + + "NodeList,", + " SZone Exh Nodes, !- Name", + " SZone ZoneHVAC Exh Node, !- Node 1 Name", + " SZoneExhaustFan Inlet Node; !- Node 1 Name", + + "NodeList,", + " RZone Exh Nodes, !- Name", + " RZone ZoneHVAC Exh Node, !- Node 1 Name", + " RZoneExhaustFan Inlet Node; !- Node 1 Name", + + "ZoneMixing,", + " RZone ZoneMixing, !- Name", + " RZone, !- Zone Name", + " AlwaysOn, !- Schedule Name", + " Flow/Zone, !- Design Flow Rate Calculation Method", + " 0.5, !- Design Flow Rate{m3/s}", + " , !- Flow Rate per Zone Floor Area{m3/s-m2}", + " , !- Flow Rate per Person{m3/s-person}", + " , !- Air Changes per Hour{1/hr}", + " SZone, !- Source Zone Name", + " 0.0; !- Delta Temperature{deltaC}", + + "ZoneInfiltration:DesignFlowRate,", + " SZone Infiltration, !- Name", + " SZone, !- Zone or ZoneList Name", + " AlwaysOn, !- Schedule Name", + " flow/zone, !- Design Flow Rate Calculation Method", + " 0.05, !- Design Flow Rate{ m3 / s }", + " , !- Flow per Zone Floor Area{ m3 / s - m2 }", + " , !- Flow per Exterior Surface Area{ m3 / s - m2 }", + " , !- Air Changes per Hour{ 1 / hr }", + " 1, !- Constant Term Coefficient", + " 0, !- Temperature Term Coefficient", + " 0, !- Velocity Term Coefficient", + " 0; !- Velocity Squared Term Coefficient", + + "ZoneInfiltration:DesignFlowRate,", + " RZone Infiltration, !- Name", + " RZone, !- Zone or ZoneList Name", + " AlwaysOn, !- Schedule Name", + " flow/zone, !- Design Flow Rate Calculation Method", + " 0.05, !- Design Flow Rate{ m3 / s }", + " , !- Flow per Zone Floor Area{ m3 / s - m2 }", + " , !- Flow per Exterior Surface Area{ m3 / s - m2 }", + " , !- Air Changes per Hour{ 1 / hr }", + " 1, !- Constant Term Coefficient", + " 0, !- Temperature Term Coefficient", + " 0, !- Velocity Term Coefficient", + " 0; !- Velocity Squared Term Coefficient", + + "Schedule:Constant,", + "AlwaysOn,", + "Fraction,", + "1.0;", + + }); + + ASSERT_TRUE(process_idf(idf_objects)); + + int ZoneNum; + int NodeNum; + bool ErrorsFound = false; + ScheduleManager::ProcessScheduleInput(*state); + GetZoneData(*state, ErrorsFound); + AllocateHeatBalArrays(*state); + GetZoneEquipmentData(*state); + state->dataZoneEquip->ZoneEquipInputsFilled = true; + ErrorsFound = false; + GetProjectControlData(*state, ErrorsFound); + EXPECT_FALSE(ErrorsFound); + EXPECT_TRUE(DataHeatBalance::ZoneAirMassFlow.EnforceZoneMassBalance); + EXPECT_EQ(DataHeatBalance::ZoneAirMassFlow.ZoneFlowAdjustment, DataHeatBalance::AdjustMixingThenReturn); + EXPECT_EQ(DataHeatBalance::ZoneAirMassFlow.InfiltrationTreatment, DataHeatBalance::AdjustInfiltrationFlow); + EXPECT_EQ(DataHeatBalance::ZoneAirMassFlow.InfiltrationZoneType, DataHeatBalance::AllZones); + GetSimpleAirModelInputs(*state, ErrorsFound); + SetZoneMassConservationFlag(); + ScheduleManager::Schedule(1).CurrentValue = 1.0; + DataHeatBalance::AirFlowFlag = 1; + // set zone conditions + state->dataEnvrn->StdRhoAir = 1.2; + state->dataEnvrn->OutBaroPress = 101325.0; + Node(state->dataZoneEquip->ZoneEquipConfig(1).ZoneNode).Temp = 20.0; + Node(state->dataZoneEquip->ZoneEquipConfig(1).ZoneNode).HumRat = 0.004; + Node(state->dataZoneEquip->ZoneEquipConfig(2).ZoneNode).Temp = 20.0; + Node(state->dataZoneEquip->ZoneEquipConfig(2).ZoneNode).HumRat = 0.004; + + // set number of airloops + DataHVACGlobals::NumPrimaryAirSys = 2; + state->dataAirSystemsData->PrimaryAirSystems.allocate(DataHVACGlobals::NumPrimaryAirSys); + state->dataAirLoop->AirLoopFlow.allocate(DataHVACGlobals::NumPrimaryAirSys); + // set airloops design supply air flow rate to 1.0 + state->dataAirLoop->AirLoopFlow(1).DesSupply = 1.0; + state->dataAirLoop->AirLoopFlow(2).DesSupply = 1.0; + // set airloop numbers + state->dataZoneEquip->ZoneEquipConfig(1).ReturnNodeAirLoopNum(1) = 1; + state->dataZoneEquip->ZoneEquipConfig(2).ReturnNodeAirLoopNum(1) = 2; + ; + ; + // Test 1: set receiving zone exhaust fan flow to supply air flow rate + // set source zone (RZone) exhaust fan flow to zero + // set supply air flow rates for source (SZone) and receiving (RZone) zones + for (ZoneNum = 1; ZoneNum <= state->dataGlobal->NumOfZones; ++ZoneNum) { + for (NodeNum = 1; NodeNum <= state->dataZoneEquip->ZoneEquipConfig(ZoneNum).NumInletNodes; ++NodeNum) { + Node(state->dataZoneEquip->ZoneEquipConfig(ZoneNum).InletNode(NodeNum)).MassFlowRate = 1.0; + } + } + // set exhaust nodes to zero and exhaust fan node flow to zero for source zone + Node(state->dataZoneEquip->ZoneEquipConfig(1).ExhaustNode(1)).MassFlowRate = 0.0; + Node(state->dataZoneEquip->ZoneEquipConfig(1).ExhaustNode(2)).MassFlowRate = 0.0; + // set zone exhaust nodes to zero and exhaust fan node flow to 1.0 for receiving zone + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(1)).MassFlowRate = 0.0; + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(2)).MassFlowRate = 1.0; + ; + InitAirHeatBalance(*state); + CalcAirFlowSimple(*state); + CalcZoneMassBalance(*state, false); + CalcAirFlowSimple(*state, 0, true, true); + EXPECT_FALSE(has_err_output()); + // SZone, source zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(1).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).ExhMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).RetMassFlowRate, 0.413368, 0.000001); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).MixingSourceMassFlowRate, 0.586632, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(1).MixingMassFlowRate, 0.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).InfiltrationMassFlowRate, 0.0); + // RZone, receiving zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(2).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(2).ExhMassFlowRate, 1.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).RetMassFlowRate, 0.586632, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(2).MixingSourceMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).MixingMassFlowRate, 0.586632, 0.000001); + // zone mixing object is defined in the receiving zone and the flow is not adjusted + EXPECT_NEAR(DataHeatBalFanSys::MixingMassFlowZone(2), 0.586632, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(2).InfiltrationMassFlowRate, 0.0); + ; + ; + // Test 2: set receiving zone exhaust fan flow 2 times supply flow rate + // set source zone exhaust fan flow to zero and receiving zone exhaust fan flow to 2.0 + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(1)).MassFlowRate = 0.0; + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(2)).MassFlowRate = 2.0; + + CalcAirFlowSimple(*state); + CalcZoneMassBalance(*state, false); + CalcAirFlowSimple(*state, 0, true, true); + EXPECT_FALSE(has_err_output()); + // SZone, source zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(1).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).ExhMassFlowRate, 0.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).RetMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).MixingSourceMassFlowRate, 1.0, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(1).MixingMassFlowRate, 0.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).InfiltrationMassFlowRate, 0.0); + // RZone, receiving zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(2).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(2).ExhMassFlowRate, 2.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).RetMassFlowRate, 0.0, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(2).MixingSourceMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).MixingMassFlowRate, 1.0, 0.000001); + // zone mixing object flow is modified + EXPECT_NEAR(DataHeatBalFanSys::MixingMassFlowZone(2), 1.0, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(2).InfiltrationMassFlowRate, 0.0); + ; + ; + // Test 3: set receiving zone exhaust fan flow 3 times supply flow rate + // set source zone exhaust fan flow to zero and receiving zone exhaust fan flow to 3.0 + // double zone mixing flow rate to trigger infiltration air flow in the source zone + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(1)).MassFlowRate = 0.0; + Node(state->dataZoneEquip->ZoneEquipConfig(2).ExhaustNode(2)).MassFlowRate = 3.0; + DataHeatBalance::Mixing(1).DesiredAirFlowRate = 1.0; + DataHeatBalance::Mixing(1).DesiredAirFlowRateSaved = 1.0; + ; + CalcAirFlowSimple(*state); + CalcZoneMassBalance(*state, false); + CalcAirFlowSimple(*state, 0, true, true); + EXPECT_FALSE(has_err_output()); + // SZone, source zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(1).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).ExhMassFlowRate, 0.0); + EXPECT_EQ(DataHeatBalance::MassConservation(1).RetMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).MixingSourceMassFlowRate, 2.0, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(1).MixingMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(1).InfiltrationMassFlowRate, 1.0, 0.000001); + // RZone, receiving zone mass conservation results + EXPECT_EQ(DataHeatBalance::MassConservation(2).InMassFlowRate, 1.0); + EXPECT_EQ(DataHeatBalance::MassConservation(2).ExhMassFlowRate, 3.0); + EXPECT_EQ(DataHeatBalance::MassConservation(2).RetMassFlowRate, 0.0); + EXPECT_EQ(DataHeatBalance::MassConservation(2).MixingSourceMassFlowRate, 0.0); + EXPECT_NEAR(DataHeatBalance::MassConservation(2).MixingMassFlowRate, 2.0, 0.000001); + // zone mixing object flow is modified + EXPECT_NEAR(DataHeatBalFanSys::MixingMassFlowZone(2), 2.0, 0.000001); + EXPECT_EQ(DataHeatBalance::MassConservation(2).InfiltrationMassFlowRate, 0.0); +}