изменение вертикальных координат данных модели в пространстве — запись файла NetCDF (xarray)

#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 , а не в a Dataset ?

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 для получения набора данных.