Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add Buckingham potential and Guassian FD #1885

Merged
merged 16 commits into from
May 29, 2024
Merged
18 changes: 10 additions & 8 deletions src/classes/pairPotential.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,8 +137,14 @@ std::string_view PairPotential::nameI() const { return nameI_; }
// Return name for second source parameters
std::string_view PairPotential::nameJ() const { return nameJ_; };

// Set interaction potential
bool PairPotential::setInteractionPotential(Functions1D::Form form, std::string_view parameters)
{
return interactionPotential_.setFormAndParameters(form, parameters) &&
potentialFunction_.setFormAndParameters(form, interactionPotential_.parameters());
}

// Return interaction potential
InteractionPotential<Functions1D> &PairPotential::interactionPotential() { return interactionPotential_; }
const InteractionPotential<Functions1D> &PairPotential::interactionPotential() const { return interactionPotential_; }

// Set charge I
Expand Down Expand Up @@ -256,7 +262,7 @@ bool PairPotential::tabulate(double maxR, double delta)

// Initialise original and additional potential arrays, and calculate original potential
uOriginal_.initialise(nPoints_);
calculateUOriginal(false);
calculateUOriginal();

// Set additional potential to zero and update full potential
uAdditional_ = uOriginal_;
Expand All @@ -279,8 +285,8 @@ double PairPotential::range() const { return range_; }
// Return spacing between points
double PairPotential::delta() const { return delta_; }

// (Re)generate potential from current parameters
void PairPotential::calculateUOriginal(bool recalculateUFull)
// Calculate original potential from current parameters
void PairPotential::calculateUOriginal()
{
// Loop over points
for (auto n = 1; n < nPoints_; ++n)
Expand All @@ -298,10 +304,6 @@ void PairPotential::calculateUOriginal(bool recalculateUFull)

// Since the first point (at zero) risks being a nan, set it to ten times the second point instead
uOriginal_.value(0) = 10.0 * uOriginal_.value(1);

// Update full potential (if not the first generation of the potential)
if (recalculateUFull)
calculateUFull();
}

// Return potential at specified r
Expand Down
7 changes: 4 additions & 3 deletions src/classes/pairPotential.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,9 @@ class PairPotential
std::string_view nameI() const;
// Return name for second source parameters
std::string_view nameJ() const;
// Set interaction potential
bool setInteractionPotential(Functions1D::Form form, std::string_view parameters);
// Return interaction potential
InteractionPotential<Functions1D> &interactionPotential();
const InteractionPotential<Functions1D> &interactionPotential() const;
// Set charge I
void setChargeI(double value);
Expand Down Expand Up @@ -154,8 +155,8 @@ class PairPotential
double range() const;
// Return spacing between points
double delta() const;
// (Re)generate original potential (uOriginal) from current parameters
void calculateUOriginal(bool recalculateUFull = true);
// Calculate original potential (uOriginal) from current parameters
void calculateUOriginal();
// Return potential at specified r
double energy(double r);
// Return analytic potential at specified r, including Coulomb term from local atomtype charges
Expand Down
12 changes: 10 additions & 2 deletions src/classes/shortRangeFunctions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ EnumOptions<ShortRangeFunctions::Form> ShortRangeFunctions::forms()
return EnumOptions<ShortRangeFunctions::Form>("ShortRangeType",
{{ShortRangeFunctions::Form::None, "None"},
{ShortRangeFunctions::Form::LennardJones, "LJ", 2, 2},
{ShortRangeFunctions::Form::LennardJonesGeometric, "LJGeometric", 2, 2}});
{ShortRangeFunctions::Form::LennardJonesGeometric, "LJGeometric", 2, 2},
{ShortRangeFunctions::Form::Buckingham, "Buckingham", 3, 3}});
}

// Return parameters for specified form
Expand All @@ -18,7 +19,8 @@ const std::vector<std::string> &ShortRangeFunctions::parameters(Form form)
static std::map<ShortRangeFunctions::Form, std::vector<std::string>> params_ = {
{ShortRangeFunctions::Form::None, {}},
{ShortRangeFunctions::Form::LennardJones, {"epsilon", "sigma"}},
{ShortRangeFunctions::Form::LennardJonesGeometric, {"epsilon", "sigma"}}};
{ShortRangeFunctions::Form::LennardJonesGeometric, {"epsilon", "sigma"}},
{ShortRangeFunctions::Form::Buckingham, {"A", "B", "C"}}};
return params_[form];
}

Expand Down Expand Up @@ -62,6 +64,12 @@ InteractionPotential<Functions1D> ShortRangeFunctions::combine(const Interaction
*/
return {Functions1D::Form::LennardJones126,
{sqrt(srI.parameters()[0] * srJ.parameters()[0]), sqrt(srI.parameters()[1] * srJ.parameters()[1])}};
case (Form::Buckingham):
/*

*/
return {Functions1D::Form::Buckingham};

break;
default:
throw(std::runtime_error(
Expand Down
7 changes: 4 additions & 3 deletions src/classes/shortRangeFunctions.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ class ShortRangeFunctions
public:
enum class Form
{
None, /* No short-range dispersive forces */
LennardJones, /* Lennard-Jones 12-6 form with Lorentz-Berthelot combination rules */
LennardJonesGeometric /* Lennard-Jones 12-6 form with Geometric combination rules */
None, /* No short-range dispersive forces */
LennardJones, /* Lennard-Jones 12-6 form with Lorentz-Berthelot combination rules */
LennardJonesGeometric, /* Lennard-Jones 12-6 form with Geometric combination rules */
Buckingham /* Buckingham form */
};
// Return enum options for form
static EnumOptions<Form> forms();
Expand Down
40 changes: 32 additions & 8 deletions src/gui/forcefieldTab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,11 +135,13 @@ ForcefieldTab::ForcefieldTab(DissolveWindow *dissolveWindow, Dissolve &dissolve,
new ComboListDelegate(this, new ComboEnumOptionsItems<PairPotentialOverride::PairPotentialOverrideType>(
PairPotentialOverride::pairPotentialOverrideTypes())));
ui_.OverridesTable->setItemDelegateForColumn(
PairPotentialOverrideModel::ColumnData::ShortRangeForm,
new ComboListDelegate(this, new ComboEnumOptionsItems<ShortRangeFunctions::Form>(ShortRangeFunctions::forms())));
PairPotentialOverrideModel::ColumnData::Form,
new ComboListDelegate(this, new ComboEnumOptionsItems<Functions1D::Form>(Functions1D::forms())));
ui_.OverridesTable->setModel(&pairPotentialOverrideModel_);
connect(&pairPotentialOverrideModel_, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &, const QVector<int> &)),
this, SLOT(overrideDataChanged(const QModelIndex &, const QModelIndex &, const QVector<int> &)));
ui_.OverridesTable->setModel(&pairPotentialOverrideModel_);
connect(ui_.OverridesTable->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
this, SLOT(overrideSelectionChanged(const QItemSelection &, const QItemSelection &)));
}

/*
Expand Down Expand Up @@ -460,20 +462,36 @@ void ForcefieldTab::pairPotentialSelectionChanged(const QItemSelection &current,
ui_.PairPotentialsPlotWidget->dataViewer()->createRenderable<RenderableData1D>(
pp->uFull(), fmt::format("Energy {}-{}", pp->nameI(), pp->nameJ()));
ui_.PairPotentialsPlotWidget->dataViewer()
->createRenderable<RenderableData1D>(pp->dUFull(), fmt::format("Force {}-{}", pp->nameI(), pp->nameJ()))
->createRenderable<RenderableData1D>(pp->dUFull(), fmt::format("Derivative {}-{}", pp->nameI(), pp->nameJ()))
->setColour(StockColours::RedStockColour);
}

/*
* Pair Potential Overrides
*/

// Pair Potential Overrides
void ForcefieldTab::on_OverrideAddButton_clicked(bool checked) {}
void ForcefieldTab::on_OverrideAddButton_clicked(bool checked)
{
pairPotentialOverrideModel_.insertRows(dissolve_.coreData().pairPotentialOverrides().size(), 1);
}

void ForcefieldTab::on_OverrideRemoveButton_clicked(bool checked) {}
void ForcefieldTab::on_OverrideRemoveButton_clicked(bool checked)
{
auto row = ui_.OverridesTable->currentIndex().row();
if (row == -1)
return;

void ForcefieldTab::on_OverrideDuplicateButton_clicked(bool checked) {}
pairPotentialOverrideModel_.removeRows(row, 1);
}

void ForcefieldTab::on_OverrideDuplicateButton_clicked(bool checked)
{
auto row = ui_.OverridesTable->currentIndex().row();
if (row == -1)
return;

pairPotentialOverrideModel_.duplicateRow(row);
}

void ForcefieldTab::overrideDataChanged(const QModelIndex &current, const QModelIndex &previous, const QVector<int> &)
{
Expand All @@ -483,6 +501,12 @@ void ForcefieldTab::overrideDataChanged(const QModelIndex &current, const QModel
updatePairPotentials();
}

void ForcefieldTab::overrideSelectionChanged(const QItemSelection &current, const QItemSelection &previous)
{
ui_.OverrideDuplicateButton->setEnabled(!current.isEmpty());
ui_.OverrideRemoveButton->setEnabled(!current.isEmpty());
}

/*
* Master Terms
*/
Expand Down
1 change: 1 addition & 0 deletions src/gui/forcefieldTab.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ class ForcefieldTab : public QWidget, public MainTab
void on_OverrideRemoveButton_clicked(bool checked);
void on_OverrideDuplicateButton_clicked(bool checked);
void overrideDataChanged(const QModelIndex &current, const QModelIndex &previous, const QVector<int> &);
void overrideSelectionChanged(const QItemSelection &current, const QItemSelection &previous);
// Master Terms
void masterBondsDataChanged(const QModelIndex &, const QModelIndex &);
void masterAnglesDataChanged(const QModelIndex &, const QModelIndex &);
Expand Down
2 changes: 1 addition & 1 deletion src/gui/models/pairPotentialModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ bool PairPotentialModel::setData(const QModelIndex &index, const QVariant &value
break;
// Short Range Parameters
case (5):
if (!pair->interactionPotential().parseParameters(value.toString().toStdString()))
if (!pair->setInteractionPotential(pair->interactionPotential().form(), value.toString().toStdString()))
return false;
break;
default:
Expand Down
59 changes: 46 additions & 13 deletions src/gui/models/pairPotentialOverrideModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,13 @@ int PairPotentialOverrideModel::columnCount(const QModelIndex &parent) const
return ColumnData::nColumnData;
}

const PairPotentialOverride *PairPotentialOverrideModel::rawData(const QModelIndex index) const
{
return data_[index.row()].get();
}
const PairPotentialOverride *PairPotentialOverrideModel::rawData(int row) const { return data_[row].get(); }

PairPotentialOverride *PairPotentialOverrideModel::rawData(const QModelIndex index) { return data_[index.row()].get(); }
PairPotentialOverride *PairPotentialOverrideModel::rawData(int row) { return data_[row].get(); }

QVariant PairPotentialOverrideModel::data(const QModelIndex &index, int role) const
{
auto *ppOverride = rawData(index);
auto *ppOverride = rawData(index.row());
if (!ppOverride)
return {};

Expand All @@ -47,9 +44,9 @@ QVariant PairPotentialOverrideModel::data(const QModelIndex &index, int role) co
return QString::fromStdString(std::string(ppOverride->matchJ()));
case (ColumnData::OverrideType):
return QString::fromStdString(PairPotentialOverride::pairPotentialOverrideTypes().keyword(ppOverride->type()));
case (ColumnData::ShortRangeForm):
case (ColumnData::Form):
return QString::fromStdString(Functions1D::forms().keyword(ppOverride->interactionPotential().form()));
case (ColumnData::ShortRangeParameters):
case (ColumnData::Parameters):
return QString::fromStdString(ppOverride->interactionPotential().parametersAsString());
default:
return {};
Expand All @@ -66,7 +63,7 @@ bool PairPotentialOverrideModel::setData(const QModelIndex &index, const QVarian
if (role != Qt::EditRole)
return false;

auto *ppOverride = rawData(index);
auto *ppOverride = rawData(index.row());

switch (index.column())
{
Expand All @@ -80,10 +77,10 @@ bool PairPotentialOverrideModel::setData(const QModelIndex &index, const QVarian
ppOverride->setType(
PairPotentialOverride::pairPotentialOverrideTypes().enumeration(value.toString().toStdString()));
break;
case (ColumnData::ShortRangeForm):
case (ColumnData::Form):
ppOverride->interactionPotential().setForm(Functions1D::forms().enumeration(value.toString().toStdString()));
break;
case (ColumnData::ShortRangeParameters):
case (ColumnData::Parameters):
if (!ppOverride->interactionPotential().parseParameters(value.toString().toStdString()))
return false;
break;
Expand Down Expand Up @@ -114,9 +111,9 @@ QVariant PairPotentialOverrideModel::headerData(int section, Qt::Orientation ori
return "Match J";
case (ColumnData::OverrideType):
return "Type";
case (ColumnData::ShortRangeForm):
case (ColumnData::Form):
return "Form";
case (ColumnData::ShortRangeParameters):
case (ColumnData::Parameters):
return "Parameters";
default:
return {};
Expand All @@ -129,3 +126,39 @@ void PairPotentialOverrideModel::reset()
beginResetModel();
endResetModel();
}

bool PairPotentialOverrideModel::insertRows(int row, int count, const QModelIndex &parent)
{
Q_UNUSED(count);
beginInsertRows(parent, row, row);
data_.insert(data_.begin() + row, std::make_unique<PairPotentialOverride>());
endInsertRows();
return true;
}

bool PairPotentialOverrideModel::removeRows(int row, int count, const QModelIndex &parent)
{
Q_UNUSED(count);
if (row >= rowCount() || row < 0)
{
return false;
}

beginRemoveRows(parent, row, row);
data_.erase(data_.begin() + row);
endRemoveRows();

return true;
}

bool PairPotentialOverrideModel::duplicateRow(int row)
{
auto *override = rawData(row);

beginInsertRows({}, row, row);
data_.insert(data_.begin() + row,
std::make_unique<PairPotentialOverride>(override->matchI(), override->matchJ(), override->type(),
override->interactionPotential()));
endInsertRows();
return true;
}
11 changes: 7 additions & 4 deletions src/gui/models/pairPotentialOverrideModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ class PairPotentialOverrideModel : public QAbstractListModel
MatchI,
MatchJ,
OverrideType,
ShortRangeForm,
ShortRangeParameters,
Form,
Parameters,
nColumnData
};
PairPotentialOverrideModel(std::vector<std::unique_ptr<PairPotentialOverride>> &data_);
~PairPotentialOverrideModel() = default;
const PairPotentialOverride *rawData(const QModelIndex index) const;
PairPotentialOverride *rawData(const QModelIndex index);
const PairPotentialOverride *rawData(int row) const;
PairPotentialOverride *rawData(int row);
// Update the table contents
void reset();

Expand All @@ -45,4 +45,7 @@ class PairPotentialOverrideModel : public QAbstractListModel
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
Qt::ItemFlags flags(const QModelIndex &index) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
bool duplicateRow(int row);
};