import os, sys, time, math
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import multiprocessing as mul
from functools import partial
import multiprocessing.pool
def func2(x, E):
f=1/np.sqrt(abs(E-2*x**(2.0)))
return f
def simp(ifunc, a, b, N, E):
h=abs((b-a)/N)
sum = 0
for i in range (1, N, 2):
sum = sum + 4*ifunc(a+i*h,E)
for i in range (2, N, 2):
sum = sum + 2*ifunc(a+i*h,E)
result = (h/3) * (ifunc(a+h/2,E) + ifunc(b-h/2,E) + sum)
return result
def trap(ifunc, a, b, N, E):
h=abs((b-a)/N)
sum = 0
for i in range (1, N, 1):
sum = sum + ifunc(a+i*h,E)
result = (h/2) * (ifunc(a+h/2,E) + ifunc(b-h/2,E) + 2.0*sum)
return result
i=1024*4
num = 1000
#serial version
start = time.time()
S=np.zeros(num)
E=np.zeros(num)
T=np.zeros(num)
for j in range (1, num):
E[j]=0.0001*j
S[j]=simp(func2,-np.sqrt(E[j]/2.),np.sqrt(E[j]/2.),i,E[j])
#T[j]=trap(func2,-np.sqrt(E[j]/2.),np.sqrt(E[j]/2.),i,E[j])
end = time.time()
print(f"serial part took={end - start}")
#parallel version:
start = time.time()
Nthreads = 4 #number of threads to be used
num_array = list(range(1,num+1))#np.linspace(1, num, num=num, endpoint=True)
#create an array on the forloop iterator
def par_simp(k, simp, ii): #redefine the fucntion so that for loop iterator is an arg.
EE=0.0001*k
return (simp(func2,-np.sqrt(EE/2.),np.sqrt(EE/2.),ii,EE))
psimp = partial(par_simp, simp = simp, ii = i)
#using partial module to make a function of only one argument
pool = mul.Pool(processes=Nthreads) #number of threads to use
Sp = np.array(pool.map(psimp, num_array)) ## pool.map returns a list over the forloop variable
pool.close()
pool.join()
end = time.time()
print(f"parallel part took={end - start}")
plt.plot(2*np.sqrt(E/2.), S)
plt.plot(2*np.sqrt(E/2.), Sp)
plt.show()