@@ -334,42 +334,6 @@ void WDHR::wd_Init( // initialize all members
334334 }
335335} // WDHR::wd_Init
336336// ------------------------------------------------------------------------------
337- #if 0
338- void WDHR::wd_ClearDerived( // init derived values
339- int options /*=0*/) // options
340- // 0: init to 0.
341- // 1: init all to "missing" (-999.f)
342- // 2: init all to UNSET
343- {
344- float unsetf;
345- NANDAT unset( UNSET);
346- V unsetf = V unset;
347- int bUnset = ISUNSET( unset);
348- int bUnsetf = ISUNSET( unsetf);
349- float v;
350- if (options == 2)
351- v = unsetf;
352- else
353- v = options==0 ? 0.f : -999.f;
354-
355- wd_taDbPk =
356- wd_taDbAvg =
357- wd_taDbPvPk =
358- wd_taDbAvg01 =
359- wd_taDbAvg07 =
360- wd_taDbAvg14 =
361- wd_taDbAvg31 =
362-
363- wd_tdvElecPk =
364- wd_tdvElecAvg =
365- wd_tdvElecPvPk =
366- wd_tdvElecAvg01 =
367-
368- wd_tGrnd =
369- wd_tMains = v;
370- } // WDHR::wd_ClearDerived
371- #endif
372- // ----------------------------------------------------------------------------
373337WDHR& WDHR::Copy (
374338 const WDHR& wdhr, // source
375339 int options /* =0*/ ) // option bits
@@ -447,6 +411,7 @@ friend WFILE;
447411
448412 // TDV elect statistics
449413 float wdd_tdvElecPk; // peak for cur day
414+ int wdd_tdvElecPkRank; // rank within year of wdd_tdvElecPk (1-366)
450415 float wdd_tdvElecAvg; // avg for cur day
451416 float wdd_tdvElecPvPk; // peak for prior day
452417 float wdd_tdvElecAvg01; // avg for print day
@@ -458,6 +423,11 @@ public:
458423 void wdd_Init ();
459424 int wdd_Compare ( const WDHR* wdHr) const ;
460425 void wdd_Set24 ( WDHR* wdHr, int options=0 ) const ;
426+ static int wdd_TdvPkCompare (const void * p1, const void * p2)
427+ { const WDDAY* pD1 = *(WDDAY **)p1;
428+ const WDDAY* pD2 = *(WDDAY **)p2;
429+ return -1 *LTEQGT ( pD1->wdd_tdvElecPk , pD2->wdd_tdvElecPk );
430+ }
461431}; // class WDDAY
462432// ----------------------------------------------------------------------------
463433struct VHR // sort helper for wdy_Stats
@@ -510,12 +480,8 @@ RC WFILE::wf_FillWDYEAR( // read and unpack weather data for entire file
510480 taDbAvgYr = wf_pWDY->wdy_taDbAvg [ 0 ];
511481 tMainsAvgYr = wf_pWDY->wdy_tMainsAvg [ 0 ];
512482
513- #if 1 // always fill, 3-5-2014
514- int options = 0 ;
515- #else
516- x int options = wFileFormat == CSW; // CSW: fill missing only
517- x // others: fill always
518- #endif
483+ // fill hour values from daily
484+ int options = 0 ; // wdd_Set24: fill always
519485 int yrLen = wf_pWDY->wdy_isLeap ? 366 : 365 ;
520486 int jD;
521487 for (jD=1 ; jD <= yrLen; jD++)
@@ -608,11 +574,14 @@ RC WDYEAR::wdy_Fill( // read weather data for entire file; compute averages etc.
608574 float taDbRngYr // range based on monthly means
609575 = VMax ( wdy_taDbAvg+1 , 12 ) - VMin ( wdy_taDbAvg+1 , 12 );
610576 jDay = 0 ;
577+ WDDAY* wddRank[366 ]; // pointers to days re rank sort
578+ wddRank[365 ] = NULL ; // insurance, unused unless leap year
611579 for (iMon=1 ; iMon<=12 ; iMon++)
612580 { int monLen = monLens[ iMon] + (wdy_isLeap && iMon==2 );
613581 for (iDay=0 ; iDay<monLen; iDay++)
614582 { jDay++;
615583 WDDAY& wdd = wdy_Day ( jDay);
584+ wddRank[ jDay-1 ] = &wdd;
616585 // lagged average dry-bulb temps: values do not include current day
617586 // wdd.wdd_taDbAvg01 = wdy_TaDbAvg( jDay-1, jDay-1) -- see above
618587 wdd.wdd_taDbAvg07 = wdy_TaDbAvg ( jDay-7 , jDay-1 );
@@ -638,6 +607,13 @@ RC WDYEAR::wdy_Fill( // read weather data for entire file; compute averages etc.
638607 }
639608 wdy_tMainsAvg[ 0 ] /= yrLen;
640609
610+ // sort wddRank pointers by decreasing wdd_tdvElecPk
611+ qsort ( wddRank, yrLen, sizeof (const WDDAY*), WDDAY::wdd_TdvPkCompare);
612+
613+ // set wdy_day ranks via now-rank-ordered pointers
614+ for (int i = 1 ; i <= yrLen; i++)
615+ wddRank[ i-1 ]->wdd_tdvElecPkRank = i;
616+
641617 return rc;
642618} // WDYEAR::wdy_Fill
643619// -----------------------------------------------------------------------------
@@ -707,46 +683,21 @@ RC WDYEAR::wdy_TransferHr( // transfer cached data to application
707683 // Ignored if WF_DSNDAY|WF_FORCEDREAD
708684{
709685 pwd->Copy ( wdy_Hr ( jDay, iHr), (erOp&WF_SAVESLRGEOM) != 0 );
710- #if 1
711686 if (erOp&WF_DSTFIX)
712687 { if (iHr == 23 )
713688 { // hr 23: clock time is beg of 1st hour of next day
714689 // use selected daily values from next day
715690 WDDAY& wdd = wdy_Day ( jDay+1 );
716- #if 1
717691 pwd->wd_taDbPvPk = wdd.wdd_taDbPvPk ;
718692 pwd->wd_tdvElecPvPk = wdd.wdd_tdvElecPvPk ;
719- #else
720- pwd->wd_SetDayValues( wdd);
721- #endif
722693 }
723694 pwd->wd_ShiftTdvElecHrRankForDST (); // shift TDV rank hrs to DST
724695 // to be consistent with $hour
725696 // in expressions
726697 }
727- #elif 0
728- if ( iHr == 23 && (erOp&WF_DSTFIX))
729- { WDDAY& wdd = wf_pWDY->wdy_Day ( jDay+1 );
730- pwd->wd_taDbPk = wdd.wdd_taDbPk ;
731- pwd->wd_taDbAvg = wdd.wdd_taDbAvg ;
732- pwd->wd_taDbPvPk = wdd.wdd_taDbPvPk ;
733- pwd->wd_taDbAvg01 = wdd.wdd_taDbAvg01 ;
734- pwd->wd_taDbAvg07 = wdd.wdd_taDbAvg07 ;
735- pwd->wd_taDbAvg14 = wdd.wdd_taDbAvg14 ;
736- pwd->wd_taDbAvg31 = wdd.wdd_taDbAvg31 ;
737- pwd->wd_tGrnd = wdd.wdd_tGrnd ;
738- pwd->wd_tMains = wdd.wdd_tMains ;
739- #if 0
740- pwd->wd_tdvElecPk = wdd.wdd_tdvElecPk;
741- pwd->wd_tdvElecAvg = wdd.wdd_tdvElecAvg;
742- pwd->wd_tdvElecPvPk = wdd.wdd_tdvElecPvPk;
743- pwd->wd_tdvElecAvg01= wdd.wdd_tdvElecAvg01;
744- #endif
745- }
746- #endif
747- return RCOK;
748- } // WDYEAR::wd_TransferHr
749- // -----------------------------------------------------------------------------
698+ return RCOK;
699+ } // WDYEAR::wdy_TransferHr
700+ // =============================================================================
750701void WDDAY::wdd_Init ()
751702{
752703 wdd_taDbPk = 0 .f ;
@@ -760,6 +711,7 @@ void WDDAY::wdd_Init()
760711 wdd_taDbAvg31 = 0 .f ;
761712
762713 wdd_tdvElecPk = 0 .f ;
714+ wdd_tdvElecPkRank = 0 ;
763715 wdd_tdvElecAvg = 0 .f ;
764716 wdd_tdvElecPvPk = 0 .f ;
765717 wdd_tdvElecAvg01 = 0 .f ;
@@ -825,6 +777,7 @@ void WDHR::wd_SetDayValues( // set daily members for this hour
825777 wd_tGrnd = wdd.wdd_tGrnd ;
826778 wd_tMains = wdd.wdd_tMains ;
827779 wd_tdvElecPk = wdd.wdd_tdvElecPk ;
780+ wd_tdvElecPkRank = wdd.wdd_tdvElecPkRank ;
828781 wd_tdvElecAvg = wdd.wdd_tdvElecAvg ;
829782 wd_tdvElecPvPk = wdd.wdd_tdvElecPvPk ;
830783 wd_tdvElecAvg01= wdd.wdd_tdvElecAvg01 ;
0 commit comments