diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index faa18d7faf..9591efcea1 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -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(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(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(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(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("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()); diff --git a/tools/lammps-gui/imageviewer.h b/tools/lammps-gui/imageviewer.h index 1be7790666..72f4c3a1e2 100644 --- a/tools/lammps-gui/imageviewer.h +++ b/tools/lammps-gui/imageviewer.h @@ -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 diff --git a/tools/lammps-gui/lammpswrapper.cpp b/tools/lammps-gui/lammpswrapper.cpp index f74a1c6575..1c1b29f2d1 100644 --- a/tools/lammps-gui/lammpswrapper.cpp +++ b/tools/lammps-gui/lammpswrapper.cpp @@ -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; diff --git a/tools/lammps-gui/lammpswrapper.h b/tools/lammps-gui/lammpswrapper.h index 1d024a94e7..8719ef4491 100644 --- a/tools/lammps-gui/lammpswrapper.h +++ b/tools/lammps-gui/lammpswrapper.h @@ -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);