-
Notifications
You must be signed in to change notification settings - Fork 392
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Correct VAV maximum air flow fraction during reheat for heating dominated use cases #10763
base: develop
Are you sure you want to change the base?
Correct VAV maximum air flow fraction during reheat for heating dominated use cases #10763
Conversation
The defect file results are now:
|
Real64 heatingMaxFlow = (this->DamperHeatingAction == Action::ReverseWithLimits) | ||
? state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlowMax | ||
: state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlow; | ||
MaxAirVolFlowRateDes = max(state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesCoolVolFlow, heatingMaxFlow); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If ReverseWithLimits uses a different heating air flow rate from the zone design heating air flow rate then that flow rate should be used as the value for the VAV box heating air flow rate.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well, I was expecting DesHeatVolFlowMax to always be less than DesHeatVolFlow. For 5ZoneBoilerOutsideAirReset that's not the case. The diffs show that Zone 5 TU max air flow rate increased, I was only expecting decreases in max air flow rate for heating dominated zones. Zone cooling design air flow is greater than zone heating design air flow, but DesHeatVolFlowMax is larger than both of these.
// set the zone maximum heating supply air flow rate. This will be used for autosizing VAV terminal unit
// max heating flow rates
zsFinalSizing.DesHeatVolFlowMax = max(zsFinalSizing.DesHeatMaxAirFlow,
zsFinalSizing.DesHeatMaxAirFlow2,
max(zsFinalSizing.DesCoolVolFlow, zsFinalSizing.DesHeatVolFlow) * zsFinalSizing.DesHeatMaxAirFlowFrac);
zsFinalSizing.DesHeatMaxAirFlow2 = zsFinalSizing.DesHeatMaxAirFlowPerArea * floorArea * zoneMult;
= 0.002032 * 182.49 * 1 = 0.37082
N8 , \field Maximum Flow Fraction During Reheat
\type real
\autosizable
\default autosize
\note Used only when Reheat Coil Object Type = Coil:Heating:Water and Damper Heating Action = ReverseWithLimits
\note When autocalculating, the maximum flow fraction is set to the ratio of
\note 0.002032 m3/s-m2 (0.4 cfm/sqft) multiplied by the zone floor area and the
\note Maximum Air Flow Rate.
\note This optional field limits the maximum flow allowed in reheat mode.
\note At no time will the maximum flow rate calculated here exceed the value of
\note Maximum Air Flow Rate.
So is DesHeatVolFlowMax just an upper limit? or is it the expected heating air flow rate?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So, since DesHeatVolFlowMax looks like a limit and not a flow rate, maybe I should change this line and line 3224 to?:
Real64 heatingMaxFlow = (DesHeatVolFlowMax > DesHeatVolFlow) ? state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlow :
state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlowMax);
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Based on this discussion I changed to treat DesHeatVolFlowMax as an upper limit. This should still correct the issue and result in fewer diffs.
MaxHeatAirVolFlowRateDes = state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlowMax; | ||
} else { | ||
MaxHeatAirVolFlowRateDes = state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlow; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Below at line 3224, ReverseWithLimits uses DesHeatVolFlowMax. That value should also be used here.
3224: MaxAirVolFlowRateDuringReheatDes = state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).DesHeatVolFlowMax;
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As discussed above, these 2 areas of code, above (2937) and below (3231), were changed to use DesHeatVolFlowMax as a limit.
|
|
It turns out this does correct a reporting issue (5ZoneAutoDXVAV).
ReverseWithLimits will operate up to the zone design heating air flow unless that flow exceeds the maximum limit. In the past the maximum limit was used to calculate the maximum reheat fraction. This change only uses the maximum reheat flow rate if it actually limits the design heating air flow rate. In this case the maximum reheat fraction is 0.10362 m3/s / 0.46734 m3/s = 0.2217229 <- correct answer and 0.10362 m3/s / 99.16 m2 = 0.001049778 m3/s/m2 <- correct answer |
|
Defect file results after latest change to use DesHeatVolFlowMax as a limit, not a flow rate:
|
expectedMaxAirVolFractionDuringReheat = state->dataSize->TermUnitFinalZoneSizing(1).DesHeatVolFlowMax / thisSys.MaxAirVolFlowRate; | ||
EXPECT_EQ(expectedZoneMinAirFracDes, thisSys.ZoneMinAirFracDes); | ||
EXPECT_EQ(1.0, thisSys.MaxAirVolFractionDuringReheat); | ||
EXPECT_EQ(expectedMaxAirVolFractionDuringReheat, thisSys.MaxAirVolFractionDuringReheat); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added 3 new tests for maximum air flow fraction during reheat to this unit test.
I changed the defect file to use Damper Heating Action = Reverse and get expected results regarding the Maximum Flow Fraction during Reheat and the air flow rate used to size the heating coil.
|
I'll run that file. The reheat coil air flow should be the same as the maximum heating air flow. I don't see that in your results for 5ZoneAirCooled-ReverseWithLimits. |
I see that Space1-1 TU does seem like it sized correctly. It's heating dominated and was limited so came out to 0.20149 m3/s with a max reheat flow fraction of 1.0. TermUnitFinalZoneSizing(1).DesHeatVolFlowMax = 0.20149. That looks correct. I'll check why the reheat coil used the zone heating flow rate for sizing.
OK, the TU was using the wrong data for sizing the reheat coil.
The IDD says the max fraction during reheat should only be used for water coils. But if a different heating coil is used and the reverse with limits does limit max heating flow rate then it should apply to all coil types? Should I correct the IDD note or is there something I'm missing with this input field?
The coil now uses the correct reheat air flow rate:
And the reheat coil has changed size accordingly to meet the load. Before this fix:
After this fix:
|
…62-VAV-Reheat-shows-reheat-fraction-less-than-1
|
Checking defect file with other Damper Heating Action control types. Reverse:
Normal: So here I also see that the reheat coil uses what I think is the wrong air flow rate for sizing. TU heating flow rate should not exceed the minimum flow so why is the reheat coil sizing to the max flow?
|
@mjwitte there are a few unit tests to clean up with this last change. If you could comment on the remaining items I could finish this up. I checked the code and do not see any issue with max heating air flow rate when water heating coils are used.
I found this in the IO Ref: For heating coil types other than the hot-water coil, e.g.~electric, steam, and gas, the reverse action works the same as the normal action -- always keeping the air flow at the minimum during heating. |
Not sure. Will the code really increase flow for other coil types? The original idea was that a hot water coil is constrained by the water temperature, so once the water valve is fully open, the only way to get more heat is to increase airflow. Other coil types have higher supply temp limits, but I suppose they could operate the same way. Do they in a real system?
It should size to the max flow rate that it will actually see. But if the limit is < the zone design heating flow rate, there should be a warning that the heating capacity won't be sufficient to meet the load. The whole with limits thing is intended for systems where the cooling design flow rate is > heating design flow rate, so there's a limit on the reverse action flow for heating. When the heating supply flow rate is > cooling, imposing limits doesn't make sense. Maybe there's some discussion of this in the original NFP when limits were added? (If there is one.) It's also possible (likely) that the real system will have baseboard to reduce the amount of heating load required from the reheat coil.
|
From what I can tell, the water coil does the top figure and non-water coils operate at the max reheat air flow as in the bottom figure. I think because the other coils can't increase heating output with additional air flow. It would be nice for all coils to act the same, air flow-wise, but for now I think I'll just try to understand this better (i.e., verify this), figure out what text is needed in the doc/IDD, and maybe add a new figure to the IO Ref (e.g., Dual Max for non-water coils). |
The non-water coils do operate at the minimum air flow rate. But the heating coil sizes to the design heating air flow rate.
Where the heating coil in this branch is using 0.20149 m3/s for sizing (it was using 0.26058 before I changed it yesterday. In this figure it looks like the heating coil is sized just about right but it doesn't make sense to operate at the minimum air flow rate when Reverse or ReverseWithLimits is selected. |
TermUnitSizing(state.dataSize->CurTermUnitSizingNum).AirVolFlow = | ||
max(state.dataSize->TermUnitFinalZoneSizing(state.dataSize->CurTermUnitSizingNum).NonAirSysDesHeatVolFlow, | ||
this->MaxAirVolFlowRate * this->ZoneMinAirFracDes * this->ZoneTurndownMinAirFrac); | ||
if (this->SysType_Num == SysType::SingleDuctVAVReheat && this->DamperHeatingAction == Action::ReverseWithLimits) { | ||
TermUnitSizing(state.dataSize->CurTermUnitSizingNum).AirVolFlow = | ||
max(this->MaxAirVolFlowRateDuringReheat, this->MaxAirVolFlowRate * this->ZoneTurndownMinAirFrac); | ||
} else { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So, what if MaxAirVolFlowRateDuringReheat > NonAirSysDesHeatVolFlow
as it is for Space4-1 in 5ZoneAirCooled-ReverseWithLimits? Will this reheat coil be oversized?
And why is NonAirSysDesHeatVolFlow
being used here instead of DesHeatVolFlow
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think I'm landing on falling back on the choices. Normal should size to the minimum flow rate. If that doesn't meet the load then the Reverse or ReverseWithLimits should be used instead. That's what the docs say. And then Reverse and ReverseWithLmits use the corresponding max reheat air flow rate. But that is historically different so I'm stuck with what to do.
Regarding the size choice your right. The coil could be over or undersized. I'm not sure the developer should make that sizing choice (i.e., there's plenty of inputs to get it right). One or more of these choices should meet the load. I've also been thinking about heating coil sizing. Zone heating flow rate is SAT - Tzone. TU heating coil sizing is Tout - Tzone. So at the zone heating flow rate you meet the load and that's why NonAirSysDesHeatVolFlow is used. When using actual air flow Reverse should always meet the load, ReverseWithLimits may not. Normal may not meet the load but that's understood with a typical 0.3 minimum stop selection and depends on heating to cooling flow rate ratio. Where's the choice for the user to oversize the heating coil when it operates at a lower flow rate? There is a disconnect between TU heating air flow and heating capacity. Using NonAirSysDesHeatVolFlow to size the coil should always size the coil to meet the load but it seems odd to use a flow rate that differs from the TU and you create a coil outlet temperature that does not match the design criteria. That's when the coil sizing details don't line up with the TU flow rate for maximum flow rate during reheat but you get the right SAT. Some users notice that and question why. There was a lot of testing of these choices and things weren't lining up which created this issue. I'll look at the coil sizing details to see if the issue of TU heating flow rate versus heating coil sizing air flow shows itself. What do you think about a new input to use either the zone or TU heating flow rate? It could default to zone and not change coil capacity (Use Zone Heating Flow Rate to Size Heating Coil, Yes/No).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Regarding the reheat coil sizing, there have been many adjustments in the past to make sure that the coil is not way oversized. The airflow is one thing, but I think it uses the zone heating load in the sizing calcs (plus an offset for entering air temp). But that's just my recollection without looking at the code. So, maybe what you have a this point is ok, for ReverseWithLimits, anyway.
Pull request overview
NOTE: ENHANCEMENTS MUST FOLLOW A SUBMISSION PROCESS INCLUDING A FEATURE PROPOSAL AND DESIGN DOCUMENT PRIOR TO SUBMITTING CODE
Pull Request Author
Add to this list or remove from it as applicable. This is a simple templated set of guidelines.
Reviewer
This will not be exhaustively relevant to every PR.