1212#include " ancrec.h" // record: base class for rccn.h classes
1313#include " rccn.h" // TOPRAT WFILE WFDATA
1414#include " psychro.h"
15+ #include " slpak.h"
1516
1617#include " yacam.h" // class YACAM
1718#include " tdpak.h"
@@ -445,8 +446,10 @@ struct WDSUBHRFACTORS // constant factors for weather data interpolation
445446class WDSUBHR // derived subhourly weather data
446447{
447448public:
448- float wsh_radBeam;
449- float wsh_radDiff;
449+ void wsh_ClearSolar ()
450+ { wsh_radBeamAv = wsh_radDiffAv = 0 ; }
451+ float wsh_radBeamAv;
452+ float wsh_radDiffAv;
450453}; // class WDSUBHR
451454// ----------------------------------------------------------------------------
452455struct VHR // sort helper for wdy_Stats
@@ -501,18 +504,19 @@ public:
501504 float wdy_TaDbAvg ( int jDay1, int jDay2);
502505 RC wdy_UpSampleSetup (int nSh);
503506 RC wdy_UpSampleDay (int jDay, int nSh);
504- RC wdy_UpSampleHr (int jDay, int nSh);
507+ RC wdy_UpSampleHr (WDSUBHR wdsh[], int jDay, int iHr , int nSh);
505508}; // class WDYEAR
506509// -----------------------------------------------------------------------------
507510WDYEAR::WDYEAR () // c'tor
508- : wdy_wShF (NULL )
511+ : wdy_wShF (NULL ), wdy_shDay ( NULL )
509512{
510513 wdy_Init ();
511514} // WDYEAR::WDYEAR
512515// -----------------------------------------------------------------------------
513516WDYEAR::~WDYEAR () // d'tor
514517{
515518 delete[] wdy_wShF;
519+ delete[] wdy_shDay;
516520} // WDYEAR::~WDYEAR
517521// -----------------------------------------------------------------------------
518522void WDYEAR::wdy_Init (
@@ -589,10 +593,18 @@ RC WDYEAR::wdy_Fill( // read weather data for entire file; compute averages etc.
589593 { int monLen = monLens[ iMon] + (wdy_isLeap && iMon==2 );
590594 for (iDay=0 ; iDay<monLen; iDay++)
591595 { jDay++;
596+ #if 1
597+ slday (jDay, SLTMLST);
598+ #endif
592599 for (int iHr=0 ; iHr<24 ; iHr++)
593- { rc |= pWF->wf_Read ( &wdy_Hr ( jDay, iHr), jDay, iHr, erOp|WF_FORCEREAD);
600+ { WDHR* pWd = &wdy_Hr (jDay, iHr);
601+ rc |= pWF->wf_Read ( pWd, jDay, iHr, erOp|WF_FORCEREAD);
594602 if (rc)
595603 break ;
604+ #if defined( SOLARFIX)
605+ pWd->wd_Adjust ( iHr); // apply adjusments per user input
606+ // aniso, solar factors, wind factor
607+ #endif
596608 }
597609 if (rc)
598610 break ;
@@ -790,6 +802,8 @@ RC WDYEAR::wdy_UpSampleSetup(
790802
791803 delete[] wdy_wShF;
792804 wdy_wShF = new WDSUBHRFACTORS[nSh];
805+ delete[] wdy_shDay;
806+ wdy_shDay = new WDSUBHR[ 24 *nSh];
793807
794808 for (int iSh = 0 ; iSh < nSh; iSh++)
795809 wdy_wShF[iSh].wds_Setup (iSh, nSh);
@@ -798,18 +812,39 @@ RC WDYEAR::wdy_UpSampleSetup(
798812
799813} // WDYEAR::wdy_UpSampleSetup
800814// -----------------------------------------------------------------------------
815+ RC WFILE::wf_UpSampleDay (
816+ int jDay)
817+ {
818+ return wf_pWDY ? wf_pWDY->wdy_UpSampleDay (jDay, Top.nSubSteps )
819+ : RCBAD;
820+ } // WFILE::wf_UpSampleDay
821+ // -----------------------------------------------------------------------------
822+ void WFILE::wf_GetSubhrSolar (
823+ int iHr,
824+ int iSh,
825+ float & radBeam,
826+ float & radDiff) const
827+ {
828+ const WDSUBHR* pWDSH = wf_pWDY->wdy_shDay + iHr*Top.nSubSteps + iSh;
829+ radBeam = pWDSH->wsh_radBeamAv ;
830+ radDiff = pWDSH->wsh_radDiffAv ;
831+ }
832+ // -----------------------------------------------------------------------------
801833RC WDYEAR::wdy_UpSampleDay (
802834 int jDay, // day of year (1-365/366)
803835 int nSh)
804836{
805-
837+ RC rc = RCOK;
806838 for (int iHr = 0 ; iHr < 24 ; iHr++)
807839 {
840+ WDSUBHR* pWDSH = wdy_shDay + iHr * nSh;
841+ rc |= wdy_UpSampleHr (pWDSH, jDay, iHr, nSh);
808842 }
843+ return rc;
809844} // WDYEAR::wdy_UpSampleDay
810845// -----------------------------------------------------------------------------
811846RC WDYEAR::wdy_UpSampleHr (
812- XXX wdSh,
847+ WDSUBHR wdSh[], // returned: subhour values
813848 int jDay, // day of year (1-365/366)
814849 int iHr, // hour of day, 0-23
815850 int nSh) // # of subhrs per hour
@@ -827,8 +862,10 @@ RC WDYEAR::wdy_UpSampleHr(
827862 }
828863
829864 if (radBeam[1 ] < .1f && radDiff[1 ] < .1f )
830- { // substep 0
831- continue ;
865+ {
866+ for (int iSh = 0 ; iSh < nSh; iSh++)
867+ wdSh[iSh].wsh_ClearSolar ();
868+ return rc;
832869 }
833870
834871 // Compute adjustment factors (constant over hour) to make subhour values add up to given hour value.
@@ -871,8 +908,9 @@ RC WDYEAR::wdy_UpSampleHr(
871908
872909 // Interpolate subhour average power values for data with average values in file.
873910 // Multiply by subhrDur for energy.
874- wdSh[ iSh].radBeamAv = VIProd (radBeam, 3 , wf[iSh].slrF ) * beamAdj;
875- wdSh[ iSh].radDiffAv = VIProd (radDiff, 3 , wf[iSh].slrF ) * diffAdj;
911+ const float * slrF = wdy_wShF[iSh].slrF ;
912+ wdSh[ iSh].wsh_radBeamAv = VIProd ( radBeam, 3 , slrF) * beamAdj;
913+ wdSh[ iSh].wsh_radDiffAv = VIProd ( radDiff, 3 , slrF) * diffAdj;
876914
877915 }
878916
@@ -1278,7 +1316,7 @@ WFILE::WFILE( basAnc *b, TI i, SI noZ /*=0*/) // c'tor to help insure init is ca
12781316} // WFILE::WFILE
12791317// ----------------------------------------------------------------------------
12801318WFILE::WFILE () // default c'tor (insurance)
1281- : record ( NULL , 0 , 1 ), yac ( NULL ), yacTDV ( NULL )
1319+ : record ( NULL , 0 , 1 ), yac ( NULL ), yacTDV ( NULL ), wf_pWDY ( NULL )
12821320{ wf_Init ();
12831321} // WFILE::WFILE
12841322// ----------------------------------------------------------------------------
@@ -2665,7 +2703,7 @@ x printf( "mismatch\n");
26652703 return rc;
26662704} // WDHR::wd_EPWReadHr
26672705#undef _C
2668-
2706+ // -----------------------------------------------------------------------------
26692707RC WFILE::wf_FixJday (DOY& jDay, int begDay)
26702708{
26712709 if (jd1 > 0 // if weather file dates known
0 commit comments