diff --git a/modules/aeolus/aeolus_amv.py b/modules/aeolus/aeolus_amv.py index 75b7435f2cd96b118afcd71c918bce176e369867..23d4644a8f03a3e23709893a3881b2d558307481 100644 --- a/modules/aeolus/aeolus_amv.py +++ b/modules/aeolus/aeolus_amv.py @@ -1922,6 +1922,113 @@ def create_file(filename, aeolus_to_amv_dct, aeolus_dct, amv_files, cld_lyr=Fals rootgrp.close() +def create_file_new(match_dct, filename, amv_params): + grd_x_len = 9 + grd_y_len = 9 + num_aparams = 7 + num_aprofs = len(match_dct) + max_num_alevels = 0 + + alons = [] + alats = [] + atimes = [] + elems = [] + lines = [] + + # scan to get max num levels + keys = list(match_dct.keys()) + for key in keys: + tup = match_dct.get(key) + prof = tup[4] + lat = prof[0, 0] + lon = prof[0, 1] + alons.append(lon) + alats.append(lat) + atimes.append(tup[0]) + elems.append(tup[1]) + lines.append(tup[2]) + + nlevs = prof.shape[0] + if nlevs > max_num_alevels: + max_num_alevels = nlevs + + alons = np.array(alons) + alats = np.array(alats) + atimes = np.array(atimes) + elems = np.array(elems) + lines = np.array(lines) + + # Sample file to retrieve and copy variable attributes + rg_exmpl = Dataset('/home/rink/data/clavrx/clavrx_OR_ABI-L1b-RadF-M6C01_G16_s20192930000343.level2.nc', 'r') + + # the top level group for the output file + rootgrp = Dataset(filename, 'w', format='NETCDF4') + + dim_amvs = rootgrp.createDimension('num_aeolus_params', size=num_aparams) + dim_alevs = rootgrp.createDimension('max_num_aeolus_levels', size=max_num_alevels) + dim_num_aeolus_prof = rootgrp.createDimension('num_aeolus_profs', size=num_aprofs) + dim_grd_x = rootgrp.createDimension('grd_x_len', size=grd_x_len) + dim_grd_y = rootgrp.createDimension('grd_y_len', size=grd_y_len) + + prf_time = rootgrp.createVariable('time', 'f4', ['num_aeolus_profs']) + + # ---- Profile variables --------------- + prf_lon = rootgrp.createVariable('prof_longitude', 'f4', ['num_aeolus_profs']) + prf_lon.units = 'degrees east' + prf_lat = rootgrp.createVariable('prof_latitude', 'f4', ['num_aeolus_profs']) + prf_lat.units = 'degrees north' + prf_time.units = 'seconds since 1970-01-1 00:00:00' + prf_elem = rootgrp.createVariable('FD_elem', 'f4', ['num_aeolus_profs']) + prf_line = rootgrp.createVariable('FD_line', 'f4', ['num_aeolus_profs']) + prf_azm = rootgrp.createVariable('prof_azm', 'f4', ['num_aeolus_profs', 'max_num_aeolus_levels']) + prf_azm.units = 'degree' + prf_spd = rootgrp.createVariable('prof_spd', 'f4', ['num_aeolus_profs', 'max_num_aeolus_levels']) + prf_spd.units = 'm s-1' + prf_hht = rootgrp.createVariable('prof_hht', 'f4', ['num_aeolus_profs', 'max_num_aeolus_levels']) + prf_hht.units = 'meter' + prf_hhb = rootgrp.createVariable('prof_hhb', 'f4', ['num_aeolus_profs', 'max_num_aeolus_levels']) + prf_hhb.units = 'meter' + + # ----- Product variables ---------------- + nc4_vars = [] + var_s = rg_exmpl.variables + for pidx, param in enumerate(amv_params): + v = var_s[param] + attr_s = v.ncattrs() + if '_FillValue' in attr_s: + var = rootgrp.createVariable(param, v.dtype, ['num_aeolus_profs', 'grd_y_len', 'grd_x_len'], fill_value=v.getncattr('_FillValue')) + else: + var = rootgrp.createVariable(param, v.dtype, ['num_aeolus_profs', 'grd_y_len', 'grd_x_len']) + # copy attributes from example to new output variable of the same name + for attr in attr_s: + if attr != '_FillValue': + var.setncattr(attr, v.getncattr(attr)) + nc4_vars.append(var) + + # Write data to file --------------------- + prf_lon[:] = alons + prf_lat[:] = alats + prf_elem[:] = elems + prf_line[:] = lines + prf_time[:] = atimes + + for idx, key in enumerate(keys): + tup = match_dct.get(key) + prof = tup[4] + param_nd = tup[5] + + nlevs = prof.shape[0] + for k in range(nlevs): + prf_spd[idx,k] = prof[k,6] + prf_azm[idx,k] = prof[k,5] + prf_hht[idx,k] = prof[k,3] + prf_hhb[idx,k] = prof[k,4] + + for pidx, param in enumerate(clvrx_params): + nc4_vars[pidx][idx, :, :] = param_nd[pidx, :, :] + + rg_exmpl.close() + rootgrp.close() # aeolus_files_dir: S4 NOAA txt output files # amv_files_dir: G16/17 AMV product files