In [ ]:
import pp
from FermatPrincipleThreaded import Fermat
import astropy.coordinates as ac
import astropy.units as au
#import astropy.time as at
from IRI import *
import numpy as np
from Geometry import *
import sympy
import time
import tempfile
def ppRayProp(file,inRays,N,pathlength,frequency):
#enu = ENUFrame.ENU()
fermat = FermatPrincipleCartesian.Fermat(neFunc = None,type = 's',frequency = frequency)
fermat.loadFunc(file)
rays = {}
for ray in inRays:
datumIdx = ray.id
#origin = astropy.coordinates.SkyCoord(*(ray.origin*astropy.units.km),frame=enu).transform_to('itrs').cartesian.xyz.to(astropy.units.km).value
#direction = astropy.coordinates.SkyCoord(*ray.dir,frame=enu).transform_to('itrs').cartesian.xyz.value
origin = ray.origin
direction = ray.dir
time = ray.time
#print(ray)
x,y,z,s = fermat.integrateRay(origin,direction,pathlength,time=time,N=N)
rays[datumIdx] = {'x':x,'y':y,'z':z,'s':s}
return rays
def test():
sol = SolitonModel(5)
neFunc = sol.generateSolitonsModel()
theta = np.linspace(-np.pi/8.,np.pi/8.,25)
inRays = []
origin = ac.ITRS(sol.enu.location).cartesian.xyz.to(au.km).value
count = 0
for t in theta:
for p in theta:
direction = ac.SkyCoord(np.sin(t),
np.sin(p),
1.,frame=sol.enu).transform_to('itrs').cartesian.xyz.value
ray = Ray(origin,direction,id = count,time =0)
inRays.append(ray)
count += 1
ncpus = 1
t1 = time.time()
N = len(inRays)/ncpus
# Creates jobserver with ncpus workers
jobs = []
job_server = pp.Server(ncpus, ppservers=())
for i in range(ncpus):
file = 'neFunc-thread{0}.npz'.format(i)
np.savez(file,neFunc=neFunc)
#file = sol.saveNeFunc(neFunc)
job = job_server.submit(ppRayProp,
args=(file,inRays[i:(i+1)*N],100,2000,120e6),
depfuncs=(),
modules=('FermatPrincipleCartesian',),
globals={})
jobs.append(job)
for job in jobs:
result = job()
print(time.time() - t1)
job_server.print_stats()
if __name__ == '__main__':
test()