@@ -189,81 +189,79 @@ class LDASsetup:
189189 ### check if ldas is coupled to adas; if so, set/overwrite input parameters accordingly
190190 if self .ladas_cpl > 0 :
191191
192- # make sure all necessary command line arguments were supplied
193- assert self .nymdb is not None , "Error. Must have command line arg nymdb for coupled land-atm DAS.\n "
194- assert self .nhmsb is not None , "Error. Must have command line arg nhmsb for coupled land-atm DAS.\n "
195- assert self .agcm_res is not None , "Error. Must have command line arg agcm_res for coupled land-atm DAS.\n "
196- assert self .bcs_version is not None , "Error. Must have command line arg bcs_version for coupled land-atm DAS.\n "
197- assert self .rstloc is not None , "Error. Must have command line arg rstloc for coupled land-atm DAS.\n "
198- assert self .varwindow is not None , "Error. Must have command line arg varwindow for coupled land-atm DAS.\n "
199- assert self .nens is not None , "Error. Must have command line arg nens for coupled land-atmensDAS.\n "
192+ # make sure all necessary command line arguments were supplied
193+ assert self .nymdb is not None , "Error. Must have command line arg nymdb for coupled land-atm DAS.\n "
194+ assert self .nhmsb is not None , "Error. Must have command line arg nhmsb for coupled land-atm DAS.\n "
195+ assert self .agcm_res is not None , "Error. Must have command line arg agcm_res for coupled land-atm DAS.\n "
196+ assert self .bcs_version is not None , "Error. Must have command line arg bcs_version for coupled land-atm DAS.\n "
197+ assert self .rstloc is not None , "Error. Must have command line arg rstloc for coupled land-atm DAS.\n "
198+ assert self .varwindow is not None , "Error. Must have command line arg varwindow for coupled land-atm DAS.\n "
199+ assert self .nens is not None , "Error. Must have command line arg nens for coupled land-atmensDAS.\n "
200200
201- self .rqdExeInp ['BEG_DATE' ] = f"{ self .nymdb } { self .nhmsb } "
202- rstloc_ = self .rstloc .rstrip ('/' ) # remove trailing '/'
203- assert os .path .isdir (rstloc_ ) # make sure rstloc_ is a valid directory
204- self .rstloc = os .path .abspath (rstloc_ )
205- self .rqdExeInp ['RESTART_PATH' ] = os .path .dirname ( self .rstloc )
206- self .rqdExeInp ['RESTART_ID' ] = os .path .basename (self .rstloc )
207- self .adas_expdir = os .path .dirname ( self .exphome )
208- self .rqdExeInp ['ADAS_EXPDIR' ] = self .adas_expdir
209- self .adas_expid = os .path .basename (self .adas_expdir )
210- self .rqdExeInp ['MET_TAG' ] = self .adas_expid + '__bkg'
201+ self .rqdExeInp ['BEG_DATE' ] = f"{ self .nymdb } { self .nhmsb } "
202+ rstloc_ = self .rstloc .rstrip ('/' ) # remove trailing '/'
203+ assert os .path .isdir (rstloc_ ) # make sure rstloc_ is a valid directory
204+ self .rstloc = os .path .abspath (rstloc_ )
205+ self .rqdExeInp ['RESTART_PATH' ] = os .path .dirname ( self .rstloc )
206+ self .rqdExeInp ['RESTART_ID' ] = os .path .basename (self .rstloc )
207+ self .adas_expdir = os .path .dirname ( self .exphome )
208+ self .rqdExeInp ['ADAS_EXPDIR' ] = self .adas_expdir
209+ self .adas_expid = os .path .basename (self .adas_expdir )
210+ self .rqdExeInp ['MET_TAG' ] = self .adas_expid + '__bkg'
211211
212- if self .ladas_cpl == 1 :
213- # ldas coupled with determistic component of adas
214- self .rqdExeInp ['EXP_ID' ] = self .adas_expid + '_LDAS'
215- self .rqdExeInp ['MET_PATH' ] = self .adas_expdir + '/recycle/holdpredout'
216- self .rqdExeInp ['ENSEMBLE_FORCING' ] = 'NO'
217- elif self .ladas_cpl == 2 :
218- # ldas coupled with ensemble component of adas
219- self .rqdExeInp ['EXP_ID' ] = self .adas_expid + '_LDAS4ens'
220- self .rqdExeInp ['MET_PATH' ] = self .adas_expdir + '/atmens/mem'
221- self .rqdExeInp ['ENSEMBLE_FORCING' ] = 'YES'
222- else :
223- exit ("Error. Unknown value of self.ladas_cpl.\n " )
212+ if self .ladas_cpl == 1 :
213+ # ldas coupled with determistic component of ADAS
214+ self .rqdExeInp ['EXP_ID' ] = self .adas_expid + '_LDAS'
215+ self .rqdExeInp ['MET_PATH' ] = self .adas_expdir + '/recycle/holdpredout'
216+ self .rqdExeInp ['ENSEMBLE_FORCING' ] = 'NO'
217+ elif self .ladas_cpl == 2 :
218+ # ldas coupled with ensemble component of ADAS
219+ self .rqdExeInp ['EXP_ID' ] = self .adas_expid + '_LDAS4ens'
220+ self .rqdExeInp ['MET_PATH' ] = self .adas_expdir + '/atmens/mem'
221+ self .rqdExeInp ['ENSEMBLE_FORCING' ] = 'YES'
222+ else :
223+ exit ("Error. Unknown value of self.ladas_cpl.\n " )
224224
225- self .first_ens_id = 1
226- self .rqdExeInp ['FIRST_ENS_ID' ] = self .first_ens_id
225+ self .rqdExeInp ['NUM_LDAS_ENSEMBLE' ] = self .nens # fvsetup finds Nens by counting restart files
226+ self .first_ens_id = 1 # match ADAS convention
227+ self .rqdExeInp ['FIRST_ENS_ID' ] = self .first_ens_id
227228
228- _agcm_res = 'CF' + self .agcm_res
229- self .rqdExeInp ['EXP_DOMAIN' ] = _agcm_res + 'x6C_GLOBAL'
229+ self . agcm_res = 'CF' + self .agcm_res # change format to "CFnnnn"
230+ self .rqdExeInp ['EXP_DOMAIN' ] = self . agcm_res + 'x6C_GLOBAL'
230231
231- # when coupled to ADAS, "BCS_PATH" EXCLUDE bcs version info
232- # hard-wired BCS_PATH for now
233- self .rqdExeInp ['BCS_PATH' ] = "/discover/nobackup/projects/gmao/bcs_shared/fvInput/ExtData/esm/tiles"
234- self .rqdExeInp ['BCS_PATH' ] = self .rqdExeInp ['BCS_PATH' ].rstrip ('/' ) + '/' + self .bcs_version
235- if self .bcs_version == "Icarus-NLv3" :
236- self .rqdExeInp ['BCS_PATH' ] = self .rqdExeInp ['BCS_PATH' ] + '_new_layout'
237- self .rqdExeInp ['BCS_RESOLUTION' ] = _agcm_res + 'x6C_' + _agcm_res + 'x6C'
238- self .rqdExeInp ['RESTART_DOMAIN' ] = _agcm_res + 'x6C_GLOBAL'
239-
240- # the following are not in default rqdExeInp list; hardwire for now
241- self .rqdExeInp ['MWRTM_PATH' ] = '/discover/nobackup/projects/gmao/smap/LDAS_inputs_for_LADAS/RTM_params/RTMParam_SMAP_L4SM_v006/'
242- self .rqdExeInp ['LAND_ASSIM' ] = "YES"
243- self .rqdExeInp ['MET_HINTERP' ] = 0
244- self .landassim_dt = 10800 # seconds
245- # make sure ADAS analysis window [minutes] is multiple of LANDASSIM_DT [seconds]
246- if int (self .varwindow ) % (self .landassim_dt / 60 ) == 0 :
247- self .rqdExeInp ['LANDASSIM_DT' ] = self .landassim_dt
248- else :
249- exit ("Error. LANDASSIM_DT is inconsistent with ADAS analysis window.\n " )
250- self .rqdExeInp ['LANDASSIM_T0' ] = "013000" # HHMMSS
251- jsgmt1 = "00000000"
252- jsgmt2 = hours_to_hhmmss (int (self .varwindow )/ 60 ) # convert minutes to HHMMSS
253- self .rqdExeInp ['JOB_SGMT' ] = f"{ jsgmt1 } { jsgmt2 } "
254- self .rqdExeInp ['NUM_SGMT' ] = 1
255- self .rqdExeInp ['FORCE_DTSTEP' ] = 3600
256-
257- # determine END_DATE = BEG_DATE + TIME_STEP_OF_ADAS_CYCLE
258- _beg_date = datetime .strptime ( self .rqdExeInp ['BEG_DATE' ], "%Y%m%d %H%M%S" )
259- _hours = int (self .rqdExeInp ['JOB_SGMT' ][ 9 :11 ])
260- _end_date = _beg_date + timedelta (hours = int (self .varwindow )/ 60 )
261- self .rqdExeInp ['END_DATE' ] = _end_date .strftime ("%Y%m%d %H%M%S" )
262-
263- # fvsetup pass nens via commandline to self.nens when ladas_cpl > 0
264- self .rqdExeInp ['NUM_LDAS_ENSEMBLE' ] = self .nens
232+ # when coupled to ADAS, "BCS_PATH" EXCLUDE bcs version info
233+ # hard-wired BCS_PATH for now
234+ self .rqdExeInp ['BCS_PATH' ] = "/discover/nobackup/projects/gmao/bcs_shared/fvInput/ExtData/esm/tiles"
235+ self .rqdExeInp ['BCS_PATH' ] = self .rqdExeInp ['BCS_PATH' ].rstrip ('/' ) + '/' + self .bcs_version
236+ if self .bcs_version == "Icarus-NLv3" :
237+ self .rqdExeInp ['BCS_PATH' ] = self .rqdExeInp ['BCS_PATH' ] + '_new_layout'
238+ self .rqdExeInp ['BCS_RESOLUTION' ] = self .agcm_res + 'x6C_' + self .agcm_res + 'x6C'
239+ self .rqdExeInp ['RESTART_DOMAIN' ] = self .agcm_res + 'x6C_GLOBAL'
240+
241+ # the following are not in default rqdExeInp list; hardwire for now
242+ self .rqdExeInp ['MWRTM_PATH' ] = '/discover/nobackup/projects/gmao/smap/LDAS_inputs_for_LADAS/RTM_params/RTMParam_SMAP_L4SM_v006/'
243+ self .rqdExeInp ['LAND_ASSIM' ] = "YES"
244+ self .rqdExeInp ['MET_HINTERP' ] = 0
245+ self .landassim_dt = 10800 # seconds
246+ # make sure ADAS analysis window [minutes] is multiple of LANDASSIM_DT [seconds]
247+ if int (self .varwindow ) % (self .landassim_dt / 60 ) == 0 :
248+ self .rqdExeInp ['LANDASSIM_DT' ] = self .landassim_dt
249+ else :
250+ exit ("Error. LANDASSIM_DT is inconsistent with ADAS analysis window.\n " )
251+ self .rqdExeInp ['LANDASSIM_T0' ] = "013000" # HHMMSS
252+ jsgmt1 = "00000000"
253+ jsgmt2 = hours_to_hhmmss (int (self .varwindow )/ 60 ) # convert minutes to HHMMSS
254+ self .rqdExeInp ['JOB_SGMT' ] = f"{ jsgmt1 } { jsgmt2 } "
255+ self .rqdExeInp ['NUM_SGMT' ] = 1
256+ self .rqdExeInp ['FORCE_DTSTEP' ] = 3600
257+
258+ # determine END_DATE = BEG_DATE + TIME_STEP_OF_ADAS_CYCLE
259+ _beg_date = datetime .strptime ( self .rqdExeInp ['BEG_DATE' ], "%Y%m%d %H%M%S" )
260+ _hours = int (self .rqdExeInp ['JOB_SGMT' ][ 9 :11 ])
261+ _end_date = _beg_date + timedelta (hours = int (self .varwindow )/ 60 )
262+ self .rqdExeInp ['END_DATE' ] = _end_date .strftime ("%Y%m%d %H%M%S" )
265263
266- # end if self.ladas_cpl > 0 --------------------------------------------------------------------
264+ # end if self.ladas_cpl > 0 --------------------- --------------------------------------------------------------------
267265
268266 for key in rqdExeInpKeys :
269267 assert key in self .rqdExeInp ,' "%s" is required in the input file %s' % (key ,self .exeinpfile )
@@ -1246,13 +1244,12 @@ class LDASsetup:
12461244 special_nml = glob .glob (self .rqdExeInp ['NML_INPUT_PATH' ]+ '/LDASsa_SPECIAL_inputs_*.nml' )
12471245
12481246 for nmlfile in special_nml :
1249- shortfile = self .rundir + '/' + nmlfile .split ('/' )[- 1 ]
1250- shutil .copy2 (nmlfile , shortfile )
1247+ shortfile = self .rundir + '/' + nmlfile .split ('/' )[- 1 ]
1248+ shutil .copy2 (nmlfile , shortfile )
12511249
12521250 if self .ladas_cpl > 0 :
1253- # edit resolution info in ensupd nml file
1254- _agcm_res = 'CF' + self .agcm_res
1255- sp .run (['sed' , '-i' , 's/<CFnnnn>/' + _agcm_res + '/g' , self .rundir + '/LDASsa_SPECIAL_inputs_ensupd.nml' ])
1251+ # edit resolution info in ensupd nml file
1252+ sp .run (['sed' , '-i' , 's/<CFnnnn>/' + self .agcm_res + '/g' , self .rundir + '/LDASsa_SPECIAL_inputs_ensupd.nml' ])
12561253
12571254 # get optimzed NX and IMS
12581255 optimized_distribution_file = tempfile .NamedTemporaryFile (delete = False )
0 commit comments