From 357d6af92b9f0889c06bf6ec22435d027db5af9f Mon Sep 17 00:00:00 2001 From: agstub Date: Mon, 9 Feb 2026 10:59:39 -0500 Subject: [PATCH 01/39] add issm fields to history --- GEOSldas_App/GEOSldas_HIST.rc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/GEOSldas_App/GEOSldas_HIST.rc b/GEOSldas_App/GEOSldas_HIST.rc index 03eebb01..5d232ba6 100644 --- a/GEOSldas_App/GEOSldas_HIST.rc +++ b/GEOSldas_App/GEOSldas_HIST.rc @@ -530,6 +530,8 @@ EASEv2_M36.LM: 1 'ALBNF' , 'LANDICE' , 'ALBNF_GL' , 'ASNOW_GL' , 'LANDICE' , 'DELTS' , 'LANDICE' , + 'ICESMB' , 'LANDICE' , + 'ICEEL' , 'ISSM' , 'DNICFLX' , 'LANDICE' , 'EVAPOUT' , 'LANDICE' , 'QH' , 'LANDICE' , From 03321e6084b4baaaf58173e21a3c05c9f1de642a Mon Sep 17 00:00:00 2001 From: agstub Date: Wed, 11 Feb 2026 12:53:09 -0500 Subject: [PATCH 02/39] add ISSM initialization parameters --- GEOSldas_App/GEOSldas_LDAS.rc | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/GEOSldas_App/GEOSldas_LDAS.rc b/GEOSldas_App/GEOSldas_LDAS.rc index 8ca6018c..da2896ee 100644 --- a/GEOSldas_App/GEOSldas_LDAS.rc +++ b/GEOSldas_App/GEOSldas_LDAS.rc @@ -36,6 +36,28 @@ CATCHMENT_SPINUP: 0 # LSM_CHOICE: 1 +# ---- Ice-Sheet and Sea-Level System Model (ISSM) initialization (for LANDICE tiles) +# +# The first two parameters are arguments needed to initialize ISSM: +# +# *ISSM_EXPDIR points to the directory containing the ISSM input file, which will be +# replaced by a restart directory in the future +# +# *ISSM_EXPNAME is the name of the binary input file (ISSM_EXPNAME.bin) and PETSc +# options file (ISSM_EXPNAME.toolkits) +# +# Because we can't yet output variables defined on ISSM's mesh via HISTORY +# (e.g., via a mesh tilespace), we also have a temporary fix that will be +# eventually removed (note that output on the attached grid or landice tiles +# does still work as expected): +# +# *ISSM_SAVEMESH saves netCDF files of the mesh information, ice elevation, and +# surface mass balance in ISSM_EXPDIR +# +ISSM_EXPDIR: /discover/nobackup/agstubbl/GEOS/Experiments/LDAS-ISSM-dailytest/issm +ISSM_EXPNAME: GreenlandGEOS +ISSM_SAVEMESH: 1 + # ---- Choice of tile type(s) # From 81842f0a0fb45cc61a35377cc5a73afcc34c8e49 Mon Sep 17 00:00:00 2001 From: agstub Date: Fri, 13 Feb 2026 11:22:49 -0500 Subject: [PATCH 03/39] add issm tile mesh collection --- GEOSldas_App/GEOSldas_HIST.rc | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/GEOSldas_App/GEOSldas_HIST.rc b/GEOSldas_App/GEOSldas_HIST.rc index 5d232ba6..c5c7b98b 100644 --- a/GEOSldas_App/GEOSldas_HIST.rc +++ b/GEOSldas_App/GEOSldas_HIST.rc @@ -24,6 +24,7 @@ COLLECTIONS: # 'const_2d_lnd_Nx' # 'tavg24_2d_glc_Nx' # 'tavg24_1d_glc_Nt' +# 'tavg24_1d_issm_Nt' :: # -------------------------------------------------------------------------------------------------- @@ -531,7 +532,6 @@ EASEv2_M36.LM: 1 'ASNOW_GL' , 'LANDICE' , 'DELTS' , 'LANDICE' , 'ICESMB' , 'LANDICE' , - 'ICEEL' , 'ISSM' , 'DNICFLX' , 'LANDICE' , 'EVAPOUT' , 'LANDICE' , 'QH' , 'LANDICE' , @@ -582,4 +582,15 @@ EASEv2_M36.LM: 1 'WESNBOT' , 'LANDICE' , 'WESNEXT' , 'LANDICE' , :: + + tavg24_1d_issm_Nt.descr: 'Tile-space,Daily,Time-Averaged,Single-level,ISSM Diagnostics', + tavg24_1d_issm_Nt.nbits: 12, + tavg24_1d_issm_Nt.template: '%y4%m2%d2_%h2%n2z.nc4' , + tavg24_1d_issm_Nt.mode: 'time-averaged' , + tavg24_1d_issm_Nt.format: 'CFIO', + tavg24_1d_issm_Nt.frequency: 240000 , + tavg24_1d_issm_Nt.ref_time: 000000 , + tavg24_1d_issm_Nt.fields: 'ICEEL' , 'ISSM' , + :: + # ========================== EOF ============================================================== From 77991498373af7bbca3c0cebffa9b911ff6bbca1 Mon Sep 17 00:00:00 2001 From: agstub Date: Mon, 16 Feb 2026 14:42:09 -0500 Subject: [PATCH 04/39] add new issm outputs --- GEOSldas_App/GEOSldas_HIST.rc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/GEOSldas_App/GEOSldas_HIST.rc b/GEOSldas_App/GEOSldas_HIST.rc index c5c7b98b..b0ef0baf 100644 --- a/GEOSldas_App/GEOSldas_HIST.rc +++ b/GEOSldas_App/GEOSldas_HIST.rc @@ -590,7 +590,10 @@ EASEv2_M36.LM: 1 tavg24_1d_issm_Nt.format: 'CFIO', tavg24_1d_issm_Nt.frequency: 240000 , tavg24_1d_issm_Nt.ref_time: 000000 , - tavg24_1d_issm_Nt.fields: 'ICEEL' , 'ISSM' , + tavg24_1d_issm_Nt.fields: 'ICESURF' , 'ISSM' , + 'ICETHICK' , 'ISSM' , + 'ICEVEL' , 'ISSM' , + 'ICESMB' , 'ISSM' , :: # ========================== EOF ============================================================== From 820eb10ed82a8b8049bf70d65573cc9aeb4a631a Mon Sep 17 00:00:00 2001 From: agstub Date: Mon, 16 Feb 2026 15:05:25 -0500 Subject: [PATCH 05/39] remove mesh save flag; history works now --- GEOSldas_App/GEOSldas_LDAS.rc | 2 -- 1 file changed, 2 deletions(-) diff --git a/GEOSldas_App/GEOSldas_LDAS.rc b/GEOSldas_App/GEOSldas_LDAS.rc index da2896ee..5f2b4cec 100644 --- a/GEOSldas_App/GEOSldas_LDAS.rc +++ b/GEOSldas_App/GEOSldas_LDAS.rc @@ -56,8 +56,6 @@ LSM_CHOICE: 1 # ISSM_EXPDIR: /discover/nobackup/agstubbl/GEOS/Experiments/LDAS-ISSM-dailytest/issm ISSM_EXPNAME: GreenlandGEOS -ISSM_SAVEMESH: 1 - # ---- Choice of tile type(s) # From f20df74ac371b7f09a8b20e348397aa8d59f51ab Mon Sep 17 00:00:00 2001 From: agstub Date: Tue, 17 Feb 2026 10:15:16 -0500 Subject: [PATCH 06/39] rm savemesh comment --- GEOSldas_App/GEOSldas_LDAS.rc | 3 --- 1 file changed, 3 deletions(-) diff --git a/GEOSldas_App/GEOSldas_LDAS.rc b/GEOSldas_App/GEOSldas_LDAS.rc index 5f2b4cec..c71fd82d 100644 --- a/GEOSldas_App/GEOSldas_LDAS.rc +++ b/GEOSldas_App/GEOSldas_LDAS.rc @@ -50,9 +50,6 @@ LSM_CHOICE: 1 # (e.g., via a mesh tilespace), we also have a temporary fix that will be # eventually removed (note that output on the attached grid or landice tiles # does still work as expected): -# -# *ISSM_SAVEMESH saves netCDF files of the mesh information, ice elevation, and -# surface mass balance in ISSM_EXPDIR # ISSM_EXPDIR: /discover/nobackup/agstubbl/GEOS/Experiments/LDAS-ISSM-dailytest/issm ISSM_EXPNAME: GreenlandGEOS From 70fbcbb5d93b16ebdacabf58c4f12e328c378573 Mon Sep 17 00:00:00 2001 From: agstub Date: Wed, 11 Mar 2026 14:47:01 -0400 Subject: [PATCH 07/39] rm issm_expname, read at runtime --- GEOSldas_App/GEOSldas_LDAS.rc | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/GEOSldas_App/GEOSldas_LDAS.rc b/GEOSldas_App/GEOSldas_LDAS.rc index c71fd82d..48c7dfaa 100644 --- a/GEOSldas_App/GEOSldas_LDAS.rc +++ b/GEOSldas_App/GEOSldas_LDAS.rc @@ -38,21 +38,10 @@ LSM_CHOICE: 1 # ---- Ice-Sheet and Sea-Level System Model (ISSM) initialization (for LANDICE tiles) # -# The first two parameters are arguments needed to initialize ISSM: -# # *ISSM_EXPDIR points to the directory containing the ISSM input file, which will be # replaced by a restart directory in the future -# -# *ISSM_EXPNAME is the name of the binary input file (ISSM_EXPNAME.bin) and PETSc -# options file (ISSM_EXPNAME.toolkits) -# -# Because we can't yet output variables defined on ISSM's mesh via HISTORY -# (e.g., via a mesh tilespace), we also have a temporary fix that will be -# eventually removed (note that output on the attached grid or landice tiles -# does still work as expected): # -ISSM_EXPDIR: /discover/nobackup/agstubbl/GEOS/Experiments/LDAS-ISSM-dailytest/issm -ISSM_EXPNAME: GreenlandGEOS +ISSM_EXPDIR: /discover/nobackup/agstubbl/GEOS/Experiments/issm_expdir # ---- Choice of tile type(s) # From 87b01147d4efc3720b6dc2f8f6d086f016bbc7e6 Mon Sep 17 00:00:00 2001 From: agstub Date: Wed, 11 Mar 2026 14:48:10 -0400 Subject: [PATCH 08/39] add other issm outputs --- GEOSldas_App/GEOSldas_HIST.rc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/GEOSldas_App/GEOSldas_HIST.rc b/GEOSldas_App/GEOSldas_HIST.rc index b0ef0baf..f0ef61e1 100644 --- a/GEOSldas_App/GEOSldas_HIST.rc +++ b/GEOSldas_App/GEOSldas_HIST.rc @@ -532,6 +532,9 @@ EASEv2_M36.LM: 1 'ASNOW_GL' , 'LANDICE' , 'DELTS' , 'LANDICE' , 'ICESMB' , 'LANDICE' , + 'ICESURF' , 'LANDICE' , + 'ICETHICK' , 'LANDICE' , + 'ICEVEL' , 'LANDICE' , 'DNICFLX' , 'LANDICE' , 'EVAPOUT' , 'LANDICE' , 'QH' , 'LANDICE' , From 93bc709582225669bfbd05a77a84f14f991b6819 Mon Sep 17 00:00:00 2001 From: agstub Date: Thu, 12 Mar 2026 13:54:36 -0400 Subject: [PATCH 09/39] rename ice-equiv smb export (mesh) --- GEOSldas_App/GEOSldas_HIST.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GEOSldas_App/GEOSldas_HIST.rc b/GEOSldas_App/GEOSldas_HIST.rc index f0ef61e1..011c3c18 100644 --- a/GEOSldas_App/GEOSldas_HIST.rc +++ b/GEOSldas_App/GEOSldas_HIST.rc @@ -596,7 +596,7 @@ EASEv2_M36.LM: 1 tavg24_1d_issm_Nt.fields: 'ICESURF' , 'ISSM' , 'ICETHICK' , 'ISSM' , 'ICEVEL' , 'ISSM' , - 'ICESMB' , 'ISSM' , + 'ICEEQSMB' , 'ISSM' , :: # ========================== EOF ============================================================== From 3f9682b8ca06a60020e53000bf67be75ffa80050 Mon Sep 17 00:00:00 2001 From: agstub Date: Mon, 6 Apr 2026 09:37:31 -0400 Subject: [PATCH 10/39] initial additions for issm_internals --- GEOSldas_App/ldas.py | 28 ++++++++++++++++++++++++++++ GEOSldas_App/lenkf_j_template.py | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index d0e98966..23cdf2db 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -101,6 +101,7 @@ def __init__(self, cmdLineArgs): self.tile_types = '' self.with_land = False self.with_landice = False + self.with_issm = False self.adas_expdir = '' # assert necessary optional arguments in command line if exeinp file does not exsit @@ -230,6 +231,10 @@ def __init__(self, cmdLineArgs): assert int(self.ExeInputs['LSM_CHOICE']) <= 2, "\nLSM_CHOICE=3 (Catchment-CN4.5) is no longer supported. Please set LSM_CHOICE to 1 (Catchment) or 2 (Catchment-CN4.0)" if "20" in self.tile_types : self.with_landice = True + + if self.with_landice == True: + if int(self.ExeInputs.get('DO_ISSM'))==1: + self.with_issm = True self.nens = int(self.ExeInputs['NUM_LDAS_ENSEMBLE']) # fails if value of Nens is not an integer self.first_ens_id = int(self.ExeInputs.get('FIRST_ENS_ID',0)) @@ -411,6 +416,11 @@ def __init__(self, cmdLineArgs): landiceRstFile=self.in_rstdir+'/'+tmpFile assert os.path.isfile(landiceRstFile), 'landice_internal_rst file [%s] does not exist!' %(landiceRstFile) + if self.with_issm: + tmpFile=self.ExeInputs['RESTART_ID']+'.issm_internal_rst.'+y4m2d2_h2m2 + issmRstFile=self.in_rstdir+'/'+tmpFile + assert os.path.isfile(landiceRstFile), 'issm_internal_rst file [%s] does not exist!' %(issmRstFile) + # DEAL WITH mwRTM input from exec self.assim = True if self.ExeInputs.get('LAND_ASSIM', 'NO').upper() == 'YES' and self.with_land else False # verify mwrtm file @@ -926,8 +936,17 @@ def createLnRstBc(self) : if self.with_landice : if RESTART_str in ['1', '3'] : landiceRstFile = rstpath+ensdir +'/'+ y4m2+'/'+self.ExeInputs['RESTART_ID']+'.'+'landice_internal_rst.'+y4m2d2_h2m2 + if self.with_issm: + issmRstFile = rstpath+ensdir +'/'+ y4m2+'/'+self.ExeInputs['RESTART_ID']+'.'+'issm_internal_rst.'+y4m2d2_h2m2 + + + if RESTART_str in ['2', 'M']: landiceRstFile = glob.glob(self.exphome+'/'+exp_id+'/mk_restarts/*'+'landice_internal_rst.'+YYYYMMDD+'*')[0] + if self.with_issm: + landiceRstFile = glob.glob(self.exphome+'/'+exp_id+'/mk_restarts/*'+'issm_internal_rst.'+YYYYMMDD+'*')[0] + + if os.path.isfile(landiceRstFile) : landiceLocal = self.rstdir+ensdir +'/'+ y4m2+'/'+self.ExeInputs['EXP_ID']+'.landice_internal_rst.'+y4m2d2_h2m2 @@ -1215,6 +1234,9 @@ def createRCFiles(self): if self.with_landice: rstkey.append('LANDICE') rstval.append('landice') + if self.with_issm: + rstkey.append('ISSM') + rstval.append('issm') if self.has_mwrtm : keyn='LANDASSIM_INTERNAL_RESTART_FILE' @@ -1255,6 +1277,12 @@ def createRCFiles(self): keyn = 'LANDICE_INTERNAL_CHECKPOINT_FILE' valn = 'landice'+tmpl_+'_internal_checkpoint' ldasrcInp[keyn]= valn + if self.with_issm: + keyn = 'ISSM_INTERNAL_CHECKPOINT_FILE' + valn = 'issm'+tmpl_+'_internal_checkpoint' + ldasrcInp[keyn]= valn + + # specify LANDPERT restart file if (self.perturb == 1): keyn = 'LANDPERT_INTERNAL_RESTART_FILE' diff --git a/GEOSldas_App/lenkf_j_template.py b/GEOSldas_App/lenkf_j_template.py index 60443ff0..24ef5a48 100644 --- a/GEOSldas_App/lenkf_j_template.py +++ b/GEOSldas_App/lenkf_j_template.py @@ -721,7 +721,7 @@ set THISDIR = $EXPDIR/output/$EXPDOMAIN/rs/$ENSDIR/Y${{eYEAR}}/M${{eMON}}/ if (! -e $THISDIR ) mkdir -p $THISDIR - set rstfs = (${{LANDMODEL}} 'landice') + set rstfs = (${{LANDMODEL}} 'landice' 'issm') foreach rstf ( $rstfs ) if (-f ${{rstf}}${{ENSID}}_internal_checkpoint ) then set tmp_file = $EXPDIR/output/$EXPDOMAIN/rs/$ENSDIR/Y${{eYEAR}}/M${{eMON}}/${{EXPID}}.${{rstf}}_internal_rst.${{eYEAR}}${{eMON}}${{eDAY}}_${{eHour}}${{eMin}} From c77cfbf9dcac2e7e7327652ab587024f6f4226ff Mon Sep 17 00:00:00 2001 From: agstub Date: Mon, 6 Apr 2026 10:01:13 -0400 Subject: [PATCH 11/39] fixes --- GEOSldas_App/ldas.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index 23cdf2db..88f4ef8c 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -419,7 +419,7 @@ def __init__(self, cmdLineArgs): if self.with_issm: tmpFile=self.ExeInputs['RESTART_ID']+'.issm_internal_rst.'+y4m2d2_h2m2 issmRstFile=self.in_rstdir+'/'+tmpFile - assert os.path.isfile(landiceRstFile), 'issm_internal_rst file [%s] does not exist!' %(issmRstFile) + assert os.path.isfile(issmRstFile), 'issm_internal_rst file [%s] does not exist!' %(issmRstFile) # DEAL WITH mwRTM input from exec self.assim = True if self.ExeInputs.get('LAND_ASSIM', 'NO').upper() == 'YES' and self.with_land else False @@ -877,6 +877,7 @@ def createLnRstBc(self) : ensid = self.ensids[iens] myCatchRst = myRstDir+'/'+self.catch +ensid +'_internal_rst' myLandiceRst = myRstDir+'/'+ 'landice' +ensid +'_internal_rst' + myIssmRst = myRstDir+'/'+ 'issm' +ensid +'_internal_rst' myVegRst = myRstDir+'/'+'vegdyn'+ensid +'_internal_rst' myPertRst = myRstDir+'/'+ 'landpert' +ensid +'_internal_rst' @@ -944,7 +945,7 @@ def createLnRstBc(self) : if RESTART_str in ['2', 'M']: landiceRstFile = glob.glob(self.exphome+'/'+exp_id+'/mk_restarts/*'+'landice_internal_rst.'+YYYYMMDD+'*')[0] if self.with_issm: - landiceRstFile = glob.glob(self.exphome+'/'+exp_id+'/mk_restarts/*'+'issm_internal_rst.'+YYYYMMDD+'*')[0] + issmRstFile = rstpath+ensdir +'/'+ y4m2+'/'+self.ExeInputs['RESTART_ID']+'.'+'issm_internal_rst.'+y4m2d2_h2m2 @@ -979,6 +980,10 @@ def createLnRstBc(self) : if self.with_landice : print("link landice restart: " + myLandiceRst) os.symlink(landiceRstFile, myLandiceRst) + if self.with_issm: + print("link issm restart: " + myIssmRst) + os.symlink(issmRstFile, myIssmRst) + if ( self.has_geos_pert and self.perturb == 1 ): os.symlink(pertRstFile, myPertRst) From ba06a37739e2ebfd1f220c579f70e3d37d13b60a Mon Sep 17 00:00:00 2001 From: agstub Date: Mon, 6 Apr 2026 10:39:46 -0400 Subject: [PATCH 12/39] comment --- GEOSldas_App/ldas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index 88f4ef8c..685a1773 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -944,7 +944,7 @@ def createLnRstBc(self) : if RESTART_str in ['2', 'M']: landiceRstFile = glob.glob(self.exphome+'/'+exp_id+'/mk_restarts/*'+'landice_internal_rst.'+YYYYMMDD+'*')[0] - if self.with_issm: + if self.with_issm: # cheating here since we don't have mk_restarts for issm yet: issmRstFile = rstpath+ensdir +'/'+ y4m2+'/'+self.ExeInputs['RESTART_ID']+'.'+'issm_internal_rst.'+y4m2d2_h2m2 From 1a76989d4c3a559d117e8a0cc301804c51ac073d Mon Sep 17 00:00:00 2001 From: agstub Date: Fri, 24 Apr 2026 15:52:48 -0400 Subject: [PATCH 13/39] update history --- GEOSldas_App/GEOSldas_HIST.rc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/GEOSldas_App/GEOSldas_HIST.rc b/GEOSldas_App/GEOSldas_HIST.rc index 011c3c18..e41ddebd 100644 --- a/GEOSldas_App/GEOSldas_HIST.rc +++ b/GEOSldas_App/GEOSldas_HIST.rc @@ -595,8 +595,9 @@ EASEv2_M36.LM: 1 tavg24_1d_issm_Nt.ref_time: 000000 , tavg24_1d_issm_Nt.fields: 'ICESURF' , 'ISSM' , 'ICETHICK' , 'ISSM' , - 'ICEVEL' , 'ISSM' , - 'ICEEQSMB' , 'ISSM' , + 'ICEVX' , 'ISSM' , + 'ICEVY' , 'ISSM' , + 'ICESMB' , 'ISSM' , :: # ========================== EOF ============================================================== From 103ef9dc5b60df0ed70100a7c4f041f5ea838d74 Mon Sep 17 00:00:00 2001 From: agstub Date: Wed, 29 Apr 2026 16:10:42 -0400 Subject: [PATCH 14/39] remove ISSM_EXPDIR from LDAS.rc --- GEOSldas_App/GEOSldas_LDAS.rc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/GEOSldas_App/GEOSldas_LDAS.rc b/GEOSldas_App/GEOSldas_LDAS.rc index 48c7dfaa..8ca6018c 100644 --- a/GEOSldas_App/GEOSldas_LDAS.rc +++ b/GEOSldas_App/GEOSldas_LDAS.rc @@ -36,12 +36,6 @@ CATCHMENT_SPINUP: 0 # LSM_CHOICE: 1 -# ---- Ice-Sheet and Sea-Level System Model (ISSM) initialization (for LANDICE tiles) -# -# *ISSM_EXPDIR points to the directory containing the ISSM input file, which will be -# replaced by a restart directory in the future -# -ISSM_EXPDIR: /discover/nobackup/agstubbl/GEOS/Experiments/issm_expdir # ---- Choice of tile type(s) # From 5768e8d7b5d1f86d1fc0ca6dd53a98f657cfee08 Mon Sep 17 00:00:00 2001 From: Aaron Stubblefield Date: Thu, 30 Apr 2026 09:28:11 -0400 Subject: [PATCH 15/39] add temporary issm file copy --- GEOSldas_App/lenkf_j_template.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GEOSldas_App/lenkf_j_template.py b/GEOSldas_App/lenkf_j_template.py index 24ef5a48..3b047a98 100644 --- a/GEOSldas_App/lenkf_j_template.py +++ b/GEOSldas_App/lenkf_j_template.py @@ -158,6 +158,10 @@ /bin/cp -f $HOMDIR/*.rc . /bin/cp -f $HOMDIR/*.nml . +# placeholder: will link to ISSM files in input/bcs when ready +/bin/cp /discover/nobackup/agstubbl/GEOS/Experiments/issm_expdir/*.bin . +/bin/cp /discover/nobackup/agstubbl/GEOS/Experiments/issm_expdir/*.toolkits . + set LSMCHOICE = `grep -n -m 1 "LSM_CHOICE" $HOMDIR/LDAS.rc | cut -d':' -f3` ####################################################################### From f3b361f5fffc036c400efcf4816040dafa36158b Mon Sep 17 00:00:00 2001 From: Aaron Stubblefield Date: Thu, 30 Apr 2026 09:29:53 -0400 Subject: [PATCH 16/39] add issm checkpoint move to rs --- GEOSldas_App/lenkf_j_template.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/GEOSldas_App/lenkf_j_template.py b/GEOSldas_App/lenkf_j_template.py index 3b047a98..b3836b6d 100644 --- a/GEOSldas_App/lenkf_j_template.py +++ b/GEOSldas_App/lenkf_j_template.py @@ -763,8 +763,9 @@ set rstfiles2 = `ls landpert${{ENSID}}_internal_checkpoint.*` set rstfiles3 = `ls landassim_obspertrseed${{ENSID}}_checkpoint.*` set rstfiles4 = `ls landice${{ENSID}}_internal_checkpoint.*` + set rstfiles5 = `ls issm${{ENSID}}_internal_checkpoint.*` - foreach rfile ( $rstfiles1 $rstfiles4 ) + foreach rfile ( $rstfiles1 $rstfiles4 $rstfiles5 ) set ThisTime = `echo $rfile | rev | cut -d'.' -f2 | rev` set TY = `echo $ThisTime | cut -c1-4` set TM = `echo $ThisTime | cut -c5-6` From 615441cacb95a8c2d2f74a7ce923820acd796ec4 Mon Sep 17 00:00:00 2001 From: Rolf Reichle Date: Mon, 18 May 2026 18:13:43 -0400 Subject: [PATCH 17/39] add stop during setup when running routing but domain is not global (ldas.py) --- GEOSldas_App/ldas.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index df3304fe..0cc04590 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -362,6 +362,7 @@ def __init__(self, cmdLineArgs): gridname_ = gridname_.replace('SMAP-','').replace('-M','_M') self.ExeInputs['GRIDNAME'] = gridname_ + # to run routing on standard EASE tile space, need EASE_PFAF_TILE_FILE if (self.run_route > 0 and 'EASE' in self.ExeInputs['GRIDNAME']): tmp_ = glob.glob(inpgeom_ + '*Pfafstetter.nc4' + domain_) if (len(tmp_) > 0) : @@ -763,6 +764,10 @@ def createLnRstBc(self) : self.isZoomIn= True #os.remove(self.domain_def.name) + # if running routing, make sure domain is global + if self.run_route>0 and self.isZoomIn=True: + exit( "Must have global domain to run routing model, RUN_ROUTE=" + self.run_route ) + # update tile domain if self.isZoomIn: newZoominTile = tile+'.domain' @@ -908,11 +913,11 @@ def createLnRstBc(self) : for iens in range(self.nens) : ensdir = self.ensdirs[iens] ensid = self.ensids[iens] - myCatchRst = myRstDir+'/'+self.catch +ensid +'_internal_rst' - myLandiceRst = myRstDir+'/'+ 'landice' +ensid +'_internal_rst' - myVegRst = myRstDir+'/'+ 'vegdyn'+ensid +'_internal_rst' + myCatchRst = myRstDir+'/'+ self.catch +ensid +'_internal_rst' + myLandiceRst = myRstDir+'/'+ 'landice' +ensid +'_internal_rst' + myVegRst = myRstDir+'/'+ 'vegdyn' +ensid +'_internal_rst' myPertRst = myRstDir+'/'+ 'landpert' +ensid +'_internal_rst' - myRouteRst = myRstDir+'/'+ 'route' +ensid +'_internal_rst' + myRouteRst = myRstDir+'/'+ 'route' +ensid +'_internal_rst' catchRstFile = '' vegdynRstFile = '' From 1b4d6ea7fb7abef22ea533ddb422f152edc23733 Mon Sep 17 00:00:00 2001 From: agstub Date: Tue, 19 May 2026 14:43:58 -0400 Subject: [PATCH 18/39] conditional gridded history for issm --- GEOSldas_App/GEOSldas_HIST.rc | 6 +++--- GEOSldas_App/ldas.py | 3 ++- GEOSldas_App/process_hist.csh | 8 ++++++++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/GEOSldas_App/GEOSldas_HIST.rc b/GEOSldas_App/GEOSldas_HIST.rc index e41ddebd..46cb2b7e 100644 --- a/GEOSldas_App/GEOSldas_HIST.rc +++ b/GEOSldas_App/GEOSldas_HIST.rc @@ -532,9 +532,9 @@ EASEv2_M36.LM: 1 'ASNOW_GL' , 'LANDICE' , 'DELTS' , 'LANDICE' , 'ICESMB' , 'LANDICE' , - 'ICESURF' , 'LANDICE' , - 'ICETHICK' , 'LANDICE' , - 'ICEVEL' , 'LANDICE' , +>>>HIST_ISSM<<< 'ICESURF' , 'LANDICE' , +>>>HIST_ISSM<<< 'ICETHICK' , 'LANDICE' , +>>>HIST_ISSM<<< 'ICEVEL' , 'LANDICE' , 'DNICFLX' , 'LANDICE' , 'EVAPOUT' , 'LANDICE' , 'QH' , 'LANDICE' , diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index 685a1773..1babd7c4 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -1136,7 +1136,8 @@ def createRCFiles(self): + str(self.ExeInputs['LSM_CHOICE']) + ' ' \ + str(self.ExeInputs['AEROSOL_DEPOSITION']) + ' ' \ + str(self.ExeInputs['RUN_IRRIG']) + ' ' \ - + str(self.nens) + + str(self.nens) + ' ' \ + + str(self.ExeInputs['DO_ISSM']) print(cmd) #os.system(cmd) sp.call(shlex.split(cmd)) diff --git a/GEOSldas_App/process_hist.csh b/GEOSldas_App/process_hist.csh index 6156e736..fb015985 100644 --- a/GEOSldas_App/process_hist.csh +++ b/GEOSldas_App/process_hist.csh @@ -17,6 +17,8 @@ setenv LSM_CHOICE $4 setenv AEROSOL_DEPOSITION $5 setenv RUN_IRRIG $6 setenv NENS $7 +setenv DO_ISSM $8 + # ------------------------------------------------- @@ -67,6 +69,12 @@ else sed -i 's/>>>HIST_IRRIG<<>>HIST_ISSM<<>>HIST_ISSM<< 1) then From 55f9f8b1cb9ea73a97e309298e8ae189f3d4bb8c Mon Sep 17 00:00:00 2001 From: agstub Date: Tue, 19 May 2026 15:30:01 -0400 Subject: [PATCH 19/39] fix indent --- GEOSldas_App/ldas.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index 947a4d12..de79b021 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -1359,10 +1359,10 @@ def createRCFiles(self): valn = val + tmpl_ + '_internal_checkpoint' ldasrcInp[keyn] = valn - if self.with_issm: - keyn = 'ISSM_INTERNAL_CHECKPOINT_FILE' - valn = 'issm'+tmpl_+'_internal_checkpoint' - ldasrcInp[keyn]= valn + if self.with_issm: + keyn = 'ISSM_INTERNAL_CHECKPOINT_FILE' + valn = 'issm'+tmpl_+'_internal_checkpoint' + ldasrcInp[keyn]= valn # specify LANDPERT restart file From 4fc9d4766e45177fad6d7a5093a364e3b2e0ea5b Mon Sep 17 00:00:00 2001 From: agstub Date: Tue, 19 May 2026 16:36:16 -0400 Subject: [PATCH 20/39] add issm bcs symlinks --- GEOSldas_App/ldas.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index de79b021..8e354c0a 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -101,6 +101,7 @@ def __init__(self, cmdLineArgs): self.bcs_dir_land = '' self.bcs_dir_geom = '' self.bcs_dir_landshared = '' + self.bcs_dir_landiceshared = '' self.tile_types = '' self.with_land = False self.with_landice = False @@ -266,6 +267,8 @@ def __init__(self, cmdLineArgs): self.bcs_dir_land = self.ExeInputs['BCS_PATH']+ '/land/' + self.ExeInputs['BCS_RESOLUTION']+'/' self.bcs_dir_geom = self.ExeInputs['BCS_PATH']+ '/geometry/' + self.ExeInputs['BCS_RESOLUTION']+'/' self.bcs_dir_landshared = self.ExeInputs['BCS_PATH']+ '/land/shared/' + self.bcs_dir_landiceshared = self.ExeInputs['BCS_PATH']+ '/landice/shared/' + # make sure MET_PATH and RESTART_PATH have trailing '/' if self.ExeInputs['MET_PATH'][-1] != '/': @@ -835,7 +838,12 @@ def createLnRstBc(self) : if ("catchcn" in self.catch): os.symlink(self.bcs_dir_landshared + 'CO2_MonthlyMean_DiurnalCycle.nc4', \ self.inpdir+'/CO2_MonthlyMean_DiurnalCycle.nc4') - + if self.with_issm: + for pattern in ('*.bin', '*.toolkits'): + for issmbc in glob.glob(self.bcs_dir_landiceshared + pattern): + myISSMBC = self.inpdir + os.path.basename(issmbc) + os.symlink(issmbc, myISSMBC) + # create and link restart print ("Creating and linking restart...") _start = self.begDates[0] From a65c05b8fbce892abc7ed0914aee72dcee7bc8e8 Mon Sep 17 00:00:00 2001 From: Rolf Reichle <54944691+gmao-rreichle@users.noreply.github.com> Date: Tue, 19 May 2026 16:45:01 -0400 Subject: [PATCH 21/39] fix if condition in new consistency check (ldas.py) Co-authored-by: Weiyuan Jiang <52509753+weiyuan-jiang@users.noreply.github.com> --- GEOSldas_App/ldas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index 0cc04590..63fcab16 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -765,7 +765,7 @@ def createLnRstBc(self) : #os.remove(self.domain_def.name) # if running routing, make sure domain is global - if self.run_route>0 and self.isZoomIn=True: + if self.run_route>0 and self.isZoomIn: exit( "Must have global domain to run routing model, RUN_ROUTE=" + self.run_route ) # update tile domain From a613ac300def9b409684590d0beead012556d6ee Mon Sep 17 00:00:00 2001 From: agstub Date: Tue, 19 May 2026 21:39:16 -0400 Subject: [PATCH 22/39] fix indentation --- GEOSldas_App/ldas.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index 8e354c0a..1ce30912 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -1060,9 +1060,9 @@ def createLnRstBc(self) : print("link route restart: " + myRouteRst) os.symlink(routeRstFile, myRouteRst) - if self.with_issm: - print("link issm restart: " + myIssmRst) - os.symlink(issmRstFile, myIssmRst) + if self.with_issm: + print("link issm restart: " + myIssmRst) + os.symlink(issmRstFile, myIssmRst) if ( self.has_geos_pert and self.perturb == 1 ): os.symlink(pertRstFile, myPertRst) From 2fbfbadc575160feedffd2d84bf99bab55abe555 Mon Sep 17 00:00:00 2001 From: agstub Date: Tue, 19 May 2026 21:54:23 -0400 Subject: [PATCH 23/39] include slash in bcs link --- GEOSldas_App/ldas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index 1ce30912..30882e37 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -841,7 +841,7 @@ def createLnRstBc(self) : if self.with_issm: for pattern in ('*.bin', '*.toolkits'): for issmbc in glob.glob(self.bcs_dir_landiceshared + pattern): - myISSMBC = self.inpdir + os.path.basename(issmbc) + myISSMBC = self.inpdir+'/'+os.path.basename(issmbc) os.symlink(issmbc, myISSMBC) # create and link restart From c2788c01423b6d10711959ec876ab38c36a04269 Mon Sep 17 00:00:00 2001 From: agstub Date: Wed, 20 May 2026 09:01:08 -0400 Subject: [PATCH 24/39] fix indentation level --- GEOSldas_App/ldas.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index 30882e37..67f42fdf 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -838,11 +838,12 @@ def createLnRstBc(self) : if ("catchcn" in self.catch): os.symlink(self.bcs_dir_landshared + 'CO2_MonthlyMean_DiurnalCycle.nc4', \ self.inpdir+'/CO2_MonthlyMean_DiurnalCycle.nc4') - if self.with_issm: - for pattern in ('*.bin', '*.toolkits'): - for issmbc in glob.glob(self.bcs_dir_landiceshared + pattern): - myISSMBC = self.inpdir+'/'+os.path.basename(issmbc) - os.symlink(issmbc, myISSMBC) + + if self.with_issm: + for pattern in ('*.bin', '*.toolkits'): + for issmbc in glob.glob(self.bcs_dir_landiceshared + pattern): + myISSMBC = self.inpdir+'/'+os.path.basename(issmbc) + os.symlink(issmbc, myISSMBC) # create and link restart print ("Creating and linking restart...") From 147a76b6cb5eb486a19e687d6f072c8a55a5081c Mon Sep 17 00:00:00 2001 From: agstub Date: Wed, 20 May 2026 09:20:09 -0400 Subject: [PATCH 25/39] put issm files from input into scratch --- GEOSldas_App/lenkf_j_template.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/GEOSldas_App/lenkf_j_template.py b/GEOSldas_App/lenkf_j_template.py index cb4c00f0..dc0a616c 100644 --- a/GEOSldas_App/lenkf_j_template.py +++ b/GEOSldas_App/lenkf_j_template.py @@ -158,9 +158,11 @@ /bin/cp -f $HOMDIR/*.rc . /bin/cp -f $HOMDIR/*.nml . -# placeholder: will link to ISSM files in input/bcs when ready -/bin/cp /discover/nobackup/agstubbl/GEOS/Experiments/issm_expdir/*.bin . -/bin/cp /discover/nobackup/agstubbl/GEOS/Experiments/issm_expdir/*.toolkits . +# copy ISSM input files to scratch if they exist +foreach pattern ( "$HOMDIR/input/ISSM*.bin" "$HOMDIR/input/ISSM*.toolkits" ) + set issm_files = ( $pattern ) + if ( -e "$issm_files[1]" ) /bin/cp $issm_files . +end set LSMCHOICE = `grep -n -m 1 "LSM_CHOICE" $HOMDIR/LDAS.rc | cut -d':' -f3` From 3b1a01cef5bbd5c5726cba6cc7d6e62a96996b50 Mon Sep 17 00:00:00 2001 From: agstub Date: Wed, 20 May 2026 09:36:57 -0400 Subject: [PATCH 26/39] fix input file dir path --- GEOSldas_App/lenkf_j_template.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GEOSldas_App/lenkf_j_template.py b/GEOSldas_App/lenkf_j_template.py index dc0a616c..e637f653 100644 --- a/GEOSldas_App/lenkf_j_template.py +++ b/GEOSldas_App/lenkf_j_template.py @@ -159,7 +159,7 @@ /bin/cp -f $HOMDIR/*.nml . # copy ISSM input files to scratch if they exist -foreach pattern ( "$HOMDIR/input/ISSM*.bin" "$HOMDIR/input/ISSM*.toolkits" ) +foreach pattern ( "$EXPDIR/input/ISSM*.bin" "$EXPDIR/input/ISSM*.toolkits" ) set issm_files = ( $pattern ) if ( -e "$issm_files[1]" ) /bin/cp $issm_files . end From 342079e546f6817c0a6d8bbb2d626db5407884db Mon Sep 17 00:00:00 2001 From: agstub Date: Tue, 26 May 2026 15:28:35 -0400 Subject: [PATCH 27/39] fix issm cp command --- GEOSldas_App/lenkf_j_template.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/GEOSldas_App/lenkf_j_template.py b/GEOSldas_App/lenkf_j_template.py index e637f653..fdd743a4 100644 --- a/GEOSldas_App/lenkf_j_template.py +++ b/GEOSldas_App/lenkf_j_template.py @@ -158,11 +158,8 @@ /bin/cp -f $HOMDIR/*.rc . /bin/cp -f $HOMDIR/*.nml . -# copy ISSM input files to scratch if they exist -foreach pattern ( "$EXPDIR/input/ISSM*.bin" "$EXPDIR/input/ISSM*.toolkits" ) - set issm_files = ( $pattern ) - if ( -e "$issm_files[1]" ) /bin/cp $issm_files . -end +# copy ISSM input files to scratch +/bin/find $EXPDIR/input -maxdepth 1 -name "ISSM*" -exec /bin/cp {} . \; set LSMCHOICE = `grep -n -m 1 "LSM_CHOICE" $HOMDIR/LDAS.rc | cut -d':' -f3` From 7c6d5e964df88b412a7a430eba1cc0d291345984 Mon Sep 17 00:00:00 2001 From: agstub Date: Wed, 27 May 2026 13:04:49 -0400 Subject: [PATCH 28/39] move issm_mesh.nc to rc_out if exists --- GEOSldas_App/lenkf_j_template.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/GEOSldas_App/lenkf_j_template.py b/GEOSldas_App/lenkf_j_template.py index fdd743a4..e976e069 100644 --- a/GEOSldas_App/lenkf_j_template.py +++ b/GEOSldas_App/lenkf_j_template.py @@ -161,6 +161,9 @@ # copy ISSM input files to scratch /bin/find $EXPDIR/input -maxdepth 1 -name "ISSM*" -exec /bin/cp {} . \; +# move ISSM auxiliary mesh file to rc_out +if (-e $EXPDIR/input/ISSM_MESH.nc) mv $EXPDIR/input/ISSM_MESH.nc $EXPDIR/output/$EXPDOMAIN/rc_out + set LSMCHOICE = `grep -n -m 1 "LSM_CHOICE" $HOMDIR/LDAS.rc | cut -d':' -f3` ####################################################################### From 08c552ac15ec5e3937984449b61b14e2f64c885e Mon Sep 17 00:00:00 2001 From: agstub Date: Wed, 27 May 2026 13:28:18 -0400 Subject: [PATCH 29/39] double curly brace on issm copy command --- GEOSldas_App/lenkf_j_template.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GEOSldas_App/lenkf_j_template.py b/GEOSldas_App/lenkf_j_template.py index e976e069..f6b73d9f 100644 --- a/GEOSldas_App/lenkf_j_template.py +++ b/GEOSldas_App/lenkf_j_template.py @@ -159,10 +159,10 @@ /bin/cp -f $HOMDIR/*.nml . # copy ISSM input files to scratch -/bin/find $EXPDIR/input -maxdepth 1 -name "ISSM*" -exec /bin/cp {} . \; +/bin/find $EXPDIR/input -maxdepth 1 -name "ISSM*" -exec /bin/cp {{}} . \; # move ISSM auxiliary mesh file to rc_out -if (-e $EXPDIR/input/ISSM_MESH.nc) mv $EXPDIR/input/ISSM_MESH.nc $EXPDIR/output/$EXPDOMAIN/rc_out +if (-e $EXPDIR/input/ISSM_MESH.nc) /bin/mv $EXPDIR/input/ISSM_MESH.nc $EXPDIR/output/$EXPDOMAIN/rc_out set LSMCHOICE = `grep -n -m 1 "LSM_CHOICE" $HOMDIR/LDAS.rc | cut -d':' -f3` From 59347b76c86dfcff51ec9bf73bdf235f5b153b2c Mon Sep 17 00:00:00 2001 From: agstub Date: Wed, 27 May 2026 14:03:06 -0400 Subject: [PATCH 30/39] fix escape seq complaint --- GEOSldas_App/lenkf_j_template.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GEOSldas_App/lenkf_j_template.py b/GEOSldas_App/lenkf_j_template.py index f6b73d9f..bd17e805 100644 --- a/GEOSldas_App/lenkf_j_template.py +++ b/GEOSldas_App/lenkf_j_template.py @@ -159,7 +159,7 @@ /bin/cp -f $HOMDIR/*.nml . # copy ISSM input files to scratch -/bin/find $EXPDIR/input -maxdepth 1 -name "ISSM*" -exec /bin/cp {{}} . \; +/bin/find $EXPDIR/input -maxdepth 1 -name "ISSM*" -exec /bin/cp {{}} . \\; # move ISSM auxiliary mesh file to rc_out if (-e $EXPDIR/input/ISSM_MESH.nc) /bin/mv $EXPDIR/input/ISSM_MESH.nc $EXPDIR/output/$EXPDOMAIN/rc_out From 3e4303b15138750787a94f704f118be9e3e54b3c Mon Sep 17 00:00:00 2001 From: agstub Date: Wed, 10 Jun 2026 10:48:06 -0400 Subject: [PATCH 31/39] remove icesmb_issm from time-avg hist collection --- GEOSldas_App/GEOSldas_HIST.rc | 1 - 1 file changed, 1 deletion(-) diff --git a/GEOSldas_App/GEOSldas_HIST.rc b/GEOSldas_App/GEOSldas_HIST.rc index e6464fcf..a442e777 100644 --- a/GEOSldas_App/GEOSldas_HIST.rc +++ b/GEOSldas_App/GEOSldas_HIST.rc @@ -614,7 +614,6 @@ EASEv2_M36.LM: 1 'ICETHICK' , 'ISSM' , 'ICEVX' , 'ISSM' , 'ICEVY' , 'ISSM' , - 'ICESMB' , 'ISSM' , :: # ========================== EOF ============================================================== From 2a456d363dfef120ea0be5929d1291df8ad225b1 Mon Sep 17 00:00:00 2001 From: agstub Date: Thu, 18 Jun 2026 13:39:46 -0400 Subject: [PATCH 32/39] no remap restarts for issm; bootstrap --- GEOSldas_App/ldas.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index 67f42fdf..e9b1457e 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -997,9 +997,6 @@ def createLnRstBc(self) : if RESTART_str in ['2', 'M']: landiceRstFile = glob.glob(self.exphome+'/'+exp_id+'/mk_restarts/*'+'landice_internal_rst.'+YYYYMMDD+'*')[0] - if self.with_issm: # cheating here since we don't have mk_restarts for issm yet: - issmRstFile = rstpath+ensdir +'/'+ y4m2+'/'+self.ExeInputs['RESTART_ID']+'.'+'issm_internal_rst.'+y4m2d2_h2m2 - if os.path.isfile(landiceRstFile) : From f1d395ae61f60656942c75aa6ac12c8a81bf1d47 Mon Sep 17 00:00:00 2001 From: agstub Date: Thu, 18 Jun 2026 21:30:40 -0400 Subject: [PATCH 33/39] make issm bcs also link to mesh file --- GEOSldas_App/ldas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index d97a1902..3c21e1f9 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -845,7 +845,7 @@ def createLnRstBc(self) : self.inpdir+'/CO2_MonthlyMean_DiurnalCycle.nc4') if self.with_issm: - for pattern in ('*.bin', '*.toolkits'): + for pattern in ('*.bin', '*.toolkits', '*.nc*'): for issmbc in glob.glob(self.bcs_dir_landiceshared + pattern): myISSMBC = self.inpdir+'/'+os.path.basename(issmbc) os.symlink(issmbc, myISSMBC) From ae05720109839e1483d2fab9eb44868eef9a1877 Mon Sep 17 00:00:00 2001 From: agstub Date: Mon, 22 Jun 2026 09:55:16 -0400 Subject: [PATCH 34/39] link issm restarts in case 1 --- GEOSldas_App/ldas.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index 3c21e1f9..54d6a6ba 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -1064,9 +1064,10 @@ def createLnRstBc(self) : os.symlink(routeRstFile, myRouteRst) if self.with_issm: - print("link issm restart: " + myIssmRst) - os.symlink(issmRstFile, myIssmRst) - + if RESTART_str in ['1', '3']: + print("link issm restart: " + myIssmRst) + os.symlink(issmRstFile, myIssmRst) + if ( self.has_geos_pert and self.perturb == 1 ): os.symlink(pertRstFile, myPertRst) From a82e9d309a6fc544dd73a7a78fd75c24b0ff6789 Mon Sep 17 00:00:00 2001 From: agstub Date: Fri, 26 Jun 2026 14:49:58 -0400 Subject: [PATCH 35/39] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e90f3063..24b287e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added support for river routing. - Added optional NetCDF4 output mode for ObsFcstAna, including NetCDF metadata and runtime context. Changed namelist variable "out_ObsFcstAna" from logical to integer. +- Added support for running ISSM (Ice-Sheet and Sea-level System Model). This includes a new collection in GEOSldas_HIST.rc (tavg24_1d_issm_Nt) as well as additions to the landice gridded collection (tavg24_2d_glac_Nx), and small additions to lenkf_j_template.py and ldas.py for handling ISSM boundary conditions and restarts. ### Changed From dc5e429b7946dca578f4bd75157a68e3b2b940eb Mon Sep 17 00:00:00 2001 From: agstub Date: Tue, 30 Jun 2026 10:58:15 -0400 Subject: [PATCH 36/39] add restrictions in issm zoom and restart options --- GEOSldas_App/ldas.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index 54d6a6ba..773f46e8 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -780,6 +780,9 @@ def createLnRstBc(self) : # if running routing, make sure domain is global if self.run_route>0 and self.isZoomIn: exit( "Must have global domain to run routing model, RUN_ROUTE=" + self.run_route ) + # if running ISSM, make sure domain is global + if self.with_issm and self.isZoomIn: + exit( "Must have global domain to run ISSM (DO_ISSM: 1)") # update tile domain if self.isZoomIn: @@ -1002,6 +1005,10 @@ def createLnRstBc(self) : if RESTART_str in ['2', 'M']: landiceRstFile = glob.glob(self.exphome+'/'+exp_id+'/mk_restarts/*'+'landice_internal_rst.'+YYYYMMDD+'*')[0] + if self.with_issm and RESTART_str in ['2']: + exit( "Restart '2' not supported when running ISSM (DO_ISSM: 1)") + if self.with_issm and RESTART_str in ['M']: + print("issm_internal_rst will be bootstrapped for Restart 'M' ") if os.path.isfile(landiceRstFile) : From d4240354a476f24c09b5e71eb5681962ae24f0c3 Mon Sep 17 00:00:00 2001 From: Aaron Stubblefield Date: Wed, 1 Jul 2026 17:56:33 -0400 Subject: [PATCH 37/39] copy initial issm rst to outpu rs --- GEOSldas_App/ldas.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index 773f46e8..1fb592fa 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -1028,6 +1028,16 @@ def createLnRstBc(self) : else : landiceRstFile = landiceRstFile0 + if os.path.isfile(issmRstFile) : + issmLocal = self.rstdir+ensdir +'/'+ y4m2+'/'+self.ExeInputs['EXP_ID']+'.issm_internal_rst.'+y4m2d2_h2m2 + shutil.copy(issmRstFile,issmLocal) + issmRstFile = issmLocal + + if '0000' in ensdir : + issmRstFile0 = issmRstFile + else : + issmRstFile = issmRstFile0 + routeRstFile = '' if self.run_route > 0 : if RESTART_str in ['1', '2'] : From 7c1baa09fca63f9e5e064a4b4511cf127b92eb68 Mon Sep 17 00:00:00 2001 From: agstub Date: Wed, 8 Jul 2026 11:53:43 -0400 Subject: [PATCH 38/39] add with_issm check --- GEOSldas_App/ldas.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index 1fb592fa..721195e6 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -1028,15 +1028,16 @@ def createLnRstBc(self) : else : landiceRstFile = landiceRstFile0 - if os.path.isfile(issmRstFile) : - issmLocal = self.rstdir+ensdir +'/'+ y4m2+'/'+self.ExeInputs['EXP_ID']+'.issm_internal_rst.'+y4m2d2_h2m2 - shutil.copy(issmRstFile,issmLocal) - issmRstFile = issmLocal - - if '0000' in ensdir : - issmRstFile0 = issmRstFile - else : - issmRstFile = issmRstFile0 + if self.with_issm: + if os.path.isfile(issmRstFile) : + issmLocal = self.rstdir+ensdir +'/'+ y4m2+'/'+self.ExeInputs['EXP_ID']+'.issm_internal_rst.'+y4m2d2_h2m2 + shutil.copy(issmRstFile,issmLocal) + issmRstFile = issmLocal + + if '0000' in ensdir : + issmRstFile0 = issmRstFile + else : + issmRstFile = issmRstFile0 routeRstFile = '' if self.run_route > 0 : From 56b765852e11b94c9a75853a3564a2e2b0ab9ce2 Mon Sep 17 00:00:00 2001 From: agstub Date: Thu, 9 Jul 2026 15:22:07 -0400 Subject: [PATCH 39/39] init empty issmRstFile str --- GEOSldas_App/ldas.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/GEOSldas_App/ldas.py b/GEOSldas_App/ldas.py index 721195e6..08b8456d 100644 --- a/GEOSldas_App/ldas.py +++ b/GEOSldas_App/ldas.py @@ -932,6 +932,8 @@ def createLnRstBc(self) : catchRstFile0 = '' vegdynRstFile0 = '' landiceRstFile0 = '' + issmRstFile0 = '' + for iens in range(self.nens) : ensdir = self.ensdirs[iens] ensid = self.ensids[iens] @@ -995,6 +997,7 @@ def createLnRstBc(self) : vegdynRstFile = vegdynRstFile0 landiceRstFile = '' + issmRstFile = '' if self.with_landice : if RESTART_str in ['1', '3'] : landiceRstFile = rstpath+ensdir +'/'+ y4m2+'/'+self.ExeInputs['RESTART_ID']+'.'+'landice_internal_rst.'+y4m2d2_h2m2