{ "metadata": { "name": "Lattice 2014" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "

pyQCD: A Native Lattice Simulation API for Python

\n

Matt Spraggs

\n

RBC/UKQCD

\n

Department of Physics and Astronomy

\n

University of Southampton

" }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "But Why Matt? WHY!?\n===================\n\n* Reduced complexity\n* Ease of use\n* Interactive scripting\n* Rapid development" }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": "New measurement?\n\n1. Idea\n2. Prototype\n3. Test/Tune\n4. Full implementation\n5. Production run" }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "Python\n======\n\n**Python:** Interpretted, dynamic, high-level, clean, readable" }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": "**Advantages:**\n\n* Readable\n* Flexible\n* Easy to learn\n* Easy to debug\n* Huge number of packages/libraries" }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": "**Disadvantages:**\n\n* Ewww! Whitespace!\n* Sloooooooooooooooow..." }, { "cell_type": "markdown", "metadata": {}, "source": "**Lattice:** Computationally intensive" }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "The Pipe Dream\n==============" }, { "cell_type": "code", "collapsed": false, "input": "import mylatlib\n\nL, T = 64, 128\ngauge_field = mylatlib.cold_start(L, T)\n\ngauge_field.heatbath(gauge_action=\"wilson\", num_updates=100)", "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": "correlators = []\n\nfor i in range(100):\n \n prop = mylatlib.compute_wilson_prop(mass=0.1, gauge_field=gauge_field)\n correlators.append(mylatlib.meson256(prop, prop))\n \n gauge_field.heatbath(gauge_action=\"wilson\", num_updates=10)\n \nmylatlib.save(\"the_results\", correlators)", "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": "Moderate Our Expectations\n-------------------------\n* Prototyping\n* Testing\n* Extensibility" }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "Boost.Python to the Rescue!\n====================\n\n**Boost:** Set of C++ libraries to meet a range of needs\n\n" }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "pyQCD\n=====\n\n* The lattice is an object\n* Lexicographic site ordering\n* CPU-intensive code in C++ via Boost\n* Linear algebra with Eigen 3\n* Multithreading using OpenMP\n* Full use of numpy data types\n* Ease of use, extensibility and documentation\n* CUDA support\n* Easy to install and (hopefully) cross platform\n* Python 2 and 3 compatability" }, { "cell_type": "code", "collapsed": false, "input": "import pyQCD\n\npyQCD.Lattice?", "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "Peeling the Onion\n================\n\n" }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "A Simple Example\n================" }, { "cell_type": "code", "collapsed": false, "input": "lattice = pyQCD.Lattice(L=4, T=8,\n beta=5.5, action=\"wilson\",\n meas_spacing=10,\n update_method=\"heatbath\")\n\nfor i in range(20):\n print(lattice.get_av_plaquette())\n lattice.update()", "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": "1.0\n0.677212100634\n0.606080363109\n0.582105738445\n0.569080803066" }, { "output_type": "stream", "stream": "stdout", "text": "\n0.553415653993\n0.546253245247\n0.55368210462\n0.543724196044" }, { "output_type": "stream", "stream": "stdout", "text": "\n0.543449019208\n0.530287742852\n0.536358448341\n0.531648918407" }, { "output_type": "stream", "stream": "stdout", "text": "\n0.523198238956\n0.526104260619\n0.535878008182\n0.530129644588" }, { "output_type": "stream", "stream": "stdout", "text": "\n0.530319050766\n0.515835581035\n0.523753116326\n" } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "A Simple Example (Cont.)\n========================" }, { "cell_type": "code", "collapsed": true, "input": "config = lattice.get_config()\n\nprint(\"Config type: {}\".format(type(config)))\nprint(\"Config shape: {}\".format(config.shape))\nprint(\"\")\nprint(\"Gauge field for link (t, x, y, z, mu) = (4, 3, 1, 2, 2):\")\nprint(config[4, 3, 1, 2, 2])", "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": "Config type: \nConfig shape: (8, 4, 4, 4, 4, 3, 3)\n\nGauge field for link (t, x, y, z, mu) = (4, 3, 1, 2, 2):\n[[ 0.29174629+0.34677621j 0.54282605+0.5321648j 0.16150985+0.43667543j]\n [ 0.56601344-0.36843713j -0.56778741+0.22000427j 0.35188917+0.22197403j]\n [ 0.26066156-0.52016227j 0.22661714-0.00087105j -0.74525822+0.23392489j]]" }, { "output_type": "stream", "stream": "stdout", "text": "\n" } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "Generating Some Configs\n=======================\n\n* Do parallel updates on even and odd blocks in turn with OpenMP\n* Use with caution!" }, { "cell_type": "code", "collapsed": false, "input": "lattice = pyQCD.Lattice(8, 4, 5.8, \"rectangle_improved\", 10)\n# Thermalize with 100 updates\nlattice.thermalize(100)\n\nfor i in range(10):\n print(\"Generating config {}\".format(i))\n # Do ten updates\n lattice.next_config()\n lattice.save_config(\"config{}.npy\".format(i))", "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": "Generating config 0\nGenerating config 1" }, { "output_type": "stream", "stream": "stdout", "text": "\nGenerating config 2" }, { "output_type": "stream", "stream": "stdout", "text": "\nGenerating config 3" }, { "output_type": "stream", "stream": "stdout", "text": "\nGenerating config 4" }, { "output_type": "stream", "stream": "stdout", "text": "\nGenerating config 5" }, { "output_type": "stream", "stream": "stdout", "text": "\nGenerating config 6" }, { "output_type": "stream", "stream": "stdout", "text": "\nGenerating config 7" }, { "output_type": "stream", "stream": "stdout", "text": "\nGenerating config 8" }, { "output_type": "stream", "stream": "stdout", "text": "\nGenerating config 9" }, { "output_type": "stream", "stream": "stdout", "text": "\n" } ], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "Computing Propagators\n=====================\n\n* Matvec operations parallelised with OpenMP\n* Here we're inverting in the free theory" }, { "cell_type": "code", "collapsed": false, "input": "from functools import partial\n\nlattice = pyQCD.Lattice(4, 8, 5.5, \"wilson\", 10)\ninverter = partial(lattice.invert_wilson_dirac, mass=0.2)\nsource = lattice.point_source([0, 0, 0, 0])\n\nprint(\"Source type: {}\".format(type(source)))\nprint(\"Source shape: {}\".format(source.shape))\nprint(\"Source non-zero entries: {}\".format(source.nonzero()))", "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": "Source type: \nSource shape: (8, 4, 4, 4)\nSource non-zero entries: (array([0]), array([0]), array([0]), array([0]))\n" } ], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": "%matplotlib inline\n\nimport logging\nimport matplotlib.pyplot as plt\n\nlogger = logging.getLogger()\nlogger.setLevel(logging.INFO)\n\nprop = pyQCD.compute_propagator(source, inverter)\nprint(\"\")\nprint(\"Propagator shape: {}\".format(prop.shape))\nps_correlator = pyQCD.compute_meson_corr(prop, prop, \"g5\", \"g5\")\nplt.plot(ps_correlator)\nplt.xlabel(\"$t$\", fontsize=18)\nplt.ylabel(\"$C(t)$\", fontsize=18)\nplt.show()", "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Computing propagator...\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 0 and colour 0\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator...\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1]\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 7.74084048616e-09\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 0.9\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.281537055969\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 0 and colour 1\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator...\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1]\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 7.74083966548e-09\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 0.9\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.264081001282\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 0 and colour 2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator...\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1]\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 7.94331972902e-09\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 0.96\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.288220882416\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 1 and colour 0\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator...\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1]\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 7.74083966548e-09\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.49\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.510751008987\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 1 and colour 1\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator...\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1]\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 7.74083966548e-09\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.21\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.393754005432\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 1 and colour 2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator...\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1]\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 7.74425570153e-09\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.03\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.316509962082\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 2 and colour 0\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator...\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1]\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 6.24324606357e-09\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.45\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.495503902435\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 2 and colour 1\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator...\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1]\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 6.24324606357e-09\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.34\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.450342178345\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 2 and colour 2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator...\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1]\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 6.24324606357e-09\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.67\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.593438863754\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 3 and colour 0\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator...\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1]\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 6.24324606357e-09\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.45\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.493458986282\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 3 and colour 1\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator...\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1]\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 6.24324606357e-09\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.54\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.519629955292\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 3 and colour 2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator...\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1]\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 6.92040690981e-09\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.29\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.423326015472\n" }, { "output_type": "stream", "stream": "stderr", "text": "INFO:pyQCD.core.propagator.compute_propagator:Finished computing propagator\n" }, { "output_type": "stream", "stream": "stdout", "text": "\nPropagator shape: (8, 4, 4, 4, 4, 4, 3, 3)\n" }, { "output_type": "stream", "stream": "stderr", "text": "/usr/lib/python2.7/dist-packages/numpy/core/numeric.py:460: ComplexWarning: Casting complex values to real discards the imaginary part\n return array(a, dtype, copy=False, order=order)\n" }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAEXCAYAAABRWhj0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X90VPWd//HnhAzIL1F+m0w0mMRkYiAEE5BDhYRqI7Km\noNiG+gMxujl16a7s2Uq1Z9tQK5hd+0vT3U171B62a0iPReIvRg06/FKMAoIFigGJDiM/DBhQEAcm\n8/1jvokMScidZJJ7J/N6nDOHTOYzd17RZN5zP+/7udcWCAQCiIiIGBBndgAREYkeKhoiImKYioaI\niBimoiEiIoapaIiIiGEqGiIiYpiliobL5SIjI4O0tDTKy8vbPP75558zd+5csrOzmTJlCjt37jQh\npYhI7LJM0fD7/SxatAiXy8WuXbuoqqpi9+7dIWOWLVvGpEmT2L59OytWrOBf/uVfTEorIhKbLFM0\n6urqSE1NJTk5GbvdTnFxMTU1NSFjdu/eTUFBAQDp6ek0NDTw2WefmRFXRCQmWaZoeL1ekpKSWu87\nHA68Xm/ImOzsbFatWgUEi8zHH3/MgQMHejWniEgss0zRsNlsnY75yU9+QlNTEzk5OVRUVJCTk0O/\nfv16IZ2IiADEmx2gRWJiIh6Pp/W+x+PB4XCEjBk6dChPP/106/1x48Zx5ZVXttlWamoq+/bt67mw\nIiJ9UEpKCnv37r3gGMvsaeTm5lJfX09DQwM+n4/q6mqKiopCxhw/fhyfzwfAH//4R2bMmMGQIUPa\nbGvfvn0EAoGovf385z83PUOs5o/m7Mpv/i3a8xv5sG2ZPY34+HgqKiooLCzE7/dTUlKC0+mksrIS\ngNLSUnbt2sXdd9+NzWYjKyuLp556yuTUIiKxxTJFA2DWrFnMmjUr5HulpaWtX0+dOpU9e/b0diwR\nEfn/LDM9Jd/Iz883O0K3RHP+aM4Oym+2aM9vhC0QCPS5izDZbDb64I8lItKjjLx3ak9DREQMU9EQ\nERHDVDRERMQwFQ0RETFMRUNERAxT0RAREcNUNERExDAVDRERMUxFQ0REDFPREBERw1Q0RETEMBUN\nERExTEVDREQMU9EQERHDLFU0XC4XGRkZpKWlUV5e3ubxxsZGbrzxRiZOnEhWVhZ/+tOfej+kiEgM\ns8z1NPx+P+np6dTW1pKYmEheXh5VVVU4nc7WMWVlZXz99dcsX76cxsZG0tPTOXz4MPHxoRcgtNls\nfP11gP79e/unEBGJXlF1PY26ujpSU1NJTk7GbrdTXFxMTU1NyJjLLruMEydOAHDixAlGjBjRpmC0\neOedHo8sIhJzLFM0vF4vSUlJrfcdDgderzdkzH333cfOnTtJSEggOzub3/3udx1u7803eyyqiEjM\nav9juglsNlunY5YtW8bEiRNxu93s27ePG264ge3btzN06NA2Y59+uozm5uDX+fn5MXHtXhGRcLjd\nbtxud1jPsUzRSExMxOPxtN73eDw4HI6QMW+99RY//elPAUhJSWHcuHHs2bOH3NzcNttrbCxjyRIY\nOLBnc4uIRKvzP1AvXbq00+dYZnoqNzeX+vp6Ghoa8Pl8VFdXU1RUFDImIyOD2tpaAA4fPsyePXu4\n8sor293e+PHw9ts9HltEJKZYZk8jPj6eiooKCgsL8fv9lJSU4HQ6qaysBKC0tJSHH36YhQsXkp2d\nTXNzM//xH//B8OHD293ezJnwxhvBf0VEJDIsc8htJNlsNl5/PcDPfw6bNpmdRkQkOhg55LbPFo2T\nJwOMHg2HDsGQIWYnEhGxvqhapxFpgwbBNdfAxo1mJxER6Tv6bNEAKCgI9jVERCQy+nTRmDlTi/xE\nRCKpz/Y0AoEAX38NI0eCxwOXXGJ2KhERa4vpngbAgAFw7bWwfr3ZSURE+oY+XTQg2NfQFJWISGT0\n+aLRsshPRES6r0/3NADOnAn2NfbtC/4rIiLti/meBoDdDt/6FoR5IkcREWlHny8aoL6GiEikxETR\nUF9DRCQyYqJoZGfD4cNw8KDZSUREoltMFI1+/WDGDE1RiYh0V0wUDVBfQ0QkEmKqaKivISLSPZYq\nGi6Xi4yMDNLS0igvL2/z+OOPP05OTg45OTmMHz+e+Ph4mpqaDG376qvhiy/gk08inVpEJHZYZnGf\n3+8nPT2d2tpaEhMTycvLo6qqCqfT2e74l156id/+9ret1ww/V0cLVL73PZg9GxYsiHh8EZGoF1WL\n++rq6khNTSU5ORm73U5xcTE1NTUdjn/22WeZP39+WK+hQ29FRLrHMkXD6/WSlJTUet/hcOD1etsd\ne+rUKV599VVuvfXWsF6jpRlujX0rEZHoE292gBY2m83w2BdffJFvfetbXHKBi2SUlZW1fp2fn09+\nfj5XXQV+f/A8VKmp3UkrIhL93G437jDPsWSZopGYmIjH42m97/F4cDgc7Y5duXJlp1NT5xaNFjbb\nN3sbKhoiEutaPlC3WLp0aafPscz0VG5uLvX19TQ0NODz+aiurqaoqKjNuOPHj7N+/Xq++93vdul1\n1NcQEek6yxSN+Ph4KioqKCwsJDMzk+9///s4nU4qKyuprKxsHbd69WoKCwsZOHBgl15HfQ0Rka6z\nzCG3kdTZYWPjxsHLL0NmZi+GEhGxuKg65LY36ZQiIiJdE7NFQ30NEZHwxeT01IEDMHEiHDkCcTFZ\nNkVE2tL0VAccDhg+HD74wOwkIiLRJSaLBujQWxGRrojZoqFmuIhI+GKypwHBy7+mp0NjI8RbZl28\niIh51NO4gDFjgr2NbdvMTiIiEj1itmiA+hoiIuGK6aKhvoaISHhitqcBcOwYJCcH+xr9+/d8LhER\nK1NPoxPDhwdPkf7uu2YnERGJDjFdNECnFBERCUfMF42ZM9XXEBExKqZ7GgAnTkBCQrCvcdFFPRxM\nRMTC1NMw4OKLISsL3n7b7CQiItZnqaLhcrnIyMggLS2N8vLydse43W5ycnLIysoKubZtd+jQWxER\nYywzPeX3+0lPT6e2tpbExETy8vKoqqrC6XS2jmlqamLatGm8+uqrOBwOGhsbGTlyZJtthTM9BfD6\n67B0KWzcGJEfRUQkKkXV9FRdXR2pqakkJydjt9spLi6mpqYmZMyzzz7LrbfeisPhAGi3YHTFtGnw\n/vtw8mRENici0mdZpmh4vV6SkpJa7zscDrxeb8iY+vp6jh07RkFBAbm5ufzv//5vRF570CCYNEl7\nGiIinbHM+V1tNlunY86cOcPWrVtZu3Ytp06dYurUqVx77bWkpaW1GVtWVtb6dX5+fqf9j5a+RmFh\nuMlFRKKT2+3G7XaH9RzLFI3ExEQ8Hk/rfY/H0zoN1SIpKYmRI0cycOBABg4cyPTp09m+fXunRcOI\nmTPhxz/uUnQRkah0/gfqpUuXdvocy0xP5ebmUl9fT0NDAz6fj+rqaoqKikLGfPe732Xjxo34/X5O\nnTrFO++8Q2ZmZkRe/9prYfduOH48IpsTEemTLLOnER8fT0VFBYWFhfj9fkpKSnA6nVRWVgJQWlpK\nRkYGN954IxMmTCAuLo777rsvYkVjwACYPBnWr4ebb47IJkVE+hzLHHIbSeEectvi0Ufh6FH49a97\nIJSIiMVF1SG3VqBFfiIiF6Y9jXOcOQMjRsD+/cF/RURiifY0wmS3Bxf6rVtndhIREWtS0TiPrhsu\nItIxFY3zqK8hItIx9TTO4/fDyJHBNRtjx0Y4mIiIhamn0QX9+sH06RDmynoRkZigotEO9TVERNqn\notEO9TVERNqnotGOrCz4/HM45/yJIiKCika74uK0tyEi0h4VjQ4UFKivISJyPhWNDsycGdzT6HsH\nJIuIdJ2KRgfS08HnC56HSkREglQ0OmCz6dBbEZHzWapouFwuMjIySEtLo7y8vM3jbrebYcOGkZOT\nQ05ODr/85S97NI+a4SIioSxz5T6/38+iRYuora0lMTGRvLw8ioqKcDqdIeNmzJjBCy+80CuZZs6E\nf//3YF/DZuuVlxQRsTTL7GnU1dWRmppKcnIydrud4uJiampq2ozrzVNljRsH/fvDnj299pIiIpbW\n5aLR3NzMvn37ePfdd3nvvffweDz4fL4uB/F6vSQlJbXedzgceL3ekDE2m4233nqL7OxsbrrpJnbt\n2tXl1zNCfQ0RkVBhTU81NTXxzDPPsGrVKt577z3Onj3LpZdeSr9+/Th27Bh+v58JEyYwZ84cSkpK\nSExMNLxtm4H5n0mTJuHxeBg0aBBr1qxhzpw5fPjhh+H8CGErKIAXX4T77+/RlxERiQqGikYgEODx\nxx9nxYoV/MM//AMPP/wwkydPZvjw4SFv9idOnGDLli2sW7eO2bNnk5+fz7Jlyxg0aFCnr5GYmIjn\nnPN2eDweHA5HyJihQ4e2fj1r1izuv/9+jh07xvDhw9tsr6ysrPXr/Px88vPzjfyobRQUwL/+KzQ3\nB1eKi4j0FW63G3eYp/Tu9HoaX331Fffccw/XX389d911F3a73dCGm5ubWbVqFStWrOB//ud/SEhI\nuOD4s2fPkp6eztq1a0lISGDy5MlUVVWFNMIPHz7M6NGjsdls1NXV8b3vfY+Ghoa2P1Q3rqfRnrQ0\n+OtfYcKEiG1SRMRyjLx3drqn8fjjj7Ns2TLGjRsX1ovHxcUxb9681r2NX//61xcOEh9PRUUFhYWF\n+P1+SkpKcDqdVFZWAlBaWspzzz3Hf//3fxMfH8+gQYNYuXJlWJm6quWUIioaIhLrdOU+A1auhKoq\naOdgLhGRPsPIe6eKhgGHDoHTCY2NwSv7iYj0RT16udd/+qd/avO9Rx55pN0eQ7QbOxYSEmDbNrOT\niIiYy3DRWLt2LYsWLWLVqlU0NjZy4sSJNmOWLFnCX/7yFzZu3BjRkFagU4qIiIRRNBISEvj444+5\n9957GTNmDK+//jo/+tGPeO655zhy5AgA/fv358EHH6S2trbHAptFi/xERLrQ02hubmb79u0sWLCA\nK6+8knXr1nH8+HHS09OZMWMGWVlZvPbaa712fqj2RLqnAXD0aPC0IkePgsGjjkVEokqP9DTi4uLI\nyckhOzub1atX09jYyObNm1mwYAEfffQRf/jDH5g/f36XQ1vViBGQkgLvvmt2EhER83T56KlVq1Zx\nyy23RDpPRPTEngYEV4aPGAE//WnENy0iYroePXrKqgWjJ+m64SIS6zotGsuWLePw4cNdfoHGxkYe\neOCBLj/fSqZPh3fegdOnzU4iImKOTovGj370IxYvXsyKFSvw+/2GNxwIBHjuuee49957+clPftKt\nkFYxbBhkZsLmzWYnERExR6dFY+jQoaxYsYJjx44xadIkfvazn/Haa69x/PjxNmNPnjzJunXrWLp0\nKTk5OWzevJmqqirGjh3bI+HNMHOm1muISOwKqxHecj2Nl19+mY0bN2Kz2Rg2bBg2m43PP/8cv9/P\ntddey+zZs7njjjvanNq8t/RUIxzg1Vfh0Udh/foe2byIiGkieu6pxx57jNzcXK677joGDBiAz+fj\n0KFDHDlyhObmZkaNGsXYsWMZOHBgRMJ3R08WjZMnYcwYOHIEDFwmREQkakTk1OgtZsyYwU033cTp\n06eZNm0ad9xxB3fffTeXX355t4NGk8GDYeJE2LQJbrjB7DQiIr3LcNHIyMjgO9/5DvPmzWPChAkh\nV+N788036d+/P9OmTeuRkFbTckoRFQ0RiTWGp6d+/OMf8+CDDzJq1Kg2jwUCAZ5//nl27NjBz372\nM+JMvi5qT05PQbAR/tBDOopKRPqWiC7uO378eLsFo+WFbrnlFhYuXBhybe5wuVwuMjIySEtLo7y8\nvMNx7777LvHx8axatarLr9UdU6fC3/4G7ZzoV0SkTzNcNJqamjodc8UVVzBlyhRef/31sIP4/X4W\nLVqEy+Vi165dVFVVsXv37nbHLVmyhBtvvLFH9yYu5KKLYPJk2LDBlJcXETGN4aJx4sQJQ2/Ss2fP\nxuVyhR2krq6O1NRUkpOTsdvtFBcXU9PO9VWffPJJ5s2b1+FeT2/RqdJFJBYZLhoTJkxg9erVhsae\n7sJ5NrxeL0lJSa33HQ4HXq+3zZiamhp++MMfAsFpMbPookwiEosMF41//Md/ZPHixXz22Wedjj12\n7FjYQYwUgAceeIDHHnustVlj5uXN8/Kgvh668KOKiEQtw4fcpqamcttttzF9+nRefPFFUlNT2x13\n+vRpPB5P2EESExNDnufxeNqsKN+yZQvFxcVA8ESIa9aswW63U1RU1GZ75zbk8/Pzyc/PDzvThfTv\nD9Omwbp1MHduRDctItIr3G43brc7rOeEdRqRM2fOUFhYSF1dHYsXL2bRokWMGTMm5PGSkhKuuOIK\nHnnkkbCCnD17lvT0dNauXUtCQgKTJ0+mqqoKp9PZ7viFCxdy8803t3uK9p4+5LZFeTl4vfDEEz3+\nUiIiPS6iK8IB7HY7r7zyCnfffTePPvooy5cvZ/z48aSlpQGwceNGhg4dyn/913+FHTY+Pp6KigoK\nCwvx+/2UlJTgdDqprKwEoLS0NOxt9rSZM2HhQrNTiIj0ni5fue+ll17iN7/5DevWraO5uZkBAwZw\n22238Zvf/IYRI0ZEOmdYemtP4+xZGDkS9uwJno9KRCSaRfSEhR05e/YsjY2NjBw5kvj4sHZcekxv\nFQ2AoiK4/Xb4/vd75eVERHpMj17utUV8fDxjx461TMHobTr0VkRiibknieoDtMhPRGKJikY3jR8f\nXKtx4IDZSUREep6KRjfFxUF+vqaoRCQ2qGhEgPoaIhIrVDQioKBAfQ0RiQ0qGhHgdMLp07B/v9lJ\nRER6lopGBNhsmqISkdigohEhOvRWRGKBikaEtOxpmHi2dhGRHqeiESEpKdCvH3z4odlJRER6jopG\nhKivISKxQEUjgtTXEJG+rttnubWi3jzL7bk++QRyc+HQoeBKcRGRaNIrZ7mVb1x+OVx8MezcaXYS\nEZGeYami4XK5yMjIIC0tjfLy8jaP19TUkJ2dTU5ODtdccw1vWHAuSH0NEenLLDM95ff7SU9Pp7a2\nlsTERPLy8tpcI/zkyZMMHjwYgA8++IC5c+eyd+/eNtsya3oK4Nln4S9/gdWrTXl5EZEui6rpqbq6\nOlJTU0lOTsZut1NcXExNTU3ImJaCAfDll18ycuTI3o7ZqYICWL8e/H6zk4iIRJ5liobX6yUpKan1\nvsPhwOv1thm3evVqnE4ns2bN4oknnujNiIZcdlnweuHbt5udREQk8ixzjVabzWZo3Jw5c5gzZw4b\nNmzgzjvvZM+ePe2OKysra/06Pz+f/Pz8CKQ0puXQ20mTeu0lRUTC5na7cbvdYT3HMj2NzZs3U1ZW\nhsvlAmD58uXExcWxZMmSDp+TkpJCXV0dI0aMCPm+mT0NgOeeg2eegZdfNi2CiEjYoqqnkZubS319\nPQ0NDfh8PqqrqykqKgoZs2/fvtYfaOvWrQBtCoYV5OfDxo1w5ozZSUREIssy01Px8fFUVFRQWFiI\n3++npKQEp9NJZWUlAKWlpfz1r39lxYoV2O12hgwZwsqVK01O3b6RIyE5GbZsgWuvNTuNiEjkWGZ6\nKpLMnp4CWLwYRo2Chx82NYaIiGFRNT3V12iRn4j0RdrT6CFNTZCUBI2NMGCAqVFERAzRnoaJLrkE\nMjLgnXfMTiIiEjkqGj2ooECnSheRvkVFowfNnKm+hoj0Lepp9KAvv4SxY+HIERg0yOw0IiIXpp6G\nyYYMgexseOsts5OIiESGikYP06G3ItKXqGj0MF03XET6EvU0ethXXwVXhh88CEOHmp1GRKRj6mlY\nwMCBkJcHGzaYnUREpPtUNHqB+hoi0leoaPQC9TVEpK9QT6MX+HwwYgR88glceqnZaURE2qeehkX0\n7w9Tp8K6dWYnERHpHhWNXqJTiohIX2C5ouFyucjIyCAtLY3y8vI2j//f//0f2dnZTJgwgWnTprFj\nxw4TUoZPzXAR6Qss1dPw+/2kp6dTW1tLYmIieXl5VFVV4XQ6W8e8/fbbZGZmMmzYMFwuF2VlZWze\nvDlkO1braQCcPRvsa+zdG1y3ISJiNVHX06irqyM1NZXk5GTsdjvFxcXU1NSEjJk6dSrDhg0DYMqU\nKRw4cMCMqGGLj4frrgO32+wkIiJdZ6mi4fV6SUpKar3vcDjwer0djn/qqae46aabeiNaROjQWxGJ\ndvFmBziXzWYzPPbNN9/k6aefZtOmTe0+XlZW1vp1fn4++fn53UzXfQUF8Ic/mJ1CRCTI7XbjDnP6\nw1I9jc2bN1NWVobL5QJg+fLlxMXFsWTJkpBxO3bs4JZbbsHlcpGamtpmO1bsaQA0Nwf7GR98AAkJ\nZqcREQkVdT2N3Nxc6uvraWhowOfzUV1dTVFRUciYTz75hFtuuYU///nP7RYMK4uLgxkzdBSViEQv\nS01PxcfHU1FRQWFhIX6/n5KSEpxOJ5WVlQCUlpbyi1/8gs8//5wf/vCHANjtdurq6syMHZaWvsbt\nt5udREQkfJaanooUq05PAezcCTffDB99ZHYSEZFQUTc9FQsyM+HkSWhoMDuJiEj4VDR6mc2m1eEi\nEr1UNEygoiEi0UpFwwQtzXCLtl1ERDqkomGCliOF9+41N4eISLhUNExgs+mUIiISnVQ0TKK+hohE\nI63TMMnHH8PkyXDoUHDPQ0TEbFqnYWFXXAGDB8OuXWYnERExTkXDROpriEi0UdEwkfoaIhJt1NMw\n0aefQlYWNDYGz4ArImIm9TQsLiEBRo+G7dvNTiIiYoyKhskKCtTXEJHooaJhspkz1dcQkeihnobJ\nPvsseFqRo0ch3lKXxBKRWBOVPQ2Xy0VGRgZpaWmUl5e3efzvf/87U6dO5aKLLuJXv/qVCQkja9So\n4JqNLVvMTiIi0jlLFQ2/38+iRYtwuVzs2rWLqqoqdu/eHTJmxIgRPPnkk/zbv/2bSSkjT4feiki0\nsFTRqKurIzU1leTkZOx2O8XFxdTU1ISMGTVqFLm5udjtdpNSRp4W+YlItLBU0fB6vSQlJbXedzgc\neL1eExP1junT4e23weczO4mIyIVZqvVqi+CZ+8rKylq/zs/PJz8/P2LbjrRLL4X0dHjnHbjuOrPT\niEiscLvduN3usJ5jqaKRmJiIx+Npve/xeHA4HF3a1rlFIxq09DVUNESkt5z/gXrp0qWdPsdS01O5\nubnU19fT0NCAz+ejurqaoqKidsdGyyG1RmmRn4hEA8ut01izZg0PPPAAfr+fkpISHnroISorKwEo\nLS3l0KFD5OXlceLECeLi4hg6dCi7du1iyJAhrduIpnUaLb74Ai67LLhuY+BAs9OISCwy8t5puaIR\nCdFYNACmToVf/hK+/W2zk4hILIrKxX2xTKcUERGrU9GwEC3yExGr0/SUhZw6FTxV+qFDcE6LRkSk\nxwUCEBfX+XunpQ65jXWDBsGMGXDNNZCXBzk539wuvdTsdCLSV/j9UF8P27aF3ozQnobF+Hywc2fo\n/8jt22HEiGDxmDTpm0KSkAARXA8pIn3Q118H31O2bv3mPWXHjuCsxrkfTHNyIDFRR0/1Cc3N7X8q\nsNna/k9PTdWlY0Vi1YkTwQ+Z575PfPghpKSEvk9MnAiXXNL2+Trktg8LBMDrDf3l2LoVjh2D7OzQ\nPZLMTOjf3+zEIhJJR46E/u1v2waffgpZWd/87U+aFLxvdO2XikYMOnoU3n8/tJg0NEBGRugnjexs\nNdtFokEgEPwbPn+m4dSptjMN6endu5ibioYAwV+uHTtCf+F27oTLL2/7SzdypNlpRWLX2bOwZ0/o\nHsT77wcPkjn/bzU5OfI9TRUN6dCZM7B7d2ghef99uPji0F3bnBxISlLDXSTSvvoKPvgg9G/wb3+D\nxMS2BWL06N7JpKIhYWluhv372+4G+3xtf4mvugr69TM7sUh0aGpqO228b1/w7+j8aeOLLzYvp4qG\nRMTBg20LyeHDMGFC6C98VhYMGGB2WhFzHTwYenjrtm3BpnV2dujfy9VXW+/vRUVDeszx420/Oe3d\nGzy0b/jw4NEaLbdBg0Lvt/e9zsZcdJGmyCRyzp4NTg+dOhX899ybke91NOajj4LbPn/PPC0tOvbM\nVTSkV50+DX//e7CgRPqP0ecLfiozUoC6UpTOvfXrF1zr0tFNui4QCE6DdnTz+cL/nenK71Zzc9d+\nRzobc/nl4HBE7wccFQ3pM5qbg0Wpu8XHyPfaezPz+4P/QsfFpLNic6HHI/Vcm6393Bf6mbryeFef\nGwgEM3b0M9nt3S/+RsbY7dH7xt6Toq5ouFyu1gsw3XvvvSxZsqTNmH/+539mzZo1DBo0iD/96U/k\n5OS0GaOiIT2lo0/KZrwBd/TY+W/GvVGsjD5us+nN2soMvXcGLOLs2bOBlJSUwP79+wM+ny+QnZ0d\n2LVrV8iYl19+OTBr1qxAIBAIbN68OTBlypR2t2WhH6tL3nzzTbMjdEs054/m7IGA8pst2vMbee+0\nzAxtXV0dqampJCcnY7fbKS4upqamJmTMCy+8wIIFCwCYMmUKTU1NHD582Iy4PcrtdpsdoVuiOX80\nZwflN1u05zfCMkXD6/WSlJTUet/hcOD1ejsdc+DAgV7LKCIS6yxTNGwGJzoD5823GX2eiIhEQM/P\nkhnz9ttvBwoLC1vvL1u2LPDYY4+FjCktLQ1UVVW13k9PTw8cOnSozbZSUlICgG666aabbmHcUlJS\nOn2vtsyV+3Jzc6mvr6ehoYGEhASqq6upqqoKGVNUVERFRQXFxcVs3ryZSy65hDFjxrTZ1t69e3sr\ntohITLFM0YiPj6eiooLCwkL8fj8lJSU4nU4qKysBKC0t5aabbuKVV14hNTWVwYMH88wzz5icWkQk\ntlhqnYaIiFibZRrhkeByucjIyCAtLY3y8nKz44TtnnvuYcyYMYwfP97sKGHzeDwUFBRw9dVXk5WV\nxRNPPGF2pLCcPn2aKVOmMHHiRDIzM3nooYfMjtQlfr+fnJwcbr75ZrOjhC05OZkJEyaQk5PD5MmT\nzY4TlqamJubNm4fT6SQzM5PNmzebHcmwPXv2kJOT03obNmzYhf9+u9y5thgjiwOtbv369YGtW7cG\nsrKyzI6E1SnvAAAE20lEQVQStoMHDwa2bdsWCAQCgS+++CJw1VVXRd1//5MnTwYCgUDgzJkzgSlT\npgQ2bNhgcqLw/epXvwr84Ac/CNx8881mRwlbcnJy4OjRo2bH6JK77ror8NRTTwUCgeDvT1NTk8mJ\nusbv9wfGjh0b+OSTTzoc02f2NIwsDrS66667jksvvdTsGF0yduxYJk6cCMCQIUNwOp18+umnJqcK\nz6BBgwDw+Xz4/X6GDx9ucqLwHDhwgFdeeYV77703ak+jE425jx8/zoYNG7jnnnuAYH922LBhJqfq\nmtraWlJSUkLWw52vzxQNI4sDpXc0NDSwbds2pkyZYnaUsDQ3NzNx4kTGjBlDQUEBmZmZZkcKy+LF\ni/nP//xP4qL0VLw2m43rr7+e3Nxc/vjHP5odx7D9+/czatQoFi5cyKRJk7jvvvs4deqU2bG6ZOXK\nlfzgBz+44Jjo/O1qhxb5WcOXX37JvHnz+N3vfseQIUPMjhOWuLg43n//fQ4cOMD69euj6pQQL730\nEqNHjyYnJycqP60DbNq0iW3btrFmzRp+//vfs2HDBrMjGXL27Fm2bt3K/fffz9atWxk8eDCPPfaY\n2bHC5vP5ePHFF7ntttsuOK7PFI3ExEQ8Hk/rfY/Hg8PhMDFR7Dlz5gy33nord9xxB3PmzDE7TpcN\nGzaM2bNn895775kdxbC33nqLF154gXHjxjF//nzeeOMN7rrrLrNjheWyyy4DYNSoUcydO5e6ujqT\nExnjcDhwOBzk5eUBMG/ePLZu3WpyqvCtWbOGa665hlGjRl1wXJ8pGucuDvT5fFRXV1NUVGR2rJgR\nCAQoKSkhMzOTBx54wOw4YWtsbKSpqQmAr776itdff73d0+5b1bJly/B4POzfv5+VK1cyc+ZMVqxY\nYXYsw06dOsUXX3wBwMmTJ3nttdei5ijCsWPHkpSUxIcffggE+wJXX321yanCV1VVxfz58zsdZ5nF\nfd3V0eLAaDJ//nzWrVvH0aNHSUpK4he/+AULFy40O5YhmzZt4s9//nPrIZMAy5cv58YbbzQ5mTEH\nDx5kwYIFNDc309zczJ133sm3v/1ts2N1WbRN1x4+fJi5c+cCweme22+/ne985zsmpzLuySef5Pbb\nb8fn85GSkhJ1C49PnjxJbW2toV6SFveJiIhhfWZ6SkREep6KhoiIGKaiISIihqloiIiIYSoaIiJi\nmIqGiIgYpqIhIiKGqWiIiIhhKhoivWj37t2sXbvW7BgiXaaiIdKLHnzwQZ5//nmzY4h0mYqGSC9p\nbm5m06ZNzJw50+woIl2moiHSS7Zv387x48eZPn262VFEukwnLBTpYatWreL5559n+/btHDlyhBtu\nuIGLL76Y3//+92ZHEwmbioZIL5kzZw5JSUk8+eSTZkcR6TJNT4n0Ar/fz7p165gxY4bZUUS6RUVD\npBds2bJF/QzpE1Q0RHrBG2+8QXp6OqNHjzY7iki3qGiI9II33nijdWrK5/PxyCOPmJxIpGtUNER6\nwaFDh8jKygLgt7/9LXfeeafJiUS6Jt7sACKx4KGHHqKqqorGxkauv/56kpOTzY4k0iU65FZERAzT\n9JSIiBimoiEiIoapaIiIiGEqGiIiYpiKhoiIGKaiISIihqloiIiIYSoaIiJimIqGiIgYpqIhIiKG\n/T9UmhdJ5aX2JQAAAABJRU5ErkJggg==\n", "text": "" } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "Simulations: Gluing it All Together\n===================================\n\n* Simulation class designed to save code repetition" }, { "cell_type": "code", "collapsed": false, "input": "# Specify the lattice and simulation\nlattice = pyQCD.Lattice(16, 32, 4.41, \"rectangle_improved\", 10)\nsim = pyQCD.Simulation(lattice, num_configs=100, num_warmup_updates=100)\n# Specify the callback function to load a config from disk during the simulation\ndef load_config(index):\n # N.B. These configs don't exist, so this simulation won't run.\n return pyQCD.io.load_ildg_config(\"some_config.lime{}\".format(index))\n# Tell the simulation \nsim.specify_ensemble(load_config, range(10, 1010, 10))\n\n@pyQCD.Log(ignore=(\"lattice,\")) # Decorator logs the function arguments\ndef compute_correlators(lattice, mass1, mass2):\n \"\"\"Compute all 256 meson correlators for the supplied masses\"\"\"\n invert_wilson = lattice.invert_wilson_dirac\n # Specify inversion functions\n inverter1 = partial(invert_wilson, mass=mass1, precondition=True)\n inverter2 = partial(invert_wilson, mass=mass2, precondition=True)\n # Define a point source\n src = lattice.point_source([0, 0, 0, 0])\n # Compute our propagators\n prop1 = pyQCD.compute_propagator(src, inverter1)\n prop2 = (prop1 if mass1 == mass2\n else pyQCD.compute_propagator(src, inverter2))\n # Use the props to compute meson correlators\n return pyQCD.compute_meson_corr256(prop1, prop2)\n\n# Add the measurement, specifying the function to write the result to disk\nsim.add_measurement(compute_correlators,\n pyQCD.io.write_datum_callback(\"16c32_m0.2_m0.2.zip\"),\n kwargs={'mass1': 0.2, 'mass2': 0.2})\n\nsim.run()", "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "Utilising Scipy/Numpy\n=====================" }, { "cell_type": "code", "collapsed": false, "input": "import numpy as np\nimport scipy.sparse.linalg as spla\n\nlogger.setLevel(logging.WARN)\n\nlattice = pyQCD.Lattice(4, 8, 5.5, \"wilson\", 10)\n\ndef matvec(psi):\n return lattice.apply_wilson_dirac(psi, 0.2).flatten()\n\nN = 12 * np.prod(lattice.shape)\nlinop = spla.LinearOperator(shape=(N, N), matvec=matvec)\n\neigvals, eigvecs = spla.eigs(linop, k=200)\n\nplt.plot(eigvals.real, eigvals.imag, 'o')\nplt.xlabel(\"$\\mathrm{Re}\\lambda$\", fontsize=18)\nplt.ylabel(\"$\\mathrm{Im}\\lambda$\", fontsize=18)\nplt.show()", "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nDRumtLQ0jRo1qg0rBID2KySDY+jQodqxY4fGjRt3x36WZcnlcqm8vFxlZWWtXpfL5Wr194A31nnb\nY523vXBb5yEZHMnJybr//vub1Lctz12E2//cSMA6b3us87YXbus8JIOjqSzL0oQJEzRixAht2FD/\n7mwAQGsI2rOqMjIydPbs2QbtL774oqZPn96kZbz77ru6++679dVXXykjI0PJyclKT08PdKkAgNvZ\nIczpdNpHjhxpUt+8vDx77dq1PuelpqbakpiYmJiYDKbU1FSf+9SQfzqu7eccxrVr1+R2u9WtWzdd\nvXpVb775ppYvX+6z7/vvv9+aJQJAuxKS5zh27Nghh8Oh0tJSTZ06VZMnT5YknTlzRlOnTpUknT17\nVunp6XrggQc0evRoTZs2TRMnTgxm2QDQLrSLO8cBAIETkkccwXbx4kU9+uijSklJ0aBBg1RaWuo1\n3+VyKTY2VmlpaUpLS9OqVauCVGlk+Pjjjz3rMi0tTbGxsVq3bl2DfkuXLtWAAQOUmpqq8vLyIFQa\nOZqyztnOA++ll17S4MGDNXToUD322GP6+uuvG/QJi+28eaetI9vcuXPtV155xbZt275586Z98eJF\nr/kHDhywp0+fHozSIp7b7bb79u1rf/HFF17tu3fvtidPnmzbtm2Xlpbao0ePDkZ5EcnfOmc7D6zT\np0/b99xzj339+nXbtm179uzZ9muvvebVJ1y2c4446rl06ZLeeecdPfHEE5Kk6OhoxcbGNuhnM8LX\nKvbt26f77rtPDof3NyTu2rVLOTk5kqTRo0fr4sWLqq6uDkaJEcffOpfYzgOpe/fu6tixo65du6aa\nmhpdu3ZN8fHxXn3CZTsnOOo5ffq0+vTpo3nz5mn48OHKzc3VtWvXvPpYlqWDBw8qNTVVU6ZM0fHj\nx4NUbeQpKirSY4891qC9qqrKa8eWkJCgysrKtiwtYvlb52zngdWrVy8999xz+t73vqd+/fqpR48e\nmjBhglefcNnOCY56ampqdPToUT311FM6evSounTpotWrV3v1GT58uCoqKnTs2DEtWbJEM2bMCFK1\nkeXGjRsqLi7WrFmzfM6v/9evZVltUVZEu9M6ZzsPrE8++US//e1v9dlnn+nMmTO6cuWK/vrXvzbo\nFw7bOcFRT0JCghISEjRy5EhJ0qOPPtrgCb3dunVTTEyMJGny5Mm6efOmLly40Oa1Rpo9e/bowQcf\nVJ8+fRrMi4+PV0XFt9+aWFlZ2eAwH+butM7ZzgPr8OHDeuihh9S7d29FR0dr5syZOnjwoFefcNnO\nCY56+vbtK4fDoRMnTkiqG/8dPHiwV5/q6mrPXwVlZWWybVu9evVq81ojTWFhobKzs33Oy8zM1Ouv\nvy5JKi0tVY8ePRQXF9eW5UWkO61ztvPASk5OVmlpqf73v//Jtm3t27dPgwYN8uoTLtt5yN85Hgy/\n//3v9fjjj+vGjRu677779Oqrr2r9+vWSpIULF2r79u0qKChQdHS0YmJiVFRUFOSKw9/Vq1e1b98+\nr4dV3r7Op0yZopKSEiUlJalLly7auHFjsEqNGI2tc7bzwEpNTdXcuXM1YsQIRUVFec6hhuN2zg2A\nAAAjDFUBAIwQHAAAIwQHAMAIwQEAMEJwAACMEBwAACMEBwDACMEBhLjf/OY3GjZsmA4dOhTsUgBJ\n3AAItNihQ4e0du1a/etf/9KlS5eUkZGhfv366caNG7p8+bL69OmjJUuW6IEHHmj2e8yaNUuff/65\nysrKAlg50DwEBxAgy5cv18qVK3Xu3DmvZzq9/PLLeuqpp/Tqq6/qJz/5SbOW/fe//12ZmZk6ceKE\nkpKSAlUy0CwMVQEB4u/x1wsWLNB3vvMd/exnP2v2sidOnKiePXtq8+bNzV4GECgEB9DK3G63ampq\n1L1792Yvo1OnTvrxj3+swsLCAFYGNA/BAQTY7aO/NTU1WrVqlXr16qVNmzZ59XO73XrhhRe0ZMkS\nvfDCC5o1a5Y++ugjv8vNzs7Wxx9/rPLy8larHWgKHqsOBNi6desUExOjs2fPauvWrZo9e7ZOnTql\n7373u1795s+frw4dOuiVV16RJB07dkwTJkzQyZMn1bVr1wbLHT9+vO666y4VFhYqLS2tTT4L4AvB\nAQTYT3/6U8/J8blz58rpdGrgwIF68sknPX3ef/99vf766zpy5IinLTU1VZ07d1ZxcbHPL1dav369\nevfuraKiIv3f//1f638QwA+CA2hFaWlpmjlzpp599lk9/vjj6tatmyTpwIEDkqSSkhK9/fbbnv4P\nPfRQgyMTSSooKNCJEyf08ssv6/vf/77eeecdpaent82HAOohOIBW1rt3b3399dd6//33PTv7qKi6\n04vZ2dm699577/j7BQUFKi4u1u7duyVJ/fv31+bNmwkOBA0nx4FW1rlzZ0nS8ePHPW0TJkyQVDdk\ndbtr167p8OHDntcFBQXKz8/Xli1bZFmWLMtSVlaWtm/fLrfb3QbVAw0RHECAfHM1VU1NjVf7ww8/\nLEl67733JEnFxcXq1KmTli5dqnXr1qm2ttbTd+3aterRo4ck6U9/+pOWLVum4uJizxCXVHeUcv78\nef3jH/9o1c8D+MOd40ALHTp0SL/+9a89jxxJSUnR2LFjtWHDBk+fv/zlL/rDH/6gadOmybIsPf/8\n85Kk/Px8HTx4UImJiaqpqVFmZqZ+8IMfyO12KykpSZs2bdK4ceMavOePfvQjde7cWW+88UabfU7g\nGwQHAMAIQ1UAACMEBwDACMEBADBCcAAAjBAcAAAjBAcAwAjBAQAwQnAAAIwQHAAAIwQHAMDI/wMn\nx/3QV3S6OgAAAABJRU5ErkJggg==\n", "text": "" } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "CUDA Support\n============\n\n* Single-precision GPU inverters using thrust and cusp\n* Benchmark: tree-level Wilson matrix inversion for $16^3\\times32$\n* Intel Sandybridge (dual core, 2.6 GHz): ~170 seconds\n* nVidia GeForce GTX 650 Ti: ~10 seconds\n* Extra hopping terms more expensive\n* Code to be optimized" }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "The Bleeding Edge: Code Generation\n==================================\n\n* Need extensibility in linear operators\n* Write Python class\n* Convert to C++ via Python AST and Jinja2" }, { "cell_type": "code", "collapsed": false, "input": "# Example input file: wilson.py\n\nimport numpy as np\n\nimport pyQCD\n\n@types(mass_=\"double\", hoppingMatrix_='HoppingTerm*')\nclass Wilson(object):\n\n @types(mass=\"const double\")\n def __init__(self, mass):\n\n self.mass_ = mass\n self.hoppingMatrix_ = HoppingTerm(1)\n\n @types(psi='VectorXcd', eta='VectorXcd')\n def apply(self, psi):\n\n eta = (4 + self.mass_) * psi\n eta -= 0.5 * self.hoppingMatrix_.apply(psi)\n return eta", "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": "pyQCD.codegen.gen_from_src(\"wilson.py\")", "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": "cat wilson.cpp", "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": "#include \r\n\r\nWilson::Wilson(\r\n const double mass, \r\n const vector >& boundaryConditions,\r\n const Lattice* lattice) : LinearOperator::LinearOperator()\r\n{\r\n // Class constructor - we set the fermion mass, create a pointer to the \r\n // lattice and compute the frequently used spin structures used within the\r\n // Dirac operator.\r\n this->operatorSize_ \r\n = 12 * int(pow(lattice->spatialExtent, 3)) * lattice->temporalExtent;\r\n this->lattice_ = lattice;\r\n\r\n \r\n this->mass_ = mass;\r\n this->hoppingMatrix_ = new HoppingTerm(boundaryConditions, lattice, 1);\r\n\r\n // These should be generated depending on whether there's a hopping matrix\r\n // available\r\n this->evenIndices_ = this->hoppingMatrix_->getEvenIndices();\r\n this->oddIndices_ = this->hoppingMatrix_->getOddIndices();\r\n}\r\n\r\n\r\n\r\nWilson::~Wilson()\r\n{\r\n // Need to determine which member_functions\r\n \r\n delete this->hoppingMatrix_;\r\n \r\n}\r\n\r\n\r\n\r\nVectorXcd Wilson::apply(const VectorXcd& psi)\r\n{\r\n VectorXcd eta;\r\n \r\n eta = ((4 + this->mass_) * psi);\r\n eta -= (0.5 * this->hoppingMatrix_->apply(psi));\r\n return eta;\r\n}\r\n\r\n\r\n\r\nVectorXcd Wilson::applyHermitian(const VectorXcd& psi)\r\n{\r\n \r\n return psi;\r\n}\r\n\r\n\r\n\r\nVectorXcd Wilson::makeHermitian(const VectorXcd& psi)\r\n{\r\n \r\n return psi;\r\n}\r\n\r\n\r\n\r\nVectorXcd Wilson::applyEvenEvenInv(const VectorXcd& psi)\r\n{\r\n // Invert the even diagonal piece\r\n \r\n return (psi / ((1 + (3 / this->lattice_->chi())) + this->mass_));\r\n}\r\n\r\n\r\n\r\nVectorXcd Wilson::applyOddOdd(const VectorXcd& psi)\r\n{\r\n // Invert the even diagonal piece\r\n \r\n return psi;\r\n}\r\n\r\n\r\n\r\nVectorXcd Wilson::applyEvenOdd(const VectorXcd& psi)\r\n{\r\n \r\n return psi;\r\n}\r\n\r\n\r\n\r\nVectorXcd Wilson::applyOddEven(const VectorXcd& psi)\r\n{\r\n \r\n VectorXcd eta = 0.5 * psi;\r\n return eta;\r\n}" } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "Other Stuff\n===========" }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": "If I'd had more time:\n\n* Under the hood - C++ code\n* Analysis sub-package - parallel resampling etc.\n* IO interfaces - Chroma hadspec, ILDG, Scidac etc." }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": "What next?\n\n* Version 1.0.0\n* MOAR actions - Iwasaki, HQET, clover, Moebius DWF, etc.\n* GPU optimisation\n* C++ 11" }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": "Final Remarks\n=============\n\n* Github: http://www.github.com/mspraggs/pyQCD\n* Lots still to do\n* Looking for contributers/developers/collaborators: matthew.spraggs@gmail.com" } ], "metadata": {} } ] }