********************************* Classical forcefield calculations ********************************* Until now our examples have used quantum mechanical programs for the evaluation of energies and gradients. From a user point of view first principle ab initio calculations are simple to set up as they require only a geometry, charge, spin multiplicity and basis set. In this tutorial we look at classical calculations which require a forcefield to be defined, using the example of the `GULP `_ package. The examples can be found in ``samples/forcefields_gulp``. Running GULP from ChemShell =========================== As with the QM programs we have used in earlier tutorials, GULP is an external code and must be obtained separately from its developers. Once you have obtained a copy, you can run GULP either as a standalone program or as a "linked-in" ChemShell library - see the installation guide for details. Shell model calculations for ionic materials ============================================ ChemShell recognises structures with periodic boundary conditions and can pass these to GULP for tasks such as lattice relaxation. In this example, ``mgo.py``, we relax the atomic positions of an MgO lattice. First, the unrelaxed structure is read in from disk:: # Read in MgO crystal data from disk mgo = Fragment(coords="mgo.cjson", shellatoms=[0,1,2,3,4,5,6,7]) Note here that ChemShell supports multiple file formats for reading in atomic data, and here we are using the `Chemical JSON `_ format. This goes beyond XYZ to allow us to specify a unit cell and fractional coordinates for example (take a look at the ``mgo.cjson`` file to see how these are defined). As we are performing a shell model calculation, shells must be added to the MgO when it is read in. This is carried out by adding a ``shellatoms=`` option to the ``Fragment()`` line. Here, we are adding shells to both the Mg and O ions. Next, the forcefield must be defined. This is written in standard GULP format, stored in a triple-quoted (multiline) string that is passed to GULP in its input file:: # Define GULP forcefield for MgO ff = '''species Mg core 1.580 Mg shel 0.420 O core 0.513 O shel -2.513 buckingham Mg shel O shel 2457.243 0.2610 0.00 0.0 10.0 O shel O shel 25.410 0.6937 32.32 0.0 12.0 spring Mg 349.95 O 20.53 ''' There are `libraries of potentials `_ available on the UCL Materials Chemistry web site. Next, the forcefield calculations is set up in a similar way to QM calculations. An additional option ``ff=`` is used to specify the forcefield definition:: # Set up forcefield calculation my_theory = GULP(frag=mgo, ff=ff) Finally, an optimisation is requested in the usual way:: # Request a DL-FIND optimisation opt = Opt(theory=my_theory) opt.run() Note that DL-FIND does not currently support optimisation of cell constants, so the energy is minimised under the constraint of a fixed unit cell. Molecular mechanics for organic systems ======================================= As well as techniques for materials modelling, GULP also supports molecular mechanics (MM) calculations typically used to model organic molecules. In the example ``butanol.py`` we see how an MM calculation is set up for a butanol molecule. As with MgO, the butanol structure is imported from a Chemical JSON file, this time in order to specify partial charges as well as atomic positions:: # Read in butanol structure from disk butanol = Fragment(coords="butanol.cjson") Note that the molecular mechanics forcefield we will be using does not require shells so we do not add shells in this line. Secondly, the forcefield is defined in a standard GULP format as before. Importantly, the keyword ``molmec`` is included to specify that it is a molecular mechanics forcefield:: # molmec removes Coulomb terms between bonded atoms # and between atoms bonded to a common third atom keyword molmec After this comes a list of bond, angle, torsion and van der Waals terms characteristic of a molecular mechanics forcefield. When the GULP calculation is set up, be sure to set the option ``molecule=True`` for a molecular mechanics calculation:: # Set up forcefield calculations my_theory = GULP(frag=butanol, ff=ff, molecule=True) A geometry optimisation is then requested in the usual way. As this is a gas phase molecular system there are no periodic boundary conditions to worry about.