======== Tutorial ======== ------------------ Simple MgO Example ------------------ DFTFIT is a software that is used to produce interatomic potentials for molecular dynamics simulations. The goal of the code is to enable scientists to use more accurate simulation methods to guide the construction of these potentials. For this example we will be using VASP calculations. The dft training data consists of: - equilibrium structure - displaced structures :math:`0.01 \unicode{x212B} - 0.04 \unicode{x212B}` - deformed structures :math:`\pm\%2` normal, :math:`\pm\%8` shear - random perturbed structures :math:`0.04 \unicode{x212B}` .. image:: images/mgo-training-sets-goal.png For this example all the training structures are stored in a `cached database `_. DFTFIT uses a cache so that it does not have to reparse all input vasp and quantum espresso input files. From this cache we get 131 training structures. - 1 equilibrium structure - 6 x 10 deformed structures - 2 x 5 displaced structures - 60 perturbed structures Now that we have all of our input files we now need to configure our dftfit potential fitting. We are studing $MgO$ which most commonly uses a buckingham potential with each atom having a charge. .. math:: U_{Mg - Mg} (A_1, \rho_1, C_1) \quad U_{Mg - O} (A_2, \rho_2, C_2) \quad U_{O - O} (A_3, \rho_3, C_3) q_{Mg} = -q_{O} This leads to 10 free parameters. .. math:: A_1, \rho_1, C_1, A_2, \rho_2, C_2, A_3, \rho_3, C_3, q_{Mg} DFTFIT configuration is intentionally separated into 3 parts: potential, training structures, dftfit configuration. Let us look at an example potential file. In this case we will be looking at the `lewis-catlow potential for MgO `_. .. code-block:: yaml version: v1 kind: Potential spec: constraint: charge_balance: MgO charge: Mg: {'initial': 2.0, 'bounds': [1.3, 2]} O: {'initial': -2.0, 'bounds': [-2, -1.3]} kspace: type: pppm tollerance: 1e-5 pair: type: buckingham cutoff: 10.0 parameters: - elements: ['Mg', 'Mg'] coefficients: - {'initial': 0.1, 'bounds': [1e-6, 1000]} - {'initial': 0.1, 'bounds': [1e-6, 1e2]} - 0.0 - elements: ['Mg', 'O'] coefficients: - {'initial': 821.61, 'bounds': [10, 1e4]} - {'initial': 0.324199, 'bounds': [1e-6, 1e2]} - 0.0 - elements: ['O', 'O'] coefficients: - {'initial': 22764.915, 'bounds': [1e3, 1e6]} - {'initial': 0.14899, 'bounds': [1e-3, 1e2]} - {'initial': 20.3705, 'bounds': [1, 1e3]} Currently DFTFIT supports any float value in the input file to be a parameter for the optimization. This even means that the buckingham cutoff radius can be an optimization parameter. Additionally, DFTFIT has been designed such that it is possible to determine if two potential parameter files are using the same potential form (I am quite proud of this feature). It is not perfect but will work for %90 of all cases. The form for a parameter is ``{'initial': , 'bound': [,]}``. There is planned support in the future for spline function parameters. This would be useful for example in constructing EAM potentials. Next the training structures need to be defined for input. The current input file uses calculations generated with my own framework ``mattoolkit`` however vasp and quantum espresso are also supported. The actual input file in the examples is much longer. We can see that it is a list of calculations to include. In the case of mattoolkit all calculations are chosen using a selector. All calculations that match the labels ``project:potential_fitting``, ``structrue:MgO``, ``calculation_type:static``, ``calculation_group:lattice_constant``. If you haven't done it already, when you accumulate a lot of data it is important to assign metadata to all of your calculations. This makes the calculations much easier to select. .. code-block:: yaml version: v1 kind: Training spec: - type: mattoolkit selector: labels: - project:potential_fitting - structrue:MgO - calculation_type:static - calculation_group:lattice_constant Finally we have the DFTFIT configuration. The configuration is quite flexible. .. code-block:: yaml version: v1 kind: Configuration metadata: name: testing labels: algorithm: "pygmo.sade" test: test spec: logging: INFO database: interval: 10 filename: "/tmp/dftfit/database.db" algorithm: name: 'pygmo.sade' steps: 10 population: 10 problem: calculator: 'lammps_cython' num_workers: 3 weights: force: 0.3 stress: 0.6 energy: 0.1 training: cache_filename: "./cache/cache.db" The ``metadata`` section is for providing information about the calculation. The ``name`` property needs to be a string. While the ``labels`` are key value pairs that must both be strings. The key value pairs can be anything. Now we have the parameters that actually affect the calculation. logging *default is WARNING* it is used to print information during the run. Stick with WARNING for a much much cleaner stdout database if specified provide the location for the sqlite3 database steps *required* number of optimization steps population *required* number of potential parameters sets to solve at each iteration algorithm *required* the optimization algorithm to use a good one to start using is SADE. See `pagmo2 algorithmn documentation `_. problem.calculator molecular dynamics calculator to use lammps is the only one for now problem.command command to run to start calculator *make sure command matches calculator!* problem.num_workers determines the parallelism. Currently DFTFIT doesn't scale well past 8 processors. Each processor does about 150 calculations/second. weights features to calculate and the associated weights. Can be ``None`` for value. training.cache_filename where to store the caches parsed training calculations If is a global optimization algorithm is chosen random population points will be chosen. After the configuration file has been setup you are ready to go! The optimization can be simply run using the ``dftfit`` command installed when installing the python package. Run the command within the ``examples/mgo`` folder. .. code-block:: shell dftfit train -c configuration.yaml -p potential.yaml -t training.yaml Since the example configuration only run 10 * 10 = 100 optimization steps the potential really will not improve. For my calculations I do 100,000 optimization steps with each step taking less than a fraction of a second. In total 100,000 steps takes about 10-12 hours. DFTFIT comes with tools for investigating the results from the optimization. TODO add more.