Skip to content

Commit 12b5e4b

Browse files
James CraigJames Craig
authored andcommitted
v497 - updates to direct insertion data assimilation
1 parent e1dd015 commit 12b5e4b

File tree

3 files changed

+49
-1
lines changed

3 files changed

+49
-1
lines changed

src/Assimilate.cpp

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ void CModel::InitializeDataAssimilation(const optStruct &Options)
2828
_aDAscale =new double[_nSubBasins];
2929
_aDAscale_last=new double[_nSubBasins];
3030
_aDAQadjust =new double[_nSubBasins];
31+
_aDADrainSum =new double[_nSubBasins];
32+
_aDADownSum =new double[_nSubBasins];
3133
_aDAlength =new double[_nSubBasins];
3234
_aDAtimesince =new double[_nSubBasins];
3335
_aDAoverride =new bool [_nSubBasins];
@@ -36,6 +38,8 @@ void CModel::InitializeDataAssimilation(const optStruct &Options)
3638
_aDAscale [p]=1.0;
3739
_aDAscale_last[p]=1.0;
3840
_aDAQadjust [p]=0.0;
41+
_aDADrainSum [p]=0.0;
42+
_aDADownSum [p]=0.0;
3943
_aDAlength [p]=0.0;
4044
_aDAtimesince [p]=0.0;
4145
_aDAoverride [p]=false;
@@ -135,11 +139,13 @@ void CModel::PrepareAssimilation(const optStruct &Options,const time_struct &tt)
135139

136140
for(p=0; p<_nSubBasins; p++) {
137141
_aDAscale_last[p]=_aDAscale[p];
142+
_aDADrainSum[p]=0.0;
138143
}
139144

140145
for(int pp=_nSubBasins-1; pp>=0; pp--)//downstream to upstream
141146
{
142147
p=GetOrderedSubBasinIndex(pp);
148+
pdown = GetSubBasinByID(_pSubBasins[p]->GetDownstreamID())->GetGlobalIndex();
143149

144150
bool ObsExists=false; //observation available in THIS basin
145151
// observations in this basin, determine scaling variables based upon blank/not blank
@@ -163,6 +169,10 @@ void CModel::PrepareAssimilation(const optStruct &Options,const time_struct &tt)
163169
_aDAtimesince[p]=0.0;
164170
_aDAoverride [p]=true;
165171
_aDAobsQ [p]=Qobs;
172+
_aDADrainSum [p]=0.0; //??? maybe doesnt matter
173+
if (pdown != DOESNT_EXIST) {
174+
_aDADrainSum [pdown]+=_pSubBasins[p]->GetDrainageArea(); //DOES THIS HANDLE NESTING RIGHT?
175+
}
166176
}
167177
else
168178
{ //found a blank or zero flow value
@@ -172,11 +182,19 @@ void CModel::PrepareAssimilation(const optStruct &Options,const time_struct &tt)
172182
_aDAlength [p]=0.0;
173183
_aDAoverride [p]=false;
174184
_aDAobsQ [p]=0.0;
185+
if (pdown != DOESNT_EXIST) {
186+
_aDADrainSum[pdown] += _aDADrainSum[p];
187+
}
175188
}
176189
ObsExists=true;
177190
break; //avoids duplicate observations
178191
}
179192
}
193+
}
194+
else {
195+
if (pdown != DOESNT_EXIST) {
196+
_aDADrainSum[pdown] += _aDADrainSum[p];
197+
}
180198
}
181199
// no observations in this basin, get scaling from downstream
182200
//----------------------------------------------------------------
@@ -200,13 +218,35 @@ void CModel::PrepareAssimilation(const optStruct &Options,const time_struct &tt)
200218
}
201219
}// end downstream to upstream
202220

221+
for(int pp=0;pp<_nSubBasins; pp++)//upstream to downstream
222+
{
223+
p=GetOrderedSubBasinIndex(pp);
224+
pdown = GetSubBasinByID(_pSubBasins[p]->GetDownstreamID())->GetGlobalIndex();
225+
if (_aDAoverride[p]) {
226+
_aDADrainSum[p]=_pSubBasins[p]->GetDrainageArea();
227+
}
228+
else if (pdown!=DOESNT_EXIST){
229+
_aDADrainSum[p]=_aDADrainSum[pdown];
230+
}
231+
}
232+
233+
203234
// Apply time and space correction factors
204235
//----------------------------------------------------------------
205236
double time_fact = _pGlobalParams->GetParams()->assim_time_decay;
206237
double distfact = _pGlobalParams->GetParams()->assim_upstream_decay/M_PER_KM; //[1/km]->[1/m]
238+
double ECCCwt;
207239
for(p=0; p<_nSubBasins; p++)
208240
{
209241
_aDAscale [p] =1.0+(_aDAscale[p]-1.0)*exp(-distfact*_aDAlength[p])*exp(-time_fact*_aDAtimesince[p]);
210-
_aDAQadjust[p] =_aDAQadjust[p]*exp(-distfact*_aDAlength[p])*exp(-time_fact*_aDAtimesince[p]);
242+
//_aDAQadjust[p] =_aDAQadjust[p]*exp(-distfact*_aDAlength[p])*exp(-time_fact*_aDAtimesince[p]);
243+
244+
if (_aDADrainSum[p]!=0.0){
245+
ECCCwt = (_pSubBasins[p]->GetDrainageArea() - _aDADrainSum[p])/(_aDADownSum[p]-_aDADrainSum[p]);
246+
}
247+
else {
248+
ECCCwt=1.0;
249+
}
250+
_aDAQadjust[p] = _aDAQadjust[p]*ECCCwt;
211251
}
212252
}

src/Model.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ CModel::CModel(const int nsoillayers,
5757

5858
_aDAscale =NULL; //Initialized in InitializeDataAssimilation
5959
_aDAscale_last =NULL;
60+
_aDAQadjust =NULL;
61+
_aDADrainSum =NULL;
62+
_aDADownSum =NULL;
6063
_aDAlength =NULL;
6164
_aDAtimesince =NULL;
6265
_aDAoverride =NULL;
@@ -210,6 +213,9 @@ CModel::~CModel()
210213

211214
delete [] _aDAscale; _aDAscale=NULL;
212215
delete [] _aDAscale_last; _aDAscale_last=NULL;
216+
delete [] _aDAQadjust; _aDAQadjust=NULL;
217+
delete [] _aDADrainSum; _aDADrainSum=NULL;
218+
delete [] _aDADownSum; _aDADownSum=NULL;
213219
delete [] _aDAlength; _aDAlength=NULL;
214220
delete [] _aDAtimesince; _aDAtimesince=NULL;
215221
delete [] _aDAoverride; _aDAoverride=NULL;

src/Model.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ class CModel: public CModelABC
134134
double *_aDAscale; ///< array of data assimilation flow scaling parameters [size: _nSubBasins] (NULL w/o DA)
135135
double *_aDAlength; ///< array of downstream distance to nearest DA observation [m] [size: _nSubBasins] (NULL w/o DA)
136136
double *_aDAQadjust; ///< array of flow adjustments [m3/s] [size: _nSubBasins]
137+
double *_aDADrainSum; ///< sum of assimilated drainage areas upstream of a subbasin outlet [km2] [size: _nSubBasins]
138+
double *_aDADownSum; ///< the drainage area of the nearest downstream assimilated flow observation [km2] [size: _nSubBasins]
137139
double *_aDAtimesince; ///< array of downstream time since most recent downstream DA observation [size: _nSubBasins] (NULL w/o DA)
138140
bool *_aDAoverride; ///< array of booleans indicating if observation data is available for assimilation at basin p's outlet [size: _nSubBasins] (NULL w/o DA)
139141
double *_aDAobsQ; ///< array of observed flow values in basins [size: _nSubBasins] (NULL w/o DA)

0 commit comments

Comments
 (0)