@@ -188,6 +188,10 @@ EnKF_mode CEnKFEnsemble::GetEnKFMode() const
188188
189189// ////////////////////////////////////////////////////////////////
190190// / \brief initializes EnKF assimilation run
191+ // / - performs QA/QC on inputs
192+ // / - gets #s and names of state variables adjusted during assimilation
193+ // / - allocate & populate _output_matrix, _obs_matrix, _noise_matrix
194+ // / - open blank EnKFOutput.csv file
191195// / \param &Options [out] Global model options information
192196//
193197void CEnKFEnsemble::Initialize (const CModel* pModel,const optStruct &Options)
@@ -197,8 +201,8 @@ void CEnKFEnsemble::Initialize(const CModel* pModel,const optStruct &Options)
197201
198202 // QA/QC
199203 // -----------------------------------------------
200- if (_nMembers== 0 ) {
201- ExitGracefully (" CEnKFEnsemble::Initialize: number of EnKF ensemble members must be >0 " ,BAD_DATA);
204+ if (_nMembers<= 1 ) {
205+ ExitGracefully (" CEnKFEnsemble::Initialize: number of EnKF ensemble members must be >1 " ,BAD_DATA);
202206 }
203207 if ((pModel->GetNumForcingPerturbations () == 0 ) && (_EnKF_mode != ENKF_FORECAST) && (_EnKF_mode != ENKF_OPEN_FORECAST)) {
204208 ExitGracefully (" CEnKFEnsemble::Initialize: at least one forcing perturbation must be set using :ForcingPerturbation command" ,BAD_DATA);
@@ -358,7 +362,7 @@ void CEnKFEnsemble::Initialize(const CModel* pModel,const optStruct &Options)
358362 ExitGracefullyIf (_noise_matrix[e]==NULL ," EnKF Initialization: noise matrix" ,OUT_OF_MEMORY);
359363 }
360364
361- // populate _output_matrix, _obs_matrix
365+ // populate _output_matrix, _obs_matrix, _noise_matrix
362366 // -----------------------------------------------
363367 int j;
364368 double eps;
@@ -427,7 +431,7 @@ void CEnKFEnsemble::StartTimeStepOps(CModel* pModel,optStruct& Options,const tim
427431 }
428432}
429433// ////////////////////////////////////////////////////////////////
430- // / \brief called at end of each time step
434+ // / \brief called at end of each time step - updates state matrix and builds output matrix
431435// / \param pModel [out] pointer to global model instance
432436// / \param &Options [out] Global model options information
433437// / \params tt [in] time structure
@@ -439,7 +443,7 @@ void CEnKFEnsemble::CloseTimeStepOps(CModel* pModel,optStruct& Options,const tim
439443 AddToStateMatrix (pModel,Options,e);
440444 }
441445
442- // Build output Matrix
446+ // Build output Matrix (typically final timestep of simulation)
443447 // ----------------------------------------------------------
444448 int curr_nn=(int )((tt.model_time +TIME_CORRECTION)/Options.timestep );// current timestep index
445449
@@ -680,7 +684,7 @@ void CEnKFEnsemble::AddToStateMatrix(CModel* pModel,optStruct& Options,const int
680684 for (int i=0 ;i<_nAssimStates;i++)
681685 {
682686 kk=_aAssimGroupID[i];
683- if (_aAssimStates[i]==STREAMFLOW)
687+ if (_aAssimStates[i]==STREAMFLOW)
684688 {
685689 // cout<<"RETRIEVE STATES : # subbasins: "<<pModel->GetSubBasinGroup(kk)->GetNumSubbasins()<<endl;
686690 for (int pp=0 ;pp<pModel->GetSubBasinGroup (kk)->GetNumSubbasins ();pp++)
@@ -808,62 +812,66 @@ void CEnKFEnsemble::FinishEnsembleRun(CModel *pModel,optStruct &Options,const ti
808812
809813 if (e==_nEnKFMembers-1 ) // After all ensemble members have run
810814 {
811- _ENKFOUT<<" PRE-ASSIMILATION STATE MATRIX:" <<endl;
812- _ENKFOUT<<" member" <<" ," ;
813- for (int i = 0 ; i<_nStateVars; i++) {
814- _ENKFOUT<<_state_names[i]<<" ," ;
815- }
816- _ENKFOUT<<endl;
817- for (int ee=0 ;ee<_nEnKFMembers;ee++) {
818- _ENKFOUT<<ee+1 <<" ," ;
819- for (int i=0 ;i<_nStateVars;i++) {
820- _ENKFOUT<<_state_matrix[ee][i]<<" ," ;
815+ {
816+ _ENKFOUT<<" PRE-ASSIMILATION STATE MATRIX:" <<endl;
817+ _ENKFOUT<<" member" <<" ," ;
818+ for (int i = 0 ; i<_nStateVars; i++) {
819+ _ENKFOUT<<_state_names[i]<<" ," ;
821820 }
822821 _ENKFOUT<<endl;
822+ for (int ee=0 ;ee<_nEnKFMembers;ee++) {
823+ _ENKFOUT<<ee+1 <<" ," ;
824+ for (int i=0 ;i<_nStateVars;i++) {
825+ _ENKFOUT<<_state_matrix[ee][i]<<" ," ;
826+ }
827+ _ENKFOUT<<endl;
828+ }
823829 }
824830
825831 cout<<endl<<" ENKF: Performing Assimilation Calculations with " <<_nObsDatapoints<<" observation datapoints..." <<endl;
826832 AssimilationCalcs ();
827833
828- _ENKFOUT<<" POST-ASSIMILATION STATE MATRIX:" <<endl;
829- _ENKFOUT<<" member" <<" ," ;
830- for (int i = 0 ; i<_nStateVars; i++) {
831- _ENKFOUT<<_state_names[i]<<" ," ;
832- }
833- _ENKFOUT<<endl;
834- for (int ee=0 ;ee<_nEnKFMembers;ee++) {
835- _ENKFOUT<<ee+1 <<" ," ;
836- for (int i=0 ;i<_nStateVars;i++) {
837- _ENKFOUT<<_state_matrix[ee][i]<<" ," ;
834+ {
835+ _ENKFOUT<<" POST-ASSIMILATION STATE MATRIX:" <<endl;
836+ _ENKFOUT<<" member" <<" ," ;
837+ for (int i = 0 ; i<_nStateVars; i++) {
838+ _ENKFOUT<<_state_names[i]<<" ," ;
838839 }
839840 _ENKFOUT<<endl;
840- }
841+ for (int ee=0 ;ee<_nEnKFMembers;ee++) {
842+ _ENKFOUT<<ee+1 <<" ," ;
843+ for (int i=0 ;i<_nStateVars;i++) {
844+ _ENKFOUT<<_state_matrix[ee][i]<<" ," ;
845+ }
846+ _ENKFOUT<<endl;
847+ }
841848
842- _ENKFOUT<<" NOISE MATRIX:" <<endl;
843- for (int ee=0 ;ee<_nEnKFMembers;ee++) {
844- _ENKFOUT<<ee+1 <<" ," ;
845- for (int i=0 ;i<_nObsDatapoints;i++) {
846- _ENKFOUT<<_noise_matrix[ee][i]<<" ," ;
849+ _ENKFOUT<<" NOISE MATRIX:" <<endl;
850+ for (int ee=0 ;ee<_nEnKFMembers;ee++) {
851+ _ENKFOUT<<ee+1 <<" ," ;
852+ for (int i=0 ;i<_nObsDatapoints;i++) {
853+ _ENKFOUT<<_noise_matrix[ee][i]<<" ," ;
854+ }
855+ _ENKFOUT<<endl;
847856 }
848- _ENKFOUT<<endl;
849- }
850- _ENKFOUT<<" OBSERVATION MATRIX: " <<endl ;
851- for (int ee =0 ;ee<_nEnKFMembers;ee ++) {
852- _ENKFOUT<<ee+ 1 <<" ," ;
853- for ( int i= 0 ;i<_nObsDatapoints;i++) {
854- _ENKFOUT<<_obs_matrix[ee][i]<< " , " ;
857+ _ENKFOUT<<" OBSERVATION MATRIX: " << endl;
858+ for ( int ee= 0 ;ee<_nEnKFMembers;ee++) {
859+ _ENKFOUT<<ee+ 1 << " , " ;
860+ for (int i =0 ;i<_nObsDatapoints;i ++) {
861+ _ENKFOUT<<_obs_matrix[ee][i] <<" ," ;
862+ }
863+ _ENKFOUT<<endl ;
855864 }
856- _ENKFOUT<<endl;
857- }
858- _ENKFOUT<<" SIMULATED OUTPUT MATRIX: " <<endl ;
859- for (int ee =0 ;ee<_nEnKFMembers;ee ++) {
860- _ENKFOUT<<ee+ 1 <<" ," ;
861- for ( int i= 0 ;i<_nObsDatapoints;i++) {
862- _ENKFOUT<<_output_matrix[ee][i]<< " , " ;
865+ _ENKFOUT<<" SIMULATED OUTPUT MATRIX: " << endl;
866+ for ( int ee= 0 ;ee<_nEnKFMembers;ee++) {
867+ _ENKFOUT<<ee+ 1 << " , " ;
868+ for (int i =0 ;i<_nObsDatapoints;i ++) {
869+ _ENKFOUT<<_output_matrix[ee][i] <<" ," ;
870+ }
871+ _ENKFOUT<<endl ;
863872 }
864- _ENKFOUT<<endl ;
873+ _ENKFOUT. close () ;
865874 }
866- _ENKFOUT.close ();
867875
868876 // Write EnKF-updated solution files
869877 // requires full re-reading of ensemble member solution files
0 commit comments