@@ -3139,11 +3139,9 @@ float RSYS::rs_PerfASHP( // ASHP performance (simplified call)
31393139// returns total heating capacity (compressor + capDefrostHt), Btuh
31403140{
31413141 float capHt, inpHt, capDfHt, capHtMin, inpHtMin, capDfHtMin;
3142- float what = rs_PerfASHP2 (ashpModel, tdbOut, fanHAdj,
3142+ COP = rs_PerfASHP2 (ashpModel, tdbOut, fanHAdj,
31433143 capHt, inpHt, capDfHt, capHtMin, inpHtMin, capDfHtMin);
31443144
3145- COP = inpHt > 0 .f ? capHt / inpHt : 0 .f ;
3146-
31473145 return capHt;
31483146
31493147} // RSYS::rs_PerfASHP
@@ -3169,7 +3167,7 @@ float RSYS::rs_PerfASHP2( // ASHP performance
31693167
31703168 float COPAdjF /* =1.f*/ ) // COP adjustment factor
31713169 // multiplies final COP result
3172- // returns heating capacity (including defrost if any), Btuh
3170+ // returns compressor-only full-speed COP (as adjusted by COPAdjF)
31733171{
31743172 capDfHt = 0 .f ;
31753173 BOOL bDoDefrost = (ashpModel & 0x100 ) == 0
@@ -3386,11 +3384,11 @@ RC RSYS::rs_SetupASHP() // set ASHP defaults and derived parameters
33863384 rs_COP47 = 0 .3225f * rs_HSPF + 0 .9099f ;
33873385 if (!IsSet ( RSYS_COP17))
33883386 rs_COP17 = rs_HSPF < 8
3389- ? 0 .5183f * rs_HSPF - 1.7244
3387+ ? 0 .5183f * rs_HSPF - 1 .7244f
33903388 : 0 .2186f * rs_HSPF + 0 .6734f ;
33913389#elif ASHP_COPREG == 6
33923390 if (rs_IsPkgRoom ())
3393- { rs_COP17 = 0.6870 * rs_COP47;
3391+ { rs_COP17 = 0 .6870f * rs_COP47;
33943392 // rs_cap17 set above
33953393 }
33963394 else if (!rs_IsASHPHydronic ())
@@ -3400,13 +3398,19 @@ RC RSYS::rs_SetupASHP() // set ASHP defaults and derived parameters
34003398 rs_COP47 = 0 .3225f * rs_HSPF + 0 .9099f ;
34013399 if (!IsSet ( RSYS_COP17))
34023400 { rs_COP17 = 0 .2186f * rs_HSPF + 0 .6734f ;
3403- RC rc1 = rs_HSPFMatchASHP (); // adjust COP17 to be
3404- // consistent with rs_HSPF
3405- if (rc1 != RCOK // if fail
3406- || (!rs_isAuszH && rs_COP17 > rs_COP47)) // or unreasonable
3407- // (allow during ausz)
3408- rc = err ( " RSYS '%s': No reasonable value found for rsCOP17."
3409- " \n Check rsHSPF and other heating inputs." , name);
3401+ int iTry;
3402+ RC rc1;
3403+ const int nTry = 40 ;
3404+ for (iTry=0 ; iTry<nTry; iTry++)
3405+ { rc1 = rs_HSPFMatchASHP (); // adjust COP17 to be
3406+ // consistent with rs_HSPF
3407+ if (rc1 || rs_COP17 < rs_COP47 || IsSet ( RSYS_COP47))
3408+ break ; // accept rs_COP17 if < rs_COP47 or rs_COP47 is fixed
3409+ rs_COP47 += 0 .1f ; // try again with higher rs_COP47
3410+ }
3411+ if ((rc1 || iTry==nTry) && !rs_isAuszH)
3412+ rc |= err (" RSYS '%s': No reasonable value found for rsCOP17 and/or rsCOP47."
3413+ " \n Check rsHSPF and other heating inputs." , name);
34103414 }
34113415 }
34123416
@@ -3472,6 +3476,7 @@ float RSYS::rs_Inp35Default( // default 35 F input power
34723476 return inp35;
34733477} // RSYS::rs_Inp35Default
34743478// -----------------------------------------------------------------------------
3479+ #if 0
34753480float RSYS::rs_RunFAdjustedEffHtASHP()
34763481{
34773482 float effHt;
@@ -3489,6 +3494,7 @@ float RSYS::rs_RunFAdjustedEffHtASHP()
34893494 }
34903495 return effHt;
34913496} // RSYS::rs_RunFAdjustedEffHtASHP
3497+ #endif
34923498// -----------------------------------------------------------------------------
34933499RC RSYS::rs_CalcInputsAndSlopesASHP ()
34943500// uses: rs_cap/COP 47/17
@@ -3525,19 +3531,18 @@ RC RSYS::rs_CalcInputsAndSlopesASHP()
35253531 rs_COPMin17 = rs_COP17;
35263532
35273533 float inpMin47 = capMin47 / max (rs_COPMin47, .1f );
3528-
3534+ float inpMin17 = capMin17 / max (rs_COPMin17, .1f );
3535+
35293536 float inpMin35;
35303537 if (!IsSet (RSYS_COPMIN35))
3531- { inpMin35 = rs_Inp35Default (inp47, inp17 );
3538+ { inpMin35 = rs_Inp35Default (inpMin47, inpMin17 );
35323539 rs_COPMin35 = capMin35 / max (inpMin35, .1f );
35333540 }
35343541 else
35353542 inpMin35 = capMin35 / max (rs_COPMin35, .1f );
3536- float inpMin17 = capMin17 / max (rs_COPMin17, .1f );
35373543
35383544 rs_ASHPInpMinF[0 ] = (inpMin47 - inpMin17) / (47 .f - 17 .f );
3539- rs_ASHPInpMinF[1 ] = (inpMin35 - inpMin17) / (35 .f - 17 .f );
3540-
3545+ rs_ASHPInpMinF[1 ] = (inpMin35 - inpMin17) / (35 .f - 17 .f );
35413546 }
35423547
35433548 return RCOK;
@@ -3905,7 +3910,7 @@ int RSYS::rs_IsModeAvailable(
39053910 // set mode-specific air flow
39063911 rs_amf = rsMode == rsmHEAT ? rs_amfH
39073912 : rsMode == rsmCOOL ? rs_amfC
3908- : rsMode == rsmOAV ? rs_amfOAV
3913+ : rsMode == rsmOAV ? rs_amfOAV
39093914 : 0 .;
39103915 if (rs_amf < .0001 )
39113916 ret = -1 ; // no air available
@@ -4030,8 +4035,7 @@ int RSYS::rs_SupplyAirState( // current conditioning capabilities
40304035 else if (rs_mode == rsmHEAT)
40314036 { rs_asOut = rs_asIn; // init to entering state
40324037 if (auszMode == rsmHEAT && Top.tp_pass1A )
4033- {
4034- // autosize warmup: assume fixed temp rise
4038+ { // autosize warmup: assume fixed temp rise
40354039 rs_asOut.as_tdb = rs_asRet.as_tdb + rs_tdDesH;
40364040 rs_effHt = 1 .; // need nz value, else ASHP assumes compressor off
40374041 }
@@ -4426,13 +4430,13 @@ RC RSYS::rs_FinalizeSh()
44264430 rs_PLF = 1 .f - rs_CdH * (1 .f - runFx);
44274431 rs_COPHtAdj = rs_inpHtMin <= 0 .f
44284432 ? 2 .5f // rs_inpHtMin can be 0 during autosize
4429- : rs_capHtMin * rs_PLF / rs_inpHtMin;
4433+ : rs_FEffH * rs_capHtMin * rs_PLF / rs_inpHtMin;
44304434 rs_inPrimary = rs_capHtMin / rs_COPHtAdj;
44314435 }
44324436 else
44334437 { // variable capacity: intermediate speed
44344438 float runFx = (rs_runF - rs_runFMin) / (1 .f - rs_runFMin);
4435- rs_inPrimary = rs_inpHt * runFx + rs_inpHtMin * (1 .f - runFx);
4439+ rs_inPrimary = ( rs_inpHt * runFx + rs_inpHtMin * (1 .f - runFx)) / rs_FEffH ;
44364440 rs_COPHtAdj = rs_inPrimary <= 0 .f
44374441 ? 2 .5f // rs_inPrimary can be 0 during autosize
44384442 : rs_outSen / rs_inPrimary;
0 commit comments