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