<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Computational Chemistry Group &#187; akhavr</title>
	<atom:link href="http://www.compchem.kiev.ua/index.php/category/akhavr/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.compchem.kiev.ua</link>
	<description>Computational Chemistry Group site</description>
	<lastBuildDate>Wed, 15 Jul 2009 07:47:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>How to create PyQuante forcefield for MMTK.  Part 1.</title>
		<link>http://www.compchem.kiev.ua/index.php/2006/05/how-to-create-pyquante-forcefield-for-mmtk-part-1/</link>
		<comments>http://www.compchem.kiev.ua/index.php/2006/05/how-to-create-pyquante-forcefield-for-mmtk-part-1/#comments</comments>
		<pubDate>Thu, 25 May 2006 18:52:59 +0000</pubDate>
		<dc:creator>akhavr</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[akhavr]]></category>

		<guid isPermaLink="false">http://www.compchem.kiev.ua/?p=9</guid>
		<description><![CDATA[<p>One of the constant activities of Computational Chemistry Group, Kiev is an optimization and a redesign of our computational toolchain.  Being (a) responsible for the software redesign activity (b) chemist by education and (c) programmer by nature, I’ve decided - it’s time to automate all this stuff. Since I love high-level scripting and I love Python, the roadmap was clear to me: find existing python modules that encapsulate things like force field calculations, dynamics or visualization and glue them together. my first step is to create new MMTK force field using PyQuante.  </p>
]]></description>
			<content:encoded><![CDATA[<h2>How to create PyQuante forcefield for MMTK.  Part 1.</h2>

<h3>Introduction: Why and What</h3>

<p>One of the constant activities of <a href="http://www.compchem.kiev.ua">Computational Chemistry Group</a>, Kiev is an optimization and a redesign of our computational toolchain. </p>

<p>Finally, we&#8217;ve came to the point where no one of existing, nor our own quantum chemistry computational packages is not sufficient.  Say, I would like to set a random distribution of bunch of some molecules in space, run molecular dynamics simulation, cooling them, then perform an energy minimization and finally, compute their IR spectra.  And then repeat this 50 times for different molecules and setups. </p>

<p><a class="external" href="http://www.ks.uiuc.edu/Research/namd/"> One</a> package allows nice molecular dynamics, but, alas only for biomolecular systems. <a class="external" href="http://www.msg.ameslab.gov/GAMESS/GAMESS.html">Another</a> is fine regarding HF and DFT calculations, but what about dynamics?  In our semi-empirical code we routinely calculate systems in an external electric field or under mechanical stress, but tool integration (e.g. visualization) stays problematic. </p>

<p>Being (a) responsible for the software redesign activity (b) chemist by education and (c) programmer by nature, I&#8217;ve decided &#8211; it&#8217;s time to automate all this stuff.  Since I love high-level scripting and I love <a class="external" href="http://www.python.org">Python</a>, the roadmap was clear to me: find existing python modules that encapsulate things like force field calculations, dynamics or visualization and glue them together. </p>

<p>Thanks to open source we have a bunch of helpful projects: </p>

<ul>
<li><p> <a class="external" href="http://pyquante.sourceforge.net/">PyQuante</a> that provides fine-grained python interface to the heart of hartree-fock and density functional calculations </p>
</li>
<li><p> <a class="external" href="http://www.python.net/crew/hinsen/MMTK/"> MMTK</a> for daily molecular modelling activities </p>
</li>

<li><p> <a class="external" href="http://pymol.sourceforge.net/"> PyMol</a> and <a class="external" href="http://www.ks.uiuc.edu/Research/vmd/">VMD</a> for molecular visualization and construction </p>
</li>
<li><p> lots of open source (and, of course, our own) ab-initio and semi-empiric HF and DFT codes </p>
</li>
</ul>

<p>So, given the goal and the starting point, my first step is to create new MMTK force field using PyQuante. </p>

<p>Technical note.  I&#8217;m using <a class="external" href="http://www.altlinux.org">ALT Linux</a> distribution that&#8217;s rpm- and apt-based.  It&#8217;s central package repository is <a class="external" href="http://www.sisyphus.ru/"> Sisyphus</a> (similar to <a class="external" href="http://www.debian.org/releases/unstable/"> Debian unstable</a>) </p>

<h3>Preparing</h3>

<p>First, I&#8217;ve started by building stable versions of required packages: </p>

<ul>
<li><p> python-module-PyQuante 1.5.0 </p>
</li>
<li><p> python-module-Scientific 2.4.11 (MMTK helper module &#8211; <a href="http://dirac.cnrs-orleans.fr/ScientificPython/"><http ://dirac.cnrs-orleans.fr/ScientificPython/</a>) </http></a></p>
</li>
<li><p> python-module-MMTK 2.4.6 </p>

</li>
</ul>

<p>The process was pretty straighforward, despite I&#8217;ve found that the Numeric python module that&#8217;s present in my distribution is outdated and has bug in LinearAlgrebra module.  Result: <a class="external" href="https://bugzilla.altlinux.org/show_bug.cgi?id=9574">the bug report</a>. </p>

<h3>MMTK forcefield</h3>

<p>Finally, I&#8217;ve get my hands onto fresh installed python modules. Investigating the internals of MMTK energy calculations&#8230; </p>

<p>MMTK vocabulary uses Universe to define the system under study, the ForceField to set the energy calculation rules and usual Atom and Molecule to set the molecular structure. </p>

<p>I&#8217;ve called my new ForceField <strong>RhfForceField</strong> and set up simple test script: </p>

<div lang="en" class="codearea" dir="ltr">
<script type="text/javascript">
document.write('<a href="#" onClick="return togglenumber(\'CA-7db79c3bd7a123b5894c8aaa6deb8d56163d95b4_002\', 1, 1);" \
                class="codenumbers">Toggle line numbers< \/a>');
</a></script>
<pre lang="en" id="CA-7db79c3bd7a123b5894c8aaa6deb8d56163d95b4_002" dir="ltr">
<span class="line"></span><span class="LineNumber">   1 </span><span class="ResWord">from</span> <span class="ID">MMTK</span> <span class="ResWord">import</span> <span class="Operator">*</span>

<span class="line"></span><span class="LineNumber">   2 </span><span class="ResWord">from</span> <span class="ID">MMTK</span><span class="Operator">.</span><span class="ID">ForceFields</span><span class="Operator">.</span><span class="ID">ForceField</span> <span class="ResWord">import</span> <span class="ID">ForceField</span>
<span class="line"></span><span class="LineNumber">   3 </span>

<span class="line"></span><span class="LineNumber">   4 </span><span class="ResWord">class</span> <span class="ID">RhfForceField</span><span class="Operator">(</span><span class="ID">ForceField</span><span class="Operator">)</span><span class="Operator">:</span>
<span class="line"></span><span class="LineNumber">   5 </span>    <span class="ResWord">def</span> <span class="ID">__init__</span><span class="Operator">(</span><span class="ID">self</span><span class="Operator">)</span><span class="Operator">:</span> <span class="ResWord">pass</span>

<span class="line"></span><span class="LineNumber">   6 </span>    <span class="ResWord">pass</span>
<span class="line"></span><span class="LineNumber">   7 </span>
<span class="line"></span><span class="LineNumber">   8 </span><span class="ID">universe</span> <span class="Operator">=</span> <span class="ID">InfiniteUniverse</span><span class="Operator">(</span><span class="ID">RhfForceField</span><span class="Operator">(</span><span class="Operator">)</span><span class="Operator">)</span>

<span class="line"></span><span class="LineNumber">   9 </span><span class="ID">universe</span><span class="Operator">.</span><span class="ID">mol</span> <span class="Operator">=</span> <span class="ID">Molecule</span><span class="Operator">(</span><span class="String">'water'</span><span class="Operator">)</span>
<span class="line"></span><span class="LineNumber">  10 </span>
<span class="line"></span><span class="LineNumber">  11 </span><span class="ResWord">print</span> <span class="ID">universe</span><span class="Operator">.</span><span class="ID">energy</span><span class="Operator">(</span><span class="Operator">)</span><span class="Text"></span>

</pre>
</div>

<p>Sure it fails.  I&#8217;ve not defined anything! </p>

<pre>
  File "t2.py", line 11, in ?
    print universe.energy()
  File "/usr/lib/python2.4/site-packages/MMTK/Universe.py", line 629, in energy
    eval = self.energyEvaluator(subset1, subset2)
  File "/usr/lib/python2.4/site-packages/MMTK/Universe.py", line 615, in energyEvaluator
    threads, mpi_communicator)
  File "/usr/lib/python2.4/site-packages/MMTK/ForceFields/ForceField.py", line 183, in __init__
    self.global_data)
  File "/usr/lib/python2.4/site-packages/MMTK/ForceFields/ForceField.py", line 40, in evaluatorTerms
    raise AttributeError
AttributeError
</pre>

<p>Short peek into MMTK.ForceFields.ForceFileds reveals the <strong>evaluatorTerms</strong> method.  But when I define it to return nothing </p>

<div lang="en" class="codearea" dir="ltr">
<script type="text/javascript">
document.write('<a href="#" onClick="return togglenumber(\'CA-62234c6256bd5232d831bb4fea60c57daca68696_003\', 1, 1);" \
                class="codenumbers">Toggle line numbers< \/a>');
</a></script>
<pre lang="en" id="CA-62234c6256bd5232d831bb4fea60c57daca68696_003" dir="ltr">
<span class="line"></span><span class="LineNumber">   1 </span><span class="ResWord">class</span> <span class="ID">RhfForceField</span><span class="Operator">(</span><span class="ID">ForceField</span><span class="Operator">)</span><span class="Operator">:</span>
<span class="line"></span><span class="LineNumber">   2 </span>    <span class="ResWord">def</span> <span class="ID">__init__</span><span class="Operator">(</span><span class="ID">self</span><span class="Operator">)</span><span class="Operator">:</span> <span class="ResWord">pass</span>

<span class="line"></span><span class="LineNumber">   3 </span>    <span class="ResWord">def</span> <span class="ID">evaluatorTerms</span><span class="Operator">(</span><span class="ID">self</span><span class="Operator">,</span> <span class="ID">universe</span><span class="Operator">,</span> <span class="ID">subset1</span><span class="Operator">,</span> <span class="ID">subset2</span><span class="Operator">,</span> <span class="ID">global_data</span><span class="Operator">)</span><span class="Operator">:</span>

<span class="line"></span><span class="LineNumber">   4 </span>        <span class="ResWord">return</span>
<span class="line"></span><span class="LineNumber">   5 </span>    <span class="ResWord">pass</span><span class="Text"></span>
</pre>
</div>

<p>my python coredumps. </p>

<p>At this point (any really clever developer would do this from the very beginning), I read the examples, supplied with MMTK.  There is simple harmonic oscillator force field defined (Examples/Forcefield/).  Alas, it uses C-coded energy evaluation routine.  Not the way, I&#8217;d like to venture now. </p>

<p>Several hours of reading C and Python code resulted in various attempts, including the attempt to use undocumented MMTK_forcefield.PythonTerm class, but of no use &#8211; still coredump. </p>

<p>The problem was easily solved (the power of open source!) by <a class="external" href="http://starship.python.net/pipermail/mmtk/2006/001119.html">single e-mail</a> to the mmtk mailing list.  The <a class="external" href="http://starship.python.net/pipermail/mmtk/2006/001120.html">answer</a> is simple: to use python-defined force fields, one must use the development (2.5.x) version of MMTK.  Actually, as Konrad <a class="external" href="http://starship.python.net/pipermail/mmtk/2006/001123.html">says</a>, the only reason it wasn&#8217;t declared &#8217;stable&#8217; is the deficiency in his documentation toolkit: he can&#8217;t generate html, xml and pdf docs from old documentation base. </p>

<p>So, once again I&#8217;ve switched to rpm packaging, including packaging of <a class="external" href="http://effbot.org/zone/celementtree.htm">python-module-cElementTree</a>, required by 2.5.13 version of MMTK. </p>

<p>This version, among other, includes couple new ForceField examples, each implemented in C, <a class="external" href="http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/">Pyrex</a> and Python. </p>

<p>Now, the implementation of the restricted Hartree-Fock force field seems straighforward: </p>

<div lang="en" class="codearea" dir="ltr">
<script type="text/javascript">
document.write('<a href="#" onClick="return togglenumber(\'CA-a31aa7ad97b85abd73d118a5b8a124007eae116d_004\', 1, 1);" \
                class="codenumbers">Toggle line numbers< \/a>');
</a></script>
<pre lang="en" id="CA-a31aa7ad97b85abd73d118a5b8a124007eae116d_004" dir="ltr">
<span class="line"></span><span class="LineNumber">   1 </span><span class="ResWord">from</span> <span class="ID">MMTK</span> <span class="ResWord">import</span> <span class="Operator">*</span>

<span class="line"></span><span class="LineNumber">   2 </span><span class="ResWord">from</span> <span class="ID">MMTK</span><span class="Operator">.</span><span class="ID">ForceFields</span><span class="Operator">.</span><span class="ID">ForceField</span> <span class="ResWord">import</span> <span class="ID">ForceField</span><span class="Operator">,</span> <span class="ID">EnergyTerm</span>

<span class="line"></span><span class="LineNumber">   3 </span><span class="ResWord">import</span> <span class="ID">PyQuante</span><span class="Operator">.</span><span class="ID">Molecule</span>
<span class="line"></span><span class="LineNumber">   4 </span><span class="ResWord">from</span> <span class="ID">PyQuante</span> <span class="ResWord">import</span> <span class="ID">hartree_fock</span>

<span class="line"></span><span class="LineNumber">   5 </span>
<span class="line"></span><span class="LineNumber">   6 </span><span class="ID">sym_to_nucl_map</span> <span class="Operator">=</span> <span class="Operator">{</span>
<span class="line"></span><span class="LineNumber">   7 </span>    <span class="String">'H'</span> <span class="Operator">:</span> <span class="Number">1</span><span class="Operator">,</span>

<span class="line"></span><span class="LineNumber">   8 </span>    <span class="String">'C'</span> <span class="Operator">:</span> <span class="Number">6</span><span class="Operator">,</span>
<span class="line"></span><span class="LineNumber">   9 </span>    <span class="String">'O'</span> <span class="Operator">:</span> <span class="Number">8</span><span class="Operator">,</span>

<span class="line"></span><span class="LineNumber">  10 </span>    <span class="Operator">}</span>
<span class="line"></span><span class="LineNumber">  11 </span>
<span class="line"></span><span class="LineNumber">  12 </span><span class="ResWord">class</span> <span class="ID">HfFieldTerm</span><span class="Operator">(</span><span class="ID">EnergyTerm</span><span class="Operator">)</span><span class="Operator">:</span>

<span class="line"></span><span class="LineNumber">  13 </span>    <span class="ResWord">def</span> <span class="ID">__init__</span><span class="Operator">(</span><span class="ID">self</span><span class="Operator">,</span> <span class="ID">universe</span><span class="Operator">)</span><span class="Operator">:</span>
<span class="line"></span><span class="LineNumber">  14 </span>        <span class="ID">EnergyTerm</span><span class="Operator">.</span><span class="ID">__init__</span><span class="Operator">(</span><span class="ID">self</span><span class="Operator">,</span> <span class="String">'Hatree Fock'</span><span class="Operator">,</span> <span class="ID">universe</span><span class="Operator">)</span>

<span class="line"></span><span class="LineNumber">  15 </span>        <span class="ResWord">return</span>
<span class="line"></span><span class="LineNumber">  16 </span>
<span class="line"></span><span class="LineNumber">  17 </span>    <span class="ResWord">def</span> <span class="ID">evaluate</span><span class="Operator">(</span><span class="ID">self</span><span class="Operator">,</span> <span class="ID">configuration</span><span class="Operator">,</span> <span class="ID">do_gradients</span><span class="Operator">,</span> <span class="ID">do_force_constants</span><span class="Operator">)</span><span class="Operator">:</span>

<span class="line"></span><span class="LineNumber">  18 </span>        <span class="ID">atomlist</span> <span class="Operator">=</span> <span class="Operator">[</span><span class="Operator">]</span>
<span class="line"></span><span class="LineNumber">  19 </span>        <span class="ResWord">for</span> <span class="ID">atom</span> <span class="ResWord">in</span> <span class="ID">self</span><span class="Operator">.</span><span class="ID">universe</span><span class="Operator">.</span><span class="ID">atomList</span><span class="Operator">(</span><span class="Operator">)</span><span class="Operator">:</span> <span class="ID">atomlist</span><span class="Operator">.</span><span class="ID">append</span><span class="Operator">(</span><span class="Operator">[</span>

<span class="line"></span><span class="LineNumber">  20 </span>            <span class="ID">sym_to_nucl_map</span><span class="Operator">[</span><span class="ID">atom</span><span class="Operator">.</span><span class="ID">type</span><span class="Operator">.</span><span class="ID">symbol</span><span class="Operator">]</span><span class="Operator">,</span>
<span class="line"></span><span class="LineNumber">  21 </span>            <span class="ID">atom</span><span class="Operator">.</span><span class="ID">position</span><span class="Operator">(</span><span class="Operator">)</span><span class="Operator">]</span><span class="Operator">)</span>

<span class="line"></span><span class="LineNumber">  22 </span>
<span class="line"></span><span class="LineNumber">  23 </span>        <span class="ID">mol</span> <span class="Operator">=</span> <span class="ID">PyQuante</span><span class="Operator">.</span><span class="ID">Molecule</span><span class="Operator">.</span><span class="ID">Molecule</span><span class="Operator">(</span><span class="String">'molecule'</span><span class="Operator">,</span> <span class="ID">atomlist</span><span class="Operator">,</span>

<span class="line"></span><span class="LineNumber">  24 </span>                                         <span class="ID">units</span> <span class="Operator">=</span> <span class="String">'Angstrom'</span><span class="Operator">,</span>
<span class="line"></span><span class="LineNumber">  25 </span>                                         <span class="ID">charge</span> <span class="Operator">=</span> <span class="Number">0</span><span class="Operator">,</span>

<span class="line"></span><span class="LineNumber">  26 </span>                                         <span class="ID">multiplicity</span> <span class="Operator">=</span> <span class="Number">1</span><span class="Operator">)</span>
<span class="line"></span><span class="LineNumber">  27 </span>        <span class="ID">en</span><span class="Operator">,</span><span class="ID">orbe</span><span class="Operator">,</span><span class="ID">self</span><span class="Operator">.</span><span class="ID">orbs</span> <span class="Operator">=</span> <span class="ID">hartree_fock</span><span class="Operator">.</span><span class="ID">hf</span><span class="Operator">(</span><span class="ID">mol</span><span class="Operator">,</span> <span class="ID">verbose</span><span class="Operator">=</span><span class="Number">1</span><span class="Operator">)</span>

<span class="line"></span><span class="LineNumber">  28 </span>        <span class="ID">results</span> <span class="Operator">=</span> <span class="Operator">{</span> <span class="String">'energy'</span> <span class="Operator">:</span> <span class="ID">en</span> <span class="Operator">}</span>

<span class="line"></span><span class="LineNumber">  29 </span>
<span class="line"></span><span class="LineNumber">  30 </span>        <span class="ResWord">if</span> <span class="ID">do_gradients</span><span class="Operator">:</span> <span class="ResWord">assert</span> <span class="String">'Not implemented'</span>
<span class="line"></span><span class="LineNumber">  31 </span>        <span class="ResWord">if</span> <span class="ID">do_force_constants</span><span class="Operator">:</span> <span class="ResWord">assert</span> <span class="String">'Not implemented'</span>

<span class="line"></span><span class="LineNumber">  32 </span>
<span class="line"></span><span class="LineNumber">  33 </span>        <span class="ResWord">return</span> <span class="ID">results</span>
<span class="line"></span><span class="LineNumber">  34 </span>    <span class="ResWord">pass</span>
<span class="line"></span><span class="LineNumber">  35 </span>

<span class="line"></span><span class="LineNumber">  36 </span>
<span class="line"></span><span class="LineNumber">  37 </span><span class="ResWord">class</span> <span class="ID">HfForceField</span><span class="Operator">(</span><span class="ID">ForceField</span><span class="Operator">)</span><span class="Operator">:</span>
<span class="line"></span><span class="LineNumber">  38 </span>    <span class="ResWord">def</span> <span class="ID">__init__</span><span class="Operator">(</span><span class="ID">self</span><span class="Operator">)</span><span class="Operator">:</span> <span class="ID">ForceField</span><span class="Operator">(</span><span class="String">'Hartree Fock'</span><span class="Operator">)</span>

<span class="line"></span><span class="LineNumber">  39 </span>
<span class="line"></span><span class="LineNumber">  40 </span>    <span class="ResWord">def</span> <span class="ID">evaluatorTerms</span><span class="Operator">(</span><span class="ID">self</span><span class="Operator">,</span> <span class="ID">universe</span><span class="Operator">,</span> <span class="ID">subset1</span><span class="Operator">,</span> <span class="ID">subset2</span><span class="Operator">,</span> <span class="ID">global_data</span><span class="Operator">)</span><span class="Operator">:</span>

<span class="line"></span><span class="LineNumber">  41 </span>        <span class="Comment"># We call this for its side effect: it makes sure that all</span>
<span class="line"></span><span class="LineNumber">  42 </span><span class="Comment"></span>        <span class="Comment"># atoms have a correct index assigned to them.</span>
<span class="line"></span><span class="LineNumber">  43 </span><span class="Comment"></span>        <span class="ID">universe</span><span class="Operator">.</span><span class="ID">configuration</span><span class="Operator">(</span><span class="Operator">)</span>

<span class="line"></span><span class="LineNumber">  44 </span>        <span class="ResWord">return</span> <span class="Operator">[</span><span class="ID">HfFieldTerm</span><span class="Operator">(</span><span class="ID">universe</span><span class="Operator">)</span><span class="Operator">]</span>
<span class="line"></span><span class="LineNumber">  45 </span>    <span class="ResWord">pass</span>

<span class="line"></span><span class="LineNumber">  46 </span>
<span class="line"></span><span class="LineNumber">  47 </span><span class="ID">universe</span> <span class="Operator">=</span> <span class="ID">InfiniteUniverse</span><span class="Operator">(</span><span class="ID">HfForceField</span><span class="Operator">(</span><span class="Operator">)</span><span class="Operator">)</span>
<span class="line"></span><span class="LineNumber">  48 </span><span class="ID">universe</span><span class="Operator">.</span><span class="ID">mol</span> <span class="Operator">=</span> <span class="ID">Molecule</span><span class="Operator">(</span><span class="String">'water'</span><span class="Operator">)</span>

<span class="line"></span><span class="LineNumber">  49 </span>
<span class="line"></span><span class="LineNumber">  50 </span><span class="ResWord">print</span> <span class="ID">universe</span><span class="Operator">.</span><span class="ID">energy</span><span class="Operator">(</span><span class="Operator">)</span><span class="Text"></span>
</pre>
</div>

<p>This reveals the lack of one important property in MMTK Atom database &#8211; the charge of nuclea.  That&#8217;s why I had to create the map between the IUPAC symbol and the charge manually. </p>

<p>The result of the code run is </p>

<pre>
Nbf =  25
Nclosed =  5
Optimization of HF orbitals
0 -7.72644873092
1 -9.46445551337
2 -17.2283843599
3 -19.050454015
4 -19.8624953604
5 -20.0540489183
6 -20.1023997138
7 -20.1133127164
8 -20.115849504
9 -20.1164274514
10 -20.116560223
11 -20.1165905954
-20.1165905954
</pre>

<p>Wow, it calculates something! </p>

<h3 id="head-748408dc21045f61719aeddfd0cf5ea277361dba">Spot the difference: nanometers vs angstroms</h3>

<p>Yes, the code really does calculations.  But is it correct? </p>

<p>Quick run of one of the PyQuante <a class="external" href="http://pyquante.sourceforge.net/userguide.html">examples</a> shows that it is not: </p>

<pre>
&gt;&gt;&gt; from PyQuante.Molecule import Molecule
&gt;&gt;&gt; from PyQuante.hartree_fock import *
&gt;&gt;&gt; h2o = Molecule('H2O',
...                atomlist = [(8,(0,0,0)),
...                            (1,(0.959,0,0)),
...                            (1,(-.230,0.930,0))],
...                units = 'Angstrom')
&gt;&gt;&gt; en, orbe, orbs = hf(h2o, verbose=True)
Nbf =  25
Nclosed =  5
Optimization of HF orbitals
0 -68.2710764842
1 -71.4107153837
2 -73.8915175997
3 -75.0373719156
4 -75.6459826198
5 -75.8850728221
6 -75.9751560983
7 -76.0064588121
8 -76.0173702077
9 -76.0210974045
10 -76.0223774136
11 -76.0228145355
12 -76.0229641837
13 -76.023015328
&gt;&gt;&gt; en
-76.023015327968622
</pre>

<p>What&#8217;s wrong? </p>

<p>Oops&#8230; Looks like we&#8217;ve missed the measurement units completely: MMTK <a class="external" href="http://www.python.net/crew/hinsen/MMTK/Manual/MMTK_1.html">uses</a> SI units, while PyQuante expects them in Angstroms. </p>

<p>The quick fix  </p>

<div lang="en" class="codearea" dir="ltr">
<script type="text/javascript">
document.write('<a href="#" onClick="return togglenumber(\'CA-d80c30d941c4b629a9fc3328f7e09a6b2f1a4336_005\', 1, 1);" \
                class="codenumbers">Toggle line numbers< \/a>');
</a></script>
<pre lang="en" id="CA-d80c30d941c4b629a9fc3328f7e09a6b2f1a4336_005" dir="ltr">
<span class="line"></span><span class="LineNumber">   1 </span>    <span class="ResWord">def</span> <span class="ID">evaluate</span><span class="Operator">(</span><span class="ID">self</span><span class="Operator">,</span> <span class="ID">configuration</span><span class="Operator">,</span> <span class="ID">do_gradients</span><span class="Operator">,</span> <span class="ID">do_force_constants</span><span class="Operator">)</span><span class="Operator">:</span>

<span class="line"></span><span class="LineNumber">   2 </span>        <span class="ID">atomlist</span> <span class="Operator">=</span> <span class="Operator">[</span><span class="Operator">]</span>
<span class="line"></span><span class="LineNumber">   3 </span>        <span class="ResWord">for</span> <span class="ID">atom</span> <span class="ResWord">in</span> <span class="ID">self</span><span class="Operator">.</span><span class="ID">universe</span><span class="Operator">.</span><span class="ID">atomList</span><span class="Operator">(</span><span class="Operator">)</span><span class="Operator">:</span> <span class="ID">atomlist</span><span class="Operator">.</span><span class="ID">append</span><span class="Operator">(</span><span class="Operator">[</span>

<span class="line"></span><span class="LineNumber">   4 </span>            <span class="ID">sym_to_nucl_map</span><span class="Operator">[</span><span class="ID">atom</span><span class="Operator">.</span><span class="ID">type</span><span class="Operator">.</span><span class="ID">symbol</span><span class="Operator">]</span><span class="Operator">,</span>
<span class="line"></span><span class="LineNumber">   5 </span>            <span class="ID">atom</span><span class="Operator">.</span><span class="ID">position</span><span class="Operator">(</span><span class="Operator">)</span><span class="Operator">/</span><span class="ID">Units</span><span class="Operator">.</span><span class="ID">Ang</span><span class="Operator">]</span><span class="Operator">)</span>

<span class="line"></span><span class="LineNumber">   6 </span>
<span class="line"></span><span class="LineNumber">   7 </span>        <span class="ID">mol</span> <span class="Operator">=</span> <span class="ID">PyQuante</span><span class="Operator">.</span><span class="ID">Molecule</span><span class="Operator">.</span><span class="ID">Molecule</span><span class="Operator">(</span><span class="String">'molecule'</span><span class="Operator">,</span> <span class="ID">atomlist</span><span class="Operator">,</span>

<span class="line"></span><span class="LineNumber">   8 </span>                                         <span class="ID">units</span> <span class="Operator">=</span> <span class="String">'Angstrom'</span><span class="Operator">,</span>
<span class="line"></span><span class="LineNumber">   9 </span>                                         <span class="ID">charge</span> <span class="Operator">=</span> <span class="Number">0</span><span class="Operator">,</span>

<span class="line"></span><span class="LineNumber">  10 </span>                                         <span class="ID">multiplicity</span> <span class="Operator">=</span> <span class="Number">1</span><span class="Operator">)</span>
<span class="line"></span><span class="LineNumber">  11 </span>        <span class="ID">en</span><span class="Operator">,</span><span class="ID">orbe</span><span class="Operator">,</span><span class="ID">self</span><span class="Operator">.</span><span class="ID">orbs</span> <span class="Operator">=</span> <span class="ID">hartree_fock</span><span class="Operator">.</span><span class="ID">hf</span><span class="Operator">(</span><span class="ID">mol</span><span class="Operator">,</span> <span class="ID">verbose</span><span class="Operator">=</span><span class="Number">1</span><span class="Operator">)</span>

<span class="line"></span><span class="LineNumber">  12 </span>        <span class="ID">results</span> <span class="Operator">=</span> <span class="Operator">{</span> <span class="String">'energy'</span> <span class="Operator">:</span> <span class="ID">en</span> <span class="Operator">}</span>

<span class="line"></span><span class="LineNumber">  13 </span>
<span class="line"></span><span class="LineNumber">  14 </span>        <span class="ResWord">if</span> <span class="ID">do_gradients</span><span class="Operator">:</span> <span class="ResWord">assert</span> <span class="String">'Not implemented'</span>
<span class="line"></span><span class="LineNumber">  15 </span>        <span class="ResWord">if</span> <span class="ID">do_force_constants</span><span class="Operator">:</span> <span class="ResWord">assert</span> <span class="String">'Not implemented'</span>

<span class="line"></span><span class="LineNumber">  16 </span>
<span class="line"></span><span class="LineNumber">  17 </span>        <span class="ResWord">return</span> <span class="ID">results</span><span class="Text"></span>
</pre>
</div>

<p>results in something consistent with previous calculation and more meaningfull: </p>

<pre>
Nbf =  25
Nclosed =  5
Optimization of HF orbitals
0 -68.2698558264
1 -71.4163874054
2 -73.8989849529
3 -75.0479917788
4 -75.6520823142
5 -75.8880296116
6 -75.9764512423
7 -76.0070491726
8 -76.0176718892
9 -76.0212871677
10 -76.0225241199
11 -76.0229450137
12 -76.0230885803
13 -76.0231374689
-76.0231374689

</pre>

<h3 id="head-99cf92524316505b0c6f73f5a55d6524b2e1816e">In the next article</h3>

<ul>
<li><p> System energy to the Heat of formation </p>
</li>
<li><p> Reuse orbitals from previous calculation </p>
</li>
<li><p> Polishing </p>

</li>
<li><p> Geometry optimization attempt </p>
</li>
<li><p> Further development </p>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.compchem.kiev.ua/index.php/2006/05/how-to-create-pyquante-forcefield-for-mmtk-part-1/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
