try using LJ sigma for particle radius in VDW mode

This commit is contained in:
Axel Kohlmeyer
2024-07-16 01:40:18 -04:00
parent 3b853adaac
commit 90dee57aae
4 changed files with 39 additions and 13 deletions

View File

@ -132,7 +132,8 @@ static const QString blank(" ");
ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidget *parent) :
QDialog(parent), menuBar(new QMenuBar), imageLabel(new QLabel), scrollArea(new QScrollArea),
lammps(_lammps), group("all"), filename(fileName), useelements(false), usediameter(false)
lammps(_lammps), group("all"), filename(fileName), useelements(false), usediameter(false),
usesigma(false)
{
imageLabel->setBackgroundRole(QPalette::Base);
imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
@ -214,7 +215,7 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge
combo->setObjectName("group");
combo->setToolTip("Select group to display");
combo->setObjectName("group");
int ngroup = lammps->id_count("group");
int ngroup = lammps->id_count("group");
constexpr int BUFLEN = 256;
char gname[BUFLEN];
for (int i = 0; i < ngroup; ++i) {
@ -271,7 +272,7 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge
// properties directly since lookup in reset_view() will have failed
dobox->setChecked(showbox);
dovdw->setChecked(vdwfactor > 1.0);
dovdw->setEnabled(useelements || usediameter);
dovdw->setEnabled(useelements || usediameter || usesigma);
doaxes->setChecked(showaxes);
dossao->setChecked(usessao);
doanti->setChecked(antialias);
@ -336,7 +337,7 @@ void ImageViewer::edit_size()
void ImageViewer::toggle_ssao()
{
auto *button = qobject_cast<QPushButton *>(sender());
usessao = !usessao;
usessao = !usessao;
button->setChecked(usessao);
createImage();
}
@ -344,7 +345,7 @@ void ImageViewer::toggle_ssao()
void ImageViewer::toggle_anti()
{
auto *button = qobject_cast<QPushButton *>(sender());
antialias = !antialias;
antialias = !antialias;
button->setChecked(antialias);
createImage();
}
@ -363,7 +364,7 @@ void ImageViewer::toggle_vdw()
void ImageViewer::toggle_box()
{
auto *button = qobject_cast<QPushButton *>(sender());
showbox = !showbox;
showbox = !showbox;
button->setChecked(showbox);
createImage();
}
@ -371,7 +372,7 @@ void ImageViewer::toggle_box()
void ImageViewer::toggle_axes()
{
auto *button = qobject_cast<QPushButton *>(sender());
showaxes = !showaxes;
showaxes = !showaxes;
button->setChecked(showaxes);
createImage();
}
@ -443,7 +444,7 @@ void ImageViewer::createImage()
// determine elements from masses and set their covalent radii
int ntypes = lammps->extract_setting("ntypes");
int nbondtypes = lammps->extract_setting("nbondtypes");
auto *masses = (double *)lammps->extract_atom("mass");
auto *masses = (double *)lammps->extract_atom("mass");
QString units = (const char *)lammps->extract_global("units");
QString elements = "element ";
QString adiams;
@ -458,9 +459,19 @@ void ImageViewer::createImage()
}
}
usediameter = lammps->extract_setting("radius_flag") != 0;
// use Lennard-Jones sigma for radius, if available
usesigma = false;
const char *pair_style = (const char *)lammps->extract_global("pair_style");
if (!useelements && pair_style && (strncmp(pair_style, "lj/", 3) == 0)) {
double **sigma = (double **) lammps->extract_pair("sigma");
if (sigma) {
usesigma = true;
for (int i = 1; i <= ntypes; ++i)
adiams += QString("adiam %1 %2 ").arg(i).arg(vdwfactor * sigma[i][i]);
}
}
// adjust pushbutton state and clear adiams string to disable VDW display, if needed
if (useelements || usediameter) {
if (useelements || usediameter || usesigma) {
auto *button = findChild<QPushButton *>("vdw");
if (button) button->setEnabled(true);
} else {
@ -469,7 +480,7 @@ void ImageViewer::createImage()
if (button) button->setEnabled(false);
}
if (!adiams.isEmpty())
if (useelements)
dumpcmd += blank + "element";
else
dumpcmd += blank + settings.value("color", "type").toString();
@ -503,7 +514,8 @@ void ImageViewer::createImage()
dumpcmd += " modify boxcolor " + settings.value("boxcolor", "yellow").toString();
dumpcmd += " backcolor " + settings.value("background", "black").toString();
if (!adiams.isEmpty()) dumpcmd += blank + elements + blank + adiams + blank;
if (useelements) dumpcmd += blank + elements + blank + adiams + blank;
if (usesigma) dumpcmd += blank + adiams + blank;
settings.endGroup();
lammps->command(dumpcmd.toLocal8Bit());

View File

@ -88,7 +88,7 @@ private:
int xsize, ysize;
int hrot, vrot;
double zoom, vdwfactor;
bool showbox, showaxes, antialias, usessao, useelements, usediameter;
bool showbox, showaxes, antialias, usessao, useelements, usediameter, usesigma;
};
#endif

View File

@ -76,6 +76,19 @@ void *LammpsWrapper::extract_global(const char *keyword)
return val;
}
void *LammpsWrapper::extract_pair(const char *keyword)
{
void *val = nullptr;
if (lammps_handle) {
#if defined(LAMMPS_GUI_USE_PLUGIN)
val = ((liblammpsplugin_t *)plugin_handle)->extract_pair(lammps_handle, keyword);
#else
val = lammps_extract_pair(lammps_handle, keyword);
#endif
}
return val;
}
void *LammpsWrapper::extract_atom(const char *keyword)
{
void *val = nullptr;

View File

@ -32,6 +32,7 @@ public:
int version();
int extract_setting(const char *keyword);
void *extract_global(const char *keyword);
void *extract_pair(const char *keyword);
void *extract_atom(const char *keyword);
int id_count(const char *idtype);