CoolFace
Apppublic

nakas/NWPS_SWAN

sourceHugging Facegpl-3.0updated 1y agoView on Hugging Face
0likes
grib_wave_puller.cpython-313.pyc175 linesDownload Raw Back to __pycache__
1�

2W��h������SSKrSSKrSSKrSSKrSSKrSSKrSSKJrJr SSKr	SSK3rSSKJ
r
 SSKr\RR!\RR#\RR%\555 SSKJr Sr\R6"\R8S9 \R:"\5r"S	S45rg!\a r\R5S\35 SrSrCNXSrCff=f)�N)�datetime�	timedelta)�Client)�ArcticGRIBExtractorTz%Arctic GRIB extractor not available: F)�levelc��\rSrSrSrSrSrSrSSjrSSjr	Sr5S	rS6rSr
SS
jrSrSSjrSSjrSSjr/SQ4SjrSSjrSrg)�GRIBWavePuller�c��[S5Ul[R"SS5Ul[R7"URSS9 UR
5 g)N�ecmwf�8OUTPUT_DIRz/tmp/wave_dataT)�exist_ok)r�client�os�getenv�9output_dir�makedirs�_setup_eccodes_environment)�selfs �D/Users/nakas/Documents/ecmwf_open_data/NWPS_SWAN/grib_wave_puller.py�__init__�GRIBWavePuller.__init__s@���W�o����)�)�L�2B�C���10���D�O�O�d�3�	
�'�'�)�c���S[RS'S[RS'[RS5 g![a"n[RSU35 SnAgSnAff=f)z?Setup ECCODES environment variables to handle projection issues�0�ECCODES_GRIB_STRICT_PARSING�1�#ECCODES_GRIB_IGNORE_GRID_DEFINITIONz5Set ECCODES environment variables for relaxed parsingz-Could not set ECCODES environment variables: N)r�environ�logger�info�	Exception�warning)r�es  rr�)GRIBWavePuller._setup_eccodes_environment$s\��	P�8;�B�J�J�4�5�@C�B�J�J�<�=��K�K�O�P���	P��N�N�J�1�#�N�O�O��	P�s�;>�11A*�A%�%A*c��[R"SS/SSSS9nURS:H$![R[[R124a gf=f)z2Check if CDO (Climate Data Operators) is available�cdoz	--versionT�13��capture_output�text�timeoutrF��14subprocess�run�15returncode�TimeoutExpired�FileNotFoundError�SubprocessError�r�results  r�_check_cdo_available�#GRIBWavePuller._check_cdo_available.s[��	��^�^�U�K�$8�15�D�"�N�F��$�$��)�)���)�)�+<�j�>X�>X�Y�	��	���'*�)A�Ac��UR5(d[RS5 g[RS5 [R16"SSS9nUR
5 SSUUR/n[RS	S17RU535 [R"USSSS
9nURS:Xa![RS5 UR$[RSUR35 [RR!UR5(a [R""UR5 g![$a"n[RSU35 SnAgSnAff=f)z=Reproject Arctic GRIB file using CDO as alternative to wgrib2z)CDO not available for Arctic reprojectionNz2Attempting to reproject Arctic GRIB file using CDOFz_cdo_reprojected.grib2��delete�suffixr'zremapbil,r720x360zRunning CDO command: � T�xr)rz2Successfully reprojected Arctic GRIB file with CDOzCDO failed: zError reprojecting with CDO: )r6r r#r!�tempfile�NamedTemporaryFile�close�name�joinr.r/r0�error�stderrr�path�exists�unlinkr"�r�grib_file_path�temp_reprojected�cmdr5r$s      r�_reproject_arctic_with_cdo�)GRIBWavePuller._reproject_arctic_with_cdo7s8��!	��,�,�.�.����J�K���K�K�L�M� (�:�:�%�Ph�i���"�"�$�18�*�� �%�%��C�
�K�K�/�����
��?�@��^�^�C��4�QT�U�F�� � �A�%����P�Q�'�,�,�,����|�F�M�M�?�;�<��7�7�>�>�"2�"7�"7�8�8��I�I�.�3�3�4����	��L�L�8���<�=���	�s$�*E�B8E�&A0E�19F�!E>�>Fc�^�[RS5 [R"SSS9nURRSS/SUURS9 [RS	UR35 UR$![apn[RS20U35 [RRUR5(a [R"UR5 SnAgSnAff=f![a"n[RSU35 SnAgSnAff=f)
z+Fetch global wave data from ECMWF open dataz'Fetching ECMWF global wave GRIB data...F�.grib2r:�fc�swhr)�type�param�time�step�targetzGRIB file downloaded: zFailed to fetch ECMWF data: Nz Error in fetch_ecmwf_wave_grib: )
r r!r?r@r�retrieverBr"rDrrFrGrH)r�
forecast_time�	temp_filer$s    r�fetch_ecmwf_wave_grib�$GRIBWavePuller.fetch_ecmwf_wave_grib\s���	��K�K�A�B�!�3�3�5��R�I�
����$�$�� �'��&�$�>�>�%�����4�Y�^�^�4D�E�F� �~�~�%���
����;�A�3�?�@��7�7�>�>�)�.�.�1�1��I�I�i�n�n�-���
���	��L�L�;�A�3�?�@���	�s<�*D�AB�21C=�
A&C8�3D�8C=�=D�22D,�23D'�'D,c�"�[RSUS35 Sn[R"5nUR	S5U[SS9-24R	S5U[SS9-25R	S5/n/SQnURnUS	:�a/S26QnOUS:�a/SQnOUS
:�a/SQnO/SQnUGH�n[RSU35 UGH�n	SUS3n27/nSU	SU28S3S4SU	SU29S3S4SU	SU30S3S4SU	SU31S3S4/nUGHup�USUSU	SU
3n[RS US!U
35 [R"S"SS#9n[R"US$S%9nURS&:XaoURUR5 UR5 URUR X�U45 [RUS'UR 35 M�[R#S(URS)U35 [$R&"UR 5 GM  U(a([RS-[+U5S.35 Us s $GM� GM� [R/S15 g2![(a'n[R#S*US+U35 S,nAGM�S,nAff=f![(a*n[R-S/U	S0US+U35 S,nAGM
S,nAff=f![(a"n[R/S3U35 S,nAg2S,nAff=f)4z*Fetch global wave data from NOAA WW3 modelz:Fetching NOAA WW3 global wave GRIB data for forecast hour z...z7https://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prodz%Y%m%d�)�days�)�00�06�12�18�)rdrcrbra�)rcrbrard�)rbrardrc)rardrcrbz
Trying date: �f�03dz	gfswave.tzz.atlocn.0p16.rP�Atlanticzz.epacif.0p16.�East_Pacificz
z.arctic.9km.�Arcticzz.global.0p16.�Globalz/gfs.�/z/wave/gridded/zAttempting to download �	 region: Fr:i,)r,��z GRIB file downloaded: zHTTP z for zError downloading �: NzSuccessfully downloaded z regional filesz
Error trying z	Z run on z/Failed to download NOAA data from any model run)NNNzError in fetch_noaa_wave_grib: )r r!r�utcnow�strftimer�hourr?r@�requests�get�status_code�write�contentrA�appendrB�debugrrHr"�lenr#rD)r�
forecast_hour�base_url�now�dates_to_try�32model_runs�current_hour�preferred_runs�date_strrt�forecast_str�successful_downloads�regional_files�filename�region_name�urlrZ�response�33file_error�	run_errorr$s                     r�fetch_noaa_wave_grib�#GRIBWavePuller.fetch_noaa_wave_grib|sD��T	$��K�K�T�Ub�Tc�cf�g�h�Q�H��/�/�#�C����X�&��y�a�(�(�2�2�8�<��y�a�(�(�2�2�8�<��L�2�J��8�8�L��r�!�!9����#�!9����"�!9��!9��)�����m�H�:�6�7�*�D�-!�)*�=��*=�'>��02�,� )���n�\�N�&�Q�S]�^�(���n�\�N�&�Q�Sa�b�(���m�L�>��P�RZ�[�(���n�\�N�&�Q�S[�\�*��6D�1�H�)�)1�34�%��z��4�&��W_�V`�&a�� &���.E�k�]�R[�\d�[e�,f� g�,4�,G�,G�u�]e�,f�	�+3�<�<��S�+I��#+�#7�#7�3�#>�$-�O�O�H�4D�4D�$E�$-�O�O�$5�$8�$?�$?����Q\�dq�@r�$s�$*�K�K�;�-�?V�W`�We�We�Vf�0g�$h�$*�L�L�5��9M�9M�8N�e�T_�S`�1a�$b�$&�I�I�i�n�n�$=�$,�!6D�,0�"�K�K�*B�3�G[�C\�B]�]l�(m�n�#7�7�0�Q+�)�d
�L�L�J�K�#��$-�)� &���/A�+��b�Q[�P\�-]� ^� (��)��%�!�����t�f�I�h�Z�r�R[�Q\�']�^� ��!���	$��L�L�:�1�#�>�?�#��	$�s��CK"�:J+�
CI7�J+�AI7�#/J+�K"�K"�735J(	�J#	�J+�#J(	�(J+�+36K�5K�K"�K�K"�"37L�,L	�	Lc��[R"SS/SSSS9nURS:H$![R[[R384a gf=f)z.Check if wgrib2 command-line tool is available�wgrib2z-versionTr(r)rFr-r4s  r�_check_wgrib2_available�&GRIBWavePuller._check_wgrib2_available�s[��	��^�^�X�z�$:�15�D�"�N�F��$�$��)�)���)�)�+<�j�>X�>X�Y�	��	�r8c��UR5(d[RS5 g[RS5 [R39"SSS9nUR
5 SUSS	S40SUR/n[RSS
RU535 [R"USSSS9nURS:Xa![RS5 UR$[RSUR35 [RR!UR5(a [R""UR5 g![$a"n[RSU35 SnAgSnAff=f)z7Reproject Arctic GRIB file to lat-lon grid using wgrib2z,wgrib2 not available for Arctic reprojectionNz5Attempting to reproject Arctic GRIB file using wgrib2Fz_reprojected.grib2r:r�z	-new_grid�latlonz	0:720:0.5z	50:71:0.5zRunning wgrib2 command: r=Tr>r)rz)Successfully reprojected Arctic GRIB filezwgrib2 failed: z Error reprojecting with wgrib2: )r�r r#r!r?r@rArBrCr.r/r0rDrErrFrGrHr"rIs      r�_reproject_arctic_with_wgrib2�,GRIBWavePuller._reproject_arctic_with_wgrib2�s=��!	��/�/�1�1����M�N���K�K�O�P� (�:�:�%�Pd�e���"�"�$�41�.��X�{�K� �%�%��C�
�K�K�2�3�8�8�C�=�/�B�C��^�^�C��4�QT�U�F�� � �A�%����G�H�'�,�,�,�����v�}�}�o�>�?��7�7�>�>�"2�"7�"7�8�8��I�I�.�3�3�4����	��L�L�;�A�3�?�@���	�s$�*E�B;E�)A0E�42F�$F�Fc��^�SSKn[RS5 URU5nSnSnSnSnSn[RS5 UGHn	[	U	5m[RST35 [
U4SjS55(a=Uc8U	RnU	R5upx[RSU	35 M}M[
U4S	jS4355(a+Uc&U	Rn[RSU	35 M�M�[
U4SjS
55(a-Uc'U	Rn[RSU	35 GMGMGM UR5 UGbSUGbO[RSURSUR35 [UR5S:�aVUR5nUR5nUR5nUbUR5nUbUR5nUS:*US:�-US:�-US:*-[R "U5)-US:�-US:-n[R"U5(aEX{nX�n
XKnSnSnUbX[nUbXkn[RS[U5S35 X�X�U4$[RS5 g[R#S5 g![a'n44[RSU	SU4535 Sn46A47GM�Sn48A49ff=f![aLn[R#SU35 SSKn[R#SUR'535 SnAgSnAff=f) zTProcess Arctic GRIB file using pygrib as fallback for polar stereographic projectionrNz'Using pygrib for Arctic file processingz0Scanning Arctic GRIB file for wave parameters...zFound parameter: c3�H># �UHoTR5;v� M g7f�N��lower��.0�keyword�grb_strs  �r�	<genexpr>�=GRIBWavePuller._process_arctic_with_pygrib.<locals>.<genexpr>s$�����F�'�g�m�m�o�5�F���")zsignificant heightzwave heightrR�htsgwzFound Arctic wave height data: c3�H># �UHoTR5;v� M g7fr�r�r�s  �rr�r�#�$�����H�G��
�
��7�H�r�)zwave direction�dirpw�wvdir�	directionz"Found Arctic wave direction data: c3�H># �UHoTR5;v� M g7fr�r�r�s  �rr�r�+r�r�)zwave period�perpw�wvper�periodzFound Arctic wave period data: zFailed to extract data from rqzRaw Arctic data shape: lats=z50, heights=r^g@U@gI@��f���f@�2z
Arctic data: u valid points from 50-85°Nz*No valid Arctic data found after filtering�NNz-No wave height data found in Arctic GRIB filez*Error processing Arctic file with pygrib: zTraceback: )�pygribr r!�open�strr{�any�values�latlonsr"r#rA�shaper|�flatten�np�isnanrD�	traceback�51format_exc)rrJr��grbs�wave_height_data�wave_direction_data�wave_period_data�lats�lons�grb�	grb_error�52valid_mask�
filtered_lats�
filtered_lons�filtered_heights�filtered_directions�filtered_periodsr$r�r�s                   @r�_process_arctic_with_pygrib�*GRIBWavePuller._process_arctic_with_pygribs����b	���K�K�A�B��;�;�~�.�D� $��"&��#���D��D��K�K�J�K����c�(�����0��	�:�;����F����,�3�/2�z�z�,�),����J�D�"�K�K�*I�#��(O�P�4���H����/�6�25�*�*�/�"�K�K�*L�S�E�(R�S�7�53��H����,�3�/2�z�z�,�"�K�K�*I�#��(O�P�4��/�D
�J�J�L��+��0@����:�4�:�:�,�j�Qa�Qg�Qg�Ph�i�j��t�z�z�?�Q�&��<�<�>�D��<�<�>�D�'7�'?�'?�'A�$�*�6�.A�.I�.I�.K�+�'�3�+;�+C�+C�+E�(� $�t�|����=�"�f�n�.�15���@�!�x�x�(8�9�9�;�/�!�3�5�9I�2�8M�O�54�55�6�6�*�%�%�$(�$4�M�$(�$4�M�'7�'C�$�*.�'�'+�$�*�6�.A�.M�+�'�3�+;�+G�(��K�K�-��M�0B�/C�C^� _�`�(�9I�`p�p�p��N�N�#O�P�%����L�M�!��]!���N�N�%A�#��b���#T�U�����`�	��L�L�E�a�S�I�J���L�L�;�y�';�';�'=�&>�?�@���		�sk�A2L�6AK�	L�
AK�L�AK�EL�/L�L�56L�%L�L�L�L�57M%�AM � M%c	�&^�[RS5 [R"USS/SQSSS.S9n[RS	5 [RS58[	UR59R
5535 SnSHmTUR60;dMTn O Uc1UR61H!m[U4S
jS55(dMTn O U(GaEX#Rn[RSUSUR35 [UR5S:Xa�URupV[R"SSU5n[R"SSU5n[R"X�5up�U62R5nU	R5nUR5n
[R"U
5)U
S:�-U
S:-n[R"U5(a5X�nX�nX�n[RS[U5S35 UUUSS4$UR!5 g!["a"n[R%SU35 SnAgSnAff=f!["a"n[R'SU35 SnAgSnAff=f)zAProcess Arctic GRIB file bypassing coordinate processing entirelyz?Attempting to process Arctic file without coordinate processing�cfgribT)�paramId�	shortNamerB�units�ignore�)�	read_keys�errors�	indexpath)�engine�decode_timedelta�backend_kwargsz:Successfully opened Arctic file with restricted processing�Available variables: N�rR�HTSGWr�c3�H># �UHoTR5;v� M g7fr�r��r�r��var_names  �rr��EGRIBWavePuller._process_arctic_without_coordinates.<locals>.<genexpr>�s����d�Jc�w�(�.�.�*:�:�Jc�r���wave�heightrRzFound wave data: z	, shape: r`�U�<�L����rr�zArctic fallback: z approximate pointsr�zRestricted processing failed: z'Error in coordinate-bypass processing: )r r!�xr�open_dataset�list�	variables�keysr�r�r�r|r��linspace�meshgridr�r�rAr"r#rD)rrJ�ds�wave_var�	wave_data�rows�cols�	fake_lats�	fake_lons�lon_grid�lat_grid�	flat_lats�	flat_lons�63flat_wavesr�r�r��filtered_waves�restricted_errorr$r�s                    @r�#_process_arctic_without_coordinates�2GRIBWavePuller._process_arctic_without_coordinateshsX���I	��K�K�Y�Z�A
"��_�_�"�#�%)�%N�"*�%'�$�		�����X�Z����3�D����9J�9J�9L�4M�3N�O�P� �� 9�H��2�<�<�/�#+���!:�64�#�$&�L�L���d�Jc�d�d�d�'/�H�!�%1�65� "�� 3� 3�I��K�K�"3�H�:�Y�y���FW� X�Y��9�?�?�+�q�0�%.�_�_�66��$&�K�K��B��$=�	�$&�K�K��c�4�$@�	�-/�[�[��-N�*��%-�$4�$4�$6�	�$,�$4�$4�$6�	�%.�%6�%6�%8�67�(*�x�x�68�';�&;�69�a��%P�T^�ac�Tc�%d�70��6�6�*�-�-�,5�,A�M�,5�,A�M�-7�-C�N�"�K�K�*;�C�
�<N�;O�Ob�(c�d�#0�-��QU�W[�#[�[����71�!���
"����!?�@P�?Q�R�S�!��
"���	��L�L�B�1�#�F�G���	�sN�I$�BH5�0H5�EH5�$H5�572I!�?I�I$�I!�!I$�$73J�.J�JNc
��^^ �[RSU35 U=(a SUR5;=(d SUR5;n/nU(Gaf[RS5 URU5nU(aS[RS5 [R74"USSS9nUR
U5 [R"U5 U(dkURU5nU(aS[RS755 [R76"USSS9nUR
U5 [R"U5 U(d6[RS5 URU5n77U78(aU79S
bU80$U(dU[RS5 [R81"USSS0SS9nUR
U5 [RS5 U(d�[RS5 [(d[R!S5 g[#5n
U
R%USS9n82U83SS:Xa]U84SS
:�aT[RSU85SSU86S35 U87S nUS!R&US"R&US#R&S	S	4$[R!S$U88S%35 gO'[R89"USSS9nUR
U5 [R90"USS'S(0SS)9nUR(R+5WR(R+5:waUR
U5 0nUHnUR-UR(5 M  [RS+[/UR+5535 S	nS	nS3H4m T U;dMT nUT R&n[RS4U35  O UcNUHHm [3U 4S5jS655(dMT nUT R&n[RS7U35  O Uc/[R!S85 UHnUR55 M gS	nS	nS9H4m T U;dMT nUT R&n[RS:U35  O S	nS	nS;H4m T U;dMT nUT R&n[RS<U35  O US
nS!U;aUR6R&OUR8R&nS"U;aUR:R&OUR<R&nUbS[RS=UR>S>[@RB"U5S?S@[@RD"U5S?SA35 UbS[RSBUR>S>[@RB"U5S?S@[@RD"U5S?SC35 [FRH"5RK5SDUR5;aSEOSFUUUUS	LSG.[M[@RN"U55[M[@RP"U55[M[@RN"U55[M[@RP"U55[SU5SH:�a[MUSHUS
-915OS	[SU5SH:�a[MUSHUS
-925OS	UR>SI.[M[@RD"U55[M[@RB"U55[M[@RT"U55[M[@RV"U55SJ.URYUUUUU5SK.nUbB[M[@RT"U55[M[@RV"U55SL.USM'Ub`[M[@RD"U55[M[@RB"U55[M[@RT"U55SN.USO'UHnUR55 M UU4$![a_n[RSU35 [RRU5(a[R"U5 /nS	nAGN�S	nAff=f![a_n	[RSU	35 [RRU5(a[R"U5 /nS	n	A	GN�S	n	A	ff=f![a#n[RSU35 S	nAGN�S	nAff=f![a#n[RSU35 S	nAGN�S	nAff=f![a"n[R!S&U35 S	nAgS	nAff=f! [RS*5 GN�=f![Gacn[1U5m[R!S,T35 U(Ga.[3U4S-jS.55(Ga[RS/5 [(d[R!S5 S	nAg[#5n
U
R%USS9n93U94SS:XabU95SS
:�aY[RS0U96SSU97S35 U98S nUS!R&US"R&US#R&S	S	4sS	nA$[R!S1U99S%35 S	nAg![a&n[R!S2U35 S	nAS	nAgS	nAff=fS	nAgS	nAff=f![a"n[R!SPU35 S	nAgS	nAff=f)QzFProcess GRIB file and extract wave data including direction and periodzProcessing GRIB file: �arcticzIProcessing Arctic GRIB file with enhanced multi-layered fallback approachz)Processing wgrib2-reprojected Arctic filer�T)r�r�z+Failed to process reprojected Arctic file: Nz&Processing CDO-reprojected Arctic filez/Failed to process CDO-reprojected Arctic file: z5Trying coordinate-bypass method for Arctic processingrz!Coordinate-bypass method failed: z4Trying cfgrib with relaxed error handling for Arcticr�r�)r�r�r�z<Successfully opened Arctic file with relaxed cfgrib settingsz+Failed to process Arctic file with cfgrib: z<Using comprehensive Arctic GRIB2 extractor as final fallbackz#Arctic GRIB extractor not availabler��d)�
sample_points�status�success�sampled_pointsu'✅ Arctic GRIB extraction successful: z points using �extraction_method�data�latitude�	longitude�valueu#❌ Arctic GRIB extraction failed: �messagezArctic GRIB extraction failed: �100discipliner()r��filter_by_keysr�z7Could not open oceanographic discipline data separatelyr�zError opening GRIB file: c3�H># �UHoTR5;v� M g7fr�r�)r�r��	error_msgs  �rr��3GRIBWavePuller.process_grib_file.<locals>.<genexpr>1s%����%�R�g�	���0A�%A�R�r�)zpolar stereographiczspherical earth�geoiteratorzgeographic attributeszunable to create iteratorzMDetected Arctic polar stereographic error - triggering real Arctic extractionu"✅ Arctic extraction successful: u❌ Arctic extraction failed: zReal Arctic extraction failed: r�zUsing wave height variable: c3�H># �UHoTR5;v� M g7fr�r�r�s  �rr�r]s����`�F_�7�h�n�n�&6�6�F_�r�r�zFound wave height variable: z+No wave height variables found in GRIB file)r��DIRPW�dpr��WVDIR�dirzFound wave direction variable: )r��PERPW�tpr��WVPER�perzFound wave period variable: zWave directions shape: z	, range: z.1f�-z degreeszWave periods shape: z secondsr�101ECMWF_GRIB�	NOAA_GRIB��wave_height�wave_direction�wave_period�has_velocity_componentsr^��lat_min�lat_max�lon_min�lon_max�lat_resolution�lon_resolution�102grid_shape��max_wave_height�min_wave_height�mean_wave_height�std_wave_height��	timestamp�data_source�parameters_found�	grid_info�wave_statisticsr��mean_direction�
direction_std�direction_statistics��103max_period�104min_period�mean_period�period_statisticszError processing GRIB file: )-r r!r�r�r�r�rzrrHr"r#rFrGrMr��ARCTIC_EXTRACTOR_AVAILABLErDr�get_compatible_formatr�r�r��updater�r�r�rAr	�latr105�lonr�r��nanmin�nanmaxrrr�	isoformat�float�min�maxr|�nanmean�nanstd�#_extract_sample_points_with_vectors)!rrJr��	is_arctic�datasets�reprojected_file�	ds_height�reprojected_error�cdo_reprojected_file�	cdo_errorr5�bypass_error�cfgrib_error�arctic_extractor�df�extraction_error�ds_ocean�all_varsr�r$�arctic_error�wave_height_var�wave_heights�wave_directions�wave_dir_var�wave_periods�wave_period_var�ds_mainr�r��processed_datarr�s!                               @@r�process_grib_file� GRIBWavePuller.process_grib_file�s�106���C	��K�K�0��0@�A�B�%�H��[�5F�5F�5H�)H�o�X�Yg�Ym�Ym�Yo�Mo�I�P
&�����K�K� k�l�(,�'I�'I�.�'Y�$�'�*�"�K�K�(S�T�(*���8H�QY�HL�)N�I�$�O�O�I�6��I�I�&6�7�$�/3�/N�/N�~�/^�,�/�.� &���,T� U�,.�O�O�<P�Ya�LP�-R�	� (���	� :� "�	�	�*>� ?�$�_�"�K�K�(_�`�%)�%M�%M�n�%]�F�%�&��)�*?�'-�
�107$�i�"�K�K�(^�_�(*����x�GO�QY�FZ�HL�)N�I�%�O�O�I�6�"�K�K�(f�g�108$�.�"�K�K�(f�g�#=�#=� &���-R� S�'1�/B�/D�,�%5�%K�%K�N�jm�%K�%n�F�%�h�/�9�<��HX�AY�\]�A]� &���.U�V\�]m�Vn�Uo�o}�E�FY�Z�~[�-\�!]�%+�F�^��(*�:��(=�(=�r�+��?U�?U�')�'�{�'9�'9�4��(G�!G�!'���/R�SY�Zc�Sd�Re�-f� g�'1�'$�4!#����x�?C�!E�I��O�O�I�.�[�!���~�h�=I�2�<N�>B� D�H� �)�)�.�.�0�I�4G�4G�4L�4L�4N�N� ����1�109��"�B��O�O�B�L�L�1�#����3�D�����4I�3J�K�L�N#�O��L�5���x�'�&.�O�#+�H�#5�#<�#<�L��K�K�">��>O� P�Q��6��#� (�H��`�F_�`�`�`�*2��'/��'9�'@�'@�����&B�?�BS�$T�U��!)��#����J�K�"�B��H�H�J�#�!�#�O��L�M���x�'�#+�L�&.�x�&8�&?�&?�O��K�K�"A�,�� P�Q��N� �L�"�O�M���x�'�&.�O�#+�H�#5�#<�#<�L��K�K�">��>O� P�Q��N��q�k�G�.8�G�.C�7�#�#�*�*����I[�I[�D�/:�g�/E�7�$�$�+�+�7�;�;�K]�K]�D��*����5�o�6K�6K�5L�I�VX�V_�V_�`o�Vp�qt�Uu�uv�wy�xA�xA�BQ�xR�SV�wW�W_�`�a��'����2�<�3E�3E�2F�i�PR�PY�PY�Zf�Pg�hk�Ol�lm�np�nw�nw�yE�oF�GJ�nK�KS�T�U�&�_�_�.�8�8�:�/6�.�:N�:N�:P�/P�|�Va�#2�&2�#2�/;�4�/G�	%� %�R�V�V�D�\�2�$�R�V�V�D�\�2�$�R�V�V�D�\�2�$�R�V�V�D�\�2�BE�d�)�a�-�e�D��G�d�1�g�,=�&>�UY�BE�d�)�a�-�e�D��G�d�1�g�,=�&>�UY�".�"4�"4��(-�R�Y�Y�|�-D�'E�',�R�Y�Y�|�-D�'E�(-�b�j�j��.F�(G�',�R�Y�Y�|�-D�'E�	$�"&�!I�!I�$�PT�Vb�ds�vB�"C�1�N�8�*�&+�B�J�J��,G�&H�%*�2�9�9�_�+E�%F�:��5�6�110�'�"'��	�	�,�(?�"@�"'��	�	�,�(?�"@�#(����L�)A�#B�7��2�3������111��"�>�1�1��O )�*�"�N�N�-X�Yj�Xk�+l�m�!�w�w�~�~�.>�?�?� "�	�	�*:� ;�')�H��	*��"$-�.� &���1`�aj�`k�/l� m�#%�7�7�>�>�2F�#G�#G�$&�I�I�.B�$C�+-���	.�� )�_�"�N�N�-N�|�n�+]�^�^��_�� )�i�"�N�N�-X�Ye�Xf�+g�h�h��i��2 )�.�"�L�L�+J�K[�J\�)]�^�#-��.�� [��K�K� Y�Z���"
&���F�	����8���D�E���%�R�%�"�"��K�K� o�p�*�9�9�"�L�L�)N�O�#-�+>�+@�(�!1�!G�!G��fi�!G�!j��!�(�+�y�8�V�DT�=U�XY�=Y�"�K�K�*L�V�Td�Me�Lf�ft�u{�}P�vQ�uR�)S�T�!'���B�$&�z�N�$9�$9�2�k�?�;Q�;Q�#%�g�;�#5�#5�t�T�$C�C�#�L�L�+I�&�QZ�J[�I\�)]�^�#-��$�*����'F�|�n�%U�V�)�z��*��112&��E"
&��X�	��L�L�7��s�;�<���	�s��Am�7g�Aa�g�=Ac�g�4d.�g�Ae�(g�05f�&A?f�&f�(g�+A f=�Ag� 
m�1A
m�Am�!
m�2:m�0N%m�113b?� Ab:�4g�:b?�?g�114d+�Ad&� g�&d+�+g�.115e�8e�g�e�g�116f�(f�g�f�g�117f:�f5�0g�5f:�:g�=g�g�m�%Am� l�!m�&A?l�%m�&m�+l�m�118l;�l6�-m�1m�6l;�;m�>m�m�m�119m7�m2�2m7c��[RS[U5S35 /n/n/n/n[S5n[S5n[S5n[S5n	SSSSS.n120/nUGH�up�p�[RSU
SU35 UR	X�S	9nUb*[U[5(a0[U5S121:Xa!UScSU
S
35 Mz[U[5(Ga�[U5S:XGa�[US[5(Gd�Uunnnnn[RS[U5S35 /n[[U55H�n[UU5[UU5UUb[UU5OSUbU[U5:a[UU5OSUbU[U5:a[UU5OSSSS.nURU5 M� URU5 Ub�[U5S:�a�[U[[R"U555n[U[[R"U555n[U[[R"U555n[U	[[R"U555n	URU
5 [RSU
S[U5S35 GO�UunnU(aSU;aUSnURU5 URS05nURS5b<[UUS5n[UUS5n[UUS5n[U	US5n	WHwnURS5bURUS5 URS5bURUS5 URS5cMcURUS5 My URS05nU122S(dURS5U123S'U124S(dURS5U125S'U126S(dURS5U127S'URS5(aSU128S'URU
5 [RS U
S[U5S35 [ R"R%U5(a[ R&"U5 GM�GM� U(d[R+S"5 g[RS#[U5S$U35 [RS%[U535 [,R."5R15S&S'R3U5S(3U129U[S5:wa[U5OSU[S5:wa[U5OSU[S5:wa[U5OSU	[S5:wa[U	5OSU[U5S).U(a[[U55OSU(a[[U55OSU(a[[R4"U55OSU(a[[R6"U55OSS*.US+.nU(aB[[R4"U55[[R6"U55S,.US-'U(aJ[[U55[[U55[[R4"U55S..US/'U$![(aan[R+S!U
SU35 [ R"R%U5(a[ R&"U5 SnAGM*SnAff=f![(akn[R+S0U35 UHCup� n[ R"R%U5(dM-[ R&"U5 ME SnAgSnAff=f)1zIProcess multiple regional GRIB files and combine data for global coveragezProcessing z+ regional GRIB files for global coverage...�infz-infNFrro)r�r`rzFailed to process z region�z'Processing Arctic raw coordinate data: z points)rCrDr r!r"�130u_velocity�131v_velocityzSuccessfully processed Arctic rqrr5r%r&r'r(r r!r"r4r#TzSuccessfully processed zError processing z(No valid data found in any regional filezCombined data from z132 regions: zTotal sample points: zNOAA_MULTI_REGIONAL_GRIB (�,�))r%r&r'r(�regions_included�total_pointsr,r1r7r:r;r?z*Error processing multiple regional files: )r r!r|rHre�133isinstance�tupler#�dict�rangerz�extendrIr�rJrvrrFrGrHr"rDrrrrGrC�mean�std)rr��combined_sample_points�all_wave_heights�all_wave_directions�all_wave_periods�global_lat_min�global_lat_max�global_lon_min�global_lon_maxr4�regions_processedrJr��	model_runr}r5r�r��heights�134directions�periods�regional_points�i�point�
regional_data�_r5�regional_paramsr$�
combined_datas                               r�process_multiple_regional_files�.GRIBWavePuller.process_multiple_regional_files�s@��h	��K�K�+�c�.�&9�%:�:e�f�g�%'�"�!��"$��!��"�5�\�N�"�6�]�N�"�5�\�N�"�6�]�N� $�"&�#�+0�	 ��!#��IW�E��Y�\��K�K�+�k�]�)�N�CS� T�U�"�3�3�N�3�\�F��~�*�V�U�*C�*C��F��WX�HX�]c�de�]f�]n����);�K�=��'P�Q� �#�6�5�1�1�c�&�k�Q�6F�&�v�a�y�$�7�7�CI�@��d�G�Z�����&M�c�RV�i�[�X_�$`�a�+-��!&�s�4�y�!1�A�',�T�!�W�~�',�T�!�W�~�DK�A�J�DZ�u�W�Q�Z�/@�`d�JT�J`�ef�il�mw�ix�ex�%�135�1�
�2F�C�DK�DW�\]�`c�dk�`l�\l�u�W�Q�Z�/@�rv�.2�.2�%�E�,�2�2�5�9�"2�/�5�5�o�F� �+��D�	�A�
�-0���r�v�v�d�|�AT�-U�N�-0���r�v�v�d�|�AT�-U�N�-0���r�v�v�d�|�AT�-U�N�-0���r�v�v�d�|�AT�-U�N�)�0�0��=����&D�[�M�QS�TW�Xg�Th�Si�ip�$q�r�,2�(�
�q�(�_�
�-M�.;�O�.L�O�2�9�9�/�J�%2�$5�$5�k�2�$F�	�$�=�=��3�?�-0���9�AU�-V�N�-0���9�AU�-V�N�-0���9�AU�-V�N�-0���9�AU�-V�N�&5�E�$�y�y��7�C� 0� 7� 7��m�8L� M�$�y�y�)9�:�F� 3� :� :�5�AQ�;R� S�$�y�y��7�C� 0� 7� 7��m�8L� M�
&5�+8�*;�*;�<N�PR�*S��/�
�>�>M�>Q�>Q�R_�>`�,�]�;�/�0@�A�AP�AT�AT�Ue�Af�,�-=�>�/�
�>�>M�>Q�>Q�R_�>`�,�]�;�*�.�.�/H�I�I�JN�,�-F�G�)�0�0��=����&=�k�]�"�S�Q`�Ma�Lb�bi�$j�k��w�w�~�~�n�5�5��	�	�.�1�6�kJX�~*����G�H���K�K�-�c�2C�.D�-E�Z�Pa�Ob�c�d��K�K�/��4J�0K�/L�M�N�&�_�_�.�8�8�:�!;�C�H�H�EV�<W�;X�XY�Z�$4�8F�%�PU�,�8V�u�^�4�\`�8F�%�PV�-�8W�u�^�4�]a�8F�%�PU�,�8V�u�^�4�\`�8F�%�PV�-�8W�u�^�4�]a�(9�$'�(>�$?�
�HX�u�S�1A�-B�'C�]a�GW�u�S�1A�-B�'C�]a�L\��b�g�g�6F�.G�(H�bf�JZ�u�R�V�V�4D�-E�'F�`d�	$�"8�%�M�,#�&+�B�G�G�4G�,H�&I�%*�2�6�6�2E�+F�%G�9�
�4�5�136 �"'��,<�(=�">�"'��,<�(=�">�#(����1A�)B�#C�6�
�1�2�!� ��e!���L�L�#4�[�M��1�#�!N�O��w�w�~�~�n�5�5��	�	�.�1�����h�	��L�L�E�a�S�I�J�5C�1��Q���7�7�>�>�.�1�1��I�I�n�-�6D���
	�sf�A(^�+A0\'�^�K5\'�D\'�%$^�137H^�'138^�1A^
�^�
^�^�139`140�A`�&`�`141c� �[R"X!5upxUR5n	UR5n142UR5nSnSn
UbUR5nUbUR5n
[R"U5)nUbU[R"U5)-nX�nX�nX�nUbX�nOSnU
bX�nOSn[	U5S:Xa/$[U[	U55n[RR[	U5USS9n/nUH�n[UU5[UU5[UU5S.nUbj[UU5nUUS'[R"U5nUSS-nU"U5-US	'U*[R"U5-US143'Ub[UU5US'URU5 M� U$![a$n[RSU35 /sSnA$SnAff=f)
zGExtract sample points with velocity vector components for visualizationNrF)�size�replace)rCrDr r!r 皙�����?�u_component�v_componentr"z-Error extracting sample points with vectors: )r�r�r�r�r|rI�random�choicerH�radians�sin�cosrzr"r rD)rr�r�r^r_ra�num_samplesr�r�r�r�r��	flat_dirs�flat_periodsr��144valid_lats�145valid_lons�valid_waves�146valid_dirs�
valid_periods�sample_size�sample_indicesr�idxr�r��dir_rad�	magnituder$s                             rrM�2GRIBWavePuller._extract_sample_points_with_vectorshs0��L	�!#���T�!8��H�!�(�(�*�I� �(�(�*�I�%�-�-�/�J��I��L��*�+�3�3�5�	��'�+�3�3�5���(�(�:�.�.�J��$�'�2�8�8�I�+>�*>�>�147�"�.�J�"�.�J�$�0�K��$�&�2�148�!�149��'� ,� 8�
� $�
��;��1�$��	��k�3�{�+;�<�K��Y�Y�-�-�c�+�.>�[�Z_�-�`�N��M�%�� ��C��1� ��C��1�#(��S�)9�#:����)� %�j��o� 6�I�.7�E�*�+�150!�j�j��3�G� %�m� 4�s� :�I�,5�r�v�v�g��+F�E�-�(�,5�:����w��+G�E�-�(� �,�+0��s�1C�+D�E�-�(��$�$�U�+�5&�8!� ���	��L�L�H���L�M��I��	�s%�CG�DG�151H
�)H�H
�H
c�,�URXUSSU5$)zGLegacy method - extract sample points for visualization without vectorsN)rM)rr�r�r^r�s     r�_extract_sample_points�%GRIBWavePuller._extract_sample_points�s���7�7��L�RV�X\�^i�j�jrc�f�[RS5 SnSnURU5nU(a+[U[5(aUnU(aUSSOSnSnOHU(a[U5S:XaUup#nSnO*[RS5 UR
U5nSnSnU(dU(d[RS5 gU(aURU5nSnOURU5upxU(a8UU[R"5[US	9-R5US:HS152.US'U(a<[RR!U5(a[R""U5 U$U(aU$![$a"n	[RSU	35 Sn	A	gSn	A	ff=f)
z%Main method to fetch global wave datazKFetching wave data from NOAA WW3 model (ECMWF doesn't provide wave data)...Nrr`�zENOAA failed, trying ECMWF as fallback (unlikely to have wave data)...z8Both ECMWF and NOAA failed - no real wave data available�multiple_regional_files��hours�r}r��forecast_valid_time�153is_current�
forecast_infoz!Error in fetch_global_wave_data: )r r!r�rpr�r|r[rDr�rerrrrrGrrFrGrHr")154rr}�	grib_filer�r5r��actual_forecast_hourrd�	grib_pathr$s155          r�fetch_global_wave_data�%GRIBWavePuller.fetch_global_wave_data�s���9	��K�K�e�f��I��I��.�.�}�=�F��*�V�T�2�2�!'��4B�N�1�-�a�0��	� �	��C��K�1�,�=C�:�	�&:�!%�����c�d� �6�6�}�E�	�!%�� �	��^����W�X���!%�!E�!E�n�!U��5�	�-1�,B�,B�9�,M�)���&3�!*�,4�O�O�,=�	�P]�@^�,^�+i�+i�+k�"/�1�"4�	3���/��R�W�W�^�^�I�6�6��	�	�)�$�156"�!�	 ��!�!���	��L�L�<�Q�C�@�A���	�s%�CF�157B/F�:	F�158F0�F+�+F0)rrgrf��0c�^�0nUHqn[RSUS35 URU5nU(a#XBSUS3'[RSUS35 MX[RSUS35 Ms U$![a&n[RSUS	U35 S159nAM�S160nAff=f)z"Fetch multiple forecast time stepszFetching forecast for +z	 hours...rhrizSuccessfully fetched +z161h forecastzFailed to fetch +zError fetching +zh forecast: N)r r!r�r#r"rD)r�forecast_hours�	forecastsrtrr$s      r�fetch_multiple_forecasts�'GRIBWavePuller.fetch_multiple_forecasts�s����	�"�D�162
����5�d�V�9�E�F��2�2�4�8���04��$�s��n�-��K�K�"8���j� I�J��N�N�%6�t�f�J�#G�H�#����	�
����/��v�\�!��E�F���
�s�AA<�A<�<163B,�B'�'B,c��[RSUS35 /n[SSS5GHyn[SSS5GHcn[RRS	S1645n[
U5S:�a#U[RRS	S5-
n[RRS
S5nUS-n[R"U5nU[R"U5-n	U*[R"U5-n165UR[U5[U5[[U5S5[[U5S5[[RRSS5S5[[U	5S5[[U1665S5S.5 GMf GM| [R"5R5SSSSSSSSS/S.[!S U55[#S!U55[R$"UVs/sHo�S"PM	 sn5[R&"UVs/sHo�S"PM	 sn5S#.US$[R"5[)US%9-R5US
:HS&.US'.$s snfs snf)(z*Generate mock global wave data for testingz&Generating mock global wave data for +z
h forecast...i�����=�r���g�?g@�(g�?rihr�r`r^g@g(@r�)rCrDr r!r"r�r��MOCK_GLOBAL_DATAgN�gN@r�r�g4@g>@��
r$c3�*# �UH	oSv� M g7f�r N��r��ps  rr��<GRIBWavePuller._generate_mock_global_data.<locals>.<genexpr>9����&O��A��'7����c3�*# �UH	oSv� M g7fr�r�r�s  rr�r�:r�r�r r,�MOCKr�r�)r2r3r5r6r�r)r r!rsr�r��uniform�absr�r�r�rzrH�roundrrrrGrJrIrurvr)rr}rrCrD�base_height�wave_dirr�r��u_comp�v_compr�s            r�_generate_mock_global_data�)GRIBWavePuller._generate_mock_global_datas-�����<�]�O�=�Y�Z��
���b�"�%�C��T�3��+�� �i�i�/�/��S�9���s�8�b�=��2�9�9�#4�#4�S�#�#>�>�K��9�9�,�,�Q��4��(�#�-�	��*�*�X�.��"�R�V�V�G�_�4��#��b�f�f�W�o�5���$�$� ��:� ��:�#(��{�);�Q�#?�&+�E�(�O�Q�&?�#(����):�):�3��)E�q�#I�#(��v���#:�#(��v���#:�&��,�&�6"���*�4�4�6�-� ��!� �"&�"&� �"�g��$'�&O��&O�#O�#&�&O��&O�#O�$&�G�G�}�,U�}�!�}�-=�}�,U�$V�#%�6�6�]�*S�]��]�+;�]�*S�#T�	 �"/�#�(0���(9�I�M�<Z�(Z�'e�'e�'g�+�q�0�	�+�1167�	168��-V��*Ss�J�3J)rr)rr�)NNr)r)�__name__�169__module__�__qualname__�__firstlineno__rrr6rMr[r�r�r�r�r�rer�rMr�r�r�r��__static_attributes__r�rrr	r	so��*�P��#�J�@V$�p�#�Jd�LK�ZE�Nj�XN�`k�;�z7I��&9170rr	) r�sysr?�loggingr.�shutilrr�numpyr��xarrayr��ecmwf.opendatarrurFrz�dirname�abspath�__file__�arctic_grib_extractorrr@�ImportErrorr$r r#�basicConfig�INFO�	getLoggerr�r	r�rr�<module>r�s���	�171����
�(���!������������������ 9�:�;�'�9�!%��172���'�,�,�'�	�	�	�8�	$��j173�j174���'�175�N�N�:�1�#�>�?�!&���'�s�C�C&�C!�!C&