Source code for aiida_gulp.parsers.raw.write_input_fitting

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright 2019 Chris Sewell
#
# This file is part of aiida-gulp.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms and conditions
# of version 3 of the GNU Lesser General Public License.
#
# 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 Lesser General Public License for more details.
from aiida_gulp.parsers.raw.write_geometry import create_geometry_lines


[docs]def create_input_lines( potential, structures, observable_datas, observables, delta=None, dump_file="fitting.grs", ): """create the input file for a potential fitting Parameters ---------- potential : aiida_gulp.data.potential.EmpiricalPotential must include fitting flags structures : dict[str, aiida.StructureData] mapping of structure names to structures observable_datas : dict[str, aiida.orm.Dict] mapping of structure names to observable data for the structure (must have same keys as structures) observables: None or dict[str, callable] mapping of observable to a function that returns (value, weighting) from the observable_data. delta: None or float differencing interval for gradients (default 0.00001 or 0.0001 for relax) dump_file : str the name of the output dump file Returns ------- list[str] the input lines list[str] a list of the structure names, in the order they appear in the input """ lines = [] snames = [] # intial key words lines.append("fit noflags") lines.append("") if delta is not None: lines.append("delta") lines.append("{0:.8f}".format(delta)) lines.append("") # The following command makes a uniform shift # to the energies of all structures to remove # the constant offset => we are only fitting # the local curvature. lines.extend(["shift", str(1.0)]) lines.append("") for name in sorted(structures.keys()): snames.append(name) lines.extend(create_geometry_lines(structures[name], name=name)) lines.append("") lines.append("observables") for oname in sorted(observables.keys()): lines.append(oname) value, weighting = observables[oname](observable_datas[name]) lines.append("{0:.8f} {1:.8f}".format(value, weighting)) lines.append("end") lines.append("") # Tell the program to fit the overall shift lines.extend(["vary", "shift", "end"]) lines.append("") # Force Field lines.extend(potential.get_input_lines()) lines.append("") lines.append("dump {}".format(dump_file)) # NOTE can also dump every interval ('noover' will output to separate files) return lines, snames