Page MenuHomec4science

barostats.py
No OneTemporary

File Metadata

Created
Sat, Sep 14, 00:49

barostats.py

"""Deals with creating the barostat class.
Copyright (C) 2013, Joshua More and Michele Ceriotti
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http.//www.gnu.org/licenses/>.
Classes:
InputBaro: Deals with creating the Barostat object from a file, and
writing the checkpoints.
"""
import numpy as np
import ipi.engine.thermostats
from ipi.engine.barostats import *
from ipi.utils.inputvalue import *
from ipi.inputs.thermostats import *
__all__ = ['InputBaro']
class InputBaro(Input):
"""Barostat input class.
Handles generating the appropriate barostat class from the xml input file,
and generating the xml checkpoint tags and data from an
instance of the object.
Attributes:
mode: An optional string giving the type of barostat used. Defaults to
'rigid'.
Fields:
thermostat: A thermostat object giving the cell thermostat.
tau: The time constant associated with the dynamics of the piston.
p: The conjugate momentum to the volume degree of freedom.
"""
attribs={ "mode": (InputAttribute, {"dtype" : str,
"default" : "dummy",
"help" : """The type of barostat. Currently, only a 'isotropic' barostat is implemented, that combines
ideas from the Bussi-Zykova-Parrinello barostat for classical MD with ideas from the
Martyna-Hughes-Tuckerman centroid barostat for PIMD; see Ceriotti, More, Manolopoulos, Comp. Phys. Comm. 2013 for
implementation details.""",
"options" : ["dummy", "isotropic"]}) }
fields={ "thermostat": (InputThermo, {"default" : input_default(factory=ipi.engine.thermostats.Thermostat),
"help" : "The thermostat for the cell. Keeps the cell velocity distribution at the correct temperature. Note that the 'pile_l', 'pile_g', 'nm_gle' and 'nm_gle_g' options will not work for this thermostat."}),
"tau": (InputValue, {"default" : 1.0,
"dtype" : float,
"dimension" : "time",
"help" : "The time constant associated with the dynamics of the piston."}),
"p": (InputArray, { "dtype" : float,
"default" : input_default(factory=np.zeros, args = (0,)),
"help" : "Momentum (or momenta) of the piston.",
"dimension" : "momentum" })
}
default_help = "Simulates an external pressure bath."
default_label = "BAROSTAT"
def store(self, baro):
"""Takes a barostat instance and stores a minimal representation of it.
Args:
baro: A barostat object.
"""
super(InputBaro,self).store(baro)
self.thermostat.store(baro.thermostat)
self.tau.store(baro.tau)
if type(baro) is BaroBZP:
self.mode.store("isotropic")
self.p.store(baro.p)
elif type(baro) is Barostat:
self.mode.store("dummy")
else:
raise TypeError("The type " + type(baro).__name__ + " is not a valid barostat type")
def fetch(self):
"""Creates a barostat object.
Returns:
A barostat object of the appropriate type and with the appropriate
thermostat given the attributes of the InputBaro object.
"""
super(InputBaro,self).fetch()
if self.mode.fetch() == "isotropic":
baro = BaroBZP(thermostat=self.thermostat.fetch(), tau=self.tau.fetch())
if self.p._explicit: baro.p = self.p.fetch()
elif self.mode.fetch() == "dummy":
baro = Barostat(thermostat=self.thermostat.fetch(), tau=self.tau.fetch())
else:
raise ValueError(self.mode.fetch() + " is not a valid mode of barostat")
return baro

Event Timeline