diff --git a/doc/input-output-reference/src/overview/group-location-climate-weather-file-access.tex b/doc/input-output-reference/src/overview/group-location-climate-weather-file-access.tex index f0fbacf0f2b..19cc97b8942 100644 --- a/doc/input-output-reference/src/overview/group-location-climate-weather-file-access.tex +++ b/doc/input-output-reference/src/overview/group-location-climate-weather-file-access.tex @@ -309,6 +309,15 @@ \subsubsection{Inputs}\label{inputs-1-024} If the choice in the Solar Model Indicator field is ASHRAEClearSky or ZhangHuang, then this numeric field should be entered. This value represents the ``clearness'' value for the day. This value, along with the solar position as defined by the Location information and the date entered for the design day, help define the solar radiation values for each hour of the day. Clearness may range from 0.0 to 1.2, where 1.0 represents a clear sky at sea level. Values greater than 1.0 may be used for high altitude locations. Traditionally, one uses 0.0 clearness for Winter Design Days. Note that this ``sky clearness'' does not have the same meaning as output variable ``Site Daylighting Model Sky Clearness''. +\paragraph{Field: Maximum Number Warmup Days}\label{field-max-num-warm-days} + +Optional integer number of days for an upper limit on the number of warmup days when running this sizing period. This overrides the global maximum set in the Building object for this particular design day. + +\paragraph{Field: Begin Environment Reset Mode}\label{field-beg-env-reset-mode} + +Optional choice field to control if zone heat balance history terms should be reset when beginning to run this sizing period. This can reduce the number of warmup days needed to reach zone convergence. The options are \textbf{FullResetAtBeginEnvironment} or \textbf{SuppressThermalResetAtBeginEnvironment}. \textbf{FullResetAtBeginEnvironment} means that at the beginning of the design day warmup the building model's surfaces are set to 23 degrees C, which is the usual starting point for each environment. \textbf{SuppressThermalResetAtBeginEnvironment} means that at the beginning of the design day warmup the building model's surfaces are not reset and will just retain whatever thermal history results they had at the end of the previous design day. The warmup days still proceed as usual but because the initial condition is closer it needs fewer warmup days to reach convergence. This is available to reduce simulation run time when using many design days that are similiar to each other. + + IDF Examples: \begin{lstlisting} diff --git a/doc/input-output-reference/src/overview/group-simulation-parameters.tex b/doc/input-output-reference/src/overview/group-simulation-parameters.tex index eb7fb675b7e..c947e4752df 100644 --- a/doc/input-output-reference/src/overview/group-simulation-parameters.tex +++ b/doc/input-output-reference/src/overview/group-simulation-parameters.tex @@ -154,11 +154,11 @@ \subsubsection{Inputs}\label{inputs-3-034} \paragraph{Warmup Convergence}\label{warmup-convergence} -The following two fields along with the minimum and maximum number of warmup days (also in this object) define the user specified criteria for when EnergyPlus will ``converge'' at each environment (each sizing period or run period set as Yes in the \hyperref[simulationcontrol]{SimulationControl} object). EnergyPlus ``runs'' the first day of the environment (starting with a set of hard-coded initial conditions: temperatures are initialized to 23C and zone humidity ratios are initialized to the outdoor humidity ratio) until the loads/temperature convergence tolerance values are satisfied (next two fields) or until it reaches ``maximum number of warmup days''. Note that setting the convergence tolerance values too loose will cause the program to be satisfied too early and you may not get the results you expect from the actual simulation. +The following two fields along with the minimum and maximum number of warmup days (also in this object) define the user specified criteria for when EnergyPlus will ``converge'' at each environment (each sizing period or run period set as Yes in the \hyperref[simulationcontrol]{SimulationControl} object). At the beginning of a new enviroment the building model is reinitialized so that temperatures are initialized to 23C and zone humidity ratios are initialized to the outdoor humidity ratio (unless this initialization is suppressed using the input field called Begin Environment Reset Mode in the \hyperref[sizingperioddesignday]{SizingPerod:DesignDay} object). EnergyPlus repeatedly ``runs'' the first day of the environment or until it reaches ``maximum number of warmup days'' or the convergence criteria are met. Note that setting the convergence tolerance values too loose will cause the program to be satisfied too early and you may not get the results you expect from the actual simulation. However too tight of a value and the program will repeat the first day too many times leading to excessive simulation run time. \paragraph{Field: Loads Convergence Tolerance Value}\label{field-loads-convergence-tolerance-value} -This value represents the number at which the loads values must agree before ``convergence'' is reached. Loads tolerance value is a fraction of the load. +This value represents the number at which the loads values must agree before ``convergence'' is reached. Loads tolerance is the change in peak zone heating and cooling loads that are predicted from previous warmup day to the current day, in units of W. \paragraph{Field: Temperature Convergence Tolerance Value}\label{field-temperature-convergence-tolerance-value} @@ -249,9 +249,11 @@ \subsubsection{Inputs}\label{inputs-3-034} You may be able to increase the Maximum Number of Warmup Days and get convergence, but some anomalous buildings may still not converge. Simulation proceeds for x warmup days until ``convergence'' is reached (see the discussion under the Temperature Convergence Tolerance Value field in this object, just above). +The value in this field is an overall parameter for all types of environments in the simulation. The maximum nmber of warmup days can also be controlled separately for individual designgdays using the input field Maximum Number Warmup Days in the \hyperref[sizingperioddesignday]{SizingPerod:DesignDay} object. + \paragraph{Field: Minimum Number of Warmup Days}\label{field-minimum-number-of-warmup-days} -This field specifies the minimum number of ``warmup'' days before EnergyPlus will check if it has achieved convergence and can thus start simulating the particular environment (design day, annual run) in question. Research into the minimum number of warmup days indicates that 6 warmup days is generally enough on the minimum end of the spectrum to avoid false predictions of convergence and thus to produce enough temperature and flux history to start EnergyPlus simulation. This was based on a study that used the benchmark reference buildings. It also was observed that convergence performance improved when the number of warmup days increased. As a result, the default value for the minimum warmup days has been set to 6. Users should decrease this number only if they have knowledge that a specific file converges more quickly than 6 days. Users may wish to increase the value in certain situations when, based on the output variables described in the Output Details document, it is determined that EnergyPlus has not converged. While this parameter should be less than the previous parameter, a value greater than the value entered in the field ``Maximum Number of Warmup Days'' above may be used when users wish to increase warmup days more than the previous field. In this particular case, the previous field will be automatically reset to the value entered in this field and EnergyPlus will run exactly the number of warmup days specified in this field. +This field specifies the minimum number of ``warmup'' days before EnergyPlus will check if it has achieved convergence and can thus start simulating the particular environment (design day, annual run) in question. Although some older investigations indicated that 6 warmup days is generally enough on the minimum end of the spectrum, current thinking is that the convergence checks (controlled by convergence tolerance values above) can be relied on to determine a minimum number of warm days. An arbitrary high minimum can lead to excessive run times for lightweight buildings that may converge quickly and not need many warmup days. Therefore the default is reduced from 6 to just 1. A value of 6 here will replicate older behavior if field was being left blank. Users may wish to increase the value in certain situations when, based on the output variables described in the Output Details document, it is determined that EnergyPlus has not converged. While this parameter should be less than the previous maximum parameter, a value greater than the value entered in the field ``Maximum Number of Warmup Days'' above may be used when users wish to increase warmup days more than the previous field. In this particular case, the previous field will be automatically reset to the value entered in this field and EnergyPlus will run exactly the number of warmup days specified in this field. An example from an IDF: diff --git a/idd/Energy+.idd.in b/idd/Energy+.idd.in index db56b22c080..7a67fab0cd4 100644 --- a/idd/Energy+.idd.in +++ b/idd/Energy+.idd.in @@ -482,11 +482,12 @@ Building, \key Urban \default Suburbs N2 , \field Loads Convergence Tolerance Value - \note Loads Convergence Tolerance Value is a fraction of load + \note Loads Convergence Tolerance Value is a change in load from one warmup day to the next \type real \minimum> 0.0 \maximum .5 \default .04 + \units W N3 , \field Temperature Convergence Tolerance Value \units deltaC \type real @@ -511,12 +512,14 @@ Building, N5 ; \field Minimum Number of Warmup Days \note The minimum number of warmup days that produce enough temperature and flux history \note to start EnergyPlus simulation for all reference buildings was suggested to be 6. + \note However this can lead to excessive run times as warmup days can be repeated needlessly. + \note For faster execution rely on the convergence criteria to detect when warmup is complete. \note When this field is greater than the maximum warmup days defined previous field \note the maximum number of warmup days will be reset to the minimum value entered here. - \note Warmup days will be set to be the value you entered when it is less than the default 6. + \note Warmup days will be set to be the value you entered. The default is 1. \type integer \minimum> 0 - \default 6 + \default 1 ShadowCalculation, \unique-object @@ -1155,13 +1158,24 @@ SizingPeriod:DesignDay, \minimum 0 \maximum 3 \default 0 - N14; \field Sky Clearness + N14, \field Sky Clearness \note Used if Sky Model Indicator = ASHRAEClearSky or ZhangHuang \minimum 0.0 \maximum 1.2 \default 0.0 \note 0.0 is totally unclear, 1.0 is totally clear \type real + N15, \field Maximum Number Warmup Days + \note If used this design day will be run with a custom limit on the maximum number of days that are repeated for warmup. + \note Limiting the number of warmup days can improve run time. + \type integer + A13; \field Begin Environment Reset Mode + \note If used this can control if you want the thermal history to be reset at the beginning of the design day. + \note When using a series of similiar design days, this field can be used to retain warmup state from the previous design day. + \type choice + \key FullResetAtBeginEnvironment + \key SuppressAllBeginEnvironmentResets + \default FullResetAtBeginEnvironment SizingPeriod:WeatherFileDays, \memo Use a weather file period for design sizing calculations. diff --git a/src/EnergyPlus/DataGlobals.cc b/src/EnergyPlus/DataGlobals.cc index 693e0c9ffc9..21a173d8623 100644 --- a/src/EnergyPlus/DataGlobals.cc +++ b/src/EnergyPlus/DataGlobals.cc @@ -173,6 +173,7 @@ namespace DataGlobals { bool BeginDayFlag(false); // True at the start of each day, False after first time step in day bool BeginEnvrnFlag(false); // True at the start of each environment, False after first time step in environ + bool beginEnvrnWarmStartFlag(false); // Sizing Speed Up bool BeginHourFlag(false); // True at the start of each hour, False after first time step in hour bool BeginSimFlag(false); // True until any actual simulation (full or sizing) has begun, False after first time step bool BeginFullSimFlag(false); // True until full simulation has begun, False after first time step diff --git a/src/EnergyPlus/DataGlobals.hh b/src/EnergyPlus/DataGlobals.hh index 107f4107f54..83f89477aa6 100644 --- a/src/EnergyPlus/DataGlobals.hh +++ b/src/EnergyPlus/DataGlobals.hh @@ -210,6 +210,7 @@ namespace DataGlobals { extern bool BeginDayFlag; // True at the start of each day, False after first time step in day extern bool BeginEnvrnFlag; // True at the start of each environment, False after first time step in environ + extern bool beginEnvrnWarmStartFlag; // Sizing Speed Up true if at the start of each environment, would rather retain thermal history and the like. extern bool BeginHourFlag; // True at the start of each hour, False after first time step in hour extern bool BeginSimFlag; // True until any actual simulation (full or sizing) has begun, False after first time step extern bool BeginFullSimFlag; // True until full simulation has begun, False after first time step diff --git a/src/EnergyPlus/DataHeatBalance.cc b/src/EnergyPlus/DataHeatBalance.cc index 95d32c1a38f..fa554ee46ca 100644 --- a/src/EnergyPlus/DataHeatBalance.cc +++ b/src/EnergyPlus/DataHeatBalance.cc @@ -207,7 +207,7 @@ namespace DataHeatBalance { // Parameters for WarmupDays int const DefaultMaxNumberOfWarmupDays(25); // Default maximum number of warmup days allowed - int const DefaultMinNumberOfWarmupDays(6); // Default minimum number of warmup days allowed + int const DefaultMinNumberOfWarmupDays(1); // Default minimum number of warmup days allowed // Parameters for Sky Radiance Distribution int const Isotropic(0); @@ -500,7 +500,7 @@ namespace DataHeatBalance { bool AnyAirBoundaryGroupedSolar(false); // Construction:AirBoundary with GroupedZones for solar used somewhere int MaxNumberOfWarmupDays(25); // Maximum number of warmup days allowed - int MinNumberOfWarmupDays(6); // Minimum number of warmup days allowed + int MinNumberOfWarmupDays(1); // Minimum number of warmup days allowed Real64 CondFDRelaxFactor(1.0); // Relaxation factor, for looping across all the surfaces. Real64 CondFDRelaxFactorInput(1.0); // Relaxation factor, for looping across all the surfaces, user input value @@ -872,7 +872,7 @@ namespace DataHeatBalance { AnyAirBoundary = false; AnyAirBoundaryGroupedSolar = false; MaxNumberOfWarmupDays = 25; - MinNumberOfWarmupDays = 6; + MinNumberOfWarmupDays = 1; CondFDRelaxFactor = 1.0; CondFDRelaxFactorInput = 1.0; ZoneAirSolutionAlgo = Use3rdOrder; diff --git a/src/EnergyPlus/HVACSizingSimulationManager.cc b/src/EnergyPlus/HVACSizingSimulationManager.cc index 0414c1ee63d..222191249ce 100644 --- a/src/EnergyPlus/HVACSizingSimulationManager.cc +++ b/src/EnergyPlus/HVACSizingSimulationManager.cc @@ -289,6 +289,14 @@ void ManageHVACSizingSimulation(bool &ErrorsFound) DisplayString("Initializing New Environment Parameters, HVAC Sizing Simulation"); BeginEnvrnFlag = true; + if ((KindOfSim == ksHVACSizeDesignDay) && (WeatherManager::DesDayInput(Environment(Envrn).DesignDayNum).suppressBegEnvReset)) { + // user has input in SizingPeriod:DesignDay directing to skip begin environment rests, for accuracy-with-speed as zones can more + // easily converge fewer warmup days are allowed + DisplayString("Suppressing Initialization of New Environment Parameters"); + DataGlobals::beginEnvrnWarmStartFlag = true; + } else { + DataGlobals::beginEnvrnWarmStartFlag = false; + } EndEnvrnFlag = false; // EndMonthFlag = false; WarmupFlag = true; diff --git a/src/EnergyPlus/HeatBalanceManager.cc b/src/EnergyPlus/HeatBalanceManager.cc index 28e69fb8d15..b64051a00b7 100644 --- a/src/EnergyPlus/HeatBalanceManager.cc +++ b/src/EnergyPlus/HeatBalanceManager.cc @@ -861,17 +861,7 @@ namespace HeatBalanceManager { RoundSigDigits(MinNumberOfWarmupDays) + " will be used."); MaxNumberOfWarmupDays = MinNumberOfWarmupDays; } - if (MinNumberOfWarmupDays < 6) { - ShowWarningError(RoutineName + CurrentModuleObject + ": " + cNumericFieldNames(5) + - " potentially invalid. Experience has shown that most files will converge within " + - RoundSigDigits(DefaultMaxNumberOfWarmupDays) + " warmup days. "); - ShowContinueError("...Choosing less than " + RoundSigDigits(DefaultMinNumberOfWarmupDays) + - " warmup days may have adverse effects on the simulation results, particularly design day simulations. "); - ShowContinueError("...Users should only alter this default if they are certain that less than " + - RoundSigDigits(DefaultMinNumberOfWarmupDays) + " warmup days is appropriate for a particular file. "); - ShowContinueError( - "...Verify that convergence to desired results are achieved. You can report values during warmup days to ascertain convergence."); - } + } else { ShowSevereError(RoutineName + " A " + CurrentModuleObject + " Object must be entered."); ErrorsFound = true; @@ -1828,7 +1818,7 @@ namespace HeatBalanceManager { // Load the material derived type from the input data. Material(MaterNum).Name = MaterialNames(1); - + // Load data for other properties that need defaults Material(MaterNum).ROnly = true; Material(MaterNum).Resistance = 0.01; @@ -2099,11 +2089,11 @@ namespace HeatBalanceManager { ShowContinueError(cAlphaFieldNames(5) + " requires a valid table object name, entered input=" + MaterialNames(5)); } else { ErrorsFound |= CurveManager::CheckCurveDims(Material(MaterNum).GlassSpecAngTransDataPtr, // Curve index - {2}, // Valid dimensions - RoutineName, // Routine name - CurrentModuleObject, // Object Type - Material(MaterNum).Name, // Object Name - cAlphaFieldNames(5)); // Field Name + {2}, // Valid dimensions + RoutineName, // Routine name + CurrentModuleObject, // Object Type + Material(MaterNum).Name, // Object Name + cAlphaFieldNames(5)); // Field Name GetCurveMinMaxValues(Material(MaterNum).GlassSpecAngTransDataPtr, minAngValue, maxAngValue, minLamValue, maxLamValue); if (minAngValue > 1.0e-6) { @@ -2148,11 +2138,11 @@ namespace HeatBalanceManager { ShowContinueError(cAlphaFieldNames(6) + " requires a valid table object name, entered input=" + MaterialNames(6)); } else { ErrorsFound |= CurveManager::CheckCurveDims(Material(MaterNum).GlassSpecAngFRefleDataPtr, // Curve index - {2}, // Valid dimensions - RoutineName, // Routine name - CurrentModuleObject, // Object Type - Material(MaterNum).Name, // Object Name - cAlphaFieldNames(6)); // Field Name + {2}, // Valid dimensions + RoutineName, // Routine name + CurrentModuleObject, // Object Type + Material(MaterNum).Name, // Object Name + cAlphaFieldNames(6)); // Field Name GetCurveMinMaxValues(Material(MaterNum).GlassSpecAngFRefleDataPtr, minAngValue, maxAngValue, minLamValue, maxLamValue); if (minAngValue > 1.0e-6) { @@ -2197,11 +2187,11 @@ namespace HeatBalanceManager { ShowContinueError(cAlphaFieldNames(7) + " requires a valid table object name, entered input=" + MaterialNames(7)); } else { ErrorsFound |= CurveManager::CheckCurveDims(Material(MaterNum).GlassSpecAngBRefleDataPtr, // Curve index - {2}, // Valid dimensions - RoutineName, // Routine name - CurrentModuleObject, // Object Type - Material(MaterNum).Name, // Object Name - cAlphaFieldNames(7)); // Field Name + {2}, // Valid dimensions + RoutineName, // Routine name + CurrentModuleObject, // Object Type + Material(MaterNum).Name, // Object Name + cAlphaFieldNames(7)); // Field Name GetCurveMinMaxValues(Material(MaterNum).GlassSpecAngBRefleDataPtr, minAngValue, maxAngValue, minLamValue, maxLamValue); if (minAngValue > 1.0e-6) { @@ -4175,7 +4165,7 @@ namespace HeatBalanceManager { int TotWindow5Constructs; // Number of constructions from Window5 data file bool ConstructionFound; // True if input window construction name is found in the // Window5 data file - bool EOFonW5File; // True if EOF encountered reading Window5 data file + bool EOFonW5File; // True if EOF encountered reading Window5 data file int MaterialLayerGroup; // window construction layer material group index int iMatGlass; // number of glass layers @@ -5607,10 +5597,9 @@ namespace HeatBalanceManager { for (SurfNum = 1; SurfNum <= TotSurfaces; ++SurfNum) { DataSurfaces::Surface(SurfNum).MovInsulIntPresentPrevTS = DataSurfaces::Surface(SurfNum).MovInsulIntPresent; } - + // For non-complex windows, update a report variable so this shows up in the output as something other than zero UpdateWindowFaceTempsNonBSDFWin(); - } void CheckWarmupConvergence() @@ -5886,21 +5875,21 @@ namespace HeatBalanceManager { void UpdateWindowFaceTempsNonBSDFWin() { - + int SurfNum; - + for (SurfNum = 1; SurfNum <= TotSurfaces; ++SurfNum) { auto &thisSurface(DataSurfaces::Surface(SurfNum)); if (thisSurface.Class == DataSurfaces::SurfaceClass_Window) { auto &thisConstruct(thisSurface.Construction); if (!Construct(thisConstruct).WindowTypeBSDF) { FenLaySurfTempFront(1, SurfNum) = TH(1, 1, SurfNum); - FenLaySurfTempBack(Construct(thisConstruct).TotLayers,SurfNum) = TH(2, 1, SurfNum); + FenLaySurfTempBack(Construct(thisConstruct).TotLayers, SurfNum) = TH(2, 1, SurfNum); } } } } - + // End of Record Keeping subroutines for the HB Module // ***************************************************************************** @@ -7559,12 +7548,12 @@ namespace HeatBalanceManager { ShowWarningError(RoutineName + ": Construction:AirBoundary Solar and Daylighting Method=InteriorWindow is not functional."); ShowContinueError("Using GroupedZones method instead for Construction:AirBoundary = " + thisConstruct.Name + "."); thisConstruct.TypeIsAirBoundarySolar = true; - //thisConstruct.TypeIsAirBoundaryInteriorWindow = true; - //thisConstruct.TransDiff = 1.0; - //thisConstruct.TransDiffVis = 1.0; - //thisConstruct.TotGlassLayers = 0; // Yes, zero, so it doesn't calculate any glass absorbed solar - //thisConstruct.TransSolBeamCoef = 1.0; - //thisConstruct.ReflectSolDiffBack = 0.0; + // thisConstruct.TypeIsAirBoundaryInteriorWindow = true; + // thisConstruct.TransDiff = 1.0; + // thisConstruct.TransDiffVis = 1.0; + // thisConstruct.TotGlassLayers = 0; // Yes, zero, so it doesn't calculate any glass absorbed solar + // thisConstruct.TransSolBeamCoef = 1.0; + // thisConstruct.ReflectSolDiffBack = 0.0; } // Radiant Exchange Method diff --git a/src/EnergyPlus/SimulationManager.cc b/src/EnergyPlus/SimulationManager.cc index 8b483d95179..9b3b866d38f 100644 --- a/src/EnergyPlus/SimulationManager.cc +++ b/src/EnergyPlus/SimulationManager.cc @@ -497,6 +497,14 @@ namespace SimulationManager { DisplayString("Initializing New Environment Parameters"); BeginEnvrnFlag = true; + if ((KindOfSim == ksDesignDay) && (WeatherManager::DesDayInput(Environment(Envrn).DesignDayNum).suppressBegEnvReset)) { + // user has input in SizingPeriod:DesignDay directing to skip begin environment rests, for accuracy-with-speed as zones can more + // easily converge fewer warmup days are allowed + DisplayString("Design Day Fast Warmup Mode: Suppressing Initialization of New Environment Parameters"); + DataGlobals::beginEnvrnWarmStartFlag = true; + } else { + DataGlobals::beginEnvrnWarmStartFlag = false; + } EndEnvrnFlag = false; EndMonthFlag = false; WarmupFlag = true; diff --git a/src/EnergyPlus/SizingManager.cc b/src/EnergyPlus/SizingManager.cc index d5649f41293..6748b268eb0 100644 --- a/src/EnergyPlus/SizingManager.cc +++ b/src/EnergyPlus/SizingManager.cc @@ -356,6 +356,14 @@ namespace SizingManager { ++NumSizingPeriodsPerformed; BeginEnvrnFlag = true; + if ((KindOfSim == ksDesignDay) && (WeatherManager::DesDayInput(Environment(Envrn).DesignDayNum).suppressBegEnvReset)) { + // user has input in SizingPeriod:DesignDay directing to skip begin environment rests, for accuracy-with-speed as zones can + // more easily converge fewer warmup days are allowed + DisplayString("Suppressing Initialization of New Environment Parameters"); + DataGlobals::beginEnvrnWarmStartFlag = true; + } else { + DataGlobals::beginEnvrnWarmStartFlag = false; + } EndEnvrnFlag = false; EndMonthFlag = false; WarmupFlag = true; @@ -571,6 +579,14 @@ namespace SizingManager { ++NumSizingPeriodsPerformed; BeginEnvrnFlag = true; + if ((KindOfSim == ksDesignDay) && (WeatherManager::DesDayInput(Environment(Envrn).DesignDayNum).suppressBegEnvReset)) { + // user has input in SizingPeriod:DesignDay directing to skip begin environment rests, for accuracy-with-speed as zones can more + // easily converge fewer warmup days are allowed + DisplayString("Suppressing Initialization of New Environment Parameters"); + DataGlobals::beginEnvrnWarmStartFlag = true; + } else { + DataGlobals::beginEnvrnWarmStartFlag = false; + } EndEnvrnFlag = false; WarmupFlag = false; DayOfSim = 0; diff --git a/src/EnergyPlus/WeatherManager.cc b/src/EnergyPlus/WeatherManager.cc index 9b172267244..cf734ceeb2b 100644 --- a/src/EnergyPlus/WeatherManager.cc +++ b/src/EnergyPlus/WeatherManager.cc @@ -7112,6 +7112,23 @@ namespace WeatherManager { // N14; \field Sky Clearness DesDayInput(EnvrnNum).SkyClear = rNumericArgs(14); // Sky Clearness (0 to 1) + // N15, \field Maximum Warmup Days Between Sizing Periods + if (lNumericFieldBlanks(15)) { + // Default to -1 if not input + DesDayInput(EnvrnNum).maxWarmupDays = -1; + } else { + DesDayInput(EnvrnNum).maxWarmupDays = int(rNumericArgs(15)); + } + // A13, \field Begin Environment Reset Mode + if (lAlphaFieldBlanks(13)) { + DesDayInput(EnvrnNum).suppressBegEnvReset = false; + } else { + if (UtilityRoutines::SameString(cAlphaArgs(13), "FullResetAtBeginEnvironment")) { + DesDayInput(EnvrnNum).suppressBegEnvReset = false; + } else if (UtilityRoutines::SameString(cAlphaArgs(13), "SuppressThermalResetAtBeginEnvironment")) { + DesDayInput(EnvrnNum).suppressBegEnvReset = true; + } + } // A7, \field Rain Indicator if (UtilityRoutines::SameString(cAlphaArgs(7), "Yes")) { DesDayInput(EnvrnNum).RainInd = 1; diff --git a/src/EnergyPlus/WeatherManager.hh b/src/EnergyPlus/WeatherManager.hh index 2c1b2896a32..216a66c9fb9 100644 --- a/src/EnergyPlus/WeatherManager.hh +++ b/src/EnergyPlus/WeatherManager.hh @@ -362,13 +362,16 @@ namespace WeatherManager { Real64 DailyWBRange; // daily range of wetbulb (deltaC) bool PressureEntered; // true if a pressure was entered in design day data bool DewPointNeedsSet; // true if the Dewpoint humidicating value needs to be set (after location determined) + int maxWarmupDays; // Maximum warmup days between sizing periods + bool suppressBegEnvReset; // true if this design day should be run without thermal history being reset at begin environment // Default Constructor DesignDayData() : MaxDryBulb(0.0), DailyDBRange(0.0), HumIndValue(0.0), HumIndType(0), PressBarom(0.0), WindSpeed(0.0), WindDir(0.0), SkyClear(0.0), RainInd(0), SnowInd(0), DayOfMonth(0), Month(0), DayType(0), DSTIndicator(0), SolarModel(0), DBTempRangeType(0), TempRangeSchPtr(0), HumIndSchPtr(0), BeamSolarSchPtr(0), DiffuseSolarSchPtr(0), TauB(0.0), TauD(0.0), DailyWBRange(0.0), PressureEntered(false), - DewPointNeedsSet(false) + DewPointNeedsSet(false), //**Trane:BEG: Sizing Speed Up + maxWarmupDays(-1), suppressBegEnvReset(false) //**Trane:END: Sizing Speed Up { } }; diff --git a/testfiles/AirflowNetworkAdvanced_SingleSided_NV.idf b/testfiles/AirflowNetworkAdvanced_SingleSided_NV.idf index 719c71c7340..bf3ee143f71 100644 --- a/testfiles/AirflowNetworkAdvanced_SingleSided_NV.idf +++ b/testfiles/AirflowNetworkAdvanced_SingleSided_NV.idf @@ -32,7 +32,7 @@ 0.4, !- Temperature Convergence Tolerance Value {deltaC} FullInteriorAndExterior, !- Solar Distribution 25, !- Maximum Number of Warmup Days - ; !- Minimum Number of Warmup Days + 6; !- Minimum Number of Warmup Days !- =========== ALL OBJECTS IN CLASS: TIMESTEP =========== diff --git a/tst/EnergyPlus/unit/HVACVariableRefrigerantFlow.unit.cc b/tst/EnergyPlus/unit/HVACVariableRefrigerantFlow.unit.cc index ee8ca292084..bca66d264c8 100644 --- a/tst/EnergyPlus/unit/HVACVariableRefrigerantFlow.unit.cc +++ b/tst/EnergyPlus/unit/HVACVariableRefrigerantFlow.unit.cc @@ -9897,9 +9897,9 @@ TEST_F(EnergyPlusFixture, VRFFluidControl_FanSysModel_OnOffModeTest) SimVRF(VRFTUNum, FirstHVACIteration, OnOffAirFlowRatio, SysOutputProvided, LatOutputProvided, QZnReq); // check fan operation for cooling mode Real64 Result_AirMassFlowRateDesign = HVACFan::fanObjs[0]->maxAirMassFlowRate(); - EXPECT_NEAR(Result_AirMassFlowRateDesign, 0.347046, 0.000001); + EXPECT_NEAR(Result_AirMassFlowRateDesign, 0.347040, 0.000001); Real64 Result_AirMassFlowRate = DataLoopNode::Node(HVACFan::fanObjs[0]->outletNodeNum).MassFlowRate; - EXPECT_NEAR(Result_AirMassFlowRate, 0.347046, 0.000001); + EXPECT_NEAR(Result_AirMassFlowRate, 0.347040, 0.000001); Real64 Result_FanPower = HVACFan::fanObjs[0]->fanPower(); EXPECT_NEAR(Result_FanPower, 41.22, 0.001);