Skip to content

Commit c834ecd

Browse files
committed
minor cleanup of nens and agcm_res processing for coupled land-atm DAS (ldas_setup)
1 parent c2bc967 commit c834ecd

File tree

1 file changed

+71
-74
lines changed

1 file changed

+71
-74
lines changed

GEOSldas_App/ldas_setup

Lines changed: 71 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)