Skip to content

Commit bbe7d46

Browse files
authored
Merge pull request #569 from cse-sim/rsys-plr
RSYS full speed capacity and PLR rework
2 parents 1facd74 + 2023fe5 commit bbe7d46

File tree

16 files changed

+25763
-25750
lines changed

16 files changed

+25763
-25750
lines changed

src/CNRECS.DEF

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3680,7 +3680,6 @@ RECORD RSYS "RSYS" *RAT // residential HVAC system
36803680
// includes rs_fEffH modification if any
36813681
// 0 = ASHP compressor is unavailable (due to lockout, )
36823682
*s *e FLOAT rs_capHtFS // current step full speed primary heating capacity, Btuh
3683-
// if known; used only for CHDHW
36843683
*s *e FLOAT rs_capHt // current step current speed net primary heating capacity, Btuh
36853684
// includes fan heat and strip/furn defrost makeup heat
36863685
// = fan heat only if compressor unavailable
@@ -3840,10 +3839,12 @@ RECORD RSYS "RSYS" *RAT // residential HVAC system
38403839
*s *e FLOAT rs_PLR // current step part load ratio = sensible load / full-speed sensible capacity
38413840
*s *e FLOAT rs_runF // primary (e.g. compressor) run fraction
38423841
*s *e FLOAT rs_speedF // primary (compressor) current speed fraction
3843-
// = current net cap / full speed net cap
3844-
// fixed speed: 1; var spd: <= 1 per load
3842+
// for CHDWH = current net cap / full speed net cap
3843+
// for variable speed = n/N (between 1/N and 1.0), where n is the modulated speed of the coil
3844+
// for fixed speed = 1
38453845
*s *e FLOAT rs_speedFMin // primary (compressor) current minimum speed fraction
3846-
// fixed speed: 1; var spd: < 1 per min current min cap
3846+
// fixed speed: 1
3847+
// variable speed: 1/N (N = number of coil speeds)
38473848
*s *e FLOAT rs_runFAux // auxiliary run fraction
38483849
*s *e DBL rs_outSen // average primary (compressor, burner, coil, ) sensible heat delivery rate for last subhr, Btuh
38493850
// (includes runF/speedF, does not include fan, defrost, or aux heat)

src/cnloads.cpp

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3851,14 +3851,13 @@ void RSYS::rs_HeatingOutletAirState(
38513851
if (auszMode == rsmHEAT)
38523852
{ if (Top.tp_pass1A)
38533853
{ // autosize warmup: assume fixed temp rise at room (duct losses and fan details ignored)
3854-
rs_capHt = rs_asOut.as_CalcQSen2(rs_asRet.as_tdb + rs_tdDesH, rs_amf);
3854+
rs_capHtFS= rs_capHt = rs_asOut.as_CalcQSen2(rs_asRet.as_tdb + rs_tdDesH, rs_amf);
38553855
rs_effHt = 1.f; // need nz value, else ASHP assumes compressor off
38563856
}
38573857
else if (rs_IsASHP())
38583858
{ // ASHP heat autosize (based on rs_capH)
38593859
rs_effHt = 1.f;
3860-
rs_capHt = rs_capH;
3861-
rs_capAuxH = rs_capH; // same cap for aux during autosizing
3860+
rs_capHtFS = rs_capHt = rs_capAuxH = rs_capH; // same cap for aux during autosizing
38623861
// used below if needed
38633862

38643863
}
@@ -3887,26 +3886,30 @@ void RSYS::rs_HeatingOutletAirState(
38873886

38883887
rs_capHt = capHtGross * rs_fCondCap + rs_fanPwr;
38893888
rs_inpHt = inpHtGross * rs_fCondInp + rs_fanPwr;
3889+
3890+
if (rs_speedF == 1.f)
3891+
rs_capHtFS = rs_capHt;
38903892

38913893
}
38923894
else if (rs_IsWSHP())
38933895
{
38943896
const float airMassFlowF = 1.f; // temporary assumption
38953897
/*rc |=*/ WSHPPerf.whp_HeatingFactors(rs_fCondCap, rs_fCondInp, rs_tdbOut, rs_tdbCoilIn, airMassFlowF);
38963898
float capHtGross = (rs_capH - rs_fanHRtdH) * rs_fCondCap;
3897-
rs_capHt = capHtGross + rs_fanPwr; // net capacity
3899+
rs_capHtFS = rs_capHt = capHtGross + rs_fanPwr; // net capacity
38983900
float inpX = (capHtGross / rs_COP47) * rs_fCondInp; // gross input power
38993901
rs_effHt = capHtGross / inpX * rs_fEffH; // adjusted gross efficiency
39003902
}
39013903
else if (rs_IsCHDHW())
39023904
{
39033905
rs_capHt = rs_CurCapHtCHDHW(rs_speedF);
3906+
// rs_capHtFS set in rs_CurCapHtCHDHW
39043907
rs_effHt = 1.f;
39053908
}
39063909
else
39073910
{ // not heat pump of any type
39083911
rs_effHt = rs_IsFanCoil() ? 1.f : rs_AFUE * rs_fEffH;
3909-
rs_capHt = rs_capH; // includes fan heat
3912+
rs_capHtFS = rs_capHt = rs_capH; // includes fan heat
39103913
}
39113914
}
39123915

@@ -4209,8 +4212,8 @@ x rs_asOut = asSav;
42094212
rs_asOut.as_Set(50., .001);
42104213
#endif
42114214

4212-
// speedF?
4213-
rs_capSenNetFS = rs_capSenCt / (rs_speedF > 0.f ? rs_speedF : 1.f) + rs_fanPwr; // net full speed sensible capacity
4215+
if (rs_speedF == 1.f)
4216+
rs_capSenNetFS = rs_capSenCt + rs_fanPwr; // net full speed sensible capacity
42144217

42154218
#if defined( _DEBUG)
42164219
if (!Top.isWarmup)
@@ -5428,10 +5431,7 @@ void RSYS::rs_ClearSubhrResults(
54285431
return;
54295432

54305433
// all modes
5431-
#if defined( RSYSLOADF)
5432-
rs_loadF =
5433-
#endif
5434-
rs_PLR = rs_runF = rs_speedF = rs_runFAux = rs_PLF = rs_capSenNetFS = 0.f;
5434+
rs_PLR = rs_runF = rs_speedF = rs_runFAux = rs_PLF = rs_capSenNetFS = 0.f;
54355435
rs_outSen = rs_outLat = rs_outFan = rs_outAux = rs_outDefrost
54365436
= rs_outSenTot = rs_inPrimary = rs_inFan = rs_inAux = rs_inDefrost = 0.;
54375437

@@ -6354,6 +6354,11 @@ RC RSYS::rs_FinalizeSh()
63546354
rs_inPrimary = fabs(rs_outSen + rs_outLat)/ max(.01f, rs_effCt * rs_PLF);
63556355
}
63566356

6357+
if (rs_capSenNetFS != 0.f)
6358+
{
6359+
rs_PLR = rs_znLoad[0] / rs_capSenNetFS; // PLR based on sensible load and FS sensible capacity
6360+
}
6361+
63576362
if (rs_pMtrElec)
63586363
{ rs_pMtrElec->H.clg += rs_inPrimary * Top.tp_subhrDur; // compressor energy for step, Btu
63596364
rs_pMtrElec->H.fanC += rs_inFan * Top.tp_subhrDur;
@@ -6396,9 +6401,6 @@ RC RSYS::rs_FinalizeSh()
63966401
fFanPwrPrim = 1.f;
63976402
}
63986403

6399-
rs_capSenNetFS = rs_capHt - rs_capDfHt; // net capacity
6400-
// includes fan heat; does not include defrost
6401-
64026404
double outTot = rs_runF * rs_capHt;
64036405

64046406
rs_outAux = rs_runFAux * rs_capAuxH;
@@ -6471,7 +6473,6 @@ RC RSYS::rs_FinalizeSh()
64716473
}
64726474
else
64736475
{ // non-ASHP, non-CHDHW
6474-
rs_capSenNetFS = rs_capHt; // net capacity, Btuh
64756476
double outTot = rs_runF * rs_capHt; // total output (incl fan), Btuh
64766477
// rs_outLat = 0.; // total latent output
64776478
rs_outFan = min( outTot, rs_runF * rs_fanPwr); // fan output, Btuh
@@ -6486,7 +6487,11 @@ RC RSYS::rs_FinalizeSh()
64866487
rs_inPrimary = rs_outSen / rs_effHt;
64876488
}
64886489
}
6489-
6490+
if (rs_capHtFS != 0.f)
6491+
{
6492+
rs_capSenNetFS = rs_capHtFS;
6493+
rs_PLR = rs_znLoad[0] / rs_capHtFS;
6494+
}
64906495
if (rs_pMtrHeat)
64916496
rs_pMtrHeat->H.htg += rs_inPrimary * Top.tp_subhrDur;
64926497
rs_inFan = rs_outFan; // fan input, Btuh (in = out, all fan heat into air)
@@ -6503,10 +6508,7 @@ RC RSYS::rs_FinalizeSh()
65036508
}
65046509
// else if (rs_Mode == rsmOFF)
65056510

6506-
if (rs_capSenNetFS != 0.f)
6507-
{
6508-
rs_PLR = rs_znLoad[0] / rs_capSenNetFS;
6509-
}
6511+
65106512

65116513
// parasitic consumption
65126514
if (rs_pMtrElec)

test/ASHP_DFNG.cse

Lines changed: 86 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1705,48 +1705,92 @@ Report rpType=UDT rpFreq=Year rpHeader=No
17051705
reportcol colVal=" Yr" colHead="Month" colWid = 5
17061706
RSYSHRCOLS( 1, Y)
17071707

1708-
#define SYSCOLS( RXCOL, rs, zn) \
1709-
RXCOL colHead="mon" colVal=$Month colWid=3 \
1710-
RXCOL colHead="day" colVal=$Dayofmonth colWid=3 \
1711-
RXCOL colHead="Hr" [email protected] colWid=2 \
1712-
RXCOL colHead="Sh" [email protected] colWid=2 \
1713-
RXCOL colHead="ToDb" [email protected] colWid=4 colDec=1 \
1714-
RXCOL colHead="Tzn" colVal=@Zone[zn].tz colWid=5 colDec=2 \
1715-
RXCOL colHead="UnMet" colVal=@ZnRes[zn].S.unMetHrDH[ 0] colWid=5 colDec=2 \
1716-
RXCOL colHead="capfl" colVal=@RSYS[ rs].capHt colWid=5 colDec=0 \
1717-
RXCOL colHead="COPfl" colVal=@RSYS[ rs].effHt colWid=5 colDec=3 \
1718-
RXCOL colHead="capF" colVal=@RSYS[ rs].fCondCap colWid=5 colDec=3 \
1719-
RXCOL colHead="inpF" colVal=@RSYS[ rs].fCondInp colWid=5 colDec=3 \
1720-
RXCOL colHead="PLR" colVal=@RSYS[ rs].plr colWid=5 colDec=3 \
1721-
RXCOL colHead="runF" colVal=@RSYS[ rs].runF colWid=5 colDec=3 \
1722-
RXCOL colHead="spdF" colVal=@RSYS[ rs].speedF colWid=5 colDec=3 \
1723-
RXCOL colHead="PLF" colVal=@RSYS[ rs].plf colWid=5 colDec=3 \
1724-
RXCOL colHead="runFAux" colVal=@RSYS[ rs].runFAux colWid=7 colDec=3 \
1725-
RXCOL colHead="COPpl" colVal=@RSYS[ rs].COPHtAdj colWid=5 colDec=3 \
1726-
RXCOL colHead="qComp" colVal=@RSYS[ rs].outSen colWid=6 colDec=0 \
1727-
RXCOL colHead="qAux" colVal=@RSYS[ rs].outAux colWid=6 colDec=0 \
1728-
RXCOL colHead="qDef" colVal=@RSYS[ rs].outDefrost colWid=6 colDec=0 \
1729-
RXCOL colHead="qFan" colVal=@RSYS[ rs].outFan colWid=6 colDec=0 \
1730-
RXCOL colHead="qTot" colVal=@RSYS[ rs].outSenTot colWid=6 colDec=0 \
1731-
RXCOL colHead="qsZn" colVal=@ZnRes[zn].S.qsMech*@Top.nSubSteps colWid=6 colDec=0
1732-
1733-
REPORT rpType=UDT rpFreq=subhour rpDayBeg=jan 4 rpDayEnd=jan 6 rpCpl=-1
1734-
SYSCOLS( Reportcol, 1, 1)
1735-
1736-
REPORT rpType=UDT rpFreq=subhour rpDayBeg=(CD1)-1 rpDayEnd=(CD1) rpCpl=-1
1737-
SYSCOLS( Reportcol, 1, 1)
1738-
1739-
1740-
#if 0
1741-
EXPORT exType=UDT exFreq=subhour exDayBeg=jan 4 exDayEnd=jan 6
1742-
SYSCOLS( Exportcol, 1, 1)
1743-
1744-
REPORT rpType=UDT rpFreq=subhour rpDayBeg=aug 11 rpDayEnd=aug 11 rpCpl=-1
1745-
SYSCOLS( Reportcol, 1, 1)
1746-
1747-
EXPORT exType=UDT exFreq=subhour exDayBeg=aug 11 exDayEnd=aug 11
1748-
SYSCOLS( Exportcol, 1, 1)
1749-
#endif
1708+
// report columns: RSYS heating subhour details
1709+
#define SYSCOLSH( RXCOL, rs, zn, zat, dctTot) \
1710+
RXCOL colHead="mon" colVal=$Month colWid=3 \
1711+
RXCOL colHead="day" colVal=$Dayofmonth colWid=3 \
1712+
RXCOL colHead="Hr" [email protected] colWid=2 \
1713+
RXCOL colHead="Sh" [email protected] colWid=2 \
1714+
RXCOL colHead="ToDb" [email protected] colWid=5 colDec=2 \
1715+
RXCOL colHead="Tatt" colVal=@Zone[zat].tz colWid=5 colDec=2 \
1716+
RXCOL colHead="Tzn" colVal=@Zone[zn].tz colWid=5 colDec=2 \
1717+
RXCOL colHead="Tent" colVal=@RSYS[ rs].asIn.tDb colWid=6 colDec=2 \
1718+
RXCOL colHead="Tlv" colVal=@RSYS[ rs].asOut.tDb colWid=6 colDec=2 \
1719+
RXCOL colHead="Tsup" colVal=@RSYS[ rs].asSup.tDb colWid=6 colDec=2 \
1720+
RXCOL colHead="capHt" colVal=@RSYS[ rs].capHt colWid=5 colDec=0 \
1721+
RXCOL colHead="capHtFS" colVal=@RSYS[ rs].capHtFS colWid=7 colDec=0 \
1722+
RXCOL colHead="capSenNetFS" colVal=@RSYS[ rs].capSenNetFS colWid=11 colDec=0 \
1723+
RXCOL colHead="znLd" colVal=@RSYS[ rs].znLoad[ 0] colWid=5 colDec=0 \
1724+
RXCOL colHead="capF" colVal=@RSYS[ rs].fCondCap colWid=5 colDec=3 \
1725+
RXCOL colHead="inpF" colVal=@RSYS[ rs].fCondInp colWid=5 colDec=3 \
1726+
RXCOL colHead="PLR" colVal=@RSYS[ rs].PLR colWid=5 colDec=3 \
1727+
RXCOL colHead="spdF" colVal=@RSYS[ rs].speedF colWid=5 colDec=3 \
1728+
RXCOL colHead="runF" colVal=@RSYS[ rs].runF colWid=5 colDec=3 \
1729+
RXCOL colHead="PLF" colVal=@RSYS[ rs].plf colWid=5 colDec=3 \
1730+
RXCOL colHead="runFAux" colVal=@RSYS[ rs].runFAux colWid=7 colDec=3 \
1731+
RXCOL colHead="CFMav" colVal=@Zone[ zn].rsAmfSup/4.5 colWid=5 colDec=1 \
1732+
RXCOL colHead="qComp" colVal=@RSYS[ rs].outSen colWid=6 colDec=0 \
1733+
RXCOL colHead="qAux" colVal=@RSYS[ rs].outAux colWid=6 colDec=0 \
1734+
RXCOL colHead="qDef" colVal=@RSYS[ rs].outDefrost colWid=5 colDec=0 \
1735+
RXCOL colHead="qFan" colVal=@RSYS[ rs].outFan colWid=5 colDec=0 \
1736+
RXCOL colHead="qNet" colVal=@RSYS[ rs].outSenTot colWid=6 colDec=0 \
1737+
RXCOL colHead="qDct" colVal=-@DUCTSEGRES[ dctTot].S.qhTotSen/@Top.subhrDur colWid=6 colDec=0 \
1738+
RXCOL colHead="qZn" colVal=@Zone[zn].qsHVAC colWid=6 colDec=0 \
1739+
RXCOL colHead="qBal1" colVal=@RSYS[ rs].outSenTot-@Zone[zn].qsHVAC-@DUCTSEGRES[ dctTot].S.qhTotSen/@Top.subhrDur colWid=5 colDec=0 \
1740+
RXCOL colHead="qBal2" colVal=(@RSYSRES[ rs].S.qhNet-@ZNRES[ zn].S.qshHvac-@DUCTSEGRES[ dctTot].S.qhTotSen)/@Top.subhrDur colWid=6 colDec=0 \
1741+
RXCOL colHead="eComp" colVal=@RSYS[rs].inPrimary colWid=5 colDec=0 \
1742+
RXCOL colHead="eTot" colVal=@RSYSRES[rs].S.ehTot / @Top.subhrDur colWid=6 colDec = 0 \
1743+
RXCOL colHead="COPfs" colVal=@RSYS[ rs].effHt colWid=5 colDec=3 \
1744+
RXCOL colHead="COPpl" colVal=@RSYS[ rs].COPHtAdj colWid=5 colDec=3 \
1745+
RXCOL colHead="COPov" colVal=abs( @Zone[zn].qsHVAC)/max( 1, @RSYS[rs].inPrimary+@RSYS[rs].inAux+@RSYS[rs].inDefrost+@RSYS[rs].inFan) colWid=5 colDec=3
1746+
1747+
REPORT rpType=UDT rpFreq=subhour rpDayBeg=jan 4 rpDayEnd=jan 6 rpTitle="RSYS Heating subhour details"
1748+
SYSCOLSH( Reportcol, 1, 1, "Attic-atc", 3)
1749+
1750+
// report columns: RSYS cooling subhour details
1751+
#define SYSCOLSC( RXCOL, rs, lm, zn, zat, dctTot) \
1752+
RXCOL colHead="mon" colVal=$Month colWid=3 \
1753+
RXCOL colHead="day" colVal=$Dayofmonth colWid=3 \
1754+
RXCOL colHead="Hr" [email protected] colWid=2 \
1755+
RXCOL colHead="Sh" [email protected] colWid=2 \
1756+
RXCOL colHead="ToDb" [email protected] colWid=5 colDec=2 \
1757+
RXCOL colHead="Tatt" colVal=@Zone[zat].tz colWid=5 colDec=2 \
1758+
RXCOL colHead="Tzn" colVal=@Zone[zn].tz colWid=5 colDec=2 \
1759+
RXCOL colHead="Tent" colVal=@RSYS[ rs].asIn.tDb colWid=6 colDec=2 \
1760+
RXCOL colHead="Tlv" colVal=@RSYS[ rs].asOut.tDb colWid=6 colDec=2 \
1761+
RXCOL colHead="Tsup" colVal=@RSYS[ rs].asSup.tDb colWid=6 colDec=2 \
1762+
RXCOL colHead="UnMet" colVal=@ZnRes[zn].S.unMetHrs[ 1] colWid=5 colDec=2 \
1763+
RXCOL colHead="znLd" colVal=@RSYS[ rs].znLoad[ 0] colWid=6 colDec=0 \
1764+
RXCOL colHead="capF" colVal=@RSYS[ rs].fCondCap colWid=5 colDec=3 \
1765+
RXCOL colHead="inpF" colVal=@RSYS[ rs].fCondInp colWid=5 colDec=3 \
1766+
RXCOL colHead="SHR" colVal=@RSYS[ rs].shr colWid=4 colDec=3 \
1767+
RXCOL colHead="capSenNetFS" colVal=@RSYS[ rs].capSenNetFS colWid=11 colDec=0 \
1768+
RXCOL colHead="capSen" colVal=@RSYS[rs].capSenCt colWid=6 colDec=0 \
1769+
RXCOL colHead="capLat" colVal=@RSYS[rs].capLatCt colWid=6 colDec=0 \
1770+
RXCOL colHead="capTot" colVal=@RSYS[rs].capTotCt colWid=6 colDec=0 \
1771+
RXCOL colHead="PLR" colVal=@RSYS[ rs].PLR colWid=5 colDec=3 \
1772+
RXCOL colHead="runF" colVal=@RSYS[ rs].runF colWid=5 colDec=3 \
1773+
RXCOL colHead="spdF" colVal=@RSYS[ rs].speedF colWid=5 colDec=3 \
1774+
RXCOL colHead="PLF" colVal=@RSYS[ rs].plf colWid=5 colDec=3 \
1775+
RXCOL colHead="CFMav" colVal=@Zone[ zn].rsAmfSup/4.5 colWid=5 colDec=1 \
1776+
RXCOL colHead="qSCoil" colVal=@RSYS[ rs].outSen colWid=6 colDec=0 \
1777+
RXCOL colHead="qSFan" colVal=@RSYS[ rs].outFan colWid=5 colDec=0 \
1778+
RXCOL colHead="qSNet" colVal=@RSYS[ rs].outSenTot colWid=6 colDec=0 \
1779+
RXCOL colHead="qSNet2" colVal=@RSYSRES[ rs].S.qcSenNet/@Top.subhrDur colWid=6 colDec=0 \
1780+
RXCOL colHead="qLd" colVal=@LOADMETER[ lm].S.qClg/@Top.subhrDur colWid=6 colDec=0 \
1781+
RXCOL colHead="qSDct" colVal=@DuctSegRes[ dctTot].S.qcTotSen/@Top.subhrDur colWid=5 colDec=0 \
1782+
RXCOL colHead="qsZn1" colVal=@ZnRes[zn].S.qscHVAC/@Top.subhrDur colWid=6 colDec=0 \
1783+
RXCOL colHead="qsZn2" colVal=@Zone[ zn].qsHVAC colWid=6 colDec=0 \
1784+
RXCOL colHead="qBal1" colVal=@RSYS[ rs].outSenTot-@Zone[zn].qsHVAC-@DUCTSEGRES[ dctTot].S.qcTotSen/@Top.subhrDur colWid=5 colDec=0 \
1785+
RXCOL colHead="qBal2" colVal=(@RSYSRES[ rs].S.qcSenNet-@ZNRES[ zn].S.qscHvac-@DUCTSEGRES[ dctTot].S.qcTotSen)/@Top.subhrDur colWid=6 colDec=0 \
1786+
RXCOL colHead="qLat1" colVal=@RSYS[ rs].outLat colWid=6 colDec=0 \
1787+
RXCOL colHead="qLat2" colVal=@ZnRes[zn].S.qlMech/@Top.subhrDur colWid=6 colDec=0 \
1788+
RXCOL colHead="qtZn" colVal=(@ZnRes[zn].S.qscHvac+@ZnRes[zn].S.qlMech)/@Top.subhrDur colWid=6 colDec=0 \
1789+
RXCOL colHead="eComp" colVal=@RSYS[rs].inPrimary colWid=5 colDec=0 \
1790+
RXCOL colHead="eTot" colVal=@RSYSRES[rs].S.ecTot/@Top.subhrDur colWid=6 colDec = 0
1791+
1792+
REPORT rpType=UDT rpFreq=subhour rpDayBeg=(CD1)-1 rpDayEnd=CD1 rpCpl=-1 rpTitle="RSYS cooling subhour details"
1793+
SYSCOLSC( Reportcol, 1, 1, 1, "Attic-atc", 3)
17501794

17511795

17521796
RUN

0 commit comments

Comments
 (0)