""" import agama, numpy, matplotlib.pyplot as plt # the distribution function defining the model df = agama.DistributionFunction(type="DoublePowerLaw", J0=1, slopeIn=0, slopeOut=6, norm=30) mass = df.totalMass() scaleradius = 2. # educated guess # initial guess for the density profile dens = agama.Density(type='Plummer', mass=mass, scaleRadius=scaleradius) print "DF mass=", mass, ' Density mass=', dens.totalMass() # should be identical # define the self-consistent model consisting of a single component params = dict(rminSph=0.01, rmaxSph=100., sizeRadialSph=25, lmaxAngularSph=0) comp = agama.Component(df=df, density=dens, disklike=False, **params) scm = agama.SelfConsistentModel(**params) scm.components=[comp] # prepare visualization r=numpy.logspace(-2.,2.) xyz=numpy.vstack((r,r*0,r*0)).T plt.plot(r, dens.density(xyz), label='Init density') # perform several iterations of self-consistent modelling procedure for i in range(5): scm.iterate() print 'Iteration', i, ' Phi(0)=', scm.potential.potential(0,0,0), ' Mass=', scm.potential.totalMass() plt.plot(r, scm.potential.density(xyz), label='Iteration #'+str(i)) # save the final density/potential profile scm.potential.export("simple_scm.coef_mul")
iniFileName = os.path.dirname(os.path.realpath(sys.argv[0])) + "/../data/SCM3.ini" ini = RawConfigParser() #ini.optionxform=str # do not convert key to lowercase ini.read(iniFileName) iniPotenHalo = dict(ini.items("Potential halo")) iniPotenBulge = dict(ini.items("Potential bulge")) iniPotenDisk = dict(ini.items("Potential disk")) iniPotenBH = dict(ini.items("Potential BH")) iniDFDisk = dict(ini.items("DF disk")) iniSCMHalo = dict(ini.items("SelfConsistentModel halo")) iniSCMBulge = dict(ini.items("SelfConsistentModel bulge")) iniSCMDisk = dict(ini.items("SelfConsistentModel disk")) iniSCM = dict(ini.items("SelfConsistentModel")) # initialize the SelfConsistentModel object (only the potential expansion parameters) model = agama.SelfConsistentModel(**iniSCM) # create initial density profiles of all components densityDisk = agama.Density(**iniPotenDisk) densityBulge = agama.Density(**iniPotenBulge) densityHalo = agama.Density(**iniPotenHalo) potentialBH = agama.Potential(**iniPotenBH) # add components to SCM - at first, all of them are static density profiles model.components.append(agama.Component(density=densityDisk, disklike=True)) model.components.append(agama.Component(density=densityBulge, disklike=False)) model.components.append(agama.Component(density=densityHalo, disklike=False)) model.components.append(agama.Component(potential=potentialBH)) # compute the initial potential model.iterate()
ha='right', va='center', transform=ax.transAxes) ax.set_ylabel('f(V)', labelpad=3) plt.savefig('nsd_model.pdf') plt.show() if __name__ == '__main__': agama.setUnits(length=1, velocity=1, mass=1e10) # 1 kpc, 1 km/s, 1e10 Msun # initialize the SelfConsistentModel object (only the potential expansion parameters) model = agama.SelfConsistentModel(RminCyl=0.005, RmaxCyl=1.0, sizeRadialCyl=25, zminCyl=0.005, zmaxCyl=1.0, sizeVerticalCyl=25) # construct a two component model: NSD + NSC # NSD -> generated self-consistently # NSC -> kept fixed as an external potential # NSC best-fitting model from Chatzopoulos et al. 2015 (see Equation 28 here: https://arxiv.org/pdf/2007.06577.pdf) density_NSC_init = agama.Density(type='Dehnen', mass=6.1e-3, gamma=0.71, scaleRadius=5.9e-3, axisRatioZ=0.73) # NSD model 3 from Sormani et al. 2020 (see Equation 24 here: https://arxiv.org/pdf/2007.06577.pdf)