#python #netcdf #python-xarray #dimension
#python #netcdf #python-xarray #измерение
Вопрос:
Рассмотрите возможность использования численной модели потока для моделирования простого случая одномерной адвекции-диффузии в гидротехнике, например: эволюция концентрации соли (Cs). Домен не имеет измерения y, а только измерения X и Z, что означает, что поток не усредняется по глубине, и для 1 временного шага у меня есть концентрация соли:
Cs = Cs (x, z)
где x: пространственная координата (вектор с равным расстоянием), а z: вертикальная координата (вектор с неравным расстоянием). или больше в целом, включая время, :
Cs = Cs (x, z, t)
Теперь x постоянен во времени и пространстве (это означает, что x-сетка не «перемещается» немного вперед и назад), но z (т. Е. Вертикальная координата каждого «Слоя») действительно адаптируется и колеблется вверх и вниз.
Для каждого временного шага модель выдает фактическое числовое значение концентрации соли И вертикальную координату для каждого слоя (т.Е. На каждой заданной глубине жидкости). В Python я мог бы легко «объединить» контур солености по x и z, расположив каждый z поверх его предыдущего уровня.
Таким образом, матрица cords в Python имеет количество строк, равное количеству вертикальных слоев, и количество строк, равное количеству x точек сетки. При этом матрицы координат и солености согласованы и могут быть нанесены на график (контуры).
Теперь мой вопрос: в Python я хочу использовать x-array для генерации / вывода файла netcdf для чтения его с помощью Paraview. Я мог бы начать и создать файл NetCDF, содержащий (на данный момент) только 1 временной шаг, вставить его в Paraview и отобразить его.
Однако моя проблема в том, что z = z (x), что означает, что высота каждого уровня изменяется по общей координате. До сих пор я мог применять только равномерно распределенный вертикальный вектор для описания вертикальной координаты, и этот вектор не зависит от x, поэтому он не изменяется по горизонтальной координате.
Как я могу достичь своей цели?
nx = np.shape(Xp)[1]
nz = Nvert 1
#X vector is linearly spaced, constant dx, and it is OK like that!
xmin = 0
xmax = 10
X = np.linspace(xmin, xmax, nx)
#Z is equally spaced too, by it should NOT be! might vary over vertical AND/or over X!!!
zmin = 0
zmax = 0.5
Z = np.linspace(zmin, zmax, nz)
# merge quantity "qname", at timestep 0, given Nvert vertical layers
q0 = merge_quant(Nvert, t[0], qname)
#create two matrix coordinates, xk and zk, being consistent is size with q0
xk, zk = merge_xnadz(Nvert, t[0])
#assign:
vals = q0
#preallocate data using xarray
ds = xr.Dataset(
{qname: (("z", "x"), vals)},
coords={
"x": X,
"z": Z #---this here should vary but is instead constant..?!?
}
)
#save to disk
ds.to_netcdf("Testout.nc")
Как я могу добавить еще одно измерение? Могу ли я просто добавить матрицу координат в xarray перед сохранением в NetCDF? Это действительно решило бы мою проблему.
Любая помощь приветствуется. Спасибо!
Марко
Редактировать: два изображения, одно для результатов модели; и одно, полученное в PARAVIEW
Комментарии:
1. Длинный текст, но хороший вопрос. Возможным решением может быть то, что вы сначала определяете массив данных из своих выходных данных для каждого временного шага, а затем объединяете их в один набор данных.
2. @dl.meteo: спасибо за ответ. Да! Это то, что я имею в виду. Но перед объединением всех временных шагов мне нужно убедиться, что общий метод работает (с учетом временных шагов), а сейчас это НЕ так. Проблема, с которой я сталкиваюсь, находится В ПРЕДЕЛАХ первого временного шага.
3. Но пытались ли вы сохранить свои данные в a
DataArray
, а не в aDataset
?4. @dl.meteo: ds = xr.Dataset( {qname: ((«z», «y»,»x»), vals)}, координаты ={ «x»: Xp.squeeze(), «y»: Y, «z»: zk[:,0], } ) Можете ли вы быть более конкретным? Я очень новичок в xarray и был бы признателен за дополнительные подсказки…. Спасибо.
5. Хорошо: A
Dataset
— это наборDataArray
s xarray.pydata.org/en/stable/generated/xarray . DataArray.html . Записал ваши данные в список массивов данных -> [dataArray(), dataArray(), .], а затем использоватьxarray.concatenate
для получения набора данных.