Калькулятор графиков в tNavigator
Скачать 4.2 Mb.
|
Калькулятор графиков в tNavigatorТренинги 2021 Внимание! При прохождении данного курса следует помнить, что методики, описанные в рамках урока, носят рекомендательный характер и не являются единственно верными. Основной целью данного курса является рассмотрение всех основных функций, доступных в tNavigator. В реальных проектах применяемые методики могут отличаться от описанных в данном курсе. Все данные, используемые в курсе, не являются реальными. Калькулятор графиковПредназначен для создания дополнительных графиков Дополнительный инструмент анализа моделей Синтаксис и логика языка Python Специальные функции для работы с элементами моделей Импорт библиотек Доступен в: GUI симулятора AHM Дизайнер моделей Внимание! Для корректной работы калькулятора графиков необходимо использовать внешний интерпретатор Python версии 3.6.8 (64 бит) Окно калькулятораФункции Python: PrintВывод сообщений в консоль Удобно использовать для вывода отладочной и любой другой дополнительной информации в текстовом виде Можно формировать комбинации из нескольких строк Пример № 1 Пример № 2 Функции Python: If, ElseОператор if используется для выполнение кода только в том случае, если выполняется заданное условие В качестве условия может производиться сравнение величин (>, <, ==, !=), либо использоваться переменная типа Boolean (True или False) Оператор else – выполнение действий, если условие в if не выполнено Пример № 1 Пример № 2 Функции Python: ForОператор for позволяет выполнять один и тот же код несколько раз для разных значений переменной или разных объектов. Аргументы цикла for:
Массив, содержащий объекты или значения переменных Функции Python: Import Оператор import используется для импорта заранее созданных модулей (как стандартных, так и сторонних)В Калькулятор графиков включены готовые скрипты, которые можно загружать и менять произвольным образом Создание пустого графикаДля создания нового объекта типа график используется функция graph graph ( type = ‘graph_type’ , default_value = value ) graph_type – тип графика
well – график по скважинам group – график по группам conn – график по ячейкам перфорации fip – график по отчетным регионам value – значение по умолчанию Пример: objective = graph ( type = ‘field’, default_value = 0) TR1TOT = graph ( type = ‘well’, default_value = 0) Вывод графиковФункция export – вывод графика в GUI для последующей визуализации export ( mnem, name = ‘graph_name’ , units = “units” ) mnem – мнемоника графика, используемая в калькуляторе graph_name – полное имя графика (будет отображаться в GUI) units – единицы измерения для данного графика Пример: export (objective, name = 'Objective Function', units = "no") export (TR1TOT, name = 'Cumulative tracer production', units = "liquid_surface_rate") Импорт графиковГрафик, созданный в одном скрипте, можно импортировать в другой get_global_graph (name = ‘graph_name’) graph_name – полное имя, под которым график доступен в интерфейсе Пример: export (objective, name = 'of_tracer', units = 'no') get_global_graph (name = 'of_tracer') Объекты в калькулятореТипы объектов: Скважина Группа Перфорация Временной шаг График Отчетный регион Трассер Аквифер Численный аквифер Глобальные функции Глобальные функции графиков Каждый объект имеет определенный набор свойств СкважиныОбычные свойства .name – свойство, содержащее имя скважины. .group – свойство, содержащее группу, к которой принадлежит скважина. Свойства-массивы .connections – свойство, содержащие массив со всеми интервалами перфорации. .virtual_connections – свойство, содержащие массив со всеми виртуальными интервалами перфорации скважин. .get_connections_from_branch (branch_id = ) – возвращает массив со всеми интервалами перфорации определенного ствола скважины. Логические функции .is_producer () - True, если скважина добывающая .is_opened () - True, если скважина открыта .is_shut () - True, если скважина закрыта .is_stopped () - True, если скважина остановлена ГруппыОбычные свойства .name – свойство, содержащее название группы. .parent_group – свойство, содержащее родительскую группу данной. Свойства-массивы .wells – свойство, содержащее массив со всеми скважинами данной группы. Скважины дочерних групп, если таковые есть, не включаются. .all_wells – массив, рекурсивно включающий все скважины данной группы и ее дочерних групп. .child_groups – свойство, содержащее массив со всеми дочерними группами. ПерфорацияОбычные свойства .name – свойство, содержащее имя интервала перфорации (формируется автоматически). .i – свойство, содержащее координату сетки i данного интервала перфорации. .j – свойство, содержащее координату сетки j данного интервала перфорации. .k – свойство, содержащее координату сетки k данного интервала перфорации. .well – свойство, содержащее скважину, к которой относится интервал перфорации. .branch_id – свойство, содержащее номер ствола скважины, к которому относится интервал перфорации. .lgr_name – свойство, содержащее имя локального измельчения сетки, к которому относится интервал перфорации. Модели и Временной шагСвойства модели .name – свойство, содержащее название модели (актуально, когда загружены результаты расчёта нескольких моделей). Свойства и функции для временных шагов .name – свойство, содержащее представление даты шага в виде строки согласно шаблону. .to_datetime () – возвращает объект Python datetime со значением текущей даты. Для данного объекта доступны стандартные свойства и методы. Некоторые из них:
.month – возвращает месяц .day – возвращает день .hour – возвращает час .minute – возвращает минуту .second – возвращает секунду ГрафикИзвлечение и агрегация данных .fix (model = '', object = '', date = ‘’) – возвращает значение графика для заданной модели, объекта и даты. .min (models = '', objects = '', dates = ‘’) .max (models = '', objects = '', dates = ‘’) .avg (models = '', objects = '', dates = ‘’) .sum (models = '', objects = '', dates = ‘’) .aggregate_by_time_interval (interval = '', type = ‘’) – берется массив значений для заданного интервала (month, year) из исходного графика и создается новый график, в котором все шаги в рамках заданных интервалов имеют одинаковые значения (avg, min, max, last, sum, total) .to_list () – возвращает список значений графика. Выбор подмножества значений для заданной модели, объекта и даты и возвращает мин, макс, среднее или сумму для получившегося массива Отчетный регион, трассер, аквифер и численный аквиферОбычные свойства (Отчетный регион) .name – свойство, содержащее имя региона (состоит из названия семейства и номера региона в семействе). .family – свойство, содержащее название семейства, к которому принадлежит регион. .number – свойство, содержащее номер региона в семействе. Обычные свойства (Трассер) .name – свойство, содержащее название трассера. Обычные свойства (Аквифер) .name – свойство, содержащее название аквифера. Обычные свойства (Численный аквифер) .name – свойство, содержащее название численного аквифера. Глобальные функцииФункции get_well_by_name (‘’) – возвращает объект скважины по её имени. get_group_by_name (‘’) – возвращает объект группы по её имени. get_model_by_name (‘’) – возвращает объект модели по её имени. get_tracer_by_name (‘’) – возвращает объект трассера по его имени. get_aquifier_by_name (‘’) – возвращает объект аквифера по его имени. get_numerical_aquifier_by_name (‘’) – возвращает объект численного аквифера по его имени. get_all_wells () – возвращает массив, содержащий все скважины соответствующего типа. get_all_groups () – возвращает массив, содержащий все группы. get_all_connections (type = ‘’) – возвращает массив, содержащий все интервалы перфорации соответствующего типа во всех скважинах. get_all_models () – возвращает массив, содержащий все модели (актуально, когда загружены результаты расчёта нескольких моделей). get_all_timesteps () – возвращает массив, содержащий список всех временных шагов. get_all_tracers () – возвращает массив, содержащий список всех трассеров. get_all_aquifiers () – возвращает массив, содержащий список всех аквиферов. get_all_numerical_aquifiers () – возвращает массив, содержащий список всех численных аквиферов. Глобальные функцииФункции get_wells_by_mask (‘’) – возвращает массив, содержащий все скважины, подходящие под маску. get_wells_from_filter (‘’) – возвращает массив, содержащий все скважины, включённые в фильтр по скважинам. get_project_folder () – возвращает полный путь к директории, содержащей данную модель. get_project_name () – возвращает имя файла текущей модели (без расширения). get_all_fip_regions () – возвращает массив, содержащий все FIP-регионы всех семейств. get_fip_regions_from_family (<имя семейства отчет. рег.>) – возвращает массив, содержащий все FIP-регионы данного семейства. get_fip_region (<имя семейства отчет. рег.>, <номер отчет. рег.>) – возвращает объект FIP-региона по имени семейства и номеру. get_timestep_from_datetime ( get_well_by_criterion (method = ‘min/max’, crit = <>, group = <>, status = <>, recursive = get_group_by_criterion (method = ‘min/max’, crit = <>, group = <родительская группа>, recursive = get_connection_by_criterion (method = ‘min/max’, crit = <>, well = <>) – возвращает интервал перфорации, на котором достигает минимального или максимального значения выбранный график. Функции graph (тип = ‘’, значение по умолчанию = ) – возвращает график указанного типа. create_table_vs_time (<список<дата, значение>>) – возвращает график, содержащий кусочно-линейную интерполяцию данного ряда значений. Ряд должен представлять собой массив кортежей из двух элементов. shift_t (<график>, <значение сдвига>, <значение по умолчанию>) – возвращает первоначальный график, сдвинутый на указанное число шагов. Пропущенные позиции заполняются указанным значением по умолчанию. export (<график>, name = ‘’, units = ‘’) – экспортирует переданное выражение в пользовательский график, задавая также его имя и (опционально) единицы измерения. Выражение должно при вычислении давать результат типа график, иначе будет возвращена ошибка. get_global_graph (name = ‘’) – импортирует и возвращает пользовательский график с указанным именем, который мог быть создан, например, в другом скрипте. Логические функции if_then_else (<условие (график)>, <график если да>, <график если нет>) – условный оператор, который применяется к графикам поэлементно. Математические операции над графиками diff (<график>) – численное дифференцирование временного ряда, т.е. его преобразование в ряд разностей (newt = grapht - grapht-1). diff_t (<график>) – численное дифференцирование временного ряда, т.е. его преобразование в ряд разностей, с последующим делением результатов на длины временных шагов в днях (newt = ( grapht - grapht-1 ) / ( Tt - Tt-1 )). cum_sum (<график>) – численное интегрирование временного ряда, т.е. его преобразование в ряд сумм (newt = newt-1 + grapht). cum_sum_t (<график>) – численное интегрирование временного ряда, т.е. его преобразование в ряд сумм, с умножением добавляемых величин на длины временных шагов в днях (newt = newt-1 + grapht * ( Tt - Tt-1 )). exp (<график>), ln (<график>), sqrt (<график>), abs (<график>) – математические функции (экспонента, логарифм, квадратный корень и модуль, соответственно). При передаче графика в качестве аргумента применяются к нему поэлементно. Вектора – многомерные массивы Массивы индексируются объектами в зависимости от типа вектора:
Группа – модель, временной шаг, группа Перфорации – модель, временной шаг, ячейка перфорации Отчетный регион – модель, временной шаг, отчетный регион Месторождение – модель, временной шаг Пример: wopr[m,w,t] – значение дебита нефти по скважине w в модели m в момент времени t. Внимание: Порядок задания объектов не важен. wopr[m,w,t] аналогично wopr[w,m,t] Если не задать один из объектов, то получается соответствующее подмножество: wopr[m,w] возвращает график дебита нефти по скважине w в модели m по всем временным шагам. В данном случае w, m, t являются объектами, а не их именами 24
m=get_model_by_name ('FC_v2.DATA') w=get_well_by_name ('P104') t = get_timestep_from_datetime (datetime(2023,1,1)) wopt[m,w,t] 5411.30 m=get_model_by_name ('FC_v1') w=get_well_by_name ('P101') wopt[m, w]
w=get_well_by_name ('P103') wopt[w]
Оптимизация по ЧПС25 ЧПС – чистая приведенная стоимость, показатель, оценивающий рентабельность инвестиционных проектов В интерфейсе Автоадаптации имеется скрипт для расчёта ЧПС Сначала требуется задать экономические параметры ЧПС можно использовать как целевую функцию в Оптимизации 1 2 3 СодержаниеПримеры использования Пример № 1. Список скважин по условию. Пример № 2. Поиск некорректных WPIMULT. Пример № 3. Адаптация характеристики вытеснения. Пример № 4. Настройка модели на трассерные исследования. Пример 1 Нужен список скважин, находящихся в работе на заданный временной шаг. Открываем модель Example1, проводим расчёт, затем запускаем скрипт (Шаблоны графиков Калькулятор графиков импортируем скрипт ex1.py из файла со входными данными): 1 2 3 4 Пример 2Модель медленно считается. Есть подозрения, что проблемы со скоростью счета происходят из-за слишком высоких значений продуктивности скважин. В SCHEDULE последовательно заданы ключевые слова WPIMULT. Множители проводимости задаются последовательно, что потенциально приводит к слишком высоким (нефизичным) значениям множителя проводимости. Требуется определить скважины, у которых ячейки перфорации имеют очень высокие значения проводимости Пример 2Откройте модель Example2, проведите расчёт, затем запустите скрипт (Шаблоны графиков Калькулятор графиков импортируйте скрипт ex2.py): 1 2 3 max_ctfac=graph (type = 'well', default_value = 0) for m in get_all_models (): for w in get_all_wells (): for c in w.connections: max_conn_f = 0 for t in get_all_timesteps (): max_conn_f = max (max_conn_f, float (ctfac[c,m,t])) if max_conn_f > 100: max_ctfac[c.well, m]+=ctfac[c, m] print(w.name,c.name,max_conn_f) export (max_ctfac, name = 'SUM_ctfac', units = "no") max_ctfac – это сумма множителей продуктивности для всех перфораций скважины, у которых его максимальное значение превосходит 100. Внимание! Для данной скважины просмотрите графики множителя проводимости Пример 2 Новый график появится в разделе Графики пользователяРазверните список перфораций, посмотрите на их множители продуктивности Выберите Имя Шаблона – Дебиты Графики пользователя SUM_ctfac Пример 3Необходимо настроить модель по результатам испытаний разведочных скважин и характеристике вытеснения объекта- аналога. Для настройки модели на характеристику вытеснения ЦФ должна рассчитываться как сумма квадратов отклонений характеристики «КИН-прокачка» от заданной по объекту-аналогу. Характеристика задана в виде таблицы. Отклонения нужно рассчитывать между ближайшими точками (КИН, прокачка) объекта аналога и (КИН, прокачка) модели, т.к. значения прокачки в таблице могут не совпадать с расчетными. Прокачка = накопл. закачка поровый объём 0 0,1 0,2 0,3 0,4 0,5 0,6 0 0,2 0,4 0,6 0,8 1 1,2 Модель Эталон Расчет целевой функцииОткройте модель Example3 Создайте проект адаптации Проведите любой эксперимент Посчитайте одну модель Перейдите на вкладку Целевые функции и результаты Калькулятор графиков Запустите скрипт (импортируйте скрипт ex3.py) 1 2 3 4 Внимание! Опции «Автоматически запускать скрипт для новых моделей» и «Скрипт задан для одной модели» включены по умолчанию. Адаптация моделиСоздайте целевую функцию (Целевые функции Добавить) Задайте ее параметры (Тип функции – Оптимизация на прогнозе (Forecast Optimization), Тип объекта – Польз. график по месторождению, Параметр – Objective_function, Режим – минимизировать накопленное) Создайте эксперимент Дифференциальная эволюция и выберите настроенную целевую функцию Запустите расчет 1 2 3 4 5 6 Внимание! В секции Максимальное число запусков симулятора задайте любое количество реализаций, в рамках курса не стоит использовать слишком большие или маленькие значения. Результат 1Перейдите на закладку Кроссплот, чтобы просмотреть результаты (Графики менее наглядны, т.к. целевая функция не зависит от времени) Выберите Месторождение Objective_function Выберите оптимальную модель (с минимальным значением целевой функции Результат 2Альтернативный способ визуализации: Импортируйте скрипт ex3_view.py из файла с входными данными Задайте значения эталонной кривой и пороговое значение Целевой Функции, для отображения лучших вариантов Внимание! Обязательно выключите опции «Автоматически запускать для новых моделей» и «Скрипт задан для одной модели» (т.к. этот скрипт обрабатывает результаты ВСЕХ моделей сразу. Для успешной визуализации: В главном окне tNavigator (Настройки Опции Пути) задайте внешний интерпретатор Python Установите библиотеку matplotlib: pip install matplotlib Можно запускать в любой момент выполнения эксперимента AHM Имя варианта и значение ЦФ Визуализация Пример 4Данный пример демонстрирует возможности использования языка Python в настройке модели на трассерные исследования через модуль AHM Исходные данные: Добыча трассера по скважинам на конкретную дату Параметры модели: 11х11х10 ячеек 4 добывающих скважины 1 нагнетательная скважина Для настройки на добычу трассера изменяется множитель на проницаемость В точках скважины (для межскважинного пространства множитель интерполируется) Для работы с вектором добычи трассера создана UDQ: UDQ DEFINE WUTRTOT WTPTTR1 / / Задание модификаторов Определение модификаторов: множитель на проницаемость по скважинам
... ... ... Использование модификаторов в арифметикеARITHMETIC--Создание куба множителей путем интерполяцииARRMPERMSRC=-999.25 ARRMPERMSRC=IF(BLOCK(50,50)==1,@PERMMULT_P1@,ARRMPERMSRC) --Скважина P1ARRMPERMSRC=IF(BLOCK(1050,50)==1,@PERMMULT_P2@,ARRMPERMSRC) --Скважина P2 ARRMPERMSRC=IF(BLOCK(1050,1050)==1,@PERMMULT_P3@,ARRMPERMSRC) --Скважина P3--Скважина P4 ARRMPERMSRC=IF(BLOCK(50,1050)==1,@PERMMULT_P4@,ARRMPERMSRC) ARRPERMMULT=interpolate_ml_idw(ARRMPERMSRC,-999.25,1,3) --Модификация куба проницаемости PERMX=PERMX*ARRPERMMULT PERMY=PERMX PERMZ=PERMX/10 / Анализ чувствительности 1Откройте файл модели Example4 Создайте проект адаптации (после создания проекта адаптации закройте окно создания нового эксперимента) Откройте калькулятор графиков и запустите скрипт (импортируйте скрипт ex4.py) 1 2 Скрипт добавляет замеры добычи трассера в проект: Создается график накопленной добычи трассера – расчетные значения + исторические точки Создается целевая функция для адаптации модели 3 Анализ чувствительности 2Запустите эксперимент Латинский Гиперкуб (20 вариантов) Диапазон множителей на проницаемость: [0.5;2] 1 2 Анализ чувствительности 3График OBJFUNC: Не зависит от времени Определён для месторождения в целом Применяется как целевая функция для минимизации График Cumulative_tracer_production: Зависит от времени Определён для скважин У исторической модели определён только один момент времени (01.01.2018, дата замера) Применяется для визуального сравнения результатов на графиках Анализ чувствительности 4Графики накопленной добычи трассера с историей: Расчеты «покрывают» исторические точки Можно переходить к автоматической адаптации Адаптация моделиСоздайте целевую функцию (Целевые функции Добавить) Задайте ее параметры (Тип функции – Оптимизация на прогнозе (Forecast Optimization), Тип объекта – Польз. график по месторождению, Параметр – OBJFUNC, Режим – минимизировать накопленное) Создайте эксперимент Дифференциальная эволюция и выберите настроенную целевую функцию, задайте Случайное число равным 100000000 4. Запустите расчет 1 2 3 4 5 6 Внимание! В секции Максимальное число запусков симулятора задайте любое количество реализаций, в рамках курса не стоит использовать слишком большие или маленькие значения. Результат Сравнение результатов базового расчета и расчета с наилучшим качеством:Остались вопросы?Хотите узнать больше? https://support.rfdyn.com tNavigator@rfdyn.com |