2017-09-27 1 views
3

나는 2D 격자의 이싱 모델에 대한 몬테 카를로 시뮬레이션을하는 파이썬 스크립트를 가지고있다. 엠씨 시뮬레이션은 당황 스럽지만 모든 온도에 대한 샘플링을 서로 다른 스레드에 분산시킬 수 있습니다. 다중 처리 모듈을 사용하고 싶지만이 패키지는 처음입니다. 어떻게해야합니까? 여기파이썬에서 이싱 모델을 병렬 처리하는 방법 (다중 처리 패키지)?

from __future__ import division 
import numpy as np 
from numpy.random import rand 
import matplotlib.pyplot as plt 
import multiprocessing as mp 

nt = 5 
N  = 16 

Energy = np.zeros(nt) 
Magnetization = np.zeros(nt) 

T = np.linspace(1, 5, nt) 

## monte carlo moves 
def mcmove(config, beta): 
    for i in range(N): 
     for j in range(N): 
       a = np.random.randint(0, N) 
       b = np.random.randint(0, N) 
       s = config[a, b] 
       nb = config[(a+1)%N,b] + config[a,(b+1)%N] + config[(a-1)%N,b] + config[a,(b-1)%N] 
       cost = 2*s*nb 
       if cost < 0: 
        s *= -1 
       elif rand() < np.exp(-cost*beta): 
        s *= -1 
       config[a, b] = s 
    return config 

# calculate thermodynamic variables 
def calcEnergy(config): 
    energy = 0 
    for i in range(len(config)): 
     for j in range(len(config)): 
      S = config[i,j] 
      nb = config[(i+1)%N, j] + config[i,(j+1)%N] + config[(i-1)%N, j] + config[i,(j-1)%N] 
      energy += -nb*S 
    return energy/4. 

def calcMag(config): 
    mag = np.sum(config) 
    return mag 

def simulate(): 
# -->: parallelize T 
    for m in range(len(T)): 
     E1 = M1 = 0 
     def initialstate(N): 
      state = 2*np.random.randint(2, size=(N,N))-1 
      return state 

     eqSteps = 2000 
     config = initialstate(N) 
     for i in range(eqSteps): 
      mcmove(config, 1.0/T[m]) 

     mcSteps = 2000 
     for i in range(mcSteps): 
      mcmove(config, 1.0/T[m]) 
      Ene = calcEnergy(config)   
      Mag = calcMag(config)   

      E1 = E1 + Ene 
      M1 = M1 + Mag 

      Energy[m]   = E1/(mcSteps*N*N) 
      Magnetization[m] = M1/(mcSteps*N*N) 

    return Magnetization, Energy 

Magnetization, Energy = simulate() 
print Magnetization, Energy 

답변

0

당신이가는 :

from __future__ import division 
import numpy as np 
from numpy.random import rand 
import matplotlib.pyplot as plt 
import multiprocessing as mp 

nt = 5 
N  = 16 

Energy = np.zeros(nt) 
Magnetization = np.zeros(nt) 

T = np.linspace(1, 5, nt) 

## monte carlo moves 
def mcmove(config, beta): 
    for i in range(N): 
     for j in range(N): 
       a = np.random.randint(0, N) 
       b = np.random.randint(0, N) 
       s = config[a, b] 
       nb = config[(a+1)%N,b] + config[a,(b+1)%N] + config[(a-1)%N,b] + config[a,(b-1)%N] 
       cost = 2*s*nb 
       if cost < 0: 
        s *= -1 
       elif rand() < np.exp(-cost*beta): 
        s *= -1 
       config[a, b] = s 
    return config 

# calculate thermodynamic variables 
def calcEnergy(config): 
    energy = 0 
    for i in range(len(config)): 
     for j in range(len(config)): 
      S = config[i,j] 
      nb = config[(i+1)%N, j] + config[i,(j+1)%N] + config[(i-1)%N, j] + config[i,(j-1)%N] 
      energy += -nb*S 
    return energy/4. 

def calcMag(config): 
    mag = np.sum(config) 
    return mag 


def run_one(m): 
    E1 = M1 = _Energy = _Magnetization = 0 

    def initialstate(N): 
     state = 2 * np.random.randint(2, size=(N, N)) - 1 
     return state 

    eqSteps = 2000 
    config = initialstate(N) 
    for i in range(eqSteps): 
     mcmove(config, 1.0/m) 

    mcSteps = 2000 
    for i in range(mcSteps): 
     mcmove(config, 1.0/m) 
     Ene = calcEnergy(config) 
     Mag = calcMag(config) 

     E1 = E1 + Ene 
     M1 = M1 + Mag 

     _Energy= E1/(mcSteps * N * N) 
     _Magnetization = M1/(mcSteps * N * N) 

    return _Energy, _Magnetization 


def parallel_sim(): 
    p = mp.Pool() 
    results = p.map(run_one, T) 
    p.close() 
    p.join() 
    _e = [] 
    _m = [] 
    for _r in results: 
     _e.append(_r[0]) 
     _m.append(_r[1]) 
    return _e, _m 

print parallel_sim() 

내가 알고리즘에 대해 아무것도 몰라, 내가 그것을 휴식하지 않았다 확인하시기 바랍니다. 이제는 T의 각 요소를 병렬 프로세스로 매핑합니다.

+0

고맙습니다! 그게 효과가 있었어! – user3503316

+0

질문에 대한 답변을 수락 할 수 있습니다. – Hannu

관련 문제