Skip to content

Commit a5278e9

Browse files
authored
Merge pull request #281 from OpenBioSim/feature_membrane_barostat
Add support for OpenMM MonteCarloMembraneBarostat
2 parents b3a566b + b29e168 commit a5278e9

14 files changed

+284
-44
lines changed

corelib/src/libs/SireMove/openmmfrenergydt.cpp

+37-8
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ QDataStream &operator<<(QDataStream &ds, const OpenMMFrEnergyDT &velver)
129129

130130
sds << velver.frequent_save_velocities << velver.molgroup << velver.solutegroup << velver.CutoffType
131131
<< velver.cutoff_distance << velver.field_dielectric << velver.Andersen_flag << velver.Andersen_frequency
132-
<< velver.MCBarostat_flag << velver.MCBarostat_frequency << velver.ConstraintType << velver.Pressure
132+
<< velver.MCBarostat_flag << velver.MCBarostat_membrane_flag << velver.MCBarostat_frequency << velver.ConstraintType << velver.Pressure
133133
<< velver.Temperature << velver.platform_type << velver.Restraint_flag << velver.CMMremoval_frequency
134134
<< velver.energy_frequency << velver.device_index << velver.Alchemical_value << velver.coulomb_power
135135
<< velver.shift_delta << velver.delta_alchemical << velver.buffer_coords << velver.gradients
@@ -151,7 +151,7 @@ QDataStream &operator>>(QDataStream &ds, OpenMMFrEnergyDT &velver)
151151

152152
sds >> velver.frequent_save_velocities >> velver.molgroup >> velver.solutegroup >> velver.CutoffType >>
153153
velver.cutoff_distance >> velver.field_dielectric >> velver.Andersen_flag >> velver.Andersen_frequency >>
154-
velver.MCBarostat_flag >> velver.MCBarostat_frequency >> velver.ConstraintType >> velver.Pressure >>
154+
velver.MCBarostat_flag >> velver.MCBarostat_membrane_flag >> velver.MCBarostat_frequency >> velver.ConstraintType >> velver.Pressure >>
155155
velver.Temperature >> velver.platform_type >> velver.Restraint_flag >> velver.CMMremoval_frequency >>
156156
velver.energy_frequency >> velver.device_index >> velver.Alchemical_value >> velver.coulomb_power >>
157157
velver.shift_delta >> velver.delta_alchemical >> velver.buffer_coords >> velver.gradients >>
@@ -175,7 +175,7 @@ OpenMMFrEnergyDT::OpenMMFrEnergyDT(bool frequent_save)
175175
: ConcreteProperty<OpenMMFrEnergyDT, Integrator>(), frequent_save_velocities(frequent_save),
176176
molgroup(MoleculeGroup()), solutegroup(MoleculeGroup()), openmm_system(0), isInitialised(false),
177177
CutoffType("nocutoff"), cutoff_distance(1.0 * nanometer), field_dielectric(78.3), Andersen_flag(false),
178-
Andersen_frequency(90.0), MCBarostat_flag(false), MCBarostat_frequency(25), ConstraintType("none"),
178+
Andersen_frequency(90.0), MCBarostat_flag(false), MCBarostat_membrane_flag(false), MCBarostat_frequency(25), ConstraintType("none"),
179179
Pressure(1.0 * bar), Temperature(300.0 * kelvin), platform_type("Reference"), Restraint_flag(false),
180180
CMMremoval_frequency(0), energy_frequency(100), device_index("0"), Alchemical_value(0.5), coulomb_power(0),
181181
shift_delta(2.0), delta_alchemical(0.001), buffer_coords(false), gradients()
@@ -188,7 +188,7 @@ OpenMMFrEnergyDT::OpenMMFrEnergyDT(const MoleculeGroup &molecule_group, const Mo
188188
: ConcreteProperty<OpenMMFrEnergyDT, Integrator>(), frequent_save_velocities(frequent_save),
189189
molgroup(molecule_group), solutegroup(solute_group), openmm_system(0), isInitialised(false),
190190
CutoffType("nocutoff"), cutoff_distance(1.0 * nanometer), field_dielectric(78.3), Andersen_flag(false),
191-
Andersen_frequency(90.0), MCBarostat_flag(false), MCBarostat_frequency(25), ConstraintType("none"),
191+
Andersen_frequency(90.0), MCBarostat_flag(false), MCBarostat_membrane_flag(false), MCBarostat_frequency(25), ConstraintType("none"),
192192
Pressure(1.0 * bar), Temperature(300.0 * kelvin), platform_type("Reference"), Restraint_flag(false),
193193
CMMremoval_frequency(0), energy_frequency(100), device_index("0"), Alchemical_value(0.5), coulomb_power(0),
194194
shift_delta(2.0), delta_alchemical(0.001), buffer_coords(false), gradients()
@@ -201,7 +201,7 @@ OpenMMFrEnergyDT::OpenMMFrEnergyDT(const OpenMMFrEnergyDT &other)
201201
molgroup(other.molgroup), solutegroup(other.solutegroup), openmm_system(other.openmm_system),
202202
isInitialised(other.isInitialised), CutoffType(other.CutoffType), cutoff_distance(other.cutoff_distance),
203203
field_dielectric(other.field_dielectric), Andersen_flag(other.Andersen_flag),
204-
Andersen_frequency(other.Andersen_frequency), MCBarostat_flag(other.MCBarostat_flag),
204+
Andersen_frequency(other.Andersen_frequency), MCBarostat_flag(other.MCBarostat_flag), MCBarostat_membrane_flag(other.MCBarostat_membrane_flag),
205205
MCBarostat_frequency(other.MCBarostat_frequency), ConstraintType(other.ConstraintType), Pressure(other.Pressure),
206206
Temperature(other.Temperature), platform_type(other.platform_type), Restraint_flag(other.Restraint_flag),
207207
CMMremoval_frequency(other.CMMremoval_frequency), energy_frequency(other.energy_frequency),
@@ -232,6 +232,7 @@ OpenMMFrEnergyDT &OpenMMFrEnergyDT::operator=(const OpenMMFrEnergyDT &other)
232232
Andersen_flag = other.Andersen_flag;
233233
Andersen_frequency = other.Andersen_frequency;
234234
MCBarostat_flag = other.MCBarostat_flag;
235+
MCBarostat_membrane_flag = other.MCBarostat_membrane_flag;
235236
MCBarostat_frequency = other.MCBarostat_frequency;
236237
ConstraintType = other.ConstraintType;
237238
Pressure = other.Pressure;
@@ -521,16 +522,32 @@ void OpenMMFrEnergyDT::initialise()
521522
const double converted_Temperature = convertTo(Temperature.value(), kelvin);
522523
const double converted_Pressure = convertTo(Pressure.value(), bar);
523524

524-
OpenMM::MonteCarloBarostat *barostat =
525-
new OpenMM::MonteCarloBarostat(converted_Pressure, converted_Temperature, MCBarostat_frequency);
526-
system_openmm->addForce(barostat);
525+
if (MCBarostat_membrane_flag)
526+
{
527+
// Simple options for now: zero surface tension, XY isotropic, Z free
528+
const double surface_Tension = 0;
529+
OpenMM::MonteCarloMembraneBarostat::XYMode xymode = OpenMM::MonteCarloMembraneBarostat::XYIsotropic;
530+
OpenMM::MonteCarloMembraneBarostat::ZMode zmode = OpenMM::MonteCarloMembraneBarostat::ZFree;
531+
OpenMM::MonteCarloMembraneBarostat * barostat = new OpenMM::MonteCarloMembraneBarostat(converted_Pressure, surface_Tension, converted_Temperature, xymode, zmode, MCBarostat_frequency);
532+
system_openmm->addForce(barostat);
533+
}
534+
else
535+
{
536+
OpenMM::MonteCarloBarostat *barostat =
537+
new OpenMM::MonteCarloBarostat(converted_Pressure, converted_Temperature, MCBarostat_frequency);
538+
system_openmm->addForce(barostat);
539+
}
527540

528541
if (Debug)
529542
{
530543
qDebug() << "\nMonte Carlo Barostat set\n";
531544
qDebug() << "Temperature = " << converted_Temperature << " K\n";
532545
qDebug() << "Pressure = " << converted_Pressure << " bar\n";
533546
qDebug() << "Frequency every " << MCBarostat_frequency << " steps\n";
547+
if (MCBarostat_membrane_flag)
548+
{
549+
qDebug() << "Membrane barostat, surface tension 0, XY isotropic, Z free\n";
550+
}
534551
}
535552
}
536553

@@ -1795,6 +1812,18 @@ bool OpenMMFrEnergyDT::getMCBarostat(void)
17951812
return MCBarostat_flag;
17961813
}
17971814

1815+
/** Set Monte Carlo membrane Barostat on/off */
1816+
void OpenMMFrEnergyDT::setMCBarostat_membrane(bool MCBarostat_membrane)
1817+
{
1818+
MCBarostat_membrane_flag = MCBarostat_membrane;
1819+
}
1820+
1821+
bool OpenMMFrEnergyDT::getMCBarostat_membrane(void)
1822+
{
1823+
1824+
return MCBarostat_membrane_flag;
1825+
}
1826+
17981827
/** Get the Monte Carlo Barostat frequency in time speps */
17991828
int OpenMMFrEnergyDT::getMCBarostat_frequency(void)
18001829
{

corelib/src/libs/SireMove/openmmfrenergydt.h

+4
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ namespace SireMove
114114
void setMCBarostat_frequency(int);
115115
int getMCBarostat_frequency(void);
116116

117+
bool getMCBarostat_membrane(void);
118+
void setMCBarostat_membrane(bool);
119+
117120
QString getConstraintType(void);
118121
void setConstraintType(QString);
119122

@@ -180,6 +183,7 @@ namespace SireMove
180183
double Andersen_frequency;
181184

182185
bool MCBarostat_flag;
186+
bool MCBarostat_membrane_flag;
183187
int MCBarostat_frequency;
184188

185189
QString ConstraintType;

corelib/src/libs/SireMove/openmmfrenergyst.cpp

+42-11
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ QDataStream &operator<<(QDataStream &ds, const OpenMMFrEnergyST &velver)
130130
sds << velver.frequent_save_velocities << velver.molgroup << velver.solute << velver.solutehard
131131
<< velver.solutetodummy << velver.solutefromdummy << velver.combiningRules << velver.CutoffType
132132
<< velver.cutoff_distance << velver.field_dielectric << velver.Andersen_flag << velver.Andersen_frequency
133-
<< velver.MCBarostat_flag << velver.MCBarostat_frequency << velver.ConstraintType << velver.Pressure
133+
<< velver.MCBarostat_flag << velver.MCBarostat_membrane_flag << velver.MCBarostat_frequency << velver.ConstraintType << velver.Pressure
134134
<< velver.Temperature << velver.platform_type << velver.Restraint_flag << velver.CMMremoval_frequency
135135
<< velver.buffer_frequency << velver.energy_frequency << velver.device_index << velver.precision
136136
<< velver.Alchemical_value << velver.coulomb_power << velver.shift_delta << velver.delta_alchemical
@@ -152,7 +152,7 @@ QDataStream &operator>>(QDataStream &ds, OpenMMFrEnergyST &velver)
152152
sds >> velver.frequent_save_velocities >> velver.molgroup >> velver.solute >> velver.solutehard >>
153153
velver.solutetodummy >> velver.solutefromdummy >> velver.combiningRules >> velver.CutoffType >>
154154
velver.cutoff_distance >> velver.field_dielectric >> velver.Andersen_flag >> velver.Andersen_frequency >>
155-
velver.MCBarostat_flag >> velver.MCBarostat_frequency >> velver.ConstraintType >> velver.Pressure >>
155+
velver.MCBarostat_flag >> velver.MCBarostat_membrane_flag >> velver.MCBarostat_frequency >> velver.ConstraintType >> velver.Pressure >>
156156
velver.Temperature >> velver.platform_type >> velver.Restraint_flag >> velver.CMMremoval_frequency >>
157157
velver.buffer_frequency >> velver.energy_frequency >> velver.device_index >> velver.precision >>
158158
velver.Alchemical_value >> velver.coulomb_power >> velver.shift_delta >> velver.delta_alchemical >>
@@ -180,7 +180,7 @@ OpenMMFrEnergyST::OpenMMFrEnergyST(bool frequent_save)
180180
solutefromdummy(MoleculeGroup()), openmm_system(0), openmm_context(0), isSystemInitialised(false),
181181
isContextInitialised(false), combiningRules("arithmetic"), CutoffType("nocutoff"),
182182
cutoff_distance(1.0 * nanometer), field_dielectric(78.3), Andersen_flag(false), Andersen_frequency(90.0),
183-
MCBarostat_flag(false), MCBarostat_frequency(25), ConstraintType("none"), Pressure(1.0 * bar),
183+
MCBarostat_flag(false), MCBarostat_membrane_flag(false), MCBarostat_frequency(25), ConstraintType("none"), Pressure(1.0 * bar),
184184
Temperature(300.0 * kelvin), platform_type("Reference"), Restraint_flag(false), CMMremoval_frequency(0),
185185
buffer_frequency(0), energy_frequency(100), device_index("0"), precision("single"), Alchemical_value(0.5),
186186
coulomb_power(0), shift_delta(2.0), delta_alchemical(0.001), alchemical_array(), finite_diff_gradients(),
@@ -199,7 +199,7 @@ OpenMMFrEnergyST::OpenMMFrEnergyST(const MoleculeGroup &molecule_group, const Mo
199199
solutefromdummy(solute_fromdummy), openmm_system(0), openmm_context(0), isSystemInitialised(false),
200200
isContextInitialised(false), combiningRules("arithmetic"), CutoffType("nocutoff"),
201201
cutoff_distance(1.0 * nanometer), field_dielectric(78.3), Andersen_flag(false), Andersen_frequency(90.0),
202-
MCBarostat_flag(false), MCBarostat_frequency(25), ConstraintType("none"), Pressure(1.0 * bar),
202+
MCBarostat_flag(false), MCBarostat_membrane_flag(false), MCBarostat_frequency(25), ConstraintType("none"), Pressure(1.0 * bar),
203203
Temperature(300.0 * kelvin), platform_type("Reference"), Restraint_flag(false), CMMremoval_frequency(0),
204204
buffer_frequency(0), energy_frequency(100), device_index("0"), precision("single"), Alchemical_value(0.5),
205205
coulomb_power(0), shift_delta(2.0), delta_alchemical(0.001), alchemical_array(), finite_diff_gradients(),
@@ -217,7 +217,7 @@ OpenMMFrEnergyST::OpenMMFrEnergyST(const OpenMMFrEnergyST &other)
217217
isSystemInitialised(other.isSystemInitialised), isContextInitialised(other.isContextInitialised),
218218
combiningRules(other.combiningRules), CutoffType(other.CutoffType), cutoff_distance(other.cutoff_distance),
219219
field_dielectric(other.field_dielectric), Andersen_flag(other.Andersen_flag),
220-
Andersen_frequency(other.Andersen_frequency), MCBarostat_flag(other.MCBarostat_flag),
220+
Andersen_frequency(other.Andersen_frequency), MCBarostat_flag(other.MCBarostat_flag), MCBarostat_membrane_flag(other.MCBarostat_membrane_flag),
221221
MCBarostat_frequency(other.MCBarostat_frequency), ConstraintType(other.ConstraintType), Pressure(other.Pressure),
222222
Temperature(other.Temperature), platform_type(other.platform_type), Restraint_flag(other.Restraint_flag),
223223
CMMremoval_frequency(other.CMMremoval_frequency), buffer_frequency(other.buffer_frequency),
@@ -259,6 +259,7 @@ OpenMMFrEnergyST &OpenMMFrEnergyST::operator=(const OpenMMFrEnergyST &other)
259259
Andersen_flag = other.Andersen_flag;
260260
Andersen_frequency = other.Andersen_frequency;
261261
MCBarostat_flag = other.MCBarostat_flag;
262+
MCBarostat_membrane_flag = other.MCBarostat_membrane_flag;
262263
MCBarostat_frequency = other.MCBarostat_frequency;
263264
ConstraintType = other.ConstraintType;
264265
Pressure = other.Pressure;
@@ -302,7 +303,7 @@ bool OpenMMFrEnergyST::operator==(const OpenMMFrEnergyST &other) const
302303
combiningRules == other.combiningRules and CutoffType == other.CutoffType and
303304
cutoff_distance == other.cutoff_distance and field_dielectric == other.field_dielectric and
304305
Andersen_flag == other.Andersen_flag and Andersen_frequency == other.Andersen_frequency and
305-
MCBarostat_flag == other.MCBarostat_flag and MCBarostat_frequency == other.MCBarostat_frequency and
306+
MCBarostat_flag == other.MCBarostat_flag and MCBarostat_membrane_flag == other.MCBarostat_membrane_flag and MCBarostat_frequency == other.MCBarostat_frequency and
306307
ConstraintType == other.ConstraintType and Pressure == other.Pressure and
307308
Temperature == other.Temperature and platform_type == other.platform_type and
308309
Restraint_flag == other.Restraint_flag and CMMremoval_frequency == other.CMMremoval_frequency and
@@ -1241,20 +1242,40 @@ void OpenMMFrEnergyST::initialise()
12411242
const double converted_Temperature = convertTo(Temperature.value(), kelvin);
12421243
const double converted_Pressure = convertTo(Pressure.value(), bar);
12431244

1244-
OpenMM::MonteCarloBarostat *barostat =
1245-
new OpenMM::MonteCarloBarostat(converted_Pressure, converted_Temperature, MCBarostat_frequency);
1245+
if (MCBarostat_membrane_flag == true)
1246+
{
1247+
// Simple options for now: zero surface tension, XY isotropic, Z free
1248+
const double surface_Tension = 0;
1249+
OpenMM::MonteCarloMembraneBarostat::XYMode xymode = OpenMM::MonteCarloMembraneBarostat::XYIsotropic;
1250+
OpenMM::MonteCarloMembraneBarostat::ZMode zmode = OpenMM::MonteCarloMembraneBarostat::ZFree;
1251+
OpenMM::MonteCarloMembraneBarostat * barostat = new OpenMM::MonteCarloMembraneBarostat(converted_Pressure, surface_Tension, converted_Temperature, xymode, zmode, MCBarostat_frequency);
12461252

1247-
// Set The random seed
1248-
barostat->setRandomNumberSeed(random_seed);
1253+
//Set The random seed
1254+
barostat->setRandomNumberSeed(random_seed);
1255+
1256+
system_openmm->addForce(barostat);
1257+
}
1258+
else
1259+
{
1260+
OpenMM::MonteCarloBarostat *barostat =
1261+
new OpenMM::MonteCarloBarostat(converted_Pressure, converted_Temperature, MCBarostat_frequency);
12491262

1250-
system_openmm->addForce(barostat);
1263+
// Set The random seed
1264+
barostat->setRandomNumberSeed(random_seed);
1265+
1266+
system_openmm->addForce(barostat);
1267+
}
12511268

12521269
if (Debug)
12531270
{
12541271
qDebug() << "\nMonte Carlo Barostat set\n";
12551272
qDebug() << "Temperature = " << converted_Temperature << " K\n";
12561273
qDebug() << "Pressure = " << converted_Pressure << " bar\n";
12571274
qDebug() << "Frequency every " << MCBarostat_frequency << " steps\n";
1275+
if (MCBarostat_membrane_flag)
1276+
{
1277+
qDebug() << "Membrane barostat, surface tension 0, XY isotropic, Z free\n";
1278+
}
12581279
}
12591280
}
12601281
/*******************************************************BONDED
@@ -4351,6 +4372,16 @@ bool OpenMMFrEnergyST::getMCBarostat(void)
43514372
return MCBarostat_flag;
43524373
}
43534374

4375+
void OpenMMFrEnergyST::setMCBarostatMembrane(bool MCBarostat_membrane)
4376+
{
4377+
MCBarostat_membrane_flag = MCBarostat_membrane;
4378+
}
4379+
4380+
bool OpenMMFrEnergyST::getMCBarostatMembrane(void)
4381+
{
4382+
return MCBarostat_membrane_flag;
4383+
}
4384+
43544385
/** Get the Monte Carlo Barostat frequency in time speps */
43554386
int OpenMMFrEnergyST::getMCBarostatFrequency(void)
43564387
{

corelib/src/libs/SireMove/openmmfrenergyst.h

+4
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@ namespace SireMove
122122
bool getMCBarostat(void);
123123
void setMCBarostat(bool);
124124

125+
bool getMCBarostatMembrane(void);
126+
void setMCBarostatMembrane(bool);
127+
125128
void setMCBarostatFrequency(int);
126129
int getMCBarostatFrequency(void);
127130

@@ -247,6 +250,7 @@ namespace SireMove
247250
double Andersen_frequency;
248251

249252
bool MCBarostat_flag;
253+
bool MCBarostat_membrane_flag;
250254
int MCBarostat_frequency;
251255

252256
QString ConstraintType;

0 commit comments

Comments
 (0)