1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>MMTK.NormalModes.VibrationalModes — MMTK User Guide 2.7.7 documentation</title>
<link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../../',
VERSION: '2.7.7',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<link rel="top" title="MMTK User Guide 2.7.7 documentation" href="../../../index.html" />
<link rel="up" title="Module code" href="../../index.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../../../index.html">MMTK User Guide 2.7.7 documentation</a> »</li>
<li><a href="../../index.html" accesskey="U">Module code</a> »</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<h1>Source code for MMTK.NormalModes.VibrationalModes</h1><div class="highlight"><pre>
<span class="c"># Vibrational normal mode calculations.</span>
<span class="c">#</span>
<span class="c"># Written by Konrad Hinsen</span>
<span class="c">#</span>
<span class="sd">"""</span>
<span class="sd">Vibrational normal modes</span>
<span class="sd">"""</span>
<span class="n">__docformat__</span> <span class="o">=</span> <span class="s">'restructuredtext'</span>
<span class="kn">from</span> <span class="nn">MMTK</span> <span class="kn">import</span> <span class="n">Features</span><span class="p">,</span> <span class="n">Units</span><span class="p">,</span> <span class="n">ParticleProperties</span>
<span class="kn">from</span> <span class="nn">Scientific</span> <span class="kn">import</span> <span class="n">N</span>
<span class="kn">from</span> <span class="nn">MMTK.NormalModes</span> <span class="kn">import</span> <span class="n">Core</span>
<span class="c">#</span>
<span class="c"># Class for a single mode</span>
<span class="c">#</span>
<div class="viewcode-block" id="VibrationalMode"><a class="viewcode-back" href="../../../modules.html#MMTK.NormalModes.VibrationalModes.VibrationalMode">[docs]</a><span class="k">class</span> <span class="nc">VibrationalMode</span><span class="p">(</span><span class="n">Core</span><span class="o">.</span><span class="n">Mode</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Single vibrational normal mode</span>
<span class="sd"> Mode objects are created by indexing a </span>
<span class="sd"> :class:`~MMTK.NormalModes.VibrationalModes.VibrationalModes` object.</span>
<span class="sd"> They contain the atomic displacements corresponding to a</span>
<span class="sd"> single mode. In addition, the frequency corresponding to the mode</span>
<span class="sd"> is stored in the attribute "frequency".</span>
<span class="sd"> Note: the normal mode vectors are *not* mass weighted, and therefore</span>
<span class="sd"> not orthogonal to each other.</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">universe</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">frequency</span><span class="p">,</span> <span class="n">mode</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">frequency</span> <span class="o">=</span> <span class="n">frequency</span>
<span class="n">Core</span><span class="o">.</span><span class="n">Mode</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">universe</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">mode</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s">'Mode '</span> <span class="o">+</span> <span class="sb">`self.number`</span> <span class="o">+</span> <span class="s">' with frequency '</span> <span class="o">+</span> <span class="sb">`self.frequency`</span>
<span class="n">__repr__</span> <span class="o">=</span> <span class="n">__str__</span>
<span class="k">def</span> <span class="nf">effectiveMassAndForceConstant</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">m</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">massWeightedDotProduct</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">/</span><span class="bp">self</span><span class="o">.</span><span class="n">dotProduct</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">k</span> <span class="o">=</span> <span class="n">m</span><span class="o">*</span><span class="p">(</span><span class="mf">2.</span><span class="o">*</span><span class="n">N</span><span class="o">.</span><span class="n">pi</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">frequency</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span>
<span class="k">return</span> <span class="n">m</span><span class="p">,</span> <span class="n">k</span>
<span class="c">#</span>
<span class="c"># Class for a full set of normal modes</span>
<span class="c">#</span></div>
<div class="viewcode-block" id="VibrationalModes"><a class="viewcode-back" href="../../../modules.html#MMTK.NormalModes.VibrationalModes.VibrationalModes">[docs]</a><span class="k">class</span> <span class="nc">VibrationalModes</span><span class="p">(</span><span class="n">Core</span><span class="o">.</span><span class="n">NormalModes</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Vibrational modes describe the independent vibrational motions</span>
<span class="sd"> of a harmonic system. They are obtained by diagonalizing the mass-weighted</span>
<span class="sd"> force constant matrix.</span>
<span class="sd"> In order to obtain physically reasonable normal modes, the configuration</span>
<span class="sd"> of the universe must correspond to a local minimum of the potential</span>
<span class="sd"> energy.</span>
<span class="sd"> Individual modes (see :class:`~MMTK.NormalModes.VibrationalModes.VibrationalMode`)</span>
<span class="sd"> can be extracted by indexing with an integer. Looping over the modes</span>
<span class="sd"> is possible as well.</span>
<span class="sd"> """</span>
<span class="n">features</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">universe</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">temperature</span> <span class="o">=</span> <span class="mf">300.</span><span class="o">*</span><span class="n">Units</span><span class="o">.</span><span class="n">K</span><span class="p">,</span>
<span class="n">subspace</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">delta</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">sparse</span> <span class="o">=</span> <span class="bp">False</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> :param universe: the system for which the normal modes are calculated;</span>
<span class="sd"> it must have a force field which provides the second</span>
<span class="sd"> derivatives of the potential energy</span>
<span class="sd"> :type universe: :class:`~MMTK.Universe.Universe`</span>
<span class="sd"> :param temperature: the temperature for which the amplitudes of the</span>
<span class="sd"> atomic displacement vectors are calculated. A</span>
<span class="sd"> value of None can be specified to have no scaling</span>
<span class="sd"> at all. In that case the mass-weighted norm</span>
<span class="sd"> of each normal mode is one.</span>
<span class="sd"> :type temperature: float</span>
<span class="sd"> :param subspace: the basis for the subspace in which the normal modes</span>
<span class="sd"> are calculated (or, more precisely, a set of vectors</span>
<span class="sd"> spanning the subspace; it does not have to be</span>
<span class="sd"> orthogonal). This can either be a sequence of</span>
<span class="sd"> :class:`~MMTK.ParticleProperties.ParticleVector` objects</span>
<span class="sd"> or a tuple of two such sequences. In the second case,</span>
<span class="sd"> the subspace is defined by the space spanned by the</span>
<span class="sd"> second set of vectors projected on the complement of</span>
<span class="sd"> the space spanned by the first set of vectors.</span>
<span class="sd"> The first set thus defines directions that are</span>
<span class="sd"> excluded from the subspace.</span>
<span class="sd"> The default value of None indicates a standard</span>
<span class="sd"> normal mode calculation in the 3N-dimensional</span>
<span class="sd"> configuration space.</span>
<span class="sd"> :param delta: the rms step length for numerical differentiation.</span>
<span class="sd"> The default value of None indicates analytical</span>
<span class="sd"> differentiation.</span>
<span class="sd"> Numerical differentiation is available only when a</span>
<span class="sd"> subspace basis is used as well. Instead of calculating</span>
<span class="sd"> the full force constant matrix and then multiplying</span>
<span class="sd"> with the subspace basis, the subspace force constant</span>
<span class="sd"> matrix is obtained by numerical differentiation of the</span>
<span class="sd"> energy gradients along the basis vectors of the subspace.</span>
<span class="sd"> If the basis is much smaller than the full configuration</span>
<span class="sd"> space, this approach needs much less memory.</span>
<span class="sd"> :type delta: float</span>
<span class="sd"> :param sparse: a flag that indicates if a sparse representation of</span>
<span class="sd"> the force constant matrix is to be used. This is of</span>
<span class="sd"> interest when there are no long-range interactions and</span>
<span class="sd"> a subspace of smaller size then 3N is specified. In that</span>
<span class="sd"> case, the calculation will use much less memory with a</span>
<span class="sd"> sparse representation.</span>
<span class="sd"> :type sparse: bool</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="n">universe</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">Features</span><span class="o">.</span><span class="n">checkFeatures</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">universe</span><span class="p">)</span>
<span class="n">Core</span><span class="o">.</span><span class="n">NormalModes</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">universe</span><span class="p">,</span> <span class="n">subspace</span><span class="p">,</span> <span class="n">delta</span><span class="p">,</span> <span class="n">sparse</span><span class="p">,</span>
<span class="p">[</span><span class="s">'array'</span><span class="p">,</span> <span class="s">'imaginary'</span><span class="p">,</span>
<span class="s">'frequencies'</span><span class="p">,</span> <span class="s">'omega_sq'</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">temperature</span> <span class="o">=</span> <span class="n">temperature</span>
<span class="bp">self</span><span class="o">.</span><span class="n">weights</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">universe</span><span class="o">.</span><span class="n">masses</span><span class="p">()</span><span class="o">.</span><span class="n">array</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">weights</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">weights</span><span class="p">[:,</span> <span class="n">N</span><span class="o">.</span><span class="n">NewAxis</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_forceConstantMatrix</span><span class="p">()</span>
<span class="n">ev</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_diagonalize</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">imaginary</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">less</span><span class="p">(</span><span class="n">ev</span><span class="p">,</span> <span class="mf">0.</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">omega_sq</span> <span class="o">=</span> <span class="n">ev</span>
<span class="bp">self</span><span class="o">.</span><span class="n">frequencies</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">N</span><span class="o">.</span><span class="n">fabs</span><span class="p">(</span><span class="n">ev</span><span class="p">))</span> <span class="o">/</span> <span class="p">(</span><span class="mf">2.</span><span class="o">*</span><span class="n">N</span><span class="o">.</span><span class="n">pi</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sort_index</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">argsort</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">frequencies</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">array</span><span class="o">.</span><span class="n">shape</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nmodes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">natoms</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cleanup</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">__setstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">state</span><span class="p">):</span>
<span class="c"># This fixes unpickled objects from pre-2.5 versions.</span>
<span class="c"># Their modes were stored in un-weighted coordinates.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">state</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s">'weights'</span><span class="p">):</span>
<span class="n">weights</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">state</span><span class="p">[</span><span class="s">'universe'</span><span class="p">]</span><span class="o">.</span><span class="n">masses</span><span class="p">()</span><span class="o">.</span><span class="n">array</span><span class="p">)[:,</span> <span class="n">N</span><span class="o">.</span><span class="n">NewAxis</span><span class="p">]</span>
<span class="n">state</span><span class="p">[</span><span class="s">'weights'</span><span class="p">]</span> <span class="o">=</span> <span class="n">weights</span>
<span class="n">state</span><span class="p">[</span><span class="s">'array'</span><span class="p">]</span> <span class="o">*=</span> <span class="n">weights</span><span class="p">[</span><span class="n">N</span><span class="o">.</span><span class="n">NewAxis</span><span class="p">,</span> <span class="p">:,</span> <span class="p">:]</span>
<span class="k">if</span> <span class="n">state</span><span class="p">[</span><span class="s">'temperature'</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">factor</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mf">2.</span><span class="o">*</span><span class="n">state</span><span class="p">[</span><span class="s">'temperature'</span><span class="p">]</span><span class="o">*</span><span class="n">Units</span><span class="o">.</span><span class="n">k_B</span><span class="o">/</span><span class="n">Units</span><span class="o">.</span><span class="n">amu</span><span class="p">)</span> <span class="o">/</span> \
<span class="p">(</span><span class="mf">2.</span><span class="o">*</span><span class="n">N</span><span class="o">.</span><span class="n">pi</span><span class="p">)</span>
<span class="n">freq</span> <span class="o">=</span> <span class="n">state</span><span class="p">[</span><span class="s">'frequencies'</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">state</span><span class="p">[</span><span class="s">'nmodes'</span><span class="p">]):</span>
<span class="n">index</span> <span class="o">=</span> <span class="n">state</span><span class="p">[</span><span class="s">'sort_index'</span><span class="p">][</span><span class="n">i</span><span class="p">]</span>
<span class="k">if</span> <span class="n">index</span> <span class="o">>=</span> <span class="mi">6</span><span class="p">:</span>
<span class="n">state</span><span class="p">[</span><span class="s">'array'</span><span class="p">][</span><span class="n">index</span><span class="p">]</span> <span class="o">*=</span> <span class="n">freq</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">/</span><span class="n">factor</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">state</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
<span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sort_index</span><span class="p">[</span><span class="n">item</span><span class="p">]</span>
<span class="n">f</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">frequencies</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">imaginary</span><span class="p">[</span><span class="n">index</span><span class="p">]:</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">f</span><span class="o">*</span><span class="mf">1.j</span>
<span class="c"># !!</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">temperature</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">item</span> <span class="o"><</span> <span class="mi">6</span><span class="p">:</span>
<span class="n">amplitude</span> <span class="o">=</span> <span class="mf">1.</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">amplitude</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mf">2.</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">temperature</span><span class="o">*</span><span class="n">Units</span><span class="o">.</span><span class="n">k_B</span><span class="o">/</span><span class="n">Units</span><span class="o">.</span><span class="n">amu</span><span class="p">)</span> <span class="o">/</span> \
<span class="p">(</span><span class="mf">2.</span><span class="o">*</span><span class="n">N</span><span class="o">.</span><span class="n">pi</span><span class="o">*</span><span class="n">f</span><span class="p">)</span>
<span class="k">return</span> <span class="n">VibrationalMode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">universe</span><span class="p">,</span> <span class="n">item</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span>
<span class="n">amplitude</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">array</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">/</span><span class="bp">self</span><span class="o">.</span><span class="n">weights</span><span class="p">)</span>
<div class="viewcode-block" id="VibrationalModes.rawMode"><a class="viewcode-back" href="../../../modules.html#MMTK.NormalModes.VibrationalModes.VibrationalModes.rawMode">[docs]</a> <span class="k">def</span> <span class="nf">rawMode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> :param item: the index of a normal mode</span>
<span class="sd"> :type item: int</span>
<span class="sd"> :returns: the unscaled mode vector</span>
<span class="sd"> :rtype: :class:`~MMTK.NormalModes.VibrationalModes.VibrationalMode`</span>
<span class="sd"> """</span>
<span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sort_index</span><span class="p">[</span><span class="n">item</span><span class="p">]</span>
<span class="n">f</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">frequencies</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">imaginary</span><span class="p">[</span><span class="n">index</span><span class="p">]:</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">f</span><span class="o">*</span><span class="mf">1.j</span>
<span class="k">return</span> <span class="n">VibrationalMode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">universe</span><span class="p">,</span> <span class="n">item</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">array</span><span class="p">[</span><span class="n">index</span><span class="p">])</span>
</div>
<span class="k">def</span> <span class="nf">fluctuations</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">first_mode</span><span class="o">=</span><span class="mi">6</span><span class="p">):</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">ParticleProperties</span><span class="o">.</span><span class="n">ParticleScalar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">universe</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">first_mode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">nmodes</span><span class="p">):</span>
<span class="n">mode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rawMode</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="n">f</span> <span class="o">+=</span> <span class="p">(</span><span class="n">mode</span><span class="o">*</span><span class="n">mode</span><span class="p">)</span><span class="o">/</span><span class="n">mode</span><span class="o">.</span><span class="n">frequency</span><span class="o">**</span><span class="mi">2</span>
<span class="n">f</span><span class="o">.</span><span class="n">array</span> <span class="o">/=</span> <span class="bp">self</span><span class="o">.</span><span class="n">weights</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">]</span><span class="o">**</span><span class="mi">2</span>
<span class="n">s</span> <span class="o">=</span> <span class="mf">1.</span><span class="o">/</span><span class="p">(</span><span class="mf">2.</span><span class="o">*</span><span class="n">N</span><span class="o">.</span><span class="n">pi</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">temperature</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">s</span> <span class="o">*=</span> <span class="n">Units</span><span class="o">.</span><span class="n">k_B</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">temperature</span>
<span class="n">f</span><span class="o">.</span><span class="n">array</span> <span class="o">*=</span> <span class="n">s</span>
<span class="k">return</span> <span class="n">f</span>
<span class="k">def</span> <span class="nf">anisotropicFluctuations</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">first_mode</span><span class="o">=</span><span class="mi">6</span><span class="p">):</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">ParticleProperties</span><span class="o">.</span><span class="n">ParticleTensor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">universe</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">first_mode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">nmodes</span><span class="p">):</span>
<span class="n">mode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rawMode</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="n">array</span> <span class="o">=</span> <span class="n">mode</span><span class="o">.</span><span class="n">array</span>
<span class="n">f</span><span class="o">.</span><span class="n">array</span> <span class="o">+=</span> <span class="p">(</span><span class="n">array</span><span class="p">[:,</span> <span class="p">:,</span> <span class="n">N</span><span class="o">.</span><span class="n">NewAxis</span><span class="p">]</span><span class="o">*</span><span class="n">array</span><span class="p">[:,</span> <span class="n">N</span><span class="o">.</span><span class="n">NewAxis</span><span class="p">,</span> <span class="p">:])</span> \
<span class="o">/</span> <span class="n">mode</span><span class="o">.</span><span class="n">frequency</span><span class="o">**</span><span class="mi">2</span>
<span class="n">s</span> <span class="o">=</span> <span class="p">(</span><span class="mf">2.</span><span class="o">*</span><span class="n">N</span><span class="o">.</span><span class="n">pi</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">temperature</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">s</span> <span class="o">/=</span> <span class="n">Units</span><span class="o">.</span><span class="n">k_B</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">temperature</span>
<span class="n">f</span><span class="o">.</span><span class="n">array</span> <span class="o">/=</span> <span class="n">s</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">universe</span><span class="o">.</span><span class="n">masses</span><span class="p">()</span><span class="o">.</span><span class="n">array</span><span class="p">[:,</span> <span class="n">N</span><span class="o">.</span><span class="n">NewAxis</span><span class="p">,</span> <span class="n">N</span><span class="o">.</span><span class="n">NewAxis</span><span class="p">]</span>
<span class="k">return</span> <span class="n">f</span>
<div class="viewcode-block" id="VibrationalModes.meanSquareDisplacement"><a class="viewcode-back" href="../../../modules.html#MMTK.NormalModes.VibrationalModes.VibrationalModes.meanSquareDisplacement">[docs]</a> <span class="k">def</span> <span class="nf">meanSquareDisplacement</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">subset</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">weights</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
<span class="n">time_range</span> <span class="o">=</span> <span class="p">(</span><span class="mf">0.</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">),</span> <span class="n">tau</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
<span class="n">first_mode</span> <span class="o">=</span> <span class="mi">6</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> :param subset: the subset of the universe used in the calculation</span>
<span class="sd"> (default: the whole universe)</span>
<span class="sd"> :type subset: :class:`~MMTK.Collections.GroupOfAtoms`</span>
<span class="sd"> :param weights: the weight to be given to each atom in the average</span>
<span class="sd"> (default: atomic masses)</span>
<span class="sd"> :type weights: :class:`~MMTK.ParticleProperties.ParticleScalar`</span>
<span class="sd"> :param time_range: the time values at which the mean-square</span>
<span class="sd"> displacement is evaluated, specified as a</span>
<span class="sd"> range tuple (first, last, step).</span>
<span class="sd"> The defaults are first=0, last=</span>
<span class="sd"> 20 times the longest vibration perdiod,</span>
<span class="sd"> and step defined such that 300 points are</span>
<span class="sd"> used in total.</span>
<span class="sd"> :type time_range: tuple</span>
<span class="sd"> :param tau: the relaxation time of an exponential damping factor</span>
<span class="sd"> (default: no damping)</span>
<span class="sd"> :type tau: float</span>
<span class="sd"> :param first_mode: the first mode to be taken into account for</span>
<span class="sd"> the fluctuation calculation. The default value</span>
<span class="sd"> of 6 is right for molecules in vacuum.</span>
<span class="sd"> :type first_mode: int</span>
<span class="sd"> :returns: the averaged mean-square displacement of the</span>
<span class="sd"> atoms in subset as a function of time</span>
<span class="sd"> :rtype: Scientific.Functions.Interpolation.InterpolatingFunction</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">temperature</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"no temperature available"</span><span class="p">)</span>
<span class="k">if</span> <span class="n">subset</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">subset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">universe</span>
<span class="k">if</span> <span class="n">weights</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">weights</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">universe</span><span class="o">.</span><span class="n">masses</span><span class="p">()</span>
<span class="n">weights</span> <span class="o">=</span> <span class="n">weights</span><span class="o">*</span><span class="n">subset</span><span class="o">.</span><span class="n">booleanMask</span><span class="p">()</span>
<span class="n">total</span> <span class="o">=</span> <span class="n">weights</span><span class="o">.</span><span class="n">sumOverParticles</span><span class="p">()</span>
<span class="n">weights</span> <span class="o">=</span> <span class="n">weights</span><span class="o">/</span><span class="n">total</span>
<span class="n">first</span><span class="p">,</span> <span class="n">last</span><span class="p">,</span> <span class="n">step</span> <span class="o">=</span> <span class="p">(</span><span class="n">time_range</span> <span class="o">+</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">))[:</span><span class="mi">3</span><span class="p">]</span>
<span class="k">if</span> <span class="n">last</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">last</span> <span class="o">=</span> <span class="mf">20.</span><span class="o">/</span><span class="bp">self</span><span class="p">[</span><span class="n">first_mode</span><span class="p">]</span><span class="o">.</span><span class="n">frequency</span>
<span class="k">if</span> <span class="n">step</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">step</span> <span class="o">=</span> <span class="p">(</span><span class="n">last</span><span class="o">-</span><span class="n">first</span><span class="p">)</span><span class="o">/</span><span class="mf">300.</span>
<span class="n">time</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="n">last</span><span class="p">,</span> <span class="n">step</span><span class="p">)</span>
<span class="k">if</span> <span class="n">tau</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="n">damping</span> <span class="o">=</span> <span class="mf">1.</span>
<span class="k">else</span><span class="p">:</span> <span class="n">damping</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="p">(</span><span class="n">time</span><span class="o">/</span><span class="n">tau</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
<span class="n">msd</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="n">N</span><span class="o">.</span><span class="n">Float</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">first_mode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">nmodes</span><span class="p">):</span>
<span class="n">mode</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">omega</span> <span class="o">=</span> <span class="mf">2.</span><span class="o">*</span><span class="n">N</span><span class="o">.</span><span class="n">pi</span><span class="o">*</span><span class="n">mode</span><span class="o">.</span><span class="n">frequency</span>
<span class="n">d</span> <span class="o">=</span> <span class="p">(</span><span class="n">weights</span><span class="o">*</span><span class="p">(</span><span class="n">mode</span><span class="o">*</span><span class="n">mode</span><span class="p">))</span><span class="o">.</span><span class="n">sumOverParticles</span><span class="p">()</span>
<span class="n">N</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">msd</span><span class="p">,</span> <span class="n">d</span><span class="o">*</span><span class="p">(</span><span class="mf">1.</span><span class="o">-</span><span class="n">damping</span><span class="o">*</span><span class="n">N</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">omega</span><span class="o">*</span><span class="n">time</span><span class="p">)),</span> <span class="n">msd</span><span class="p">)</span>
<span class="k">return</span> <span class="n">InterpolatingFunction</span><span class="p">((</span><span class="n">time</span><span class="p">,),</span> <span class="n">msd</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="VibrationalModes.EISF"><a class="viewcode-back" href="../../../modules.html#MMTK.NormalModes.VibrationalModes.VibrationalModes.EISF">[docs]</a> <span class="k">def</span> <span class="nf">EISF</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">q_range</span> <span class="o">=</span> <span class="p">(</span><span class="mf">0.</span><span class="p">,</span> <span class="mf">15.</span><span class="p">),</span> <span class="n">subset</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">weights</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span>
<span class="n">random_vectors</span> <span class="o">=</span> <span class="mi">15</span><span class="p">,</span> <span class="n">first_mode</span> <span class="o">=</span> <span class="mi">6</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> :param q_range: the range of angular wavenumber values</span>
<span class="sd"> :type q_range: tuple</span>
<span class="sd"> :param subset: the subset of the universe used in the calculation</span>
<span class="sd"> (default: the whole universe)</span>
<span class="sd"> :type subset: :class:`~MMTK.Collections.GroupOfAtoms`</span>
<span class="sd"> :param weights: the weight to be given to each atom in the average</span>
<span class="sd"> (default: incoherent scattering lengths)</span>
<span class="sd"> :type weights: :class:`~MMTK.ParticleProperties.ParticleScalar`</span>
<span class="sd"> :param random_vectors: the number of random direction vectors</span>
<span class="sd"> used in the orientational average</span>
<span class="sd"> :type random_vectors: int</span>
<span class="sd"> :param first_mode: the first mode to be taken into account for</span>
<span class="sd"> the fluctuation calculation. The default value</span>
<span class="sd"> of 6 is right for molecules in vacuum.</span>
<span class="sd"> :type first_mode: int</span>
<span class="sd"> :returns: the Elastic Incoherent Structure Factor (EISF) as a</span>
<span class="sd"> function of angular wavenumber</span>
<span class="sd"> :rtype: Scientific.Functions.Interpolation.InterpolatingFunction</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">temperature</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"no temperature available"</span><span class="p">)</span>
<span class="k">if</span> <span class="n">subset</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">subset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">universe</span>
<span class="k">if</span> <span class="n">weights</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">weights</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">universe</span><span class="o">.</span><span class="n">getParticleScalar</span><span class="p">(</span><span class="s">'b_incoherent'</span><span class="p">)</span>
<span class="n">weights</span> <span class="o">=</span> <span class="n">weights</span><span class="o">*</span><span class="n">weights</span>
<span class="n">weights</span> <span class="o">=</span> <span class="n">weights</span><span class="o">*</span><span class="n">subset</span><span class="o">.</span><span class="n">booleanMask</span><span class="p">()</span>
<span class="n">total</span> <span class="o">=</span> <span class="n">weights</span><span class="o">.</span><span class="n">sumOverParticles</span><span class="p">()</span>
<span class="n">weights</span> <span class="o">=</span> <span class="n">weights</span><span class="o">/</span><span class="n">total</span>
<span class="n">first</span><span class="p">,</span> <span class="n">last</span><span class="p">,</span> <span class="n">step</span> <span class="o">=</span> <span class="p">(</span><span class="n">q_range</span><span class="o">+</span><span class="p">(</span><span class="bp">None</span><span class="p">,))[:</span><span class="mi">3</span><span class="p">]</span>
<span class="k">if</span> <span class="n">step</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">step</span> <span class="o">=</span> <span class="p">(</span><span class="n">last</span><span class="o">-</span><span class="n">first</span><span class="p">)</span><span class="o">/</span><span class="mf">50.</span>
<span class="n">q</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="n">last</span><span class="p">,</span> <span class="n">step</span><span class="p">)</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">MMTK</span><span class="o">.</span><span class="n">ParticleTensor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">universe</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">first_mode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">nmodes</span><span class="p">):</span>
<span class="n">mode</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">f</span> <span class="o">+</span> <span class="n">mode</span><span class="o">.</span><span class="n">dyadicProduct</span><span class="p">(</span><span class="n">mode</span><span class="p">)</span>
<span class="n">eisf</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">q</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="n">N</span><span class="o">.</span><span class="n">Float</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">random_vectors</span><span class="p">):</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">MMTK</span><span class="o">.</span><span class="n">Random</span><span class="o">.</span><span class="n">randomDirection</span><span class="p">()</span>
<span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">subset</span><span class="o">.</span><span class="n">atomList</span><span class="p">():</span>
<span class="n">exp</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="n">v</span><span class="o">*</span><span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="n">a</span><span class="p">]</span><span class="o">*</span><span class="n">v</span><span class="p">))</span>
<span class="n">N</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">eisf</span><span class="p">,</span> <span class="n">weights</span><span class="p">[</span><span class="n">a</span><span class="p">]</span><span class="o">*</span><span class="n">exp</span><span class="o">**</span><span class="p">(</span><span class="n">q</span><span class="o">*</span><span class="n">q</span><span class="p">),</span> <span class="n">eisf</span><span class="p">)</span>
<span class="k">return</span> <span class="n">InterpolatingFunction</span><span class="p">((</span><span class="n">q</span><span class="p">,),</span> <span class="n">eisf</span><span class="o">/</span><span class="n">random_vectors</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="VibrationalModes.incoherentScatteringFunction"><a class="viewcode-back" href="../../../modules.html#MMTK.NormalModes.VibrationalModes.VibrationalModes.incoherentScatteringFunction">[docs]</a> <span class="k">def</span> <span class="nf">incoherentScatteringFunction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">q</span><span class="p">,</span> <span class="n">time_range</span> <span class="o">=</span> <span class="p">(</span><span class="mf">0.</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">),</span>
<span class="n">subset</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">weights</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">tau</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
<span class="n">random_vectors</span><span class="o">=</span><span class="mi">15</span><span class="p">,</span> <span class="n">first_mode</span> <span class="o">=</span> <span class="mi">6</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> :param q: the angular wavenumber</span>
<span class="sd"> :type q: float</span>
<span class="sd"> :param time_range: the time values at which the mean-square</span>
<span class="sd"> displacement is evaluated, specified as a</span>
<span class="sd"> range tuple (first, last, step).</span>
<span class="sd"> The defaults are first=0, last=</span>
<span class="sd"> 20 times the longest vibration perdiod,</span>
<span class="sd"> and step defined such that 300 points are</span>
<span class="sd"> used in total.</span>
<span class="sd"> :type time_range: tuple</span>
<span class="sd"> :param subset: the subset of the universe used in the calculation</span>
<span class="sd"> (default: the whole universe)</span>
<span class="sd"> :type subset: :class:`~MMTK.Collections.GroupOfAtoms`</span>
<span class="sd"> :param weights: the weight to be given to each atom in the average</span>
<span class="sd"> (default: incoherent scattering lengths)</span>
<span class="sd"> :type weights: :class:`~MMTK.ParticleProperties.ParticleScalar`</span>
<span class="sd"> :param tau: the relaxation time of an exponential damping factor</span>
<span class="sd"> (default: no damping)</span>
<span class="sd"> :type tau: float</span>
<span class="sd"> :param random_vectors: the number of random direction vectors</span>
<span class="sd"> used in the orientational average</span>
<span class="sd"> :type random_vectors: int</span>
<span class="sd"> :param first_mode: the first mode to be taken into account for</span>
<span class="sd"> the fluctuation calculation. The default value</span>
<span class="sd"> of 6 is right for molecules in vacuum.</span>
<span class="sd"> :type first_mode: int</span>
<span class="sd"> :returns: the Incoherent Scattering Function as a function of time</span>
<span class="sd"> :rtype: Scientific.Functions.Interpolation.InterpolatingFunction</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">temperature</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">"no temperature available"</span><span class="p">)</span>
<span class="k">if</span> <span class="n">subset</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">subset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">universe</span>
<span class="k">if</span> <span class="n">weights</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">weights</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">universe</span><span class="o">.</span><span class="n">getParticleScalar</span><span class="p">(</span><span class="s">'b_incoherent'</span><span class="p">)</span>
<span class="n">weights</span> <span class="o">=</span> <span class="n">weights</span><span class="o">*</span><span class="n">weights</span>
<span class="n">weights</span> <span class="o">=</span> <span class="n">weights</span><span class="o">*</span><span class="n">subset</span><span class="o">.</span><span class="n">booleanMask</span><span class="p">()</span>
<span class="n">total</span> <span class="o">=</span> <span class="n">weights</span><span class="o">.</span><span class="n">sumOverParticles</span><span class="p">()</span>
<span class="n">weights</span> <span class="o">=</span> <span class="n">weights</span><span class="o">/</span><span class="n">total</span>
<span class="n">first</span><span class="p">,</span> <span class="n">last</span><span class="p">,</span> <span class="n">step</span> <span class="o">=</span> <span class="p">(</span><span class="n">time_range</span> <span class="o">+</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">))[:</span><span class="mi">3</span><span class="p">]</span>
<span class="k">if</span> <span class="n">last</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">last</span> <span class="o">=</span> <span class="mf">20.</span><span class="o">/</span><span class="bp">self</span><span class="p">[</span><span class="n">first_mode</span><span class="p">]</span><span class="o">.</span><span class="n">frequency</span>
<span class="k">if</span> <span class="n">step</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">step</span> <span class="o">=</span> <span class="p">(</span><span class="n">last</span><span class="o">-</span><span class="n">first</span><span class="p">)</span><span class="o">/</span><span class="mf">400.</span>
<span class="n">time</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="n">last</span><span class="p">,</span> <span class="n">step</span><span class="p">)</span>
<span class="k">if</span> <span class="n">tau</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="n">damping</span> <span class="o">=</span> <span class="mf">1.</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">damping</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="p">(</span><span class="n">time</span><span class="o">/</span><span class="n">tau</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
<span class="n">finc</span> <span class="o">=</span> <span class="n">N</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="n">N</span><span class="o">.</span><span class="n">Float</span><span class="p">)</span>
<span class="n">random_vectors</span> <span class="o">=</span> <span class="n">MMTK</span><span class="o">.</span><span class="n">Random</span><span class="o">.</span><span class="n">randomDirections</span><span class="p">(</span><span class="n">random_vectors</span><span class="p">)</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">random_vectors</span><span class="p">:</span>
<span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">subset</span><span class="o">.</span><span class="n">atomList</span><span class="p">():</span>
<span class="n">msd</span> <span class="o">=</span> <span class="mf">0.</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">first_mode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">nmodes</span><span class="p">):</span>
<span class="n">mode</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">d</span> <span class="o">=</span> <span class="p">(</span><span class="n">v</span><span class="o">*</span><span class="n">mode</span><span class="p">[</span><span class="n">a</span><span class="p">])</span><span class="o">**</span><span class="mi">2</span>
<span class="n">omega</span> <span class="o">=</span> <span class="mf">2.</span><span class="o">*</span><span class="n">N</span><span class="o">.</span><span class="n">pi</span><span class="o">*</span><span class="n">mode</span><span class="o">.</span><span class="n">frequency</span>
<span class="n">msd</span> <span class="o">=</span> <span class="n">msd</span><span class="o">+</span><span class="n">d</span><span class="o">*</span><span class="p">(</span><span class="mf">1.</span><span class="o">-</span><span class="n">damping</span><span class="o">*</span><span class="n">N</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">omega</span><span class="o">*</span><span class="n">time</span><span class="p">))</span>
<span class="n">N</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">finc</span><span class="p">,</span> <span class="n">weights</span><span class="p">[</span><span class="n">a</span><span class="p">]</span><span class="o">*</span><span class="n">N</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="n">q</span><span class="o">*</span><span class="n">q</span><span class="o">*</span><span class="n">msd</span><span class="p">),</span> <span class="n">finc</span><span class="p">)</span>
<span class="k">return</span> <span class="n">InterpolatingFunction</span><span class="p">((</span><span class="n">time</span><span class="p">,),</span> <span class="n">finc</span><span class="o">/</span><span class="nb">len</span><span class="p">(</span><span class="n">random_vectors</span><span class="p">))</span></div></div>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../../../index.html">MMTK User Guide 2.7.7 documentation</a> »</li>
<li><a href="../../index.html" >Module code</a> »</li>
</ul>
</div>
<div class="footer">
© Copyright 2010, Konrad Hinsen.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>
|