CoolFace
Apppublic

nakas/NWPS_SWAN

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

2�o�h<+��b�SrSSKrSSKrSSKrSSKrSSKJ	r	 "SS5r3SrSrSr
\S	:Xa~\"S45 \"S5 \"5 \"5 \
"5 \"S5 \"S
5 \"S5 \"S5 \"S5 \"S5 \"S5 \"S5 \"S5 \"S5 \"S5 gg)z�5Arctic Region Patch for grib_wave_puller6Automatically handles ECCODES polar stereographic errors in Arctic wave data processing7�N)�ArcticGRIBExtractorc�(�\rSrSrSrSrSSjrSrg)�ArcticWavePatch�
zR8Patch class to handle Arctic wave GRIB files that fail with ECCODES polar errors9c�"�[5Ulg)N)r�	extractor)�selfs �L/Users/nakas/Documents/ecmwf_open_data/NWPS_SWAN/wave_puller_arctic_patch.py�__init__�ArcticWavePatch.__init__s��,�.���c�b�[SU35 URRU5up4UbUR(aSSSSS.$[S[	U5SU35 [	U5U:�aE[10R"S[	U5S	-11U[S129nURUR5nOUR5n[S[	U5S35 S
SU3U[	U5U[	U5S.$![a(n[SU35 S[U5SSS.sSnA$SnAff=f)a<13Process Arctic wave GRIB file that fails with standard cfgrib/xarray14 15Args:16    grib_file (str): Path to Arctic GRIB file (e.g., /tmp/tmpiob18m5y.grib2)17    sample_points (int): Number of sample points to extract18    19Returns:20    dict: Result with status and data, matching the format expected by grib_wave_puller21u?🌊 Processing Arctic wave file with polar projection bypass: N�failedz.Failed to extract Arctic data with all methodsr)�status�message�data�sampled_pointsu"✅ Arctic extraction successful: z points using �)�dtypeu!🎯 Arctic processing complete: z sample points extracted�successzArctic data extracted using )rrrr�extraction_method�total_grid_pointsu#❌ Arctic wave processing failed: )�printr�extract_all_methods�empty�len�np�linspace�int�iloc�copy�	Exception�str)r	�	grib_file�
sample_pointsr�method�indices�sampled_data�es        r22�process_arctic_wave_file�(ArcticWavePatch.process_arctic_wave_files=��	�O�PY�{�[�\�)	��>�>�=�=�i�H�L�D��|�t�z�z�&�O� �&'�	��
�6�s�4�y�k��PV�x�X�Y��4�y�=�(��+�+�a��T��1��m�3�O��#�y�y��1�6�6�8��#�y�y�{���5�c�,�6G�5H�H`�a�b�$�9�&��B�$�"%�l�"3�%+�%(��Y�
�
���	��7��s�;�<�"��q�6��"#�	�
��	�s$�7C<�B3C<�<23D.�D)�#D.�)D.)rN)�d)�__name__�24__module__�__qualname__�__firstlineno__�__doc__rr*�__static_attributes__�r
r25rr
s���/�6r
rc�`�Sn[S5 [S5 [U5 [S5 g)zH26Provides example code to patch your grib_wave_puller Arctic processing27uw28# Add this to your grib_wave_puller.py file:29 30from wave_puller_arctic_patch import ArcticWavePatch31 32class GRIBWavePuller:33    def __init__(self):34        # Your existing initialization35        self.arctic_patch = ArcticWavePatch()  # Add this line36        37    def process_arctic_region_enhanced(self, grib_file):38        """Enhanced Arctic processing with polar stereographic error handling"""39        40        try:41            # Your existing Arctic processing code42            print(f"Processing Arctic region: {grib_file}")43            print(f"Processing GRIB file: {grib_file}")44            45            # Try standard xarray/cfgrib processing first46            ds = xr.open_dataset(grib_file, engine='cfgrib')47            48            # Your existing variable extraction logic49            available_vars = list(ds.data_vars.keys()) + list(ds.coords.keys())50            print(f"Available variables: {available_vars}")51            52            # ... rest of your existing Arctic processing ...53            54        except Exception as e:55            error_msg = str(e)56            57            # Check if it's the specific polar stereographic error58            if any(keyword in error_msg.lower() for keyword in 59                   ['polar stereographic', 'spherical earth', 'geoiterator', 60                    'geographic attributes', 'unable to create iterator']):61                62                print(f"ECCODES polar stereographic error detected: {error_msg}")63                print("Switching to Arctic bypass extraction...")64                65                try:66                    # Use our Arctic patch instead67                    arctic_data = self.arctic_patch.process_arctic_wave_file(grib_file, sample_points=100)68                    69                    if arctic_data['sampled_points'] > 0:70                        print(f"✅ Arctic bypass successful: {arctic_data['sampled_points']} points")71                        return arctic_data72                    else:73                        print("❌ Arctic bypass also failed")74                        raise RuntimeError("Arctic bypass extraction failed")75                        76                except Exception as bypass_error:77                    print(f"❌ Arctic bypass failed: {bypass_error}")78                    # Re-raise original error or return empty result79                    raise RuntimeError(f"Both standard and bypass Arctic processing failed: {error_msg}")80            else:81                # Different error, re-raise82                raise83                84    def process_regional_files(self, regional_files):85        """Modified regional processing with Arctic patch"""86        87        results = []88        89        for region, grib_file in regional_files.items():90            try:91                if region == 'Arctic':92                    # Use enhanced Arctic processing93                    region_data = self.process_arctic_region_enhanced(grib_file)94                else:95                    # Use your existing processing for other regions96                    region_data = self.process_region(region, grib_file)97                98                if region_data and region_data.get('sampled_points', 0) > 0:99                    results.append(region_data)100                    print(f"Successfully processed {region}: {region_data.get('sampled_points', 0)} points")101                else:102                    print(f"Warning: No data extracted from {region}")103                    104            except Exception as e:105                print(f"ERROR: Failed to process {region}: {e}")106                print(f"WARNING: Failed to process {region} region")107                continue108        109        return results110u"🔧 Arctic Processing Patch Code:z<============================================================N�r)�111patch_codes r112�(patch_grib_wave_puller_arctic_processingr7Ms,��113S�J�j114�115.�/�	�(�O�	�*��	�(�Or
c�J�Sn[S5 [S5 [U5 g)z=116Create a drop-in replacement function for Arctic processing117a�118# Direct replacement for your Arctic processing function:119 120def process_arctic_region_fixed(grib_file):121    """Drop-in replacement for Arctic region processing"""122    123    from wave_puller_arctic_patch import ArcticWavePatch124    125    print(f"Processing Arctic region: {grib_file}")126    print(f"Processing GRIB file: {grib_file}")127    128    try:129        # Try your existing processing first130        ds = xr.open_dataset(grib_file, engine='cfgrib')131        132        # If we get here, standard processing worked133        available_vars = list(ds.data_vars.keys()) + list(ds.coords.keys())134        print(f"Available variables: {available_vars}")135        136        # Continue with your existing processing...137        # ... your existing Arctic processing code ...138        139    except Exception as e:140        if any(keyword in str(e).lower() for keyword in 141               ['polar stereographic', 'spherical earth', 'geoiterator']):142            143            print("ECCODES polar error detected - using Arctic bypass")144            145            # Use Arctic patch146            arctic_patch = ArcticWavePatch()147            result = arctic_patch.process_arctic_wave_file(grib_file, sample_points=100)148            149            print(f"Arctic bypass result: {result['sampled_points']} points")150            return result151        else:152            raise  # Re-raise if it's a different error153 154# Usage: Replace your existing Arctic processing call with:155# arctic_result = process_arctic_region_fixed("/tmp/tmpiob18m5y.grib2")156u🎯 Drop-in Replacement Code:z2==================================================Nr5)�replacement_codes r157�create_drop_in_replacementr:�s&��158'��R159�160*�+�	�(�O�	�161�r
c�L�Sn[SU35 [RRU5(GaK[	5nURUSS9n[S5 [SUR
SS535 [S	UR
S162S535 [SUR
S
S535 [SUR
SS535 UR
S163S5S:�a�[S5 SU;a9US(a/[US5SS[US5S3n[SU35 SU;a;US(a0[US5SS[US5S3n[SU35 ggg[S5 g[SU35 [S5 [S5 g)z/164Test the patch with your specific Arctic file165z/tmp/tmpiob18m5y.grib2u*🧪 Testing Arctic patch with your file: r,)r%u🎉 Test Results:z166  Region: �region�Unknownz  Sample points: rrz  Total grid points: rz167  Method: ru%✅ Arctic processing would now work!�	latitudesz.2fz to z  Latitude range: �168longitudesz  Longitude range: u#❌ Test failed - no data extractedu📁 Test file not found: z/   This is normal if temp files were cleaned upz9   The patch will work when you encounter the error againN)	r�os�path�existsrr*�get�min�max)�arctic_file�patch�result�	lat_range�	lon_ranges     r169�test_with_your_filerK�s���+�K�	�6�{�m�170D�E�	�w�w�~�~�k�"�"��!���/�/��3�/�O��
�"�#�
�171�6�:�:�h�	�:�;�<�=�
�!�&�*�*�-=�q�"A�!B�C�D�
�%�f�j�j�1D�a�&H�%I�J�K�
�172�6�:�:�&9�9�E�F�G�H��:�:�&��*�Q�.��9�:��f�$���)<�"�6�+�#6�7��<�D��V�K�EX�AY�Z]�@^�_�	��*�9�+�6�7��v�%�&��*>�"�6�,�#7�8��=�T�#�f�\�FZ�B[�\_�A`�a�	��+�I�;�7�8�+?�%�
�7�8�
�*�;�-�8�9�
�?�@�
�I�Jr
�__main__u!🌊 Arctic Wave Processing Patchz(========================================u173🎯 SOLUTION SUMMARY:z==============================u4✅ This patch will fix your Arctic processing erroru<✅ Automatically detects ECCODES polar stereographic errorsu0✅ Falls back to alternative extraction methodsu0✅ Returns data in same format as other regionsu<✅ Your wave puller will process all 4 regions successfullyu174🔧 Next steps:z11. Add the patch code to your grib_wave_puller.pyz*2. Replace your Arctic processing functionz/3. Run your wave puller - Arctic will now work!)r1r@�xarray�xr�numpyr�pandas�pd�arctic_grib_extractorrrr7r:rKr-rr3r
r175�<module>rSs����176177����5�>�>�@]�~0�d!K�F�z��	�178-�.�	�(�O�-�.�� ���	�179$�%�	�(�O�	�180@�A�	�181H�I�	�182<�=�	�183<�=�	�184H�I�	�185��	�186=�>�	�1876�7�	�188;�<�/r