diff --git a/main.py b/main.py index 3d67fcb006e8fc01e9a698711bd9f92600a0e43b..622362bd2cf122f3027f0da2c8bec2126a89dafd 100644 --- a/main.py +++ b/main.py @@ -1,10 +1,7 @@ import numpy as np from timeit import default_timer as timer - -from parameters import * -from observables import * -#from metropolis import * -from sampling import * +from parameters import t_min, t_max, nt, eqSteps, mcSteps, Ns +from sampling import finite_ising T = np.linspace(t_min, t_max, nt) Ns = np.array(Ns) @@ -15,6 +12,7 @@ for N in Ns: result = finite_ising(N,mcSteps,eqSteps,T) end = timer() - print('Time the code takes to run for a lattice size of ' + str(N) + ': ' + str((end - start) / 60) + ' minutes.') + print('Time the code takes to run for a lattice of size ' + str(N), + + ': ' + str((end - start) / 60) + ' minutes.') - np.savetxt("data/data_ising_" + str(N) + ".csv" , result.T, delimiter=",") + np.savetxt("data/data_ising_" + str(N) + ".csv" , result.T, delimiter=",") \ No newline at end of file diff --git a/metropolis.py b/metropolis.py index 86510849323321d2d077572f877e64792c7b694c..7a993aacdb2ce147e17cfaa78921cd9a351e89aa 100644 --- a/metropolis.py +++ b/metropolis.py @@ -1,14 +1,32 @@ import numpy as np def pi_0(N): + """Genera un arreglo NxN de numpy con valores 1 o -1 escogidos aleatoriamente. + + Argumentos: + + N -- int + tamaño de la red + """ Pi_0 = 2*np.random.randint(2 , size = (N,N)) - 1 return Pi_0 def MC_metropolis(arreglo, beta, N): + """Ejecuta un paso de monte carlo sobre una configuración de espines + + Argumentos: + + arreglo -- arreglo NxN de numpy + valores del espin en cada sitio + beta -- flotante + inverso de la temperatura en unidades donde kb = J = 1 + N -- int + """ for i in range(0, 2 * N**2): a, b = np.random.randint(0,N), np.random.randint(0,N) rand_spin = arreglo[a, b] - vecinos = arreglo[(a+1)%N, b] + arreglo[a, (b+1)%N] + arreglo[(a-1)%N, b] + arreglo[a, (b-1)%N] + vecinos = arreglo[(a+1)%N, b] + arreglo[a, (b+1)%N] + \ + arreglo[(a-1)%N, b] + arreglo[a, (b-1)%N] delta_energia = 2 * rand_spin * vecinos if delta_energia < 0: arreglo[a,b] *= -1 diff --git a/observables.py b/observables.py index 8185e9f05519167c84f93deb2e3bc91c505cf3d1..0436f5b0567f7c7644fc73b3a6325b79044ba81c 100644 --- a/observables.py +++ b/observables.py @@ -1,14 +1,31 @@ import numpy as np def energia(arreglo, N): + """Devuelve la energia de una configuración de espines. + + Argumentos: + + arreglo -- arreglo NxN de numpy + valores del espin en cada sitio + N -- entero + tamaño de la red + """ energia = 0 for i in range(0,N): for j in range(0,N): spin = arreglo[i,j] - vecinos = arreglo[(i+1)%N, j] + arreglo[i, (j+1)%N] + arreglo[(i-1)%N, j] + arreglo[i, (j-1)%N] + vecinos = arreglo[(i+1)%N, j] + arreglo[i, (j+1)%N] + \ + arreglo[(i-1)%N, j] + arreglo[i, (j-1)%N] energia += - spin * vecinos return energia / 2 def magnetizacion(arreglo): + """Devuelve la magnetización de una configuración de espines. + + Argumentos: + + arreglo -- arreglo NxN de numpy + valores del espin en cada sitio + """ magnetizacion = np.sum(arreglo) return abs(magnetizacion) \ No newline at end of file diff --git a/sampling.py b/sampling.py index a61892e14e9f7fc05117e726a660612d386936eb..fe952e46aef26ff677b4945fd598806d9fec5034 100644 --- a/sampling.py +++ b/sampling.py @@ -1,13 +1,26 @@ import numpy as np -from parameters import * -from observables import * -from metropolis import * +from observables import energia, magnetizacion +from metropolis import pi_0, MC_metropolis def finite_ising(N,mcSteps,eqSteps,T): + """Devuelve los observables fÃsicos para los valores de temperatura + y tamaño de la red dados. + + Argumentos: + + N -- entero + tamaño de la red + eqSteps -- entero + numero de pasos de Monte Carlo para termalización + mcSteps -- entero + numero de pasos de Monte Carlo para realizar el muestreo + T -- arreglo de numpy + conjunto de temperaturas para las que se calcularan las cantidades fisicas + """ nt = len(T) - E,M,C,X,U = np.zeros(nt), np.zeros(nt), np.zeros(nt), np.zeros(nt), np.zeros(nt)#, np.zeros(nt) + E,M,C,X,U = np.zeros(nt), np.zeros(nt), np.zeros(nt), np.zeros(nt), np.zeros(nt) N2 = N*N for t in range(nt): @@ -17,21 +30,13 @@ def finite_ising(N,mcSteps,eqSteps,T): if t > 1.5 and t < 4.5: eqSteps_p = eqSteps - for i in range(eqSteps_p): # esto es supuestamente para llevarlo al equilibrio + for i in range(eqSteps_p): arreglo = MC_metropolis(arreglo, beta, N) - #magn = magnetizacion(arreglo) - #energ = energia(arreglo) - #full_M.append(magn/N2) - #full_E.append(energ) else: - for i in range(eqSteps): # esto es supuestamente para llevarlo al equilibrio + for i in range(eqSteps): arreglo = MC_metropolis(arreglo, beta, N) - #magn = magnetizacion(arreglo) - #energ = energia(arreglo) - #full_M.append(magn/N2) - #full_E.append(energ) - for i in range(mcSteps): # y aquà supuestamente el sistema se está desenvolviendo en el equilibrio + for i in range(mcSteps): arreglo = MC_metropolis(arreglo,beta, N) energ = energia(arreglo, N) magn = magnetizacion(arreglo)