Ë
    c½j44  ã                  óH  — d Z ddlmZ ddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZ ddlZ ed«      Zedz  Zedz  Zedz  Zed	z  Zed
z  ZdZh d£ZdZdZdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zd d„Z d!d„Z!e"dk(  r e!«        yy)"a&  Create and optionally submit the Pathfinder ILAMB hydrology/snow study.

The generated study compares the standard ELM run and shallow-snow ELM run
over model years 1980--2022. ILAMB automatically restricts each confrontation
to the overlap with its reference product inside that study window.
é    )ÚannotationsN)ÚPathz%/projects/hpcl-cli185/proj-shared/zdrz020260625.ERA5r025_r05_IcoswISC30E3r5.pm-cpu.20TRz<20260915.ERA5r025_r05_IcoswISC30E3r5.pm-cpu.20TR.shallowSnowz#ilamb_runs/hydrology_snow_1980_2022Ú
ILAMB_DATAzload_ilamb_pf_sysmpi.sh)ÚglobalÚnwnÚnecÚneuÚwsbÚesbÚrfeÚrar>   ÚTWSÚRAINÚSNOWÚTSOIÚQSOILÚQVEGEÚQVEGTÚALTMAXÚH2OSNOÚQRUNOFFÚSOILWATER_10CM)zDATA/regions/GlobalLand.nczDATA/regions/IPCCRegions.nczDATA/swe/CanSISE/swe.nczDATA/snw/CARDAMOM/snw.nczDATA/evspsbl/GLEAMv3.3a/et.ncz DATA/evspsbl/MODIS/et_0.5x0.5.nczDATA/evspsbl/MOD16A2/et.nczDATA/mrro/Dai/runoff.nczDATA/mrro/LORA/LORA.nczDATA/mrro/CLASS/mrro.nczDATA/twsa/GRACE/twsa_0.5x0.5.nczDATA/mrsos/WangMao/mrsos_olc.ncz&DATA/permafrost/Brown2002/Brown2002.ncz"DATA/permafrost/Obu2018/Obu2018.ncz(DATA/active_layer_thickness/CALM/CALM.nczDATA/pr/GPCCv2018/pr.nczDATA/pr/GPCPv2.3/pr.nca6  # Reproducible ILAMB 2.7 configuration for ELM hydrology and snow.
# The variable mappings follow ILAMB's installed ilamb_nohoff_final_CLM.cfg.
#! define_regions = DATA/regions/GlobalLand.nc,DATA/regions/IPCCRegions.nc

[h1: Snow and Frozen Ground]
bgcolor = "#DDEEFF"

[h2: Snow Water Equivalent]
variable       = "H2OSNO"
alternate_vars = "swe,snw"
cmap           = "Blues"
weight         = 10
ctype          = "ConfSWE"

[CanSISE]
source     = "DATA/swe/CanSISE/swe.nc"
weight     = 25
plot_unit  = "cm"
table_unit = "cm"

[CARDAMOM]
source     = "DATA/snw/CARDAMOM/snw.nc"
weight     = 25
plot_unit  = "cm"
table_unit = "cm"

[h2: Active Layer Thickness]
variable       = "ALTMAX"
alternate_vars = "alt"
cmap           = "Blues"
weight         = 5

[CALM]
source     = "DATA/active_layer_thickness/CALM/CALM.nc"
weight     = 25
plot_unit  = "m"
table_unit = "m"

[h2: Permafrost]
variable       = "TSOI"
alternate_vars = "tsl"
weight         = 3

[Brown2002]
ctype  = "ConfPermafrost"
source = "DATA/permafrost/Brown2002/Brown2002.nc"
y0     = 1985.
yf     = 2005.
Teps   = 273.15
dmax   = 3.5

[Obu2018]
ctype  = "ConfPermafrost"
source = "DATA/permafrost/Obu2018/Obu2018.nc"
y0     = 2000.
yf     = 2016.
Teps   = 273.15
dmax   = 3.5

[h1: Hydrology Cycle]
bgcolor = "#E6F9FF"

[h2: Evapotranspiration]
variable       = "et"
alternate_vars = "evspsbl"
derived        = "QVEGE+QVEGT+QSOIL"
cmap           = "Blues"
weight         = 5
mass_weighting = True

[GLEAMv3.3a]
source     = "DATA/evspsbl/GLEAMv3.3a/et.nc"
weight     = 15
table_unit = "mm d-1"
plot_unit  = "mm d-1"

[MODIS]
source     = "DATA/evspsbl/MODIS/et_0.5x0.5.nc"
weight     = 15
table_unit = "mm d-1"
plot_unit  = "mm d-1"

[MOD16A2]
source     = "DATA/evspsbl/MOD16A2/et.nc"
weight     = 15
table_unit = "mm d-1"
plot_unit  = "mm d-1"

[h2: Runoff]
variable       = "runoff"
alternate_vars = "mrro,QRUNOFF"
weight         = 5
mass_weighting = True

[Dai]
ctype  = "ConfRunoff"
source = "DATA/mrro/Dai/runoff.nc"
weight = 15

[LORA]
source     = "DATA/mrro/LORA/LORA.nc"
table_unit = "mm d-1"
plot_unit  = "mm d-1"
weight     = 15

[CLASS]
source     = "DATA/mrro/CLASS/mrro.nc"
plot_unit  = "mm d-1"
table_unit = "mm d-1"
weight     = 25

[h2: Terrestrial Water Storage Anomaly]
variable       = "twsa"
alternate_vars = "tws,TWS"
derived        = "RAIN+SNOW-QVEGE-QVEGT-QSOIL-QRUNOFF"
cmap           = "Blues"
weight         = 5
ctype          = "ConfTWSA"

[GRACE]
source = "DATA/twsa/GRACE/twsa_0.5x0.5.nc"
weight = 25

[h2: Surface Soil Moisture]
variable       = "SOILWATER_10CM"
alternate_vars = "mrsos"
weight         = 3
cmap           = "Blues"

[WangMao]
source = "DATA/mrsos/WangMao/mrsos_olc.nc"
weight = 15

[h2: Precipitation]
variable       = "pr"
derived        = "RAIN+SNOW"
cmap           = "Blues"
weight         = 2
mass_weighting = True

[GPCCv2018]
source     = "DATA/pr/GPCCv2018/pr.nc"
land       = True
weight     = 20
table_unit = "mm d-1"
plot_unit  = "mm d-1"
space_mean = True

[GPCPv2.3]
source     = "DATA/pr/GPCPv2.3/pr.nc"
land       = True
weight     = 20
table_unit = "mm d-1"
plot_unit  = "mm d-1"
space_mean = True
c                óf   — t        j                  | j                  d«      «      j                  «       S )Núutf-8)ÚhashlibÚsha256ÚencodeÚ	hexdigest)Útexts    ú6/Users/zdr/models/ilamb_hydrology_snow/run_workflow.pyr   r   ì   s#   € Ü�>‰>˜$Ÿ+™+ gÓ.Ó/×9Ñ9Ó;Ð;ó    c                óÂ   — | j                   j                  dd¬«       | j                  | j                  dz   «      }|j	                  |d¬«       |j                  | «       y )NT©ÚparentsÚexist_okz.tmpr   )Úencoding)ÚparentÚmkdirÚwith_suffixÚsuffixÚ
write_textÚreplace)Úpathr   Ú	temporarys      r    Úatomic_writer/   ð   sS   € Ø‡K�K×Ñ˜d¨TÐÔ2Ø× Ñ  §¡¨vÑ!5Ó6€IØ×Ñ˜¨ÐÔ0Ø×Ñ�dÕr!   c           	     ó|   — t        | |dz   «      D ��cg c]  }t        dd«      D ]  }|d›d|d›�‘Œ Œ c}}S c c}}w )Né   é   Ú04dú-Ú02d)Úrange)Ú
start_yearÚend_yearÚyearÚmonths       r    Úexpected_monthsr;   ÷   sY   € ô ˜* h°¡lÓ3÷àÜ˜1˜b“\òð ð �ˆ*�A�e˜C�[Ò!ðØ!óð ùó s   “!8c           	     ó\  — | j                  «       st        d| › �«      ‚t        j                  d«      }i }t	        | j                  d«      «      D ]4  }|j                  |j                  «      }|sŒ!|||j                  d«      <   Œ6 t        ||«      }|D �cg c]	  }||vsŒ|‘Œ }	}|	rt        | › dt        |	«      › d|	d d › �«      ‚|D �cg c]  }||   ‘Œ	 }
}t        j                  |
d   «      5 }t	        t        t        |j                   «      z
  «      }|rt        |
d   › d	|› �«      ‚t        |j"                  d
   «      t        |j"                  d   «      dœ}d d d «       t%        | «      t        |
«      t%        |
d   «      t%        |
d   «      dœS c c}w c c}w # 1 sw Y   ŒExY w)Nz Model directory does not exist: z\.elm\.h0\.(\d{4}-\d{2})\.nc$z*.elm.h0.*.ncr1   z is missing z/ required monthly files; first missing months: é   r   z lacks variables ÚlatÚlon)r>   r?   éÿÿÿÿ)r-   Ú
file_countÚ
first_fileÚ	last_fileÚgrid)Úis_dirÚFileNotFoundErrorÚreÚcompileÚsortedÚglobÚsearchÚnameÚgroupr;   ÚRuntimeErrorÚlenÚnetCDF4ÚDatasetÚREQUIRED_MODEL_VARIABLESÚsetÚ	variablesÚ
dimensionsÚstr)r-   r7   r8   ÚpatternÚby_monthÚfilenameÚmatchÚwantedr:   ÚmissingÚselectedÚdatasetÚmissing_variablesrD   s                 r    Úvalidate_modelr`   ÿ   s»  € Ø�;‰;Œ=ÜÐ"BÀ4À&Ð IÓJÐJÜ�j‰jÐ9Ó:€GØ "€HÜ˜4Ÿ9™9 _Ó5Ó6ò 0ˆØ—‘˜xŸ}™}Ó-ˆÚØ'/ˆH�U—[‘[ “^Ò$ð0ô ˜Z¨Ó2€FØ"(ÖB˜¨E¸Ò,AŠuÐB€GÐBÙÜØˆf�L¤ W£ ð /%Ø%,¨S¨b \ Nð4ó
ð 	
ð .4Ö4 E�˜“Ð4€HÐ4Ü	�‰˜ !™Ó	%ð 
¨Ü"Ô#;¼cÀ'×BSÑBSÓ>TÑ#TÓUÐÙÜ (¨1¡+ Ð.?Ð@QÐ?RÐSÓTÐTä�w×)Ñ)¨%Ñ0Ó1Ü�w×)Ñ)¨%Ñ0Ó1ñ
ˆ÷	
ô �D“	Ü˜(“mÜ˜( 1™+Ó&Ü˜ "™Ó&Øñð ùò Cùò 5÷
ð 
ús   Â	FÂ!FÃFÃ2A,F"Æ"F+c                ó²   — t         D �cg c]$  }| |z  j                  «       rŒt        | |z  «      ‘Œ& }}|rt        ddj	                  |«      z   «      ‚y c c}w )NzMissing ILAMB reference files:
ú
)ÚREFERENCE_FILESÚis_filerV   rF   Újoin)Ú
ilamb_rootÚrelpathr\   s      r    Úvalidate_referencesrh   !  sY   € Ü8GÖp¨WÐPZÐ]dÑPd×OmÑOmÕOoŒs�: Ñ'Õ(Ðp€GÐpÙÜÐ BÀTÇYÁYÈwÓEWÑ WÓXÐXð ùò qs
   ‰A¢Ac                ó   — d| › d|› d�S )Nz5# Model name, absolute directory, group
ELM_Control, z', ELM snow experiment
ELM_ShallowSnow, z, ELM snow experiment
© )ÚcontrolÚshallows     r    Úmake_model_setuprm   '  s#   € ð	Ø�yð !Ø#˜9Ð$;ð	=ðr!   c	                ó’   — |rdnd}	dj                  t        «      }
d|› d|› d|› d| › d| › d	|› d
|› d| › d|› d|› d|
› d|› d|› d|	› d�S )Nz --cleanÚ ú z_#!/bin/bash
#SBATCH -A hpcl-cli185
#SBATCH -p serial
#SBATCH -q normal
#SBATCH -N 1
#SBATCH -n z
#SBATCH -c 1
#SBATCH --mem=z
#SBATCH -t z(
#SBATCH -J ilamb_hydro_snow
#SBATCH -o z)/logs/ilamb_hydro_snow_%j.out
#SBATCH -e ze/logs/ilamb_hydro_snow_%j.err

set -eo pipefail
umask 002

set +u
source /etc/profile || true
source z
set -u

export ILAMB_ROOT=z_
export MPLBACKEND=Agg
export OMP_NUM_THREADS=1
export PRTE_MCA_prte_tmpdir_base=/tmp

WORKDIR=aÆ  
export PYTHONPATH="$WORKDIR/runtime_patch:${PYTHONPATH:-}"
mkdir -p "$WORKDIR/logs" "$WORKDIR/build"
cd "$WORKDIR"

echo "hostname=$(hostname)"
echo "date_start=$(date --iso-8601=seconds)"
echo "ilamb=$(command -v ilamb-run)"
echo "ILAMB_ROOT=$ILAMB_ROOT"
echo "ranks=$SLURM_NTASKS"

mpiexec -n "$SLURM_NTASKS" ilamb-run \
  --config "$WORKDIR/ilamb_hydrology_snow.cfg" \
  --model_setup "$WORKDIR/models.txt" \
  --filter ".elm.h0." \
  --study_limits z \
  --regions z` \
  --build_dir "$WORKDIR/build" \
  --title "ELM Control vs Shallow Snow: Hydrology and Snow (r4   z)"z\

status=$?
echo "date_end=$(date --iso-8601=seconds)"
echo "status=$status"
exit "$status"
)re   ÚREGIONS)Úworkdirrf   Ú
env_scriptr7   r8   ÚranksÚmemoryÚwalltimeÚcleanÚclean_optionÚregion_optionss              r    Úmake_sbatchrz   /  sº   € ñ "'‘:¨B€LØ—X‘XœgÓ&€Nðð ˆ7ð àˆhð Øˆ:ð àˆ9ð Øˆ9ð ð 	€|ð ð �,ð 	ð
 
ˆ	ð ð �˜Q˜x˜jð )ØÐð =à=G¸LÈÈ(ÈÐSUÐVbÐUcð dð[3ð 3r!   c                 óš  — t        j                  t        ¬«      } | j                  dt        t
        ¬«       | j                  dt        t        ¬«       | j                  dt        t        ¬«       | j                  dt        t        ¬«       | j                  dt        t        ¬«       | j                  dt        d	¬«       | j                  d
t        d¬«       | j                  dt        d¬«       | j                  dd¬«       | j                  dd¬«       | j                  ddd¬«       | j                  ddd¬«       | j                  «       S )N)Údescriptionz	--control)ÚtypeÚdefaultz--shallow-snowz	--workdirz--ilamb-rootz--env-scriptz--start-yeari¼  z
--end-yeariæ  z--ranksé   z--memoryÚ128G)r~   z
--walltimez12:00:00z--cleanÚ
store_truez.Force ILAMB to recompute cached confrontations)ÚactionÚhelpz--submitzSubmit the generated SLURM job)ÚargparseÚArgumentParserÚ__doc__Úadd_argumentr   ÚDEFAULT_CONTROLÚDEFAULT_SHALLOWÚDEFAULT_WORKDIRÚDEFAULT_ILAMB_ROOTÚDEFAULT_ENV_SCRIPTÚintÚ
parse_args)Úparsers    r    rŽ   rŽ   r  s  € Ü×$Ñ$´Ô9€FØ
×Ñ˜¬$¼ÐÔHØ
×ÑÐ(¬t¼_ÐÔMØ
×Ñ˜¬$¼ÐÔHØ
×Ñ˜¬TÔ;MÐÔNØ
×Ñ˜¬TÔ;MÐÔNØ
×Ñ˜¬S¸$ÐÔ?Ø
×Ñ˜¬3¸ÐÔ=Ø
×Ñ˜	¬°QÐÔ7Ø
×Ñ˜
¨FÐÔ3Ø
×Ñ˜¨jÐÔ9Ø
×Ñ˜	¨,Ð=mÐÔnØ
×Ñ˜
¨<Ð>^ÐÔ_Ø×ÑÓÐr!   c                 ó¢	  — t        «       } | j                  | j                  kD  rt        d«      ‚| j                  dk  rt        d«      ‚| j
                  j                  «       st        | j
                  «      ‚t        t        «      j                  «       j                  dz  }|j                  «       st        |«      ‚t        | j                  | j                  | j                  «      t        | j                  | j                  | j                  «      g}|d   d   |d   d   k7  rt        d|d   d   › d|d   d   › �«      ‚t!        | j"                  «       | j$                  j'                  d	d	¬
«       | j$                  dz  j'                  d	¬«       | j$                  dz  }| j$                  dz  }| j$                  dz  }t)        | j                  | j                  «      }t+        | j$                  | j"                  | j
                  | j                  | j                  | j                  | j,                  | j.                  | j0                  «	      }t3        |t4        «       t3        ||«       t3        ||«       |j7                  d«       t8        j:                  j=                  t8        j>                  j@                  «      jC                  «       tE        jF                  «       | j                  | j                  gtI        tJ        «      |tM        | j"                  «      tM        | j
                  «      | j                  | j,                  | j.                  | j0                  dœ|jN                  tQ        t4        «      |jN                  tQ        |«      |jN                  tQ        |«      dtS        jP                  |jU                  «       «      jW                  «       itI        tX        «      dœ
}| j$                  dz  }	t3        |	t[        j\                  |d¬«      dz   «       t_        dta        d„ |D «       «      › d�«       t_        d| j$                  › �«       | jb                  r|te        jf                  ddtM        |«      gd	d	d	¬«      }
|
jh                  jk                  «       jm                  d«      d   }t3        | j$                  dz  |dz   «       t_        d |› �«       y y )!Nz#start-year must not exceed end-yearr1   zranks must be positivezruntime_patch/sitecustomize.pyr   rD   zModel grids differ: z vs Tr#   Úlogs)r%   zilamb_hydrology_snow.cfgz
models.txtzrun_ilamb_hydrology_snow.sbatchiè  )rt   ru   rv   rw   )
Úcreated_utcÚ
created_onÚstudy_years_inclusiveÚregionsÚmodelsrf   Úenvironment_scriptÚslurmÚfilesÚreference_fileszmanifest.jsoné   )Úindentrb   z
Validated c              3  ó&   K  — | ]	  }|d    –— Œ y­w)rA   Nrj   )Ú.0Úmodels     r    ú	<genexpr>zmain.<locals>.<genexpr>È  s   è ø€ ÒC°5˜5 Õ.ÑCùs   ‚z model fileszWrote workflow inputs to Úsbatchz
--parsable)Úcheckr   Úcapture_outputú;z
job_id.txtzSubmitted SLURM job )7rŽ   r7   r8   Ú
ValueErrorrt   rs   rd   rF   r   Ú__file__Úresolver'   r`   rk   Úshallow_snowrN   rh   rf   rr   r(   rm   rz   ru   rv   rw   r/   ÚCONFIG_TEXTÚchmodÚdtÚdatetimeÚnowÚtimezoneÚutcÚ	isoformatÚplatformÚnodeÚlistrq   rV   rL   r   r   Ú
read_bytesr   rc   ÚjsonÚdumpsÚprintÚsumÚsubmitÚ
subprocessÚrunÚstdoutÚstripÚsplit)ÚargsÚ
patch_pathr–   Úconfig_pathÚmodels_pathÚsbatch_pathÚ
model_textÚsbatch_textÚmanifestÚmanifest_pathÚresultÚjob_ids               r    ÚmainrÊ   ƒ  sÌ  € Ü‹<€DØ‡�˜Ÿ™Ò&ÜÐ>Ó?Ð?Ø‡z�z�A‚~ÜÐ1Ó2Ð2Ø�?‰?×"Ñ"Ô$Ü §¡Ó0Ð0Ü”h“×'Ñ'Ó)×0Ñ0Ð3SÑS€JØ×ÑÔÜ 
Ó+Ð+ô 	�t—|‘| T§_¡_°d·m±mÓDÜ�t×(Ñ(¨$¯/©/¸4¿=¹=ÓIð€Fð ˆa�y�Ñ˜F 1™I fÑ-Ò-ÜÐ1°&¸±)¸FÑ2CÐ1DÀDÈÐPQÉÐSYÑIZÐH[Ð\Ó]Ð]Ü˜Ÿ™Ô(à‡L�L×Ñ˜t¨dÐÔ3Ø	‡\�\�FÑ×!Ñ!¨4Ð!Ô0Ø—,‘,Ð!;Ñ;€KØ—,‘, Ñ-€KØ—,‘,Ð!BÑB€KÜ! $§,¡,°×0AÑ0AÓB€JÜØ�‰Ø�‰Ø�‰Ø�‰Ø�‰Ø�
‰
Ø�‰Ø�‰Ø�
‰
ó
€Kô �œkÔ*Ü�˜jÔ)Ü�˜kÔ*Ø×Ñ�eÔô —{‘{—‘¤r§{¡{§¡Ó7×AÑAÓCÜ—m‘m“oØ"&§/¡/°4·=±=Ð!AÜœ“=ØÜ˜$Ÿ/™/Ó*Ü! $§/¡/Ó2à—Z‘ZØ—k‘kØŸ™Ø—Z‘Zñ	
ð ×Ñœf¤[Ó1Ø×Ñœf ZÓ0Ø×Ñœf [Ó1Ø,¬g¯n©nØ×%Ñ%Ó'ó/ç‰i‹kð
ô  ¤Ó0ñ-€Hð0 —L‘L ?Ñ2€MÜ�¤§
¡
¨8¸AÔ >ÀÑ EÔFä	ˆJ”sÑC¸FÔCÓCÐDÀLÐ
QÔRÜ	Ð% d§l¡l ^Ð
4Ô5Ø‡{‚{Ü—‘Ø�|¤S¨Ó%5Ð6ØØØô	
ˆð —‘×$Ñ$Ó&×,Ñ,¨SÓ1°!Ñ4ˆÜ�T—\‘\ LÑ0°&¸4±-Ô@ÜÐ$ V HÐ-Õ.ð r!   Ú__main__)r   rV   ÚreturnrV   )r-   r   r   rV   rÌ   ÚNone)r7   r�   r8   r�   rÌ   z	list[str])r-   r   r7   r�   r8   r�   rÌ   Údict)rf   r   rÌ   rÍ   )rk   r   rl   r   rÌ   rV   )rr   r   rf   r   rs   r   r7   r�   r8   r�   rt   r�   ru   rV   rv   rV   rw   ÚboolrÌ   rV   )rÌ   zargparse.Namespace)rÌ   rÍ   )#r†   Ú
__future__r   r„   r¬   r«   r   rµ   Úosr±   rG   rº   Úpathlibr   rP   ÚPROJECT_ROOTrˆ   r‰   rŠ   r‹   rŒ   rq   rR   rc   r©   r   r/   r;   r`   rh   rm   rz   rŽ   rÊ   Ú__name__rj   r!   r    ú<module>rÕ      sJ  ðñõ #ã Û Û Û Û 	Û Û 	Û Ý ã ñ Ð;Ó<€ØÐ!SÑS€àØDñEð ð Ð!FÑF€Ø! LÑ0Ð Ø!Ð$=Ñ=Ð ð	€òÐ ð€ð*\€ó~<óóóóDYóð@Øð@àð@ð ð@ð ð	@ð
 ð@ð ð@ð ð@ð ð@ð ð@ð 	ó@óFó"P/ðf ˆzÒÙ…Fð r!   