#!/usr/bin/python
import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as ode
import matplotlib.animation as anim

#****************************
#*********parameetrid ***********************
#*******************************************************

m_maa=5.9722e+24 # maa mass, kg
r_maa=6378.      # maa raadius, m

m_keha=2800.     # keha makk, kg
r_keha=2.        # keha raadius, m

t_ohu=300.       # ohu temperatuur, K
p_ohu_0=101000.  # ohu rohk, Pa
mu_ohu=29.       # ohu uhe mooli mass, kg/kmool

vx=0.            # mooduli algkiiruse x-projektsioon, km/s
vy=8.5           # mooduli algkiiruse y-projektsioon, km/s
y0=0.            # mooduli y-algkoordinaat, km
h0=100.          # mooduli algkorgus

x0=h0+r_maa      # mooduli x-algkoordinaat, km
aeg=80000        # kogu liikumise aeg sekundites
animkiirus=10    # animatsiooni kiirus

#********************************************************
#********************************************
#*****************************
asa=50000
time=np.linspace(0,aeg,num=asa)
gamma=6.67408e-11
r_gaas=8314.
s_keha=np.pi*r_keha**2
c_keha=0.47
g_rask=9.814
gm=gamma*m_maa*1.e-9
ro_ohu_0=p_ohu_0*mu_ohu/(r_gaas*t_ohu)
p1=mu_ohu*g_rask*1000./(r_gaas*t_ohu)
p2=500.*c_keha*s_keha/m_keha
y0=[x0,y0,vx,vy]

def func(y,t):
   yp=np.zeros_like(y)
   r=np.sqrt(y[0]**2+y[1]**2)
   h=r-r_maa
   ro_ohu=ro_ohu_0*np.exp(-p1*h)
   v=np.sqrt(y[2]**2+y[3]**2)
   r3=r**3
   yp[0]=y[2]
   yp[1]=y[3]
   yp[2]=-gm*y[0]/r3-p2*ro_ohu*v*y[2]
   yp[3]=-gm*y[1]/r3-p2*ro_ohu*v*y[3]
   return yp

res=ode.odeint(func,y0,time)

r=np.sqrt(res[:,0]**2+res[:,1]**2)
hh=r-r_maa
vv=np.sqrt(res[:,2]**2+res[:,3]**2)
r3=r**3
ro=ro_ohu_0*np.exp(-p1*hh)
ax=-gm*res[:,0]/r3-p2*ro*vv*res[:,2]
ay=-gm*res[:,1]/r3-p2*ro*vv*res[:,3]
aa=np.sqrt(ax**2+ay**2)*1000
c_text=""
for i in np.arange(0,len(time)):
    if r[i] < r_maa:
       itime=i+1
       resr=res[0:itime,:]
       c_text="Kukkus Maale kiirusega"+str("%10.3f" % (vv[itime]*1000.))+" m/s"
       break
    else:
       resr=res
       itime=i

#*********** visualization ************
xmin=min(resr[:,0])*1.2
xmax=max(resr[:,0])*1.2
ymin=min(resr[:,1])*1.2
ymax=max(resr[:,1])*1.2
if xmin >0:
    xmin=-xmin
if ymin >0:
    ymin=-ymin

fig2=plt.figure(2,figsize=(10,10))
#fig2.canvas.set_window_title('Trajektoor')
p2 = plt.subplot()
p2=plt.axes(xlim=(xmin,xmax), ylim=(ymin, ymax))
p2.set_aspect("equal")
maa=plt.Circle((0,0),6378,color="green",label="Maa")
atm=plt.Circle((0,0),6478,color="blue",fill=False,label="O~hu")
p2.add_artist(maa)
p2.add_artist(atm)
p2.text(0.02,0.95,c_text,transform=p2.transAxes)
p2.plot(resr[:,0],resr[:,1],color="red",label="moodul")
p2.legend(loc="upper right")
p2.grid()

#**** anim *****
fig1=plt.figure(1,figsize=(10,10))
#fig1.canvas.set_window_title('Animatsioon')
p1 = plt.subplot()
p1=plt.axes(xlim=(xmin,xmax), ylim=(ymin, ymax))
p1.set_aspect("equal")
p1.grid()

def animf(i):
    sx = [resr[i,0]]
    sy = [resr[i,1]]
    sat.set_data(sx, sy)
    vel_txt.set_text('Kiirus = %10.3f km/s' % (vv[i]))
    dist_txt.set_text('Korgus = %10.3f km' % (r[i]-r_maa))
    kiirend_txt.set_text('Kiirendus = %10.3f m/s2' % (aa[i]))
    time_txt.set_text('Aeg = %8.3f min = %8.3f tund' % (time[i]/60.,time[i]/3600.))
    return sat,vel_txt,dist_txt,kiirend_txt,time_txt

maa=plt.Circle((0,0),6378,color="green",label="Maa")
atm=plt.Circle((0,0),6478,color="blue",fill=False,label="Maa")
p1.add_artist(maa)
p1.add_artist(atm)

sat, = p1.plot([], [], '.',color="red",label="moodul")
vel_txt = p1.text(0.02,0.92,'',transform=p1.transAxes)
dist_txt = p1.text(0.02,0.95,'',transform=p1.transAxes)
kiirend_txt = p1.text(0.02,0.89,'',transform=p1.transAxes)
time_txt = p1.text(0.02,0.86,'',transform=p1.transAxes)

p1.legend(loc="upper right")
ani = anim.FuncAnimation(fig1, animf, np.arange(0, itime,animkiirus),interval=10,repeat=False,blit=True)

plt.show()