Как сделать куб с горизонтальной сеткой из одного куба и вертикальной сеткой из другого
Мне нужно сгенерировать куб, который имеет горизонтальную сетку одного куба и вертикальную сетку другого (чтобы сделать куб для давления на уровнях влажности из температурного куба и куба ветра). В документации отсутствует контекст, и я не могу найти ничего полезного, прибегая к помощи. Я представляю себе что-то вроде копирования температурного куба, поиска с сигмой и дельтой в кубе, а затем запускаю factory.update для куба, но я не совсем понимаю синтаксис.
2 ответа
HybridHeightFactory присоединяется к кубу и выдает координату "высоты" по запросу.
Он должен быть связан с подходящей координатой высоты над уровнем моря, чтобы работать - это означает, что не так просто переместить его в куб с другой горизонтальной сеткой.
Так что я думаю, что factory.update - не лучший маршрут, проще просто создать + прикрепить новый.
План пойдет примерно так...
orog = hgrid_cube.coord('surface_altitude')
sigma = vgrid_cube.coord('sigma')
delta = vgrid_cube.coord('level_height')
factory = iris.aux_factory.HybridHeightFactory(delta=delta, sigma=sigma, orography=orog)
new_cube = ...
new_cube.add_aux_coord(orog, (2, 3)) # or whatever dimensions
new_cube.add_aux_coord(sigma, (0,)) # or whatever dimensions
new_cube.add_aux_coord(delta, (0,)) # or whatever dimensions
new_cube.add_aux_factory(factory)
Примечание: при создании "new_cube" из старых данных вам, возможно, придется удалить существующую фабрику aux.
def make_p_rho_cube(temp, u_wind):
'''
Given a temperature cube (on p level but theta levels)
and a u_wind cube (on rho levels but staggered)
create a cube for pressure on rho levels - on p points
but not non-staggered horizontal grid
'''
# make a pressure cube. Grid is a new one - horizontal grid
# is as temperature, but
# vertical grid is like u_wind. copy temperature cube then change
# name and units and vertical grid. NB need to set stash code as well
p_rho_cube = temp.copy()
p_rho_cube.rename('air_pressure')
p_rho_cube.units = 'Pa'
p_rho_cube.attributes['STASH'] = iris.fileformats.pp.STASH(1, 0, 407)
# now create and use a new hybrid height factory
# surface altitude on theta pts
surface_alt = temp.coord('surface_altitude')
# vertical grid from wind field
sigma = u_wind.coord('sigma')
delta = u_wind.coord('level_height')
# make a hybrid height factory with these variables
factory = iris.aux_factory.HybridHeightFactory(delta=delta, sigma=sigma,
orography=surface_alt)
# delete the old co-ordinates after saving their dimensions
surface_altitude_dim = p_rho_cube.coord_dims('surface_altitude')
p_rho_cube.remove_coord('surface_altitude')
sigma_dim = p_rho_cube.coord_dims('sigma')
p_rho_cube.remove_coord('sigma')
level_height_dim = p_rho_cube.coord_dims('level_height')
p_rho_cube.remove_coord('level_height')
p_rho_cube.remove_aux_factory(p_rho_cube.aux_factories[0])
# add the new ones
p_rho_cube.add_aux_coord(surface_alt, surface_altitude_dim)
p_rho_cube.add_aux_coord(sigma, sigma_dim)
p_rho_cube.add_aux_coord(delta, level_height_dim)
p_rho_cube.add_aux_factory(factory)
return p_rho_cube