Skip to content

Commit 874527b

Browse files
James CraigJames Craig
authored andcommitted
v522 - EnKF initialization bug fix
bug fix: disable iterative solution of stage for :ResFlow rvc command (found by OPG) (Reservoir.cpp/.h; ParseInitialConditions.cpp/EnKF.cpp)
1 parent 6faf2a6 commit 874527b

File tree

4 files changed

+9
-6
lines changed

4 files changed

+9
-6
lines changed

src/EnKF.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ void CEnKFEnsemble::UpdateFromStateMatrix(CModel* pModel,optStruct& Options,cons
633633
if (pBasin->GetReservoir() != NULL)
634634
{
635635
time_struct tt_dummy;
636-
pBasin->GetReservoir()->SetInitialFlow(_state_matrix[e][ii],_state_matrix[e][ii+1],tt_dummy,Options);
636+
pBasin->GetReservoir()->SetInitialFlow(_state_matrix[e][ii],_state_matrix[e][ii+1],false,tt_dummy,Options);
637637
ii+=2;
638638
}
639639

src/ParseInitialConditionFile.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ bool ParseInitialConditionsFile(CModel *&pModel, const optStruct &Options)
624624
else if(!strcmp(s[0],":ResFlow"))
625625
{
626626
if(Len>=3) {
627-
pBasin->GetReservoir()->SetInitialFlow(s_to_d(s[1]),s_to_d(s[2]),tt,Options);
627+
pBasin->GetReservoir()->SetInitialFlow(s_to_d(s[1]),s_to_d(s[2]),true,tt,Options);
628628
}
629629
}
630630
else if (!strcmp(s[0], ":ControlFlow"))
@@ -657,7 +657,7 @@ bool ParseInitialConditionsFile(CModel *&pModel, const optStruct &Options)
657657
time_struct tt;
658658
JulianConvert(0.0,Options.julian_start_day,Options.julian_start_year,Options.calendar,tt);
659659
pBasin->GetReservoir()->UpdateReservoir(tt,Options); //ensures correct discharge rating curve is used to calculate flow
660-
pBasin->GetReservoir()->SetInitialFlow(AutoOrDouble(s[2]),AutoOrDouble(s[2]),tt,Options);
660+
pBasin->GetReservoir()->SetInitialFlow(AutoOrDouble(s[2]),AutoOrDouble(s[2]),false,tt,Options); //iteratively calculates corresponding stage
661661
break;
662662
}
663663
case(8): //----------------------------------------------

src/Reservoir.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1404,15 +1404,18 @@ void CReservoir::UpdateReservoir(const time_struct &tt, const optStruct &Options
14041404
//////////////////////////////////////////////////////////////////
14051405
/// \brief initialize stage,volume, area to specified initial inflow
14061406
/// \param initQ [in] initial inflow
1407+
/// \param initQlast [in] inflow at start of last timestep
1408+
/// \param justFlow [in] true if reading from .rvc file :ResFlow - assumes :ResStage read elsewhere (false if using :InitialReservoirFlow)
14071409
/// \note - ignores extraction and PET ; won't work for initQ=0, which could be non-uniquely linked to stage
14081410
//
1409-
void CReservoir::SetInitialFlow(const double &initQ,const double &initQlast,const time_struct &tt,const optStruct& Options)
1411+
void CReservoir::SetInitialFlow(const double &initQ,const double &initQlast,const bool justFlow,const time_struct &tt,const optStruct& Options)
14101412
{
1411-
if(initQ!=initQlast) {//reading from .rvc file
1413+
if ((initQ == 0.0) || (justFlow)) {//reading from .rvc file - don't iteratively estimate stage
14121414
_Qout=initQ;
14131415
_Qout_last=initQlast;
14141416
return;
14151417
}
1418+
14161419
const double RES_TOLERANCE=0.001; //[m]
14171420
const int RES_MAXITER=20;
14181421
double dh=0.0001;

src/Reservoir.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ class CReservoir
229229
//Manipulators
230230
void SetMinStage (const double &min_z);
231231
void SetMaxCapacity (const double &max_cap);
232-
void SetInitialFlow (const double &Q,const double &Qlast,const time_struct &tt, const optStruct &Options);
232+
void SetInitialFlow (const double &Q,const double &Qlast,const bool justFlow, const time_struct &tt, const optStruct &Options);
233233
void SetReservoirStage (const double &ht, const double &ht_last);
234234
void SetControlFlow (const int i, const double &Q, const double &Qlast);
235235
void SetOptimizedOutflow (const double &Qout);

0 commit comments

Comments
 (0)