@@ -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 ( " \n wkt_whUse = 0" );
923+ else if (qRWHWt > 0 .f )
924+ printf (" \n What?" );
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 ( " \n DHWSYS '%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 ( " \n DHWSYS '%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