@@ -45,13 +45,19 @@ function Base.show(io::IO, config::Bulge)
4545 )
4646end
4747
48+ function pdf (config:: Bulge , R, z)
49+ r_prime = sqrt (R^ 2 + (z / config. q)^ 2 )
50+ return exp (- r_prime^ 2 / ustrip (config. CutRadius)^ 2 ) / (1 + r_prime/ ustrip (config. ScaleRadius))^ config. α * 2 π* R
51+ end
52+
4853"""
4954$(TYPEDSIGNATURES)
5055
5156"""
5257function generate (config:: Bulge , units = uAstro;
5358 RotationCurve = nothing ,
5459 MaxRadius = 5 * config. ScaleRadius,
60+ # MaxHeight = 5 * config.ScaleRadius * config.q,
5561 MaxHeight = MaxRadius,
5662)
5763 uLen = getuLength (units)
@@ -65,17 +71,30 @@ function generate(config::Bulge, units = uAstro;
6571
6672 R = eltype (config. ScaleRadius)[]
6773 z = eltype (config. ScaleRadius)[]
68-
74+
75+ target (xy) = - pdf (config,xy[1 ],xy[2 ])
76+ pdf_maximum = - minimum_func (target, [ustrip (config. ScaleRadius), ustrip (config. ScaleRadius)* config. q])[1 ]
77+
78+ # rejection sampling
6979 while length (R) < NumSamples
70- R_rand = randn () * config. CutRadius / sqrt (2 )
71- z_rand = randn () * config. q * config. CutRadius / sqrt (2 )
72- r_prime = sqrt (R_rand^ 2 + (z_rand/ config. q)^ 2 )
73- if rand () <= (1 + r_prime / config. ScaleRadius)^ (- config. α)
74- push! (R, abs (R_rand))
75- push! (z, z_rand)
80+ R_rand = rand () * ustrip (MaxRadius)
81+ z_rand = rand () * 2 * ustrip (MaxHeight) - ustrip (MaxHeight)
82+ if rand () < pdf (config, R_rand, z_rand) / pdf_maximum
83+ push! (R, R_rand * uLen)
84+ push! (z, z_rand * uLen)
7685 end
7786 end
7887
88+ # while length(R) < NumSamples
89+ # R_rand = randn() * config.CutRadius / sqrt(2)
90+ # z_rand = randn() * config.q * config.CutRadius / sqrt(2)
91+ # r_prime = sqrt(R_rand^2 + (z_rand/config.q)^2)
92+ # if rand() <= (1 + r_prime / config.ScaleRadius)^(-config.α)
93+ # push!(R, abs(R_rand))
94+ # push!(z, z_rand)
95+ # end
96+ # end
97+
7998 pos2d = StructArray (rand_pos_2d .(R))
8099 pos = StructArray (PVector .(pos2d. x, pos2d. y, z))
81100
0 commit comments