Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support for catchcn ensemble run #584

Merged
merged 17 commits into from
Oct 18, 2022
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions components.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,13 @@ GMAO_Shared:
MAPL:
local: ./src/Shared/@MAPL
remote: ../MAPL.git
tag: v2.25.0
#tag: v2.25.0
branch: feature/wjiang/add_all_exports
develop: develop

GEOSgcm_GridComp:
local: ./src/Components/GEOSldas_GridComp/@GEOSgcm_GridComp
remote: ../GEOSgcm_GridComp.git
branch: develop
branch: feature/wjiang/catchcn_ensemble
sparse: ./config/GEOSgcm_GridComp_ldas.sparse
develop: develop
4 changes: 2 additions & 2 deletions src/Applications/LDAS_App/GEOSldas_HIST.rc
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ COLLECTIONS:
>>>HIST_CATCHCN<<< 'CNTOTC' , 'GridComp' ,
>>>HIST_CATCHCN<<< 'CNVEGC' , 'GridComp' ,
>>>HIST_CATCHCN<<< 'CNROOT' , 'GridComp' ,
>>>HIST_CATCHCNCLM45<<< 'CNFROOTC' , 'CATCHCNCLM45' ,
>>>HIST_CATCHCNCLM45<<< 'CNFROOTC' , 'GridComp' ,
>>>HIST_CATCHCN<<< 'CNNPP' , 'GridComp' ,
>>>HIST_CATCHCN<<< 'CNGPP' , 'GridComp' ,
>>>HIST_CATCHCN<<< 'CNSR' , 'GridComp' ,
Expand Down Expand Up @@ -281,7 +281,7 @@ COLLECTIONS:
>>>HIST_CATCHCN<<< 'CNTOTC' , 'GridComp' ,
>>>HIST_CATCHCN<<< 'CNVEGC' , 'GridComp' ,
>>>HIST_CATCHCN<<< 'CNROOT' , 'GridComp' ,
>>>HIST_CATCHCNCLM45<<< 'CNFROOTC' , 'CATCHCNCLM45' ,
>>>HIST_CATCHCNCLM45<<< 'CNFROOTC' , 'GridComp' ,
>>>HIST_CATCHCN<<< 'CNNPP' , 'GridComp' ,
>>>HIST_CATCHCN<<< 'CNGPP' , 'GridComp' ,
>>>HIST_CATCHCN<<< 'CNSR' , 'GridComp' ,
Expand Down
41 changes: 22 additions & 19 deletions src/Applications/LDAS_App/ldas_setup
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ class LDASsetup:
self.ladas_coupling = 0
self.in_rstfile = None
self.in_tilefile = 'None' # default string
self.ens_id_width = 6 # _exxxx
# ------
# Read exe input file which is required to set up the dir
# ------
Expand Down Expand Up @@ -159,7 +160,9 @@ class LDASsetup:
if self.nens > 1:
self.perturb = 1
self.ensdirs = ['ens%04d'%iens for iens in range(self.first_ens_id, self.nens + self.first_ens_id)]
self.ensids = ['%04d'%iens for iens in range(self.first_ens_id, self.nens + self.first_ens_id)]
# if self.ens_id_width = 6, _width = '_e%04d'
_width = '_e%0{}d'.format(self.ens_id_width-2) # -2 for '_e'
self.ensids = [ _width%iens for iens in range(self.first_ens_id, self.nens + self.first_ens_id)]
if (self.nens == 1) :
self.ensdirs_avg = self.ensdirs
self.ensids=['']
Expand Down Expand Up @@ -600,12 +603,12 @@ class LDASsetup:
self._mkdir_p(self.scratchdir)

#-start-shorthand-function-
def _getDirName(outtyp, ensid, yyyymm):
def _getDirName(outtyp, ensdir, yyyymm):
return '/'.join([
self.outdir,
self.rqdExeInp['EXP_DOMAIN'],
outtyp, # ana/cat/rs/rc_out
ensid,
ensdir,
yyyymm
])
#-end-shorthand-function-
Expand All @@ -628,15 +631,15 @@ class LDASsetup:
y4m2_list.append('Y%4d/M%02d' % (newDate.year, newDate.month))

# ExpDomain/ana/, /cat/ directories
for ensid in self.ensdirs_avg:
for ensdir in self.ensdirs_avg:
for y4m2 in y4m2_list:
self._mkdir_p(_getDirName('ana', ensid, y4m2))
self._mkdir_p(_getDirName('cat', ensid, y4m2))
self._mkdir_p(_getDirName('ana', ensdir, y4m2))
self._mkdir_p(_getDirName('cat', ensdir, y4m2))

# ExpDomain/rs/ directories
for ensid in self.ensdirs:
for ensdir in self.ensdirs:
for y4m2 in y4m2_list:
self._mkdir_p(_getDirName('rs', ensid, y4m2))
self._mkdir_p(_getDirName('rs', ensdir, y4m2))

# ExpDomain/rc_out/ - only for _start
self._mkdir_p(_getDirName('rc_out', '', y4m2_list[0]))
Expand Down Expand Up @@ -872,8 +875,8 @@ class LDASsetup:
catchRstFile0 = ''
vegdynRstFile0 = ''
for iens in range(self.nens) :
ens = self.ensdirs[iens]
ensid = self.ensids[iens]
ensdir = self.ensdirs[iens]
ensid = self.ensids[iens]
myCatchRst = myRstDir+'/'+self.catch +ensid +'_internal_rst'
myVegRst = myRstDir+'/'+'vegdyn'+ensid +'_internal_rst'
myPertRst = myRstDir+'/'+ 'landpert' +ensid +'_internal_rst'
Expand All @@ -889,8 +892,8 @@ class LDASsetup:
vegdynRstFile = glob.glob(self.rqdExeInp['BCS_PATH']+'vegdyn_*.dat')[0]
catchRstFile = glob.glob(self.exphome+'/'+exp_id+'/mk_restarts/*'+self.catch+'_internal_rst.'+YYYYMMDD+'*')[0]
else : # RESTART == 1
catchRstFile = rstpath+ens +'/'+ y4m2+'/'+self.rqdExeInp['RESTART_ID']+'.'+self.catch+'_internal_rst.'+y4m2d2_h2m2
vegdynRstFile= rstpath+ens +'/'+self.rqdExeInp['RESTART_ID']+ '.vegdyn_internal_rst'
catchRstFile = rstpath+ensdir +'/'+ y4m2+'/'+self.rqdExeInp['RESTART_ID']+'.'+self.catch+'_internal_rst.'+y4m2d2_h2m2
vegdynRstFile= rstpath+ensdir +'/'+self.rqdExeInp['RESTART_ID']+ '.vegdyn_internal_rst'
if not os.path.isfile(vegdynRstFile): # no vegdyn restart from LDASsa
if not os.path.isfile(vegdynRstFile0):
vegdynRstFile = glob.glob(self.rqdExeInp['BCS_PATH']+'vegdyn_*.dat')[0]
Expand All @@ -900,7 +903,7 @@ class LDASsetup:

# catchment restart file
if os.path.isfile(catchRstFile) :
catchLocal = self.rstdir+ens +'/'+ y4m2+'/'+self.rqdExeInp['EXP_ID']+'.'+self.catch+'_internal_rst.'+y4m2d2_h2m2
catchLocal = self.rstdir+ensdir +'/'+ y4m2+'/'+self.rqdExeInp['EXP_ID']+'.'+self.catch+'_internal_rst.'+y4m2d2_h2m2
if self.islocal :
print( "Creating local catchment restart file... \n")
cmd='./preprocess_ldas.x c_localcatchrst '+ catchRstFile +' ' + catchLocal
Expand All @@ -911,14 +914,14 @@ class LDASsetup:

catchRstFile = catchLocal

if '0000' in ens :
if '0000' in ensdir :
catchRstFile0 = catchRstFile
else : # re-use 0000 catch file
catchRstFile = catchRstFile0

# vegdyn restart file
if os.path.isfile(vegdynRstFile) :
vegdynLocal = self.rstdir+ens +'/'+self.rqdExeInp['EXP_ID']+'.vegdyn_internal_rst'
vegdynLocal = self.rstdir+ensdir +'/'+self.rqdExeInp['EXP_ID']+'.vegdyn_internal_rst'
if self.islocal :
print ("Creating the local veg restart file... \n")
cmd='./preprocess_ldas.x c_localvegrst '+ vegdynRstFile +' ' + vegdynLocal
Expand All @@ -929,14 +932,14 @@ class LDASsetup:

vegdynRstFile = vegdynLocal

if '0000' in ens :
if '0000' in ensdir :
vegdynRstFile0 = vegdynRstFile
else :
vegdynRstFile = vegdynRstFile0

if (self.has_geos_pert and self.perturb == 1) :
pertRstFile = rstpath+ens +'/'+ y4m2+'/'+self.rqdExeInp['RESTART_ID']+'.landpert_internal_rst.'+y4m2d2_h2m2
pertLocal = self.rstdir+ens +'/'+ y4m2+'/'+self.rqdExeInp['EXP_ID']+'.landpert_internal_rst.'+y4m2d2_h2m2
pertRstFile = rstpath+ensdir +'/'+ y4m2+'/'+self.rqdExeInp['RESTART_ID']+'.landpert_internal_rst.'+y4m2d2_h2m2
pertLocal = self.rstdir+ensdir +'/'+ y4m2+'/'+self.rqdExeInp['EXP_ID']+'.landpert_internal_rst.'+y4m2d2_h2m2
shutil.copy(pertRstFile,pertLocal)
pertRstFile = pertLocal

Expand Down Expand Up @@ -1160,7 +1163,7 @@ class LDASsetup:

if self.nens > 1 :
keyn='ENS_ID_WIDTH'
valn='4'
valn=str(self.ens_id_width)
ldasrcInp[keyn]= valn

if self.has_landassim_seed and self.assim :
Expand Down
1 change: 1 addition & 0 deletions src/Applications/LDAS_App/lenkf.j.template
Original file line number Diff line number Diff line change
Expand Up @@ -666,6 +666,7 @@ EOF
set ENSDIR = `echo ens${inens}`
endif
set ENSID = `echo $ENSDIR | cut -c4-7`
set ENSID = _e${ENSID}
if ( $NENS == 1) set ENSID =''
set THISDIR = $EXPDIR/output/$EXPDOMAIN/rs/$ENSDIR/Y${eYEAR}/M${eMON}/
if (! -e $THISDIR ) mkdir -p $THISDIR
Expand Down
6 changes: 6 additions & 0 deletions src/Applications/LDAS_App/process_hist.csh
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,12 @@ endif
if($NENS > 1) then
set GridComp = ENSAVG
sed -i 's|VEGDYN|'VEGDYN0000'|g' $HISTRC
sed -i 's|TP1|'TSOIL1TILE'|g' $HISTRC
sed -i 's|TP2|'TSOIL2TILE'|g' $HISTRC
sed -i 's|TP3|'TSOIL3TILE'|g' $HISTRC
sed -i 's|TP4|'TSOIL4TILE'|g' $HISTRC
sed -i 's|TP5|'TSOIL5TILE'|g' $HISTRC
sed -i 's|TP6|'TSOIL6TILE'|g' $HISTRC
# sed -i 's|DATAATM|'DATAATM0000'|g' $HISTRC
endif

Expand Down
36 changes: 14 additions & 22 deletions src/Components/GEOSldas_GridComp/GEOS_LdasGridComp.F90
Original file line number Diff line number Diff line change
Expand Up @@ -78,15 +78,15 @@ subroutine SetServices(gc, rc)
! ensemble set up:

integer :: i, k
integer,allocatable :: ens_id(:)
integer :: ens_id
type(MAPL_MetaComp), pointer :: MAPL=>null()
type(ESMF_GridComp), pointer :: gcs(:)=>null() ! Children gridcomps
character(len=ESMF_MAXSTR), pointer :: gcnames(:)=>null() ! Children's names
! ErrLog variables
integer :: status
character(len=ESMF_MAXSTR) :: Iam
character(len=ESMF_MAXSTR) :: comp_name
character(len=ESMF_MAXSTR) :: id_string,childname, fmt_str
character(len=ESMF_MAXSTR) :: ensid_string,childname
character(len=ESMF_MAXSTR) :: LAND_ASSIM_STR, mwRTM_file, ENS_FORCING_STR
integer :: ens_id_width
! Local variables
Expand Down Expand Up @@ -173,42 +173,34 @@ subroutine SetServices(gc, rc)
allocate(METFORCE(1))
endif

allocate(ens_id(NUM_ENSEMBLE),LAND(NUM_ENSEMBLE),LANDPERT(NUM_ENSEMBLE))
_ASSERT( ens_id_width < 10, "need 1 billion ensemble members? increase ens_id_width first")
write (fmt_str, "(A2,I1,A1,I1,A1)") "(I", ens_id_width,".",ens_id_width,")"
allocate(LAND(NUM_ENSEMBLE),LANDPERT(NUM_ENSEMBLE))
_ASSERT( ens_id_width < 12, "need 1 billion ensemble members? increase ens_id_width first")

do i=1,NUM_ENSEMBLE
ens_id(i) = i-1 + FIRST_ENS_ID ! id start form FIRST_ENS_ID
if(NUM_ENSEMBLE == 1 .or. .not. ensemble_forcing) then
id_string=''
else
write(id_string, fmt_str) ens_id(i)
endif
ens_id = i-1 + FIRST_ENS_ID ! id start form FIRST_ENS_ID

call get_ensid_string(ensid_string, ens_id, ens_id_width, NUM_ENSEMBLE) ! "_eXXXX"

id_string=trim(id_string)
! allow for Catchment ensemble simulation to be forced with single-member met inputs
if (.not. ensemble_forcing ) ensid_string = ''

childname='METFORCE'//trim(id_string)
childname='METFORCE'//trim(ensid_string)
METFORCE(i) = MAPL_AddChild(gc, name=trim(childname), ss=MetforceSetServices, rc=status)
VERIFY_(status)
! exit after i=1 if using deterministic forcing
if (.not. ensemble_forcing ) exit
enddo

do i=1,NUM_ENSEMBLE
ens_id(i) = i-1 + FIRST_ENS_ID ! id start form FIRST_ENS_ID
if(NUM_ENSEMBLE == 1 ) then
id_string=''
else
write(id_string, fmt_str) ens_id(i)
endif
ens_id = i-1 + FIRST_ENS_ID ! id start form FIRST_ENS_ID

id_string=trim(id_string)
call get_ensid_string(ensid_string, ens_id, ens_id_width, NUM_ENSEMBLE)

childname='LANDPERT'//trim(id_string)
childname='LANDPERT'//trim(ensid_string)
LANDPERT(i) = MAPL_AddChild(gc, name=childname, ss=LandPertSetServices, rc=status)
VERIFY_(status)

childname='LAND'//trim(id_string)
childname='LAND'//trim(ensid_string)
LAND(i) = MAPL_AddChild(gc, name=childname, ss=LandSetServices, rc=status)
VERIFY_(status)
enddo
Expand Down
Loading