From b831796a7482e6545c303d8a8fbb60719fd4b807 Mon Sep 17 00:00:00 2001 From: Aaron LI Date: Sat, 30 Dec 2017 20:21:48 +0800 Subject: clusters/halo: Estimate turbulence acceleration w.r.t. injection scale The turbulence injection scale ~ halo size --- fg21sim/extragalactic/clusters/halo.py | 30 +++++++++++++++--------------- fg21sim/extragalactic/clusters/helper.py | 23 +++++++++++++++++++++++ fg21sim/extragalactic/clusters/main.py | 2 +- 3 files changed, 39 insertions(+), 16 deletions(-) (limited to 'fg21sim/extragalactic/clusters') diff --git a/fg21sim/extragalactic/clusters/halo.py b/fg21sim/extragalactic/clusters/halo.py index 1d9c9aa..5df47cd 100644 --- a/fg21sim/extragalactic/clusters/halo.py +++ b/fg21sim/extragalactic/clusters/halo.py @@ -75,11 +75,11 @@ class RadioHalo: Description ----------- - 1. Calculate the merger crossing time (t_cross; ~1 Gyr); - 2. Calculate the diffusion coefficient (Dpp) from the systematic + 1. Calculate the turbulence persistence time (tau_turb; ~<1 Gyr); + 2. Calculate the diffusion coefficient (D_pp) from the systematic acceleration timescale (tau_acc; ~0.1 Gyr). The acceleration - diffusion is assumed to have an action time ~ t_cross (i.e., - only during merger crossing), and then been disabled (i.e., + diffusion is assumed to have an action time ~ tau_turb (i.e., + only during turbulence persistence), and then is disabled (i.e., only radiation and ionization losses later); 3. Assume the electrons are constantly injected and has a power-law energy spectrum, determine the injection rate by further assuming @@ -192,16 +192,16 @@ class RadioHalo: @property @lru_cache() - def time_crossing(self): + def time_turbulence(self): """ - The time duration of the sub-cluster crossing the main cluster, - which is also used to approximate the merging time, during which - the turbulence acceleration is regarded as effective. + The time duration the merger-induced turbulence persists, which + is used to approximate the effective turbulence acceleration + timescale. Unit: [Gyr] """ - return helper.time_crossing(self.M_main, self.M_sub, - z=self.z_merger) + return helper.time_turbulence(self.M_main, self.M_sub, + z=self.z_merger, configs=self.configs) @property def radius_virial_obs(self): @@ -706,10 +706,10 @@ class RadioHalo: NOTE ---- Considering that the turbulence acceleration is a 2nd-order Fermi - process, it has only an effective acceleration time of several 1e8 - years. Therefore, the turbulence is assumed to only accelerate - the electrons during the merging period, i.e., the acceleration - timescale is set to be infinite after "t_merger + time_cross". + process, it has only an effective acceleration time ~<1 Gyr. + Therefore, only during the period that strong turbulence persists + in the ICM that the turbulence could effectively accelerate the + relativistic electrons. WARNING ------- @@ -745,7 +745,7 @@ class RadioHalo: ---------- Ref.[donnert2013],Eq.(15) """ - if (t < self.age_merger) or (t > self.age_merger+self.time_crossing): + if (t < self.age_merger) or (t > self.age_merger+self.time_turbulence): # NO acceleration (see also the above NOTE and WARNING!) tau_acc = 10 # [Gyr] else: diff --git a/fg21sim/extragalactic/clusters/helper.py b/fg21sim/extragalactic/clusters/helper.py index cac6401..10c4f12 100644 --- a/fg21sim/extragalactic/clusters/helper.py +++ b/fg21sim/extragalactic/clusters/helper.py @@ -360,6 +360,29 @@ def time_crossing(M_main, M_sub, z=0.0): return time +def time_turbulence(M_main, M_sub, z=0.0, configs=CONFIGS): + """ + The timescale that the compressive turbulence persists, which is + estimated as: + τ_turb ≅ 2*d / v_impact, + where d ≅ L ≅ R_vir / 3, + and L is also the turbulence injection scale. + During this timescale, the merger-induced turbulence is regarded + to accelerate the relativistic electrons effectively. + + Unit: [Gyr] + """ + # Turbulence injection scale factor + key = "extragalactic/halos/f_lturb" + f_lturb = configs.getn(key) + R_vir = radius_virial(M_main, z) # [kpc] + distance = 2*R_vir * f_lturb + vi = velocity_impact(M_main, M_sub, z) # [km/s] + uconv = AUC.kpc2km * AUC.s2Gyr # [s kpc/km] => [Gyr] + time = uconv * distance / vi # [Gyr] + return time + + def draw_halo(radius, nr=2.0, felong=None, rotation=None): """ Draw the template image of one halo, which is used to simulate diff --git a/fg21sim/extragalactic/clusters/main.py b/fg21sim/extragalactic/clusters/main.py index 5bfbf30..a02cbb0 100644 --- a/fg21sim/extragalactic/clusters/main.py +++ b/fg21sim/extragalactic/clusters/main.py @@ -288,7 +288,7 @@ class GalaxyClusters: ("Rvir_main", halo.radius_virial_main), # [kpc] at z_merger ("Rvir_sub", halo.radius_virial_sub), # [kpc] at z_merger ("tback_merger", halo.tback_merger), # [Gyr] - ("time_crossing", halo.time_crossing), # [Gyr] + ("time_turbulence", halo.time_turbulence), # [Gyr] ("Rhalo", halo.radius), # [kpc] ("Rhalo_angular", halo.angular_radius), # [arcsec] ("volume", halo.volume), # [kpc^3] -- cgit v1.2.2