Skip to content

Commit 1211988

Browse files
committed
DWHR calc refinements
Added wr_dTDrain
1 parent 63b1703 commit 1211988

File tree

3 files changed

+49
-49
lines changed

3 files changed

+49
-49
lines changed

src/CNCULT.CPP

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1832,7 +1832,8 @@ CULT( "wrDHWSYS", DAT, DHWHEATREC_OWNTI, NO_INP|RDFLIN,0,0, TYREF, &WSiB,
18321832
CULT( "wrMult", DAT, DHWHEATREC_MULT, 0, 0, VEOI, TYSI, 0, 1, N, N),
18331833
CULT( "wrType", DAT, DHWHEATREC_TYPE, 0, 0, VEOI, TYCH, 0, C_DWHRTYCH_VERT, N, N),
18341834
CULT( "wrConfig", DAT, DHWHEATREC_CONFIG, 0, 0, VEOI, TYCH, 0, C_DWHRCFGCH_EQUAL, N, N),
1835-
CULT( "wrCSARatedEF",DAT, DHWHEATREC_EFFRATED, RQD, 0, VHRLY, TYFL, 0, .5f, N, N),
1835+
CULT( "wrCSARatedEF",DAT, DHWHEATREC_EFFRATED,RQD, 0, VHRLY, TYFL, 0, .5f, N, N),
1836+
CULT( "wrDTDrain", DAT, DHWHEATREC_DTDRAIN, 0, 0, VHRLY, TYFL, 0, 4.6f, N, N),
18361837
CULT( "wrFxServed", DAT, DHWHEATREC_FXSERVED,0, 0, VEOI, TYSI, 0, 1, N, N),
18371838
CULT( "wrHWEndUse", DAT, DHWHEATREC_HWENDUSE,0, 0, VEOI, TYCH, 0, C_DHWEUCH_SHOWER, N, N),
18381839
CULT( "endDHWHEATREC", ENDER, 0, 0, 0, 0, 0, 0, 0, N, N),

src/CNRECS.DEF

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3327,6 +3327,8 @@ RECORD DHWSYS "DHWSys" *RAT // input / runtime DHW system
33273327
*declare "DHWMTR* ws_pWHhwMtr; DHWMTR* ws_pFXhwMtr;" // resolved DHWMTR pointers
33283328

33293329
// mixed and hot water use for this DHWSYS (w/o ws_mult)
3330+
*h *e FLOAT ws_whUseNoHR; // current hour virtual hot water use w/o heat recovery, gal
3331+
// re verification / accounting of DWHR results
33303332
*h *e *nest DHWMTR_IVL ws_fxUseMix // current hour total (mixed) water use at fixtures, gal
33313333
*h *nest DHWMTR_IVL ws_fxUseMixLH // prior hour total (mixed) water use at fixtures, gal
33323334
*h *e *nest DHWMTR_IVL ws_whUse // current hour hot water use (at ws_tUse), gal
@@ -3582,6 +3584,9 @@ RECORD DHWHEATREC "DHWHeatRec" *RAT // input / runtime drain water heat recovery
35823584

35833585
*h FRAC wr_effRated // rated effectiveness (generally CSA rating value)
35843586

3587+
*h FLOAT wr_dTDrain // water temp drop from fixture use to drain, F
3588+
// td = tUse - dTDrain; default = 4.6 F
3589+
35853590
*s *e FLOAT wr_eff // effectiveness under current conditions
35863591

35873592
*r FLOAT wr_fWeight // weighting factor for results

src/DHWCalc.cpp

Lines changed: 42 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -683,14 +683,18 @@ RC DHWSYS::ws_DoHour( // hourly calcs
683683
// wdu_DoHour accums add'l DHWDAYUSE draws to these values
684684
ws_fxUseMix.wmt_AccumEU( 0, hwUseX);
685685
ws_whUse.wmt_AccumEU( 0, hwUseX);
686+
ws_whUseNoHR = ws_whUse.total;
686687

687688
DHWDAYUSE* pWDU = WduR.GetAtSafe( ws_dayUsei); // ref'd DHWDAYUSE can vary daily
688689
if (pWDU)
689690
{ // accumulation DHWDAYUSE input to tick bins and total use
690691
rc |= pWDU->wdu_DoHour( this); // accum DAYUSEs
692+
ws_whUseNoHR = ws_whUse.total; // more added in ws_DoDWHR()
691693
if (ws_wrCount && ws_iTk0DWHR < ws_iTkNDWHR)
692694
rc |= ws_DoDWHR(); // modify tick values re DWHR
693695
}
696+
else
697+
ws_whUseNoHR = ws_whUse.total;
694698

695699
if (!ws_HasCentralDHWSYS())
696700
{ DHWSYS* pWSChild;
@@ -700,11 +704,6 @@ RC DHWSYS::ws_DoHour( // hourly calcs
700704
}
701705
}
702706

703-
#if 0
704-
ws_fxUseMix.wmt_Finalize();
705-
ws_whUse.wmt_Finalize();
706-
#endif
707-
708707
#if defined( _DEBUG)
709708
// check: compare tick totals to full hour values
710709
float whUseSum = 0.f;
@@ -855,21 +854,24 @@ RC DHWSYS::ws_DoDWHR()
855854
{
856855
RC rc = RCOK;
857856

857+
#if 0
858+
if (Top.jDay == 91 && Top.iHr == 20)
859+
printf( "\nHit");
860+
#endif
861+
858862
// loop ticks that could include DWHR draws
859863
// ws_qDWHR = 0.f; ... in ws_DoHour
860864
double qRWHSum = 0.;
861-
double whUseTot = 0.; // hour total hot water use, gal
862-
double whUseTotNoHR = 0.; // check value: hour total hot water use w/o HR, gal
863-
double tHotFXAvg = 0.;
865+
// ws_whUseNoHR = 0.; // check value: hour total hot water use w/o HR, gal
866+
// init'd by caller
864867
int nTk = Top.tp_NHrTicks();
865-
int nWarmup = 0;
866868
for (int iTk=0; iTk < nTk; iTk++)
867869
{ DHWTICK& tk = ws_ticks[ iTk];
868-
whUseTot += tk.wtk_whUse; // total use not including draws possibly modified by HR
869-
whUseTotNoHR += tk.wtk_whUse;
870870
int nD = tk.wtk_dwhrDraws.size();
871+
#if 0
871872
if (nD == 0)
872873
continue;
874+
#endif
873875
#if 0
874876
if (nD > 1)
875877
printf( "\nMultiple draws");
@@ -886,33 +888,30 @@ RC DHWSYS::ws_DoDWHR()
886888
{ DWHRUSE& hru = tk.wtk_dwhrDraws[ iD];
887889
const DHWUSE* pWU = hru.wdw_pDHWUSE;
888890
fxUseMix += hru.wdw_vol;
889-
float fFullTemp = hru.wdw_volHR / hru.wdw_vol;
890-
if (fFullTemp < 1.f)
891-
nWarmup++;
892891
float fHotNoHR;
893892
pWU->wu_CalcHotF( ws_tUse, ws_tInlet, fHotNoHR);
894-
whUseTotNoHR += hru.wdw_vol * fHotNoHR;
893+
ws_whUseNoHR += hru.wdw_vol * fHotNoHR;
895894
float fWeightTot = 0.f;
896895
DHWHEATREC* pWR;
897896
RLUPC( WrR, pWR, pWR->ownTi == ss)
898-
{ float fWeightAdj = pWR->wr_fWeight * fFullTemp;
897+
{ // weight=what fraction of this DHWHEATREC contributes
898+
// wr_fWeight based on # showers etc
899+
// adjust for warmup delay via volHR/vol
900+
float fWeightAdj = pWR->wr_fWeight * hru.wdw_volHR / hru.wdw_vol;
899901
if (fWeightAdj < .0001f)
900902
continue; // no effect (duplicate, mult=0, ...)
901-
#if 0
902-
if (fFullTemp > 0.f && fFullTemp < 1.f)
903-
printf( "\nPartial '%s'", name);
904-
#endif
905-
// float tHotFX = fFullTemp*ws_tUse + (1.f - fFullTemp)*ws_tInlet;
906-
float tHotFX = ws_tUse;
907903
float qR, qRWH;
908-
float whUse = pWR->wr_CalcTick( hru.wdw_vol, pWU->wu_temp, tHotFX, ws_tInlet,
904+
float whUse = pWR->wr_CalcTick( hru.wdw_vol, pWU->wu_temp, ws_tUse, ws_tInlet,
909905
tk.wtk_whUse, qR, qRWH);
906+
#if 0
907+
if (pWR->wr_eff < 0.65f)
908+
printf( "\nEff = %0.3f", pWR->wr_eff);
909+
#endif
910910
fWeightTot += fWeightAdj;
911911
whUseWt += whUse * fWeightAdj;
912912
qRWt += qR * fWeightAdj;
913913
qRWHWt += qRWH * fWeightAdj;
914-
tHotFXAvg += whUse * tHotFX * fWeightAdj;
915-
}
914+
} // end heat recovery loop
916915
if (fWeightTot < .9999f)
917916
whUseWt += (1.f - fWeightTot) * hru.wdw_vol * fHotNoHR; // not right for partial?
918917
} // end draw loop
@@ -921,32 +920,31 @@ RC DHWSYS::ws_DoDWHR()
921920
float tO = ws_tInlet;
922921
if (tk.wtk_whUse > 0.)
923922
tO += qRWHWt / (waterRhoCp * tk.wtk_whUse);
924-
else
925-
printf( "\nwkt_whUse = 0");
923+
else if (qRWHWt > 0.f)
924+
printf("\nWhat?");
925+
926926
tk.wtk_tInletX = ws_AdjustTInletForSSF( tO);
927-
whUseTot += whUseWt; // hour total hot water at heater
928927
qRWHSum += qRWHWt;
929928
ws_qDWHR += qRWt; // accum to hour total heat recovered
930929
} // end tick
931930

931+
#if 0 && defined( _DEBUG)
932+
if (frDiff( float( whUseTot), ws_whUse.total, .001f) > .001f)
933+
printf( "\nMismatch!");
934+
#endif
935+
932936
// calc hour average adjusted inlet and hot water temps
933937
float tInletXNoSSF = ws_tInlet;
934938
if (qRWHSum > 0.)
935-
{ tInletXNoSSF = ws_tInlet + qRWHSum / (waterRhoCp * whUseTot);
939+
{ tInletXNoSSF = ws_tInlet + qRWHSum / (waterRhoCp * ws_whUse.total);
936940
ws_tInletX = ws_AdjustTInletForSSF( tInletXNoSSF);
937941
}
938-
tHotFXAvg /= whUseTot;
939942

940943
#if defined( _DEBUG)
941-
float qXNoHR = whUseTotNoHR * waterRhoCp * (ws_tUse - ws_tInlet);
942-
float qX = whUseTot * waterRhoCp * (ws_tUse - tInletXNoSSF);
943-
float qXR = qXNoHR - qX;
944-
if (frDiff(ws_qDWHR, qXR, .01f) > .001f)
945-
printf( "\nDHWSYS '%s': ws_DoDHWR balance error (nWarmup=%d)", name, nWarmup);
946-
#if 0
947-
else if (nWarmup > 0)
948-
printf( "\nDHWSYS '%s': ws_DHWR nWarmup=%d", name, nWarmup);
949-
#endif
944+
float qXNoHR = ws_whUseNoHR * waterRhoCp * (ws_tUse - ws_tInlet);
945+
float qX = ws_whUse.total * waterRhoCp * (ws_tUse - tInletXNoSSF);
946+
if (frDiff(qX+ws_qDWHR, qXNoHR, 1.f) > .001f)
947+
printf( "\nDHWSYS '%s': ws_DoDHWR balance error", name);
950948
#endif
951949

952950
return rc;
@@ -2374,7 +2372,9 @@ int DHWHEATREC::wr_IsEquiv(
23742372
&& wr_fxServed == wr_fxServed
23752373
&& wr_hwEndUse == wr.wr_hwEndUse // future proof
23762374
&& !ISNANDLE( wr_effRated) && !ISNANDLE( wr.wr_effRated)
2377-
&& wr_effRated == wr.wr_effRated;
2375+
&& wr_effRated == wr.wr_effRated
2376+
&& !ISNANDLE( wr_dTDrain) && !ISNANDLE( wr.wr_dTDrain)
2377+
&& wr_dTDrain == wr.wr_dTDrain;
23782378

23792379
return bEquiv;
23802380
} // DHWHEATREC::wr_IsEquiv
@@ -2392,16 +2392,10 @@ float DHWHEATREC::wr_CalcTick( // calculate water quantities for tick
23922392
// returns hot water use at WH, gal
23932393

23942394
{
2395-
#if 0
2396-
float vd = DWHRUse.wdw_volHR; // useful drain vol = fixture hot vol, gal
2397-
2398-
const DHWUSE* pWU = DWHRUse.wdw_pDHWUSE;
2399-
float td = pWU->wu_temp; // drain temp = fixture mix temp
2400-
#endif
2401-
24022395
float vp, whUse, tpO;
24032396

2404-
float td = min( tUseFX, tHotFX); // drain water temp
2397+
// drain water temp
2398+
float td = max( tpI, min( tUseFX, tHotFX) - wr_dTDrain);
24052399

24062400
if (wr_FeedsFX())
24072401
{ // HX feeds fixture and possibly WH

0 commit comments

Comments
 (0)