Идентификатор скважины и другие комментарии в данных периода стресса - PullRequest
0 голосов
/ 11 ноября 2018

Я хотел бы назначить закомментированный номер идентификатора скважины для моего файла лунок (также сделайте то же самое для ячеек GHB), но я не могу ничего найти о том, как это сделать.

Я написал что-то, чтобы создать свой собственный файл ghb, но если я попытаюсь загрузить его обратно в класс flopy mf, а затем записать его в другие мои пакеты с помощью mf.write_input (), комментарии не останутся, и они будут перезаписаны.

Я знаю, что в mf.wrtie_input () я могу указать, какие пакеты выписать, и если я заберу файл ghb, который я создал ранее (или файл well), то исходный файл не будет записан поверх, что хорошо.

Но я хотел бы знать, есть ли способ добавить комментарии к стрессу_периоду_дате для каждого пакета, чтобы я мог хранить все это в классе flopy.

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Единственный способ передать замечания из существующего пакета, который я знаю, - это открыть файл в режиме чтения, создать pandas DataFrame с данными столбца и создать из него новый пакет. Вот пример:

import os
import pandas as pd
import flopy.modflow as fpm
from collections import OrderedDict


pak_nam = 'drn'
mf_version = 'mfnwt'

# the model from which the DRN package will be copied
inmod = fpm.Modflow.load('10kTDS.nam',
                     model_ws=r'..\10kTDS',
                     version=mf_version, 
                     load_only=['drn'], 
                     check=False)

# the model where the new DRN package will be attached
mf = fpm.Modflow.load('ss2010.nam',
                      model_ws=os.path.join('..', 'ss2010'),
                      version=mf_version,
                      load_only=['dis', 'bas6'],
                      check=False)

# read the contents of the DRN package
with open(inmod.drn.fn_path, 'r') as f:
    lines = f.readlines()

# create pandas DataFrame
data = []
for line in lines[3:]:
    pieces = line.strip().split('#')
    t = pieces[0].strip().split()
    remark = pieces[-1]
    if t[0] == '-1':
        break
    else:
        data.append([int(t[0]),
                     int(t[1]),
                     int(t[2]),
                     float(t[3]),
                     float(t[4]),
                     '# ' + remark.strip()])
pak_df = pd.DataFrame(data,
                      columns=['k', 'i', 'j', 'alt_va', 'cond', 'remark'])
pak_df.loc[:, ['k', 'i', 'j']] -= 1

# specify data format
formats = OrderedDict([('k', '{:>10d}'.format),
                       ('i', '{:>10d}'.format),
                       ('j', '{:>10d}'.format),
                       ('alt_va', '{:>.2F}'.format),
                       ('cond', '{:>15.6E}'.format),
                       ('remark', '{>:50}'.format)])

# create new stress period data: for numpy record array use DataFrame.to_records()
pak_spd = {0: pak_df[list(formats.keys())].to_records(index=False)}

# attach DRN package to new model
pak = fpm.ModflowDrn(mf,
                     stress_period_data=pak_spd,
                     ipakcb=53,
                     options=['NOPRINT'],
                     filenames=os.path.join('..', 'ss2010', 'ss2010.{}'.format(pak_nam)),
                     dtype=pak_spd[0].dtype)

pak.write_file(check=False)
0 голосов
/ 11 ноября 2018

Как и в в этом примере, вы можете расширить значение по умолчанию dtype, включив в него дополнительные атрибуты, которые экземпляр MfList будет переносить в запись:

well_dtype = [('k', '<i8'), ('i', '<i8'), ('j', '<i8'),('flux', '<f4'), ('wel_id', object)]
stress_period_data = np.zeros((3), dtype=well_dtype)
wel = flopy.modflow.ModflowWel(m, stress_period_data=stress_period_data, dtype=well_dtype)

Я не уверен, что можно легко загрузить существующий пакет wel с дополнительными атрибутами - просто FYI

...