Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 20 additions & 2 deletions doc/src/docs/input-data/rsys.md
Original file line number Diff line number Diff line change
Expand Up @@ -600,7 +600,7 @@ ALTERNATE, Alternates between compressor and auxiliary", True)

Type: float

For rsType=ASHP, auxiliary heating capacity. If AUTOSIZEd, rsCapAuxH is set to the peak heating load evaluated at the heating design temperature (Top.heatDsTDbO).
For heat pump types, auxiliary heating capacity. If AUTOSIZEd, rsCapAuxH is set to rsFxCapAuxH $\times$ (peak design-day load). Peak design day load is evaluated at the heating design temperature (Top.heatDsTDbO).

{{
member_table({
Expand All @@ -612,11 +612,29 @@ For rsType=ASHP, auxiliary heating capacity. If AUTOSIZEd, rsCapAuxH is set to t
})
}}

### rsCapAuxHFactor

Type: float

Auxiliary heating capacity factor, applied subhourly. For each subhour, available auxiliary heating capacity is rsCapAuxH $\times$ rsCapAuxHFactor. This allows expression-based modification of auxiliary capacity, e.g. disabling auxiliary if zone temperature is within 2 F of setpoint.

rsCapAuxHFactor modifies only auxiliary heating capacity used when there is insufficient compressor capacity available to satisfy the heating load. That is, it does not have any effect on backup heating capacity available during defrost operation.

{{
member_table({
"units": "",
"legal_range": "*x* ≥ 0",
"default": "1",
"required": "No",
"variability": "subhourly"
})
}}

### rsAFUEAuxH

Type: float

For rsType=ASHP, auxiliary heat annualized fuel utilization efficiency.
For heat pump types, auxiliary heat annualized fuel utilization efficiency.

{{
member_table({
Expand Down
10 changes: 6 additions & 4 deletions src/CNRECS.DEF
Original file line number Diff line number Diff line change
Expand Up @@ -2723,8 +2723,8 @@ RECORD ZNR "zone" *RAT // zone runtime info RAT. Set mainly from separate ZNI
*s DBL /*TEMP*/ tzls // zone temp, end last subhour, F
*s DBL /*HUMRAT*/ wzls // zone hum rat, end last subhour (same as wz in 1st iteration of subhr)
*h DBL /*TEMP*/ tzlh // zone temp, end last hour
DBL /*TEMPDIFF*/ tzlsDelta // zone temp change during last subhour: tzls - tz at end subhour
DBL /*HUMRAT*/ wzlsDelta // zone hum rat change during last subhour: wzls - wz at end subhour
*s DBL /*TEMPDIFF*/ tzlsDelta // zone temp change during last subhour: tz - tzls at end subhour
*s DBL /*HUMRAT*/ wzlsDelta // zone hum rat change during last subhour: wz - wzls at end subhour
*declare "DBL zn_Rho0() const;"

// re radiant/convective model
Expand Down Expand Up @@ -3659,10 +3659,12 @@ RECORD RSYS "RSYS" *RAT // residential HVAC system
// *always* 0 if !rs_IsHP()
*f *e FLOAT rs_capAuxHInp // rs_capAuxH as input (may be AUTOSIZE)
// allows use of estimated rs_capAuxH during ASHP autosize
*f *s FLOAT_GEZ rs_capAuxHFactor // auxiliary heating capacity factor, default 1
// allows runtime modification of available aux capacity
*f *s *e FLOAT_GEZ rs_capAuxHAvail // current step available auxiliary heating capacity
// = rs_capAuxH * rs_capAuxHFactor
*f FLOAT_GZ rs_AFUEAuxH // auxiliary furnace heating AFUE (assumed constant), default 0.9
*f FLOAT_GZ rs_effAuxH // aux heat efficiency (= rs_AFUEAuxH or 1)
*r *e INT rs_underSizedAuxCount // # of subhours having aux heat capacity < compressor capacity
// iff rs_ctrlAuxH != C_AUXHEATCTRL_CYCLE and rs_capAuxH > 0
*h FLOAT rs_ASHPLockOutT // air source heat pump compressor lockout temp, F
// compressor capacity assumed 0 if outdoor tdb < tLockOut
// default is -999 (no lockout)
Expand Down
1 change: 1 addition & 0 deletions src/cncult.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1691,6 +1691,7 @@ CULT( "rsCdH", DAT, RSYS_CDH, 0, 0, VEOI, TYFL, 0,
CULT( "rsTypeAuxH", DAT, RSYS_TYPEAUXH, 0, 0, VEOI, TYCH, 0, C_AUXHEATTY_RES, N, N),
CULT( "rsCtrlAuxH", DAT, RSYS_CTRLAUXH, 0, 0, VEOI, TYCH, 0, C_AUXHEATCTRL_CYCLE, N, N),
CULT( "rsCapAuxH", DAT, RSYS_CAPAUXH, AS_OK, 0, VEOI, TYFL, 0, 0.f, N, N),
CULT("rsCapAuxHFactor", DAT, RSYS_CAPAUXHFACTOR, 0, 0, VSUBHRLY,TYFL, 0, 1.f, N, N),
CULT( "rsAFUEAuxH", DAT, RSYS_AFUEAUXH, 0, 0, VEOI, TYFL, 0, 1.f, N, N),
CULT( "rsASHPLockOutT", DAT, RSYS_ASHPLOCKOUTT, 0, 0, VHRLY, TYFL, 0, -999.f, N, N),
CULT( "rsDefrostModel", DAT, RSYS_DEFROSTMODEL, 0, 0, VEOI, TYCH, 0, C_RSYSDEFROSTMODELCH_REVCYCLEAUX, N, N),
Expand Down
67 changes: 36 additions & 31 deletions src/cnloads.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2375,13 +2375,13 @@ RC RSYS::rs_CkFAuxHeat() // check aux heat
rs_effAuxH = 1.f; // insurance
if (!rs_CanHaveAuxHeat())
{ rc |= disallowN("when rsType is not ASHP, ASHPPM, ASHPHydronic, or ASHPPkgRoom",
RSYS_TYPEAUXH, RSYS_CAPAUXH, RSYS_FXCAPAUXHTARG, RSYS_AFUEAUXH,
RSYS_TYPEAUXH, RSYS_CAPAUXH, RSYS_CAPAUXHFACTOR, RSYS_FXCAPAUXHTARG, RSYS_AFUEAUXH,
RSYS_CTRLAUXH, 0);
rs_AFUEAuxH = 0.f; // clear possibly confusing default
}
else if (rs_typeAuxH == C_AUXHEATTY_NONE)
{ rc |= disallowN("when rsTypeAuxH = None",
RSYS_CTRLAUXH, RSYS_CAPAUXH, RSYS_FXCAPAUXHTARG, RSYS_AFUEAUXH, 0);
RSYS_CTRLAUXH, RSYS_CAPAUXH, RSYS_CAPAUXHFACTOR, RSYS_FXCAPAUXHTARG, RSYS_AFUEAUXH, 0);
rs_capAuxH = 0.f;
}
else if (!IsAusz(RSYS_CAPAUXH) && rs_capAuxH == 0.f)
Expand Down Expand Up @@ -2426,21 +2426,21 @@ RC RSYS::rs_CkFRatio(
} // RSYS::rs_CkFRatio
//-----------------------------------------------------------------------------
#if 0
// incomplete idea, 11-21
RC RSYS::rs_CheckCapAuxH() // check for sufficient aux heat capacity
// issues msg if rs_capAuxH is too small to be useful
{
RC rc = RCOK;
if (rs_capAuxH > 0.f && rs_ctrlAuxH != C_AUXHEATCTRL_CYCLE)
{ // 1. user has provided aux capacity
// 2. aux and primary will not run simultaneously
float capMax = std::max({ rs_cap47, rs_cap35, rs_cap17, rs_cap05 });

if (rs_capAuxH <= capMax)
rc |= oWarn("Insufficient auxiliary capacity");
}
return rc;
} // RSYS::rs_CheckCapAuxH
0 // incomplete idea, 11-21
0 RC RSYS::rs_CheckCapAuxH() // check for sufficient aux heat capacity
0 // issues msg if rs_capAuxH is too small to be useful
0 {
0 RC rc = RCOK;
0 if (rs_capAuxHAvail ? ? > 0.f && rs_ctrlAuxH != C_AUXHEATCTRL_CYCLE)
0 { // 1. user has provided aux capacity
0 // 2. aux and primary will not run simultaneously
0 float capMax = std::max({ rs_cap47, rs_cap35, rs_cap17, rs_cap05 });
0
0 if (rs_capAuxH <= capMax)
0 rc |= oWarn("Insufficient auxiliary capacity");
0 }
0 return rc;
0 } // RSYS::rs_CheckCapAuxH
#endif
//-----------------------------------------------------------------------------
RC RSYS::rs_GetAndCheckPERFORMANCEMAP(
Expand Down Expand Up @@ -3318,8 +3318,6 @@ RC RSYS::rs_SetupCapH( // set heating members that do not vary during simulatio
else
{ // non-HP, non-CHDHW
nomCap = rs_capH;
if (!rs_CanHaveAuxHeat())
rs_capAuxH = 0.f; // insurance
}
rs_amfH = rs_AMFForHtgCap(nomCap); // nominal full speed dry-air mass flow rate, lb/hr
avfH = AMFtoAVF( rs_amfH);
Expand Down Expand Up @@ -3668,6 +3666,10 @@ RC RSYS::rs_BegSubhr()
rs_OAVTdbInlet = Top.tDbOSh;
// else set via input expression

rs_capAuxHAvail = rs_capAuxH;
if (!rs_isAuszH)
rs_capAuxHAvail *= rs_capAuxHFactor;

return rc;
} // RSYS::rs_BegSubhr
//----------------------------------------------------------------------------
Expand Down Expand Up @@ -3926,7 +3928,7 @@ void RSYS::rs_HeatingOutletAirState(
rs_asOut.as_AddQSen2( rs_capHt, rs_amf);

// auxiliary heat supply air state
// rs_capAuxH is known
// rs_capAuxHAvail is known
if (rs_CanHaveAuxHeat() && rs_speedF == 1.f)
{
// double tdbWas = rs_asOutAux.as_tdb;
Expand All @@ -3944,7 +3946,7 @@ void RSYS::rs_HeatingOutletAirState(
fanHeatAux = rs_fanHeatH;
}

rs_asOutAux.as_AddQSen2(rs_capAuxH + fanHeatAux, rs_amf);
rs_asOutAux.as_AddQSen2(rs_capAuxHAvail + fanHeatAux, rs_amf);
rs_asSupAux = rs_asOutAux;
rs_SupplyDSEAndDucts(rs_asSupAux);
}
Expand Down Expand Up @@ -4605,6 +4607,8 @@ float RSYS::rs_PerfASHP2( // ASHP performance
}
}

// limit to available aux heat capacity
// NOT rs_capAuxHAvail
if (capDfHt > rs_capAuxH)
capDfHt = rs_capAuxH;

Expand Down Expand Up @@ -5823,18 +5827,18 @@ RC RSYS::rs_AllocateZoneAir() // finalize zone air flows
// else rs_fxCap = 0
double fSize = min( rs_fxCap[ 0], 1.); // limit to available

// bAux: aux possible and needed
// note: rs_capAuxH>0 possible for ASHP *only* (but can be =0 for ASHP)
bool bAux = rs_mode == rsmHEAT && rs_capAuxH > 0.f
// bAux: true iff aux possible and needed
// note: rs_capAuxHAvail>0 possible for ASHP *only* (but can be =0 for ASHP)
bool bAux = rs_mode == rsmHEAT && rs_capAuxHAvail > 0.f
&& (rs_effHt == 0.f || (fSize > 0. && fSize < 1.));

if (bAux && rs_ctrlAuxH != C_AUXHEATCTRL_CYCLE)
{ // check that aux will be helpful
// _CYCLE: any rs_capAuxH > 0 helps (> 0.f check is above)
// _CYCLE: any rs_capAuxHAvail > 0 helps (> 0.f check is above)
// _LO, _ALT: aux supply temp must be greater than primary
if (rs_asSupAux.as_tdb <= rs_asSup.as_tdb)
{ orWarn("Aux heat supply temperature (%0.1f F) <= primary supply temperature (%0.1f F)."
"\n Aux heat is not helpful. rscapAuxH should be increased.",
"\n Aux heat is not helpful. rsCapAuxH should be increased.",
rs_asSupAux.as_tdb, rs_asSup.as_tdb);
// bAux = false; no: real controls would run aux even if not helpful
}
Expand Down Expand Up @@ -5974,8 +5978,8 @@ RC RSYS::rs_AllocateZoneAir() // finalize zone air flows
if (rs_runFAux > 1.f)
printf("\nrs_runFAux > 1");
#endif
float fFan = rs_capAuxH / (rs_capAuxH + rs_fanHeatH);
qAux = rs_runFAux * rs_capAuxH * fFan;
float fFan = rs_capAuxHAvail / (rs_capAuxHAvail + rs_fanHeatH);
qAux = rs_runFAux * rs_capAuxHAvail * fFan;
}
else
{ // aux cycles: determine added heat rqd in addition to prim
Expand All @@ -5989,7 +5993,7 @@ RC RSYS::rs_AllocateZoneAir() // finalize zone air flows
#endif
qAux = 0.;
}
rs_runFAux = qAux / rs_capAuxH;
rs_runFAux = qAux / rs_capAuxHAvail;
}
#if defined( _DEBUG)
if (ifBracket( 0.f, rs_runFAux, 1.f))
Expand Down Expand Up @@ -6390,7 +6394,7 @@ RC RSYS::rs_FinalizeSh()
// rs_COPHtAdj = 0.f;
runFFan = rs_runFAux;
rs_outFan = rs_runFAux * rs_fanHeatH;
rs_outAux = rs_runFAux * rs_capAuxH;
rs_outAux = rs_runFAux * rs_capAuxHAvail;
rs_runF = rs_PLF = 0.f;
rs_capHt = rs_capHtFS = rs_capDfHt = 0.f; // clear values for reports
// aux may be on, handled below
Expand All @@ -6416,7 +6420,7 @@ RC RSYS::rs_FinalizeSh()

double outTot = rs_runF * rs_capHt;

rs_outAux = rs_runFAux * rs_capAuxH;
rs_outAux = rs_runFAux * rs_capAuxHAvail;

rs_outFan = min(outTot+rs_outAux, runFFan * rs_fanPwr); // fan output, Btuh
// insurance: limit to total output
Expand Down Expand Up @@ -6452,6 +6456,7 @@ RC RSYS::rs_FinalizeSh()
rs_inPrimary = rs_outSen / rs_COPHtAdj;

}

rs_inAux = rs_outAux / (rs_effAuxH * rs_fEffAuxHBackup);
rs_inDefrost = rs_outDefrost / (rs_effAuxH * rs_fEffAuxHDefrost);

Expand Down
50 changes: 47 additions & 3 deletions test/ASHPPkgRoom.cse
Original file line number Diff line number Diff line change
Expand Up @@ -1255,6 +1255,7 @@ RSYS RSYS1
#if 1
AUTOSIZE rsCap47
AUTOSIZE rsCapAuxH
rsCapAuxHFactor = brkt(0, (68 - @Zone[ 1].tzls)/2., 1)
rsFxCapAuxH = 2
rsFxCapH = 1.5
#else
Expand Down Expand Up @@ -1332,9 +1333,52 @@ SYSINFHEAT( 1)
Report rpType=MTR rpMeter=MtrElec rpFreq=MONTH rpBtuSf=1000
Report rpType=MTR rpMeter=MtrNatGas rpFreq=MONTH rpBtuSf=1000

Report rpType=MTR rpMeter=MtrElec rpFreq=Hour rpBtuSf=1000 rpDayBeg= HD1; rpDayEnd=HD1
Report rpType=MTR rpMeter=MtrElec rpFreq=Hour rpBtuSf=1000 rpDayBeg= DD1; rpDayEnd=DD1
Report rpType=MTR rpMeter=MtrElec rpFreq=Hour rpBtuSf=1000 rpDayBeg= CD1; rpDayEnd=CD1
Report rpType=MTR rpMeter=MtrElec rpFreq=Hour rpBtuSf=1000 rpDayBeg= HD1 rpDayEnd=HD1
Report rpType=MTR rpMeter=MtrElec rpFreq=Hour rpBtuSf=1000 rpDayBeg= DD1 rpDayEnd=DD1
Report rpType=MTR rpMeter=MtrElec rpFreq=Hour rpBtuSf=1000 rpDayBeg= CD1 rpDayEnd=CD1

// report columns: RSYS heating subhour details
#define SYSCOLSH( RXCOL, rs, zn, zat) \
RXCOL colHead="mon" colVal=$Month colWid=3 \
RXCOL colHead="day" colVal=$Dayofmonth colWid=3 \
RXCOL colHead="Hr" colVal=@Top.iHr colWid=2 \
RXCOL colHead="Sh" colVal=@Top.iSubHr colWid=2 \
RXCOL colHead="ToDb" colVal=@Top.tDbOSh colWid=5 colDec=2 \
RXCOL colHead="Tatt" colVal=@Zone[zat].tz colWid=5 colDec=2 \
RXCOL colHead="Tzn" colVal=@Zone[zn].tz colWid=5 colDec=2 \
RXCOL colHead="Tent" colVal=@RSYS[ rs].asIn.tDb colWid=6 colDec=2 \
RXCOL colHead="Tlv" colVal=@RSYS[ rs].asOut.tDb colWid=6 colDec=2 \
RXCOL colHead="Tsup" colVal=@RSYS[ rs].asSup.tDb colWid=6 colDec=2 \
RXCOL colHead="capHt" colVal=@RSYS[ rs].capHt colWid=5 colDec=0 \
RXCOL colHead="capHtFS" colVal=@RSYS[ rs].capHtFS colWid=7 colDec=0 \
RXCOL colHead="capSenNetFS" colVal=@RSYS[ rs].capSenNetFS colWid=11 colDec=0 \
RXCOL colHead="capAuxHAvail" colVal=@RSYS[ rs].capAuxHAvail colWid=12 colDec=0 \
RXCOL colHead="znLd" colVal=@RSYS[ rs].znLoad[ 0] colWid=5 colDec=0 \
RXCOL colHead="capF" colVal=@RSYS[ rs].fCondCap colWid=5 colDec=3 \
RXCOL colHead="inpF" colVal=@RSYS[ rs].fCondInp colWid=5 colDec=3 \
RXCOL colHead="PLR" colVal=@RSYS[ rs].PLR colWid=5 colDec=3 \
RXCOL colHead="spdF" colVal=@RSYS[ rs].speedF colWid=5 colDec=3 \
RXCOL colHead="runF" colVal=@RSYS[ rs].runF colWid=5 colDec=3 \
RXCOL colHead="PLF" colVal=@RSYS[ rs].plf colWid=5 colDec=3 \
RXCOL colHead="runFAux" colVal=@RSYS[ rs].runFAux colWid=7 colDec=3 \
RXCOL colHead="CFMav" colVal=@Zone[ zn].rsAmfSup/4.5 colWid=5 colDec=1 \
RXCOL colHead="qComp" colVal=@RSYS[ rs].outSen colWid=6 colDec=0 \
RXCOL colHead="qAux" colVal=@RSYS[ rs].outAux colWid=6 colDec=0 \
RXCOL colHead="qDef" colVal=@RSYS[ rs].outDefrost colWid=5 colDec=0 \
RXCOL colHead="qFan" colVal=@RSYS[ rs].outFan colWid=5 colDec=0 \
RXCOL colHead="qNet" colVal=@RSYS[ rs].outSenTot colWid=6 colDec=0 \
RXCOL colHead="qZn" colVal=@Zone[zn].qsHVAC colWid=6 colDec=0 \
RXCOL colHead="qBal1" colVal=@RSYS[ rs].outSenTot-@Zone[zn].qsHVAC colWid=5 colDec=0 \
RXCOL colHead="qBal2" colVal=(@RSYSRES[ rs].S.qhNet-@ZNRES[ zn].S.qshHvac)/@Top.subhrDur colWid=6 colDec=0 \
RXCOL colHead="eComp" colVal=@RSYS[rs].inPrimary colWid=5 colDec=0 \
RXCOL colHead="eTot" colVal=@RSYSRES[rs].S.ehTot / @Top.subhrDur colWid=6 colDec = 0 \
RXCOL colHead="COPfs" colVal=@RSYS[ rs].effHt colWid=5 colDec=3 \
RXCOL colHead="COPpl" colVal=@RSYS[ rs].COPHtAdj colWid=5 colDec=3 \
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

REPORT rpType=UDT rpFreq=subhour rpDayBeg=(HD1) rpDayEnd=(HD1) rpTitle="RSYS Heating subhour details"
SYSCOLSH( Reportcol, 1, 1, "Attic-atc")



// CSE Format Conditioned Zone sensible Energy Balance. Modified by BW 110812
Expand Down
Loading