+
    §Á*jve  ã                   óÀ  € R t ^ RIt^ RIt^ RIt^ RIt^ RIHtHt ^ RIH	t	 ^ RI
HtHt  ^ RIt^ RIHt ^ RIHt ^ RIHt ^ RIHt Rt^ RIt^ RIt^ RItR$t. R%OtR t]P@                  ! R4      t!R R lt"R t#0 R&mt$R R lt%R R lt&R R lt'R'R R ll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# lt.R#   ] d    R	t]! R
4       ]! R4        L”i ; i),u:  
export_cog.py â€” Exportacao de campos do modelo Eta como Cloud Optimized GeoTIFF (COG)

Cada campo e exportado como um arquivo .tif georeferenciado em WGS84 (EPSG:4326),
com compressao DEFLATE, tiles 512x512 e overviews (piramides) para conformidade COG.

Dependencia: rasterio >= 1.3
    pip install rasterio

Estrutura de saida:
    cog/
    â”œâ”€â”€ TP2M/
    â”‚   â”œâ”€â”€ TP2M_2026060400.tif
    â”‚   â”œâ”€â”€ TP2M_2026060401.tif
    â”‚   â””â”€â”€ ...
    â”œâ”€â”€ PREC/
    â”‚   â”œâ”€â”€ PREC_2026060406.tif
    â”‚   â””â”€â”€ acumulado_24h/
    â”‚       â””â”€â”€ PREC_2026060500_acum24h.tif
    â””â”€â”€ ...

Valores:
    - Precipitacao (PREC, PRCV, PRGE, NEVE): convertidos de metros para mm
    - UNDEF do modelo substituido por NaN (nodata no GeoTIFF = -9999.0)
    - Arrays armazenados como float32
N)ÚdatetimeÚ	timedelta)ÚOptional)ÚProcessPoolExecutorÚas_completed)Úfrom_origin)ÚCRS)Ú
ResamplingTFz,[export_cog] AVISO: rasterio nao encontrado.z0[export_cog]   Instale com: pip install rasterioc                 ó†   € \        \        RR4      \        \        R^4      \        \        R^4      \        \        RR4      3# )zERetorna (compress, zlevel, predictor, tile_size) do config carregado.ÚCOG_COMPRESSÚDEFLATEÚ
COG_ZLEVELÚCOG_PREDICTORÚCOG_TILE_SIZEi   )ÚgetattrÚconfig© ó    ÚF/pesq/dados/sismom/SisMOM/sismom_fig/Figuras_Eta/scripts/export_cog.pyÚ_cog_paramsr   =   s>   € ô 	”˜¨Ó3Ü”˜¨Ó+Ü”˜¨Ó+Ü”˜¨Ó-ð	ð r   iæ  c                ó$   € V ^8„  d   QhR\         /# )é   Úreturn)Úint)Úformats   "r   Ú__annotate__r   I   s   € ÷ Fñ F”Sñ Fr   c                 óœ  € \        \        RR4      '       g   ^ # \        \        RR4      '       d   ^ # \        P                  \        P                  ,          p \	        V R,
          4      \        P                  8”  d   ^ # \        P
                  \        P                  ^,
          \        P                  ,          ,           pVR8:  d   ^ # \        P
                  \        P                  ! \        P                  4      \        P                  ,          ,           p\        \        P                  ! VRRR7      4      \        P                  ,          # )	zÞNumero de colunas a rolar para converter grade global 0-360 em -180..180.

Retorna 0 quando cog.lon_180 esta desligado, a grade nao e global em lon,
ou ja esta na convencao -180..180. k = indice do primeiro centro >= 180.
Ú
COG_LON180FÚIRREGULAR_LONç     €v@g     €f@Úleft)ÚsidegôÞ €f@)
r   r   ÚNXÚDLONÚabsÚLON0ÚnpÚaranger   Úsearchsorted)ÚspanÚlast_centerÚlonss      r   Ú_lon_roll_kr,   I   sÁ   € ô ”6˜<¨×/Ò/ÙÜŒv�¨×.Ò.ÙÜ�9‰9”v—{‘{Õ"€DÜ
ˆ4�%�<Óœ6Ÿ;™;Ô&ÙÜ—+‘+¤§¡¨Q¥´&·+±+Õ =Õ=€KØ�lÔ"ÙÜ�;‰;œŸš¤6§9¡9Ó-´·±Õ;Õ;€DÜŒr�Š˜t U°Ô8Ó9¼F¿I¹IÕEÐEr   c                 óæ  € \        4       p V '       dQ   \        P                  V \        P                  ,          ,           R,
          \        P                  R,          ,
          pM,\        P                  \        P                  R,          ,
          p\	        \        RR4      '       dâ   \        \        P                  4      ^8”  dÄ   \        \        P                  R,          \        P                  R,          ,
          4      p\        \        P                  R,          4      VR,          ,           p\        \        P                  R,          \        P                  ^ ,          ,
          \        P                  ^,
          ,          4      pMQ\        P                  \        P                  R,
          \        P                  ,          ,           p\        P                  p\        W\        P                  V4      # )aI  
Retorna o Affine transform rasterio para a grade atual.

GrADS LON0/LAT0 sao centros de celula; from_origin espera o canto
(corner) superior esquerdo do primeiro pixel. Correcao de meio pixel:
  ul_lon = LON0 - DLON/2
  ul_lat = lat_max + dlat_top/2
Elimina o offset sistematico de ~DLON/2 visivel em grades esparsas (ex BESM).
r   g       @ÚIRREGULAR_LATFg      à?éÿÿÿÿéþÿÿÿ)r,   r   r%   r#   r   ÚlenÚLATSÚfloatÚNYÚLAT0ÚDLATr   )ÚkÚul_lonÚtop_spacingÚul_latÚdlats        r   Ú_get_transformr<   ]   s  € ô 	‹€AßÜ—+‘+ ¤F§K¡K¥Õ/°5Õ8¼6¿;¹;ÈÕ;LÕL‰ä—‘œvŸ{™{¨SÕ0Õ0ˆÜŒv�¨×.Ò.´3´v·{±{Ó3CÀaÔ3GäœFŸK™K¨�O¬f¯k©k¸"­oÕ=Ó>ˆÜ”v—{‘{ 2•Ó'¨+¸Õ*;Õ;ˆÜœŸ™ B�¬&¯+©+°a­.Õ8¼V¿Y¹YÈ½]ÕKÓL‰ä—‘¤§	¡	¨C¥´6·;±;Õ>Õ>ˆÜ—‘ˆÜ�v¤v§{¡{°DÓ9Ð9r   c                óX   € V ^8„  d   QhR\         P                  R\         P                  /# ©r   Úarrr   ©r&   Úndarray)r   s   "r   r   r   €   s"   € ÷ ñ œBŸJ™Jð ¬2¯:©:ñ r   c           	     óð  € \         P                  p\        P                  ! V^ ,          VR,          \	        V4      4      p ^ RIHp V! W^ RR\        P                  R7      pV! V4      P                  \        P                  4      #   \         dd    \        P                  ! T 4      p\        T P                  ^,          4       F(  p\        P                  ! Y!T RT3,          4      TRT3&   K*  	  Tu # i ; i)u¹   
Reamostrage de grade irregular (ex.: gaussiana) para grade regular.
Interpola ao longo do eixo lat (eixo 0) usando os valores de config.LATS.
Entrada / saÃ­da: (NY, NX) float32, S->N.
)Úinterp1dÚlinearF)ÚaxisÚkindÚbounds_errorÚ
fill_value:NNNr/   )r   r2   r&   Úlinspacer1   Úscipy.interpolaterC   ÚnanÚastypeÚfloat32ÚImportErrorÚ
empty_likeÚrangeÚshapeÚinterp)r?   Ú
lats_irregÚlats_regrC   ÚfÚoutÚjs   &      r   Ú_regrid_to_regularrX   €   s¾   € ô —‘€JÜ—’˜Z¨�]¨J°r­N¼CÀ
»OÓL€Hð
Ý.Ù�z¨Q°XØ$)´b·f±fô>ˆá�‹{×!Ñ!¤"§*¡*Ó-Ð-øÜô ä�mŠm˜CÓ ˆÜ�s—y‘y •|Ö$ˆAÜŸ	š	 (¸¸A¸q¸D½	ÓBˆC��1�‹Iñ %àŠ
ðús   ÁAB ÂA+C5Ã4C5c                óX   € V ^8„  d   QhR\         P                  R\         P                  /# r>   r@   )r   s   "r   r   r   •   s"   € ÷ ñ œRŸZ™Zð ¬B¯J©Jñ r   c           	     óf  € \         P                  ! V 4      pVP                  4       '       d   VP                  4       '       d   V #  ^ RIHp V! VRRR7      pV \        V4      ,          #   \         Ed<    ^ RIpT P                  4       p\         P                  ! T4      P                  4       '       dù   \         P                  ! T4      p\         P                  ! T^\         P                  R7      p\         P                  ! TRR
1^R13,          TR^R13,          T^R1RR
13,          T^R1R3,          .4      pTP                  4       ;_uu_ 4        TP                  R\        4       \         P                   ! T^ R	7      p	RRR4       M  + '       g   i     M; iX	T,          YV&   EK"  Tu # i ; i)zÙPreenche NaN com o valor valido mais proximo (para visualizacao continua).

Usa scipy.ndimage.distance_transform_edt quando disponivel; senao,
dilata iterativamente com a media dos vizinhos validos (grades pequenas).
)Údistance_transform_edtFT)Úreturn_distancesÚreturn_indicesN)Úconstant_values:r   NNÚignore©rE   r0   r/   )r&   ÚisnanÚanyÚallÚscipy.ndimager[   ÚtuplerN   ÚwarningsÚcopyÚpadrK   ÚstackÚcatch_warningsÚsimplefilterÚRuntimeWarningÚnanmean)
r?   Úmaskr[   Úidxrf   rV   ÚmÚpri   Únbs
   &         r   Ú_fill_undef_nearestrs   •   sF  € ô �8Š8�C‹=€DØ�8‰8�:Š:˜Ÿ™ŸšØˆ
ðÝ8Ù$ T¸EÐRVÔWˆØ”5˜“:�ÐøÜõ ÛØ�h‰h‹jˆÜ�hŠh�s‹m×Ñ×!Ò!Ü—’˜“ˆAÜ—’�s˜A¬r¯v©vÔ6ˆAÜ—H’H˜a    Q r T 	�l¨A¨b°!°B°$¨h­K¸¸1¸R¸4ÀÀ"À¸9½ÀqÈÈ2ÈÈrÈÅ{ÐSÓTˆEØ×(Ñ(×*Õ*Ø×%Ñ% h´Ô?Ü—Z’Z ¨AÔ.�÷ +×*×*Ð*úð ˜•UˆCŒFØŠ
ðús2   Á"A) Á)A	F0Â3BF0Å/F
Æ	F0Æ
FÆF0Æ/F0c                ód   € V ^8„  d   QhR\         P                  R\        R\         P                  /# )r   ÚdataÚvar_namer   )r&   rA   Ústr)r   s   "r   r   r   °   s)   € ÷  ñ  œŸ™ð  ¬sð  ´r·z±zñ  r   c                óv  € V P                  \        P                  4      pV\        9   d3   \        P                  ! RRR7      ;_uu_ 4        VR,          pRRR4       \        \        RR4      '       d   \        V4      p\        \        RR4      '       d   \        V4      p\        P                  ! V4      p\        4       pV'       d   \        P                  ! W#) ^R7      p\        P                  ! \        P                  ! V4      \        P                  ! \        4      V4      pV#   + '       g   i     LÛ; i)	u  
- Converte m->mm para precipitacao
- Reamostrage para grade regular quando grade Y Ã© irregular (gaussiana)
- cog.fill_undef: preenche undef com vizinho mais proximo (sem mascara)
- Flipa verticalmente (GrADS: S->N; rasterio: N->S)
- Substitui NaN por NODATA
- Retorna float32
r_   )ÚoverÚinvalidg     @�@Nr.   FÚCOG_FILL_UNDEFr`   )rL   r&   rM   Ú_PRECIP_VARSÚerrstater   r   rX   rs   Úflipudr,   ÚrollÚwherera   ÚNODATA)ru   rv   r?   r7   s   &&  r   Ú_prepare_arrayr‚   °   sÐ   € ð �+‰+”b—j‘jÓ
!€Cà”<ÔÜ�[Š[˜h°×9Ö9Ø˜•,ˆC÷ :ô Œv�¨×.Ò.Ü  Ó%ˆô ŒvÐ'¨×/Ò/Ü! #Ó&ˆä
�)Š)�C‹.€Cô 	‹€AßÜ�gŠg�c˜2 AÔ&ˆä
�(Š(”2—8’8˜C“=¤"§*¢*¬VÓ"4°cÓ
:€CØ€J÷) :×9ús   Á
D(Ä(D8	c          
      ó~   € V ^8„  d   QhR\         P                  R\        R\        \        ,          R\
        R\        /# )r   r?   ÚfpathÚmetadataÚ	overviewsr   )r&   rA   rw   r   ÚdictÚbool)r   s   "r   r   r   ×   sI   € ÷ Vñ VÜ	�‰ðVäðVô ”t�nðVô ð	Vô
 	ñVr   c                óZ  € \         '       g   \        R4      h\        P                  ! \        P                  P                  \        P                  P                  V4      4      RR7       \        P                  ! V \        P                  R7      p \        4       w  rErgRRRRR	\        P                  R
\        P                  R^R\        R\        4       R\         RVRVRVRRRVRVRR/pV'       gX   \"        P$                  ! VR3/ VB ;_uu_ 4       p	V	P'                  V ^4       V'       d   V	P(                  ! R!/ VB  RRR4       V# \*        P,                  ! RRR7      ;_uu_ 4       p
V
P.                  pRRR4        \"        P$                  ! XR3/ VB ;_uu_ 4       p	V	P'                  V ^4       V'       d   V	P(                  ! R!/ VB  RRR4       \"        P$                  ! VR4      ;_uu_ 4       p	V	P1                  \2        \4        P6                  4       V	P)                  RRR7       RRR4       \8        P:                  ! W±R\<        \>        R\@        \@        RR 7	       \        P                  PC                  V4      '       d   \        PD                  ! V4       V#   + '       g   i     T# ; i  + '       g   i     ELE; i  + '       g   i     EL; i  + '       g   i     L·; i  \        P                  PC                  X4      '       d   \        PD                  ! T4       i i ; i)"a  
Escreve arr (NY, NX) float32 como GeoTIFF tiled georeferenciado.

Parameters
----------
arr       : array (NY, NX) float32, preparado por _prepare_array
fpath     : caminho do arquivo .tif de saida
metadata  : tags GDAL a gravar nos metadados
overviews : se True, embute overviews (piramides) no arquivo via
            rasterio.shutil.copy.
            ATENCAO: alguns visualizadores (ex: SisMOM) exibem cada
            nivel de overview como uma camada separada. Use False
            (padrao) para compatibilidade maxima.
zrasterio e necessario.T©Úexist_ok)ÚdtypeÚdriverÚGTiffrŒ   rM   ÚwidthÚheightÚcountÚcrsÚ	transformÚnodataÚcompressÚzlevelÚ	predictorÚtiledÚ
blockxsizeÚ
blockysizeÚBIGTIFFÚIF_SAFERÚwNú.tifF)ÚsuffixÚdeletezr+Úrio_overviewÚaverage)ÚnsÚ
resampling)Úcopy_src_overviewsr•   r—   r˜   r™   rš   r�   r   )#ÚHAS_RASTERIOrN   ÚosÚmakedirsÚpathÚdirnameÚabspathr&   ÚascontiguousarrayrM   r   r   r"   r4   Ú	CRS_WGS84r<   r�   ÚrasterioÚopenÚwriteÚupdate_tagsÚtempfileÚNamedTemporaryFileÚnameÚbuild_overviewsÚOVERVIEW_LEVELSr	   r¢   Ú
rio_shutilrg   ÚCOMPRESSÚ	PREDICTORÚ	TILE_SIZEÚexistsÚremove)r?   r„   r…   r†   Ú	_compressÚ_zlevelÚ
_predictorÚ_tileÚprofileÚdstÚtmpÚtmp_paths   &&&&        r   Ú	write_cogrÅ   ×   sW  € ÷( ‹<ÜÐ2Ó3Ð3ä‡K‚K”—‘—‘¤§¡§¡°Ó 6Ó7À$ÕGô ×
Ò
˜s¬"¯*©*Ô
5€Cä,7«MÑ)€I˜
à�gØ�iØ”f—i‘iØ”f—i‘iØ�aØ”iØ”nÓ&Ø”fØ�iØ�gØ�jØ�dØ�eØ�eØ�jð€G÷$ ô �]Š]˜5 #Ñ1¨×1Ò1°SØ�I‰I�c˜1ÔßØ—’Ñ+ (Ò+÷ 2ð ˆô
 
×	$Ò	$¨F¸5×	AÕ	AÀSØ—8‘8ˆ÷ 
Bð Ü�]Š]˜8 SÑ4¨G×4Ò4¸Ø�I‰I�c˜1ÔßØ—’Ñ+ (Ò+÷ 5ô
 �]Š]˜8 T×*Ô*¨cØ×Ñ¤´×1CÑ1CÔDØ�O‰O˜~¸)ˆOÔD÷ +ô 	�ŠØØ#ÜÜØÜ Ü Øõ		
ô �7‰7�>‰>˜(×#Ò#Ü�IŠI�hÔà€L÷I 2Ö1ð ˆú÷
 
B×	AÐ	Aú÷ 5×4Ð4ú÷
 +×*ûô �7‰7�>‰>˜(×#Ò#Ü�IŠI�hÕð $úsT   Ä-JÅ(J1Å> K, Æ-KÇ'K, Ç28KÈ*6K, ÊJ.	Ê1K	ËK	Ë	K, ËK)	Ë$K, Ë,>L*c                óŒ   € V ^8„  d   QhR\         P                  R\        R\        R\        R\        R\        R\
        R\        /# )	r   ru   rv   Ú	timestampÚcog_dirÚtitle_extrar†   Ú	level_hpar   )r&   rA   rw   r   rˆ   r   )r   s   "r   r   r   4  sf   € ÷ 1Eñ 1EÜ
�*‰*ð1Eäð1Eô ð1Eô ð	1Eô
 ð1Eô ð1Eô ð1Eô 	ñ1Er   c                ób  € \        W4      p\        P                  P                  VR4      pV\        9   d   RpRVR\        P
                  P                  W4      RVRVP                  R4      RR	\        P                   2R
\        \        4      RR/p	V'       d   WIR&   Ve   \        V4      V	R&   Ve   RV R2MRp
V'       d$   RVP                  RR4      P                  4        2MRpV V
 RVP                  R4       V R2p\        P                  P                  W<4      p\        W}W•R7      # )a0  
Exporta um campo 2D como COG GeoTIFF.

Parameters
----------
data       : array (NY, NX) lido pelo reader
var_name   : nome da variavel
timestamp  : datetime do campo
cog_dir    : diretorio de saida
title_extra: sufixo no nome do arquivo (ex: "acum24h")

Returns
-------
Caminho do arquivo .tif criado.
Ú ÚmmÚvariableÚdescriptionÚunitsrÇ   z%Y-%m-%dT%H:%M:%SZÚmodelzEta03/BESM run r”   r’   z	EPSG:4326rÉ   rÊ   Ú_ÚhPaÚ ú%Y%m%d%Hrž   )r…   r†   )r‚   r   Ú	VAR_UNITSÚgetr|   ÚVAR_DESCÚstrftimeÚRUN_TAGrw   r�   ÚreplaceÚlowerr§   r©   ÚjoinrÅ   )ru   rv   rÇ   rÈ   rÉ   r†   rÊ   r?   rÐ   ÚmetaÚlev_strÚ	extra_tagÚfnamer„   s   &&&&&&&       r   Úexport_field_as_cogrâ   4  s-  € ô0 ˜Ó
(€Cä×Ñ× Ñ  ¨2Ó.€EØ”<ÔØˆð 	�xØ”v—‘×*Ñ*¨8Ó>Ø�uØ�y×)Ñ)Ð*>Ó?Ø˜¬¯©Ð(8Ð9Ø”sœ6“{Ø�{ð€D÷ Ø)ˆ]ÑØÒÜ 	›Nˆˆ[Ñà&/Ò&;�!�I�;˜cÑ"À€Gß?J�!�K×'Ñ'¨¨SÓ1×7Ñ7Ó9Ð:Ñ;ÐPR€IØˆj˜˜	  9×#5Ñ#5°jÓ#AÐ"BÀ9À+ÈTÐR€EÜ�G‰G�L‰L˜Ó(€Eä�S¨$ÔDÐDr   c                ó`   € V ^8„  d   QhR\         R\         R\         R\        R\        R\        /# )r   Údata_dirrv   rÈ   Ú
sequentialÚverboser   )rw   rˆ   Úlist)r   s   "r   r   r   h  sD   € ÷ ñ Üðäðô ðô ð	ô
 ðô 
ñr   c           
     óÒ  € \         P                  ! V 4      p\        P                  ! VRR7       . pV Ff  p \         P                  ! WWR7      p\        W�Wr4      p	VP                  V	4       V'       d&   \        RV RVP                  R4       RV	 24       Kf  Kh  	  V#   \         d=   p
T'       d*   \        RT RTP                  R4       R	T
 24        R
p
?
K¨   R
p
?
K®  R
p
?
ii ; i)zv
Exporta todos os timesteps disponiveis de uma variavel como COG GeoTIFF.

Returns
-------
Lista de caminhos criados.
TrŠ   ©rå   z  [COG] rÔ   rÕ   z -> z  [COG] ERRO ú: N)
ÚreaderÚlist_available_timestampsr§   r¨   Ú
read_fieldrâ   ÚappendÚprintrÙ   Ú	Exception)rä   rv   rÈ   rå   ræ   Ú
timestampsÚsavedÚtru   r„   Úes   &&&&&      r   Úexport_var_all_timestepsrõ   h  sÙ   € ô ×1Ò1°(Ó;€JÜ‡K‚K� $Õ'Ø€Eãˆð	PÜ×%Ò% h°8ÔSˆDÜ'¨¸ÓCˆEØ�L‰L˜ÔßÜ˜  
¨!¨A¯J©J°zÓ,BÐ+CÀ4ÈÀwÐOÖPñ ñ ð €Løô	 ô 	PßÜ˜ h Z¨q°·±¸JÓ1GÐ0HÈÈ1È#ÐN×OÒOõ ûð	Pús   ·A BÂC&Â*+C!Ã!C&c                ól   € V ^8„  d   QhR\         R\         R\        R\        R\        R\        R\        /# )r   rä   Úcog_base_dirrå   ræ   r†   Úskip_existingr   )rw   rˆ   r‡   )r   s   "r   r   r   Ž  sN   € ÷ ñ Üðäðô ðô ð	ô
 ðô ðô 
ñr   c           	     ó:   € \         P                  ! V VVVVVR7      # )z×
Wrapper de compatibilidade -- delega para accumulate.export_all_accumulations_as_cog().

Nomenclatura atual: PREC_ACUM24h_2026060500.tif
Janelas ACUM00Z e ACUM12Z calculadas a partir do horario do run (config.T0).
)rä   rÈ   rå   r†   rø   ræ   )Ú
accumulateÚexport_all_accumulations_as_cog)rä   r÷   rå   ræ   r†   rø   s   &&&&&&r   Ú#export_all_24h_accumulations_as_cogrü   Ž  s)   € ô ×5Ò5Ø Ø$Ø"Ø!Ø%Øôð r   c                ó   aaaa€ V w  rporEp. pVP                  R4      oV3R lo\        \        R/ 4      p\        \        R/ 4      p	\        \        R/ 4      p
. pV EFf  oVP                  S^ 4      pV^ 8”  dÈ   V
P                  S. 4      pV'       d›   V'       d“   \        ;QJ d!    VVV3R lV 4       F  '       d   K   RM	  RM! VVV3R lV 4       4      '       dO   V FF  p\
        P                  P                  S! S4      S R	V R
S R24      pVP                  SW/R34       KH  	  KÑ  VP                  S4       Kä  \
        P                  P                  S! S4      S R	S R24      pV'       d>   \
        P                  P                  V4      '       d   VP                  SVVR34       EKU  VP                  S4       EKi  	  V'       g   V# / p/ pV F˜  oVP                  S^ 4      pV^ 8”  dx   V	P                  S. 4      pV
P                  S. 4      p. p/ pV F3  pVV9   g   K  VP                  V4      pVP                  V4       VVV&   K5  	  V'       d   TMRVS&   VVS&   K“  RVS&   Kš  	   \        P                  ! WVVR7      pT EF7  o TP                  S^ 4      pT^ 8”  dé   TP                  S/ 4      pT
P                  S. 4      pT	P                  S. 4      pTP                  S/ 4      pT F—  pTT9  d?   TP                  STRR\        T4      ,           R,           \        T4      ,           34       KH  TP                  T4      pTe   TT9  d   Kf  \        TT,          STS! S4      YåR7      pTP                  SY/R34       K™  	  EK  \        TS,          STS! S4      TR7      pTP                  SY/R34       EK:  	  T#   \         d=   pY{ Uu. uF  pTTRR\        T4      ,           3NK  	  Mu upi up,           u Rp?# Rp?ii ; i  \         d+   pTP                  STR\        T4      34        Rp?EK¸  Rp?ii ; i)a¸  
Worker por TIMESTEP: le o arquivo .bin UMA vez e gera TODOS os COGs
das variaveis solicitadas (2D e 3D). Paralelismo correto = 1 task por arquivo.

- Variaveis 2D: 1 COG por timestep  ({VAR}_{YYYYMMDDHH}.tif)
- Variaveis 3D: 1 COG por nivel em plot_levels ({VAR}_{N}hPa_{YYYYMMDDHH}.tif)

args: (data_dir, timestamp, vars_list, cog_dir, sequential, overviews, skip_existing)
returns: list of (var, timestamp, fpath_or_None, error_or_None)
rÕ   c                 óF   <€ \        S\        4      '       d
   SV ,          # S# )N)Ú
isinstancer‡   )ÚvarÚ_out_dirs   &€r   Ú_var_dirÚ&_worker_cog_timestep.<locals>._var_dir¹  s   ø€ Ü *¨8´T× :Ò :ˆx˜�}ÐHÀÐHr   ÚVAR_NLEVÚ
VAR_LEVELSÚVAR_PLOT_LEVELSc              3   ó¼   <"  € T FQ  p\         P                  P                  \         P                  P                  S! S4      S R V RS R24      4      x € KS  	  R# 5i)rÒ   ÚhPa_rž   N)r§   r©   r»   rÝ   )Ú.0Úlevr  Úts_strr   s   & €€€r   Ú	<genexpr>Ú'_worker_cog_timestep.<locals>.<genexpr>Æ  sU   øé € ð +ñ '�cô —‘—‘Ü—G‘G—L‘L¡¨#£°3°%°q¸¸¸TÀ&ÀÈÐ0NÓO÷ð ã&ùs   ƒAAFTrÒ   r  rž   Nré   z	leitura: znivel zhPa ausente em levels )rÊ   r†   )r†   )rÙ   r   r   r×   rc   r§   r©   rÝ   rî   r»   Úindexrë   Úread_fields_selectiverð   rw   râ   )ÚargsÚ	_data_dirÚ_tÚ_varsÚ_seqÚ_ovrÚ_skipÚresultsÚ	_var_nlevÚ_var_levelsÚ_var_plot_levelsÚvars_neededÚnlevÚ	plot_lvlsr
  Úfpr„   Úvar_level_mapÚlevel_k_mapÚall_lvlsÚksÚlkr7   Úfieldsrô   ÚvÚlev_datar  r  r  r   s   &                          @@@@r   Ú_worker_cog_timestepr'  ª  s  û€ ð 9=Ñ5€I�5˜( D°Ø€GØ�k‰k˜*Ó%€FõIô œv z¸"Ó=€IÜœv |¸"Ó=€KÜœvÐ'8¸"Ó=Ðà€KÜˆØ�}‰}˜S !Ó$ˆØ�!Œ8à(×,Ñ,¨S°"Ó5ˆIßŸ§s£sö +ñ 'ó+§s§s¢sö +ñ 'ó+÷ (ò (ó
 %�CÜŸ™Ÿ™¡h¨s£m¸°u¸A¸c¸UÀ$ÀvÀhÈdÐ5SÓT�BØ—N‘N C¨°Ð#6Ö7ó %ð ×"Ñ" 3Ö'ô —G‘G—L‘L¡¨#£°3°%°q¸¸ÀÐ0EÓFˆEßœŸ™Ÿ™¨×.Ò.Ø—‘  R¨°Ð5×6à×"Ñ" 3×'ñ+ ÷. Øˆð €MØ€KÛˆØ�}‰}˜S !Ó$ˆØ�!Œ8Ø#Ÿ™¨¨RÓ0ˆHØ(×,Ñ,¨S°"Ó5ˆIØˆBØˆBÛ �Ø˜(–?Ø Ÿ™ sÓ+�AØ—I‘I˜a”LØ�B�s“Gñ	 !÷
 (*¡¨tˆM˜#ÑØ!#ˆK˜Óà!%ˆM˜#Óñ ð"TÜ×-Ò-Ø˜=°Tô
ˆô ˆð	4Ø—=‘=  aÓ(ˆDØ�aŒxà'ŸO™O¨C°Ó4�Ø,×0Ñ0°°bÓ9�	Ø'ŸO™O¨C°Ó4�Ø"ŸJ™J s¨BÓ/�Û$�CØ (Ô*ØŸ™¨¨R°Ø$¤s¨3£xÕ/Ð2JÕJÌSÐQYË]ÕZð(\ô ]á ØŸ™˜s›�AØ’y A¨XÔ$5Ù Ü,Ø  � S¨"©h°s«mØ"%ô�Bð —N‘N C¨°Ð#6Ö7ô %ô )¨°­°c¸2¹xÈ»}ÐX\Ô]�Ø—‘  R¨TÐ2×3ñ3 ð: €NøôA ô TØÀ{ÓSÁ{À!˜1˜b $¨´c¸!³fÕ(<Ó=Â{ùÔSÕSÕSûðTûô: ô 	4Ø�N‰N˜C  T¬3¨q«6Ð2×3Ó3ûð	4úsI   É5O ÊC>PÎ1PÏPÏPÏO=Ï<PÐ
PÐPÐQÐ#QÑQc                ó„   € V ^8„  d   QhR\         R\         R\        R\        R\        R\        R\        R\        R	\        /	# )
r   rä   r÷   Úvars_to_exportrå   Úworkersræ   r†   rø   r   )rw   rç   rˆ   r   r‡   )r   s   "r   r   r     sm   € ÷ xñ xÜðxäðxô ðxô ð	xô
 ðxô ðxô ðxô ðxô 
ñxr   c                ó2  aaaaaa a!a"€ T;'       g    \         P                  p\        P                  ! V 4      pV'       g   \	        RV  R24       / # S'       Ed	   \        \         R/ 4      p	\        \         R/ 4      p
^ pV FT  pV	P                  V^ 4      pV^ 8”  d0   V
P                  V. 4      pY¾'       d   \        V4      MT,          pKK  V^,          pKV  	  \        V4      V,          p\	        R\        V4       RV RV RV 24       V FR  pV	P                  V^ 4      pV^ 8”  d)   V
P                  V. 4      p\	        R	V R
V RV 24       KD  \	        RV 24       KT  	  \        P                  ! VRR7       / pV F@  p\        P                  P                  VV4      p\        P                  ! VRR7       VVV&   KB  	  V Uu. uF  pV VVVW6V3NK  	  upo"V Uu/ uF  pV. bK  	  upo ^ o^ o^ o^ o\        P                  ! 4       o!VVVVV V!V"V3R lpV^8”  dm   \        VR7      ;_uu_ 4       pS" Uu/ uF  pVP                  \        V4      VbK  	  pp\!        V4       F  pV! VP#                  4       4       K  	  RRR4       MS" F  pV! \        V4      4       K  	  \        P                  ! 4       S!,
          pV^ 8”  d
   SV,          M^ pS'       d   \	        RS RS RVR RVR R2	4       S # u upi u upi u upi   + '       g   i     Lq; i)aÓ  
Exporta todos os campos de todas as variaveis como COG GeoTIFF.

Parameters
----------
data_dir      : diretorio com os .bin
cog_base_dir  : diretorio raiz de saida dos COGs
vars_to_export: lista de variaveis (None = todas)
sequential    : True se arquivos .bin usam marcadores Fortran
workers       : processos paralelos (1 = serial)
verbose       : exibir progresso
skip_existing : pula arquivos ja existentes

Returns
-------
dict {var_name: [lista de caminhos]}
z+[export_cog] Nenhum arquivo encontrado em 'Ú'r  r  z[export_cog] z timesteps x z campos/ts = z COGs a gerar | workers=z  [3D] z: nlev=z | plot_levels=z  [2D] TrŠ   c                 ó&  <€ S^,          oS\        S4      ,          ^d,          pV  Fg  w  r#rEV'       d9   S	^,          o	S'       d&   \        RV RVP                  R4       RV 24       KD  KF  SV,          P                  V4       S
^,          o
Ki  	  S'       dy   \        P                  ! 4       S,
          pS'       d!   VS,          \        S4      S,
          ,          M^ p\        RSR R\        S4       RVR	 R
S
 RS	 RVR RVR R2RR7       R# R# )é   z	  [ERRO] rÔ   rÕ   rê   z  [Ú3dÚ/z  z5.1fz%]  ok=z  err=z.0fzs  ETA=ÚsT)ÚflushN)r1   rï   rÙ   rî   Útime)Úres_listÚpctr   Útsr„   ÚerrÚelapsedÚetaÚdoneÚn_errÚn_okÚn_skiprò   Út0Útasksræ   s   &       €€€€€€€€r   Ú_processÚ*export_all_fields_as_cog.<locals>._processh  s	  ø€ à��	ˆØ”S˜“ZÕ #Õ%ˆÛ#+ÑˆC�UßØ˜•
�ßÜ˜I c U¨!¨B¯K©K¸
Ó,CÐ+DÀBÀsÀeÐLÖMñ ð �c•
×!Ñ! %Ô(Ø˜•	’ñ $,÷ Ü—i’i“k BÕ&ˆGß<@�7˜T•>¤c¨%£j°4Õ&7Ö8ÀaˆCÜØ�d˜2�Y˜a¤ E£
˜|¨2¨c°$¨Zð 8Ø�v˜V E 7Ø�W˜S�M ¨¨S¨	°ð4ð ÷	ñ r   )Úmax_workersNz
[export_cog] z COGs gerados, z	 erros | z.1fzs (z COG/s))r   Ú	VAR_NAMESrë   rì   rï   r   r×   r1   r§   r¨   r©   rÝ   r3  r   Úsubmitr'  r   Úresult)#rä   r÷   r)  rå   r*  ræ   r†   rø   rñ   Ú_var_nlev_gÚ_var_plot_levels_gÚn_per_tsÚ_vÚ_nlÚ_plÚn_cogs_totalÚvar_dirsr   Údró   r%  r@  ÚpoolÚtaskÚfutsÚfutr8  Úspeedr:  r;  r<  r=  rò   r>  r?  s#   &&&&&f&&                    @@@@@@@r   Úexport_all_fields_as_cogrT    s  ÿ€ ð6 $×7Ð7¤v×'7Ñ'7€NÜ×5Ò5°hÓ?€JçÜÐ;¸H¸:ÀQÐGÔHØˆ	ç€wÜ$¤V¨ZÀÓCˆÜ$¤VÐ->ÀÓCÐàˆÛ ˆBØ—/‘/ " aÓ(ˆCØ�QŒwØ(×,Ñ,¨R°Ó4�Ø®œC œH°Õ4’à˜A•’ñ !ô ˜:“¨Õ1ˆÜØœC 
›OÐ,¨M¸(¸ð DØ�Ð7¸°yðBô	
ó
 !ˆBØ—/‘/ " aÓ(ˆCØ�QŒwØ(×,Ñ,¨R°Ó4�Ü˜ ˜t 7¨3¨%¨¸s¸eÐDÖEä˜ ˜t�nÖ%ñ !ô ‡K‚K� tÕ,Ø€HÛˆÜ�G‰G�L‰L˜ sÓ+ˆÜ
�Š�A Õ%Øˆ�‹ñ ñ óáˆAð 
�1�n h°
À}ÓUÙñ€Eñ
 -Ó-™n˜ˆq�"Šu™nÑ-€EØ€DØ€FØ€EØ€DÜ�iŠi‹k€B÷ô ð, �„{Ü ¨W×5Õ5¸ÙNSÓTÉeÀd�D—K‘KÔ 4°dÓ;¸TÒAÉeˆDÐTÜ# DÖ)�Ù˜Ÿ™›Ö&ñ *÷ 6Ð5ó
 ˆDÙÔ)¨$Ó/Ö0ñ ô �iŠi‹k˜BÕ€GØ '¨!¤ˆd�WŽn°€EßÜØ˜d˜V ?°5°'ð :Ø˜#�˜c %¨ ¨Gð5ô	
ð
 €Lùògùò
 .ùò> U÷ 6×5ús*   ÇK7ÇK<È3LÈ8 LÉ*LÌLÌL	c                ó0   € V ^8„  d   QhR\         R\        /# )r   r„   r   )rw   rˆ   )r   s   "r   r   r   –  s   € ÷ ñ œð ¤ñ r   c                óH  € \         '       g   R#  \        P                  ! V 4      ;_uu_ 4       p\        VP	                  ^4      4      ^ 8„  pVP
                  P                  RR4      pT;'       d    TuuRRR4       #   + '       g   i     R# ; i  \         d     R# i ; i)z’
Verificacao basica: abre o arquivo e confirma que tem overviews e tiles.
Para validacao completa use: python -m cogdumper ou rio cogeo validate.
Fr˜   N)r¦   r®   r¯   r1   r†   rÁ   r×   rð   )r„   ÚsrcÚhas_overviewsÚis_tileds   &   r   Úvalidate_cogrZ  –  s{   € ÷
 ‹<ÙðÜ�]Š]˜5×!Ô! SÜ §¡¨aÓ 0Ó1°AÑ5ˆMØŸK™KŸO™O¨G°UÓ;ˆHØ ×-Ð- X÷ "×!×!Ó!ûô ô Úðús/   �B ®AA>Á3
B Á>B	Â	B ÂB ÂB!Â B!g    €‡ÃÀ)r   é   é   é   é    >   ÚNEVEÚPRCVÚPRECÚPRGE)NF)rÌ   FN)FT)FTFF)NFr.  TFF)/Ú__doc__r§   r3  r²   Únumpyr&   r   r   Útypingr   Úconcurrent.futuresr   r   r®   Úrasterio.shutilÚshutilr·   Úrasterio.transformr   Úrasterio.crsr   Úrasterio.enumsr	   r¦   rN   rï   r   rë   rú   r�   r¶   r   Ú	from_epsgr­   r,   r<   r|   rX   rs   r‚   rÅ   râ   rõ   rü   r'  rT  rZ  r   r   r   Ú<module>rm     sÝ   ðñó6 
Û Û Û ß (Ý ß @ð
>ÛÝ(Ý.Ý Ý)Ø€Ló Û Û ð €Ú#€òð �MŠM˜$Ó€	õFò(:ò8 0€õõ*õ6 ÷NV÷z1E÷h÷Lò8j÷Zx÷~øðW ô >Ø€LÙ	Ð
8Ô9Ù	Ð
<Ö=ð>ús   ªC ÃCÃC