New measurement?
Python: Interpretted, dynamic, high-level, clean, readable
Advantages:
Disadvantages:
Lattice: Computationally intensive
import mylatlib
L, T = 64, 128
gauge_field = mylatlib.cold_start(L, T)
gauge_field.heatbath(gauge_action="wilson", num_updates=100)
correlators = []
for i in range(100):
prop = mylatlib.compute_wilson_prop(mass=0.1, gauge_field=gauge_field)
correlators.append(mylatlib.meson256(prop, prop))
gauge_field.heatbath(gauge_action="wilson", num_updates=10)
mylatlib.save("the_results", correlators)
Boost: Set of C++ libraries to meet a range of needs
import pyQCD
pyQCD.Lattice?
lattice = pyQCD.Lattice(L=4, T=8,
beta=5.5, action="wilson",
meas_spacing=10,
update_method="heatbath")
for i in range(20):
print(lattice.get_av_plaquette())
lattice.update()
1.0 0.677212100634 0.606080363109 0.582105738445 0.569080803066 0.553415653993 0.546253245247 0.55368210462 0.543724196044 0.543449019208 0.530287742852 0.536358448341 0.531648918407 0.523198238956 0.526104260619 0.535878008182 0.530129644588 0.530319050766 0.515835581035 0.523753116326
config = lattice.get_config()
print("Config type: {}".format(type(config)))
print("Config shape: {}".format(config.shape))
print("")
print("Gauge field for link (t, x, y, z, mu) = (4, 3, 1, 2, 2):")
print(config[4, 3, 1, 2, 2])
Config type: <type 'numpy.ndarray'> Config shape: (8, 4, 4, 4, 4, 3, 3) Gauge field for link (t, x, y, z, mu) = (4, 3, 1, 2, 2): [[ 0.29174629+0.34677621j 0.54282605+0.5321648j 0.16150985+0.43667543j] [ 0.56601344-0.36843713j -0.56778741+0.22000427j 0.35188917+0.22197403j] [ 0.26066156-0.52016227j 0.22661714-0.00087105j -0.74525822+0.23392489j]]
lattice = pyQCD.Lattice(8, 4, 5.8, "rectangle_improved", 10)
# Thermalize with 100 updates
lattice.thermalize(100)
for i in range(10):
print("Generating config {}".format(i))
# Do ten updates
lattice.next_config()
lattice.save_config("config{}.npy".format(i))
Generating config 0 Generating config 1 Generating config 2 Generating config 3 Generating config 4 Generating config 5 Generating config 6 Generating config 7 Generating config 8 Generating config 9
from functools import partial
lattice = pyQCD.Lattice(4, 8, 5.5, "wilson", 10)
inverter = partial(lattice.invert_wilson_dirac, mass=0.2)
source = lattice.point_source([0, 0, 0, 0])
print("Source type: {}".format(type(source)))
print("Source shape: {}".format(source.shape))
print("Source non-zero entries: {}".format(source.nonzero()))
Source type: <type 'numpy.ndarray'> Source shape: (8, 4, 4, 4) Source non-zero entries: (array([0]), array([0]), array([0]), array([0]))
%matplotlib inline
import logging
import matplotlib.pyplot as plt
logger = logging.getLogger()
logger.setLevel(logging.INFO)
prop = pyQCD.compute_propagator(source, inverter)
print("")
print("Propagator shape: {}".format(prop.shape))
ps_correlator = pyQCD.compute_meson_corr(prop, prop, "g5", "g5")
plt.plot(ps_correlator)
plt.xlabel("$t$", fontsize=18)
plt.ylabel("$C(t)$", fontsize=18)
plt.show()
INFO:pyQCD.core.propagator.compute_propagator:Computing propagator... INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 0 and colour 0 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator... INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1] INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 7.74084048616e-09 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 0.9 INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.281537055969 INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 0 and colour 1 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator... INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1] INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 7.74083966548e-09 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 0.9 INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.264081001282 INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 0 and colour 2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator... INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1] INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 7.94331972902e-09 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 0.96 INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.288220882416 INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 1 and colour 0 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator... INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1] INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 7.74083966548e-09 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.49 INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.510751008987 INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 1 and colour 1 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator... INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1] INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 7.74083966548e-09 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.21 INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.393754005432 INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 1 and colour 2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator... INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1] INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 7.74425570153e-09 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.03 INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.316509962082 INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 2 and colour 0 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator... INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1] INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 6.24324606357e-09 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.45 INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.495503902435 INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 2 and colour 1 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator... INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1] INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 6.24324606357e-09 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.34 INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.450342178345 INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 2 and colour 2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator... INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1] INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 6.24324606357e-09 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.67 INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.593438863754 INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 3 and colour 0 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator... INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1] INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 6.24324606357e-09 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.45 INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.493458986282 INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 3 and colour 1 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator... INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1] INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 6.24324606357e-09 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.54 INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.519629955292 INFO:pyQCD.core.propagator.compute_propagator:Inverting for spin 3 and colour 2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Inverting Wilson Dirac operator... INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:solver_method: conjugate_gradient INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:boundary_conditions: [-1, 1, 1, 1] INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:precondition: False INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:mass: 0.2 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:tolerance: 1e-08 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:max_iterations: 1000 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:Solver finished after 77 iterations with residual 6.92040690981e-09 INFO:pyQCD.core.lattice.Lattice.invert_wilson_dirac:CPU time used: 1.29 INFO:pyQCD.core.propagator.compute_propagator:Inversion walltime: 0.423326015472 INFO:pyQCD.core.propagator.compute_propagator:Finished computing propagator
Propagator shape: (8, 4, 4, 4, 4, 4, 3, 3)
/usr/lib/python2.7/dist-packages/numpy/core/numeric.py:460: ComplexWarning: Casting complex values to real discards the imaginary part return array(a, dtype, copy=False, order=order)
# Specify the lattice and simulation
lattice = pyQCD.Lattice(16, 32, 4.41, "rectangle_improved", 10)
sim = pyQCD.Simulation(lattice, num_configs=100, num_warmup_updates=100)
# Specify the callback function to load a config from disk during the simulation
def load_config(index):
# N.B. These configs don't exist, so this simulation won't run.
return pyQCD.io.load_ildg_config("some_config.lime{}".format(index))
# Tell the simulation
sim.specify_ensemble(load_config, range(10, 1010, 10))
@pyQCD.Log(ignore=("lattice,")) # Decorator logs the function arguments
def compute_correlators(lattice, mass1, mass2):
"""Compute all 256 meson correlators for the supplied masses"""
invert_wilson = lattice.invert_wilson_dirac
# Specify inversion functions
inverter1 = partial(invert_wilson, mass=mass1, precondition=True)
inverter2 = partial(invert_wilson, mass=mass2, precondition=True)
# Define a point source
src = lattice.point_source([0, 0, 0, 0])
# Compute our propagators
prop1 = pyQCD.compute_propagator(src, inverter1)
prop2 = (prop1 if mass1 == mass2
else pyQCD.compute_propagator(src, inverter2))
# Use the props to compute meson correlators
return pyQCD.compute_meson_corr256(prop1, prop2)
# Add the measurement, specifying the function to write the result to disk
sim.add_measurement(compute_correlators,
pyQCD.io.write_datum_callback("16c32_m0.2_m0.2.zip"),
kwargs={'mass1': 0.2, 'mass2': 0.2})
sim.run()
import numpy as np
import scipy.sparse.linalg as spla
logger.setLevel(logging.WARN)
lattice = pyQCD.Lattice(4, 8, 5.5, "wilson", 10)
def matvec(psi):
return lattice.apply_wilson_dirac(psi, 0.2).flatten()
N = 12 * np.prod(lattice.shape)
linop = spla.LinearOperator(shape=(N, N), matvec=matvec)
eigvals, eigvecs = spla.eigs(linop, k=200)
plt.plot(eigvals.real, eigvals.imag, 'o')
plt.xlabel("$\mathrm{Re}\lambda$", fontsize=18)
plt.ylabel("$\mathrm{Im}\lambda$", fontsize=18)
plt.show()
# Example input file: wilson.py
import numpy as np
import pyQCD
@types(mass_="double", hoppingMatrix_='HoppingTerm*')
class Wilson(object):
@types(mass="const double")
def __init__(self, mass):
self.mass_ = mass
self.hoppingMatrix_ = HoppingTerm(1)
@types(psi='VectorXcd', eta='VectorXcd')
def apply(self, psi):
eta = (4 + self.mass_) * psi
eta -= 0.5 * self.hoppingMatrix_.apply(psi)
return eta
pyQCD.codegen.gen_from_src("wilson.py")
cat wilson.cpp
#include <linear_operators/wilson.hpp> Wilson::Wilson( const double mass, const vector<complex<double> >& boundaryConditions, const Lattice* lattice) : LinearOperator::LinearOperator() { // Class constructor - we set the fermion mass, create a pointer to the // lattice and compute the frequently used spin structures used within the // Dirac operator. this->operatorSize_ = 12 * int(pow(lattice->spatialExtent, 3)) * lattice->temporalExtent; this->lattice_ = lattice; this->mass_ = mass; this->hoppingMatrix_ = new HoppingTerm(boundaryConditions, lattice, 1); // These should be generated depending on whether there's a hopping matrix // available this->evenIndices_ = this->hoppingMatrix_->getEvenIndices(); this->oddIndices_ = this->hoppingMatrix_->getOddIndices(); } Wilson::~Wilson() { // Need to determine which member_functions delete this->hoppingMatrix_; } VectorXcd Wilson::apply(const VectorXcd& psi) { VectorXcd eta; eta = ((4 + this->mass_) * psi); eta -= (0.5 * this->hoppingMatrix_->apply(psi)); return eta; } VectorXcd Wilson::applyHermitian(const VectorXcd& psi) { return psi; } VectorXcd Wilson::makeHermitian(const VectorXcd& psi) { return psi; } VectorXcd Wilson::applyEvenEvenInv(const VectorXcd& psi) { // Invert the even diagonal piece return (psi / ((1 + (3 / this->lattice_->chi())) + this->mass_)); } VectorXcd Wilson::applyOddOdd(const VectorXcd& psi) { // Invert the even diagonal piece return psi; } VectorXcd Wilson::applyEvenOdd(const VectorXcd& psi) { return psi; } VectorXcd Wilson::applyOddEven(const VectorXcd& psi) { VectorXcd eta = 0.5 * psi; return eta; }
If I'd had more time:
What next?