{ "cells": [ { "attachments": {}, "cell_type": "markdown", "id": "ee198b16-8932-470b-ac87-3c1e6c97a6f4", "metadata": {}, "source": [ "## Initial imports" ] }, { "cell_type": "code", "execution_count": 1, "id": "eb831188-8012-4b78-8b20-53e11561fedc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PLAMS working folder: /home/hellstrom/adfhome/scripting/scm/plams/doc/source/examples/AMSCalculator/plams_workdir\n" ] } ], "source": [ "from scm.plams import *\n", "from scm.plams.interfaces.adfsuite.ase_calculator import AMSCalculator\n", "from ase.optimize import BFGS\n", "from ase.build import molecule as ase_build_molecule\n", "from ase.visualize.plot import plot_atoms\n", "import matplotlib.pyplot as plt\n", "\n", "# Before running AMS jobs, you need to call init()\n", "init()\n", "\n", "# In this example AMS runs in AMSWorker mode, so we have no use for the PLAMS working directory\n", "# Let's delete it after the calculations are done\n", "config.erase_workdir = True" ] }, { "attachments": {}, "cell_type": "markdown", "id": "7e9dea97-8d0b-468b-92f4-56d4d9d5aecc", "metadata": {}, "source": [ "## Construct an initial system\n", "Here, we use the ``molecule()`` from ``ase.build`` to construct an ASE Atoms object.\n", "\n", "You could also convert a PLAMS Molecule to the ASE format using ``toASE()``." ] }, { "cell_type": "code", "execution_count": 2, "id": "96392ee2-3464-4a78-9d2a-20ce98a89a3d", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "atoms = ase_build_molecule(\"CH3OH\")\n", "# alternatively:\n", "# atoms = toASE(from_smiles('CO'))\n", "\n", "atoms.set_pbc((True, True, True)) # 3D periodic\n", "atoms.set_cell([4.0, 4.0, 4.0]) # cubic box\n", "\n", "# plot the atoms\n", "plt.figure(figsize=(2, 2))\n", "plt.axis(\"off\")\n", "plot_atoms(atoms, scale=0.5);" ] }, { "attachments": {}, "cell_type": "markdown", "id": "c4290c28-99ed-4165-8336-8e5002677beb", "metadata": {}, "source": [ "## Set the AMS settings\n", "\n", "First, set the AMS settings as you normally would do:" ] }, { "cell_type": "code", "execution_count": 3, "id": "d14d9396-9d82-4c7b-89ef-620f81231d47", "metadata": {}, "outputs": [], "source": [ "s = Settings()\n", "s.input.ams.Task = \"SinglePoint\" # the geometry optimization is handled by ASE\n", "s.input.ams.Properties.Gradients = \"Yes\" # ensures the forces are returned\n", "s.input.ams.Properties.StressTensor = \"Yes\" # ensures the stress tensor is returned\n", "\n", "# Engine definition, could also be used to set up ADF, ReaxFF, ...\n", "s.input.ForceField.Type = \"UFF\"\n", "\n", "# run in serial\n", "s.runscript.nproc = 1" ] }, { "attachments": {}, "cell_type": "markdown", "id": "a7aaaee4-7a90-415b-ae6f-ffb0cdafe135", "metadata": {}, "source": [ "## Run the ASE optimizer" ] }, { "cell_type": "code", "execution_count": 4, "id": "cdd10687-2fab-4784-b2c8-a16139641872", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Initial coordinates:\n", "[[-0.047131 0.664389 0. ]\n", " [-0.047131 -0.758551 0. ]\n", " [-1.092995 0.969785 0. ]\n", " [ 0.878534 -1.048458 0. ]\n", " [ 0.437145 1.080376 0.891772]\n", " [ 0.437145 1.080376 -0.891772]]\n", " Step Time Energy fmax\n", "BFGS: 0 15:41:44 0.424475 3.0437\n", "BFGS: 1 15:41:44 0.354817 2.8239\n", "BFGS: 2 15:41:44 0.270256 0.9678\n", "BFGS: 3 15:41:44 0.223897 0.6128\n", "BFGS: 4 15:41:44 0.200223 0.5503\n", "BFGS: 5 15:41:44 0.196200 0.1861\n", "Optimized energy (eV): 0.19620006656661343\n", "Optimized coordinates:\n", "[[-7.36222829e-02 6.46660224e-01 -2.64165697e-17]\n", " [-4.27710560e-02 -7.22615924e-01 8.03241547e-18]\n", " [-1.12651815e+00 9.85598502e-01 7.26450168e-18]\n", " [ 9.22587449e-01 -9.45309675e-01 6.26464128e-18]\n", " [ 4.42945518e-01 1.01179194e+00 9.09790370e-01]\n", " [ 4.42945518e-01 1.01179194e+00 -9.09790370e-01]]\n" ] } ], "source": [ "print(\"Initial coordinates:\")\n", "print(atoms.get_positions())\n", "\n", "with AMSCalculator(settings=s, amsworker=True) as calc:\n", " atoms.set_calculator(calc)\n", " optimizer = BFGS(atoms)\n", " optimizer.run(fmax=0.27) # optimize until forces are smaller than 0.27 eV/ang\n", "\n", "print(f\"Optimized energy (eV): {atoms.get_potential_energy()}\")\n", "print(\"Optimized coordinates:\")\n", "print(atoms.get_positions())" ] }, { "attachments": {}, "cell_type": "markdown", "id": "c8d26db4-b0f6-436b-ae36-4f01d302ef65", "metadata": {}, "source": [ "## Finish PLAMS" ] }, { "cell_type": "code", "execution_count": 5, "id": "4405f270-7ede-444f-a9da-1fa8f96ff3ed", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[14.12|15:41:44] PLAMS run finished. Goodbye\n" ] } ], "source": [ "finish()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.12" } }, "nbformat": 4, "nbformat_minor": 5 }