Skip to content

Commit 3fdd8cd

Browse files
authored
Merge pull request #47 from cse-sim/DWHR2
DWHR refinements; add wr_dTDrain
2 parents 63b1703 + e6bbf1e commit 3fdd8cd

File tree

3 files changed

+49
-48
lines changed

3 files changed

+49
-48
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 mixed temp to drain, F
3588+
// td = tFxMix - 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 & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -688,9 +688,12 @@ RC DHWSYS::ws_DoHour( // hourly calcs
688688
if (pWDU)
689689
{ // accumulation DHWDAYUSE input to tick bins and total use
690690
rc |= pWDU->wdu_DoHour( this); // accum DAYUSEs
691+
ws_whUseNoHR = ws_whUse.total; // more added in ws_DoDWHR()
691692
if (ws_wrCount && ws_iTk0DWHR < ws_iTkNDWHR)
692693
rc |= ws_DoDWHR(); // modify tick values re DWHR
693694
}
695+
else
696+
ws_whUseNoHR = ws_whUse.total;
694697

695698
if (!ws_HasCentralDHWSYS())
696699
{ DHWSYS* pWSChild;
@@ -700,10 +703,7 @@ RC DHWSYS::ws_DoHour( // hourly calcs
700703
}
701704
}
702705

703-
#if 0
704-
ws_fxUseMix.wmt_Finalize();
705-
ws_whUse.wmt_Finalize();
706-
#endif
706+
// ws_whUseNoHR ??
707707

708708
#if defined( _DEBUG)
709709
// check: compare tick totals to full hour values
@@ -855,21 +855,24 @@ RC DHWSYS::ws_DoDWHR()
855855
{
856856
RC rc = RCOK;
857857

858+
#if 0
859+
if (Top.jDay == 91 && Top.iHr == 20)
860+
printf( "\nHit");
861+
#endif
862+
858863
// loop ticks that could include DWHR draws
859864
// ws_qDWHR = 0.f; ... in ws_DoHour
860865
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.;
866+
// ws_whUseNoHR = 0.; // check value: hour total hot water use w/o HR, gal
867+
// init'd by caller
864868
int nTk = Top.tp_NHrTicks();
865-
int nWarmup = 0;
866869
for (int iTk=0; iTk < nTk; iTk++)
867870
{ DHWTICK& tk = ws_ticks[ iTk];
868-
whUseTot += tk.wtk_whUse; // total use not including draws possibly modified by HR
869-
whUseTotNoHR += tk.wtk_whUse;
870871
int nD = tk.wtk_dwhrDraws.size();
872+
#if 0
871873
if (nD == 0)
872874
continue;
875+
#endif
873876
#if 0
874877
if (nD > 1)
875878
printf( "\nMultiple draws");
@@ -886,33 +889,30 @@ RC DHWSYS::ws_DoDWHR()
886889
{ DWHRUSE& hru = tk.wtk_dwhrDraws[ iD];
887890
const DHWUSE* pWU = hru.wdw_pDHWUSE;
888891
fxUseMix += hru.wdw_vol;
889-
float fFullTemp = hru.wdw_volHR / hru.wdw_vol;
890-
if (fFullTemp < 1.f)
891-
nWarmup++;
892892
float fHotNoHR;
893893
pWU->wu_CalcHotF( ws_tUse, ws_tInlet, fHotNoHR);
894-
whUseTotNoHR += hru.wdw_vol * fHotNoHR;
894+
ws_whUseNoHR += hru.wdw_vol * fHotNoHR;
895895
float fWeightTot = 0.f;
896896
DHWHEATREC* pWR;
897897
RLUPC( WrR, pWR, pWR->ownTi == ss)
898-
{ float fWeightAdj = pWR->wr_fWeight * fFullTemp;
898+
{ // weight=what fraction of this DHWHEATREC contributes
899+
// wr_fWeight based on # showers etc
900+
// adjust for warmup delay via volHR/vol
901+
float fWeightAdj = pWR->wr_fWeight * hru.wdw_volHR / hru.wdw_vol;
899902
if (fWeightAdj < .0001f)
900903
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;
907904
float qR, qRWH;
908-
float whUse = pWR->wr_CalcTick( hru.wdw_vol, pWU->wu_temp, tHotFX, ws_tInlet,
905+
float whUse = pWR->wr_CalcTick( hru.wdw_vol, pWU->wu_temp, ws_tUse, ws_tInlet,
909906
tk.wtk_whUse, qR, qRWH);
907+
#if 0
908+
if (pWR->wr_eff < 0.65f)
909+
printf( "\nEff = %0.3f", pWR->wr_eff);
910+
#endif
910911
fWeightTot += fWeightAdj;
911912
whUseWt += whUse * fWeightAdj;
912913
qRWt += qR * fWeightAdj;
913914
qRWHWt += qRWH * fWeightAdj;
914-
tHotFXAvg += whUse * tHotFX * fWeightAdj;
915-
}
915+
} // end heat recovery loop
916916
if (fWeightTot < .9999f)
917917
whUseWt += (1.f - fWeightTot) * hru.wdw_vol * fHotNoHR; // not right for partial?
918918
} // end draw loop
@@ -921,32 +921,31 @@ RC DHWSYS::ws_DoDWHR()
921921
float tO = ws_tInlet;
922922
if (tk.wtk_whUse > 0.)
923923
tO += qRWHWt / (waterRhoCp * tk.wtk_whUse);
924-
else
925-
printf( "\nwkt_whUse = 0");
924+
else if (qRWHWt > 0.f)
925+
printf("\nWhat?");
926+
926927
tk.wtk_tInletX = ws_AdjustTInletForSSF( tO);
927-
whUseTot += whUseWt; // hour total hot water at heater
928928
qRWHSum += qRWHWt;
929929
ws_qDWHR += qRWt; // accum to hour total heat recovered
930930
} // end tick
931931

932+
#if 0 && defined( _DEBUG)
933+
if (frDiff( float( whUseTot), ws_whUse.total, .001f) > .001f)
934+
printf( "\nMismatch!");
935+
#endif
936+
932937
// calc hour average adjusted inlet and hot water temps
933938
float tInletXNoSSF = ws_tInlet;
934939
if (qRWHSum > 0.)
935-
{ tInletXNoSSF = ws_tInlet + qRWHSum / (waterRhoCp * whUseTot);
940+
{ tInletXNoSSF = ws_tInlet + qRWHSum / (waterRhoCp * ws_whUse.total);
936941
ws_tInletX = ws_AdjustTInletForSSF( tInletXNoSSF);
937942
}
938-
tHotFXAvg /= whUseTot;
939943

940944
#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
945+
float qXNoHR = ws_whUseNoHR * waterRhoCp * (ws_tUse - ws_tInlet);
946+
float qX = ws_whUse.total * waterRhoCp * (ws_tUse - tInletXNoSSF);
947+
if (frDiff(qX+ws_qDWHR, qXNoHR, 1.f) > .001f)
948+
printf( "\nDHWSYS '%s': ws_DoDHWR balance error", name);
950949
#endif
951950

952951
return rc;
@@ -2374,7 +2373,9 @@ int DHWHEATREC::wr_IsEquiv(
23742373
&& wr_fxServed == wr_fxServed
23752374
&& wr_hwEndUse == wr.wr_hwEndUse // future proof
23762375
&& !ISNANDLE( wr_effRated) && !ISNANDLE( wr.wr_effRated)
2377-
&& wr_effRated == wr.wr_effRated;
2376+
&& wr_effRated == wr.wr_effRated
2377+
&& !ISNANDLE( wr_dTDrain) && !ISNANDLE( wr.wr_dTDrain)
2378+
&& wr_dTDrain == wr.wr_dTDrain;
23782379

23792380
return bEquiv;
23802381
} // DHWHEATREC::wr_IsEquiv
@@ -2392,16 +2393,10 @@ float DHWHEATREC::wr_CalcTick( // calculate water quantities for tick
23922393
// returns hot water use at WH, gal
23932394

23942395
{
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-
24022396
float vp, whUse, tpO;
24032397

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

24062401
if (wr_FeedsFX())
24072402
{ // HX feeds fixture and possibly WH

0 commit comments

Comments
 (0)