Skip to content

Instantly share code, notes, and snippets.

@jobovy
Last active August 29, 2015 14:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jobovy/9c573cf954b276f63a31 to your computer and use it in GitHub Desktop.
Save jobovy/9c573cf954b276f63a31 to your computer and use it in GitHub Desktop.
Python script to create non-axisymmetric velocity fields with galpy

Usage

The Python script nonaxi_velocity_field.py can be used to compute the velocity distribution function using the backwards-integration method of Dehnen (2000), as implemented in galpy (Bovy 2015). You can use the nonaxi_velocity_field.py code in a few different ways:

python nonaxi_velocity_field.py -h

gives information on the various options. Possible ways to run the code are:

python nonaxi_velocity_field.py bar_altrect_vr.ps \
  --savefile=../sim/bar_altrect_alpha0.015.sav \
  --bar -m 15 -r 15 -g 26 --altrect \
  --vmin=-0.05 --vmax=0.05 --nt=1 \
  --nsigma=4 --baralpha=0.015

which will compute the velocity DF on a spatial grid for a quadrupole bar. In this case, the grid is rectangular around the Sun (see the script for specifics). The code plots the mean radial velocity, but the whole velocity DF is stored in the pickle file produced by the code.

The code can also compute the velocity DF on a polar spatial grid that covers the whole galaxy:

python nonaxi_velocity_field.py ../sim/bar_polar_vlos.ps \
  --savefile=../sim/bar_polar_alpha0.015.sav \
  --bar -m 18 -r 18 -g 26 \
  --galcoords --plotpolar \
  --vmin=-0.05 --vmax=0.05 --nt=1 \
  --nsigma=4 --baralpha=0.015

The code has support for other perturbuations (such as steady-state, logarithmic spiral, transient spiral).

This code was used in Bovy (2015) and Bovy et al. (2015).

import sys
import os, os.path
import shutil
import cPickle as pickle
import math as m
import numpy as nu
from optparse import OptionParser
import subprocess
import multiprocessing
from galpy.util import save_pickles, bovy_plot, bovy_coords, multi
from galpy.orbit import Orbit
from galpy.df import dehnendf, shudf
from galpy.potential import SteadyLogSpiralPotential, \
LogarithmicHaloPotential, TransientLogSpiralPotential, \
DehnenBarPotential, PowerSphericalPotential, \
MovingObjectPotential, lindbladR, EllipticalDiskPotential
from galpy.df_src.evolveddiskdf import evolveddiskdf
from matplotlib import pyplot
from matplotlib import transforms
from plot_psd import _RCXMIN, _RCXMAX, _RCYMIN, _RCYMAX, _RCDX
def velocity_field(parser):
"""
NAME:
velocity_field
PURPOSE:
calculate the velocity field
INPUT:
parser - from optparse
OUTPUT:
stuff as specified by the options
HISTORY:
2011-04-02 - Written - Bovy (NYU)
"""
(options,args)= parser.parse_args()
if len(args) == 0:
parser.print_help()
sys.exit(-1)
#Set up grid
if options.galcoords:
if options.res == 1: #Just do phi
xgrid= nu.linspace(0.,m.pi, #ONLY ONE HALF OF TWOPI
options.phires)
ygrid= nu.array([1.])
else:
if not options.phimax is None:
xgrid= nu.linspace(-options.phimax,
options.phimax,
options.phires)
else:
xgrid= nu.linspace(0.,2.*m.pi*(1.-1./options.res/2.),
2.*options.res)
ygrid= nu.linspace(options.rmin,options.rmax,options.res)
elif options.altrect:
#Grid we do the RC analysis on
xgrid= nu.linspace((_RCXMIN-2.25-8.)/8.+_RCDX/8./2.,
(_RCXMAX+2.25-8.)/8.-_RCDX/8./2.,
options.res)
ygrid= nu.linspace(_RCYMIN/8.-2.25/8.+_RCDX/8./2.,
_RCYMAX/8.+2.25/8.-_RCDX/8./2.,
options.res)
elif options.diskrect:
#Grid for the whole disk for Rob Grand's paper
xgrid= nu.linspace(-32./8.+0.8/8./2.,
16./8.-0.8/8./2.,
options.res)
ygrid= nu.linspace(-24./8.+0.8/8./2.,
24./8.-0.8/8./2.,
options.res)
elif options.centraldiskrect:
#Grid for the central disk for Rob Grand's paper
xgrid= nu.linspace(-16./8.+0.8/8./2.,
0./8.-0.8/8./2.,
options.res)
ygrid= nu.linspace(-8./8.+0.8/8./2.,
8./8.-0.8/8./2.,
options.res)
else:
#Grid we do the RC analysis on
xgrid= nu.linspace((_RCXMIN-8.)/8.+_RCDX/8./2.,
(_RCXMAX-8.)/8.-_RCDX/8./2.,
options.res)
ygrid= nu.linspace(_RCYMIN/8.+_RCDX/8./2.,
_RCYMAX/8.-_RCDX/8./2.,
options.res)
print xgrid, ygrid
nx= len(xgrid)
ny= len(ygrid)
#Set up potential
if options.beta == 0.:
axip= LogarithmicHaloPotential(normalize=1.,q=0.95)
else:
axip= PowerSphericalPotential(alpha=2.-2.*options.beta,normalize=1.)
pot= [axip]
if options.bar:
barp= DehnenBarPotential(alpha=options.baralpha,
tform=options.bar_tform,
tsteady=options.bar_tsteady,
beta=options.beta,
rolr=options.bar_olr,
barphi=options.bar_angle/180.*nu.pi)
pot.append(barp)
if options.steadyspiral:
omegas= options.steadyspiralomegas
ts= 2.*m.pi/omegas #4:1 ILR at Solar circle
steadyspiralp= SteadyLogSpiralPotential(A=-0.075,
alpha=options.steadyspiralalpha,
tform=options.steadyspiraltform/ts,
tsteady=options.steadyspiraltsteady/ts,
omegas=omegas,
m=options.steadyspiralm,
gamma=options.steadyspiralgamma)
pot.append(steadyspiralp)
if options.singletransientspiral:
transientsp= TransientLogSpiralPotential(A=-0.035,
alpha=-7.,
omegas=.65,
sigma=options.transientspiralsigma,
to=options.transientspiralto)
pot.append(transientsp)
if options.elliptical:
elp= EllipticalDiskPotential(cp=options.el_cp,
sp=options.el_sp,
p=options.el_p,
tform=options.el_tform,
tsteady=options.el_tsteady)
pot.append(elp)
if options.to is None:
if options.bar and not options.steadyspiral \
and not options.movingobject \
and not options.transientspirals:
to= barp.tform()
else:
to= -40.*2.*m.pi #Default= 40 Galactic rotations
else:
to= options.to
if options.movingobject:
o= Orbit([0.000001,.39,0.,6.,0.,m.pi/2.])
o.integrate(nu.linspace(0,-to,10001),axip)
o._orb.t+= to
mp= MovingObjectPotential(o,GM=0.06,softening_model='plummer',
softening_length=0.1)
pot.append(mp)
#Set-up df
if options.dftype.lower() == 'dehnen':
dfc= dehnendf(beta=options.beta,correct=True,niter=20,
profileParams=(options.rd,options.rs,options.so),
savedir='./')
elif options.dftype.lower() == 'shu':
dfc= shudf(beta=options.beta,correct=True,niter=20,
profileParams=(options.rd,options.rs,options.so),
savedir='./')
edf= evolveddiskdf(dfc,pot,to=to)
if options.nt == 1:
evalts= nu.array([0.])
else:
evalts= nu.linspace(0.,to,options.nt)
#Set up savefile
if os.path.exists(options.savefilename):
savefile= open(options.savefilename,'rb')
surfmass= pickle.load(savefile)
meanvr= pickle.load(savefile)
meanvt= pickle.load(savefile)
sigmar2= pickle.load(savefile)
sigmat2= pickle.load(savefile)
sigmart= pickle.load(savefile)
vertexdev= pickle.load(savefile)
surfmass_init= pickle.load(savefile)
meanvt_init= pickle.load(savefile)
sigmar2_init= pickle.load(savefile)
sigmat2_init= pickle.load(savefile)
ii= pickle.load(savefile)
jj= pickle.load(savefile)
grids= pickle.load(savefile)
savefile.close()
else:
ii, jj= 0, 0
surfmass= nu.zeros((nx,ny,options.nt))
meanvr= nu.zeros((nx,ny,options.nt))
meanvt= nu.zeros((nx,ny,options.nt))
sigmar2= nu.zeros((nx,ny,options.nt))
sigmat2= nu.zeros((nx,ny,options.nt))
sigmart= nu.zeros((nx,ny,options.nt))
vertexdev= nu.zeros((nx,ny,options.nt))
surfmass_init= nu.zeros((nx,ny))
meanvt_init= nu.zeros((nx,ny))
sigmar2_init= nu.zeros((nx,ny))
sigmat2_init= nu.zeros((nx,ny))
grids= []
#Loop through, saving
while ii < nx:
if not options.multi is None:
sys.stdout.write('\r'+"X gridpoint %i out of %i" % \
(ii+1,nx))
sys.stdout.flush()
multOut= multi.parallel_map(\
lambda x: _calc_meanvel_single(x,ii,options,evalts,xgrid,ygrid,edf),
range(ny),
numcores=nu.amin([ny,multiprocessing.cpu_count(),
options.multi]))
for jj in range(ny):
surfmass[ii,jj,:]= multOut[jj][0]
meanvr[ii,jj,:]= multOut[jj][1]
meanvt[ii,jj,:]= multOut[jj][2]
sigmar2[ii,jj,:]= multOut[jj][3]
sigmat2[ii,jj,:]= multOut[jj][4]
sigmart[ii,jj,:]= multOut[jj][5]
vertexdev[ii,jj,:]= multOut[jj][6]
grids.append(multOut[jj][7])
surfmass_init[ii,jj]= multOut[jj][8]
meanvt_init[ii,jj]= multOut[jj][9]
sigmar2_init[ii,jj]= multOut[jj][10]
sigmat2_init[ii,jj]= multOut[jj][11]
save_output(options.savefilename,surfmass,meanvr,meanvt,sigmar2,
sigmat2,sigmart,vertexdev,ii,jj,grids,
surfmass_init,meanvt_init,sigmar2_init,sigmat2_init)
ii+= 1
continue
while jj < ny:
if options.print_vprogress:
sys.stdout.write("Spatial gridpoint %i out of %i\n" % \
(jj+ii*ny+1,nx*ny))
sys.stdout.flush()
else:
sys.stdout.write('\r'+"Gridpoint %i out of %i" % \
(jj+ii*ny+1,nx*ny))
sys.stdout.flush()
#Calculate R and phi
if options.galcoords:
R, phi= ygrid[jj], xgrid[ii]
else:
R= nu.sqrt((1.+xgrid[ii])**2.+ygrid[jj]**2.)
phi= nu.arcsin(ygrid[jj]/R)
#Calculate surfmass etc.
smass, grid= edf.vmomentsurfacemass(R,0,0,grid=True,phi=phi,
returnGrid=True,t=evalts,
gridpoints=options.grid,
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels,
print_progress=options.print_vprogress,
integrate_method=options.integrate_method)
if not options.dontsavegrid: grids.append(grid)
surfmass[ii,jj,:]= smass
meanvr[ii,jj,:]= edf.meanvR(R,phi=phi,grid=grid,t=evalts,
surfacemass=surfmass[ii,jj,:],
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels)
meanvt[ii,jj,:]= edf.meanvT(R,phi=phi,grid=grid,t=evalts,
surfacemass=surfmass[ii,jj,:],
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels)
sigmar2[ii,jj,:]= edf.sigmaR2(R,phi=phi,grid=grid,t=evalts,
surfacemass=surfmass[ii,jj,:],
meanvR=meanvr[ii,jj,:],
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels)
sigmat2[ii,jj,:]= edf.sigmaT2(R,phi=phi,grid=grid,t=evalts,
surfacemass=surfmass[ii,jj,:],
meanvT=meanvt[ii,jj,:],
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels)
sigmart[ii,jj,:]= edf.sigmaRT(R,phi=phi,grid=grid,t=evalts,
surfacemass=surfmass[ii,jj,:],
meanvR=meanvr[ii,jj,:],
meanvT=meanvt[ii,jj,:],
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels)
vertexdev[ii,jj,:]= edf.vertexdev(R,phi=phi,grid=grid,t=evalts,
sigmaR2=sigmar2[ii,jj,:],
sigmaT2=sigmat2[ii,jj,:],
sigmaRT=sigmart[ii,jj,:],
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels)
#Also calculate initial, non-trivial values
use_init_grid= True #Much faster
if use_init_grid:
smass_init, init_grid= edf.vmomentsurfacemass(R,0,0,phi=phi,
t=edf._to,
grid=True,
gridpoints=options.grid,
returnGrid=True)
else:
smass_init= edf.vmomentsurfacemass(R,0,0,phi=phi,
t=edf._to)
init_grid= False
surfmass_init[ii,jj]= smass_init
meanvt_init[ii,jj]= edf.meanvT(R,phi=phi,t=edf._to,
grid=init_grid,
surfacemass=surfmass_init[ii,jj],
nsigma=options.nsigma)
sigmar2_init[ii,jj]= edf.sigmaR2(R,phi=phi,t=edf._to,
grid=init_grid,
surfacemass=surfmass_init[ii,jj],
meanvR=0.,nsigma=options.nsigma)
sigmat2_init[ii,jj]= edf.sigmaT2(R,phi=phi,t=edf._to,
grid=init_grid,
surfacemass=surfmass_init[ii,jj],
meanvT=meanvt_init[ii,jj],
nsigma=options.nsigma)
jj+= 1
#Save
save_output(options.savefilename,surfmass,meanvr,meanvt,sigmar2,
sigmat2,sigmart,vertexdev,ii,jj,grids,
surfmass_init,meanvt_init,sigmar2_init,sigmat2_init)
ii+= 1
jj= 0
sys.stdout.write('\n')
#Calculate Oort constants?
if not options.oort is None and os.path.exists(options.oort):
savefile= open(options.oort,'rb')
oorta= pickle.load(savefile)
oortb= pickle.load(savefile)
oortc= pickle.load(savefile)
oortk= pickle.load(savefile)
oorta_init= pickle.load(savefile)
oortb_init= pickle.load(savefile)
oortc_init= pickle.load(savefile)
oortk_init= pickle.load(savefile)
oort_ii= pickle.load(savefile)
oort_jj= pickle.load(savefile)
derivRGrids= pickle.load(savefile)
derivphiGrids= pickle.load(savefile)
savefile.close()
elif not options.oort is None:
oort_ii, oort_jj= 0, 0
oorta= nu.zeros((nx,ny,options.nt))
oortb= nu.zeros((nx,ny,options.nt))
oortc= nu.zeros((nx,ny,options.nt))
oortk= nu.zeros((nx,ny,options.nt))
oorta_init= nu.zeros((nx,ny))
oortb_init= nu.zeros((nx,ny))
oortc_init= nu.zeros((nx,ny))
oortk_init= nu.zeros((nx,ny))
derivRGrids= []
derivphiGrids= []
else: #to skip the loop and not mess up plotting
oort_ii, oort_jj= nx, ny
oorta= None
oortb= None
oortc= None
oortk= None
oorta_init= None
oortb_init= None
oortc_init= None
oortk_init= None
derivRGrids= []
derivphiGrids= []
#Loop through, saving
while oort_ii < nx:
while oort_jj < ny:
if options.print_vprogress:
sys.stdout.write("Spatial gridpoint %i out of %i\n" % \
(oort_jj+oort_ii*ny+1,nx*ny))
sys.stdout.flush()
else:
sys.stdout.write('\r'+"Gridpoint %i out of %i" % \
(oort_jj+oort_ii*ny+1,nx*ny))
sys.stdout.flush()
#Calculate R and phi
if options.galcoords:
R, phi= ygrid[oort_jj], xgrid[oort_ii]
else:
R= nu.sqrt((1.+xgrid[oort_ii])**2.+ygrid[oort_jj]**2.)
phi= nu.arcsin(ygrid[oort_jj]/R)
if len(grids) > 0: grid= grids[oort_jj+oort_ii*ny]
else: grid= True
oorta[oort_ii,oort_jj,:], grid,derivrgrid, derivphigrid=\
edf.oortA(R,phi=phi,
grid=grid,
derivRGrid=True,
derivphiGrid=True,
returnGrids=True,t=evalts,
gridpoints=options.grid,
derivGridpoints=options.grid,
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels,
integrate_method=options.integrate_method)
if not options.dontsavegrid:
derivRGrids.append(derivrgrid)
derivphiGrids.append(derivphigrid)
oortb[oort_ii,oort_jj,:]= edf.oortB(R,phi=phi,t=evalts,
grid=grid,
derivRGrid=derivrgrid,
derivphiGrid=derivphigrid,
returnGrids=False,
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels)
oortc[oort_ii,oort_jj,:]= edf.oortC(R,phi=phi,t=evalts,
grid=grid,
derivRGrid=derivrgrid,
derivphiGrid=derivphigrid,
returnGrids=False,
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels)
oortk[oort_ii,oort_jj,:]= edf.oortK(R,phi=phi,t=evalts,
grid=grid,
derivRGrid=derivrgrid,
derivphiGrid=derivphigrid,
returnGrids=False,
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels)
#Also calculate initial, non-trivial values
use_init_grid= True #Much faster
if use_init_grid:
oorta_init[oort_ii,oort_jj], init_grid, init_derivrgrid,init_derivphigrid=\
edf.oortA(R,phi=phi,
t=edf._to,
grid=True,
derivRGrid=True,
derivphiGrid=True,
derivGridpoints=options.grid,
gridpoints=options.grid,
returnGrids=True,
nsigma=options.nsigma)
oortb_init[oort_ii,oort_jj]=\
edf.oortB(R,phi=phi,
t=edf._to,
grid=init_grid,
derivRGrid=init_derivrgrid,
derivphiGrid=init_derivphigrid,
gridpoints=options.grid,
returnGrids=False,
nsigma=options.nsigma)
oortc_init[oort_ii,oort_jj]=\
edf.oortC(R,phi=phi,
t=edf._to,
grid=init_grid,
derivRGrid=init_derivrgrid,
derivphiGrid=init_derivphigrid,
gridpoints=options.grid,
returnGrids=False,
nsigma=options.nsigma)
oortk_init[oort_ii,oort_jj]=\
edf.oortK(R,phi=phi,
t=edf._to,
grid=init_grid,
derivRGrid=init_derivrgrid,
derivphiGrid=init_derivphigrid,
gridpoints=options.grid,
returnGrids=False,
nsigma=options.nsigma)
else:
oorta_init[oort_ii,oort_jj]= edf._initdf.oortA(R,nsigma=options.nsigma)
oortb_init[oort_ii,oort_jj]= edf._initdf.oortB(R,nsigma=options.nsigma)
oortc_init[oort_ii,oort_jj]= edf._initdf.oortC(R,nsigma=options.nsigma)
oortk_init[oort_ii,oort_jj]= edf._initdf.oortK(R,nsigma=options.nsigma)
oort_jj+= 1
#Save
save_pickles(options.oort,oorta,oortb,oortc,oortk,
oorta_init,oortb_init,oortc_init,oortk_init,
oort_ii,oort_jj,derivRGrids,derivphiGrids)
oort_ii+= 1
oort_jj= 0
#print oorta, oortb, oortc, oortk
if options.plot_resonance:
resonance= []
#Figure out where the resonances are
if options.bar:
OmegaP= barp.OmegaP()
resonance.append(lindbladR(axip,OmegaP,m=-2.))
if options.steadyspiral:
OmegaP= steadyspiralp.OmegaP()
resonance.append((lindbladR(axip,OmegaP,m=2.),False)) #False for no corot
resonance.append((lindbladR(axip,OmegaP,m=-2.),False))
resonance.append((lindbladR(axip,OmegaP,m=4.),False))
resonance.append((lindbladR(axip,OmegaP,m=-4.),False))
resonance.append((lindbladR(axip,OmegaP,m='corot'),True))
else:
resonance= None
if options.dontplot:
return None
if options.movie:
create_field_movie(options,surfmass,meanvr,meanvt,sigmar2,
sigmat2,sigmart,vertexdev,ii,jj,surfmass_init,
meanvt_init,sigmar2_init,sigmat2_init,evalts,to,
xgrid,ygrid,args[0],resonance,
oorta,oorta_init,
oortb,oortb_init,
oortc,oortc_init,
oortk,oortk_init)
else:
bovy_plot.bovy_print()
plot_velocity_field(0,options,surfmass,meanvr,meanvt,sigmar2,
sigmat2,sigmart,vertexdev,ii,jj,surfmass_init,
meanvt_init,sigmar2_init,sigmat2_init,xgrid,ygrid,
resonance,
oorta,oorta_init,
oortb,oortb_init,
oortc,oortc_init,
oortk,oortk_init)
bovy_plot.bovy_end_print(args[0])
return None
def _calc_meanvel_single(jj,ii,options,evalts,xgrid,ygrid,edf):
#Calculate R and phi
if options.galcoords:
R, phi= ygrid[jj], xgrid[ii]
else:
R= nu.sqrt((1.+xgrid[ii])**2.+ygrid[jj]**2.)
phi= nu.arcsin(ygrid[jj]/R)
#Calculate surfmass etc.
smass, grid= edf.vmomentsurfacemass(R,0,0,grid=True,phi=phi,
returnGrid=True,t=evalts,
gridpoints=options.grid,
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels,
print_progress=options.print_vprogress,
integrate_method=options.integrate_method)
surfmass= smass
meanvr= edf.meanvR(R,phi=phi,grid=grid,t=evalts,
surfacemass=surfmass,
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels)
meanvt= edf.meanvT(R,phi=phi,grid=grid,t=evalts,
surfacemass=surfmass,
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels)
sigmar2= edf.sigmaR2(R,phi=phi,grid=grid,t=evalts,
surfacemass=surfmass,
meanvR=meanvr,
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels)
sigmat2= edf.sigmaT2(R,phi=phi,grid=grid,t=evalts,
surfacemass=surfmass,
meanvT=meanvt,
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels)
sigmart= edf.sigmaRT(R,phi=phi,grid=grid,t=evalts,
surfacemass=surfmass,
meanvR=meanvr,
meanvT=meanvt,
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels)
vertexdev= edf.vertexdev(R,phi=phi,grid=grid,t=evalts,
sigmaR2=sigmar2,
sigmaT2=sigmat2,
sigmaRT=sigmart,
nsigma=options.nsigma,
hierarchgrid=options.hierarchgrid,
nlevels=options.nlevels)
#Also calculate initial, non-trivial values
use_init_grid= True #Much faster
if use_init_grid:
smass_init, init_grid= edf.vmomentsurfacemass(R,0,0,phi=phi,
t=edf._to,
grid=True,
gridpoints=options.grid,
returnGrid=True)
else:
smass_init= edf.vmomentsurfacemass(R,0,0,phi=phi,
t=edf._to)
init_grid= False
surfmass_init= smass_init
meanvt_init= edf.meanvT(R,phi=phi,t=edf._to,
grid=init_grid,
surfacemass=surfmass_init,
nsigma=options.nsigma)
sigmar2_init= edf.sigmaR2(R,phi=phi,t=edf._to,
grid=init_grid,
surfacemass=surfmass_init,
meanvR=0.,nsigma=options.nsigma)
sigmat2_init= edf.sigmaT2(R,phi=phi,t=edf._to,
grid=init_grid,
surfacemass=surfmass_init,
meanvT=meanvt_init,
nsigma=options.nsigma)
return [surfmass,meanvr,meanvt,sigmar2,sigmat2,sigmart,vertexdev,grid,
surfmass_init,meanvt_init,sigmar2_init,sigmat2_init]
def create_field_movie(options,surfmass,meanvr,meanvt,sigmar2,
sigmat2,sigmart,vertexdev,ii,jj,surfmass_init,
meanvt_init,sigmar2_init,sigmat2_init,evalts,to,
xgrid,ygrid,moviefilename,resonance,
oorta,oorta_init,
oortb,oortb_init,
oortc,oortc_init,
oortk,oortk_init):
import tempfile
#First create all of the plots
if options.tmpdir is None:
tmpdir= '/tmp/'
else:
tmpdir= options.tmpdir
tempdir= tempfile.mkdtemp(dir=tmpdir) #Temporary directory
tmpfiles= []
file_length= int(m.ceil(m.log10(options.nt)))
#Create all frames
if options.nt > 50: #Agg bug
#Pickle
picklethis= (options,surfmass,meanvr,meanvt,
sigmar2,
sigmat2,sigmart,vertexdev,ii,jj,surfmass_init,
meanvt_init,sigmar2_init,sigmat2_init,
xgrid,ygrid,resonance,
oorta,oorta_init,
oortb,oortb_init,
oortc,oortc_init,
oortk,oortk_init)
picklefile= open(os.path.join(tempdir,'plotpickle.sav'),'wb')
pickle.dump(picklethis,picklefile)
pickle.dump(evalts,picklefile)
pickle.dump(to,picklefile)
picklefile.close()
_NFRAMES= 50
for ii in range(nu.amin([options.nt,_NFRAMES])):
sys.stdout.write('\r'+"Working on frame %i out of %i" % \
(ii+1,options.nt))
sys.stdout.flush()
tmpfiles.append(os.path.join(tempdir,
str(ii).zfill(file_length)))
bovy_plot.bovy_print()
plot_velocity_field(options.nt-ii-1,options,surfmass,meanvr,meanvt,
sigmar2,
sigmat2,sigmart,vertexdev,ii,jj,surfmass_init,
meanvt_init,sigmar2_init,sigmat2_init,
xgrid,ygrid,resonance,
oorta,oorta_init,
oortb,oortb_init,
oortc,oortc_init,
oortk,oortk_init)
#Add time
if options.plotpolar:
bovy_plot.bovy_text(m.pi/4*6.,options.rmax*1.75,
r'$\mathrm{Age}\ = %4.1f \approx %4.1f\ \mathrm{Gyr}$' \
% (evalts[options.nt-ii-1]-to,
(evalts[options.nt-ii-1]-to)/2./m.pi/4.))
else:
bovy_plot.bovy_text(r'$\mathrm{Age}\ = %4.1f \approx %4.1f\ \mathrm{Gyr}$' \
% (evalts[options.nt-ii-1]-to,
(evalts[options.nt-ii-1]-to)/2./m.pi/4.),
top_left=True)
bovy_plot.bovy_end_print(tmpfiles[ii]+'.png')
#Convert to jpeg
try:
subprocess.check_call(['convert',
tmpfiles[ii]+'.png',
tmpfiles[ii]+'.jpg'])
except subprocess.CalledProcessError:
print "'convert' failed"
raise subprocess.CalledProcessError
#Do the rest
extraSets= (options.nt-1)/_NFRAMES
ii= _NFRAMES
while extraSets > 0:
thisend= nu.amin([options.nt,ii+_NFRAMES])
#Call external routine
subprocess.check_call([os.getenv('PYTHON'),
'plot_movie_frame.py',
os.path.join(tempdir,'plotpickle.sav'),
tempdir,
str(ii),
str(thisend),
str(file_length)])
ii+= _NFRAMES
extraSets-= 1
sys.stdout.write('\n')
#turn them into a movie
try:
#first pass
subprocess.check_call(['ffmpeg',
'-pass','1',
'-r',str(options.framerate),
'-b', str(options.bitrate),
'-i',
os.path.join(tempdir,
'%'+'0%id.jpg' % file_length),
'-y',
moviefilename])
#2nd pass
subprocess.check_call(['ffmpeg',
'-pass','2',
'-r',str(options.framerate),
'-b', str(options.bitrate),
'-i',
os.path.join(tempdir,
'%'+'0%id.jpg' % file_length),
'-y',
moviefilename])
"""
if thumbnail:
thumbnameTemp= re.split(r'\.',filename)
thumbnameTemp= thumbnameTemp[0:len(thumbnameTemp)-1]
thumbname= ''
for t in thumbnameTemp:
thumbname+= t
thumbname+= '.jpg'
subprocess.check_call(['ffmpeg',
'-itsoffset','-4','-y',
'-i',filename,
'-vcodec',
'mjpeg',
'-vframes','1',
'-an',
'-f',
'rawvideo',
'-s', '%ix%i' % (thumbsize,thumbsize),
thumbname])
"""
except subprocess.CalledProcessError:
print "'ffmpeg' failed, scroll up to see ffmpeg's error message"
raise subprocess.CalledProcessError
finally:
_cleanupMovieTempdir(tempdir)
def _cleanupMovieTempdir(tempdir):
shutil.rmtree(tempdir)
def plot_velocity_field(indx,options,surfmass,meanvr,meanvt,sigmar2,
sigmat2,sigmart,vertexdev,ii,jj,surfmass_init,
meanvt_init,sigmar2_init,sigmat2_init,
xgrid,ygrid,resonance,
oorta,oorta_init,
oortb,oortb_init,
oortc,oortc_init,
oortk,oortk_init):
if options.plottype.lower() == 'surfmass':
if options.absolute:
plotthis= surfmass[:,:,indx]
plotthis_azavg= nu.sum(plotthis,axis=0)
zeropoint= None
#Also calculate maximum and minimum
zlabel= r'$\Sigma$'
z2label= r'$\langle\Sigma\langle$'
vmin, vmax= 0., .2
else:
plotthis= surfmass[:,:,indx]/surfmass_init[:,:]
plotthis_azavg= nu.sum(surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass_init[:,:],axis=0)
zeropoint= [1.,1.]
#Also calculate maximum and minimum
vmin, vmax= .5, 1.5
zlabel= r'$\Sigma / \Sigma^0$'
z2label= r'$\langle\Sigma\rangle / \Sigma^0$'
elif options.plottype.lower() == 'vr':
plotthis= meanvr[:,:,indx]
vmin, vmax= -20./235., 20./235.
zlabel=r'$\bar{v}_R / v_0$'
plotthis_azavg= nu.sum(plotthis*surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass[:,:,indx],axis=0)
zeropoint= [0.,0.]
z2label=r'$\langle\bar{v}_R\rangle / v_0$'
elif options.plottype.lower() == 'vt':
if options.absolute:
plotthis= meanvt[:,:,indx]
vmin, vmax= 1.-20./235.,1+20./235.
zlabel=r'$\bar{v}_T / v_0$'
plotthis_azavg= nu.sum(plotthis*surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass[:,:,indx],axis=0)
zeropoint= [0.,0.]
z2label=r'$\langle\bar{v}_T\rangle / v_0$'
else:
plotthis= meanvt[:,:,indx]-meanvt_init[:,:]
vmin, vmax= -20./235.,20./235.
zlabel=r'$\bar{v}_T - \bar{v}_T^0$'
z2label=r'$\langle\bar{v}_T\rangle - \bar{v}_T^0$'
plotthis_azavg= nu.sum(plotthis*surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass[:,:,indx],axis=0)
zeropoint= [0.,0.]
elif options.plottype.lower() == 'sigmar':
if options.absolute:
plotthis= nu.sqrt(sigmar2[:,:,indx])
vmin, vmax= 0.,0.5
zlabel=r'$\sigma_R / v_0$'
z2label=r'$\langle\sigma_R\rangle / v_0$'
plotthis_azavg= nu.sqrt((nu.sum(sigmar2[:,:,indx]\
*surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass[:,:,indx],axis=0)\
+nu.sum(meanvr**2.[:,:,indx]\
*surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass[:,:,indx],axis=0)\
-(nu.sum(meanvr[:,:,indx]*surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass[:,:,indx],axis=0))**2.))
zeropoint= None
else:
plotthis= nu.sqrt(sigmar2[:,:,indx]/sigmar2_init[:,:])
vmin, vmax= .8, 1.2
zlabel=r'$\sigma_R / \sigma_R^0$'
z2label=r'$\langle\sigma_R\rangle / \sigma_R^0$'
plotthis_azavg= nu.sqrt((nu.sum(sigmar2[:,:,indx]\
*surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass[:,:,indx],axis=0)\
+nu.sum(meanvr[:,:,indx]**2.\
*surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass[:,:,indx],axis=0)\
-(nu.sum(meanvr[:,:,indx]*surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass[:,:,indx],axis=0))**2.)/\
nu.mean(sigmar2_init[:,:],axis=0))
zeropoint= [1.,1.]
elif options.plottype.lower() == 'sigmat':
if options.absolute:
plotthis= nu.sqrt(sigmat2[:,:,indx])
vmin, vmax= 0.,.5
zlabel=r'$\sigma_T / v_0$'
zlabel=r'$\langle\sigma_T\rangle / v_0$'
plotthis_azavg= nu.sqrt((nu.sum(sigmat2[:,:,indx]\
*surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass[:,:,indx],axis=0)\
+nu.sum(meanvt**2.[:,:,indx]\
*surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass[:,:,indx],axis=0)\
-(nu.sum(meanvt[:,:,indx]*surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass[:,:,indx],axis=0))**2.))
zeropoint= None
else:
plotthis= nu.sqrt(sigmat2[:,:,indx]/sigmat2_init[:,:])
vmin, vmax= .8,1.2
zlabel=r'$\sigma_T / \sigma_T^0$'
z2label=r'$\langle\sigma_T\rangle / \sigma_T^0$'
plotthis_azavg= nu.sqrt((nu.sum(sigmat2[:,:,indx]\
*surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass[:,:,indx],axis=0)\
+nu.sum(meanvt[:,:,indx]**2.\
*surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass[:,:,indx],axis=0)\
-(nu.sum(meanvt[:,:,indx]*surfmass[:,:,indx],axis=0)/\
nu.sum(surfmass[:,:,indx],axis=0))**2.)/\
nu.mean(sigmat2_init[:,:],axis=0))
zeropoint= [1.,1.]
elif options.plottype.lower() == 'sigmart':
plotthis= sigmart[:,:,indx]/nu.sqrt(sigmar2[:,:,indx]\
*sigmat2[:,:,indx])
vmin, vmax= -1.,1.
zlabel=r'$\\rho_{RT} / v_0$'
elif options.plottype.lower() == 'vertexdev':
plotthis= vertexdev[:,:,indx]
vmin, vmax= -45.,45.
zlabel=r'$l_V\ [\mathrm{deg}]$'
elif options.plottype.lower() == 'x2':
if options.absolute:
plotthis= sigmat2[:,:,indx]/sigmar2[:,:,indx]
vmin, vmax= 0.3,0.7
zlabel=r'$X^2$'
z2label=r'$\langle\sigma_T/\sigma_R\rangle$'
pltthis_azavg= None
zeropoint= None
else:
plotthis= sigmat2[:,:,indx]/sigmar2[:,:,indx]\
*sigmar2_init[:,:]/sigmat2_init[:,:]
vmin, vmax= .8, 1.2
zlabel=r'$X^2/X_0^2$'
z2label= None
plotthis_azavg= None
zeropoint= None
elif options.plottype.lower() == 'oorta':
if options.absolute:
plotthis= oorta[:,:,indx]
zeropoint= None
#Also calculate maximum and minimum
zlabel= r'$A$'
#z2label= r'$\langle\Sigma\langle$'
vmin, vmax= 0., 1.
else:
plotthis= oorta[:,:,indx]/oorta_init[:,:]
zeropoint= [1.,1.]
#Also calculate maximum and minimum
vmin, vmax= .5, 1.5
zlabel= r'$A / A^0$'
#z2label= r'$\langle\Sigma\rangle / \Sigma^0$'
elif options.plottype.lower() == 'oortb':
if options.absolute:
plotthis= oortb[:,:,indx]
zeropoint= None
#Also calculate maximum and minimum
zlabel= r'$B$'
#z2label= r'$\langle\Sigma\langle$'
vmin, vmax= 0., 1.
else:
plotthis= oortb[:,:,indx]/oortb_init[:,:]
zeropoint= [1.,1.]
#Also calculate maximum and minimum
vmin, vmax= .5, 1.5
zlabel= r'$B / B^0$'
#z2label= r'$\langle\Sigma\rangle / \Sigma^0$'
elif options.plottype.lower() == 'oortc':
plotthis= oortc[:,:,indx]
vmin, vmax= -0.2, 0.2
zlabel=r'$C$'
#z2label=r'$\langle\bar{v}_R\rangle / v_0$'
elif options.plottype.lower() == 'oortk':
plotthis= oortk[:,:,indx]
vmin, vmax= -0.2, 0.2
zlabel=r'$K$'
#z2label=r'$\langle\bar{v}_R\rangle / v_0$'
elif options.plottype.lower() == 'vlos':
#Build phi and l arrays
phis= nu.zeros(meanvr[:,:,indx].shape)
ls= nu.zeros(meanvr[:,:,indx].shape)
for ii in range(len(xgrid)):
phis[ii,:]= xgrid[ii]
for jj in range(len(ygrid)):
ls[ii,jj]= bovy_coords.rphi_to_dl_2d(ygrid[jj],
xgrid[ii],
degree=False,
ro=1.,
phio=0.)[1]
#Then calculate vlos
if options.absolute:
plotthis= meanvt[:,:,indx]*nu.sin(phis+ls)\
-meanvr[:,:,indx]*nu.cos(phis+ls)
vmin, vmax= 1.-20./235.,1+20./235.
zlabel=r'$\bar{v}_{\mathrm{los}} / v_0$'
else:
plotthis= (meanvt[:,:,indx]-meanvt_init[:,:])*nu.sin(phis+ls)\
-meanvr[:,:,indx]*nu.cos(phis+ls)
vmin, vmax= -20./235.,20./235.
zlabel=r'$\bar{v}_{\mathrm{los}} / v_0-\bar{v}_{\mathrm{los}}^0 / v_0$'
plotthis_azavg_min= nu.amin(plotthis,axis=0)
plotthis_azavg_max= nu.amax(plotthis,axis=0)
if not options.vmin is None:
vmin= options.vmin
if not options.vmax is None:
vmax= options.vmax
if not options.movie: print nu.amin(plotthis), nu.amax(plotthis)
if options.galcoords and options.plotpolar:
if options.azavg:
fig= pyplot.figure()
left, bottom = 0.1, 0.3
width, height= 0.8, 0.6
ax= fig.add_axes([left,bottom,width,height],
projection='galpolar') #galpolar is in bovy_plot
#ax= pyplot.subplot(211,projection='galpolar')
else:
ax= pyplot.subplot(111,projection='polar')#galpolar is in bovy_plot
ax.set_theta_direction(-1) #clockwise
if not resonance is None:
for r,corot in resonance:
if r < 0.5 or r > 2.:
color= 'k'
else:
color='w'
if corot:
ls='-.'
else:
ls= '--'
ax.plot(nu.linspace(0.,2.*m.pi,501,),
nu.zeros(501)+r,ls=ls,color=color,zorder=5)
plotxgrid= nu.linspace(xgrid[0]-(xgrid[1]-xgrid[0])/2.,
xgrid[-1]+(xgrid[1]-xgrid[0])/2.,
len(xgrid)+1)
plotygrid= nu.linspace(ygrid[0]-(ygrid[1]-ygrid[0])/2.,
ygrid[-1]+(ygrid[1]-ygrid[0])/2.,
len(ygrid)+1)
out= ax.pcolor(plotxgrid,plotygrid,plotthis.T,cmap='rainbow',
vmin=vmin,vmax=vmax)
shrink= 0.8
CB1= pyplot.colorbar(out,shrink=shrink)
bbox = CB1.ax.get_position().get_points()
CB1.ax.set_position(transforms.Bbox.from_extents(bbox[0,0]+0.025,
bbox[0,1],
bbox[1,0],
bbox[1,1]))
CB1.set_label(zlabel)
pyplot.ylim(0.,1.15*options.rmax)
#Azimuthally averaged
if options.azavg:
left, bottom = 0.1, 0.1
width, height= 0.8, 0.15
ax2= fig.add_axes([left,bottom,width,height])
#ax2= pyplot.subplot(210)
bovy_plot.bovy_plot(ygrid,plotthis_azavg,'k-',overplot=True)
if not zeropoint is None:
bovy_plot.bovy_plot([0.,ygrid[-1]],zeropoint,'k--',
overplot=True)
bovy_plot.bovy_plot(ygrid,plotthis_azavg_min,color='0.5',ls='-',
overplot=True)
bovy_plot.bovy_plot(ygrid,plotthis_azavg_max,color='0.5',ls='-',
overplot=True)
if not resonance is None:
for r in resonance:
bovy_plot.bovy_plot([r,r],[vmin,vmax],overplot=True,
ls='--',color='0.5')
pyplot.xlim(0.,ygrid[-1])
pyplot.ylim(vmin,vmax)
pyplot.xlabel(r'$R / R_0$')
pyplot.ylabel(z2label)
bovy_plot._add_ticks()
#Set current axes back to polar ones for movie label
pyplot.sca(ax)
elif options.res == 1: #Just plot phi
bovy_plot.bovy_plot(xgrid/nu.pi*180.,plotthis[:,0],'k-',
yrange=[vmin,vmax],
xrange=[0.,180.],
xlabel=r'$\mathrm{azimuth}\ [\mathrm{deg}]$',
ylabel=zlabel)
else:
bovy_plot.bovy_dens2d(plotthis.T,origin='lower',cmap='rainbow',#cmap='gist_yarg',
xrange=[-0.25,0.25],yrange=[-0.25,0.25],
xlabel=r'$X$',ylabel=r'$Y$',
interpolation='nearest',
vmin=vmin,vmax=vmax,contours=False,
colorbar=True,zlabel=zlabel,shrink=0.77)
if not resonance is None:
#phimin
phimin= m.atan(0.25/.75)
phis= nu.linspace(-phimin,phimin,1001)
for r in resonance:
bovy_plot.bovy_plot(1.-r*nu.cos(phis),r*nu.sin(phis),'w--',
overplot=True)
def read_oort_output(savefilename):
savefile= open(savefilename,'rb')
oorta= pickle.load(savefile)
oortb= pickle.load(savefile)
oortc= pickle.load(savefile)
oortk= pickle.load(savefile)
oorta_init= pickle.load(savefile)
oortb_init= pickle.load(savefile)
oortc_init= pickle.load(savefile)
oortk_init= pickle.load(savefile)
oort_ii= pickle.load(savefile)
oort_jj= pickle.load(savefile)
derivRGrids= pickle.load(savefile)
derivphiGrids= pickle.load(savefile)
savefile.close()
return (oorta,oortb,oortc,oortk,
oorta_init,oortb_init,oortc_init,oortk_init,
oort_ii,oort_jj,derivRGrids,derivphiGrids)
def read_output(savefilename):
savefile= open(savefilename,'rb')
surfmass= pickle.load(savefile)
meanvr= pickle.load(savefile)
meanvt= pickle.load(savefile)
sigmar2= pickle.load(savefile)
sigmat2= pickle.load(savefile)
sigmart= pickle.load(savefile)
vertexdev= pickle.load(savefile)
surfmass_init= pickle.load(savefile)
meanvt_init= pickle.load(savefile)
sigmar2_init= pickle.load(savefile)
sigmat2_init= pickle.load(savefile)
ii= pickle.load(savefile)
jj= pickle.load(savefile)
grids= pickle.load(savefile)
savefile.close()
return (surfmass,meanvr,meanvt,sigmar2,sigmat2,sigmart,vertexdev,
surfmass_init,meanvt_init,sigmar2_init,sigmat2_init,
ii,jj,grids)
def save_output(savefilename,surfmass,meanvr,meanvt,sigmar2,
sigmat2,sigmart,vertexdev,ii,jj,grids,
surfmass_init,meanvt_init,sigmar2_init,sigmat2_init):
saving= True
interrupted= False
while saving:
try:
savefile= open(savefilename,'wb')
pickle.dump(surfmass,savefile)
pickle.dump(meanvr,savefile)
pickle.dump(meanvt,savefile)
pickle.dump(sigmar2,savefile)
pickle.dump(sigmat2,savefile)
pickle.dump(sigmart,savefile)
pickle.dump(vertexdev,savefile)
pickle.dump(surfmass_init,savefile)
pickle.dump(meanvt_init,savefile)
pickle.dump(sigmar2_init,savefile)
pickle.dump(sigmat2_init,savefile)
pickle.dump(ii,savefile)
pickle.dump(jj,savefile)
pickle.dump(grids,savefile)
savefile.close()
saving= False
if interrupted:
raise KeyboardInterrupt
except KeyboardInterrupt:
if not saving:
raise
print "KeyboardInterrupt ignored while saving pickle ..."
interrupted= True
return None
def get_options():
usage = "usage: %prog [options] <plotfilename>\n\nplotfilename= name of the file that the figure will be saved to"
parser = OptionParser(usage=usage)
parser.add_option("-s","--savefile",dest="savefilename",
default=None,
help="Name of the file that the field will be saved to")
parser.add_option("--bar",action="store_true",
default=False, dest="bar",
help="Use bar")
parser.add_option("--steadyspiral",action="store_true",
default=False, dest="steadyspiral",
help="Use steady spiral")
parser.add_option("--transientspirals",action="store_true",
default=False, dest="transientspirals",
help="Use transient spirals (NOT IMPLEMENTED YET)")
parser.add_option("--singletransientspiral",action="store_true",
default=False, dest="singletransientspiral",
help="Use a single transient spiral")
parser.add_option("--movingobject",action="store_true",
default=False, dest="movingobject",
help="Use a Moving Object like Quillen's")
parser.add_option("--elliptical",action="store_true",
default=False, dest="elliptical",
help="Use EllipticalDiskPotential")
parser.add_option("-b","--beta",dest="beta",type='float',
default=0.,
help="Rotation curve power law index")
parser.add_option("--to",dest="to",type='float',
default=None,
help="Time to when df was steady-state, default=bar formation")
parser.add_option("-r",dest="res",type='int',
default=26,
help="Resolution of spatial grid")
parser.add_option("--phires",dest="phires",type='int',
default=5,
help="Resolution of phi spatial grid (if phimax is set)")
parser.add_option("--phimax",dest="phimax",type='float',
default=None,
help="Maximum (=-minimum) phi in rad (default=whole 2pi)")
parser.add_option("--rmin",dest="rmin",type='float',
default=0.5,
help="Minimum Galactocentric radius")
parser.add_option("--rmax",dest="rmax",type='float',
default=2.,
help="Maximum Galactocentric radius")
parser.add_option("-g",dest="grid",type='int',
default=26,
help="Resolution of velocity grid")
parser.add_option("--vmin",dest="vmin",type='float',
default=None,
help="Minimum value for density plot")
parser.add_option("--vmax",dest="vmax",type='float',
default=None,
help="Maximum value for density plot")
parser.add_option("--dftype", dest="dftype",
default='dehnen',
help="Type of DF to use")
parser.add_option("--plottype", dest="plottype",
default='vr',
help="Type of plot to make (vr, vt, sigmar2, sigmat2, sigmart, vertexdev)")
parser.add_option("--absolute",action="store_true",
default=False, dest="absolute",
help="Plot 'absolute' values, otherwise relative to unevolved DF")
parser.add_option("--altrect",action="store_true",
default=False, dest="altrect",
help="Make the grid in an alternative rectangular grid")
parser.add_option("--diskrect",action="store_true",
default=False, dest="diskrect",
help="Make the grid over the full disk for Rob Grand's paper")
parser.add_option("--centraldiskrect",action="store_true",
default=False, dest="centraldiskrect",
help="Make the grid over the central region of the disk for Rob Grand's paper")
parser.add_option("--galcoords",action="store_true",
default=False, dest="galcoords",
help="Make the grid in (R,azimuth) rather than (X,Y)")
parser.add_option("--plotpolar",action="store_true",
default=False, dest="plotpolar",
help="Plot in polar coordinates (with galcoords)")
parser.add_option("--rd",dest="rd",type='float',
default=1./3.,
help="Initial disk scale-length")
parser.add_option("--rs",dest="rs",type='float',
default=2.,
help="Initial disk sigma_R scale-length")
parser.add_option("--so",dest="so",type='float',
default=31.4/220.,
help="Initial disk sigma_R at R_0")
parser.add_option("--baralpha",dest="baralpha",type='float',
default=0.01,
help="Bar strength alpha parameter")
parser.add_option("--bar_tform",dest="bar_tform",type='float',
default=-4.,
help="Bar formation time in bar periods")
parser.add_option("--bar_tsteady",dest="bar_tsteady",type='float',
default=2.,
help="Bar steady time in bar periods")
parser.add_option("--bar_olr",dest="bar_olr",type='float',
default=.9,
help="Bar radius of OLR")
parser.add_option("--bar_angle",dest="bar_angle",type='float',
default=25.,
help="Angle between Sun--GC line and bar semi-major axis (deg)")
parser.add_option("--el_cp",dest="el_cp",type='float',
default=0.05,
help="EllipticalDiskPotential cp")
parser.add_option("--el_sp",dest="el_sp",type='float',
default=0.0,
help="EllipticalDiskPotential sp")
parser.add_option("--el_p",dest="el_p",type='float',
default=0.0,
help="EllipticalDiskPotential p")
parser.add_option("--dontsavegrid",action="store_true",
default=False, dest="dontsavegrid",
help="Don't save the grids on which the velocity distribution is calculated")
parser.add_option("--nt",dest="nt",type='int',
default=1,
help="Number of times to evaluate the DF at")
parser.add_option("--movie",action="store_true",
default=False, dest="movie",
help="create movie instead")
parser.add_option("--tmpdir",dest="tmpdir",
default=None,
help="Temporary directory for movie frames")
parser.add_option("--framerate",dest="framerate",type='int',
default=25,
help="Framerate for movie")
parser.add_option("--bitrate",dest="bitrate",
default='512k',
help="bitrate for movie")
parser.add_option("--nsigma",dest="nsigma",type='float',
default=None,
help="nsigma for df integration")
parser.add_option("--transientspiralsigma",dest="transientspiralsigma",
default=5.,type='float',
help="'duration' of spiral wave (Gaussian sigma)")
parser.add_option("--transientspiralto",dest="transientspiralto",
default=0.,type='float',
help="time at which the transient spiral peaks")
parser.add_option("--steadyspiraltform",dest="steadyspiraltform",
default=None,type='float',
help="time at which the steady spiral forms (NOT in spiral periods)")
parser.add_option("--steadyspiraltsteady",dest="steadyspiraltsteady",
default=None,type='float',
help="time at which the steady spiral becomes steady (NOT in spiral periods)")
parser.add_option("--steadyspiralalpha",dest="steadyspiralalpha",
default=-12.5,type='float',
help="Alpha parameter of the steady spiral")
parser.add_option("--steadyspiralomegas",dest="steadyspiralomegas",
default=0.65,type='float',
help="Pattern speed of the steady spiral")
parser.add_option("--steadyspiralgamma",dest="steadyspiralgamma",
default=1.2,type='float',
help="Gamma parameter of the steady spiral")
parser.add_option("--steadyspiralm",dest="steadyspiralm",
default=2,type='int',
help="Gamma parameter of the steady spiral")
parser.add_option("--el_tform",dest="el_tform",
default=None,type='float',
help="time at which the elliptical disk forms)")
parser.add_option("--el_tsteady",dest="el_tsteady",
default=None,type='float',
help="Time at which the elliptical disk becomes steady")
parser.add_option("--hierarchgrid",action="store_true",
default=False, dest="hierarchgrid",
help="Use a hierarchical grid")
parser.add_option("--nlevels",dest="nlevels",type='int',
default=5,
help="Number of hierarchical levels (if --hierarchgrid is set)")
parser.add_option("--azavg",action="store_true",
default=False, dest="azavg",
help="Azimuthally average and plot as well")
parser.add_option("--print_vprogress",action="store_true",
default=False, dest="print_vprogress",
help="Print progress in calculating the velocity distribution for each spatial grid point")
parser.add_option("--integrate_method",dest="integrate_method",
default="dopr54_c",
help="Orbit integration method")
parser.add_option("--plot_resonance",action="store_true",
default=False, dest="plot_resonance",
help="Plot the location of the main resonances")
parser.add_option("--dontplot",action="store_true",
default=False, dest="dontplot",
help="Don't plot")
parser.add_option("--oort",dest="oort",
default=None,
help="(also) calculate the Oort constants, save them to this file in a manner similar to the first savefile")
parser.add_option("-m","--multi",dest="multi",type='int',
default=None,
help="If set, use multiprocessing")
return parser
if __name__ == '__main__':
velocity_field(get_options())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment