From 12119888320f458f5c52bb28effb657f07c7ef77 Mon Sep 17 00:00:00 2001 From: chip barnaby Date: Tue, 8 Jan 2019 15:21:25 -0500 Subject: [PATCH 1/2] DWHR calc refinements Added wr_dTDrain --- src/CNCULT.CPP | 3 +- src/CNRECS.DEF | 5 +++ src/DHWCalc.cpp | 90 +++++++++++++++++++++++-------------------------- 3 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/CNCULT.CPP b/src/CNCULT.CPP index a3d081e32..c9ef47661 100644 --- a/src/CNCULT.CPP +++ b/src/CNCULT.CPP @@ -1832,7 +1832,8 @@ CULT( "wrDHWSYS", DAT, DHWHEATREC_OWNTI, NO_INP|RDFLIN,0,0, TYREF, &WSiB, CULT( "wrMult", DAT, DHWHEATREC_MULT, 0, 0, VEOI, TYSI, 0, 1, N, N), CULT( "wrType", DAT, DHWHEATREC_TYPE, 0, 0, VEOI, TYCH, 0, C_DWHRTYCH_VERT, N, N), CULT( "wrConfig", DAT, DHWHEATREC_CONFIG, 0, 0, VEOI, TYCH, 0, C_DWHRCFGCH_EQUAL, N, N), -CULT( "wrCSARatedEF",DAT, DHWHEATREC_EFFRATED, RQD, 0, VHRLY, TYFL, 0, .5f, N, N), +CULT( "wrCSARatedEF",DAT, DHWHEATREC_EFFRATED,RQD, 0, VHRLY, TYFL, 0, .5f, N, N), +CULT( "wrDTDrain", DAT, DHWHEATREC_DTDRAIN, 0, 0, VHRLY, TYFL, 0, 4.6f, N, N), CULT( "wrFxServed", DAT, DHWHEATREC_FXSERVED,0, 0, VEOI, TYSI, 0, 1, N, N), CULT( "wrHWEndUse", DAT, DHWHEATREC_HWENDUSE,0, 0, VEOI, TYCH, 0, C_DHWEUCH_SHOWER, N, N), CULT( "endDHWHEATREC", ENDER, 0, 0, 0, 0, 0, 0, 0, N, N), diff --git a/src/CNRECS.DEF b/src/CNRECS.DEF index 0c71f7fa6..651abffa2 100644 --- a/src/CNRECS.DEF +++ b/src/CNRECS.DEF @@ -3327,6 +3327,8 @@ RECORD DHWSYS "DHWSys" *RAT // input / runtime DHW system *declare "DHWMTR* ws_pWHhwMtr; DHWMTR* ws_pFXhwMtr;" // resolved DHWMTR pointers // mixed and hot water use for this DHWSYS (w/o ws_mult) + *h *e FLOAT ws_whUseNoHR; // current hour virtual hot water use w/o heat recovery, gal + // re verification / accounting of DWHR results *h *e *nest DHWMTR_IVL ws_fxUseMix // current hour total (mixed) water use at fixtures, gal *h *nest DHWMTR_IVL ws_fxUseMixLH // prior hour total (mixed) water use at fixtures, gal *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 *h FRAC wr_effRated // rated effectiveness (generally CSA rating value) + *h FLOAT wr_dTDrain // water temp drop from fixture use to drain, F + // td = tUse - dTDrain; default = 4.6 F + *s *e FLOAT wr_eff // effectiveness under current conditions *r FLOAT wr_fWeight // weighting factor for results diff --git a/src/DHWCalc.cpp b/src/DHWCalc.cpp index 00c910f44..30bc68746 100644 --- a/src/DHWCalc.cpp +++ b/src/DHWCalc.cpp @@ -683,14 +683,18 @@ RC DHWSYS::ws_DoHour( // hourly calcs // wdu_DoHour accums add'l DHWDAYUSE draws to these values ws_fxUseMix.wmt_AccumEU( 0, hwUseX); ws_whUse.wmt_AccumEU( 0, hwUseX); + ws_whUseNoHR = ws_whUse.total; DHWDAYUSE* pWDU = WduR.GetAtSafe( ws_dayUsei); // ref'd DHWDAYUSE can vary daily if (pWDU) { // accumulation DHWDAYUSE input to tick bins and total use rc |= pWDU->wdu_DoHour( this); // accum DAYUSEs + ws_whUseNoHR = ws_whUse.total; // more added in ws_DoDWHR() if (ws_wrCount && ws_iTk0DWHR < ws_iTkNDWHR) rc |= ws_DoDWHR(); // modify tick values re DWHR } + else + ws_whUseNoHR = ws_whUse.total; if (!ws_HasCentralDHWSYS()) { DHWSYS* pWSChild; @@ -700,11 +704,6 @@ RC DHWSYS::ws_DoHour( // hourly calcs } } -#if 0 - ws_fxUseMix.wmt_Finalize(); - ws_whUse.wmt_Finalize(); -#endif - #if defined( _DEBUG) // check: compare tick totals to full hour values float whUseSum = 0.f; @@ -855,21 +854,24 @@ RC DHWSYS::ws_DoDWHR() { RC rc = RCOK; +#if 0 + if (Top.jDay == 91 && Top.iHr == 20) + printf( "\nHit"); +#endif + // loop ticks that could include DWHR draws // ws_qDWHR = 0.f; ... in ws_DoHour double qRWHSum = 0.; - double whUseTot = 0.; // hour total hot water use, gal - double whUseTotNoHR = 0.; // check value: hour total hot water use w/o HR, gal - double tHotFXAvg = 0.; + // ws_whUseNoHR = 0.; // check value: hour total hot water use w/o HR, gal + // init'd by caller int nTk = Top.tp_NHrTicks(); - int nWarmup = 0; for (int iTk=0; iTk < nTk; iTk++) { DHWTICK& tk = ws_ticks[ iTk]; - whUseTot += tk.wtk_whUse; // total use not including draws possibly modified by HR - whUseTotNoHR += tk.wtk_whUse; int nD = tk.wtk_dwhrDraws.size(); +#if 0 if (nD == 0) continue; +#endif #if 0 if (nD > 1) printf( "\nMultiple draws"); @@ -886,33 +888,30 @@ RC DHWSYS::ws_DoDWHR() { DWHRUSE& hru = tk.wtk_dwhrDraws[ iD]; const DHWUSE* pWU = hru.wdw_pDHWUSE; fxUseMix += hru.wdw_vol; - float fFullTemp = hru.wdw_volHR / hru.wdw_vol; - if (fFullTemp < 1.f) - nWarmup++; float fHotNoHR; pWU->wu_CalcHotF( ws_tUse, ws_tInlet, fHotNoHR); - whUseTotNoHR += hru.wdw_vol * fHotNoHR; + ws_whUseNoHR += hru.wdw_vol * fHotNoHR; float fWeightTot = 0.f; DHWHEATREC* pWR; RLUPC( WrR, pWR, pWR->ownTi == ss) - { float fWeightAdj = pWR->wr_fWeight * fFullTemp; + { // weight=what fraction of this DHWHEATREC contributes + // wr_fWeight based on # showers etc + // adjust for warmup delay via volHR/vol + float fWeightAdj = pWR->wr_fWeight * hru.wdw_volHR / hru.wdw_vol; if (fWeightAdj < .0001f) continue; // no effect (duplicate, mult=0, ...) -#if 0 - if (fFullTemp > 0.f && fFullTemp < 1.f) - printf( "\nPartial '%s'", name); -#endif - // float tHotFX = fFullTemp*ws_tUse + (1.f - fFullTemp)*ws_tInlet; - float tHotFX = ws_tUse; float qR, qRWH; - float whUse = pWR->wr_CalcTick( hru.wdw_vol, pWU->wu_temp, tHotFX, ws_tInlet, + float whUse = pWR->wr_CalcTick( hru.wdw_vol, pWU->wu_temp, ws_tUse, ws_tInlet, tk.wtk_whUse, qR, qRWH); +#if 0 + if (pWR->wr_eff < 0.65f) + printf( "\nEff = %0.3f", pWR->wr_eff); +#endif fWeightTot += fWeightAdj; whUseWt += whUse * fWeightAdj; qRWt += qR * fWeightAdj; qRWHWt += qRWH * fWeightAdj; - tHotFXAvg += whUse * tHotFX * fWeightAdj; - } + } // end heat recovery loop if (fWeightTot < .9999f) whUseWt += (1.f - fWeightTot) * hru.wdw_vol * fHotNoHR; // not right for partial? } // end draw loop @@ -921,32 +920,31 @@ RC DHWSYS::ws_DoDWHR() float tO = ws_tInlet; if (tk.wtk_whUse > 0.) tO += qRWHWt / (waterRhoCp * tk.wtk_whUse); - else - printf( "\nwkt_whUse = 0"); + else if (qRWHWt > 0.f) + printf("\nWhat?"); + tk.wtk_tInletX = ws_AdjustTInletForSSF( tO); - whUseTot += whUseWt; // hour total hot water at heater qRWHSum += qRWHWt; ws_qDWHR += qRWt; // accum to hour total heat recovered } // end tick +#if 0 && defined( _DEBUG) + if (frDiff( float( whUseTot), ws_whUse.total, .001f) > .001f) + printf( "\nMismatch!"); +#endif + // calc hour average adjusted inlet and hot water temps float tInletXNoSSF = ws_tInlet; if (qRWHSum > 0.) - { tInletXNoSSF = ws_tInlet + qRWHSum / (waterRhoCp * whUseTot); + { tInletXNoSSF = ws_tInlet + qRWHSum / (waterRhoCp * ws_whUse.total); ws_tInletX = ws_AdjustTInletForSSF( tInletXNoSSF); } - tHotFXAvg /= whUseTot; #if defined( _DEBUG) - float qXNoHR = whUseTotNoHR * waterRhoCp * (ws_tUse - ws_tInlet); - float qX = whUseTot * waterRhoCp * (ws_tUse - tInletXNoSSF); - float qXR = qXNoHR - qX; - if (frDiff(ws_qDWHR, qXR, .01f) > .001f) - printf( "\nDHWSYS '%s': ws_DoDHWR balance error (nWarmup=%d)", name, nWarmup); -#if 0 - else if (nWarmup > 0) - printf( "\nDHWSYS '%s': ws_DHWR nWarmup=%d", name, nWarmup); -#endif + float qXNoHR = ws_whUseNoHR * waterRhoCp * (ws_tUse - ws_tInlet); + float qX = ws_whUse.total * waterRhoCp * (ws_tUse - tInletXNoSSF); + if (frDiff(qX+ws_qDWHR, qXNoHR, 1.f) > .001f) + printf( "\nDHWSYS '%s': ws_DoDHWR balance error", name); #endif return rc; @@ -2374,7 +2372,9 @@ int DHWHEATREC::wr_IsEquiv( && wr_fxServed == wr_fxServed && wr_hwEndUse == wr.wr_hwEndUse // future proof && !ISNANDLE( wr_effRated) && !ISNANDLE( wr.wr_effRated) - && wr_effRated == wr.wr_effRated; + && wr_effRated == wr.wr_effRated + && !ISNANDLE( wr_dTDrain) && !ISNANDLE( wr.wr_dTDrain) + && wr_dTDrain == wr.wr_dTDrain; return bEquiv; } // DHWHEATREC::wr_IsEquiv @@ -2392,16 +2392,10 @@ float DHWHEATREC::wr_CalcTick( // calculate water quantities for tick // returns hot water use at WH, gal { -#if 0 - float vd = DWHRUse.wdw_volHR; // useful drain vol = fixture hot vol, gal - - const DHWUSE* pWU = DWHRUse.wdw_pDHWUSE; - float td = pWU->wu_temp; // drain temp = fixture mix temp -#endif - float vp, whUse, tpO; - float td = min( tUseFX, tHotFX); // drain water temp + // drain water temp + float td = max( tpI, min( tUseFX, tHotFX) - wr_dTDrain); if (wr_FeedsFX()) { // HX feeds fixture and possibly WH From e6bbf1e80734406707be0ffe84bd50d45aafb5fa Mon Sep 17 00:00:00 2001 From: chip barnaby Date: Tue, 8 Jan 2019 15:32:46 -0500 Subject: [PATCH 2/2] DWHR cleanup --- src/CNRECS.DEF | 4 ++-- src/DHWCalc.cpp | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/CNRECS.DEF b/src/CNRECS.DEF index 651abffa2..cc757c823 100644 --- a/src/CNRECS.DEF +++ b/src/CNRECS.DEF @@ -3584,8 +3584,8 @@ RECORD DHWHEATREC "DHWHeatRec" *RAT // input / runtime drain water heat recovery *h FRAC wr_effRated // rated effectiveness (generally CSA rating value) - *h FLOAT wr_dTDrain // water temp drop from fixture use to drain, F - // td = tUse - dTDrain; default = 4.6 F + *h FLOAT wr_dTDrain // water temp drop from fixture mixed temp to drain, F + // td = tFxMix - dTDrain; default = 4.6 F *s *e FLOAT wr_eff // effectiveness under current conditions diff --git a/src/DHWCalc.cpp b/src/DHWCalc.cpp index 30bc68746..834849945 100644 --- a/src/DHWCalc.cpp +++ b/src/DHWCalc.cpp @@ -683,7 +683,6 @@ RC DHWSYS::ws_DoHour( // hourly calcs // wdu_DoHour accums add'l DHWDAYUSE draws to these values ws_fxUseMix.wmt_AccumEU( 0, hwUseX); ws_whUse.wmt_AccumEU( 0, hwUseX); - ws_whUseNoHR = ws_whUse.total; DHWDAYUSE* pWDU = WduR.GetAtSafe( ws_dayUsei); // ref'd DHWDAYUSE can vary daily if (pWDU) @@ -704,6 +703,8 @@ RC DHWSYS::ws_DoHour( // hourly calcs } } + // ws_whUseNoHR ?? + #if defined( _DEBUG) // check: compare tick totals to full hour values float whUseSum = 0.f;