[4773] | 1 | """ |
---|
| 2 | Filename: io.py |
---|
| 3 | Author: Shannon Mason, shannon.mason@ecmwf.int |
---|
| 4 | Description: I/O functions for loading IFS data |
---|
| 5 | """ |
---|
| 6 | |
---|
| 7 | #For loading and handling netCDF data |
---|
| 8 | import xarray as xr |
---|
| 9 | |
---|
| 10 | def load_inputs(input_srcfile): |
---|
| 11 | """ |
---|
| 12 | Load ecRAD input files. |
---|
| 13 | """ |
---|
| 14 | |
---|
| 15 | with xr.open_dataset(input_srcfile) as input_dset: |
---|
| 16 | if 'lat' in input_dset: |
---|
| 17 | input_dset = input_dset.rename({'lat':'latitude', 'lon':'longitude'}) |
---|
| 18 | |
---|
| 19 | input_dset['pressure_fl'] = xr.DataArray( |
---|
| 20 | input_dset.pressure_hl[:,:-1] + 0.5*input_dset.pressure_hl.diff('half_level'), |
---|
| 21 | coords={'column':input_dset.column, 'level':input_dset.level}, |
---|
| 22 | dims=['column', 'level'] |
---|
| 23 | ) |
---|
| 24 | |
---|
| 25 | #input_dset['p'] = input_dset.pressure_fl.median('column') |
---|
| 26 | #input_dset['phl'] = input_dset.pressure_hl.median('column') |
---|
| 27 | |
---|
| 28 | if 'aerosol_mmr' in input_dset.data_vars: |
---|
| 29 | input_dset['sea_salt'] = input_dset.aerosol_mmr.sel( |
---|
| 30 | aerosol_type=slice(0,2)).sum('aerosol_type') |
---|
| 31 | input_dset['dust'] = input_dset.aerosol_mmr.sel( |
---|
| 32 | aerosol_type=slice(3,5)).sum('aerosol_type') |
---|
| 33 | input_dset['organics'] = input_dset.aerosol_mmr.sel( |
---|
| 34 | aerosol_type=slice(6,7)).sum('aerosol_type') |
---|
| 35 | input_dset['black_carbon'] = input_dset.aerosol_mmr.sel( |
---|
| 36 | aerosol_type=slice(8,9)).sum('aerosol_type') |
---|
| 37 | input_dset['sulphate'] = input_dset.aerosol_mmr.sel(aerosol_type=10) |
---|
| 38 | |
---|
| 39 | input_dset = input_dset.set_coords(['latitude', 'longitude']) #, 'p', 'phl']) |
---|
| 40 | |
---|
| 41 | return input_dset.swap_dims({'column':'latitude'})# 'half_level':'phl', 'level':'p'}) |
---|
| 42 | |
---|
| 43 | |
---|
| 44 | def load_ecRAD(output_srcfile, input_srcfile): |
---|
| 45 | """ |
---|
| 46 | Load an ecRAD output file and merge with inputs. |
---|
| 47 | Calculate net fluxes and heating rates, including necessary pressures at full levels and half |
---|
| 48 | levels. |
---|
| 49 | """ |
---|
| 50 | |
---|
| 51 | with xr.open_dataset(output_srcfile) as rad_output, xr.open_dataset(input_srcfile) as ifs_input: |
---|
| 52 | |
---|
| 53 | if 'lat' in ifs_input: |
---|
| 54 | ifs_input = ifs_input.rename({'lat':'latitude', 'lon':'longitude'}) |
---|
| 55 | |
---|
| 56 | input_dset = rad_output.merge(ifs_input) #, compat='override') |
---|
| 57 | |
---|
| 58 | input_dset['pressure_fl'] = xr.DataArray( |
---|
| 59 | input_dset.pressure_hl[:,:-1] + 0.5*input_dset.pressure_hl.diff('half_level'), |
---|
| 60 | coords={'column':input_dset.column, 'level':input_dset.level}, |
---|
| 61 | dims=['column', 'level'] |
---|
| 62 | ) |
---|
| 63 | |
---|
| 64 | #input_dset['p'] = input_dset.pressure_fl.median('column') |
---|
| 65 | #input_dset['phl'] = input_dset.pressure_hl.median('column') |
---|
| 66 | |
---|
| 67 | input_dset = input_dset.set_coords(['latitude', 'longitude']) #, 'p', 'phl']) |
---|
| 68 | |
---|
| 69 | input_dset['cloud_radiative_effect_lw'] = ( |
---|
| 70 | (input_dset.flux_dn_lw - input_dset.flux_dn_lw_clear) -\ |
---|
| 71 | (input_dset.flux_up_lw - input_dset.flux_up_lw_clear) |
---|
| 72 | ) |
---|
| 73 | input_dset['cloud_radiative_effect_sw'] = ( |
---|
| 74 | (input_dset.flux_dn_sw - input_dset.flux_dn_sw_clear) -\ |
---|
| 75 | (input_dset.flux_up_sw - input_dset.flux_up_sw_clear) |
---|
| 76 | ) |
---|
| 77 | input_dset['flux_net_lw'] = input_dset.flux_dn_lw - input_dset.flux_up_lw |
---|
| 78 | input_dset['flux_net_sw'] = input_dset.flux_dn_sw - input_dset.flux_up_sw |
---|
| 79 | |
---|
| 80 | input_dset['flux_net_lw_clear'] = input_dset.flux_dn_lw_clear - input_dset.flux_up_lw_clear |
---|
| 81 | input_dset['flux_net_sw_clear'] = input_dset.flux_dn_sw_clear - input_dset.flux_up_sw_clear |
---|
| 82 | |
---|
| 83 | c_factor = 24*3600*(9.81/1004.) |
---|
| 84 | input_dset['heating_rate_lw'] = (-1*c_factor*input_dset.flux_net_lw.diff('half_level')\ |
---|
| 85 | /input_dset.pressure_hl.diff('half_level')).rename({'half_level':'level'}) |
---|
| 86 | input_dset['heating_rate_sw'] = (-1*c_factor*input_dset.flux_net_sw.diff('half_level')\ |
---|
| 87 | /input_dset.pressure_hl.diff('half_level')).rename({'half_level':'level'}) |
---|
| 88 | |
---|
| 89 | input_dset['heating_rate_lw_clear'] = \ |
---|
| 90 | (-1*c_factor*input_dset.flux_net_lw_clear.diff('half_level')\ |
---|
| 91 | /input_dset.pressure_hl.diff('half_level')).rename({'half_level':'level'}) |
---|
| 92 | input_dset['heating_rate_sw_clear'] = \ |
---|
| 93 | (-1*c_factor*input_dset.flux_net_sw_clear.diff('half_level')\ |
---|
| 94 | /input_dset.pressure_hl.diff('half_level')).rename({'half_level':'level'}) |
---|
| 95 | |
---|
| 96 | return input_dset.swap_dims({'column':'latitude'}) # 'half_level':'phl', 'level':'p'}) |
---|