+
    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  rT
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    AjM1V9#=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 /rVYYB!/vV]]F#/xV__H";-'CH: N,,4:R9
 	

 zX%F%G b77q=&1&X68L^&1&X68L '1&X68L $0 JB!x//691 88	 77:2687!;   b %1 	=>* N# Q'aK8++v5q[H44FIF33HNN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     % %%% % 	%
 bjj%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fY'(J$)+YY,,	%%h8SE ;--RZZ8C[[99((288E?RXXc]:BFFCKPC :9 ) J ! 		
 :99s   !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-     Zu[MH,=,=j,I+J!C5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                  W4      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                  W4      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RH3)ggll7e5Q$?@GKK$'3J[IEGGLL(E..[%t44
xc
>C
{[$(95AA7)sv223<ts6{s3}#56s3z?3s3x=1s:778LM0@As4;;/   	 	
" [%u55 7[$A667s   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 
#tCy.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WW#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KK$'&;?G$0010"u0E1 %%%CC 
kyX 	Y% 
 
 %jG!+dWk#f.@.@*A)B C927)= 	> ABqyoU1Z=*<Aak"=MAjM22<@AC D  !|D.?.E+CsG++IcU!E7"SE:;--'Jse1UG2cU;< 3:- 
!!%(7Bvf=R@P@PQV@W?XYZ 2 L !W55BGH%QDKK 115q8%DH#D)25**,/UE3+.2C+Ci3%qQugRu=>  J%%e,wW6&"ABGGDTDTUZD[C\]^ * 6 LW 2: I 65 Ls6   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     ? ??? ? 	?
 ? 
#tCy.?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\        WR,          V\        P                  R7      p\        P                  P                  W4      p\        W
W4      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    KK
T*&;?G$0010"u0E1 	!R"c2sRb#>BB;PSTBR"cBR=AA+sSBR"cBR=AA+sSJ !+dWk#f.@.@*A)B*N 	O !!'',,zU%}A+FG
Gd+C"3J[V\VdVdeEGGLL0E&xcFC{Jse1S[M9JKL@HRS]SaSabeSfhlHmHmz~~c2.22;Ds}  tB  tB  CF  HK  tL$$"%"%"%j/"-"%f+"'"& %  
!!%(F5'*+ - 	 "@ L[ 2R  @IcU!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*%7PCL? ?r   