def vcirc(Pot,R,phi=None,t=0.): """ NAME: vcirc PURPOSE: calculate the circular velocity at R in potential Pot INPUT: Pot - Potential instance or list of such instances R - Galactocentric radius (can be Quantity) phi= (None) azimuth to use for non-axisymmetric potentials t= time (optional; can be Quantity) OUTPUT: circular rotation velocity HISTORY: 2011-10-09 - Written - Bovy (IAS) 2016-06-15 - Added phi= keyword for non-axisymmetric potential - Bovy (UofT) """ from galpy.potential import evaluateplanarRforces from galpy.potential import PotentialError try: return nu.sqrt(-R*evaluateplanarRforces(Pot,R,phi=phi,t=t, use_physical=False)) except PotentialError: from galpy.potential import toPlanarPotential Pot= toPlanarPotential(Pot) return nu.sqrt(-R*evaluateplanarRforces(Pot,R,phi=phi,t=t, use_physical=False))
def vcirc(Pot, R, phi=None): """ NAME: vcirc PURPOSE: calculate the circular velocity at R in potential Pot INPUT: Pot - Potential instance or list of such instances R - Galactocentric radius (can be Quantity) phi= (None) azimuth to use for non-axisymmetric potentials OUTPUT: circular rotation velocity HISTORY: 2011-10-09 - Written - Bovy (IAS) 2016-06-15 - Added phi= keyword for non-axisymmetric potential - Bovy (UofT) """ from galpy.potential import evaluateplanarRforces from galpy.potential import PotentialError try: return nu.sqrt(-R * evaluateplanarRforces(Pot, R, phi=phi, use_physical=False)) except PotentialError: from galpy.potential import toPlanarPotential Pot = toPlanarPotential(Pot) return nu.sqrt(-R * evaluateplanarRforces(Pot, R, phi=phi, use_physical=False))
def _parse_pot(pot): """Parse the potential so it can be fed to C""" from .integrateFullOrbit import _parse_scf_pot #Figure out what's in pot if not isinstance(pot, list): pot = [pot] #Initialize everything pot_type = [] pot_args = [] npot = len(pot) for p in pot: # Prepare for wrappers if ((isinstance(p,planarPotentialFromFullPotential) \ or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,parentWrapperPotential)) \ or isinstance(p,parentWrapperPotential): if not isinstance(p, parentWrapperPotential): wrap_npot, wrap_pot_type, wrap_pot_args= \ _parse_pot(potential.toPlanarPotential(p._Pot._pot)) else: wrap_npot, wrap_pot_type, wrap_pot_args = _parse_pot(p._pot) if (isinstance(p,planarPotentialFromRZPotential) or isinstance(p,planarPotentialFromFullPotential) ) \ and isinstance(p._Pot,potential.LogarithmicHaloPotential): pot_type.append(0) if p._Pot.isNonAxi: pot_args.extend( [p._Pot._amp, p._Pot._q, p._Pot._core2, p._Pot._1m1overb2]) else: pot_args.extend([p._Pot._amp, p._Pot._q, p._Pot._core2, 2.]) # 1m1overb2 > 1: axi elif isinstance(p,planarPotentialFromFullPotential) \ and isinstance(p._Pot,potential.DehnenBarPotential): pot_type.append(1) pot_args.extend([ p._Pot._amp * p._Pot._af, p._Pot._tform, p._Pot._tsteady, p._Pot._rb, p._Pot._omegab, p._Pot._barphi ]) elif isinstance(p, potential.TransientLogSpiralPotential): pot_type.append(2) pot_args.extend([ p._amp, p._A, p._to, p._sigma2, p._alpha, p._m, p._omegas, p._gamma ]) elif isinstance(p, potential.SteadyLogSpiralPotential): pot_type.append(3) if p._tform is None: pot_args.extend([ p._amp, float('nan'), float('nan'), p._A, p._alpha, p._m, p._omegas, p._gamma ]) else: pot_args.extend([ p._amp, p._tform, p._tsteady, p._A, p._alpha, p._m, p._omegas, p._gamma ]) elif isinstance(p, potential.EllipticalDiskPotential): pot_type.append(4) if p._tform is None: pot_args.extend([ p._amp, float('nan'), float('nan'), p._twophio, p._p, p._phib ]) else: pot_args.extend( [p._amp, p._tform, p._tsteady, p._twophio, p._p, p._phib]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.MiyamotoNagaiPotential): pot_type.append(5) pot_args.extend([p._Pot._amp, p._Pot._a, p._Pot._b]) elif isinstance(p, potential.LopsidedDiskPotential): pot_type.append(6) pot_args.extend([p._amp, p._mphio, p._p, p._phib]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.PowerSphericalPotential): pot_type.append(7) pot_args.extend([p._Pot._amp, p._Pot.alpha]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.HernquistPotential): pot_type.append(8) pot_args.extend([p._Pot._amp, p._Pot.a]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.NFWPotential): pot_type.append(9) pot_args.extend([p._Pot._amp, p._Pot.a]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.JaffePotential): pot_type.append(10) pot_args.extend([p._Pot._amp, p._Pot.a]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.DoubleExponentialDiskPotential): pot_type.append(11) pot_args.extend([ p._Pot._amp, p._Pot._alpha, p._Pot._beta, p._Pot._kmaxFac, p._Pot._nzeros, p._Pot._glorder ]) pot_args.extend([p._Pot._glx[ii] for ii in range(p._Pot._glorder)]) pot_args.extend([p._Pot._glw[ii] for ii in range(p._Pot._glorder)]) pot_args.extend( [p._Pot._j0zeros[ii] for ii in range(p._Pot._nzeros + 1)]) pot_args.extend( [p._Pot._dj0zeros[ii] for ii in range(p._Pot._nzeros + 1)]) pot_args.extend( [p._Pot._j1zeros[ii] for ii in range(p._Pot._nzeros + 1)]) pot_args.extend( [p._Pot._dj1zeros[ii] for ii in range(p._Pot._nzeros + 1)]) pot_args.extend([p._Pot._kp._amp, p._Pot._kp.alpha]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.FlattenedPowerPotential): pot_type.append(12) pot_args.extend([p._Pot._amp, p._Pot.alpha, p._Pot.core2]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.IsochronePotential): pot_type.append(14) pot_args.extend([p._Pot._amp, p._Pot.b]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.PowerSphericalPotentialwCutoff): pot_type.append(15) pot_args.extend([p._Pot._amp, p._Pot.alpha, p._Pot.rc]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.MN3ExponentialDiskPotential): # Three Miyamoto-Nagai disks npot += 2 pot_type.extend([5, 5, 5]) pot_args.extend([ p._Pot._amp * p._Pot._mn3[0]._amp, p._Pot._mn3[0]._a, p._Pot._mn3[0]._b, p._Pot._amp * p._Pot._mn3[1]._amp, p._Pot._mn3[1]._a, p._Pot._mn3[1]._b, p._Pot._amp * p._Pot._mn3[2]._amp, p._Pot._mn3[2]._a, p._Pot._mn3[2]._b ]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.KuzminKutuzovStaeckelPotential): pot_type.append(16) pot_args.extend([p._Pot._amp, p._Pot._ac, p._Pot._Delta]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.PlummerPotential): pot_type.append(17) pot_args.extend([p._Pot._amp, p._Pot._b]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.PseudoIsothermalPotential): pot_type.append(18) pot_args.extend([p._Pot._amp, p._Pot._a]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.KuzminDiskPotential): pot_type.append(19) pot_args.extend([p._Pot._amp, p._Pot._a]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.BurkertPotential): pot_type.append(20) pot_args.extend([p._Pot._amp, p._Pot.a]) elif (isinstance(p,planarPotentialFromFullPotential) or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,potential.EllipsoidalPotential.EllipsoidalPotential): pot_args.append(p._Pot._amp) pot_args.extend([0., 0., 0., 0., 0., 0.]) # for caching if isinstance(p._Pot, potential.TriaxialHernquistPotential): pot_type.append(21) pot_args.extend([2, p._Pot.a, p._Pot.a4]) # for psi, mdens, mdens_deriv if isinstance(p._Pot, potential.TriaxialNFWPotential): pot_type.append(22) pot_args.extend([2, p._Pot.a, p._Pot.a3]) # for psi, mdens, mdens_deriv if isinstance(p._Pot, potential.TriaxialJaffePotential): pot_type.append(23) pot_args.extend([2, p._Pot.a, p._Pot.a2]) # for psi, mdens, mdens_deriv elif isinstance(p._Pot, potential.PerfectEllipsoidPotential): pot_type.append(30) pot_args.extend([1, p._Pot.a2]) # for psi, mdens, mdens_deriv pot_args.extend([p._Pot._b2, p._Pot._c2, int(p._Pot._aligned)]) # Reg. Ellipsoidal if not p._Pot._aligned: pot_args.extend(list(p._Pot._rot.flatten())) else: pot_args.extend(list(nu.eye(3).flatten())) # not actually used pot_args.append(p._Pot._glorder) pot_args.extend([p._Pot._glx[ii] for ii in range(p._Pot._glorder)]) # this adds some common factors to the integration weights pot_args.extend([-4.*nu.pi*p._Pot._glw[ii]*p._Pot._b*p._Pot._c\ /nu.sqrt(( 1.+(p._Pot._b2-1.)*p._Pot._glx[ii]**2.) *(1.+(p._Pot._c2-1.)*p._Pot._glx[ii]**2.)) for ii in range(p._Pot._glorder)]) elif (isinstance(p,planarPotentialFromFullPotential) or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,potential.SCFPotential): pt, pa = _parse_scf_pot(p._Pot) pot_type.append(pt) pot_args.extend(pa) elif isinstance(p,planarPotentialFromFullPotential) \ and isinstance(p._Pot,potential.SoftenedNeedleBarPotential): pot_type.append(25) pot_args.extend([ p._Pot._amp, p._Pot._a, p._Pot._b, p._Pot._c2, p._Pot._pa, p._Pot._omegab ]) pot_args.extend([0., 0., 0., 0., 0., 0., 0.]) # for caching elif (isinstance(p,planarPotentialFromFullPotential) or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,potential.DiskSCFPotential): # Need to pull this apart into: (a) SCF part, (b) constituent # [Sigma_i,h_i] parts # (a) SCF, multiply in any add'l amp pt, pa = _parse_scf_pot(p._Pot._scf, extra_amp=p._Pot._amp) pot_type.append(pt) pot_args.extend(pa) # (b) constituent [Sigma_i,h_i] parts for Sigma, hz in zip(p._Pot._Sigma_dict, p._Pot._hz_dict): npot += 1 pot_type.append(26) stype = Sigma.get('type', 'exp') if stype == 'exp' \ or (stype == 'exp' and 'Rhole' in Sigma): pot_args.extend([ 3, 0, 4. * nu.pi * Sigma.get('amp', 1.) * p._Pot._amp, Sigma.get('h', 1. / 3.) ]) elif stype == 'expwhole' \ or (stype == 'exp' and 'Rhole' in Sigma): pot_args.extend([ 4, 1, 4. * nu.pi * Sigma.get('amp', 1.) * p._Pot._amp, Sigma.get('h', 1. / 3.), Sigma.get('Rhole', 0.5) ]) hztype = hz.get('type', 'exp') if hztype == 'exp': pot_args.extend([0, hz.get('h', 0.0375)]) elif hztype == 'sech2': pot_args.extend([1, hz.get('h', 0.0375)]) elif isinstance(p,planarPotentialFromFullPotential) \ and isinstance(p._Pot, potential.SpiralArmsPotential): pot_type.append(27) pot_args.extend([ len(p._Pot._Cs), p._Pot._amp, p._Pot._N, p._Pot._sin_alpha, p._Pot._tan_alpha, p._Pot._r_ref, p._Pot._phi_ref, p._Pot._Rs, p._Pot._H, p._Pot._omega ]) pot_args.extend(p._Pot._Cs) elif isinstance(p, potential.CosmphiDiskPotential): pot_type.append(28) pot_args.extend([ p._amp, p._mphio, p._p, p._mphib, p._m, p._rb, p._rbp, p._rb2p, p._r1p ]) elif isinstance(p, potential.HenonHeilesPotential): pot_type.append(29) pot_args.extend([p._amp]) # 30: PerfectEllipsoidPotential, done with other EllipsoidalPotentials above ############################## WRAPPERS ############################### elif ((isinstance(p,planarPotentialFromFullPotential) or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,potential.DehnenSmoothWrapperPotential)) \ or isinstance(p,potential.DehnenSmoothWrapperPotential): if not isinstance(p, potential.DehnenSmoothWrapperPotential): p = p._Pot pot_type.append(-1) # wrap_pot_type, args, and npot obtained before this horrible if pot_args.append(wrap_npot) pot_type.extend(wrap_pot_type) pot_args.extend(wrap_pot_args) pot_args.extend([p._amp, p._tform, p._tsteady]) elif ((isinstance(p,planarPotentialFromFullPotential) or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,potential.SolidBodyRotationWrapperPotential)) \ or isinstance(p,potential.SolidBodyRotationWrapperPotential): if not isinstance(p, potential.SolidBodyRotationWrapperPotential): p = p._Pot pot_type.append(-2) # wrap_pot_type, args, and npot obtained before this horrible if pot_args.append(wrap_npot) pot_type.extend(wrap_pot_type) pot_args.extend(wrap_pot_args) pot_args.extend([p._amp, p._omega, p._pa]) elif ((isinstance(p,planarPotentialFromFullPotential) or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,potential.CorotatingRotationWrapperPotential)) \ or isinstance(p,potential.CorotatingRotationWrapperPotential): if not isinstance(p, potential.CorotatingRotationWrapperPotential): p = p._Pot pot_type.append(-4) # wrap_pot_type, args, and npot obtained before this horrible if pot_args.append(wrap_npot) pot_type.extend(wrap_pot_type) pot_args.extend(wrap_pot_args) pot_args.extend([p._amp, p._vpo, p._beta, p._pa, p._to]) elif ((isinstance(p,planarPotentialFromFullPotential) or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,potential.GaussianAmplitudeWrapperPotential)) \ or isinstance(p,potential.GaussianAmplitudeWrapperPotential): if not isinstance(p, potential.GaussianAmplitudeWrapperPotential): p = p._Pot pot_type.append(-5) # wrap_pot_type, args, and npot obtained before this horrible if pot_args.append(wrap_npot) pot_type.extend(wrap_pot_type) pot_args.extend(wrap_pot_args) pot_args.extend([p._amp, p._to, p._sigma2]) pot_type = nu.array(pot_type, dtype=nu.int32, order='C') pot_args = nu.array(pot_args, dtype=nu.float64, order='C') return (npot, pot_type, pot_args)
def _parse_pot(pot): """Parse the potential so it can be fed to C""" from .integrateFullOrbit import _parse_scf_pot #Figure out what's in pot if not isinstance(pot,list): pot= [pot] #Initialize everything pot_type= [] pot_args= [] npot= len(pot) for p in pot: # Prepare for wrappers if ((isinstance(p,planarPotentialFromFullPotential) \ or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,parentWrapperPotential)) \ or isinstance(p,parentWrapperPotential): if not isinstance(p,parentWrapperPotential): wrap_npot, wrap_pot_type, wrap_pot_args= \ _parse_pot(potential.toPlanarPotential(p._Pot._pot)) else: wrap_npot, wrap_pot_type, wrap_pot_args= _parse_pot(p._pot) if (isinstance(p,planarPotentialFromRZPotential) or isinstance(p,planarPotentialFromFullPotential) ) \ and isinstance(p._Pot,potential.LogarithmicHaloPotential): pot_type.append(0) if p._Pot.isNonAxi: pot_args.extend([p._Pot._amp,p._Pot._q, p._Pot._core2,p._Pot._1m1overb2]) else: pot_args.extend([p._Pot._amp,p._Pot._q,p._Pot._core2,2.]) # 1m1overb2 > 1: axi elif isinstance(p,planarPotentialFromFullPotential) \ and isinstance(p._Pot,potential.DehnenBarPotential): pot_type.append(1) pot_args.extend([p._Pot._amp*p._Pot._af,p._Pot._tform, p._Pot._tsteady,p._Pot._rb,p._Pot._omegab, p._Pot._barphi]) elif isinstance(p,potential.TransientLogSpiralPotential): pot_type.append(2) pot_args.extend([p._amp,p._A,p._to,p._sigma2,p._alpha,p._m, p._omegas,p._gamma]) elif isinstance(p,potential.SteadyLogSpiralPotential): pot_type.append(3) if p._tform is None: pot_args.extend([p._amp,float('nan'), float('nan'), p._A,p._alpha,p._m, p._omegas,p._gamma]) else: pot_args.extend([p._amp,p._tform,p._tsteady,p._A,p._alpha,p._m, p._omegas,p._gamma]) elif isinstance(p,potential.EllipticalDiskPotential): pot_type.append(4) if p._tform is None: pot_args.extend([p._amp,float('nan'), float('nan'), p._twophio,p._p,p._phib]) else: pot_args.extend([p._amp,p._tform,p._tsteady, p._twophio,p._p,p._phib]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.MiyamotoNagaiPotential): pot_type.append(5) pot_args.extend([p._Pot._amp,p._Pot._a,p._Pot._b]) elif isinstance(p,potential.LopsidedDiskPotential): pot_type.append(6) pot_args.extend([p._amp,p._mphio,p._p,p._phib]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.PowerSphericalPotential): pot_type.append(7) pot_args.extend([p._Pot._amp,p._Pot.alpha]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.HernquistPotential): pot_type.append(8) pot_args.extend([p._Pot._amp,p._Pot.a]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.NFWPotential): pot_type.append(9) pot_args.extend([p._Pot._amp,p._Pot.a]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.JaffePotential): pot_type.append(10) pot_args.extend([p._Pot._amp,p._Pot.a]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.DoubleExponentialDiskPotential): pot_type.append(11) pot_args.extend([p._Pot._amp,p._Pot._alpha, p._Pot._beta,p._Pot._kmaxFac, p._Pot._nzeros,p._Pot._glorder]) pot_args.extend([p._Pot._glx[ii] for ii in range(p._Pot._glorder)]) pot_args.extend([p._Pot._glw[ii] for ii in range(p._Pot._glorder)]) pot_args.extend([p._Pot._j0zeros[ii] for ii in range(p._Pot._nzeros+1)]) pot_args.extend([p._Pot._dj0zeros[ii] for ii in range(p._Pot._nzeros+1)]) pot_args.extend([p._Pot._j1zeros[ii] for ii in range(p._Pot._nzeros+1)]) pot_args.extend([p._Pot._dj1zeros[ii] for ii in range(p._Pot._nzeros+1)]) pot_args.extend([p._Pot._kp._amp,p._Pot._kp.alpha]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.FlattenedPowerPotential): pot_type.append(12) pot_args.extend([p._Pot._amp,p._Pot.alpha,p._Pot.core2]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.IsochronePotential): pot_type.append(14) pot_args.extend([p._Pot._amp,p._Pot.b]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.PowerSphericalPotentialwCutoff): pot_type.append(15) pot_args.extend([p._Pot._amp,p._Pot.alpha,p._Pot.rc]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.MN3ExponentialDiskPotential): # Three Miyamoto-Nagai disks npot+= 2 pot_type.extend([5,5,5]) pot_args.extend([p._Pot._amp*p._Pot._mn3[0]._amp, p._Pot._mn3[0]._a,p._Pot._mn3[0]._b, p._Pot._amp*p._Pot._mn3[1]._amp, p._Pot._mn3[1]._a,p._Pot._mn3[1]._b, p._Pot._amp*p._Pot._mn3[2]._amp, p._Pot._mn3[2]._a,p._Pot._mn3[2]._b]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.KuzminKutuzovStaeckelPotential): pot_type.append(16) pot_args.extend([p._Pot._amp,p._Pot._ac,p._Pot._Delta]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.PlummerPotential): pot_type.append(17) pot_args.extend([p._Pot._amp,p._Pot._b]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.PseudoIsothermalPotential): pot_type.append(18) pot_args.extend([p._Pot._amp,p._Pot._a]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.KuzminDiskPotential): pot_type.append(19) pot_args.extend([p._Pot._amp,p._Pot._a]) elif isinstance(p,planarPotentialFromRZPotential) \ and isinstance(p._Pot,potential.BurkertPotential): pot_type.append(20) pot_args.extend([p._Pot._amp,p._Pot.a]) elif (isinstance(p,planarPotentialFromFullPotential) or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,potential.EllipsoidalPotential.EllipsoidalPotential): pot_args.append(p._Pot._amp) pot_args.extend([0.,0.,0.,0.,0.,0.]) # for caching if isinstance(p._Pot,potential.TriaxialHernquistPotential): pot_type.append(21) pot_args.extend([2,p._Pot.a,p._Pot.a4]) # for psi, mdens, mdens_deriv if isinstance(p._Pot,potential.TriaxialNFWPotential): pot_type.append(22) pot_args.extend([2,p._Pot.a,p._Pot.a3]) # for psi, mdens, mdens_deriv if isinstance(p._Pot,potential.TriaxialJaffePotential): pot_type.append(23) pot_args.extend([2,p._Pot.a,p._Pot.a2]) # for psi, mdens, mdens_deriv elif isinstance(p._Pot,potential.PerfectEllipsoidPotential): pot_type.append(30) pot_args.extend([1,p._Pot.a2]) # for psi, mdens, mdens_deriv pot_args.extend([p._Pot._b2,p._Pot._c2, int(p._Pot._aligned)]) # Reg. Ellipsoidal if not p._Pot._aligned: pot_args.extend(list(p._Pot._rot.flatten())) else: pot_args.extend(list(nu.eye(3).flatten())) # not actually used pot_args.append(p._Pot._glorder) pot_args.extend([p._Pot._glx[ii] for ii in range(p._Pot._glorder)]) # this adds some common factors to the integration weights pot_args.extend([-4.*nu.pi*p._Pot._glw[ii]*p._Pot._b*p._Pot._c\ /nu.sqrt(( 1.+(p._Pot._b2-1.)*p._Pot._glx[ii]**2.) *(1.+(p._Pot._c2-1.)*p._Pot._glx[ii]**2.)) for ii in range(p._Pot._glorder)]) elif (isinstance(p,planarPotentialFromFullPotential) or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,potential.SCFPotential): pt,pa= _parse_scf_pot(p._Pot) pot_type.append(pt) pot_args.extend(pa) elif isinstance(p,planarPotentialFromFullPotential) \ and isinstance(p._Pot,potential.SoftenedNeedleBarPotential): pot_type.append(25) pot_args.extend([p._Pot._amp,p._Pot._a,p._Pot._b,p._Pot._c2, p._Pot._pa,p._Pot._omegab]) pot_args.extend([0.,0.,0.,0.,0.,0.,0.]) # for caching elif (isinstance(p,planarPotentialFromFullPotential) or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,potential.DiskSCFPotential): # Need to pull this apart into: (a) SCF part, (b) constituent # [Sigma_i,h_i] parts # (a) SCF, multiply in any add'l amp pt,pa= _parse_scf_pot(p._Pot._scf,extra_amp=p._Pot._amp) pot_type.append(pt) pot_args.extend(pa) # (b) constituent [Sigma_i,h_i] parts for Sigma,hz in zip(p._Pot._Sigma_dict,p._Pot._hz_dict): npot+= 1 pot_type.append(26) stype= Sigma.get('type','exp') if stype == 'exp' \ or (stype == 'exp' and 'Rhole' in Sigma): pot_args.extend([3,0, 4.*nu.pi*Sigma.get('amp',1.)*p._Pot._amp, Sigma.get('h',1./3.)]) elif stype == 'expwhole' \ or (stype == 'exp' and 'Rhole' in Sigma): pot_args.extend([4,1, 4.*nu.pi*Sigma.get('amp',1.)*p._Pot._amp, Sigma.get('h',1./3.), Sigma.get('Rhole',0.5)]) hztype= hz.get('type','exp') if hztype == 'exp': pot_args.extend([0,hz.get('h',0.0375)]) elif hztype == 'sech2': pot_args.extend([1,hz.get('h',0.0375)]) elif isinstance(p,planarPotentialFromFullPotential) \ and isinstance(p._Pot, potential.SpiralArmsPotential): pot_type.append(27) pot_args.extend([len(p._Pot._Cs), p._Pot._amp, p._Pot._N, p._Pot._sin_alpha, p._Pot._tan_alpha, p._Pot._r_ref, p._Pot._phi_ref, p._Pot._Rs, p._Pot._H, p._Pot._omega]) pot_args.extend(p._Pot._Cs) elif isinstance(p,potential.CosmphiDiskPotential): pot_type.append(28) pot_args.extend([p._amp,p._mphio,p._p,p._mphib,p._m, p._rb,p._rbp,p._rb2p,p._r1p]) elif isinstance(p,potential.HenonHeilesPotential): pot_type.append(29) pot_args.extend([p._amp]) # 30: PerfectEllipsoidPotential, done with other EllipsoidalPotentials above ############################## WRAPPERS ############################### elif ((isinstance(p,planarPotentialFromFullPotential) or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,potential.DehnenSmoothWrapperPotential)) \ or isinstance(p,potential.DehnenSmoothWrapperPotential): if not isinstance(p,potential.DehnenSmoothWrapperPotential): p= p._Pot pot_type.append(-1) # wrap_pot_type, args, and npot obtained before this horrible if pot_args.append(wrap_npot) pot_type.extend(wrap_pot_type) pot_args.extend(wrap_pot_args) pot_args.extend([p._amp,p._tform,p._tsteady,int(p._grow)]) elif ((isinstance(p,planarPotentialFromFullPotential) or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,potential.SolidBodyRotationWrapperPotential)) \ or isinstance(p,potential.SolidBodyRotationWrapperPotential): if not isinstance(p,potential.SolidBodyRotationWrapperPotential): p= p._Pot pot_type.append(-2) # wrap_pot_type, args, and npot obtained before this horrible if pot_args.append(wrap_npot) pot_type.extend(wrap_pot_type) pot_args.extend(wrap_pot_args) pot_args.extend([p._amp,p._omega,p._pa]) elif ((isinstance(p,planarPotentialFromFullPotential) or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,potential.CorotatingRotationWrapperPotential)) \ or isinstance(p,potential.CorotatingRotationWrapperPotential): if not isinstance(p,potential.CorotatingRotationWrapperPotential): p= p._Pot pot_type.append(-4) # wrap_pot_type, args, and npot obtained before this horrible if pot_args.append(wrap_npot) pot_type.extend(wrap_pot_type) pot_args.extend(wrap_pot_args) pot_args.extend([p._amp,p._vpo,p._beta,p._pa,p._to]) elif ((isinstance(p,planarPotentialFromFullPotential) or isinstance(p,planarPotentialFromRZPotential)) \ and isinstance(p._Pot,potential.GaussianAmplitudeWrapperPotential)) \ or isinstance(p,potential.GaussianAmplitudeWrapperPotential): if not isinstance(p,potential.GaussianAmplitudeWrapperPotential): p= p._Pot pot_type.append(-5) # wrap_pot_type, args, and npot obtained before this horrible if pot_args.append(wrap_npot) pot_type.extend(wrap_pot_type) pot_args.extend(wrap_pot_args) pot_args.extend([p._amp,p._to,p._sigma2]) pot_type= nu.array(pot_type,dtype=nu.int32,order='C') pot_args= nu.array(pot_args,dtype=nu.float64,order='C') return (npot,pot_type,pot_args)