Вопрос или проблема
Каждый раз, когда я пытаюсь открыть файл ввода Quantum Espresso с помощью программы PWgui (графический интерфейс QE), появляется следующее сообщение:
==================================================
Версия PWgui : 7.2
PWGUI : /opt/local/bin/qe-7.3/GUI/PWgui/
GUIB движок : /opt/local/bin/qe-7.3/GUI/PWgui/lib/Guib-1.0
Член функции “::guib::moduleObj::makeEmbedGUI” не определен и не может быть автоматически загружен
при выполнении
“$obj makeEmbedGUI [expr {$containerWidget != “.” ? $containerWidget : “” }]”
(процедура “::guib::embedGUI”, строка 6)
вызвано внутри
“::guib::embedGUI $moduleFile $wid”
(объект “::gUI0”, метод “::guib::GUI::_newInput”, тело строка 56)
вызвано внутри
“_newInput $moduleIdent $moduleName $moduleFile”
(объект “::gUI0”, метод “::guib::GUI::openInput”, тело строка 11)
вызвано внутри
“$gui openInput $moduleIdent $moduleName $moduleFile $inputFile”
(файл “/opt/local/bin/qe-7.3/GUI/PWgui//pwgui.tcl”, строка 10)
вызвано внутри
“source $env(PWGUI)/pwgui.tcl”
(файл “/opt/local/bin/qe-7.3/GUI/PWgui/pwgui”, строка 41)
Вот файл pwgui.tcl, который, как я понимаю, вызывает эту ошибку.
# ----------------------------------------------------------------------
# ПРОГРАММА: PWgui
# ЦЕЛЬ: Строитель ввода GUI для PWscf
# ----------------------------------------------------------------------
# Антон Кокаль
# Институт Йожафа Штефана, Любляна, Словения
# Электронная почта: [email protected]
# ======================================================================
# Авторское право (c) 2003--2023 Антон Кокаль
# ======================================================================
#
#
# Этот файл распространяется на условиях Общей публичной лицензии
# GNU. См. файл COPYING в корневом каталоге данной
# дистрибуции, или http://www.gnu.org/copyleft/gpl.txt.
#
#
# ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", БЕЗ ГАРАНТИЙ ЛЮБОГО РОДА,
# ЯВНЫХ ИЛИ НЕЯВНЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ
# ТОРГОВОЙ ПРИГОДНОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ И
# НЕНАРУШЕНИЯ. ПОД НИКАКИМИ УСЛОВИЯМИ АНТОН КОКАЛЬ НЕ НОСИТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ
# ИСКИ, УЩЕРБ ИЛИ ДРУГИЕ ОБЯЗАТЕЛЬСТВА, БУДУ ТОЛЬКО В ДЕЙСТВИИ КОНТРАКТА,
# ДЕЛИКТЕ ИЛИ ИНДИФФЕРЕНТНО, ВЫТЕКАЮЩИЕ ИЗ ИЛИ В СВЯЗИ С ПРИЛОЖЕНИЕМ
# ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ СДЕЛКАМИ С ПО.
#
# Версия PWgui
set fid [open $env(PWGUI)/VERSION]
set ver [read -nonewline $fid]
close $fid
# создаем список поддерживаемых программ QE
foreach item [glob -nocomplain [file join $env(PWGUI) modules *]] {
if { [file isdirectory $item] } {
set prog [file tail $item]
if { $prog == "atomic" } {
append progs " [format {%-9s или %-9s} ld1.x atomic]\n"
} else {
append progs " [format {%-9s или %-9s} $prog.x $prog]\n"
}
lappend prog_l [file rootname $prog]
}
}
# использование
set usage [subst -nocommands {
Использование: pwgui [-h] | [-r программа inputFile] [-o программа inputFile]
Описание параметров:
-h
-?
--help
Печатает это сообщение об использовании.
-r программа inputFile
--reformat программа inputFile
Читает "inputFile" программы QE (например, pw.x, pp.x, ...),
проверяет его синтаксис на корректность и красиво форматирует.
-o программа inputFile
--open программа inputFile
Открывает "inputFile" программы QE (например, pw.x, pp.x, ...)
в PWgui.
Допустимые значения для "program":
$progs
}]
set o_usage {
Неверное использование параметра $opt, должно быть:
pwgui $opt программа inputFile
}
# парсим параметры командной строки
set reformat 0
set open 0
if { $argc > 0 } {
set opt [lindex $argv 0]
switch -glob -- $opt {
-h - --help - -\\? {
puts $usage
exit 0
}
-r* - --ref* {
# -r | --reformat
if { $argc != 3 } { puts [subst $o_usage]; exit 1 }
set reformat 1
}
-o* - --open {
# -o | --open
if { $argc != 3 } { puts [subst $o_usage]; exit 1 }
set open 1
}
default {
puts "\n Неверный параметр \"$opt\", прерывание...\n$usage"
exit 1
}
}
set module [file rootname [lindex $argv 1]]
set inputFile [lindex $argv 2]
if { ! [file exists $inputFile] } {
puts "
Файл \"$inputFile\" не существует.\n"
exit 1
}
if { $module == "ld1" || $module == "atomic" } {
set module atomic
set moduleIdent ld
set moduleName LD1.X
} else {
set moduleIdent $module
set moduleName [string toupper $module].X
}
set moduleFile [file join $env(PWGUI) modules $module $module.tcl]
# проверка действительного модуля
if { [lsearch $prog_l $module] < 0 } {
puts "[subst $o_usage]
где программа должна быть одной из:
[join $prog_l {, }]\n"
exit 1
}
}
if { [info exists env(PWGUI)] } {
set guib_dir [glob -nocomplain -directory [file join $env(PWGUI) lib] Guib-*]
if { $guib_dir != "" } {
set env(GUIB) $guib_dir
} else {
set guib_dir [file normalize [file join $env(PWGUI) .. Guib]]
if { [file isdirectory $guib_dir] } {
# мы приходим сюда, если используем PWgui внутри QE
set env(GUIB) $guib_dir
}
}
if { [info exists env(GUIB)] } {
lappend auto_path $env(GUIB)
} else {
puts "
Двигатель Guib не найден.
Вы можете рассмотреть возможность определения переменной среды GUIB, указывающей на движок Guib.
Прерывание.
"
exit 1
}
if { ! $reformat } {
puts "
==================================================
Версия PWgui : $ver
--------------------------------------------------
PWGUI : $env(PWGUI)
GUIB движок : $env(GUIB)\n"
}
} else {
puts stderr " "
puts stderr " Пожалуйста, определите переменную среды PWGUI !!!"
puts stderr " PWGUI должна указывать на корневую директорию PWgui."
puts stderr " "
exit 1
}
#
# вся инициализация должна происходить в init.tcl
#
source [file join $env(PWGUI) init.tcl]
wm withdraw .
if { ! $reformat } {
#
# открываем главное окно GUI
#
bind . <Destroy> ::guib::exitApp
source [file join $env(PWGUI) src pwscf.itcl]
if { $open } {
# открываем указанный файл ввода
$gui openInput $moduleIdent $moduleName $moduleFile $inputFile
}
} else {
#
# только переформатируем указанный файл ввода
#
set ::tclu::DEBUG 0
set ::tclu::DEBUG_FILE 0
option readfile [file join $::guib::library guib.theme] startupFile
namespace eval ::guib {
set moduleObj [embedGUI $::moduleFile .]
$moduleObj openFile $::inputFile
$moduleObj print 1
}
exit 0
}
Я не знаком с этим языком программирования и не являюсь экспертом в этой области. Поэтому я благодарен любому, кто сможет просмотреть код и увидеть, что пошло не так.
Ответ или решение
Когда вы пытаетесь открыть входной файл для Quantum Espresso с помощью PWgui (версия 7.2), вы получаете ошибку, которая может быть связана с несколькими аспектами программы и её окружения. Ошибка, которую вы видите, говорит о том, что функция "::guib::moduleObj::makeEmbedGUI" не определена и не может быть загружена автоматически.
Возможные причины проблемы
-
Проблемы с установкой или обновлениями: Убедитесь, что установлены все необходимые зависимости для PWgui и что версии всех компонентов совместимы друг с другом. Учтите, что версия PWgui, которую вы используете, может иметь зависимости, которые были изменены или обновлены.
-
Отсутствие необходимых модулей: Сообщение об ошибке намекает на то, что PWgui не может найти или загрузить необходимый модуль GUIB. Проверьте, определена ли переменная среды
GUIB
, указывающая на правильный путь к движку Guib. Для этого можете выполнить в терминале команду:echo $GUIB
Проверьте, что путь корректен и существует.
-
Ошибки в коде скрипта: Если вы изменяли
pwgui.tcl
, это может быть причиной сбоя. Убедитесь, что файл не был повреждён и все необходимые функции присутствуют. Особенно важно проверить строки, связанные с функциями модуляGuib
, на наличие синтаксических и логических ошибок. -
Версии программного обеспечения: Убедитесь, что вы используете совместимые версии Quantum Espresso и PWgui. Программное обеспечение может иметь специфические требования к версиям, так как более новые или более старые версии могут иметь изменения в API.
Шаги по устранению ошибки
-
Проверка переменных окружения: Убедитесь, что переменная
PWGUI
правильно задана и указывает на корневую директорию PWgui. Если она не задана, вы можете добавить её в ваш.bashrc
или.bash_profile
:export PWGUI=/path/to/pwgui
-
Проверка наличия необходимых модулей: Убедитесь, что в каталоге
modules
вашей установки PWgui есть необходимые файлы и они не были удалены или перемещены. -
Запуск с отладкой: Вы можете запустить PWgui с помощью отладочных сообщений, чтобы получить более детальную информацию о том, что именно вызывает сбой. Добавьте отладочные сообщения в код, чтобы увидеть, какие части кода выполняются, а какие – нет.
-
Обновление программного обеспечения: Если проблема сохраняется, возможно, стоит обновить PWgui и Quantum Espresso до последних стабильных версий. Это может решить проблемы, связанные с совместимостью.
Резюме
Ваша ошибка может быть вызвана несколькими причинами, включая проблемы с установкой и зависимостями, отсутствием необходимых модулей и возможные ошибки в коде. Следуйте предложенным шагам, чтобы диагностировать и устранить проблему. Если ничего не помогает, стоит рассмотреть возможность обращения за помощью на форумы поддержки Quantum Espresso или обратиться к документации.