Skip to content

Commit

Permalink
refactor BaseLammpsCalculation, by moving _generate_input_function in…
Browse files Browse the repository at this point in the history
…to class

Also:

- store potential input lines with {kind_symbols} placeholder, rather than specifying upfront.
  This allows the EmpiricalPotential nodes to be more reusable for multiple structures, with different atom types.
- add allowed_element_names to potential data
- improve reaxff_convert.write_lammps_format handling of X species
  • Loading branch information
chrisjsewell committed Sep 29, 2020
1 parent ea2a1be commit 71fa4c4
Show file tree
Hide file tree
Showing 28 changed files with 1,889 additions and 499 deletions.
25 changes: 20 additions & 5 deletions aiida_lammps/calculations/lammps/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,16 +217,30 @@ def validate_parameters(self, param_data, potential_object):
def prepare_extra_files(self, tempfolder, potential_object):
return True

def create_main_input_content(
self,
parameter_data,
potential_data,
kind_symbols,
structure_filename,
trajectory_filename,
info_filename,
restart_filename,
add_thermo_keywords,
version_date,
):
raise NotImplementedError

def prepare_for_submission(self, tempfolder):
"""Create the input files from the input nodes passed to this instance of the `CalcJob`.
:param tempfolder: an `aiida.common.folders.Folder` to temporarily write files on disk
:return: `aiida.common.CalcInfo` instance
"""
# assert that the potential and structure have the same kind elements
if [
if self.inputs.potential.allowed_element_names is not None and not set(
k.symbol for k in self.inputs.structure.kinds
] != self.inputs.potential.kind_elements:
).issubset(self.inputs.potential.allowed_element_names):
raise ValidationError(
"the structure and potential are not compatible (different kind elements)"
)
Expand All @@ -251,9 +265,10 @@ def prepare_for_submission(self, tempfolder):
lammps_date = convert_date_string(pdict.get("lammps_version", "11 Aug 2017"))

# Setup input parameters
input_txt = self._generate_input_function(
parameters=parameters,
potential_obj=self.inputs.potential,
input_txt = self.create_main_input_content(
parameter_data=parameters,
potential_data=self.inputs.potential,
kind_symbols=[kind.symbol for kind in self.inputs.structure.kinds],
structure_filename=self._INPUT_STRUCTURE,
trajectory_filename=self.options.trajectory_name,
info_filename=self.options.info_filename,
Expand Down
73 changes: 39 additions & 34 deletions aiida_lammps/calculations/lammps/combinate.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,39 +42,6 @@ def generate_dynaphopy_input(
return input_file


def generate_LAMMPS_input(
parameters, potential_obj, structure_file="potential.pot", trajectory_file=None
):

random_number = np.random.randint(10000000)

# names_str = " ".join(potential_obj._names)

lammps_input_file = "units {0}\n".format(potential_obj.default_units)
lammps_input_file += "boundary p p p\n"
lammps_input_file += "box tilt large\n"
lammps_input_file += "atom_style {0}\n".format(potential_obj.atom_style)
lammps_input_file += "read_data {}\n".format(structure_file)

lammps_input_file += potential_obj.get_input_potential_lines()

lammps_input_file += "neighbor 0.3 bin\n"
lammps_input_file += "neigh_modify every 1 delay 0 check no\n"

lammps_input_file += "velocity all create {0} {1} dist gaussian mom yes\n".format(
parameters.dict.temperature, random_number
)
lammps_input_file += "velocity all scale {}\n".format(
parameters.dict.temperature
)

lammps_input_file += "fix int all nvt temp {0} {0} {1}\n".format(
parameters.dict.temperature, parameters.dict.thermostat_variable
)

return lammps_input_file


class CombinateCalculation(BaseLammpsCalculation):

_POSCAR_NAME = "POSCAR"
Expand All @@ -84,7 +51,6 @@ class CombinateCalculation(BaseLammpsCalculation):
_OUTPUT_FORCE_CONSTANTS = "FORCE_CONSTANTS_OUT"
_OUTPUT_QUASIPARTICLES = "quasiparticles_data.yaml"
_OUTPUT_FILE_NAME = "OUTPUT"
_generate_input_function = generate_LAMMPS_input

# self._retrieve_list = [self._OUTPUT_QUASIPARTICLES, self._OUTPUT_FORCE_CONSTANTS, self._OUTPUT_FILE_NAME]

Expand All @@ -104,6 +70,45 @@ def define(cls, spec):

# spec.input('settings', valid_type=six.string_types, default='lammps.optimize')

def create_main_input_content(
self,
parameter_data,
potential_data,
structure_data,
structure_filename,
trajectory_filename,
info_filename,
restart_filename,
add_thermo_keywords,
version_date,
):

random_number = np.random.randint(10000000)

lammps_input_file = "units {0}\n".format(potential_data.default_units)
lammps_input_file += "boundary p p p\n"
lammps_input_file += "box tilt large\n"
lammps_input_file += "atom_style {0}\n".format(potential_data.atom_style)
lammps_input_file += "read_data {}\n".format(structure_filename)

lammps_input_file += potential_data.get_input_lines(structure_data)

lammps_input_file += "neighbor 0.3 bin\n"
lammps_input_file += "neigh_modify every 1 delay 0 check no\n"

lammps_input_file += "velocity all create {0} {1} dist gaussian mom yes\n".format(
parameter_data.dict.temperature, random_number
)
lammps_input_file += "velocity all scale {}\n".format(
parameter_data.dict.temperature
)

lammps_input_file += "fix int all nvt temp {0} {0} {1}\n".format(
parameter_data.dict.temperature, parameter_data.dict.thermostat_variable
)

return lammps_input_file

def prepare_extra_files(self, tempfolder, potential_object):

if "fore_constants" in self.inputs:
Expand Down
150 changes: 76 additions & 74 deletions aiida_lammps/calculations/lammps/force.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,81 +5,7 @@
import six


def generate_lammps_input(
calc,
parameters,
potential_obj,
structure_filename,
trajectory_filename,
add_thermo_keywords,
version_date="11 Aug 2017",
**kwargs
):

lammps_input_file = "units {0}\n".format(potential_obj.default_units)
lammps_input_file += "boundary p p p\n"
lammps_input_file += "box tilt large\n"
lammps_input_file += "atom_style {0}\n".format(potential_obj.atom_style)

lammps_input_file += "read_data {}\n".format(structure_filename)

lammps_input_file += potential_obj.get_input_potential_lines()

lammps_input_file += "neighbor 0.3 bin\n"
lammps_input_file += "neigh_modify every 1 delay 0 check no\n"

thermo_keywords = ["step", "temp", "epair", "emol", "etotal", "press"]
for kwd in add_thermo_keywords:
if kwd not in thermo_keywords:
thermo_keywords.append(kwd)
lammps_input_file += "thermo_style custom {}\n".format(" ".join(thermo_keywords))

if potential_obj.atom_style == "charge":
dump_variables = "element x y z fx fy fz q"
dump_format = "%4s %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f"
else:
dump_variables = "element x y z fx fy fz"
dump_format = "%4s %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f"

lammps_input_file += "dump aiida all custom 1 {0} {1}\n".format(
trajectory_filename, dump_variables
)

# TODO find exact version when changes were made
if version_date <= convert_date_string("10 Feb 2015"):
dump_mod_cmnd = "format"
else:
dump_mod_cmnd = "format line"

lammps_input_file += 'dump_modify aiida {0} "{1}"\n'.format(
dump_mod_cmnd, dump_format
)

lammps_input_file += "dump_modify aiida sort id\n"
lammps_input_file += "dump_modify aiida element {}\n".format(
" ".join(potential_obj.kind_elements)
)

lammps_input_file += "run 0\n"

variables = parameters.get_attribute("output_variables", [])
for var in variables:
var_alias = var.replace("[", "_").replace("]", "_")
lammps_input_file += "variable {0} equal {1}\n".format(var_alias, var)
lammps_input_file += 'print "final_variable: {0} = ${{{0}}}"\n'.format(
var_alias
)

lammps_input_file += "variable final_energy equal etotal\n"
lammps_input_file += 'print "final_energy: ${final_energy}"\n'

return lammps_input_file


class ForceCalculation(BaseLammpsCalculation):

_generate_input_function = generate_lammps_input

@classmethod
def define(cls, spec):
super(ForceCalculation, cls).define(spec)
Expand All @@ -99,6 +25,82 @@ def define(cls, spec):
help="force data per atom",
)

def create_main_input_content(
self,
parameter_data,
potential_data,
kind_symbols,
structure_filename,
trajectory_filename,
info_filename,
restart_filename,
add_thermo_keywords,
version_date,
):

lammps_input_file = "units {0}\n".format(potential_data.default_units)
lammps_input_file += "boundary p p p\n"
lammps_input_file += "box tilt large\n"
lammps_input_file += "atom_style {0}\n".format(potential_data.atom_style)

lammps_input_file += "read_data {}\n".format(structure_filename)

lammps_input_file += potential_data.get_input_lines(kind_symbols)

lammps_input_file += "neighbor 0.3 bin\n"
lammps_input_file += "neigh_modify every 1 delay 0 check no\n"

thermo_keywords = ["step", "temp", "epair", "emol", "etotal", "press"]
for kwd in add_thermo_keywords:
if kwd not in thermo_keywords:
thermo_keywords.append(kwd)
lammps_input_file += "thermo_style custom {}\n".format(
" ".join(thermo_keywords)
)

if potential_data.atom_style == "charge":
dump_variables = "element x y z fx fy fz q"
dump_format = (
"%4s %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f"
)
else:
dump_variables = "element x y z fx fy fz"
dump_format = "%4s %16.10f %16.10f %16.10f %16.10f %16.10f %16.10f"

lammps_input_file += "dump aiida all custom 1 {0} {1}\n".format(
trajectory_filename, dump_variables
)

# TODO find exact version when changes were made
if version_date <= convert_date_string("10 Feb 2015"):
dump_mod_cmnd = "format"
else:
dump_mod_cmnd = "format line"

lammps_input_file += 'dump_modify aiida {0} "{1}"\n'.format(
dump_mod_cmnd, dump_format
)

lammps_input_file += "dump_modify aiida sort id\n"
lammps_input_file += "dump_modify aiida element {}\n".format(
" ".join(kind_symbols)
)

lammps_input_file += "run 0\n"

variables = parameter_data.get_attribute("output_variables", [])
for var in variables:
var_alias = var.replace("[", "_").replace("]", "_")
lammps_input_file += "variable {0} equal {1}\n".format(var_alias, var)
lammps_input_file += 'print "final_variable: {0} = ${{{0}}}"\n'.format(
var_alias
)

lammps_input_file += "variable final_energy equal etotal\n"
lammps_input_file += 'print "final_energy: ${final_energy}"\n'

return lammps_input_file

def validate_parameters(self, param_data, potential_object):
if param_data is not None:
validate_against_schema(param_data.get_dict(), "force.schema.json")
Expand Down
Loading

0 comments on commit 71fa4c4

Please sign in to comment.