Files
lammps/tools/lammps-gui/preferences.cpp
2023-08-02 21:06:30 -04:00

254 lines
9.2 KiB
C++

/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://www.lammps.org/, Sandia National Laboratories
LAMMPS development team: developers@lammps.org
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "preferences.h"
#include <QCheckBox>
#include <QDialogButtonBox>
#include <QDoubleValidator>
#include <QGroupBox>
#include <QHBoxLayout>
#include <QIntValidator>
#include <QLabel>
#include <QLineEdit>
#include <QRadioButton>
#include <QSettings>
#include <QTabWidget>
#include <QVBoxLayout>
#include "lammpswrapper.h"
#if defined(_OPENMP)
#include <omp.h>
#endif
Preferences::Preferences(LammpsWrapper *_lammps, QWidget *parent) :
QDialog(parent), tabWidget(new QTabWidget),
buttonBox(new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel)),
settings(new QSettings), lammps(_lammps)
{
tabWidget->addTab(new GeneralTab(settings), "General Settings");
tabWidget->addTab(new AcceleratorTab(settings, lammps), "Accelerators");
tabWidget->addTab(new SnapshotTab(settings), "Snapshot Image");
connect(buttonBox, &QDialogButtonBox::accepted, this, &Preferences::accept);
connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
auto *layout = new QVBoxLayout;
layout->addWidget(tabWidget);
layout->addWidget(buttonBox);
setLayout(layout);
setWindowTitle("LAMMPS-GUI - Preferences");
resize(500, 400);
}
Preferences::~Preferences()
{
delete buttonBox;
delete tabWidget;
delete settings;
}
void Preferences::accept()
{
// store all data in settings class
// and then confirm accepting
// store selected accelerator
QList<QRadioButton *> allButtons = tabWidget->findChildren<QRadioButton *>();
for (int i = 0; i < allButtons.size(); ++i) {
if (allButtons[i]->isChecked()) {
if (allButtons[i]->objectName() == "none")
settings->setValue("accelerator", QString::number(AcceleratorTab::None));
if (allButtons[i]->objectName() == "opt")
settings->setValue("accelerator", QString::number(AcceleratorTab::Opt));
if (allButtons[i]->objectName() == "openmp")
settings->setValue("accelerator", QString::number(AcceleratorTab::OpenMP));
if (allButtons[i]->objectName() == "intel")
settings->setValue("accelerator", QString::number(AcceleratorTab::Intel));
if (allButtons[i]->objectName() == "kokkos")
settings->setValue("accelerator", QString::number(AcceleratorTab::Kokkos));
if (allButtons[i]->objectName() == "gpu")
settings->setValue("accelerator", QString::number(AcceleratorTab::Gpu));
}
}
// store number of threads
QLineEdit *field = tabWidget->findChild<QLineEdit *>("nthreads");
if (field)
if (field->hasAcceptableInput()) settings->setValue("nthreads", field->text());
// store image width, height, and zoom
settings->beginGroup("snapshot");
field = tabWidget->findChild<QLineEdit *>("xsize");
if (field)
if (field->hasAcceptableInput()) settings->setValue("xsize", field->text());
field = tabWidget->findChild<QLineEdit *>("ysize");
if (field)
if (field->hasAcceptableInput()) settings->setValue("ysize", field->text());
field = tabWidget->findChild<QLineEdit *>("zoom");
if (field)
if (field->hasAcceptableInput()) settings->setValue("zoom", field->text());
settings->endGroup();
// general settings
QCheckBox *box = tabWidget->findChild<QCheckBox *>("echo");
if (box) settings->setValue("echo", box->isChecked() ? "1" : "0");
box = tabWidget->findChild<QCheckBox *>("cite");
if (box) settings->setValue("cite", box->isChecked() ? "1" : "0");
QDialog::accept();
}
GeneralTab::GeneralTab(QSettings *_settings, QWidget *parent) : QWidget(parent), settings(_settings)
{
auto *layout = new QVBoxLayout;
auto *echo = new QCheckBox("Echo input to log");
echo->setCheckState(settings->value("echo", "0").toInt() ? Qt::Checked : Qt::Unchecked);
echo->setObjectName("echo");
auto *cite = new QCheckBox("Include Citations");
cite->setCheckState(settings->value("cite", "0").toInt() ? Qt::Checked : Qt::Unchecked);
cite->setObjectName("cite");
layout->addWidget(echo);
layout->addWidget(cite);
layout->addStretch(1);
setLayout(layout);
}
AcceleratorTab::AcceleratorTab(QSettings *_settings, LammpsWrapper *_lammps, QWidget *parent) :
QWidget(parent), settings(_settings), lammps(_lammps)
{
auto *mainLayout = new QHBoxLayout;
auto *accelerator = new QGroupBox("Choose Accelerator:");
auto *none = new QRadioButton("&None");
auto *opt = new QRadioButton("O&pt");
auto *openmp = new QRadioButton("&OpenMP");
auto *intel = new QRadioButton("&Intel");
auto *kokkos = new QRadioButton("&Kokkos");
auto *gpu = new QRadioButton("&GPU");
auto *buttonLayout = new QVBoxLayout;
buttonLayout->addWidget(none);
buttonLayout->addWidget(opt);
buttonLayout->addWidget(openmp);
buttonLayout->addWidget(intel);
buttonLayout->addWidget(kokkos);
buttonLayout->addWidget(gpu);
buttonLayout->addStretch(1);
accelerator->setLayout(buttonLayout);
mainLayout->addWidget(accelerator);
none->setEnabled(true);
none->setObjectName("none");
opt->setEnabled(lammps->config_has_package("OPT"));
opt->setObjectName("opt");
openmp->setEnabled(lammps->config_has_package("OPENMP"));
openmp->setObjectName("openmp");
intel->setEnabled(lammps->config_has_package("INTEL"));
intel->setObjectName("intel");
// Kokkos support only works with OpenMP for now.
if (lammps->config_has_package("KOKKOS")) {
if (lammps->config_accelerator("KOKKOS", "api", "openmp") &&
!(lammps->config_accelerator("KOKKOS", "api", "cuda") ||
lammps->config_accelerator("KOKKOS", "api", "hip") ||
lammps->config_accelerator("KOKKOS", "api", "sycl")))
kokkos->setEnabled(true);
else
kokkos->setEnabled(false);
}
kokkos->setObjectName("kokkos");
gpu->setEnabled(lammps->config_has_package("GPU") && lammps->has_gpu_device());
gpu->setObjectName("gpu");
int choice = settings->value("accelerator", AcceleratorTab::None).toInt();
switch (choice) {
case AcceleratorTab::Opt:
if (opt->isEnabled()) opt->setChecked(true);
break;
case AcceleratorTab::OpenMP:
if (openmp->isEnabled()) openmp->setChecked(true);
break;
case AcceleratorTab::Intel:
if (intel->isEnabled()) intel->setChecked(true);
break;
case AcceleratorTab::Kokkos:
if (kokkos->isEnabled()) kokkos->setChecked(true);
break;
case AcceleratorTab::Gpu:
if (gpu->isEnabled()) gpu->setChecked(true);
break;
case AcceleratorTab::None: // fallthrough
default:
none->setChecked(true);
break;
}
int maxthreads = 1;
#if defined(_OPENMP)
maxthreads = omp_get_max_threads();
#endif
auto *choices = new QFrame;
auto *choiceLayout = new QVBoxLayout;
auto *ntlabel = new QLabel("Number of threads:");
auto *ntchoice = new QLineEdit(settings->value("nthreads", maxthreads).toString());
auto *intval = new QIntValidator(1, maxthreads, this);
ntchoice->setValidator(intval);
ntchoice->setObjectName("nthreads");
choiceLayout->addWidget(ntlabel);
choiceLayout->addWidget(ntchoice);
choices->setLayout(choiceLayout);
choiceLayout->addStretch(1);
mainLayout->addWidget(choices);
setLayout(mainLayout);
}
SnapshotTab::SnapshotTab(QSettings *_settings, QWidget *parent) :
QWidget(parent), settings(_settings)
{
auto *grid = new QGridLayout;
auto *xsize = new QLabel("Image width:");
auto *ysize = new QLabel("Image height:");
auto *zoom = new QLabel("Zoom factor:");
settings->beginGroup("snapshot");
auto *xval = new QLineEdit(settings->value("xsize", "800").toString());
auto *yval = new QLineEdit(settings->value("ysize", "600").toString());
auto *zval = new QLineEdit(settings->value("zoom", "1.0").toString());
settings->endGroup();
auto *intval = new QIntValidator(100, 100000, this);
xval->setValidator(intval);
xval->setObjectName("xsize");
yval->setValidator(intval);
yval->setObjectName("ysize");
zval->setValidator(new QDoubleValidator(0.01, 100.0, 100, this));
zval->setObjectName("zoom");
grid->addWidget(xsize, 0, 0);
grid->addWidget(ysize, 1, 0);
grid->addWidget(zoom, 2, 0);
grid->addWidget(xval, 0, 1);
grid->addWidget(yval, 1, 1);
grid->addWidget(zval, 2, 1);
setLayout(grid);
}
// Local Variables:
// c-basic-offset: 4
// End: