+
    9®%j¶=  ã                   ó¤   € R t ^ RIt^ RIt^ RIHtHt ^ RIHtHtH	t	 ^ RI
t
^ RItRR R lltRR R lltRR R	 lltR
 tRR R lltRR R lltR# )aù  
accumulate.py -- Acumulados de precipitacao para PREC, PRCV e PRGE

Logica de acumulo:
------------------
O modelo tem saida HORARIA. A precipitacao NAO e definida na analise (hora 0),
portanto o acumulo NUNCA inclui o timestep 0.

Frequencia de acumulo configuravel via parametro accum_hours (padrao: 24).

Para accum_hours = 24 (convencao meteorologica):
  Duas janelas sao geradas em paralelo:
    ACUM00Z: acumula de 00Z a 00Z (validade em horario 00Z)
    ACUM12Z: acumula de 12Z a 12Z (validade em horario 12Z)

  Para run iniciando em 00Z (ex: 2026060400):
    ACUM00Z: soma FH 1-24  -> val. 2026060500 (00Z dia seguinte)
             soma FH 25-48 -> val. 2026060600
             ...
    ACUM12Z: soma FH 13-36 -> val. 2026060512
             soma FH 37-60 -> val. 2026060612
             ...
    Janela FH 109-132 seria o 5o ciclo, mas so ha FH ate 120
    -> janela incompleta -> DESCARTADA

  Para run iniciando em 12Z (ex: 2026060412):
    ACUM12Z: soma FH 1-24  -> val. 2026060512
    ACUM00Z: soma FH 13-36 -> val. 2026060600
             ...

Para outros periodos (ex: accum_hours = 6, 12, 48, 72):
  Janelas sequenciais comecando no FH dt_hours (primeiro FH disponivel):
    FH 1-6  -> val. YYYYMMDDHH   (accum_hours=6)
    FH 7-12 -> val. YYYYMMDDHH
    ...

Nomenclatura dos arquivos:
  PREC_ACUM24h_2026060500.tif   -- acumulo de 24h, validade 2026-06-05 00Z
  PREC_ACUM12h_2026060512.tif   -- acumulo de 12h, validade 2026-06-05 12Z
  PREC_ACUM6h_2026060506.tif    -- acumulo de  6h, validade 2026-06-05 06Z
N)ÚdatetimeÚ	timedelta)ÚListÚDictÚOptionalc                ój   € V ^8„  d   QhR\         R\        R\        R\        R\        \        ,          /# )é   Út0ÚntimesÚdt_hoursÚaccum_hoursÚreturn)r   Úintr   r   )Úformats   "ÚF/pesq/dados/sismom/SisMOM/sismom_fig/Figuras_Eta/scripts/accumulate.pyÚ__annotate__r   8   sE   € ÷ dñ dÜðdäðdô ðdô ð	dô
 
Œ$…Zñdó    c                ó¨  € V e   T M\         P                  p Ve   TM\         P                  pVe   TM\         P                  pW2,          ^ 8w  d   \	        RV RV RV R24      hV^,
          V,          pW2,          pV^8X  dÚ   V P
                  pV^ 8X  d   RV3R^V,           3.pM&V^8X  d   RV3R^V,           3.pMRV3R^V,           3.p. pV Fs  w  ršT
pWµ^,
          V,          ,           V8:  g   K$  Wµ^,
          V,          ,           pV \        VR7      ,           pVP                  RV	R	VR
VRVRVRV/4       V^,          pKn  	  VP                  R R7       V# RV R2p. pTpWµ^,
          V,          ,           V8:  dQ   Wµ^,
          V,          ,           pV \        VR7      ,           pVP                  RVR	VR
VRVRVRV/4       W³,          pKk  V# )u+  
Determina todas as janelas de acumulo validas para o run.

Para accum_hours=24: gera janelas ACUM00Z e ACUM12Z (convencao sinÃ³tica).
Para outros periodos: gera janelas sequenciais comecando no FH dt_hours.

Janelas incompletas (menos de accum_hours/dt_hours arquivos disponiveis)
sao automaticamente descartadas.

Parameters
----------
t0          : inicio do run (padrao: config.T0)
ntimes      : numero de timesteps disponiveis (padrao: config.NTIMES)
dt_hours    : intervalo de saida do modelo em horas (padrao: config.DT_HOURS)
accum_hours : periodo de acumulo em horas (padrao: 24)
              Deve ser multiplo de dt_hours.
              Exemplos: 6, 12, 24, 48, 72

Returns
-------
Lista de dicts ordenada por (validade, tipo):
  {
    'type'       : str   -- 'ACUM00Z' | 'ACUM12Z' | 'ACUM{N}h'
    'start_fh'   : int   -- primeiro FH incluido (em horas)
    'end_fh'     : int   -- ultimo FH incluido (em horas)
    'validity'   : datetime
    'n_steps'    : int   -- numero de arquivos somados
    'accum_hours': int   -- periodo do acumulo em horas
  }
zaccum_hours=z nao e multiplo de dt_hours=z. Escolha um valor multiplo de zh.ÚACUM00ZÚACUM12Z©ÚhoursÚtypeÚstart_fhÚend_fhÚvalidityÚn_stepsr   c                 ó&   € V R ,          V R,          3# )r   r   © )Úws   &r   Ú<lambda>Ú*get_accumulation_windows.<locals>.<lambda>‡   s   €  A j¥M°1°Vµ9Ñ#=r   )ÚkeyÚACUMÚh)	ÚconfigÚT0ÚNTIMESÚDT_HOURSÚ
ValueErrorÚhourr   ÚappendÚsort)r	   r
   r   r   Úmax_fhr   Úrun_hourÚcycle_startsÚwindowsÚ
accum_typer   Úfhr   r   Úlabels   &&&&           r   Úget_accumulation_windowsr4   8   s$  € ðH Ò/‰r´V·Y±Y€BØ!Ò/‰v´V·]±]€FØ#Ò/‰x´V·_±_€HàÕ Ô"ÜØ˜;˜-Ð'CÀHÀ:ð N,Ø,4¨:°Rð9ó
ð 	
ð
 ˜�z˜XÕ%€FØÕ%€Gð �bÔØ—7‘7ˆØ�qŒ=Ø&¨Ð1Ø&¨¨X­Ð6ð8‰Là˜Œ^Ø&¨Ð1Ø&¨¨X­Ð6ð8‰Lð '¨Ð1Ø&¨¨X­Ð6ð8ˆLð ˆÛ$0Ñ ˆJØˆBØ !� xÕ/Õ/°6Ö9Ø¨1¥°Õ 8Õ8�Ø¤	°Ô 7Õ7�Ø—‘Ø :Ø 2Ø 6Ø 8Ø 7Ø! ;ð ô ð �b•’ñ %1ð 	�‰Ñ=ˆÔ>ð* €Nð# ˜˜ QÐ'ˆØˆØˆà˜a•K 8Õ+Õ+¨vÔ5Ø q�[¨HÕ4Õ4ˆFØœI¨FÔ3Õ3ˆHØ�N‰NØ˜uØ˜rØ˜vØ˜xØ˜wØ˜{ðô ð ÕŠBà€Nr   c                ó~   € V ^8„  d   QhR\         R\         R\        R\        R\        \        P
                  ,          /# )r   Údata_dirÚvar_nameÚwindowÚ
sequentialr   )Ústrr   Úboolr   ÚnpÚndarray)r   s   "r   r   r   £   sC   € ÷ %ñ %Üð%äð%ô ð%ô ð	%ô
 Œb�j‰jÕñ%r   c           	     ó¬  € \         P                  pRp\        VR,          4       EF  pVR,          Wd,          ,           p\         P                  \	        VR7      ,           p \
        P                  ! WWR7      p	Tf'   \        P                  ! T	\        P                  R7      p\        P                  ! RRR7      ;_uu_ 4        \        P                  ! \        P                  ! T	4      \        P                  ! T4      ,          \        P                  YY,           4      pRRR4       EK  	  V#   \         d      R# i ; i  + '       g   i     EK.  ; i)	a¹  
Soma os campos de precipitacao de todos os FH dentro de uma janela.

Parameters
----------
data_dir   : diretorio com os arquivos .bin
var_name   : nome da variavel (PREC, PRCV ou PRGE)
window     : dict retornado por get_accumulation_windows()
sequential : True se .bin usa marcadores Fortran

Returns
-------
np.ndarray (NY, NX) em metros (unidade original), ou None se qualquer
arquivo estiver ausente (janela incompleta -> descartada).
Nr   r   r   )r9   )ÚdtypeÚignore)ÚinvalidÚover)r%   r(   Úranger&   r   ÚreaderÚ
read_fieldÚFileNotFoundErrorr<   Ú
zeros_likeÚfloat32ÚerrstateÚwhereÚisnanÚnan)
r6   r7   r8   r9   ÚdtÚaccÚstepr2   ÚtÚfields
   &&&&      r   Úcompute_accumulationrR   £   sé   € ô* �/‰/€BØ
€Cä�f˜YÕ'×(ˆØ�JÕ $¥)Õ+ˆÜ�Y‰Yœ¨Ô,Õ,ˆð	Ü×%Ò% h°8ÔSˆEð Š;Ü—-’- ¬R¯Z©ZÔ8ˆCÜ�[Š[ °×9Ö9Ü—(’(œ2Ÿ8š8 E›?¬R¯XªX°c«]Õ:¼B¿F¹FÀCÅKÓPˆC÷ :Ò9ñ )ð €Jøô !ô 	Ûð	ú÷
 :×9Ñ9ús   Á!D.ÃAEÄ.D>Ä=D>ÅEc          
      óT   € V ^8„  d   QhR\         R\        R\        R\         R\         /# )r   r7   r   r   Úextr   )r:   r   r   )r   s   "r   r   r   Ï   sA   € ÷ Rñ RÜðRäðRô ðRô 
ð	Rô
 	ñRr   c                ó:   € V  RV RVP                  R4       RV 2# )zŠ
Gera o nome do arquivo de acumulado.

Exemplos:
  PREC_ACUM24h_2026060500.tif
  PREC_ACUM12h_2026060512.tif
  PREC_ACUM6h_2026060506.tif
Ú_ACUMÚh_z%Y%m%d%HÚ.)Ústrftime)r7   r   r   rT   s   &&&&r   Úaccum_filenamerZ   Ï   s-   € ð ˆZ�u˜[˜M¨¨H×,=Ñ,=¸jÓ,IÐ+JÈ!ÈCÈ5ÐQÐQr   c                óª  € V w  rr4rVrx^ RI p	\        P                  P                  WB RV R24      p
\        P                  ! V
RR7       \        W#R,          VR7      p\        P                  P                  W«4      pV'       d3   \        P                  P                  V4      '       d   W#R,          VRR3# \        WW64      pVf   W#R,          RR	R
3#  V	P                  V	P                  WÒ4      VRVR\        P                  P                  W"4      RRRVR,          R\        VR,          4      R\        VR,          4      R\        VR,          4      RVR,          P                  R4      RR\        P                   2R\        V	P                   4      /
VR7       W#R,          VRR
3#   \"         d!   pY#R,          R\        T4      R
3u Rp?# Rp?ii ; i)z/Worker paralelo para gerar um COG de acumulado.NrV   r$   T©Úexist_okr   ©r   r   úarquivo ausenteFÚvariableÚdescriptionÚunitsÚmmr1   r   r   r   z%Y-%m-%dT%H:%M:%SZÚmodelzEta03/BESM run Únodata)ÚmetadataÚ	overviews)Ú
export_cogÚosÚpathÚjoinÚmakedirsrZ   ÚexistsrR   Ú	write_cogÚ_prepare_arrayr%   ÚVAR_DESCÚgetr:   rY   ÚRUN_TAGÚNODATAÚ	Exception)Úargsr6   ÚvarÚwinÚcog_dirr   r9   rg   Úskip_existingÚecogÚvar_dirÚfnameÚfpathÚarrÚes   &              r   Ú_accum_cog_workerr€   ä   s¢  € àUYÑR€H�3 ¸)Ûä�g‰g�l‰l˜7 e¨5°°¸QÐ$?Ó@€GÜ‡K‚K� $Õ'Ü˜3 J¥¸[ÔI€EÜ�G‰G�L‰L˜Ó(€EçœŸ™Ÿ™¨×.Ò.Ø˜•[ %¨¨tÐ4Ð4ä
˜x¨cÓ
>€CØ
‚{Ø˜•[ $Ð(9¸5ÐAÐAð7Ø�‰Ø×Ñ Ó)Øà˜sØœvŸ™×2Ñ2°3Ó<Ø˜tØ˜s 6�{Øœs 3 }Õ#5Ó6Øœs 3 z¥?Ó3Øœs 3 x¥=Ó1Ø˜s :�×7Ñ7Ð8LÓMØ ´·±Ð0@ÐAØœs 4§;¡;Ó/ðð  ð 	ô 	
ð" ˜•[ %¨¨uÐ5Ð5øÜô 7Ø˜•[ $¬¨A«°Ð6Õ6ûð7ús   ÃCF' Æ'GÆ2GÇGÇGc                ó¼   € V ^8„  d   QhR\         R\         R\        R\        R\        R\        R\        R\        R	\        \         \        \         ,          3,          /	# )
r   r6   rx   r   r9   rg   ry   ÚverboseÚworkersr   ©r:   r   r;   r   r   )r   s   "r   r   r     sz   € ÷ Cñ CÜðCäðCô ðCô ð	Cô
 ðCô ðCô ðCô ðCô 
Œ#Œt”C�yˆ.ÕñCr   c                ó  € ^ RI HpHp	 \        P                  ! VRR7       \        VR7      p
\        P                   Uu/ uF  q». bK  	  pp\        P                   UUu. uF  pV
 F	  pWWáW#WE3NK  	  K  	  ppp\        V4      pV'       d‰   \        RV R\        V
4       R\        \        P                  4       RV R	V 2
4       V
 FH  p\        R
VR,          R RVR,          R RVR,          R RVR,          P                  R4       24       KJ  	  V^8:  dÌ   V FÃ  p\        V4      w  pppppV'       dO   VR8w  d   V'       d   \        RV RV RV 24       KA  VR8X  d!   V'       d   \        RV RV RV 24       Kf  Kh  Kj  WÍ,          P                  V4       V'       g   K‹  \        R
V'       d   RMR R
\        P                  P                  V4       24       KÅ  	  V# V! VR7      ;_uu_ 4       pV Uu/ uF  pVP                  \        V4      VbK  	  ppV	! V4       F¨  pVP!                  4       w  pppppV'       d/   V'       d%   VR8X  d   RMRp\        R
V RV RV RV 24       KM  KO  WÍ,          P                  V4       V'       g   Kp  \        R
V'       d   RMR R
\        P                  P                  V4       24       Kª  	  RRR4       V# u upi u uppi u upi   + '       g   i     T# ; i) a3  
Calcula e exporta todos os acumulados de PREC, PRCV e PRGE como COG GeoTIFF.

Parameters
----------
accum_hours : periodo do acumulo em horas (padrao: 24)
              Para 24h: gera ACUM00Z e ACUM12Z.
              Para outros valores: janelas sequenciais.
workers     : processos paralelos (1 = serial)
)ÚProcessPoolExecutorÚas_completedTr\   r^   ú[accum] Periodo: úh | ú janelas x z variaveis = z acumulados | workers=z  r   Ú10sz  FH r   Ú3dÚ-r   z  val. r   z
%Y%m%d %HZr_   ú	  [ERRO] Ú ú: ú
  [AVISO] ÚSKIPzOK  )Úmax_workersz[AVISO]z[ERRO]N)Úconcurrent.futuresr†   r‡   ri   rl   r4   r%   ÚPRECIP_VARSÚlenÚprintrY   r€   r+   rj   ÚbasenameÚsubmitÚresult)r6   rx   r   r9   rg   ry   r‚   rƒ   r†   r‡   r0   ÚvÚsavedrv   rw   ÚtasksÚn_totalr   ÚtaskÚwtyper}   ÚerrÚskippedÚpoolrP   ÚfutsÚfutÚtags   &&&&&&&&                    r   Úexport_all_accumulations_as_cogr§     sñ  € ÷( Eä‡K‚K� $Õ'Ü&°;Ô?€GÜ$×0Ò0Ó1Ñ0˜�"ŠuÑ0€EÐ1ô ×%Ò%ôá%ˆCÛˆCð 
˜ k¸yÓXáñ 	YÙ%ð 
ñ ô
 �%‹j€GçÜÐ! + ¨dÜ�W“�˜k¬#¬f×.@Ñ.@Ó*AÐ)Bð CØ�9Ð2°7°)ð=ô 	>ó ˆAÜ�B�q˜•y �o U¨1¨Z­=¸Ð*<¸A¸aÀ½kÈ"Ð=MØ˜A˜j�M×2Ñ2°<Ó@ÐAðCö Dñ ð �!„|ÛˆDÜ.?ÀÓ.EÑ+ˆC�˜˜s GßØÐ+Ô+·Ü˜I c U¨!¨E¨7°"°S°EÐ:Ö;ØÐ-Ô-·'Ü˜J s e¨1¨U¨G°2°c°UÐ;Ö<ñ 3:Ñ-ð •
×!Ñ! %Ô(ß‘7Ü˜B¯™v°fÐ=¸RÄÇÁ×@PÑ@PÐQVÓ@WÐ?XÐYÖZñ ð2 €Lñ !¨W×5Õ5¸ÙBGÓHÁ%¸Q�D—K‘KÔ 1°1Ó5°qÒ8Á%ˆDÐHÙ# DÖ)�Ø25·*±*³,Ñ/��U˜E 3¨ßßØ+.Ð2CÔ+C™iÈ˜Ü  3 % q¨¨¨Q¨u¨g°R¸°uÐ=Ö>ñ ð •J×%Ñ% eÔ,ß‘wÜ ¯W¡6¸&Ð"AÀÄBÇGÁG×DTÑDTÐUZÓD[ÐC\Ð]Ö^ñ *÷ 6ð €LùòW 2ùóùò: I÷ 6Ö5ð €Lús6   ¿KÁK"Ç8K-Ç= K(È2K-ÉAK-Ê<K-Ë(K-Ë-K>	c                ó˜   € V ^8„  d   QhR\         R\         R\        R\        R\        R\        \         \        \         ,          3,          /# )r   r6   Ú
output_dirr   r9   r‚   r   r„   )r   s   "r   r   r   R  sQ   € ÷ ?ñ ?Üð?äð?ô ð?ô ð	?ô
 ð?ô 
Œ#Œt”C�yˆ.Õñ?r   c                óX  € ^ RI p\        P                  ! VRR7       \        VR7      p\        P
                   Uu/ uF  qw. bK  	  ppR^^P^^x^^È^0R^HR/P                  V^È4      R^^2^^P^^–^0^È^HR/P                  V^–4      R	^^(^^<^^d^0^–^H^È/P                  V^d4      /p	V'       d6   \        R
V R\        V4       R\        \        P
                  4       R24       \        P
                   EFq  p
\        P                  P                  W RV R24      p\        P                  ! VRR7       V EF)  p\        W¬R,          V\        P                  R7      p\        P                  P                  W½4      p\        W
WÃ4      pVf$   V'       d   \        RV
 RVR,           R24       Ky   \        V	P                  V
4      \        4      '       d#   V	P                  V
/ 4      P                  V^È4      MV	P                  V
^È4      pVP!                  V
VVR,          VVR,          VVR7       WŠ,          P#                  V4       V'       d   \        RV 24       EK)  EK,  	  EKt  	  V# u upi   \$         d7   pT'       d#   \        RT
 RTR,           RT 24        Rp?EKo   Rp?EKv  Rp?ii ; i)z€
Gera figuras PNG dos acumulados de precipitacao.

Parameters
----------
accum_hours : periodo do acumulo em horas (padrao: 24)
NTr\   r^   ÚPRECi,  i�  ÚPRCVÚPRGErˆ   r‰   rŠ   z
 variaveisrV   r$   r   )r   rT   r‘   r�   r   z: arquivo ausente)r7   Údatar   r   r1   Úoutput_pathÚvmaxz  OK  rŽ   r�   )Ú
plot_utilsri   rl   r4   r%   r•   rq   r—   r–   rj   rk   rZ   ÚFIG_EXTrR   Ú
isinstanceÚdictÚplot_accumulationr+   rt   )r6   r©   r   r9   r‚   Úpur0   r›   rœ   Ú
vmax_tablerv   r{   rw   r|   r}   r~   r°   r   s   &&&&&             r   Úplot_all_accumulationsr¸   R  s¦  € ó ä‡K‚K�
 TÕ*Ü&°;Ô?€GÜ$×0Ò0Ó1Ñ0˜�"ŠuÑ0€EÐ1ð 	�!�R˜"˜c 2 s¨R°°b¸#Ð>×BÑBÀ;ÐPSÓTØ��B˜˜R " c¨B°°R¸Ð=×AÑAÀ+ÈsÓSØ��B˜˜R " c¨B°°R¸Ð=×AÑAÀ+ÈsÓSð€J÷ ÜÐ! + ¨dÜ�W“�˜k¬#¬f×.@Ñ.@Ó*AÐ)BÀ*ðNô 	Oô ×!Õ!ˆÜ—'‘'—,‘,˜z¨U°%¸°}ÀAÐ+FÓGˆÜ
�Š�G dÕ+äˆCÜ" 3¨J­À[ÔV\×VdÑVdÔeˆEÜ—G‘G—L‘L Ó0ˆEä& x°cÓFˆCØŠ{ßÜ˜J s e¨1¨S°­[¨MÐ9JÐKÔLÙð@ÜHRÐS]×SaÑSaÐbeÓSfÔhl×HmÒHm�z—~‘~ c¨2Ó.×2Ñ2°;ÀÔDÐs}÷  tBñ  tBð  CFð  HKó  tL�Ø×$Ñ$Ø"%Ø"%Ø"% j¥/Ø"-Ø"% f¥+Ø"'Ø"&ð %ô ð •
×!Ñ! %Ô(ßÜ˜F 5 'Ð*×+ò ô- ñ	 "ð@ €Lùò[ 2øôR ô @ßÜ˜I c U¨!¨C°­K¨=¸¸1¸#Ð>×?Ó?ö ûð@ús   »I#Æ(B,I(É(J)É3#J$Ê$J))NNNé   )F)r¹   Útif)r¹   FFFTé   )r¹   FT)Ú__doc__ri   Únumpyr<   r   r   Útypingr   r   r   r%   rD   r4   rR   rZ   r€   r§   r¸   r   r   r   Ú<module>r¿      sL   ðñ(óT 
Û ß (ß 'Ñ 'ã Û ÷d÷V%÷XRò*%7÷PC÷L?ñ ?r   