import xarray as xr
import numpy as np
print('Opening_files')
Path = 'Your/path'
dsxr_FRC_URB2D = xr.open_dataset(Path + 'MF_2018_FRC_URB2D_0.2k.nc')
dsxr_URB_PARAM = xr.open_dataset(Path + 'MF_2018_URB_PARAM_0.2k.nc')
dsxr_URB_PARAM_prop1 = xr.open_dataset(Path + 'MF_2018_URB_PARAM_prop1_0.2k.nc')
# Open geo_em.d03.nc with NetCDF4 engine for modification
dsxr = xr.open_dataset('geo_em.d03.nc', engine="netcdf4", mode="r+")
# Transplant FRC_URB2D
print('Transplanting FRC_URB2D...')
if 'FRC_URB2D' in dsxr.variables:
dsxr['FRC_URB2D'].values = dsxr_FRC_URB2D['FRC_URB2D'].values
else:
print("Variable 'FRC_URB2D' does not exist in geo_em.d03.nc. Creating it now...")
dsxr['FRC_URB2D'] = (dsxr_FRC_URB2D['FRC_URB2D'].dims, dsxr_FRC_URB2D['FRC_URB2D'].values)
dsxr['FRC_URB2D'].attrs.update({
'FieldType': np.int32(104),
'MemoryOrder': 'XY ',
'units': 'fraction',
'description': 'Urban Fraction',
'stagger': 'M',
'sr_x': np.int32(1),
'sr_y': np.int32(1)
})
dsxr.attrs['FLAG_FRC_URB2D'] = np.int32(1)
# Transplant URB_PARAM
print('Transplanting URB_PARAM...')
if 'URB_PARAM' in dsxr.variables:
dsxr['URB_PARAM'].values = dsxr_URB_PARAM['URB_PARAM'].values
else:
print("Variable 'URB_PARAM' does not exist in geo_em.d03.nc. Creating it now...")
dsxr['URB_PARAM'] = (dsxr_URB_PARAM['URB_PARAM'].dims, dsxr_URB_PARAM['URB_PARAM'].values)
# Modify specific elements
dsxr['URB_PARAM'][0, 21] = dsxr_URB_PARAM_prop1['URB_PARAM_prop1'][0, 20]
dsxr['URB_PARAM'][0, 20] = dsxr['URB_PARAM'][0, 20] * 0
dsxr['URB_PARAM'].attrs.update({
'FieldType': np.int32(104),
'MemoryOrder': 'XYZ',
'units': 'dimensionless',
'description': 'Urban_Parameters',
'stagger': 'M',
'sr_x': np.int32(1),
'sr_y': np.int32(1)
})
dsxr.attrs['FLAG_URB_PARAM'] = np.int32(1)
# Ensure changes are saved in-place
print('Saving changes...')
dsxr.to_netcdf('geo_em.d03.nc', mode="r+", engine="netcdf4")
print('File saved successfully.')
# Close datasets
dsxr.close()
dsxr_FRC_URB2D.close()
dsxr_URB_PARAM.close()
dsxr_URB_PARAM_prop1.close()