diff --git a/.gitignore b/.gitignore index 7a50f695c4e53531fcc42ba94e579c7263550971..438ea6c0b497f4939c67e35f4d4046d7346e33e1 100644 --- a/.gitignore +++ b/.gitignore @@ -137,6 +137,7 @@ tests/testAtomic tests/testRandom tests/testRandomSpacing tests/testRandomPoisson +tests/testRandomCone tests/testThreadpool tests/testParser tests/testFeedback @@ -273,6 +274,9 @@ src/equation_of_state/planetary/*.txt *.out *.toc +## Figures +*.svg + ## Intermediate documents: *.dvi *-converted-to.* diff --git a/AUTHORS b/AUTHORS index 07c7dd91c9f2b3ddcfcd517b4f4c08c6fad8d0c1..5520d77633752e7ea863766984e516a67cef5a87 100644 --- a/AUTHORS +++ b/AUTHORS @@ -24,4 +24,5 @@ Evgenii Chaikin chaikin@strw.leidenuniv.nl Sylvia Ploeckinger ploeckinger@lorentz.leidenuniv.nl Willem Elbers willem.h.elbers@durham.ac.uk TK Chan chantsangkeung@gmail.com -Marcel van Daalen daalen@strw.leidenuniv.nl \ No newline at end of file +Marcel van Daalen daalen@strw.leidenuniv.nl +Filip Husko filip.husko@durham.ac.uk \ No newline at end of file diff --git a/configure.ac b/configure.ac index 0ac203db41a45b22058256623da164fdb4199797..cc160a936ae0c3a3d128dc47b5eecc9d037e8759 100644 --- a/configure.ac +++ b/configure.ac @@ -1708,7 +1708,7 @@ AC_SUBST([SUNDIALS_INCS]) # As an example for this, see the call to AC_ARG_WITH for cooling. AC_ARG_WITH([subgrid], [AS_HELP_STRING([--with-subgrid=<subgrid>], - [Master switch for subgrid methods. Inexperienced user should start here. Options are: @<:@none, GEAR, QLA, QLA-EAGLE, EAGLE, EAGLE-XL default: none@:>@] + [Master switch for subgrid methods. Inexperienced user should start here. Options are: @<:@none, GEAR, QLA, QLA-EAGLE, EAGLE, EAGLE-XL, SPIN_JET_EAGLE default: none@:>@] )], [with_subgrid="$withval"], [with_subgrid=none] @@ -1795,6 +1795,19 @@ case "$with_subgrid" in with_subgrid_extra_io=none enable_fof=yes ;; + SPIN_JET_EAGLE) + with_subgrid_cooling=EAGLE + with_subgrid_chemistry=EAGLE + with_subgrid_tracers=EAGLE + with_subgrid_entropy_floor=EAGLE + with_subgrid_stars=EAGLE + with_subgrid_star_formation=EAGLE + with_subgrid_feedback=EAGLE + with_subgrid_black_holes=SPIN_JET + with_subgrid_sink=none + with_subgrid_extra_io=none + enable_fof=yes + ;; *) AC_MSG_ERROR([Unknown subgrid choice: $with_subgrid]) ;; @@ -2463,6 +2476,10 @@ case "$with_black_holes" in EAGLE) AC_DEFINE([BLACK_HOLES_EAGLE], [1], [EAGLE black hole model]) ;; + SPIN_JET) + AC_DEFINE([BLACK_HOLES_SPIN_JET], [1], [Spin and jet black hole model]) + with_black_holes="SPIN_JETS (Husko+22)" + ;; *) AC_MSG_ERROR([Unknown black-hole model: $with_black_holes]) ;; diff --git a/doc/RTD/source/SubgridModels/AGNSpinJets/index.rst b/doc/RTD/source/SubgridModels/AGNSpinJets/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..d7c83ca5117f8be7a663a7e34eaf6167e0101a11 --- /dev/null +++ b/doc/RTD/source/SubgridModels/AGNSpinJets/index.rst @@ -0,0 +1,46 @@ +.. AGN spin and jet model + Filip Husko, 1 April 2022 + +.. AGN_spin_jet: + +AGN jets and black hole spin in hydrodynamical simulations +========================================================== + +Model summary +------------- + + +The main feature of this model, in terms of the effects on galaxy populations, is the addition of an AGN jet +mode of feedback. In order to launch realistic jets, black hole spin is tracked and evolved for all BH +particles in the simulation. + +Jet powers, in addition to depending on spin, also depend on which accretion state the black hole is in. We +include three accretion states: the thick, thin and slim disk. The thick disk appears at low accretion rates, +has very strong jets and is inefficient at spinning up the black hole. The thin disk, appearing at +intermediate accretion rates, has weak jets, strong radiation and efficiently spins up the black hole. The +slim disk, corresponding to super-Eddington accretion, has features of both, and has both strong radiation and +jets. Slim disks can be turned off in the model, but the thick and thin disks are intimitely tied to their +feedback modes (jets and radiation, respectively). + +In ``theory.rst`` we outline all of the theory which is implemented as part of the model. This includes when +the black holes transition from one state to another, the strength of feedback in each state, how spin is +evolved in terms of magnitude and direction, etc. In ``numerics.rst`` we discuss how jet launching is +implemented, and additional black hole time steps introduced into the code. In ``params.rst`` we list and +discuss all parameters used by the model. In ``output.rst`` we list additional arrays output for the BHs and +tracers. Below we outline how to configure and run the model. + +Compiling and running the model +------------------------------- + +The model can be run with either the EAGLE or COLIBRE models. You can configure the model with ``--with-black-holes=SPIN_JET`` in combination with other configure options, or you can configure the full EAGLE or COLIBRE models with the new spin/jet physics as ``--with-subgrid=SPIN_JET_EAGLE`` and ``--with-subgrid=SPIN_JET_COLIBRE``, respectively. The model will then run as long as ``--black-holes`` is among the runtime options. + +For cosmological simulations you do not need to do anything special, but for isolated runs (or any runs with black holes in the initial conditions), the ICs must include two new fields for all black holes: a scalar field representing black hole spins called ``Spins`` and a vector field representing the directions of the spin called ``AngularMomentumDirections``. The former should be between 0 and 1, while the latter should be normalized to 1. + +A full list of all relevant parameters of the model is in ``params.rst``. We also briefly describe the most important parameters which need to be set to run the model, as well as how to run it in different configurations. + +.. toctree:: + + theory + numerics + params + output diff --git a/doc/RTD/source/SubgridModels/AGNSpinJets/numerics.rst b/doc/RTD/source/SubgridModels/AGNSpinJets/numerics.rst new file mode 100644 index 0000000000000000000000000000000000000000..6d37b8aec2510b37a40629f4eb12ff61609e586f --- /dev/null +++ b/doc/RTD/source/SubgridModels/AGNSpinJets/numerics.rst @@ -0,0 +1,31 @@ +.. AGN spin and jet model + Filip Husko, 1 April 2022 + +.. AGN_spin_jet: + +Jet launching algorithm +----------------------- + +In order to launch jets, we introduce a jet reservoir that functions identically to the thermal reservoir used in EAGLE and COLIBRE. When the jet reservoir exceeds the value :math:`N_\mathrm{j}\overline{m}_\mathrm{ngb}v_\mathrm{j}^2/2`, kicks are given out to :math:`N_\mathrm{j}` particles. Here, :math:`N_\mathrm{j}` is the target number of particles to kick per each kicking event (typically equal to 2, but should always be a multiple of 2 to ensure approximately symmetrical jets). :math:`\overline{m}_\mathrm{ngb}v_\mathrm{j}^2/2` is the average kinetic energy of one kicking event, with :math:`\overline{m}_\mathrm{ngb}` the mean neighbour mass of gas particles in the BH smoothing kernel and :math:`v_\mathrm{j}` the target kicking velocity. + +These kicks are handed out to particles in a symmetric way with respect to the spin vector of the BH. :math:`N_\mathrm{j}/2` particles are kicked from the 'upper' hemisphere relative to the spin vector, and the other half from the lower hemisphere. The particles to be kicked can be any in the smoothing kernel. We include four different choices: the particles kicked are: 1) the closest to the BH, 2) the farthest from the BH, 3) the ones of minimal density and 4) the ones closest to the spin axis, in terms of angular distance. Note that these sortings are done for each hemisphere seperately. + +The particles chosen are always given velocities based on the same algorithm, regardless of their positions in the kernel. We perform the actual kicks in the following way. Velocity kicks are chosen at random from a cone around the current spin vector with a (half-)opening angle of :math:`\theta_\mathrm{j}`. In particular, we first choose the kick vector around the z-axis as :math:`\vec{v}_\mathrm{kick}=(\sin\theta\cos\phi,\hspace{0.3mm}\sin\theta\sin\phi,\hspace{0.3mm}\cos \theta)`. Here, :math:`\cos\theta` is chosen uniformly from the interval :math:`[\cos\theta_\mathrm{j},1]`, and :math:`\sin\theta=\sqrt{1-\cos\theta^2}`. :math:`\phi` is chosen uniformly from :math:`[0,2\pi]`. This random vector, now representing a random kick within a cone around the z-axis, is rotated into the frame of the spin vector so that the cone is pointing in the right direction. For particles being kicked from the 'negative' side of the BH hemisphere, the final kick vector is simply multiplied by :math:`-1`. + +We then add the kick vector to the particle's current velocity. We do this in a way that conserves energy, so that the magnitude of the final velocity is computed from + +.. math:: + \frac{1}{2}m_\mathrm{gas}\vec{v}_\mathrm{fin}^2=\frac{1}{2}m_\mathrm{gas}\vec{v}_\mathrm{0}^2 + \frac{1}{2}m_\mathrm{gas}\vec{v}_\mathrm{kick}^2, + +while its direction is computed from conservation of momentum: + +.. math:: + m_\mathrm{gas}\vec{v}_\mathrm{fin}=m_\mathrm{gas}\vec{v}_\mathrm{0} + m_\mathrm{gas}\vec{v}_\mathrm{kick}. + +Black hole time steps +--------------------- + +Black holes will generally have time steps based on their gravitational interactions, but also based on their current accretion rate and the expected time interval until which the thermal feedback reservoir (representing radiative feedback) will have grown enough to heat 1 particle. We introduce a similar time step, but based on when the jet reservoir grows enough to kick :math:`N_\mathrm{j}` particles. We then take the minimum of those two. + +On top of that, we add a time step that makes sure the BH spin doesn't get evolved too much over one time step. Its magnitude is actually not a problem, since the growth of the spin magnitude is always tied with the growth of mass. However, the direction is more problematic (especially in the thin disk case, where alignment can occur very quickly, with little mass or spin growth, due to large warp radii). For this reason, we make sure that the amount of warp angular momentum interacting with the BH over the next time-step, :math:`\Delta_J=(J_\mathrm{warp}/M_\mathrm{warp})\Delta M`, is a small fraction of the current BH angular momentum :math:`J_\mathrm{BH}` (e.g. :math:`0.01`). + diff --git a/doc/RTD/source/SubgridModels/AGNSpinJets/output.rst b/doc/RTD/source/SubgridModels/AGNSpinJets/output.rst new file mode 100644 index 0000000000000000000000000000000000000000..fe03f042cf3aafcb71e3fe6142dd9b9ce4f1b5d7 --- /dev/null +++ b/doc/RTD/source/SubgridModels/AGNSpinJets/output.rst @@ -0,0 +1,88 @@ +.. AGN spin and jet model + Filip Husko, 1 April 2022 + +.. AGN_spin_jet: + +Black holes +----------- + + ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| Name | Description | Units | Comments | ++=======================================+=====================================+===========+=============================+ +| ``AngularMomentumDirections`` | | The direction of the angular | [-] | | Array of length | +| | | momentum (spin) vector of the BH | | | 3 for each particle | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``AccretionDiscAspectRatios`` | | Aspect ratio, H/R, of the subgrid | [-] | | +| | | accretion disk surrounding each | | | +| | | black hole | | | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``AccretionModes`` | | Type of subgrid accretion disk | [-] | | +| | | surrounding the black holes | | | +| | | 0 - Thick disk, 1 - Thin disk, | | | +| | | 2 - Slim disk | | | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``CosAccretionDiskAngle`` | | Cosine of the angle between the | [-] | | +| | | spin vector and the gas angular | | | +| | | momentum vector around the BH | | | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``InjectedJetEnergies`` | | Total jet energy injected into | [U_M U_L | | +| | | surroundings of this BH | ^2 U_t^-2]| | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``JetEfficiencies`` | | The efficiency of jet launching, | [-] | | +| | | i.e. the jet power divided by the | | | +| | | accretion rate times c*c | | | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``JetReservoirs`` | | The remaining jet energy left to | [U_M U_L | | +| | | be launched from the BH | ^2 U_t^-2]| | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``JetTimeSteps`` | | Jet-limited time steps of the BHs | [U_t] | | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``LastAGNJetScaleFactors`` | | Last AGN jet scale factors when | [-] | | +| | | the BH did jet feedback, if | | | +| | | cosmology is turned on | | | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``LastAGNJetTimes`` | | Last AGN jet times when the BH | [U_t] | | +| | | did jet feedback, if cosmology is | | | +| | | turned off | | | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``NumberOfAGNJetEvents`` | | Total number of times this BH did | [-] | | +| | | jet feedback | | | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``NumberOfJetParticlesLaunched`` | | Total number of times this BH | [-] | | +| | | launched particles as part of jet | | | +| | | feedback | | | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``Spins`` | | Dimensionless spin parameters of | [-] | | +| | | the black holes. Negative values | | | +| | | indicate retrograde accretion | | | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``RadiativeEfficiencies`` | | The efficiency of radiative | [-] | | +| | | feedback, i.e. the radiative | | | +| | | power divided by the accretion | | | +| | | rate times c*c | | | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ + + +Tracers (gas and stars) +----------------------- + ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| Name | Description | Units | Comments | ++=======================================+=====================================+===========+=============================+ +| ``EnergiesReceivedFromJetFeedback`` | | The total energy this particle | [U_M U_L | | +| | | has received by being kicked as | ^2 U_t^-2]| | +| | | part of jet feedback | | | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``LastAGNJetFeedbackScaleFactors`` | | Scale factor when the particle | [-] | | +| | | was last kicked as part of jet | | | +| | | feedback, if with cosmology | | | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``LastAGNJetFeedbackTimes`` | | Times when the particle was last | [U_t] | | +| | | last kicked as part of jet | | | +| | | feedback, if without cosmology | | | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ +| ``KickedByJetFeedback`` | | How many times this particle has | [-] | | +| | | been kicked as | | | +| | | part of jet feedback | | | ++---------------------------------------+-------------------------------------+-----------+-----------------------------+ diff --git a/doc/RTD/source/SubgridModels/AGNSpinJets/params.rst b/doc/RTD/source/SubgridModels/AGNSpinJets/params.rst new file mode 100644 index 0000000000000000000000000000000000000000..a812a6346b5e8148d4933a3f9bae77adf5f125d0 --- /dev/null +++ b/doc/RTD/source/SubgridModels/AGNSpinJets/params.rst @@ -0,0 +1,80 @@ +.. AGN spin and jet model + Filip Husko, 1 April 2022 + +.. AGN_spin_jet: + +Model parameters +---------------- + +Below we give an example of parameter choices applicable for e.g. a 50 Mpc box. The new parameters are from ``include_jets`` and below. Their descriptions are given next to the parameters. + +.. code:: YAML + + SPINJETAGN: + subgrid_seed_mass_Msun: 1e5 # Black hole subgrid mass at creation time in solar masses. + use_subgrid_mass_from_ics: 1 # (Optional) Use subgrid masses specified in ICs [1, default], or initialise them to particle masses [0]? + with_subgrid_mass_check: 1 # (Optional) Verify that initial black hole subgrid masses are positive [1, default]. Only used if use_subgrid_mass_from_ics is 1. + use_multi_phase_bondi: 0 # Compute Bondi rates per neighbour particle [1] or for the smoothed ambient gas around the black hole [0]? + use_subgrid_gas_properties: 1 # Use subgrid density [1] or dynamical density [0] to calculate BH accretion rates? + use_krumholz: 1 # Use Krumholz et al. (2006) [1] or standard Bondi-Hoyle-Lyttleton formula [0] for black hole accretion rates? Only used if multi_phase_bondi is 0. + with_krumholz_vorticity: 0 # Include the vorticity term in Krumholz et al. formula? Only used if use_multi_phase_bondi is 0. + with_angmom_limiter: 0 # Are we applying the Rosas-Guevara (2015) viscous time-scale reduction term? + viscous_alpha: 1e6 # Normalisation constant of the viscous time-scale in the accretion reduction term. Only used if with_angmom_limiter is 1. + with_boost_factor: 0 # Are we using the model from Booth, Schaye (2009)? + boost_alpha: 1. # Lowest value for the accretion effeciency for the Booth, Schaye 2009 accretion model. + boost_beta: 2. # Slope of the power law for the Booth, Schaye 2009 model, set beta to zero for constant alpha models. + boost_n_h_star_cm3: 0.1 # Normalization of the power law for the Booth Schaye 2009 model in cgs (cm^-3). + eddington_fraction_for_recording: 0.1 # Record the last time BHs reached an Eddington ratio above this threshold. + use_nibbling: 1 # Continuously transfer small amounts of mass from all gas neighbours to a black hole [1] or stochastically swallow whole gas particles [0]? + min_gas_mass_for_nibbling_Msun: 9e5 # Minimum mass for a gas particle to be nibbled from [M_Sun]. Only used if use_nibbling is 1. + coupling_efficiency: 0.15 # Fraction of the radiated energy that couples to the gas in feedback events. + AGN_delta_T_K: 1e8 # Change in temperature to apply to the gas particle in an AGN feedback event in Kelvin. + AGN_num_ngb_to_heat: 1. # Target number of gas neighbours to heat in an AGN feedback event. + with_potential_correction: 1 # Subtract BH's own contribution to the potential of neighbours when determining repositioning targets. + max_reposition_mass_Msun: 2e8 # Maximal BH mass considered for BH repositioning in solar masses. + max_reposition_distance_ratio: 3.0 # Maximal distance a BH can be repositioned, in units of the softening length. + with_reposition_velocity_threshold: 0 # Should we only reposition to particles that move slowly w.r.t. the black hole? + max_reposition_velocity_ratio: 0.25 # Maximal velocity offset of a particle to reposition a BH to, in units of the ambient sound speed of the BH. Only meaningful if with_reposition_velocity_ratio is 1. + min_reposition_velocity_threshold_km_p_s: -1.0 # Minimal value of the velocity threshold for repositioning [km/s], set to < 0 for no effect. Only meaningful if with_reposition_velocity_ratio is 1. + set_reposition_speed: 0 # Should we reposition black holes with (at most) a prescribed speed towards the potential minimum? + reposition_coefficient_upsilon: 0.001 # Repositioning speed normalisation [km/s/M_sun]. Only meaningful if set_reposition_speed is 1. + reposition_exponent_xi: 1.0 # (Optional) Scaling of repositioning velocity with BH subgrid mass (default: 1.0, linear). Only meaningful if set_reposition_speed is 1. + with_potential_correction: 1 # Should the BH's own contribution to the potential be removed from the neighbour's potentials when looking for repositioning targets. + threshold_major_merger: 0.333 # Mass ratio threshold to consider a BH merger as 'major' + threshold_minor_merger: 0.1 # Mass ratio threshold to consider a BH merger as 'minor' + merger_threshold_type: DynamicalEscapeVelocity # Type of velocity threshold for BH mergers (CircularVelocity as in EAGLE, EscapeVelocity, or DynamicalEscapeVelocity) + merger_max_distance_ratio: 3.0 # Maximal distance over which two BHs can merge, in units of the softening length. + AGN_use_deterministic_feedback: 1 # Deterministic (1) or stochastic (0) AGN feedback model + AGN_feedback_model: Isotropic # AGN feedback model (Isotropic or MinimumDistance) + minimum_timestep_yr: 1000.0 # Minimum time-step of black-hole particles + max_eddington_fraction: 1. # Maximal allowed accretion rate in units of the Eddington rate. + include_jets: 1 # Global switch whether to include jet feedback [1] or not [0]. + turn_off_radiative_feedback: 0 # Global switch whether to turn off radiative (thermal) feedback [1] or not [0]. This should only be used if 'include_jets' is set to 1, since we want feedback in some form or another. + alpha_acc: 0.2 # Viscous alpha of the subgrid accretion disks. Likely to be within the 0.1-0.3 range. The main effect is that it sets the transition accretion rate between thin and thick disk, as dot(m) = 0.1 * alpha^2 + 0.035 * alpha. + AGN_jet_velocity_model: BlackHoleMass # How AGN jet velocities are calculated. If 'Constant', a single value is used. If 'BlackHoleMass', then an empirical relation between halo mass and black hole mass is used to calculate jet velocities. 'HaloMass' is currently not supported. + v_jet_km_p_s: 10000. # Jet velocity to use if 'AGN_jet_velocity_model' is 'Constant'. Units are km/s. + v_jet_cs_ratio: 10. # This sets the jet velocity to v_jet_cs_ratio times the sound speed of the hot gas of the parent halo the black hole is in. This is used if 'AGN_jet_velocity_model' is 'BlackHoleMass'. + v_jet_BH_mass_scaling_reference_mass_Msun: 3.4e3 # The reference mass used in the relation between halo mass and BH mass used to calculate jet velocities. Only used if 'AGN_jet_velocity_model' is 'BlackHoleMass'. + v_jet_BH_mass_scaling_slope: 0.65 # The slope of the relation between halo mass and BH mass used to calculate jet velocities. Only used if 'AGN_jet_velocity_model' is 'BlackHoleMass'. + opening_angle_in_degrees: 7.5 # The half-opening angle of the jet in degrees. Should use values < 15 unless for tests. + N_jet: 2 # Target number of particles to kick as part of a single jet feedback event. Should be a multiple of 2 to ensure approximate momentum conservation (we always kick particles in pairs, one from each 'side' of the BH, relative to the spin vector). + AGN_jet_feedback_model: SpinAxis # Which particles to kick from the black hole smoothing kernels. Should be 'SpinAxis', 'MinimumDistance', 'MaximumDistance' or 'MinimumDensity' + eps_f_jet: 1. # Coupling efficiency for jet feedback. No reason to expect this to be less than 1. + fix_jet_efficiency: 0 # Global switch whether to fix jet efficiency to a particular value [1], or use a spin-dependant formula [0]. If used, jets will be launched exclusively along the z axis. Should be set to 1 only for tests. + jet_efficiency: 0.1 # The constant jet efficiency used if 'fix_jet_efficiency' is set to 1. + fix_radiative_efficiency: 0 # Global switch whether to fix the radiative efficiency to a particular value [1], or use a spin-dependant formula [0]. + radiative_efficiency: 0.1 # The constant jet efficiency used if 'fix_radiative_efficiency' is set to 1. Otherwise, this value is used to define the Eddington accretion rate. + TD_region: B # How to treat the subgrid accretion disk if it is thin, according to the Shakura & Sunyaev (1973) model. If set to B, region b will be used. If set to C, region c will be used. + include_GRMHD_spindown: 1 # Whether to include high jet spindown rates from GRMHD simulations [1], or use an analytical formula that assumes extraction of energy from the rotational mass/energy of the BH. + include_ADIOS_suppression: 1 # Whether to suppress the accretion rate in the fully thick disc regime [1] (Eddington rate below 0.2alpha^2) by the amount expected to be taken away by isotropic kinetic disk winds. + ADIOS_R_in: 30. # If include_ADIOS_accr_suppression is set to 1, this parameter controls the inner radius within which winds are not important. + ADIOS_s: 0.4 # Slope of the accretion rate - radius relationship if include_ADIOS_accr_suppression is set to 1. + turn_off_secondary_feedback: 1 # If set to 1, there will be only radiative (thermal) feedback in the thin disk mode, and only jets in the thick disk mode. + jet_h_r_slope: 1. # The slope of the dependence of jet efficiency on aspect ratio of the subgrid accretion disk, H/R. Default value is 1, and another reasonable value is 0 (same jet efficiency for all disks). Reality could be anything in between. + delta_ADAF: 0.2 # Electron heating parameter, which controls the strength of radiative feedback in thick disks. Should be between 0.1 and 0.5. This parameter is only used if turn_off_secondary_feedback is set to 0. + include_slim_disk: 0 # Global switch whether to include super-Eddington accretion, modeled as the slim disk. If set to 0, disks will be considered thin even at very large accretion rates. + TD_SD_eps_r_threshold: 0.75 # Parameter controlling the transition from thin to slim disk. Accretion disk will be slim if radiative efficiency satisfies eps_slim < TD_SD_eps_r_threshold * eps_thin. This parameter is only used if include_slim_disk is set to 1. + +Most of these parameters should work well generally, and should not be changed except for tests. We will discuss only some of the more important ones. You can choose whether to have only the thick and thin disk (low and high BH accretion rates, respectively), or you can also include the slim disk at super-Eddington rates with ``include_slim_disk``. You can control what type of feedback you (do not) want with ``include_jets`` and ``turn_off_radiative_feedback``. If you choose to turn off jets, everything will be modeled as a thin disk (regardless of accretion rate), since jets go hand-in-hand with the thick and the slim disk. Similarly, if you turn off radiation, everything will be treated as a thick disk. + +If you set ``use_var_v_jet: 0``, you will need to change ``v_jet``, the kicking velocity of particles, depending on what system you are simulating. You should typically choose values at least 10 times larger than the sound speed of the hot gas in your most massive haloes (e.g. 1500 km/s for a MW-type galaxy and 10 000 km/s for a :math:`10^{14}` :math:`\mathrm{M}_\odot` halo). If, on the other hand, you set ``use_var_v_jet: 1``, the launching velocities will vary on their own depending on the typical sound speed (virial velocity) of the hot gas in the haloes. You then need to set ``v_jet_cs_ratio`` to values :math:`\gg1` (10-30 works well) in order to have significant shocking. diff --git a/doc/RTD/source/SubgridModels/AGNSpinJets/plots.py b/doc/RTD/source/SubgridModels/AGNSpinJets/plots.py new file mode 100644 index 0000000000000000000000000000000000000000..c16a46651c32a9fd9c358b26813017c5c3e33dd3 --- /dev/null +++ b/doc/RTD/source/SubgridModels/AGNSpinJets/plots.py @@ -0,0 +1,834 @@ +import os + +if ( + os.path.exists("efficiencies.svg") + and os.path.exists("modes.svg") + and os.path.exists("spec_ang_mom.svg") + and os.path.exists("spinup.svg") +): + # no need to rerun script + exit() + +import numpy as np +from scipy.optimize import fsolve + + +def Z1(x): + return 1 + (1 - x ** 2) ** 0.3333 * ( + (1 + np.absolute(x)) ** 0.3333 + (1 - np.absolute(x)) ** 0.3333 + ) + + +def Z2(x): + return np.sqrt(3 * x ** 2 + Z1(x) ** 2) + + +def r_hor(x): + return 1 + np.sqrt(1 - x ** 2) + + +def r_isco(x): + return 3 + Z2(x) - np.sign(x) * np.sqrt((3 - Z1(x)) * (3 + Z1(x) + 2 * Z2(x))) + + +def eps_NT(x): + return 1 - np.sqrt(1 - 2 / 3 * 1 / r_isco(x)) + + +def eff_sd(m, a, limit): + return limit - ( + 1 + / 10 + * 1 + / m + * ( + 0.985 / ((4.627 - 4.445 * a) ** -0.5524 + 1.6 * 1 / m) + + 0.015 / ((827.3 - 718.1 * a) ** -0.706 + 1.6 * 1 / m) + ) + * (0.9663 - 0.9292 * a) ** -0.5693 + ) / (1 - np.sqrt(1 - 2 / (3 * r_isco(a)))) + + +def find_root(a, limit): + return fsolve(eff_sd, x0=1, args=(a, limit))[0] + + +def A(x): + return (0.9663 - 0.9292 * x) ** -0.5693 + + +def B(x): + return (4.627 - 4.445 * x) ** -0.5524 + + +def C(x): + return (827.3 - 718.1 * x) ** -0.706 + + +def m_dot_crit1(x, limit): + C1 = C(x) / B(x) + eps_1 = 16 * limit / (0.985 * A(x)) * eps_NT(x) + N1 = 0.015 / 0.985 + res1 = ( + 1.6 + / B(x) + * 1 + / (2 * C1 * eps_1) + * ( + np.sqrt( + (C1 * (1 - eps_1) + N1 - eps_1) ** 2 + 4 * eps_1 * C1 * (N1 - eps_1 + 1) + ) + + C1 * (1 - eps_1) + + N1 + - eps_1 + ) + ) + return res1 + + +def m_dot_crit2(x, limit): + C1 = C(x) / B(x) + eps_1 = 16 * limit / (0.985 * A(x)) * eps_NT(x) + N1 = 0.015 / 0.985 + res1 = ( + 1.6 + / B(x) + * 1 + / (2 * C1 * eps_1) + * ( + -1 + * np.sqrt( + (C1 * (1 - eps_1) + N1 - eps_1) ** 2 + 4 * eps_1 * C1 * (N1 - eps_1 + 1) + ) + + C1 * (eps_1 - 1) + + N1 + - eps_1 + ) + ) + return res1 + + +def beta(alfa): + return 1 / (1 + 2 * alfa) + + +def gamma(alpha): + return (8 - 3 * beta(alpha)) / (6 - 3 * beta(alpha)) + + +def t1(alpha): + return -0.2703 * gamma(alpha) + 1.3603 + + +def t2(alpha): + return -0.94 + 4.475 * (gamma(alpha) - 1.444) - 5.1402 * (gamma(alpha) - 1.444) ** 2 + + +def t3(alpha): + return -0.84 * np.log10(alpha) - 0.919 + 0.643 * np.exp(-0.209 / alpha) + + +def t4(x): + return (0.6365 * r_isco(x) - 0.4828) * (1 + 11.9 * np.exp(-0.838 * r_isco(x) ** 4)) + + +def t5(x): + return 1.444 * np.exp(-1.01 * r_isco(x) ** 0.86) + 0.1 + + +def T(x, alpha): + return ( + 0.31 + * (1 + (t4(x) / r_hor(x)) ** 0.9) ** (t2(alpha) + t3(alpha)) + * 1 + / (r_hor(x) - t5(x)) ** (t1(alpha)) + ) + + +def eta(x, alpha): + return 1 + gamma(alpha) / (gamma(alpha) - 1) * T(x, alpha) + + +def f1(x): + return 0.0871 * r_isco(x) - 0.1082 + + +def f2(alpha): + return 0.5 - 7.798 * (gamma(alpha) - 1.333) ** 1.26 + + +def f3(x): + return 0.153 * (r_isco(x) - 0.6) ** 0.3 + 0.105 + + +def f4(x, alpha): + return ( + f3(x) + * (0.9 * gamma(alpha) - 0.2996) + * (1.202 - 0.08 * (np.log10(alpha) + 2.5) ** 2.6) + ) + + +def f5(alpha): + return -1.8 * gamma(alpha) + 4.299 - 0.018 + 0.018 * (np.log10(alpha) + 2) ** 3.571 + + +def f6(x, alpha): + return ( + f4(x, alpha) + * (((0.14 * np.log10(r_hor(x) ** f5(alpha)) + 0.23) / f4(x, alpha)) ** 10 + 1) + ** 0.1 + ) + + +def L_adv(x, alpha): + return ( + f2(alpha) + + (f1(x) + 10 ** f6(x, alpha)) * (1.15 - 0.03 * (np.log10(alpha) + 3) ** 2.37) + ) / eta(x, alpha) + + +a = np.arange(-1, 1, 0.0001) +mdotcrit1 = m_dot_crit1(a, 0.5) +mdotcrit2 = m_dot_crit2(a, 0.5) +m_a_90 = [find_root(x, 0.9) for x in a] +m_a_75 = [find_root(x, 0.75) for x in a] +m_a_50 = [find_root(x, 0.5) for x in a] + +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import matplotlib.gridspec as gridspec + +fig = plt.figure(figsize=(8, 6)) + +plt.style.use("classic") +plt.fill_between(a, [0.0001 for x in a], [0.028 for x in a], color="blue", alpha=0.2) +plt.fill_between(a, [0.028 for x in a], mdotcrit1, color="red", alpha=0.2) +plt.fill_between(a, mdotcrit1, [375 for x in a], color="orange", alpha=0.2) +plt.ylabel("$\dot{m}$", fontsize=24, usetex=True) +plt.xlabel("$a$", fontsize=24, usetex=True) +plt.tick_params(axis="y", right=True, direction="in") +plt.yscale("log") +plt.axis([-1, 1, 0.001, 100]) +plt.text(-0.22, 0.004, "Thick disc", fontsize=20) +plt.text(-0.2, 0.33, "Thin disc", fontsize=20) +plt.text(-0.2, 18, "Slim disc", fontsize=20) +plt.minorticks_on() +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) + +plt.savefig("modes.svg", bbox_inches="tight") +plt.close() + +phi = -20.2 * a ** 3 - 14.9 * a ** 2 + 34.0 * a + 52.6 +horizon_ang_vel = a / (2 * (1 + np.sqrt(1 - a ** 2))) +jet_factor = ( + 0.05 + / (4.0 * np.pi) + * 1 + / 0.3 + * phi ** 2 + * horizon_ang_vel ** 2 + * (1.0 + 1.38 * horizon_ang_vel ** 2 - 9.2 * horizon_ang_vel ** 4) +) +Z1_j = np.array( + [ + 1 + (1 - x ** 2) ** 0.333 * ((1 + abs(x)) ** 0.333 + (1 - abs(x)) ** 0.333) + for x in a + ] +) +Z2_j = np.array(np.sqrt(3 * a ** 2 + Z1_j ** 2)) +r_iso = 3 + Z2_j - np.sign(np.array(a)) * np.sqrt((3 - Z1_j) * (3 + Z1_j + 2 * Z2_j)) +eps_TD = 1 - np.sqrt(1 - 2 / (3 * r_iso)) +eps_ADAF1 = 0.144 * (6 / r_iso) * eps_TD * min(1, 0.028 / 0.0044) +eps_ADAF2 = 0.144 * (6 / r_iso) * eps_TD * min(1, 0.001 / 0.0044) +Jet_ADAF = jet_factor * 0.3 +Jet_SD = 0.22 * jet_factor +Jet_TD1 = 10 ** -3 * 0.1 ** (-0.1) * 100 ** 0.2 * 10 ** (2 * 0.1) * jet_factor +Jet_TD2 = 10 ** -3 * 0.1 ** (-0.1) * 10 ** (-1 * 0.1) * jet_factor +eps_SD1 = ( + 1 + / 10 + * 1 + / 1 + * ( + 0.985 / ((4.627 - 4.445 * a) ** -0.5524 + 1.6 * 1 / 1) + + 0.015 / ((827.3 - 718.1 * a) ** -0.706 + 1.6 * 1 / 1) + ) + * (0.9663 - 0.9292 * a) ** -0.5693 +) +eps_SD2 = ( + 1 + / 10 + * 1 + / 50 + * ( + 0.985 / ((4.627 - 4.445 * a) ** -0.5524 + 1.6 * 1 / 50) + + 0.015 / ((827.3 - 718.1 * a) ** -0.706 + 1.6 * 1 / 50) + ) + * (0.9663 - 0.9292 * a) ** -0.5693 +) + +mdot_bh_ADAF1 = (1 - Jet_ADAF / 4.447) * (1 - eps_ADAF1 - Jet_ADAF) +mdot_bh_ADAF2 = (1 - Jet_ADAF / 4.447) * (1 - eps_ADAF2 - Jet_ADAF) +mdot_bh_ADAF3 = (1 - Jet_ADAF / 11.56) * (1 - eps_ADAF1 - Jet_ADAF) +mdot_bh_ADAF4 = (1 - Jet_ADAF / 11.56) * (1 - eps_ADAF2 - Jet_ADAF) +mdot_bh_TD1 = (1 - Jet_TD1 / 4.447) * (1 - eps_TD - Jet_TD1) +mdot_bh_TD2 = (1 - Jet_TD2 / 4.447) * (1 - eps_TD - Jet_TD2) + + +fig = plt.figure(figsize=(18, 4)) +fig.subplots_adjust(wspace=0, hspace=0, top=1, bottom=0) +gs = gridspec.GridSpec(1, 3, width_ratios=[1, 1, 1]) +plt.style.use("classic") + +plt.subplot(gs[0]) +plt.plot( + a, + eps_ADAF2, + linewidth=2, + label="$\epsilon_\mathrm{rad}(\dot{m}<0.0044)$", + color="red", +) +plt.plot( + a, + eps_ADAF1, + linewidth=2, + label="$\epsilon_\mathrm{rad}(\dot{m}=0.028)$", + color="red", + linestyle="--", +) +plt.plot(a, 0.97 * Jet_ADAF, linewidth=2, label="$\epsilon_\mathrm{jet}$", color="blue") +plt.fill_between(a, eps_ADAF1, eps_ADAF2, color="red", alpha=0.2) +plt.ylabel("$\epsilon_\mathrm{feedback}$", fontsize=24, usetex=True) +plt.xlabel("$a$", fontsize=24, usetex=True) +plt.tick_params(axis="y", right=True, direction="in") +plt.legend(loc="upper left", prop={"size": 13}) +plt.xticks([-1, -0.5, 0, 0.5, 1], [-1, -0.5, 0, 0.5, 1]) +plt.yticks( + [0.0001, 0.001, 0.01, 0.1, 1, 10, 100], + ["", 10 ** (-3), 10 ** (-2), 10 ** (-1), 10 ** (-0), 10 ** (1), 10 ** (2)], +) +plt.minorticks_on() +plt.axis([-1, 1, 0.0001, 10]) +plt.yscale("log") +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) +plt.title("Thick disc", fontsize=16) + +plt.subplot(gs[1]) +plt.plot(a, 0.97 * eps_TD, linewidth=2, label="$\epsilon_\mathrm{rad}$", color="red") +plt.plot( + a, + Jet_TD2, + linewidth=2, + label="$\epsilon_\mathrm{jet}(\dot{m}=0.028,M_\mathrm{BH}=10^9 \mathrm{M}_\odot)$", + color="blue", +) +plt.plot( + a, + Jet_TD1, + linewidth=2, + label="$\epsilon_\mathrm{jet}(\dot{m}=1,M_\mathrm{BH}=10^6 \mathrm{M}_\odot)$", + color="blue", + linestyle="--", +) +plt.fill_between(a, Jet_TD1, Jet_TD2, color="blue", alpha=0.2) +plt.xlabel("$a$", fontsize=24, usetex=True) +plt.tick_params(axis="y", right=True, direction="in") +plt.yscale("log") +plt.legend(loc="upper left", prop={"size": 13}) +plt.xticks([-1, -0.5, 0, 0.5, 1], ["", -0.5, 0, 0.5, 1]) +plt.axis([-1, 1, 0.0001, 10]) +plt.yticks([0.001, 0.01, 0.1, 1, 10], ["", "", "", "", ""]) +plt.minorticks_on() +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) +plt.title("Thin disc", fontsize=16) + +plt.subplot(gs[2]) +plt.plot( + a, eps_SD1, linewidth=2, label="$\epsilon_\mathrm{rad}(\dot{m}=1)$", color="red" +) +plt.plot( + a, + eps_SD2, + linewidth=2, + label="$\epsilon_\mathrm{rad}(\dot{m}=50)$", + color="red", + linestyle="--", +) +plt.plot(a, Jet_SD, linewidth=2, label="$\epsilon_\mathrm{jet}$", color="blue") +plt.fill_between(a, eps_SD1, eps_SD2, color="red", alpha=0.2) +plt.xlabel("$a$", fontsize=24, usetex=True) +plt.tick_params(axis="y", right=True, direction="in") +plt.yscale("log") +plt.legend(loc="upper left", prop={"size": 13}) +plt.xticks([-1, -0.5, 0, 0.5, 1], ["", -0.5, 0, 0.5, 1]) +plt.axis([-1, 1, 0.0001, 10]) +plt.yticks([0.001, 0.01, 0.1, 1, 10], ["", "", "", "", ""]) +plt.minorticks_on() +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) +plt.title("Slim disc", fontsize=16) + +plt.savefig("efficiencies.svg", bbox_inches="tight") + +L_isco1 = [2 / 3 * 1 / np.sqrt(3) * (1 + 2 * np.sqrt(3 * r_isco(x) - 2)) for x in a] + +plt.style.use("classic") +fig = plt.figure(figsize=(8, 6), linewidth=4) +plt.plot(a, L_isco1, linewidth=2, label="$\ell_\mathrm{ISCO}$", color="red") +plt.plot( + a, + 0.45 * np.array(L_isco1), + linewidth=3, + linestyle="--", + label=r"$0.45\ell_\mathrm{ISCO}$", + color="red", +) +plt.plot( + a, + [L_adv(x, 0.1) for x in a], + linewidth=2, + label=r"$\ell_\mathrm{adv},\alpha=0.1$", + color="green", +) +plt.plot( + a, + [L_adv(x, 0.2) for x in a], + linewidth=2, + label=r"$\ell_\mathrm{adv},\alpha=0.2$", + color="teal", +) +plt.plot( + a, + [L_adv(x, 0.3) for x in a], + linewidth=2, + label=r"$\ell_\mathrm{adv},\alpha=0.3$", + color="purple", +) +plt.ylabel("$\ell_\mathrm{in}$", fontsize=24, usetex=True) +plt.xlabel("$a$", fontsize=24, usetex=True) +plt.tick_params(axis="y", right=True, direction="in") +plt.legend(loc="upper right", prop={"size": 14}) +plt.minorticks_on() +plt.axis([-1, 1, 0, 5]) +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) + +plt.savefig("spec_ang_mom.svg", bbox_inches="tight") +plt.close() + +z1 = np.array( + [ + 1 + (1 - x ** 2) ** 0.333 * ((1 + abs(x)) ** 0.333 + (1 - abs(x)) ** 0.333) + for x in a + ] +) +z2 = np.array(np.sqrt(3 * a ** 2 + z1 ** 2)) +r_iso = 3 + z2 - np.sign(np.array(a)) * np.sqrt((3 - z1) * (3 + z1 + 2 * z2)) + +phi = -20.2 * a ** 3 - 14.9 * a ** 2 + 34.0 * a + 52.6 +horizon_ang_vel = a / (2 * (1 + np.sqrt(1 - a ** 2))) +jet_factor = ( + 0.05 + / (4.0 * np.pi) + * 1 + / 0.3 + * phi ** 2 + * horizon_ang_vel ** 2 + * (1.0 + 1.38 * horizon_ang_vel ** 2 - 9.2 * horizon_ang_vel ** 4) +) + +da_TD_acc_only = 2 / 3 * 1 / np.sqrt(3) * ( + 1 + 2 * np.sqrt(3 * r_iso - 2) +) - 2 * a * np.sqrt(1 - 2 / (3 * r_iso)) +da_TD_Benson = ( + 2 / 3 * 1 / np.sqrt(3) * (1 + 2 * np.sqrt(3 * r_iso - 2)) + - 2 * a * np.sqrt(1 - 2 / (3 * r_iso)) + - (1.25 * 10 ** -3 * 0.1 ** (-0.1) * 100 ** 0.2 * 10 ** (2 * 0.1) * jet_factor) + * 2 + / a + * (np.sqrt(1 - a ** 2)) + * (1 + np.sqrt(1 - a ** 2)) +) +da_ADAF_acc_only = L_adv(a, 0.1) - 2 * a +da_ADAF_Benson = ( + L_adv(a, 0.1) + - 2 * a + - (jet_factor * 0.3) * 2 / a * (np.sqrt(1 - a ** 2)) * (1 + np.sqrt(1 - a ** 2)) +) +eps_SD = ( + 1 + / 10 + * 1 + / 10 + * ( + 0.985 / ((4.627 - 4.445 * a) ** -0.5524 + 1.6 * 1 / 10) + + 0.015 / ((827.3 - 718.1 * a) ** -0.706 + 1.6 * 1 / 10) + ) + * (0.9663 - 0.9292 * a) ** -0.5693 +) +da_SD_acc_only = L_adv(a, 0.1) - 2 * a * (1 - eps_SD) +da_SD_Benson = ( + L_adv(a, 0.1) + - 2 * a * (1 - eps_SD) + - (jet_factor * 0.22) * 2 / a * (np.sqrt(1 - a ** 2)) * (1 + np.sqrt(1 - a ** 2)) +) + + +fig = plt.figure(figsize=(18, 4)) +fig.subplots_adjust(wspace=0, hspace=0, top=1, bottom=0) +gs = gridspec.GridSpec(1, 3, width_ratios=[1, 1, 1]) +plt.style.use("classic") + +plt.subplot(gs[0]) +plt.plot(a, da_TD_acc_only, linewidth=2, label="Accretion only", color="black") +plt.plot(a, da_TD_Benson, linewidth=1.5, label="Jet spindown included", color="blue") +plt.plot(a, [0 for x in a], linewidth=1.5, color="black", linestyle="--") +plt.ylabel("$\mathrm{d}a/\mathrm{d}\ln M_\mathrm{BH,0}$", fontsize=24, usetex=True) +plt.xlabel("$a$", fontsize=24, usetex=True) +plt.tick_params(axis="y", right=True, direction="in") +plt.legend(loc="lower left", prop={"size": 15}) +plt.minorticks_on() +plt.axis([-1, 1, -4, 7]) +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) +plt.title("Thin disc", fontsize=16) + +plt.subplot(gs[1]) +plt.plot(a, da_ADAF_acc_only, linewidth=2, label="Accretion only", color="black") +plt.plot(a, da_ADAF_Benson, linewidth=1.5, label="Jet spindown included", color="blue") +plt.plot(a, [0 for x in a], linewidth=1.5, color="black", linestyle="--") +plt.xlabel("$a$", fontsize=24, usetex=True) +plt.tick_params(axis="y", right=True, direction="in") +plt.xticks([-1.0, -0.5, 0.0, 0.5, 1.0], ["", -0.5, 0.0, 0.5, 1.0]) +plt.yticks([-8, -6, -4, -2, 0, 2, 4, 6, 8], ["", "", "", "", "", "", "", "", ""]) +plt.minorticks_on() +plt.axis([-1, 1, -4, 7]) +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) +plt.title("Thick disc", fontsize=16) + +plt.subplot(gs[2]) +plt.plot(a, da_SD_acc_only, linewidth=2, label="Accretion only", color="black") +plt.plot(a, da_SD_Benson, linewidth=1.5, label="Jet spindown included", color="blue") +plt.plot(a, [0 for x in a], linewidth=1.5, color="black", linestyle="--") +plt.xlabel("$a$", fontsize=24, usetex=True) +plt.tick_params(axis="y", right=True, direction="in") +plt.xticks([-1.0, -0.5, 0.0, 0.5, 1.0], ["", -0.5, 0.0, 0.5, 1.0]) +plt.yticks([-8, -6, -4, -2, 0, 2, 4, 6, 8], ["", "", "", "", "", "", "", "", ""]) +plt.minorticks_on() +plt.axis([-1, 1, -4, 7]) +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=8, + width=1.2, + which="major", + labelsize=16, +) +plt.tick_params( + axis="x", + direction="in", + bottom=True, + top=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) +plt.tick_params( + axis="y", + direction="in", + left=True, + right=True, + length=4, + width=0.9, + which="minor", + labelsize=16, +) +plt.title("Slim disc", fontsize=16) + +plt.savefig("spinup.svg", bbox_inches="tight") diff --git a/doc/RTD/source/SubgridModels/AGNSpinJets/theory.rst b/doc/RTD/source/SubgridModels/AGNSpinJets/theory.rst new file mode 100644 index 0000000000000000000000000000000000000000..d57747b958abb5c0c91d562e442e6e295b43e3c6 --- /dev/null +++ b/doc/RTD/source/SubgridModels/AGNSpinJets/theory.rst @@ -0,0 +1,251 @@ +.. AGN spin and jet model + Filip Husko, 1 April 2022 + +.. AGN_spin_jet: + + +Model summary +------------- + +Here we provide a comprehensive summary of the model. In order to more easily visualize the model, it is recommended to run the python script in order to generate plots that show various aspects of the model. + +Any model for realistic AGN jets must include black hole spin since jet powers depend steeply on spin, and because including spin provides a well-defined direction for the jets to be launched in. The spin (angular momentum) of BHs is best represented through the dimensionlesss spin parameter :math:`a=J_\mathrm{BH}c/M_\mathrm{BH}^2 G`, where :math:`J_\mathrm{BH}` is its angular momentum. For theoretical reasons, its magnitude cannot grow above 1. It can be positive, representing prograde accretion, or negative, representing retrograde accretion. + +Jet powers, in addition to depending on spin, also depend on which accretion state the black hole is in. We refer to these states by the shape of the accretion disk that surrounds the BH. We include three accretion states: the thick (or advection-dominated accretion flow; ADAF), thin (standard) and slim disk. Our main reference points for these disks are the following papers: `Shakura & Sunyaev (1973) <https://ui.adsabs.harvard.edu/abs/1973A%26A....24..337S/abstract>`_, `Narayan & Yi (1994) <https://ui.adsabs.harvard.edu/abs/1994ApJ...428L..13N/abstract>`_ and `Wang & Zhou. (1999) <https://ui.adsabs.harvard.edu/abs/1999ApJ...516..420W/abstract>`_, respectively. + +The thick disk appears at low accretion rates, has very strong jets and is inefficient at spinning up the black hole. The thin disk, appearing at intermediate accretion rates, typically has weak jets, strong radiation and efficiently spins up the black hole. The slim disk, corresponding to super-Eddington accretion, has features of both: in terms of geometry, orbits and angular momentum, it is similar to the thick disk. It is optically thin, leading to strong radiation. However, it also has strong jets. We assume that each subgrid accretion disk launches jets and radiates at the same time, regardless of the type it is. However, we use expressions for the jet and radiative efficiencies that depend on the type of the disk, and which are physically motivated. + +Transitions from one accretion state to another +----------------------------------------------- + +.. figure:: modes.svg + :width: 600px + :align: center + :figclass: align-center + :alt: Accretion regimes + + The type of accretion disk surrounding the BHs depending on their accretion rates and spins. The transition between the thick and thin disk is calculated assuming the viscosity parameter :math:`\alpha=0.2`, while the transition from thin to slim disk is assumed to occur when the latter is :math:`F=0.5` times as radiatively efficienct as the former. + +The state of the subgrid accretion disk depends mostly on the Eddington fraction, i.e. the (dimensionless) accretion rate of the BH in units of the Eddington accretion rate, which we denote as :math:`\dot{m}`. We assume that the subgrid accretion disk is thick for :math:`\dot{m}<0.03`, based on observations (`Russell et al. 2013 <https://ui.adsabs.harvard.edu/abs/2013MNRAS.432..530R/abstract>`_). This also allows us to constrain the value of one of the main parameters in any accretion model: the viscosity parameter :math:`\alpha` (which is related to the kinematic viscosity :math:`\nu`and sound speed :math:`c_\mathrm{s}` through :math:`\nu=\alpha c_\mathrm{s}H`, with :math:`c_\mathrm{s}` the sound speed and :math:`H` the disk half-thickness). Numerical calculations suggest that thick disks are present for :math:`\dot{m}<0.4\alpha^2` (`Yuan & Narayan 2014 <https://ui.adsabs.harvard.edu/abs/2014ARA%26A..52..529Y/abstract>`_), and this agrees with observations if :math:`\alpha=0.25-0.3`. These values agree very well with more direct observational estimates, which suggest :math:`\alpha=0.2-0.3` (`Martin et al. 2019 <https://ui.adsabs.harvard.edu/abs/2014ARA%26A..52..529Y/abstract>`_). + +The transition from the thin to the slim disk should occur around :math:`\dot{m}\approx 1`. However, the exact physics of this transition is not well understood. There is likely some spin dependence of the critical accretion rate, due to different radiative physics depending on spin. One of the main properties of slim disks is that they are less radiatively efficient than thin disks (`Sadowski et al. 2014 <https://ui.adsabs.harvard.edu/abs/2014MNRAS.439..503S/abstract>`_). We thus assume that the transition occurs when the radiative efficiency of a slim disk, :math:`\epsilon_\mathrm{r,SD}`, falls below some fraction of the radiative efficiency of a thin disk, :math:`\epsilon_\mathrm{r,TD}`. We quantify this as :math:`\epsilon_\mathrm{r,SD}<F\epsilon_\mathrm{r,SD}`, with :math:`F\approx 0.5` a free parameter. We give the expressions for both of the efficiencies below. + +Jet efficiencies +---------------- + +The jet efficiency is related to the jet power through :math:`\epsilon_\mathrm{j}=P_\mathrm{j}/\dot{M}_\mathrm{BH,0}c^2`, where :math:`\dot{M}_\mathrm{BH,0}` is the accretion rate measured in the simulation, e.g. the Bondi rate). We use the formula for the jet efficiency based on general-relativistic, magneto-hydrodynamical (GRMHD) simulations by `Tchekhovskoy et al. (2010) <https://ui.adsabs.harvard.edu/abs/2010ApJ...711...50T/abstract>`_: + +.. math:: + \epsilon_\mathrm{j}=\frac{\kappa}{4\pi}\bigg(\frac{H/R}{0.3}\bigg)^\eta \phi_\mathrm{BH}^2\Omega_\mathrm{BH}^2\big(1+1.38\Omega_\mathrm{BH}^2-9.2\Omega_\mathrm{BH}^4\big), + +where :math:`\kappa\approx0.05` is a numerical factor which depends on the initial geometry of the magnetic field, :math:`\phi_\mathrm{BH}` is the dimensionless magnetic flux threading the horizon (see original paper for precise definition), and :math:`\Omega_\mathrm{BH}=a/2r_\mathrm{H}` is the (dimensionless) angular velocity of the black hole event horizon. Here, :math:`r_\mathrm{H}=1+\sqrt{1-a^2}` is the radius of the horizon in units of the gravitational radius :math:`R_\mathrm{G}=M_\mathrm{BH}G/c^2`. The formula above, for the jet efficiency, agrees very well with the results from higher-resolution simulations performed by `Narayan et al. (2021) <https://ui.adsabs.harvard.edu/abs/2010ApJ...711...50T/abstract>`_, who provide the following fit for the magnetic flux as a function of spin: + +.. math:: + \phi_\mathrm{BH}(a)=-20.2a^3-14.9a^2+34a+52.6. + +The `Tchekhovskoy et al. (2010) <https://ui.adsabs.harvard.edu/abs/2010ApJ...711...50T/abstract>`_ jet efficiency depends very steeply on spin (:math:`\epsilon_\mathrm{j}\propto a^2` for small spin and :math:`\epsilon_\mathrm{j}\propto a^6` near :math:`a=1`). It can reach values above 100 per cent for large spins, and is also different (weaker) for negative spins. + +The dependence of the jet efficiency on the type of accretion disk comes through the factor that depends on the aspect ratio :math:`H/R`, since accretion disks differ in this quantity. Theoretical, self-similar models of thick disks suggest :math:`H/R=0.5` (`Narayan & Yi 1995b <https://ui.adsabs.harvard.edu/abs/1995ApJ...452..710N/abstract>`_), but we instead take :math:`H/R=0.3`, more in line with simulations. For slim disks, which have received less attention in simulations, we assume the value :math:`H/R=1/(2\sqrt{5})\approx 0.2` (based on the self-similar model by `Wang & Zhou. 1999 <https://ui.adsabs.harvard.edu/abs/1999ApJ...516..420W/abstract>`_). + +Thin disks are, not surprisingly, much thinner. The value of :math:`H/R` in this regime is not a constant, but rather depends on the BH mass and accretion rate, slightly on radius and also on the viscosity parameter :math:`\alpha`. Thin disks have three different regions in the `Shakura & Sunyaev (1973) <https://ui.adsabs.harvard.edu/abs/1973A%26A....24..337S/abstract>`_ model. For simplicity, we model the whole disk as being represented with only one region. In region a), the innermost one, radiation dominates over gas pressure. It is typically very small or doesn't exist at all, so we disregard it as a possibility. In regions b) and c), gas pressure dominates over radiation pressure. In b), electrons dominate in the opacity, while in c), free-free absorption dominates. We leave both regions as a possibility, and leave the choice as a free parameter in the model (not likely to lead to large differences in galaxy/BH evolution). The expressions for the aspect ratio in these regions are + +.. math:: + \bigg(\frac{H}{R}\bigg)_\mathrm{TD,b} = 1.25\times10^{-3} \alpha^{-1/10}\dot{m}^{1/5}\bigg(\frac{M_\mathrm{BH}}{10^8\hspace{0.5mm}\mathrm{M}_\odot}\bigg)^{-1/10}\bigg(\frac{R}{2R_\mathrm{G}}\bigg)^{1/20} + +in region b) and + +.. math:: + \bigg(\frac{H}{R}\bigg)_\mathrm{TD,c} = 1.15\times10^{-3} \alpha^{-1/10}\dot{m}^{3/20}\bigg(\frac{M_\mathrm{BH}}{10^8\hspace{0.5mm}\mathrm{M}_\odot}\bigg)^{-1/10}\bigg(\frac{R}{2R_\mathrm{G}}\bigg)^{1/8} + +in region c). + +The jet efficiency also depends on the slope :math:`\eta`. Classical jet theory (`Meier 2001 <https://ui.adsabs.harvard.edu/abs/2001Sci...291...84M/abstract>`_) suggests that jet powers depend on the aspect ratio linearly, so :math:`\eta=1`. This is also in line with some simulations finding a reduction in jet efficiencies with the aspect ratio (e.g. `Tchekhovskoy et al. 2014 <https://ui.adsabs.harvard.edu/abs/2014MNRAS.437.2744T/abstract>`_). In this scenario, jets launched from thin disks are of order :math:`\approx100` times less powerful than those launched from thick disks. On the other hand, some simulations of thin disks have found jet efficiencies similar to thick disk ones (e.g. `Liska et al. 2019 <https://ui.adsabs.harvard.edu/abs/2019MNRAS.487..550L/abstract>`_), which is supported by observations of blazars (`Ghisellini et al. 2014 <https://ui.adsabs.harvard.edu/abs/2014Natur.515..376G/abstract>`_). In this picture, thin jets are approximately as efficient as thick disk ones, which can in our case be implemented as :math:`\eta=0`. The reality is likely to be somwhere in between. Note that the choice of :math:`\eta` likely has a strong impact on the evolution of galaxies and BHs; our default choice is the classical picture in which :math:`\eta=1`. + +.. figure:: efficiencies.svg + :width: 1200px + :align: center + :figclass: align-center + :alt: Efficiencies + + Feedback efficiencies (jet - blue, radiation - red) for all three accretion disk types. Shaded regions represent likely ranges of efficiencies (where the efficiencies depend on mass and/or accretion rate). The thin disk jet efficiencies were computed assuming the slope of the efficiency vs. aspect ratio relation is :math:`\eta=1`, and the aspect ratios were computed for region b) of the Shakura & Sunyaev solution. Radiative efficiencies in the thick disk were computed assuming the electron heating parameter :math:`\delta=0.2`. + +Radiative efficiencies +---------------------- + +In the EAGLE and COLIBRE models, all subgrid accretion disks are effectively thin, and the BH is always assumed to be in this regime. In our model, the radiative efficiency (defined in an analagous way to the jet efficiency, but using the luminosity) is no longer fixed at a value of order :math:`10` per cent. Instead, we use spin-dependant formulas that vary with the type of disk. In the thin disk, the radiative efficiency :math:`\epsilon_\mathrm{r,TD}` is related to the binding energy at the innermost stable circular orbit (ISCO) and is given by + +.. math:: + \epsilon_\mathrm{r,TD}(a) = 1-e_\mathrm{ISCO}(a)=1-\sqrt{1-\frac{2}{3r_\mathrm{ISCO}(a)}}. + +Here, :math:`r_\mathrm{ISCO}` is the radius of the ISCO in gravitational radii (see e.g. appendix B of `Fiacconi et al. 2018 <https://ui.adsabs.harvard.edu/abs/2018MNRAS.477.3807F/abstract>`_ for an expression giving the spin dependence). The radiative efficiency of the thin disk grows slowly from its minimum value of :math:`\approx4` per cent for :math:`a=-1` to :math:`\approx5.5` per cent for :math:`a=0`. For positive spins it grows more steeply; it is :math:`10` per cent by :math:`a=0.65`. Beyond that the dependence steepens even further, with values of :math:`20`, :math:`30` and :math:`40` per cent reached at :math:`a=0.95`, :math:`a=0.997` and :math:`a=1`, respectively. + +In the thick disk regime, radiative efficiencies are lower by a factor :math:`\approx100` than jet efficiencies. The formulas we use are based on results by `Mahadevan (1997) <https://ui.adsabs.harvard.edu/abs/1997ApJ...477..585M/abstract>`_, who studied cooling processes of electrons (which dominate in the radiation) in the context of the original thick disc solution. They found two different regimes: for :math:`\dot{m}<\dot{m}_\mathrm{crit,visc}`, viscous heating dominates the heating of electrons, whereas for :math:`\dot{m}_\mathrm{crit,visc}<\dot{m}<\dot{m}_\mathrm{crit,ADAF}`, it is dominated by ion-electron heating. Here, :math:`\dot{m}_\mathrm{crit,visc}` is the transitional value between the two thick disc (ADAF) regimes, and :math:`\dot{m}_\mathrm{crit,ADAF}=0.4\alpha^2` is the transitional accretion rate which separates thin and thick discs. The radiative efficiency in the viscous heating regime is given by + +.. math:: + \epsilon_\mathrm{r,ADAF}=0.0002\epsilon_\mathrm{r,TD}\bigg(\frac{\delta_\mathrm{ADAF}}{0.0005}\bigg)\bigg(\frac{1-\beta}{0.5}\bigg)\bigg(\frac{6}{r_\mathrm{ISCO}}\bigg), + +while in the ion-heating regime it is given by + +.. math:: + \epsilon_\mathrm{r,ADAF}=0.2\epsilon_\mathrm{r,TD}\bigg(\frac{\dot{m}}{\alpha^2}\bigg)\bigg(\frac{\beta}{0.5}\bigg)\bigg(\frac{6}{r_\mathrm{ISCO}}\bigg). + +Here, :math:`\beta` is the ratio of gas pressure and total pressure (which includes the magnetic pressure). `Yuan & Narayan (2014) <https://ui.adsabs.harvard.edu/abs/2014ARA%26A..52..529Y/abstract>`_ define a somewhat different parameter, :math:`\beta_\mathrm{ADAF}`, as the ratio of gas pressure and magnetic pressure. The two parameters are related by :math:`\beta=\beta_\mathrm{ADAF}/(1+\beta_\mathrm{ADAF})`. :math:`\beta_\mathrm{ADAF}` is not an independent parameter; many simulations have found that :math:`\alpha\beta_\mathrm{ADAF}\approx0.5` (e.g. `Begelman et al. 2021 <https://ui.adsabs.harvard.edu/abs/2022MNRAS.511.2040B/abstract>`_, see also `Yuan & Narayan 2014 <https://ui.adsabs.harvard.edu/abs/2014ARA%26A..52..529Y/abstract>`_ for a review), which we adopt. :math:`\delta_\mathrm{ADAF}` represents the fraction of viscous energy transferred to the electrons, and is constrained in theoretical studies between 0.1 and 0.5 (`Yuan & Narayan 2014 <https://ui.adsabs.harvard.edu/abs/2014ARA%26A..52..529Y/abstract>`_, `Sharma et al. 2007 <https://ui.adsabs.harvard.edu/abs/2007ApJ...667..714S/abstract>`_). Observations imply a value close to 0.2 (`Yuan et al. 2003 <https://ui.adsabs.harvard.edu/abs/2003ApJ...598..301Y/abstract>`_, `Liu & Wu 2013 <https://ui.adsabs.harvard.edu/abs/2013ApJ...764...17L/abstract>`_). The critical accretion rate between the two thick disc regimes can be found by ensuring that both formulas presented above yield the same radiative efficiency (at that accretion rate). This gives an accretion rate equal to + +.. math:: + \dot{m}_\mathrm{crit,visc}=0.0002\bigg(\frac{\delta_\mathrm{ADAF}}{0.0005}\bigg)\bigg(\frac{1-\beta}{\beta}\bigg)\alpha^2. + +For slim disks we take the radiative efficiency based on GRMHD simulations of super-Eddington accretion (for various BH spins) performed by `Sadowski et al. (2014) <https://ui.adsabs.harvard.edu/abs/2014MNRAS.439..503S/abstract>`_. `Madau et al. (2014) <https://ui.adsabs.harvard.edu/abs/2014ApJ...784L..38M/abstract>`_ found the following fitting function which represents the `Sadowski et al. (2014) <https://ui.adsabs.harvard.edu/abs/2014MNRAS.439..503S/abstract>`_ results: + +.. math:: + \epsilon_\mathrm{r,SD}=\frac{0.1}{\dot{m}}A(a)\bigg( \frac{0.985}{1.6/\dot{m}+B(a)}+\frac{0.015}{1.6/\dot{m}+C(a)}\bigg), + +where the three spin-dependant functions are given by :math:`A(a)=(0.9663-0.9292a)^{−0.5639}`, :math:`B(a)=(4.627-4.445a)^{−0.5524}` and :math:`C(a)=(827.3-718.1a)^{−0.7060}`. The radiative efficiency of slim disks, based on this formula, matches the thin disk radiative efficiency (given at the beginning of the section) at low accretion rates. At high accretion rates (:math:`\dot{m}\gtrapprox1`, but depending on spin), the radiative efficiency drops. These two formulas are used to decide when a disk transitions from thin to slim. + +Evolution of the black hole spin magnitude +------------------------------------------ + +.. figure:: spec_ang_mom.svg + :width: 600px + :align: center + :figclass: align-center + :alt: Angular momenta + + Dimensionless pecific angular momentum of the thin disk at the innermost stable circular orbit (ISCO, solid red line), compared with the specific angular momentum at the inner radius (the event horizon) for advection-dominated flows (the thick and slim disk) for a few values of the viscosity parameter :math:`\alpha`. The dashed red line shows that the latter can be approximated as :math:`45` per cent of the former. + +The BH spin (or angular momentum) is, naturally, a vector. However, due to Lense-thirring torques (we discuss these in more detail below), the accretion disk is always either aligned or counteraligned with the rotational axis of the black hole. This means that almost all relevant quantities, such as the efficiencies discussed above, can be expressed as depending only on the magnitude of spin, but also allowing for a negative sign to account for counteraligned disks (retrograde accretion). This is also true for the evolution of the magnitude of spin. + +In the absence of jet spindown, the evolution of angular momentum is given simply by :math:`\dot{J}_\mathrm{BH}=L_\mathrm{in}\dot{M}_\mathrm{BH}`, where :math:`L_\mathrm{in}` is the specific angular momentum at the inner radius of the accretion disk. This can be transformed into an equation for spin evolution, yielding + +.. math:: + \frac{\mathrm{d}a}{\mathrm{d}\ln M_\mathrm{BH,0}}=\ell_\mathrm{in}-2a e_\mathrm{in}, + +where :math:`\ell_\mathrm{in}` is the specific angular momentum in units where :math:`G` and :math:`c` are equal to unity, and :math:`\mathrm{d}\ln M_\mathrm{BH,0}=\mathrm{d}M_\mathrm{BH,0}/M_\mathrm{BH}` is the logarithmic change in mass, not including losses due to radiation (`Fanidakis et al. 2011 <https://ui.adsabs.harvard.edu/abs/2011MNRAS.410...53F/abstract>`_). The specific binding energy can be related to the radiative efficiency through :math:`e_\mathrm{in}=1-\epsilon_\mathrm{r}` for all three accretion states (for the thick disc, the radiative efficiency is negligible for this application). + +For the thin disc, the inner radius :math:`R_\mathrm{in}` can be taken to be the radius of the ISCO, since orbits should quickly degrade within it. We thus take :math:`\ell_\mathrm{in}` as the specific angular momentum at the ISCO for the thin disc (the expression for which is given in e.g. Appendix B of `Fiacconi et al. 2018 <https://ui.adsabs.harvard.edu/abs/2018MNRAS.477.3807F/abstract>`_). For the thin disk, the spinup function (the equation shown above) is always positive, meaning that the BH will always be spun up to positive values. This means that the BH will be spun down if spin is negative, or spun up to an equilibrium value of :math:`a_\mathrm{eq}=1` if spin is positive. For advection-dominated disks (the thick and slim disk), we assume that :math:`\ell_\mathrm{in}` is :math:`45` per cent of the ISCO value, based on numerical GR calculations by `Popham & Gammie (1998) <https://ui.adsabs.harvard.edu/abs/1998ApJ...504..419P/abstract>`_. We base this assumption on fits of the `Popham & Gammie (1998) <https://ui.adsabs.harvard.edu/abs/1998ApJ...504..419P/abstract>`_ results done by `Benson & Babul (2009) <https://ui.adsabs.harvard.edu/abs/2009MNRAS.397.1302B/abstract>`_. We independently compared these fits to the ISCO values and found :math:`\ell_\mathrm{in}\approx0.45\ell_\mathrm{ISCO}` with no more than :math:`10` per cent error for all values of spin and relevant values of :math:`\alpha=0.1-0.3`. + +For the thick and slim disk, these lower specific angular momenta lead to a non-zero equilibrium spin value :math:`a_\mathrm{eq}<1`. If :math:`a>a_\mathrm{eq}`, the BH will be spun down due to frame-dragging and viscosity; the frame-dragging rotationally accelerates any accreting gas (on account of the BH angular momentum), while viscosity carries away some of that angular momentum. Including jets into the model leads to further spindown. The jet spindown term (to be added to the spinup equation above) can be derived as + +.. math:: + \bigg(\frac{\mathrm{d}a}{\mathrm{d}\ln M_\mathrm{BH,0}}\bigg)_\mathrm{j}=-\epsilon_\mathrm{j}(a)\frac{\sqrt{1-a^2}}{a}\bigg[\Big(\sqrt{1-a^2}+1 \Big)^2+a^2 \bigg] + +(see `Benson & Babul 2009 <https://ui.adsabs.harvard.edu/abs/2009MNRAS.397.1302B/abstract>`_ for a derivation, which we have independently verified). Including jet spindown leads to even lower equilibrium spin values; e.g. for the thick disk this is only :math:`a_\mathrm{eq}\approx0.25`. + +.. figure:: spinup.svg + :width: 1200px + :align: center + :figclass: align-center + :alt: Spinup/spindown function + + Spinup/spindown function (the rate of black hole spin evolution) as a function of spin for all three accretion disk types. Black lines show evolution with only accretion included, while blue lines show the total including jet spindown. These plots show that the thin disk is always spun up to to :math:`a_\mathrm{eq}=1`, even with jets (due to low jet efficiencies). The advection-dominated disks (thick and slim disk) are spun up to positive equilibrium values :math:`a_\mathrm{eq}<1`, or spun down to such an equilibrium value if :math:`a>a_\mathrm{eq}`. This is due to extraction of rotational energy from the BH by frame dragging and transport of the angular momentum to large distances through viscous forces. Including jet spindown pushes these equilibrium spins to even smaller values. + +Evolution of the black hole spin direction +------------------------------------------ + +In the previous section we claimed that the evolution of the magnitude of spin depends only on whether accretion is prograde or retrograde. The two remaining questions are: 1) what about its direction, and 2) how to decide whether accretion is prograde or retrograde. We will now address the first of these. + +Lense-Thirring torques (`Lense & Thirring 1918 <https://ui.adsabs.harvard.edu/abs/1918PhyZ...19..156L/abstract>`_) arise from additional GR forces that operate near spinning BHs, related to the frame-dragging of spacetime. In isolation, they cause the precession of a parcel of gas as it orbits around the BH. For accretion disks, their effects depend on the type of disk (see `Nixon & King 2016 <https://ui.adsabs.harvard.edu/abs/2016LNP...905...45N/abstract>`_ for a review). Lense-Thirring torques do not have a component in the direction of the BH spin vector, which is why they do not play a role in the evolution of the magnitude of spin. + +In all cases, Lense-Thirring torques are effective only within some radius :math:`R_\mathrm{warp}`, which marks the boundary between the outer disk and an inner region, within which the BH can 'communicate' through these torques with the disk. Within this radius, the disk is on average aligned or counteraligned with the BH, whereas outside it, it is aligned with some large-scale angular momentum direction (which we can measure in the simulation) - hence the name warp radius. Given some surface density, one can also define the warp mass :math:`M_\mathrm{warp}` and the warp angular momentum :math:`J_\mathrm{warp}` as the total mass and angular momentum within :math:`R_\mathrm{warp}`, respectively. We will discuss how all of these warp-related quantities are calculated in each of the accretion disks further below, but for now we focus on how these warped disks feature in our model. + +In terms of the evolution of the spin direction, the main assumption of our model is as follows (see `King et al. 2005 <https://ui.adsabs.harvard.edu/abs/2005MNRAS.363...49K/abstract>`_ for the original argument, and additional discussions in e.g. `Fanidakis et al. 2011 <https://ui.adsabs.harvard.edu/abs/2011MNRAS.410...53F/abstract>`_, `Fiacconi et al. 2018 <https://ui.adsabs.harvard.edu/abs/2018MNRAS.477.3807F/abstract>`_ and `Griffin et al. 2019a <https://ui.adsabs.harvard.edu/abs/2019MNRAS.487..198G/abstract>`_). All matter that flows through an accretion disk is aligned or counteraligned with the BH spin vector in the accretion process. Due to conservation of angular momentum, the spin vector itself also has to adjust to keep the total angular momentum conserved. In the process of consuming one warp mass :math:`M_\mathrm{warp}`, the direction of the BH spin vector is aligned to match the direction of the total angular momentum of the system comprising the BH and the disk out to the warp radius. The direction of the BH spin vector can then be determined from :math:`\vec{J}_\mathrm{warp}=\vec{J}_\mathrm{BH}+J_\mathrm{warp}\hat{J}_\mathrm{d}`, where :math:`\vec{J}_\mathrm{BH}` is the old BH angular momentum vector, and :math:`\hat{J}_\mathrm{d}` is the direction of the large-scale accretion disk (which we assume matches the direction of the angular momentum of the gas in the BH smoothing kernel). + +In practice, the BH will consume parcels of mass that differ from :math:`M_\mathrm{warp}`. We assume that any such parcel of mass :math:`\Delta M` (e.g. the mass to be consumed within a single time step) can be split up onto :math:`n=\Delta M / M_\mathrm{warp}` individual increments of accretion, so the total angular momentum of the system within that time step is :math:`\vec{J}_\mathrm{warp}=\vec{J}_\mathrm{BH}+n J_\mathrm{warp}\hat{J}_\mathrm{d}`, i.e. :math:`n` warp angular momenta are consumed, with an angular momentum of :math:`\Delta \vec{J}=n J_\mathrm{warp}\hat{J}_\mathrm{d}=(J_\mathrm{warp}/M_\mathrm{warp})\Delta M `. This can also be viewed as the BH consuming material with a specific angular momentum of :math:`L_\mathrm{warp}=J_\mathrm{warp}/M_\mathrm{warp}`. Note that this picture is only valid if the BH spin vector does not change much during this process (in both magnitude and direction), which can be ensured with wisely chosen time steps. + +Deciding whether accretion is prograde or retrograde +---------------------------------------------------- + +We now discuss how to decide whether the sign of spin is positive or negative. In the process of communicating with the inner disk through Lense-Thirring torques, the disk either aligns or counteraligns with the BH spin vector. The condition for which of the two occurs can be derived by assuming that the magnitude of the spin does not change during this alignment (`King et al. 2005 <https://ui.adsabs.harvard.edu/abs/2005MNRAS.363...49K/abstract>`_). Accretion is retrograde if + +.. math:: + \cos \theta<-\frac{J_{\mathrm{warp}}}{2 J_{\mathrm{BH}}}, + +where :math:`\cos \theta=\hat{J}_\mathrm{BH}\cdot\hat{J}_\mathrm{d}` is the angle between the initial spin vector and the large-scale angular momentum of the disk. If this condition is not fulfilled, accretion is assumed to be prograde. Note that retrograde accretion is only possible if the angle between the spin vector and the large-scale accretion disk is larger than :math:`90^\circ`, and if the warp angular momentum is comparable to the BH one. + +Structure of the warped and precessing accretion disk +----------------------------------------------------- + +As mentioned already, Lense-Thirring torques have different effects depending on the type of accretion disk. In particular, their effects depend on the ratio of the viscosity parameter :math:`\alpha` and the aspect ratio :math:`H/R`. For thin discs (:math:`\alpha\gg H/R`), the disk is exactly warped as in the manner described in the preceeding two sections (`Bardeen & Peterson 1975 <https://ui.adsabs.harvard.edu/abs/1975ApJ...195L..65B/abstract>`_). The radius :math:`R_\mathrm{warp}` which separates the inner and outer accretion disc can be calculated by equating the Lense-Thirring precession time-scale (:math:`t_\mathrm{p}=2\pi/\Omega_\mathrm{p}`, with :math:`\Omega_\mathrm{p}=2GJ_\mathrm{BH}/c^2R^3` the precession rate) and the vertical warp propagation time-scale (:math:`t_\mathrm{warp}=R^2/\nu_2`, with :math:`\nu_2` the kinematic viscosity in the vertical direction) (e.g. `Martin et al. 2007 <https://ui.adsabs.harvard.edu/abs/2007MNRAS.381.1617M/abstract>`_). The vertical kinematic viscosity :math:`\nu_2` can be related to the horizontal one, :math:`\nu_1`, by :math:`\nu_2=\xi\nu_1`, with :math:`\xi` a numerical parameter given by + +.. math:: + \xi=\frac{2}{\alpha^2}\frac{1+7\alpha^2}{4+\alpha^2} + +(`Ogilvie 1999 <https://ui.adsabs.harvard.edu/abs/1999MNRAS.304..557O/abstract>`_, see also `Lodato et al. 2010 <https://ui.adsabs.harvard.edu/abs/2010MNRAS.405.1212L/abstract>`_ for a detailed discussion). We use the relation :math:`\dot{M}=3\pi\nu_1 \Sigma` to calculate :math:`\nu_1`, and therefore :math:`\nu_2`. The warp radius will depend on which region of the thin disc we assume, with each having its own expression for :math:`\Sigma`. In region b) of the `Shakura & Sunyaev (1973) <https://ui.adsabs.harvard.edu/abs/1973A%26A....24..337S/abstract>`_ thin disk, the surface density can be expressed as + +.. math:: + \Sigma_\mathrm{TD,b}=6.84 \times 10^{5} \mathrm{~g} \mathrm{~cm}^{-2} \alpha^{-4 / 5} \dot{m}^{3 / 5}\left(\frac{M_{\mathrm{BH}}}{10^{8} M_{\odot}}\right)^{1 / 8}\left(\frac{R}{R_{\mathrm{S}}}\right)^{-3 / 5}, + +while in region c) we have + +.. math:: + \Sigma_\mathrm{TD,c}=3.41 \times 10^{4} \mathrm{~g} \mathrm{~cm}^{-2} \alpha^{-4 / 5} \dot{m}^{7/10}\left(\frac{M_{\mathrm{BH}}}{10^{8} M_{\odot}}\right)^{1 / 20}\left(\frac{R}{R_{\mathrm{S}}}\right)^{-3 / 4}. + +These relations lead to the following expressions for :math:`R_\mathrm{warp}`: + +.. math:: + R_{\text {warp,TD,b}}=3410 R_{S} a^{5 / 8} \xi^{-5/8}\alpha^{-1 / 2} \dot{m}^{-1 / 4}\left(\frac{M_{\mathrm{BH}}}{10^{8} M_{\odot}}\right)^{1 / 8} + +(in region b) and + +.. math:: + R_\mathrm{warp,TD,c}=2629R_\mathrm{S}a^{4/7}\xi^{-4/7}\alpha^{-16/35}\dot{m}^{-6/35}\bigg(\frac{M_\mathrm{BH}}{10^8\hspace{0.5mm}\mathrm{M}_\odot} \bigg)^{4/35}, + +(in region c), with :math:`R_\mathrm{S}=2R_\mathrm{G}` the Schwarzschild radius. These warp radii are generally of order :math:`\approx1000R_\mathrm{G}`, which can lead to fairly quick alignment of the thin disk with the large-scale angular momentum direction (quicker than any significant evolution in mass or spin magnitude, illustrating why the inclusion of the effects of Lense-Thirring torques is important). + +In the context of thin disks, there is a futher complication. The self-gravity of the disk may become important at large radii (see `Lodato 2007 <https://www.sif.it/riviste/sif/ncr/econtents/2007/030/07/article/0>`_ for a review). The disk will fragment in the region where the Toomre parameter is :math:`Q(R)>1`. We thus assume that the disk extends out to where :math:`Q(R_\mathrm{sg})=1`. The self-gravity radius :math:`R_\mathrm{sg}` can be calculated from this condition and the definition of the Toomre parameter :math:`Q=\Omega c_{\mathrm{s}} /(\pi G \Sigma)`, yielding + +.. math:: + R_{\text {sg,TD,b}}=6460 R_{S} \alpha^{28/51} \dot{m}^{-18/51}\left(\frac{M_{\mathrm{BH}}}{10^{8} M_{\odot}}\right)^{-49/51} + +in region b) and + +.. math:: + R_\mathrm{sg,TD,c}=2456 R_{S} \alpha^{28/45} \dot{m}^{-22/45}\left(\frac{M_{\mathrm{BH}}}{10^{8} M_{\odot}}\right)^{-52/45} + +in region c). In all our calculations involving :math:`R_\mathrm{warp}` (for deciding the sign of spin and evolving the direction of angular momentum, as described in the preceeding sections), we always take the minimum of :math:`R_\mathrm{warp}` and :math:`R_\mathrm{sg}`. This is because if :math:`R_\mathrm{sg}<R_\mathrm{warp}`, the entire disk of extent :math:`R_\mathrm{sg}` will be warped. + +The thick disk does not experience the Bardeen-Peterson effect, i.e. it is never truly aligned nor counter-aligned in its inner regions. Instead, the disk precesses out to several dozen :math:`R_\mathrm{G}`, as seen in simulations (e.g. `Fragile et al. 2007 <https://ui.adsabs.harvard.edu/abs/2007ApJ...668..417F/abstract>`_), and likely observations through quasi-periodic oscillations (QPO; e.g. `Ingram et al. 2012 <https://ui.adsabs.harvard.edu/abs/2012MNRAS.419.2369I/abstract>`_). The slim disk has received much less attention in both simulations and observations (it is both harder to simulate and observe), but its similarity to the thick disk in its geometric aspects likely means that it precesses in a similar manner. + +The exact behaviour of the thick and slim disk (which we will collectively call the advection-dominated disks) again depends on the ratio of :math:`\alpha` and :math:`H/R`. Unfortunately, the advection-dominated disks both satisfy :math:`\alpha\approx H/R`, and in this regime, the effects of Lense-Thirring torques are not well understood from a theoretical perspective. However, if :math:`\alpha\ll H/R` (the so-called bending-wave regime), Lense-Thirring torques are known to cause precession of the entire inner disk as a solid body, as seen in observations and simulations. For simplicity, we will thus assume this to be the case for advection-dominated disks. + +`Lubow et al. (2002) <https://ui.adsabs.harvard.edu/abs/2002MNRAS.337..706L/abstract>`_ studied the bending-wave regime. In the inner regions, the disk precesses around the spin axis, while in the outer regions, it is aligned with the large-scale angular momentum of the disk. Based on their results the transition radius between the precessing and non-precessing regions of the disk given by + +.. math:: + R_\mathrm{warp,adv}=R_\mathrm{G}\bigg(\frac{384a}{25(H/R)^2}\bigg)^{2/5}. + +In our model, we assume that the inner regions of the disks are on average aligned or counteraligned with the spin vector (one can think of this as averaging over the precession, which has periods of :math:`\approx`days, over long enough time scales). For simplicity, we also refer to the radii within which this is true as the warp radii. For both of the advection-dominated disks, these radii are only of order several :math:`R_\mathrm{G}`. Note that similar values are found if one assumes that the Bardeen-Peterson effect operates in these disks. While there are some uncertainties in the assumptions we have made, we point out that using any of these values is much more physically motivated than using thin disk equations (the warp radii of order thousands of :math:`R_\mathrm{G}`), which is what is often done (e.g. `Griffin et al. 2019a <https://ui.adsabs.harvard.edu/abs/2019MNRAS.487..198G/abstract>`_, `Dubois et al. 2012 <https://ui.adsabs.harvard.edu/abs/2014MNRAS.440.1590D/abstract>`_). + +In order to determine the sign of spin and evolve the angular momentum direction, expressions for the warp mass :math:`M_\mathrm{warp}` and warp angular momentum :math:`J_\mathrm{warp}` are also needed. We calculate this using surface integrals as + +.. math:: + M_\mathrm{warp}(R_\mathrm{warp})=2\pi\int_0^{R_\mathrm{warp}}\Sigma(R)R\mathrm{d}R, + +and + +.. math:: + J_\mathrm{warp}(R_\mathrm{warp})=2\pi\int_0^{R_\mathrm{warp}}L(R)\Sigma(R)R\mathrm{d}R, + +respectively. Here, :math:`L(R)` is the specific angular momentum. In the case of the thin disk, we assume Keplerian orbits, i.e. :math:`L(R)=\sqrt{M_\mathrm{BH}G R}`. For the advection-dominated disks, we assume that they are smaller by a numerical factor :math:`\Omega_0`, which is given in the self-similar solutions for the thick (`Narayan & Yi 1995b <https://ui.adsabs.harvard.edu/abs/1995ApJ...452..710N/abstract>`_) and slim disk (`Wang & Zhou 1999 <https://ui.adsabs.harvard.edu/abs/1999ApJ...516..420W/abstract>`_), seperately. The surface densities in both of these accretion disks are given by the same formula in the self-similar solutions, which is + +.. math:: + \Sigma_\mathrm{adv}=\frac{\dot{M}}{2\pi R\vert v_\mathrm{r} \vert}, + +where :math:`v_\mathrm{r}=-\alpha v_0 v_\mathrm{K}` is the radial velocity. Here, :math:`v_\mathrm{K}=\sqrt{M_\mathrm{BH}G/R}` is the Keplerian velocity, and :math:`v_0` is another numerical coefficient that differs between the two solutions. In the thick disk, the numerical coefficients are given by :math:`v_0=3/(5+2\varepsilon)` and :math:`\Omega_0=\sqrt{2\varepsilon/(5+2\varepsilon)}`, where :math:`\varepsilon=(5/3-\gamma)/(\gamma-1)`. The adiabatic index depends on how magnetized the disk is. In particular, it depends on the gas-to-total pressure ratio as :math:`\gamma = (8-3\beta)/(6-3\beta)`, and :math:`\beta` itself depends on :math:`\alpha` (see discussion above on radiative efficiency in the thin disk). :math:`v_0` varies weakly with :math:`\alpha`; for :math:`\alpha=0.05`, it is :math:`0.56`, whereas for :math:`\alpha=0.3`, it evaluates to 0.5. :math:`\Omega_0` depends on :math:`\alpha` somewhat more strongly; we obtain :math:`0.27` and :math:`0.41` for the same values of :math:`\alpha`. The latter value agrees well with the ratio of actual to Keplerian (ISCO) orbital velocity at the event horizon, which is :math:`0.45`. For the slim disc, :math:`v_0=\Omega_0=1/\sqrt{\gamma}`, with :math:`\gamma=5`. + +Black hole mergers +------------------ + +In the process of merging, BHs interact in a very complicated manner. Their final spin is not trivial to predict, and it can depend on a very large parameter space (including the mass ratio of the black holes and the relative orientation and magnitude of the spins). Orbital angular momentum plays a role in the merger as well. We use the fitting function found by `Rezzolla et al. (2007) <https://journals.aps.org/prd/abstract/10.1103/PhysRevD.78.044002>`_, whose results have been found to be very accurate in newer and more sophisticated studies that sweep the huge parameter space of possible merger configurations. The only flaw in these formulas is that they do not include the effects of gravitational radiation. However, the effects of this radiation is confined to a :math:`\approx10\%` level, and only if either of the spin vectors is aligned or counteraligned with the direction of the orbital angular momentum (if it is not, the fits are even more accurate). + +The final spin, according to `Rezzolla et al. (2007) <https://journals.aps.org/prd/abstract/10.1103/PhysRevD.78.044002>`_ can be calculated as + +.. math:: + \mathbf{a}_\mathrm{fin} = \frac{1}{(1+q)^2}(\mathbf{a}_1+\mathbf{a}_2q^2+\mathbf{l}q), + +where :math:`q=M_2/M_1` is the mass ratio (such that :math:`M_2<M_1`), :math:`\mathbf{a}_1` and :math:`\mathbf{a}_2` are the spin vectors, and :math:`\mathbf{l}` is a vector whose direction is the same as that of the orbital angular momentum :math:`\mathbf{L}` (in the centre-of-mass frame), while its magnitude is given by + +.. math:: + |\mathbf{l}|=\frac{s_{4}}{\left(1+q^{2}\right)^{2}}\left(\left|\mathbf{a}_{1}\right|^{2}+|\mathbf{a}|_{1}^{2} q^{4}+2\left|\mathbf{a}_{1} \| \mathbf{a}_{2}\right| q^{2} \cos \phi\right)+ \\ + \left(\frac{s_{5} \mu+t_{0}+2}{1+q^{2}}\right)\left(\left|\mathbf{a}_{1}\right| \cos \theta+\left|\mathbf{a}_{2}\right| q^{2} \cos \xi\right)+ \\ + 2 \sqrt{3}+t_{2} \mu+t_{3} \mu^{2}. + +Here, :math:`\mu=q/(1+q)^2` is the symmetric mass ratio, and :math:`s_4 = -0.129`, :math:`s_5 = -0.384`, :math:`t_0 = -2.686`, :math:`t_2 = -3.454`, :math:`t_3 = 2.353`. The three cosines depend on the angles between the different vectors which play a role in the merger: :math:`\cos \phi=\hat{\mathbf{a}_{1}} \cdot \hat{\mathbf{a}_{\mathbf{2}}}`, :math:`\cos \theta=\hat{\mathbf{a}_{1}} \cdot \hat{\mathbf{l}}`, :math:`\cos \xi=\hat{\mathbf{a}_{2}} \cdot \hat{\mathbf{l}}`. diff --git a/doc/RTD/source/SubgridModels/EAGLE/EAGLE_SF_EOS.svg b/doc/RTD/source/SubgridModels/EAGLE/EAGLE_SF_EOS.svg deleted file mode 100644 index 398c2bd88331cff072cd82590d4691f0c48bc148..0000000000000000000000000000000000000000 --- a/doc/RTD/source/SubgridModels/EAGLE/EAGLE_SF_EOS.svg +++ /dev/null @@ -1,2353 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<!-- Created with matplotlib (https://matplotlib.org/) --> -<svg height="226.8pt" version="1.1" viewBox="0 0 226.8 226.8" width="226.8pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <defs> - <style type="text/css"> -*{stroke-linecap:butt;stroke-linejoin:round;} - </style> - </defs> - <g id="figure_1"> - <g id="patch_1"> - <path d="M 0 226.8 -L 226.8 226.8 -L 226.8 0 -L 0 0 -z -" style="fill:#ffffff;"/> - </g> - <g id="axes_1"> - <g id="patch_2"> - <path d="M 34.02 197.316 -L 224.532 197.316 -L 224.532 2.268 -L 34.02 2.268 -z -" style="fill:#ffffff;"/> - </g> - <g id="PathCollection_1"> - <defs> - <path d="M 0 1 -C 0.265203 1 0.51958 0.894634 0.707107 0.707107 -C 0.894634 0.51958 1 0.265203 1 0 -C 1 -0.265203 0.894634 -0.51958 0.707107 -0.707107 -C 0.51958 -0.894634 0.265203 -1 0 -1 -C -0.265203 -1 -0.51958 -0.894634 -0.707107 -0.707107 -C -0.894634 -0.51958 -1 -0.265203 -1 0 -C -1 0.265203 -0.894634 0.51958 -0.707107 0.707107 -C -0.51958 0.894634 -0.265203 1 0 1 -z -" id="m85090810e3" style="stroke:#000000;"/> - </defs> - <g clip-path="url(#p70b35b528f)"> - <use style="stroke:#000000;" x="146.991516" xlink:href="#m85090810e3" y="70.434351"/> - </g> - </g> - <g id="matplotlib.axis_1"> - <g id="xtick_1"> - <g id="line2d_1"> - <defs> - <path d="M 0 0 -L 0 3.5 -" id="m00a3d680a8" style="stroke:#000000;stroke-width:0.8;"/> - </defs> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="60.395152" xlink:href="#m00a3d680a8" y="197.316"/> - </g> - </g> - <g id="text_1"> - <!-- $\mathdefault{10^{-6}}$ --> - <defs> - <path d="M 8.90625 57.09375 -L 8.90625 60.203125 -Q 20.90625 60.203125 27.09375 66.59375 -Q 28.796875 66.59375 29.09375 66.1875 -Q 29.40625 65.796875 29.40625 64 -L 29.40625 7.90625 -Q 29.40625 4.90625 30.84375 4 -Q 32.296875 3.09375 38.703125 3.09375 -L 41.90625 3.09375 -L 41.90625 0 -Q 38.40625 0.296875 25.703125 0.296875 -Q 13 0.296875 9.5 0 -L 9.5 3.09375 -L 12.703125 3.09375 -Q 19 3.09375 20.5 4 -Q 22 4.90625 22 7.90625 -L 22 59.703125 -Q 16.796875 57.09375 8.90625 57.09375 -z -" id="CMUSerif-Roman-49"/> - <path d="M 3.90625 32 -Q 3.90625 46.703125 7.59375 54.703125 -Q 12.796875 66.59375 25 66.59375 -Q 27.59375 66.59375 30.296875 65.890625 -Q 33 65.203125 36.453125 62.5 -Q 39.90625 59.796875 42 55.40625 -Q 46 46.90625 46 32 -Q 46 17.40625 42.296875 9.40625 -Q 36.90625 -2.203125 24.90625 -2.203125 -Q 20.40625 -2.203125 15.84375 0.09375 -Q 11.296875 2.40625 8.40625 7.90625 -Q 3.90625 16.203125 3.90625 32 -z -M 12.203125 33.203125 -Q 12.203125 18.09375 13.296875 12.09375 -Q 14.5 5.59375 17.84375 2.796875 -Q 21.203125 0 24.90625 0 -Q 28.90625 0 32.25 3 -Q 35.59375 6 36.59375 12.5 -Q 37.703125 18.90625 37.703125 33.203125 -Q 37.703125 47.09375 36.703125 52.703125 -Q 35.40625 59.203125 31.90625 61.796875 -Q 28.40625 64.40625 24.90625 64.40625 -Q 23.59375 64.40625 22.1875 64 -Q 20.796875 63.59375 18.796875 62.5 -Q 16.796875 61.40625 15.25 58.59375 -Q 13.703125 55.796875 13 51.59375 -Q 12.203125 46.203125 12.203125 33.203125 -z -" id="CMUSerif-Roman-48"/> - <path d="M 1 18.59375 -L 1 24.5 -L 27.59375 24.5 -L 27.59375 18.59375 -z -" id="CMUSerif-Roman-45"/> - <path d="M 4.203125 31.59375 -Q 4.203125 47.296875 12.203125 56.9375 -Q 20.203125 66.59375 30.5 66.59375 -Q 36.5 66.59375 39.84375 63.546875 -Q 43.203125 60.5 43.203125 55.796875 -Q 43.203125 53.203125 41.703125 52.09375 -Q 40.203125 51 38.59375 51 -Q 36.796875 51 35.390625 52.203125 -Q 34 53.40625 34 55.59375 -Q 34 60.09375 39.5 60.09375 -Q 36.90625 64.09375 30.703125 64.09375 -Q 28.796875 64.09375 26.84375 63.546875 -Q 24.90625 63 22.34375 61.140625 -Q 19.796875 59.296875 17.84375 56.34375 -Q 15.90625 53.40625 14.546875 47.90625 -Q 13.203125 42.40625 13.203125 35.203125 -L 13.203125 32.796875 -Q 17.296875 42.703125 25.6875 42.703125 -Q 34.09375 42.703125 39.890625 36.296875 -Q 45.703125 29.90625 45.703125 20.40625 -Q 45.703125 10.703125 39.640625 4.25 -Q 33.59375 -2.203125 25.09375 -2.203125 -Q 21.296875 -2.203125 17.84375 -0.59375 -Q 14.40625 1 11.203125 4.59375 -Q 8 8.203125 6.09375 15.140625 -Q 4.203125 22.09375 4.203125 31.59375 -z -M 13.40625 22.59375 -Q 13.40625 12.796875 15.203125 8.09375 -Q 15.5 7.296875 16.140625 6.25 -Q 16.796875 5.203125 17.9375 3.796875 -Q 19.09375 2.40625 21 1.5 -Q 22.90625 0.59375 25.09375 0.59375 -Q 31.796875 0.59375 35 7.09375 -Q 36.703125 10.703125 36.703125 20.5 -Q 36.703125 30.5 34.90625 34.203125 -Q 31.796875 40.40625 25.59375 40.40625 -Q 21.40625 40.40625 18.5 37.5 -Q 15.59375 34.59375 14.5 30.75 -Q 13.40625 26.90625 13.40625 22.59375 -z -" id="CMUSerif-Roman-54"/> - </defs> - <g transform="translate(52.295152 211.256625)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-45"/> - <use transform="translate(124.064102 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-54"/> - </g> - </g> - </g> - <g id="xtick_2"> - <g id="line2d_2"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="95.033698" xlink:href="#m00a3d680a8" y="197.316"/> - </g> - </g> - <g id="text_2"> - <!-- $\mathdefault{10^{-4}}$ --> - <defs> - <path d="M 2.796875 16.5 -L 2.796875 19.59375 -L 33.5 66.5 -Q 34.296875 67.703125 35.5 67.703125 -Q 36.59375 67.703125 36.84375 67.25 -Q 37.09375 66.796875 37.09375 65.09375 -L 37.09375 19.59375 -L 47.09375 19.59375 -L 47.09375 16.5 -L 37.09375 16.5 -L 37.09375 7.796875 -Q 37.09375 4.90625 38.296875 4 -Q 39.5 3.09375 44.703125 3.09375 -L 46.796875 3.09375 -L 46.796875 0 -Q 42.703125 0.296875 33.203125 0.296875 -Q 23.796875 0.296875 19.703125 0 -L 19.703125 3.09375 -L 21.796875 3.09375 -Q 27 3.09375 28.203125 4 -Q 29.40625 4.90625 29.40625 7.796875 -L 29.40625 16.5 -z -M 5.59375 19.59375 -L 30 19.59375 -L 30 56.90625 -z -" id="CMUSerif-Roman-52"/> - </defs> - <g transform="translate(86.933698 211.256625)scale(0.1 -0.1)"> - <use transform="translate(0 0.442188)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.442188)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.607813)scale(0.7)" xlink:href="#CMUSerif-Roman-45"/> - <use transform="translate(124.064102 30.607813)scale(0.7)" xlink:href="#CMUSerif-Roman-52"/> - </g> - </g> - </g> - <g id="xtick_3"> - <g id="line2d_3"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="129.672243" xlink:href="#m00a3d680a8" y="197.316"/> - </g> - </g> - <g id="text_3"> - <!-- $\mathdefault{10^{-2}}$ --> - <defs> - <path d="M 5 0 -Q 5 1.796875 5.140625 2.34375 -Q 5.296875 2.90625 6.09375 3.703125 -L 25.296875 25.09375 -Q 35.796875 36.90625 35.796875 47.203125 -Q 35.796875 53.90625 32.296875 58.703125 -Q 28.796875 63.5 22.40625 63.5 -Q 18 63.5 14.296875 60.796875 -Q 10.59375 58.09375 8.90625 53.296875 -Q 9.203125 53.40625 10.203125 53.40625 -Q 12.703125 53.40625 14.09375 51.84375 -Q 15.5 50.296875 15.5 48.203125 -Q 15.5 45.5 13.75 44.203125 -Q 12 42.90625 10.296875 42.90625 -Q 9.59375 42.90625 8.6875 43.046875 -Q 7.796875 43.203125 6.390625 44.59375 -Q 5 46 5 48.5 -Q 5 55.5 10.296875 61.046875 -Q 15.59375 66.59375 23.703125 66.59375 -Q 32.90625 66.59375 38.90625 61.140625 -Q 44.90625 55.703125 44.90625 47.203125 -Q 44.90625 44.203125 44 41.5 -Q 43.09375 38.796875 41.890625 36.6875 -Q 40.703125 34.59375 37.5 31.25 -Q 34.296875 27.90625 31.6875 25.5 -Q 29.09375 23.09375 23.296875 18 -L 12.703125 7.703125 -L 30.703125 7.703125 -Q 39.5 7.703125 40.203125 8.5 -Q 41.203125 9.90625 42.40625 17.40625 -L 44.90625 17.40625 -L 42.09375 0 -z -" id="CMUSerif-Roman-50"/> - </defs> - <g transform="translate(121.572243 211.256625)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-45"/> - <use transform="translate(124.064102 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-50"/> - </g> - </g> - </g> - <g id="xtick_4"> - <g id="line2d_4"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="164.310789" xlink:href="#m00a3d680a8" y="197.316"/> - </g> - </g> - <g id="text_4"> - <!-- $\mathdefault{10^{0}}$ --> - <g transform="translate(157.410789 211.256625)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-48"/> - </g> - </g> - </g> - <g id="xtick_5"> - <g id="line2d_5"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="198.949334" xlink:href="#m00a3d680a8" y="197.316"/> - </g> - </g> - <g id="text_5"> - <!-- $\mathdefault{10^{2}}$ --> - <g transform="translate(192.049334 211.256625)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-50"/> - </g> - </g> - </g> - <g id="text_6"> - <!-- Hydrogen number density $n_{\rm H}$ [cm$^{-3}$] --> - <defs> - <path d="M 3.296875 0 -L 3.296875 3.09375 -L 5.703125 3.09375 -Q 11.09375 3.09375 12.34375 4 -Q 13.59375 4.90625 13.59375 7.796875 -L 13.59375 60.5 -Q 13.59375 63.40625 12.34375 64.296875 -Q 11.09375 65.203125 5.703125 65.203125 -L 3.296875 65.203125 -L 3.296875 68.296875 -Q 6.796875 68 18.09375 68 -Q 29.296875 68 32.796875 68.296875 -L 32.796875 65.203125 -L 30.40625 65.203125 -Q 25 65.203125 23.75 64.296875 -Q 22.5 63.40625 22.5 60.5 -L 22.5 37.09375 -L 52.40625 37.09375 -L 52.40625 60.5 -Q 52.40625 63.40625 51.15625 64.296875 -Q 49.90625 65.203125 44.5 65.203125 -L 42.09375 65.203125 -L 42.09375 68.296875 -Q 45.59375 68 56.90625 68 -Q 68.09375 68 71.59375 68.296875 -L 71.59375 65.203125 -L 69.203125 65.203125 -Q 63.796875 65.203125 62.546875 64.296875 -Q 61.296875 63.40625 61.296875 60.5 -L 61.296875 7.796875 -Q 61.296875 4.90625 62.546875 4 -Q 63.796875 3.09375 69.203125 3.09375 -L 71.59375 3.09375 -L 71.59375 0 -Q 68.09375 0.296875 56.796875 0.296875 -Q 45.59375 0.296875 42.09375 0 -L 42.09375 3.09375 -L 44.5 3.09375 -Q 49.90625 3.09375 51.15625 4 -Q 52.40625 4.90625 52.40625 7.796875 -L 52.40625 34 -L 22.5 34 -L 22.5 7.796875 -Q 22.5 4.90625 23.75 4 -Q 25 3.09375 30.40625 3.09375 -L 32.796875 3.09375 -L 32.796875 0 -Q 29.296875 0.296875 18 0.296875 -Q 6.796875 0.296875 3.296875 0 -z -" id="CMUSerif-Roman-72"/> - <path d="M 1.90625 -12.40625 -Q 1.90625 -10.296875 3.15625 -9.1875 -Q 4.40625 -8.09375 6.09375 -8.09375 -Q 7.90625 -8.09375 9.09375 -9.25 -Q 10.296875 -10.40625 10.296875 -12.296875 -Q 10.296875 -16 6.40625 -16.5 -Q 8.296875 -18.296875 11.09375 -18.296875 -Q 14.09375 -18.296875 16.5 -16.09375 -Q 18.90625 -13.90625 19.953125 -11.796875 -Q 21 -9.703125 22.5 -5.90625 -Q 23.90625 -2.90625 25 0 -L 10 36.5 -Q 9 38.90625 7.5 39.453125 -Q 6 40 1.90625 40 -L 1.90625 43.09375 -Q 6.40625 42.796875 11.59375 42.796875 -Q 14.703125 42.796875 22.5 43.09375 -L 22.5 40 -Q 16.90625 40 16.90625 37.40625 -Q 16.90625 37.09375 17.5 35.59375 -L 28.59375 8.703125 -L 38.703125 33.296875 -Q 39.296875 34.703125 39.296875 35.703125 -Q 39.296875 39.796875 34.59375 40 -L 34.59375 43.09375 -Q 41.203125 42.796875 43.296875 42.796875 -Q 47.40625 42.796875 50.796875 43.09375 -L 50.796875 40 -Q 44.09375 40 41.5 33.59375 -L 23.90625 -9.09375 -Q 19.09375 -20.5 11.09375 -20.5 -Q 7.296875 -20.5 4.59375 -18.140625 -Q 1.90625 -15.796875 1.90625 -12.40625 -z -" id="CMUSerif-Roman-121"/> - <path d="M 3.40625 21.5 -Q 3.40625 31 10.046875 37.59375 -Q 16.703125 44.203125 25.703125 44.203125 -Q 33.296875 44.203125 38.296875 38 -L 38.296875 59.59375 -Q 38.296875 63.296875 37 64.25 -Q 35.703125 65.203125 30.5 65.203125 -L 30.5 68.296875 -L 44.90625 69.40625 -L 44.90625 8.703125 -Q 44.90625 5 46.203125 4.046875 -Q 47.5 3.09375 52.703125 3.09375 -L 52.703125 0 -L 38 -1.09375 -L 38 5.5 -Q 32.796875 -1.09375 24.59375 -1.09375 -Q 16 -1.09375 9.703125 5.5 -Q 3.40625 12.09375 3.40625 21.5 -z -M 11.703125 21.40625 -Q 11.703125 12.09375 14.59375 7.5 -Q 18.59375 1.09375 25.09375 1.09375 -Q 32.5 1.09375 36.90625 8.09375 -Q 38 9.796875 38 11.796875 -L 38 32.296875 -Q 38 34.296875 36.90625 36 -Q 32.796875 42 26.09375 42 -Q 19.09375 42 14.796875 35.59375 -Q 11.703125 30.796875 11.703125 21.40625 -z -" id="CMUSerif-Roman-100"/> - <path d="M 2.796875 0 -L 2.796875 3.09375 -Q 8.09375 3.09375 9.34375 3.75 -Q 10.59375 4.40625 10.59375 7.59375 -L 10.59375 34.40625 -Q 10.59375 38.09375 9.296875 39.046875 -Q 8 40 2.796875 40 -L 2.796875 43.09375 -L 16.703125 44.203125 -L 16.703125 33.203125 -Q 18.09375 37.5 21.09375 40.84375 -Q 24.09375 44.203125 29 44.203125 -Q 32.203125 44.203125 34.296875 42.390625 -Q 36.40625 40.59375 36.40625 38.09375 -Q 36.40625 35.90625 35.046875 34.796875 -Q 33.703125 33.703125 32.09375 33.703125 -Q 30.296875 33.703125 29.046875 34.84375 -Q 27.796875 36 27.796875 38 -Q 27.796875 39.203125 28.34375 40.140625 -Q 28.90625 41.09375 29.34375 41.4375 -Q 29.796875 41.796875 30.09375 41.90625 -Q 29.90625 42 29 42 -Q 23.5 42 20.34375 36.5 -Q 17.203125 31 17.203125 23.203125 -L 17.203125 7.796875 -Q 17.203125 4.90625 18.390625 4 -Q 19.59375 3.09375 24.796875 3.09375 -L 26.90625 3.09375 -L 26.90625 0 -Q 22.90625 0.296875 14.203125 0.296875 -Q 13 0.296875 11.09375 0.25 -Q 9.203125 0.203125 6.703125 0.09375 -Q 4.203125 0 2.796875 0 -z -" id="CMUSerif-Roman-114"/> - <path d="M 16 -1.09375 -Q 2.796875 11.90625 2.796875 21.40625 -Q 2.796875 30.90625 9.25 37.84375 -Q 15.703125 44.796875 25 44.796875 -Q 34.09375 44.796875 40.59375 37.890625 -Q 47.09375 31 47.09375 21.40625 -Q 47.09375 12 40.546875 5.453125 -Q 34 -1.09375 24.90625 -1.09375 -Q 16 -1.09375 2.796875 11.90625 -z -M 11.09375 22.203125 -Q 11.09375 12.5 13.59375 8.09375 -Q 17.5 1.40625 25 1.40625 -Q 28.703125 1.40625 31.796875 3.40625 -Q 34.90625 5.40625 36.59375 8.796875 -Q 38.796875 13.203125 38.796875 22.203125 -Q 38.796875 31.796875 36.203125 36.09375 -Q 32.296875 42.59375 24.90625 42.59375 -Q 21.703125 42.59375 18.546875 40.890625 -Q 15.40625 39.203125 13.5 35.90625 -Q 11.09375 31.5 11.09375 22.203125 -z -" id="CMUSerif-Roman-111"/> - <path d="M 2.796875 -7.90625 -Q 2.796875 -4.703125 5.25 -1.890625 -Q 7.703125 0.90625 12 2.09375 -Q 7.59375 4.90625 7.59375 11 -Q 7.59375 15.703125 10.703125 19.296875 -Q 6 23.203125 6 29.59375 -Q 6 35.5 10.703125 39.84375 -Q 15.40625 44.203125 22.203125 44.203125 -Q 28.203125 44.203125 32.796875 40.59375 -Q 37.59375 45.296875 43.40625 45.296875 -Q 46 45.296875 47.25 43.6875 -Q 48.5 42.09375 48.5 40.40625 -Q 48.5 38.90625 47.546875 38.15625 -Q 46.59375 37.40625 45.59375 37.40625 -Q 44.40625 37.40625 43.546875 38.203125 -Q 42.703125 39 42.703125 40.296875 -Q 42.703125 42.40625 44.296875 43 -Q 44 43.09375 43.296875 43.09375 -Q 38.40625 43.09375 34.296875 39.203125 -Q 38.40625 35.40625 38.40625 29.5 -Q 38.40625 23.59375 33.703125 19.25 -Q 29 14.90625 22.203125 14.90625 -Q 16.59375 14.90625 12.296875 18 -Q 10.59375 16 10.59375 13.296875 -Q 10.59375 10.796875 12.09375 8.84375 -Q 13.59375 6.90625 15.90625 6.59375 -Q 16.59375 6.5 23.40625 6.5 -Q 27.40625 6.5 29.59375 6.390625 -Q 31.796875 6.296875 34.9375 5.640625 -Q 38.09375 5 40.59375 3.703125 -Q 47.09375 0.09375 47.09375 -7.703125 -Q 47.09375 -13.40625 40.546875 -17 -Q 34 -20.59375 24.90625 -20.59375 -Q 15.703125 -20.59375 9.25 -16.9375 -Q 2.796875 -13.296875 2.796875 -7.90625 -z -M 8 -7.90625 -Q 8 -12 12.84375 -15.140625 -Q 17.703125 -18.296875 25 -18.296875 -Q 32.203125 -18.296875 37.046875 -15.1875 -Q 41.90625 -12.09375 41.90625 -7.90625 -Q 41.90625 -4.90625 40.203125 -3 -Q 38.5 -1.09375 35 -0.34375 -Q 31.5 0.40625 29.046875 0.546875 -Q 26.59375 0.703125 22.09375 0.703125 -L 16.203125 0.703125 -Q 12.796875 0.5 10.390625 -2 -Q 8 -4.5 8 -7.90625 -z -M 13.5 29.5 -Q 13.5 17.203125 22.203125 17.203125 -Q 26.59375 17.203125 29.296875 21.203125 -Q 30.90625 23.90625 30.90625 29.59375 -Q 30.90625 41.90625 22.203125 41.90625 -Q 17.796875 41.90625 15.09375 37.90625 -Q 13.5 35.203125 13.5 29.5 -z -" id="CMUSerif-Roman-103"/> - <path d="M 2.796875 22 -Q 2.796875 31.40625 8.84375 38.09375 -Q 14.90625 44.796875 23.59375 44.796875 -Q 32.40625 44.796875 36.953125 39.09375 -Q 41.5 33.40625 41.5 25.203125 -Q 41.5 23.703125 41.09375 23.390625 -Q 40.703125 23.09375 39 23.09375 -L 11.09375 23.09375 -Q 11.09375 12.90625 14.09375 8.09375 -Q 18.296875 1.40625 25.40625 1.40625 -Q 26.40625 1.40625 27.546875 1.59375 -Q 28.703125 1.796875 31.09375 2.640625 -Q 33.5 3.5 35.59375 5.796875 -Q 37.703125 8.09375 38.90625 11.703125 -Q 39.203125 13.09375 40.203125 13.09375 -Q 41.5 13.09375 41.5 11.90625 -Q 41.5 11 40.546875 9.046875 -Q 39.59375 7.09375 37.796875 4.75 -Q 36 2.40625 32.5 0.65625 -Q 29 -1.09375 24.796875 -1.09375 -Q 16 -1.09375 9.390625 5.546875 -Q 2.796875 12.203125 2.796875 22 -z -M 11.203125 25.203125 -L 34.90625 25.203125 -Q 34.90625 27.296875 34.546875 29.640625 -Q 34.203125 32 33.140625 35.25 -Q 32.09375 38.5 29.640625 40.546875 -Q 27.203125 42.59375 23.59375 42.59375 -Q 22 42.59375 20.25 41.890625 -Q 18.5 41.203125 16.390625 39.546875 -Q 14.296875 37.90625 12.84375 34.15625 -Q 11.40625 30.40625 11.203125 25.203125 -z -" id="CMUSerif-Roman-101"/> - <path d="M 3.203125 0 -L 3.203125 3.09375 -Q 8.5 3.09375 9.75 3.75 -Q 11 4.40625 11 7.59375 -L 11 34.40625 -Q 11 38.09375 9.703125 39.046875 -Q 8.40625 40 3.203125 40 -L 3.203125 43.09375 -L 17.296875 44.203125 -L 17.296875 33.703125 -Q 22 44.203125 32.09375 44.203125 -Q 39.59375 44.203125 42.59375 40.5 -Q 44.796875 38 45.25 35.203125 -Q 45.703125 32.40625 45.703125 25.203125 -L 45.703125 6.09375 -Q 45.796875 4 47.390625 3.546875 -Q 49 3.09375 53.5 3.09375 -L 53.5 0 -Q 43.296875 0.296875 42.296875 0.296875 -Q 41.5 0.296875 31 0 -L 31 3.09375 -Q 36.296875 3.09375 37.546875 3.75 -Q 38.796875 4.40625 38.796875 7.59375 -L 38.796875 30.90625 -Q 38.796875 36 37.25 39 -Q 35.703125 42 31.40625 42 -Q 26.203125 42 22.046875 37.640625 -Q 17.90625 33.296875 17.90625 26 -L 17.90625 7.59375 -Q 17.90625 4.40625 19.15625 3.75 -Q 20.40625 3.09375 25.703125 3.09375 -L 25.703125 0 -Q 15.5 0.296875 14.5 0.296875 -Q 13.703125 0.296875 3.203125 0 -z -" id="CMUSerif-Roman-110"/> - <path id="CMUSerif-Roman-32"/> - <path d="M 3.203125 40 -L 3.203125 43.09375 -L 17.90625 44.203125 -L 17.90625 11 -Q 17.90625 8.59375 18.09375 7.1875 -Q 18.296875 5.796875 19.09375 4.1875 -Q 19.90625 2.59375 21.796875 1.84375 -Q 23.703125 1.09375 26.703125 1.09375 -Q 32.09375 1.09375 35.4375 5.546875 -Q 38.796875 10 38.796875 16.59375 -L 38.796875 34.40625 -Q 38.796875 38.09375 37.5 39.046875 -Q 36.203125 40 31 40 -L 31 43.09375 -L 45.703125 44.203125 -L 45.703125 8.703125 -Q 45.703125 5 47 4.046875 -Q 48.296875 3.09375 53.5 3.09375 -L 53.5 0 -L 39.09375 -1.09375 -L 39.09375 7.90625 -Q 34.90625 -1.09375 26.203125 -1.09375 -Q 21.796875 -1.09375 18.796875 0 -Q 15.796875 1.09375 14.296875 2.5 -Q 12.796875 3.90625 12 6.59375 -Q 11.203125 9.296875 11.09375 10.9375 -Q 11 12.59375 11 15.796875 -L 11 30.796875 -Q 11 37.59375 10 38.796875 -Q 9 40 3.203125 40 -z -" id="CMUSerif-Roman-117"/> - <path d="M 3.203125 0 -L 3.203125 3.09375 -Q 8.5 3.09375 9.75 3.75 -Q 11 4.40625 11 7.59375 -L 11 34.40625 -Q 11 38.09375 9.703125 39.046875 -Q 8.40625 40 3.203125 40 -L 3.203125 43.09375 -L 17.296875 44.203125 -L 17.296875 33.703125 -Q 22 44.203125 32.09375 44.203125 -Q 43.796875 44.203125 45.40625 34.40625 -Q 47.09375 38.203125 50.6875 41.203125 -Q 54.296875 44.203125 59.90625 44.203125 -Q 67.40625 44.203125 70.40625 40.5 -Q 72.59375 38 73.046875 35.203125 -Q 73.5 32.40625 73.5 25.203125 -L 73.5 6.09375 -Q 73.59375 4 75.1875 3.546875 -Q 76.796875 3.09375 81.296875 3.09375 -L 81.296875 0 -Q 71.09375 0.296875 70.09375 0.296875 -Q 69.296875 0.296875 58.796875 0 -L 58.796875 3.09375 -Q 64.09375 3.09375 65.34375 3.75 -Q 66.59375 4.40625 66.59375 7.59375 -L 66.59375 30.90625 -Q 66.59375 36 65.046875 39 -Q 63.5 42 59.203125 42 -Q 54 42 49.84375 37.640625 -Q 45.703125 33.296875 45.703125 26 -L 45.703125 7.59375 -Q 45.703125 4.40625 46.953125 3.75 -Q 48.203125 3.09375 53.5 3.09375 -L 53.5 0 -Q 43.296875 0.296875 42.296875 0.296875 -Q 41.5 0.296875 31 0 -L 31 3.09375 -Q 36.296875 3.09375 37.546875 3.75 -Q 38.796875 4.40625 38.796875 7.59375 -L 38.796875 30.90625 -Q 38.796875 36 37.25 39 -Q 35.703125 42 31.40625 42 -Q 26.203125 42 22.046875 37.640625 -Q 17.90625 33.296875 17.90625 26 -L 17.90625 7.59375 -Q 17.90625 4.40625 19.15625 3.75 -Q 20.40625 3.09375 25.703125 3.09375 -L 25.703125 0 -Q 15.5 0.296875 14.5 0.296875 -Q 13.703125 0.296875 3.203125 0 -z -" id="CMUSerif-Roman-109"/> - <path d="M 2.796875 65.203125 -L 2.796875 68.296875 -L 17.203125 69.40625 -L 17.203125 37.703125 -Q 23 44.203125 30.90625 44.203125 -Q 39.5 44.203125 45.796875 37.59375 -Q 52.09375 31 52.09375 21.59375 -Q 52.09375 12.09375 45.5 5.5 -Q 38.90625 -1.09375 29.796875 -1.09375 -Q 21.5 -1.09375 16.703125 6.203125 -Q 13.203125 0.09375 13.09375 0 -L 10.59375 0 -L 10.59375 59.59375 -Q 10.59375 63.296875 9.296875 64.25 -Q 8 65.203125 2.796875 65.203125 -z -M 17.5 11.40625 -Q 17.5 9.296875 18.90625 7.203125 -Q 22.90625 1.09375 29.40625 1.09375 -Q 36.40625 1.09375 40.703125 7.5 -Q 43.796875 12.296875 43.796875 21.703125 -Q 43.796875 31 40.90625 35.59375 -Q 36.90625 42 30.40625 42 -Q 23.09375 42 18.59375 35.59375 -Q 17.5 34 17.5 32 -z -" id="CMUSerif-Roman-98"/> - <path d="M 3.296875 1.296875 -L 3.296875 14.5 -Q 3.296875 15.59375 3.34375 16 -Q 3.40625 16.40625 3.703125 16.703125 -Q 4 17 4.59375 17 -Q 5.296875 17 5.546875 16.703125 -Q 5.796875 16.40625 6 15.296875 -Q 7.5 8.40625 10.75 4.75 -Q 14 1.09375 19.90625 1.09375 -Q 25.5 1.09375 28.34375 3.59375 -Q 31.203125 6.09375 31.203125 10.203125 -Q 31.203125 17.5 20.796875 19.40625 -Q 14.796875 20.59375 12.296875 21.390625 -Q 9.796875 22.203125 7.59375 24 -Q 3.296875 27.5 3.296875 32.5 -Q 3.296875 37.5 7.09375 41.140625 -Q 10.90625 44.796875 19.296875 44.796875 -Q 24.90625 44.796875 28.703125 42 -Q 29.796875 42.90625 30.40625 43.59375 -Q 31.703125 44.796875 32.40625 44.796875 -Q 33.203125 44.796875 33.34375 44.296875 -Q 33.5 43.796875 33.5 42.40625 -L 33.5 32.296875 -Q 33.5 31.203125 33.453125 30.796875 -Q 33.40625 30.40625 33.09375 30.15625 -Q 32.796875 29.90625 32.203125 29.90625 -Q 31.09375 29.90625 31 30.796875 -Q 30.203125 42.90625 19.296875 42.90625 -Q 13.40625 42.90625 10.75 40.65625 -Q 8.09375 38.40625 8.09375 35.296875 -Q 8.09375 33.59375 8.890625 32.296875 -Q 9.703125 31 10.75 30.25 -Q 11.796875 29.5 13.75 28.796875 -Q 15.703125 28.09375 16.890625 27.84375 -Q 18.09375 27.59375 20.40625 27.09375 -Q 28.40625 25.59375 31.796875 22.296875 -Q 36 18.09375 36 12.796875 -Q 36 6.90625 32 2.90625 -Q 28 -1.09375 19.90625 -1.09375 -Q 13.40625 -1.09375 8.90625 3.203125 -Q 8.296875 2.59375 7.84375 2.09375 -Q 7.40625 1.59375 7.25 1.390625 -Q 7.09375 1.203125 7.046875 1.09375 -Q 7 1 6.90625 0.90625 -Q 4.90625 -1.09375 4.40625 -1.09375 -Q 3.59375 -1.09375 3.4375 -0.59375 -Q 3.296875 -0.09375 3.296875 1.296875 -z -" id="CMUSerif-Roman-115"/> - <path d="M 3.296875 0 -L 3.296875 3.09375 -Q 8.59375 3.09375 9.84375 3.75 -Q 11.09375 4.40625 11.09375 7.59375 -L 11.09375 34.5 -Q 11.09375 38.203125 9.84375 39.09375 -Q 8.59375 40 3.703125 40 -L 3.703125 43.09375 -L 17.703125 44.203125 -L 17.703125 7.5 -Q 17.703125 4.5 18.75 3.796875 -Q 19.796875 3.09375 24.703125 3.09375 -L 24.703125 0 -Q 14.5 0.296875 14.296875 0.296875 -Q 12.90625 0.296875 3.296875 0 -z -M 7.5 61.59375 -Q 7.5 63.59375 9.046875 65.25 -Q 10.59375 66.90625 12.796875 66.90625 -Q 15 66.90625 16.546875 65.40625 -Q 18.09375 63.90625 18.09375 61.59375 -Q 18.09375 59.296875 16.546875 57.796875 -Q 15 56.296875 12.796875 56.296875 -Q 10.5 56.296875 9 57.890625 -Q 7.5 59.5 7.5 61.59375 -z -" id="CMUSerif-Roman-105"/> - <path d="M 1.90625 40 -L 1.90625 42.203125 -Q 6.5 42.40625 9.546875 45.65625 -Q 12.59375 48.90625 13.640625 52.90625 -Q 14.703125 56.90625 14.796875 61.5 -L 17.296875 61.5 -L 17.296875 43.09375 -L 31.59375 43.09375 -L 31.59375 40 -L 17.296875 40 -L 17.296875 12.203125 -Q 17.296875 1.40625 24 1.40625 -Q 26.90625 1.40625 28.796875 4.34375 -Q 30.703125 7.296875 30.703125 12.59375 -L 30.703125 18.09375 -L 33.203125 18.09375 -L 33.203125 12.40625 -Q 33.203125 7 30.703125 2.953125 -Q 28.203125 -1.09375 23.296875 -1.09375 -Q 21.5 -1.09375 19.703125 -0.640625 -Q 17.90625 -0.203125 15.59375 1 -Q 13.296875 2.203125 11.84375 5.140625 -Q 10.40625 8.09375 10.40625 12.40625 -L 10.40625 40 -z -" id="CMUSerif-Roman-116"/> - <path d="M 7.71875 1.703125 -Q 7.71875 2.296875 7.8125 2.59375 -L 15.28125 32.421875 -Q 16.015625 35.203125 16.015625 37.3125 -Q 16.015625 41.609375 13.09375 41.609375 -Q 9.96875 41.609375 8.453125 37.859375 -Q 6.9375 34.125 5.515625 28.421875 -Q 5.515625 28.125 5.21875 27.953125 -Q 4.9375 27.78125 4.6875 27.78125 -L 3.515625 27.78125 -Q 3.171875 27.78125 2.921875 28.140625 -Q 2.6875 28.515625 2.6875 28.8125 -Q 3.765625 33.15625 4.765625 36.171875 -Q 5.765625 39.203125 7.890625 41.6875 -Q 10.015625 44.1875 13.1875 44.1875 -Q 16.9375 44.1875 19.8125 41.8125 -Q 22.703125 39.453125 22.703125 35.796875 -Q 25.6875 39.703125 29.6875 41.9375 -Q 33.6875 44.1875 38.1875 44.1875 -Q 41.75 44.1875 44.328125 42.96875 -Q 46.921875 41.75 48.359375 39.28125 -Q 49.8125 36.8125 49.8125 33.40625 -Q 49.8125 29.296875 47.96875 23.484375 -Q 46.140625 17.671875 43.40625 10.5 -Q 42 7.234375 42 4.5 -Q 42 1.515625 44.28125 1.515625 -Q 48.1875 1.515625 50.796875 5.703125 -Q 53.421875 9.90625 54.5 14.703125 -Q 54.6875 15.28125 55.328125 15.28125 -L 56.5 15.28125 -Q 56.890625 15.28125 57.15625 15.03125 -Q 57.421875 14.796875 57.421875 14.40625 -Q 57.421875 14.3125 57.328125 14.109375 -Q 55.953125 8.453125 52.5625 3.65625 -Q 49.171875 -1.125 44.09375 -1.125 -Q 40.578125 -1.125 38.078125 1.296875 -Q 35.59375 3.71875 35.59375 7.171875 -Q 35.59375 9.03125 36.375 11.078125 -Q 37.640625 14.359375 39.28125 18.890625 -Q 40.921875 23.4375 41.96875 27.578125 -Q 43.015625 31.734375 43.015625 34.90625 -Q 43.015625 37.703125 41.859375 39.65625 -Q 40.71875 41.609375 37.984375 41.609375 -Q 34.328125 41.609375 31.25 39.984375 -Q 28.171875 38.375 25.875 35.71875 -Q 23.578125 33.0625 21.6875 29.390625 -L 14.890625 2.203125 -Q 14.546875 0.828125 13.34375 -0.140625 -Q 12.15625 -1.125 10.6875 -1.125 -Q 9.46875 -1.125 8.59375 -0.34375 -Q 7.71875 0.4375 7.71875 1.703125 -z -" id="Cmmi10-110"/> - <path d="M 3.078125 0 -L 3.078125 3.515625 -Q 13.375 3.515625 13.375 6.6875 -L 13.375 61.625 -Q 13.375 64.796875 3.078125 64.796875 -L 3.078125 68.3125 -L 33.015625 68.3125 -L 33.015625 64.796875 -Q 22.703125 64.796875 22.703125 61.625 -L 22.703125 37.3125 -L 52.203125 37.3125 -L 52.203125 61.625 -Q 52.203125 64.796875 41.890625 64.796875 -L 41.890625 68.3125 -L 71.78125 68.3125 -L 71.78125 64.796875 -Q 61.53125 64.796875 61.53125 61.625 -L 61.53125 6.6875 -Q 61.53125 3.515625 71.78125 3.515625 -L 71.78125 0 -L 41.890625 0 -L 41.890625 3.515625 -Q 52.203125 3.515625 52.203125 6.6875 -L 52.203125 33.796875 -L 22.703125 33.796875 -L 22.703125 6.6875 -Q 22.703125 3.515625 33.015625 3.515625 -L 33.015625 0 -z -" id="Cmr10-72"/> - <path d="M 10.40625 -25 -L 10.40625 75 -L 25.5 75 -L 25.5 72.703125 -L 17.09375 72.703125 -L 17.09375 -22.703125 -L 25.5 -22.703125 -L 25.5 -25 -z -" id="CMUSerif-Roman-91"/> - <path d="M 16.09375 -1.09375 -Q 3.40625 12.09375 3.40625 21.59375 -Q 3.40625 31.09375 9.65625 37.9375 -Q 15.90625 44.796875 25.09375 44.796875 -Q 31.203125 44.796875 35.796875 41.890625 -Q 40.40625 39 40.40625 34.09375 -Q 40.40625 31.90625 39.09375 30.65625 -Q 37.796875 29.40625 35.796875 29.40625 -Q 33.703125 29.40625 32.453125 30.703125 -Q 31.203125 32 31.203125 34 -Q 31.203125 34.90625 31.5 35.75 -Q 31.796875 36.59375 32.890625 37.546875 -Q 34 38.5 35.90625 38.59375 -Q 32.296875 42.296875 25.203125 42.296875 -Q 20.09375 42.296875 15.890625 37.5 -Q 11.703125 32.703125 11.703125 21.796875 -Q 11.703125 16.09375 13.09375 11.890625 -Q 14.5 7.703125 16.796875 5.546875 -Q 19.09375 3.40625 21.34375 2.40625 -Q 23.59375 1.40625 25.796875 1.40625 -Q 35.59375 1.40625 38.90625 11.90625 -Q 39.203125 12.90625 40.203125 12.90625 -Q 41.5 12.90625 41.5 11.90625 -Q 41.5 11.40625 41.09375 10.15625 -Q 40.703125 8.90625 39.5 6.90625 -Q 38.296875 4.90625 36.546875 3.15625 -Q 34.796875 1.40625 31.75 0.15625 -Q 28.703125 -1.09375 24.90625 -1.09375 -Q 16.09375 -1.09375 3.40625 12.09375 -z -" id="CMUSerif-Roman-99"/> - <path d="M 10.203125 23 -Q 9.375 23 8.828125 23.625 -Q 8.296875 24.265625 8.296875 25 -Q 8.296875 25.734375 8.828125 26.359375 -Q 9.375 27 10.203125 27 -L 67.578125 27 -Q 68.359375 27 68.875 26.359375 -Q 69.390625 25.734375 69.390625 25 -Q 69.390625 24.265625 68.875 23.625 -Q 68.359375 23 67.578125 23 -z -" id="Cmsy10-161"/> - <path d="M 9.515625 7.71875 -Q 11.859375 4.296875 15.8125 2.640625 -Q 19.78125 0.984375 24.3125 0.984375 -Q 30.125 0.984375 32.5625 5.9375 -Q 35.015625 10.890625 35.015625 17.1875 -Q 35.015625 20.015625 34.5 22.84375 -Q 33.984375 25.6875 32.765625 28.125 -Q 31.546875 30.5625 29.421875 32.03125 -Q 27.296875 33.5 24.21875 33.5 -L 17.578125 33.5 -Q 16.703125 33.5 16.703125 34.421875 -L 16.703125 35.296875 -Q 16.703125 36.078125 17.578125 36.078125 -L 23.09375 36.53125 -Q 26.609375 36.53125 28.921875 39.15625 -Q 31.25 41.796875 32.328125 45.578125 -Q 33.40625 49.359375 33.40625 52.78125 -Q 33.40625 57.5625 31.15625 60.640625 -Q 28.90625 63.71875 24.3125 63.71875 -Q 20.515625 63.71875 17.046875 62.28125 -Q 13.578125 60.84375 11.53125 57.90625 -Q 11.71875 57.953125 11.859375 57.984375 -Q 12.015625 58.015625 12.203125 58.015625 -Q 14.453125 58.015625 15.96875 56.453125 -Q 17.484375 54.890625 17.484375 52.6875 -Q 17.484375 50.53125 15.96875 48.96875 -Q 14.453125 47.40625 12.203125 47.40625 -Q 10.015625 47.40625 8.453125 48.96875 -Q 6.890625 50.53125 6.890625 52.6875 -Q 6.890625 56.984375 9.46875 60.15625 -Q 12.0625 63.328125 16.140625 64.96875 -Q 20.21875 66.609375 24.3125 66.609375 -Q 27.34375 66.609375 30.703125 65.703125 -Q 34.078125 64.796875 36.8125 63.109375 -Q 39.546875 61.421875 41.28125 58.78125 -Q 43.015625 56.15625 43.015625 52.78125 -Q 43.015625 48.578125 41.140625 45.015625 -Q 39.265625 41.453125 35.984375 38.859375 -Q 32.71875 36.28125 28.8125 35.015625 -Q 33.15625 34.1875 37.0625 31.734375 -Q 40.96875 29.296875 43.328125 25.484375 -Q 45.703125 21.6875 45.703125 17.28125 -Q 45.703125 11.765625 42.671875 7.296875 -Q 39.65625 2.828125 34.71875 0.3125 -Q 29.78125 -2.203125 24.3125 -2.203125 -Q 19.625 -2.203125 14.90625 -0.40625 -Q 10.203125 1.375 7.203125 4.9375 -Q 4.203125 8.5 4.203125 13.484375 -Q 4.203125 15.96875 5.859375 17.625 -Q 7.515625 19.28125 10.015625 19.28125 -Q 11.625 19.28125 12.96875 18.53125 -Q 14.3125 17.78125 15.0625 16.40625 -Q 15.828125 15.046875 15.828125 13.484375 -Q 15.828125 11.03125 14.109375 9.375 -Q 12.40625 7.71875 10.015625 7.71875 -z -" id="Cmr10-51"/> - <path d="M 2.09375 -22.703125 -L 10.5 -22.703125 -L 10.5 72.703125 -L 2.09375 72.703125 -L 2.09375 75 -L 17.203125 75 -L 17.203125 -25 -L 2.09375 -25 -z -" id="CMUSerif-Roman-93"/> - </defs> - <g transform="translate(48.976 221.69725)scale(0.1 -0.1)"> - <use transform="translate(0 0.109375)" xlink:href="#CMUSerif-Roman-72"/> - <use transform="translate(74.999985 0.109375)" xlink:href="#CMUSerif-Roman-121"/> - <use transform="translate(127.699982 0.109375)" xlink:href="#CMUSerif-Roman-100"/> - <use transform="translate(183.199966 0.109375)" xlink:href="#CMUSerif-Roman-114"/> - <use transform="translate(222.299957 0.109375)" xlink:href="#CMUSerif-Roman-111"/> - <use transform="translate(272.299942 0.109375)" xlink:href="#CMUSerif-Roman-103"/> - <use transform="translate(322.299927 0.109375)" xlink:href="#CMUSerif-Roman-101"/> - <use transform="translate(366.699921 0.109375)" xlink:href="#CMUSerif-Roman-110"/> - <use transform="translate(422.199905 0.109375)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(455.499893 0.109375)" xlink:href="#CMUSerif-Roman-110"/> - <use transform="translate(510.999878 0.109375)" xlink:href="#CMUSerif-Roman-117"/> - <use transform="translate(566.499863 0.109375)" xlink:href="#CMUSerif-Roman-109"/> - <use transform="translate(649.79985 0.109375)" xlink:href="#CMUSerif-Roman-98"/> - <use transform="translate(705.299835 0.109375)" xlink:href="#CMUSerif-Roman-101"/> - <use transform="translate(749.699829 0.109375)" xlink:href="#CMUSerif-Roman-114"/> - <use transform="translate(788.79982 0.109375)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(822.099808 0.109375)" xlink:href="#CMUSerif-Roman-100"/> - <use transform="translate(877.599792 0.109375)" xlink:href="#CMUSerif-Roman-101"/> - <use transform="translate(921.999786 0.109375)" xlink:href="#CMUSerif-Roman-110"/> - <use transform="translate(977.499771 0.109375)" xlink:href="#CMUSerif-Roman-115"/> - <use transform="translate(1016.899765 0.109375)" xlink:href="#CMUSerif-Roman-105"/> - <use transform="translate(1044.599762 0.109375)" xlink:href="#CMUSerif-Roman-116"/> - <use transform="translate(1083.39975 0.109375)" xlink:href="#CMUSerif-Roman-121"/> - <use transform="translate(1136.099747 0.109375)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(1169.399734 0.109375)" xlink:href="#Cmmi10-110"/> - <use transform="translate(1229.4095 -16.896875)scale(0.7)" xlink:href="#Cmr10-72"/> - <use transform="translate(1288.286844 0.109375)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(1321.586832 0.109375)" xlink:href="#CMUSerif-Roman-91"/> - <use transform="translate(1349.386819 0.109375)" xlink:href="#CMUSerif-Roman-99"/> - <use transform="translate(1393.786813 0.109375)" xlink:href="#CMUSerif-Roman-109"/> - <use transform="translate(1481.550942 38.373438)scale(0.7)" xlink:href="#Cmsy10-161"/> - <use transform="translate(1535.930825 38.373438)scale(0.7)" xlink:href="#Cmr10-51"/> - <use transform="translate(1577.308168 0.109375)" xlink:href="#CMUSerif-Roman-93"/> - </g> - </g> - </g> - <g id="matplotlib.axis_2"> - <g id="ytick_1"> - <g id="line2d_6"> - <defs> - <path d="M 0 0 -L -3.5 0 -" id="mbe9d5df88a" style="stroke:#000000;stroke-width:0.8;"/> - </defs> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#mbe9d5df88a" y="163.232825"/> - </g> - </g> - <g id="text_7"> - <!-- $\mathdefault{10^{2}}$ --> - <g transform="translate(13.22 166.703137)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-50"/> - </g> - </g> - </g> - <g id="ytick_2"> - <g id="line2d_7"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#mbe9d5df88a" y="114.470825"/> - </g> - </g> - <g id="text_8"> - <!-- $\mathdefault{10^{3}}$ --> - <defs> - <path d="M 4.203125 13.5 -Q 4.203125 16.5 5.890625 17.890625 -Q 7.59375 19.296875 9.796875 19.296875 -Q 12.09375 19.296875 13.75 17.796875 -Q 15.40625 16.296875 15.40625 13.703125 -Q 15.40625 10.90625 13.453125 9.34375 -Q 11.5 7.796875 8.796875 8.203125 -Q 11.203125 4.203125 15.59375 2.390625 -Q 20 0.59375 24.09375 0.59375 -Q 28.40625 0.59375 31.90625 4.296875 -Q 35.40625 8 35.40625 17.09375 -Q 35.40625 24.796875 32.40625 29.25 -Q 29.40625 33.703125 23.5 33.703125 -L 19.09375 33.703125 -Q 17.59375 33.703125 17.140625 33.84375 -Q 16.703125 34 16.703125 34.796875 -Q 16.703125 35.796875 18.203125 36 -Q 19.703125 36 22.09375 36.296875 -Q 27.90625 36.5 31 41.5 -Q 33.796875 46.203125 33.796875 52.90625 -Q 33.796875 59 30.890625 61.546875 -Q 28 64.09375 24.203125 64.09375 -Q 20.703125 64.09375 16.84375 62.640625 -Q 13 61.203125 10.90625 57.90625 -Q 17.09375 57.90625 17.09375 52.90625 -Q 17.09375 50.703125 15.6875 49.25 -Q 14.296875 47.796875 12 47.796875 -Q 9.796875 47.796875 8.34375 49.1875 -Q 6.90625 50.59375 6.90625 53 -Q 6.90625 58.703125 12 62.640625 -Q 17.09375 66.59375 24.59375 66.59375 -Q 32 66.59375 37.5 62.6875 -Q 43 58.796875 43 52.796875 -Q 43 46.90625 39.09375 42.046875 -Q 35.203125 37.203125 29 35.203125 -Q 36.59375 33.703125 41.140625 28.546875 -Q 45.703125 23.40625 45.703125 17.09375 -Q 45.703125 9.296875 39.546875 3.546875 -Q 33.40625 -2.203125 24.40625 -2.203125 -Q 16.09375 -2.203125 10.140625 2.296875 -Q 4.203125 6.796875 4.203125 13.5 -z -" id="CMUSerif-Roman-51"/> - </defs> - <g transform="translate(13.22 117.941137)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-51"/> - </g> - </g> - </g> - <g id="ytick_3"> - <g id="line2d_8"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#mbe9d5df88a" y="65.708825"/> - </g> - </g> - <g id="text_9"> - <!-- $\mathdefault{10^{4}}$ --> - <g transform="translate(13.22 69.179137)scale(0.1 -0.1)"> - <use transform="translate(0 0.442188)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.442188)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.607813)scale(0.7)" xlink:href="#CMUSerif-Roman-52"/> - </g> - </g> - </g> - <g id="ytick_4"> - <g id="line2d_9"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#mbe9d5df88a" y="16.946825"/> - </g> - </g> - <g id="text_10"> - <!-- $\mathdefault{10^{5}}$ --> - <defs> - <path d="M 5 16.09375 -Q 5 19.09375 6.59375 20.25 -Q 8.203125 21.40625 9.90625 21.40625 -Q 12.203125 21.40625 13.546875 19.953125 -Q 14.90625 18.5 14.90625 16.5 -Q 14.90625 14.5 13.546875 13.046875 -Q 12.203125 11.59375 9.90625 11.59375 -Q 8.796875 11.59375 8.203125 11.796875 -Q 9.5 7.203125 13.546875 3.890625 -Q 17.59375 0.59375 22.90625 0.59375 -Q 29.59375 0.59375 33.59375 7.09375 -Q 36 11.296875 36 20.796875 -Q 36 29.203125 34.203125 33.40625 -Q 31.40625 39.796875 25.703125 39.796875 -Q 17.59375 39.796875 12.796875 32.796875 -Q 12.203125 31.90625 11.5 31.90625 -Q 10.5 31.90625 10.296875 32.453125 -Q 10.09375 33 10.09375 34.5 -L 10.09375 64.09375 -Q 10.09375 66.5 11.09375 66.5 -Q 11.5 66.5 12.296875 66.203125 -Q 18.59375 63.40625 25.59375 63.40625 -Q 32.796875 63.40625 39.203125 66.296875 -Q 39.703125 66.59375 40 66.59375 -Q 41 66.59375 41 65.5 -Q 41 65.09375 40.203125 63.9375 -Q 39.40625 62.796875 37.703125 61.296875 -Q 36 59.796875 33.796875 58.390625 -Q 31.59375 57 28.390625 56.046875 -Q 25.203125 55.09375 21.703125 55.09375 -Q 17.5 55.09375 13.203125 56.40625 -L 13.203125 36.90625 -Q 18.40625 42 25.90625 42 -Q 33.90625 42 39.40625 35.546875 -Q 44.90625 29.09375 44.90625 20.09375 -Q 44.90625 10.703125 38.40625 4.25 -Q 31.90625 -2.203125 23.09375 -2.203125 -Q 15.09375 -2.203125 10.046875 3.5 -Q 5 9.203125 5 16.09375 -z -" id="CMUSerif-Roman-53"/> - </defs> - <g transform="translate(13.22 20.417137)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-53"/> - </g> - </g> - </g> - <g id="ytick_5"> - <g id="line2d_10"> - <defs> - <path d="M 0 0 -L -2 0 -" id="m1f4f509585" style="stroke:#000000;stroke-width:0.6;"/> - </defs> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="197.316"/> - </g> - </g> - </g> - <g id="ytick_6"> - <g id="line2d_11"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="188.729438"/> - </g> - </g> - </g> - <g id="ytick_7"> - <g id="line2d_12"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="182.637175"/> - </g> - </g> - </g> - <g id="ytick_8"> - <g id="line2d_13"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="177.911649"/> - </g> - </g> - </g> - <g id="ytick_9"> - <g id="line2d_14"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="174.050613"/> - </g> - </g> - </g> - <g id="ytick_10"> - <g id="line2d_15"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="170.786154"/> - </g> - </g> - </g> - <g id="ytick_11"> - <g id="line2d_16"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="167.958351"/> - </g> - </g> - </g> - <g id="ytick_12"> - <g id="line2d_17"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="165.464051"/> - </g> - </g> - </g> - <g id="ytick_13"> - <g id="line2d_18"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="148.554"/> - </g> - </g> - </g> - <g id="ytick_14"> - <g id="line2d_19"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="139.967438"/> - </g> - </g> - </g> - <g id="ytick_15"> - <g id="line2d_20"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="133.875175"/> - </g> - </g> - </g> - <g id="ytick_16"> - <g id="line2d_21"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="129.149649"/> - </g> - </g> - </g> - <g id="ytick_17"> - <g id="line2d_22"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="125.288613"/> - </g> - </g> - </g> - <g id="ytick_18"> - <g id="line2d_23"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="122.024154"/> - </g> - </g> - </g> - <g id="ytick_19"> - <g id="line2d_24"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="119.196351"/> - </g> - </g> - </g> - <g id="ytick_20"> - <g id="line2d_25"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="116.702051"/> - </g> - </g> - </g> - <g id="ytick_21"> - <g id="line2d_26"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="99.792"/> - </g> - </g> - </g> - <g id="ytick_22"> - <g id="line2d_27"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="91.205438"/> - </g> - </g> - </g> - <g id="ytick_23"> - <g id="line2d_28"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="85.113175"/> - </g> - </g> - </g> - <g id="ytick_24"> - <g id="line2d_29"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="80.387649"/> - </g> - </g> - </g> - <g id="ytick_25"> - <g id="line2d_30"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="76.526613"/> - </g> - </g> - </g> - <g id="ytick_26"> - <g id="line2d_31"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="73.262154"/> - </g> - </g> - </g> - <g id="ytick_27"> - <g id="line2d_32"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="70.434351"/> - </g> - </g> - </g> - <g id="ytick_28"> - <g id="line2d_33"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="67.940051"/> - </g> - </g> - </g> - <g id="ytick_29"> - <g id="line2d_34"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="51.03"/> - </g> - </g> - </g> - <g id="ytick_30"> - <g id="line2d_35"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="42.443438"/> - </g> - </g> - </g> - <g id="ytick_31"> - <g id="line2d_36"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="36.351175"/> - </g> - </g> - </g> - <g id="ytick_32"> - <g id="line2d_37"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="31.625649"/> - </g> - </g> - </g> - <g id="ytick_33"> - <g id="line2d_38"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="27.764613"/> - </g> - </g> - </g> - <g id="ytick_34"> - <g id="line2d_39"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="24.500154"/> - </g> - </g> - </g> - <g id="ytick_35"> - <g id="line2d_40"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="21.672351"/> - </g> - </g> - </g> - <g id="ytick_36"> - <g id="line2d_41"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="19.178051"/> - </g> - </g> - </g> - <g id="ytick_37"> - <g id="line2d_42"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m1f4f509585" y="2.268"/> - </g> - </g> - </g> - <g id="text_11"> - <!-- Temperature $T$ [K] --> - <defs> - <path d="M 3.59375 45.203125 -L 5.5 67.703125 -L 66.59375 67.703125 -L 68.5 45.203125 -L 66 45.203125 -Q 65.59375 49.703125 65.25 52.296875 -Q 64.90625 54.90625 64.046875 57.34375 -Q 63.203125 59.796875 62.140625 61 -Q 61.09375 62.203125 59.09375 63.140625 -Q 57.09375 64.09375 54.5 64.34375 -Q 51.90625 64.59375 48 64.59375 -Q 43.40625 64.59375 42.296875 64.40625 -Q 41.09375 64.09375 40.796875 63.25 -Q 40.5 62.40625 40.5 60.59375 -L 40.5 7.90625 -Q 40.5 5.90625 40.890625 5.09375 -Q 41.296875 4.296875 43.59375 3.6875 -Q 45.90625 3.09375 51 3.09375 -L 55 3.09375 -L 55 0 -Q 50.90625 0.296875 36 0.296875 -Q 21.203125 0.296875 17.09375 0 -L 17.09375 3.09375 -L 21.09375 3.09375 -Q 26.203125 3.09375 28.5 3.6875 -Q 30.796875 4.296875 31.1875 5.09375 -Q 31.59375 5.90625 31.59375 7.90625 -L 31.59375 60.59375 -Q 31.59375 62 31.5 62.59375 -Q 31.40625 63.203125 30.953125 63.703125 -Q 30.5 64.203125 29.5 64.390625 -Q 28.5 64.59375 24.09375 64.59375 -Q 20.203125 64.59375 17.59375 64.34375 -Q 15 64.09375 13 63.140625 -Q 11 62.203125 9.953125 61 -Q 8.90625 59.796875 8.046875 57.34375 -Q 7.203125 54.90625 6.84375 52.296875 -Q 6.5 49.703125 6.09375 45.203125 -z -" id="CMUSerif-Roman-84"/> - <path d="M 2.796875 -16.296875 -Q 8.09375 -16.296875 9.34375 -15.640625 -Q 10.59375 -15 10.59375 -11.796875 -L 10.59375 35 -Q 10.59375 38.296875 9.34375 39.140625 -Q 8.09375 40 2.796875 40 -L 2.796875 43.09375 -L 17.203125 44.203125 -L 17.203125 37.59375 -Q 23.203125 44.203125 31.203125 44.203125 -Q 39.703125 44.203125 45.890625 37.59375 -Q 52.09375 31 52.09375 21.59375 -Q 52.09375 12.09375 45.5 5.5 -Q 38.90625 -1.09375 29.796875 -1.09375 -Q 24.796875 -1.09375 21.4375 1.453125 -Q 18.09375 4 17.5 5.90625 -L 17.5 5 -L 17.5 -11.796875 -Q 17.5 -15 18.75 -15.640625 -Q 20 -16.296875 25.296875 -16.296875 -L 25.296875 -19.40625 -Q 14.796875 -19.09375 14 -19.09375 -Q 13 -19.09375 2.796875 -19.40625 -z -M 17.5 11.40625 -Q 17.5 9.90625 17.703125 9.34375 -Q 17.90625 8.796875 18.90625 7.203125 -Q 22.90625 1.09375 29.40625 1.09375 -Q 35.09375 1.09375 39.4375 6.9375 -Q 43.796875 12.796875 43.796875 21.59375 -Q 43.796875 30 39.84375 35.84375 -Q 35.90625 41.703125 30.40625 41.703125 -Q 26.5 41.703125 23.09375 39.59375 -Q 19.703125 37.5 17.5 33.703125 -z -" id="CMUSerif-Roman-112"/> - <path d="M 4.203125 9.5 -Q 4.203125 18 14.203125 22.5 -Q 20.203125 25.40625 32.59375 26.09375 -L 32.59375 29.796875 -Q 32.59375 36 29.34375 39.296875 -Q 26.09375 42.59375 22 42.59375 -Q 14.703125 42.59375 11.203125 38 -Q 14.203125 37.90625 15.25 36.40625 -Q 16.296875 34.90625 16.296875 33.40625 -Q 16.296875 31.40625 15.046875 30.09375 -Q 13.796875 28.796875 11.703125 28.796875 -Q 9.703125 28.796875 8.390625 30.046875 -Q 7.09375 31.296875 7.09375 33.5 -Q 7.09375 38.40625 11.5 41.59375 -Q 15.90625 44.796875 22.203125 44.796875 -Q 30.40625 44.796875 35.90625 39.296875 -Q 37.59375 37.59375 38.4375 35.390625 -Q 39.296875 33.203125 39.390625 31.75 -Q 39.5 30.296875 39.5 27.5 -L 39.5 7.5 -Q 39.5 6.90625 39.703125 5.953125 -Q 39.90625 5 40.796875 3.75 -Q 41.703125 2.5 43.203125 2.5 -Q 46.796875 2.5 46.796875 8.90625 -L 46.796875 14.5 -L 49.296875 14.5 -L 49.296875 8.90625 -Q 49.296875 3.59375 46.5 1.5 -Q 43.703125 -0.59375 41.09375 -0.59375 -Q 37.796875 -0.59375 35.6875 1.84375 -Q 33.59375 4.296875 33.296875 7.59375 -Q 31.796875 3.796875 28.34375 1.34375 -Q 24.90625 -1.09375 20.203125 -1.09375 -Q 16.59375 -1.09375 13.1875 -0.1875 -Q 9.796875 0.703125 7 3.203125 -Q 4.203125 5.703125 4.203125 9.5 -z -M 11.90625 9.59375 -Q 11.90625 5.90625 14.546875 3.5 -Q 17.203125 1.09375 20.90625 1.09375 -Q 25.09375 1.09375 28.84375 4.34375 -Q 32.59375 7.59375 32.59375 14 -L 32.59375 24 -Q 21.5 23.59375 16.703125 19.1875 -Q 11.90625 14.796875 11.90625 9.59375 -z -" id="CMUSerif-Roman-97"/> - <path d="M 4.59375 1.3125 -Q 4.640625 1.5625 4.8125 2.1875 -Q 4.984375 2.828125 5.25 3.171875 -Q 5.515625 3.515625 6 3.515625 -Q 14.59375 3.515625 17.390625 4 -Q 20.0625 4.6875 20.609375 6.890625 -L 34.28125 61.8125 -Q 34.71875 63.03125 34.71875 64.015625 -Q 34.71875 64.796875 31.203125 64.796875 -L 25.390625 64.796875 -Q 18.703125 64.796875 15.0625 62.734375 -Q 11.421875 60.6875 9.71875 57.3125 -Q 8.015625 53.953125 5.328125 46.296875 -Q 4.984375 45.40625 4.296875 45.40625 -L 3.421875 45.40625 -Q 2.390625 45.40625 2.390625 46.6875 -L 9.515625 67.390625 -Q 9.71875 68.3125 10.5 68.3125 -L 69.578125 68.3125 -Q 70.609375 68.3125 70.609375 67 -L 67.28125 46.296875 -Q 67.28125 46 66.9375 45.703125 -Q 66.609375 45.40625 66.3125 45.40625 -L 65.375 45.40625 -Q 64.40625 45.40625 64.40625 46.6875 -Q 65.484375 53.765625 65.484375 56.6875 -Q 65.484375 60.203125 64.015625 62 -Q 62.546875 63.8125 60.203125 64.296875 -Q 57.859375 64.796875 54.109375 64.796875 -L 48.1875 64.796875 -Q 45.515625 64.796875 44.578125 64.296875 -Q 43.65625 63.8125 43.015625 61.375 -L 29.296875 6.5 -Q 29.25 6.296875 29.21875 6.09375 -Q 29.203125 5.90625 29.109375 5.609375 -Q 29.109375 4.34375 30.609375 4 -Q 33.203125 3.515625 41.703125 3.515625 -Q 42.671875 3.515625 42.671875 2.203125 -Q 42.328125 0.78125 42.125 0.390625 -Q 41.9375 0 41.015625 0 -L 5.609375 0 -Q 4.59375 0 4.59375 1.3125 -z -" id="Cmmi10-84"/> - <path d="M 3.296875 0 -L 3.296875 3.09375 -L 5.703125 3.09375 -Q 11.09375 3.09375 12.34375 4 -Q 13.59375 4.90625 13.59375 7.796875 -L 13.59375 60.5 -Q 13.59375 63.40625 12.34375 64.296875 -Q 11.09375 65.203125 5.703125 65.203125 -L 3.296875 65.203125 -L 3.296875 68.296875 -Q 6.796875 68 18.09375 68 -Q 29.296875 68 32.796875 68.296875 -L 32.796875 65.203125 -L 30.40625 65.203125 -Q 25 65.203125 23.75 64.296875 -Q 22.5 63.40625 22.5 60.5 -L 22.5 28.703125 -L 53.796875 58.59375 -Q 55.59375 60.203125 55.59375 61.90625 -Q 55.59375 62.5 55.34375 63.140625 -Q 55.09375 63.796875 53.9375 64.5 -Q 52.796875 65.203125 51 65.203125 -L 51 68.296875 -Q 54.40625 68 63.703125 68 -Q 69.59375 68 72.203125 68.296875 -L 72.203125 65.203125 -Q 63.90625 65.09375 58 59.203125 -L 40 41.90625 -L 63.09375 7.90625 -Q 65.203125 4.796875 67.25 3.9375 -Q 69.296875 3.09375 73.59375 3.09375 -L 73.59375 0 -Q 67.296875 0.296875 62.09375 0.296875 -Q 51.296875 0.296875 47.796875 0 -L 47.796875 3.09375 -Q 53.703125 3.09375 53.703125 6.09375 -Q 53.703125 7.203125 52.203125 9.5 -L 34.09375 36.296875 -L 22.5 25.296875 -L 22.5 7.796875 -Q 22.5 4.90625 23.75 4 -Q 25 3.09375 30.40625 3.09375 -L 32.796875 3.09375 -L 32.796875 0 -Q 29.296875 0.296875 18 0.296875 -Q 6.796875 0.296875 3.296875 0 -z -" id="CMUSerif-Roman-75"/> - </defs> - <g transform="translate(8.72 141.042)rotate(-90)scale(0.1 -0.1)"> - <use xlink:href="#CMUSerif-Roman-84"/> - <use transform="translate(72.199982 0)" xlink:href="#CMUSerif-Roman-101"/> - <use transform="translate(116.599976 0)" xlink:href="#CMUSerif-Roman-109"/> - <use transform="translate(199.899963 0)" xlink:href="#CMUSerif-Roman-112"/> - <use transform="translate(255.399948 0)" xlink:href="#CMUSerif-Roman-101"/> - <use transform="translate(299.799942 0)" xlink:href="#CMUSerif-Roman-114"/> - <use transform="translate(338.899933 0)" xlink:href="#CMUSerif-Roman-97"/> - <use transform="translate(388.899918 0)" xlink:href="#CMUSerif-Roman-116"/> - <use transform="translate(427.699905 0)" xlink:href="#CMUSerif-Roman-117"/> - <use transform="translate(483.19989 0)" xlink:href="#CMUSerif-Roman-114"/> - <use transform="translate(522.299881 0)" xlink:href="#CMUSerif-Roman-101"/> - <use transform="translate(566.699875 0)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(599.999863 0)" xlink:href="#Cmmi10-84"/> - <use transform="translate(658.3983 0)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(691.698288 0)" xlink:href="#CMUSerif-Roman-91"/> - <use transform="translate(719.498276 0)" xlink:href="#CMUSerif-Roman-75"/> - <use transform="translate(797.198257 0)" xlink:href="#CMUSerif-Roman-93"/> - </g> - </g> - </g> - <g id="line2d_43"> - <path clip-path="url(#p70b35b528f)" d="M -1 209.323214 -L 223.107611 -1 -L 223.107611 -1 -" style="fill:none;stroke:#000000;stroke-linecap:square;"/> - </g> - <g id="line2d_44"> - <path clip-path="url(#p70b35b528f)" d="M -1 70.434351 -L 146.991516 70.434351 -" style="fill:none;stroke:#000000;stroke-dasharray:0.6,0.99;stroke-dashoffset:0;stroke-width:0.6;"/> - </g> - <g id="line2d_45"> - <path clip-path="url(#p70b35b528f)" d="M 146.991516 197.316 -L 146.991516 70.434351 -" style="fill:none;stroke:#000000;stroke-dasharray:0.6,0.99;stroke-dashoffset:0;stroke-width:0.6;"/> - </g> - <g id="line2d_46"> - <path clip-path="url(#p70b35b528f)" d="M 146.991516 51.03 -L 181.630061 18.522 -" style="fill:none;stroke:#000000;stroke-dasharray:2.22,0.96;stroke-dashoffset:0;stroke-width:0.6;"/> - </g> - <g id="patch_3"> - <path d="M 34.02 197.316 -L 34.02 2.268 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="patch_4"> - <path d="M 224.532 197.316 -L 224.532 2.268 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="patch_5"> - <path d="M 34.02 197.316 -L 224.532 197.316 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="patch_6"> - <path d="M 34.02 2.268 -L 224.532 2.268 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="text_12"> - <!-- $n_{\rm H}$^EOS_gamma_effective --> - <defs> - <path d="M 34.421875 72.90625 -L 56.6875 45.703125 -L 48 45.703125 -L 30.078125 64.984375 -L 12.203125 45.703125 -L 3.515625 45.703125 -L 25.78125 72.90625 -z -" id="DejaVuSansMono-94"/> - <path d="M 9.625 72.90625 -L 52.875 72.90625 -L 52.875 64.59375 -L 19.484375 64.59375 -L 19.484375 43.015625 -L 51.421875 43.015625 -L 51.421875 34.71875 -L 19.484375 34.71875 -L 19.484375 8.296875 -L 53.8125 8.296875 -L 53.8125 0 -L 9.625 0 -z -" id="DejaVuSansMono-69"/> - <path d="M 44.1875 36.375 -Q 44.1875 52.4375 40.890625 59.328125 -Q 37.59375 66.21875 30.078125 66.21875 -Q 22.609375 66.21875 19.3125 59.328125 -Q 16.015625 52.4375 16.015625 36.375 -Q 16.015625 20.359375 19.3125 13.46875 -Q 22.609375 6.59375 30.078125 6.59375 -Q 37.59375 6.59375 40.890625 13.453125 -Q 44.1875 20.3125 44.1875 36.375 -z -M 54.5 36.375 -Q 54.5 17.328125 48.46875 7.953125 -Q 42.4375 -1.421875 30.078125 -1.421875 -Q 17.71875 -1.421875 11.71875 7.90625 -Q 5.71875 17.234375 5.71875 36.375 -Q 5.71875 55.46875 11.75 64.84375 -Q 17.78125 74.21875 30.078125 74.21875 -Q 42.4375 74.21875 48.46875 64.84375 -Q 54.5 55.46875 54.5 36.375 -z -" id="DejaVuSansMono-79"/> - <path d="M 49.421875 70.40625 -L 49.421875 60.40625 -Q 44.921875 63.28125 40.40625 64.75 -Q 35.890625 66.21875 31.296875 66.21875 -Q 24.3125 66.21875 20.265625 62.96875 -Q 16.21875 59.71875 16.21875 54.203125 -Q 16.21875 49.359375 18.875 46.8125 -Q 21.53125 44.28125 28.8125 42.578125 -L 33.984375 41.40625 -Q 44.234375 39.015625 48.921875 33.890625 -Q 53.609375 28.765625 53.609375 19.921875 -Q 53.609375 9.515625 47.15625 4.046875 -Q 40.71875 -1.421875 28.421875 -1.421875 -Q 23.296875 -1.421875 18.109375 -0.3125 -Q 12.9375 0.78125 7.71875 2.984375 -L 7.71875 13.484375 -Q 13.328125 9.90625 18.328125 8.25 -Q 23.34375 6.59375 28.421875 6.59375 -Q 35.890625 6.59375 40.03125 9.9375 -Q 44.1875 13.28125 44.1875 19.28125 -Q 44.1875 24.75 41.328125 27.625 -Q 38.484375 30.515625 31.390625 32.078125 -L 26.125 33.296875 -Q 15.96875 35.59375 11.375 40.234375 -Q 6.78125 44.875 6.78125 52.6875 -Q 6.78125 62.453125 13.34375 68.328125 -Q 19.921875 74.21875 30.8125 74.21875 -Q 35.015625 74.21875 39.640625 73.265625 -Q 44.28125 72.3125 49.421875 70.40625 -z -" id="DejaVuSansMono-83"/> - <path d="M 60.203125 -19.671875 -L 60.203125 -23.578125 -L 0 -23.578125 -L 0 -19.671875 -z -" id="DejaVuSansMono-95"/> - <path d="M 41.890625 27.78125 -Q 41.890625 37.890625 38.59375 43.140625 -Q 35.296875 48.390625 29 48.390625 -Q 22.40625 48.390625 18.9375 43.140625 -Q 15.484375 37.890625 15.484375 27.78125 -Q 15.484375 17.671875 18.96875 12.375 -Q 22.46875 7.078125 29.109375 7.078125 -Q 35.296875 7.078125 38.59375 12.390625 -Q 41.890625 17.71875 41.890625 27.78125 -z -M 50.875 3.515625 -Q 50.875 -8.796875 45.0625 -15.140625 -Q 39.265625 -21.484375 27.984375 -21.484375 -Q 24.265625 -21.484375 20.203125 -20.796875 -Q 16.15625 -20.125 12.109375 -18.796875 -L 12.109375 -9.90625 -Q 16.890625 -12.15625 20.796875 -13.234375 -Q 24.703125 -14.3125 27.984375 -14.3125 -Q 35.25 -14.3125 38.5625 -10.34375 -Q 41.890625 -6.390625 41.890625 2.203125 -L 41.890625 2.59375 -L 41.890625 8.6875 -Q 39.75 4.109375 36.03125 1.859375 -Q 32.328125 -0.390625 27 -0.390625 -Q 17.4375 -0.390625 11.71875 7.265625 -Q 6 14.9375 6 27.78125 -Q 6 40.671875 11.71875 48.328125 -Q 17.4375 56 27 56 -Q 32.28125 56 35.9375 53.90625 -Q 39.59375 51.8125 41.890625 47.40625 -L 41.890625 54.5 -L 50.875 54.5 -z -" id="DejaVuSansMono-103"/> - <path d="M 34.28125 27.484375 -L 31.296875 27.484375 -Q 23.4375 27.484375 19.453125 24.71875 -Q 15.484375 21.96875 15.484375 16.5 -Q 15.484375 11.578125 18.453125 8.84375 -Q 21.4375 6.109375 26.703125 6.109375 -Q 34.125 6.109375 38.375 11.25 -Q 42.625 16.40625 42.671875 25.484375 -L 42.671875 27.484375 -z -M 51.703125 31.203125 -L 51.703125 0 -L 42.671875 0 -L 42.671875 8.109375 -Q 39.796875 3.21875 35.421875 0.890625 -Q 31.0625 -1.421875 24.8125 -1.421875 -Q 16.453125 -1.421875 11.46875 3.296875 -Q 6.5 8.015625 6.5 15.921875 -Q 6.5 25.046875 12.625 29.78125 -Q 18.75 34.515625 30.609375 34.515625 -L 42.671875 34.515625 -L 42.671875 35.9375 -Q 42.625 42.484375 39.34375 45.4375 -Q 36.078125 48.390625 28.90625 48.390625 -Q 24.3125 48.390625 19.625 47.0625 -Q 14.9375 45.75 10.5 43.21875 -L 10.5 52.203125 -Q 15.484375 54.109375 20.046875 55.046875 -Q 24.609375 56 28.90625 56 -Q 35.6875 56 40.5 54 -Q 45.3125 52 48.296875 48 -Q 50.140625 45.5625 50.921875 41.96875 -Q 51.703125 38.375 51.703125 31.203125 -z -" id="DejaVuSansMono-97"/> - <path d="M 33.015625 49.125 -Q 34.671875 52.640625 37.234375 54.3125 -Q 39.796875 56 43.40625 56 -Q 50 56 52.703125 50.890625 -Q 55.421875 45.796875 55.421875 31.6875 -L 55.421875 0 -L 47.21875 0 -L 47.21875 31.296875 -Q 47.21875 42.875 45.921875 45.671875 -Q 44.625 48.484375 41.21875 48.484375 -Q 37.3125 48.484375 35.859375 45.484375 -Q 34.421875 42.484375 34.421875 31.296875 -L 34.421875 0 -L 26.21875 0 -L 26.21875 31.296875 -Q 26.21875 43.015625 24.828125 45.75 -Q 23.4375 48.484375 19.828125 48.484375 -Q 16.265625 48.484375 14.875 45.484375 -Q 13.484375 42.484375 13.484375 31.296875 -L 13.484375 0 -L 5.328125 0 -L 5.328125 54.6875 -L 13.484375 54.6875 -L 13.484375 50 -Q 15.09375 52.9375 17.5 54.46875 -Q 19.921875 56 23 56 -Q 26.703125 56 29.171875 54.296875 -Q 31.640625 52.59375 33.015625 49.125 -z -" id="DejaVuSansMono-109"/> - <path d="M 54.296875 29.59375 -L 54.296875 25.203125 -L 15.375 25.203125 -L 15.375 24.90625 -Q 15.375 15.96875 20.03125 11.078125 -Q 24.703125 6.203125 33.203125 6.203125 -Q 37.5 6.203125 42.1875 7.5625 -Q 46.875 8.9375 52.203125 11.71875 -L 52.203125 2.78125 -Q 47.078125 0.6875 42.3125 -0.359375 -Q 37.546875 -1.421875 33.109375 -1.421875 -Q 20.359375 -1.421875 13.171875 6.21875 -Q 6 13.875 6 27.296875 -Q 6 40.375 13.03125 48.1875 -Q 20.0625 56 31.78125 56 -Q 42.234375 56 48.265625 48.921875 -Q 54.296875 41.84375 54.296875 29.59375 -z -M 45.3125 32.234375 -Q 45.125 40.140625 41.578125 44.265625 -Q 38.03125 48.390625 31.390625 48.390625 -Q 24.90625 48.390625 20.703125 44.09375 -Q 16.5 39.796875 15.71875 32.171875 -z -" id="DejaVuSansMono-101"/> - <path d="M 51.90625 75.984375 -L 51.90625 68.5 -L 41.703125 68.5 -Q 36.859375 68.5 34.984375 66.515625 -Q 33.109375 64.546875 33.109375 59.515625 -L 33.109375 54.6875 -L 51.90625 54.6875 -L 51.90625 47.703125 -L 33.109375 47.703125 -L 33.109375 0 -L 24.125 0 -L 24.125 47.703125 -L 9.515625 47.703125 -L 9.515625 54.6875 -L 24.125 54.6875 -L 24.125 58.5 -Q 24.125 67.484375 28.25 71.734375 -Q 32.375 75.984375 41.109375 75.984375 -z -" id="DejaVuSansMono-102"/> - <path d="M 51.8125 2.78125 -Q 48.1875 0.6875 44.359375 -0.359375 -Q 40.53125 -1.421875 36.53125 -1.421875 -Q 23.828125 -1.421875 16.671875 6.1875 -Q 9.515625 13.8125 9.515625 27.296875 -Q 9.515625 40.765625 16.671875 48.375 -Q 23.828125 56 36.53125 56 -Q 40.484375 56 44.234375 54.96875 -Q 48 53.953125 51.8125 51.8125 -L 51.8125 42.390625 -Q 48.25 45.5625 44.65625 46.96875 -Q 41.0625 48.390625 36.53125 48.390625 -Q 28.078125 48.390625 23.53125 42.921875 -Q 19 37.453125 19 27.296875 -Q 19 17.1875 23.5625 11.6875 -Q 28.125 6.203125 36.53125 6.203125 -Q 41.21875 6.203125 44.921875 7.640625 -Q 48.640625 9.078125 51.8125 12.109375 -z -" id="DejaVuSansMono-99"/> - <path d="M 29.984375 70.21875 -L 29.984375 54.6875 -L 50.390625 54.6875 -L 50.390625 47.703125 -L 29.984375 47.703125 -L 29.984375 18.015625 -Q 29.984375 11.96875 32.28125 9.5625 -Q 34.578125 7.171875 40.28125 7.171875 -L 50.390625 7.171875 -L 50.390625 0 -L 39.40625 0 -Q 29.296875 0 25.140625 4.046875 -Q 21 8.109375 21 18.015625 -L 21 47.703125 -L 6.390625 47.703125 -L 6.390625 54.6875 -L 21 54.6875 -L 21 70.21875 -z -" id="DejaVuSansMono-116"/> - <path d="M 12.5 54.6875 -L 35.5 54.6875 -L 35.5 6.984375 -L 53.328125 6.984375 -L 53.328125 0 -L 8.6875 0 -L 8.6875 6.984375 -L 26.515625 6.984375 -L 26.515625 47.703125 -L 12.5 47.703125 -z -M 26.515625 75.984375 -L 35.5 75.984375 -L 35.5 64.59375 -L 26.515625 64.59375 -z -" id="DejaVuSansMono-105"/> - <path d="M 4.890625 54.6875 -L 14.203125 54.6875 -L 30.078125 8.796875 -L 46 54.6875 -L 55.328125 54.6875 -L 35.890625 0 -L 24.3125 0 -z -" id="DejaVuSansMono-118"/> - </defs> - <g transform="translate(145.146967 64.529336)rotate(-43)scale(0.065 -0.065)"> - <use transform="translate(0 0.015625)" xlink:href="#Cmmi10-110"/> - <use transform="translate(60.009766 -16.990625)scale(0.7)" xlink:href="#Cmr10-72"/> - <use transform="translate(118.887109 0.015625)" xlink:href="#DejaVuSansMono-94"/> - <use transform="translate(179.092187 0.015625)" xlink:href="#DejaVuSansMono-69"/> - <use transform="translate(239.297266 0.015625)" xlink:href="#DejaVuSansMono-79"/> - <use transform="translate(299.502344 0.015625)" xlink:href="#DejaVuSansMono-83"/> - <use transform="translate(359.707422 0.015625)" xlink:href="#DejaVuSansMono-95"/> - <use transform="translate(419.9125 0.015625)" xlink:href="#DejaVuSansMono-103"/> - <use transform="translate(480.117578 0.015625)" xlink:href="#DejaVuSansMono-97"/> - <use transform="translate(540.322656 0.015625)" xlink:href="#DejaVuSansMono-109"/> - <use transform="translate(600.527734 0.015625)" xlink:href="#DejaVuSansMono-109"/> - <use transform="translate(660.732813 0.015625)" xlink:href="#DejaVuSansMono-97"/> - <use transform="translate(720.937891 0.015625)" xlink:href="#DejaVuSansMono-95"/> - <use transform="translate(781.142969 0.015625)" xlink:href="#DejaVuSansMono-101"/> - <use transform="translate(841.348047 0.015625)" xlink:href="#DejaVuSansMono-102"/> - <use transform="translate(901.553125 0.015625)" xlink:href="#DejaVuSansMono-102"/> - <use transform="translate(961.758203 0.015625)" xlink:href="#DejaVuSansMono-101"/> - <use transform="translate(1021.963281 0.015625)" xlink:href="#DejaVuSansMono-99"/> - <use transform="translate(1082.168359 0.015625)" xlink:href="#DejaVuSansMono-116"/> - <use transform="translate(1142.373437 0.015625)" xlink:href="#DejaVuSansMono-105"/> - <use transform="translate(1202.578516 0.015625)" xlink:href="#DejaVuSansMono-118"/> - <use transform="translate(1262.783594 0.015625)" xlink:href="#DejaVuSansMono-101"/> - </g> - </g> - <g id="text_13"> - <!-- EOS_density_norm_H_p_cm3 --> - <defs> - <path d="M 41.890625 47.703125 -L 41.890625 75.984375 -L 50.875 75.984375 -L 50.875 0 -L 41.890625 0 -L 41.890625 6.890625 -Q 39.65625 2.828125 35.90625 0.703125 -Q 32.171875 -1.421875 27.296875 -1.421875 -Q 17.390625 -1.421875 11.6875 6.265625 -Q 6 13.96875 6 27.484375 -Q 6 40.828125 11.71875 48.40625 -Q 17.4375 56 27.296875 56 -Q 32.234375 56 35.984375 53.875 -Q 39.75 51.765625 41.890625 47.703125 -z -M 15.484375 27.296875 -Q 15.484375 16.84375 18.796875 11.515625 -Q 22.125 6.203125 28.609375 6.203125 -Q 35.109375 6.203125 38.5 11.5625 -Q 41.890625 16.9375 41.890625 27.296875 -Q 41.890625 37.703125 38.5 43.046875 -Q 35.109375 48.390625 28.609375 48.390625 -Q 22.125 48.390625 18.796875 43.0625 -Q 15.484375 37.75 15.484375 27.296875 -z -" id="DejaVuSansMono-100"/> - <path d="M 51.3125 33.890625 -L 51.3125 0 -L 42.28125 0 -L 42.28125 33.890625 -Q 42.28125 41.265625 39.6875 44.71875 -Q 37.109375 48.1875 31.59375 48.1875 -Q 25.296875 48.1875 21.890625 43.71875 -Q 18.5 39.265625 18.5 30.90625 -L 18.5 0 -L 9.515625 0 -L 9.515625 54.6875 -L 18.5 54.6875 -L 18.5 46.484375 -Q 20.90625 51.171875 25 53.578125 -Q 29.109375 56 34.71875 56 -Q 43.0625 56 47.1875 50.5 -Q 51.3125 45.015625 51.3125 33.890625 -z -" id="DejaVuSansMono-110"/> - <path d="M 47.515625 52.78125 -L 47.515625 44 -Q 43.65625 46.234375 39.75 47.359375 -Q 35.84375 48.484375 31.78125 48.484375 -Q 25.6875 48.484375 22.671875 46.5 -Q 19.671875 44.53125 19.671875 40.484375 -Q 19.671875 36.8125 21.921875 35 -Q 24.171875 33.203125 33.109375 31.5 -L 36.71875 30.8125 -Q 43.40625 29.546875 46.84375 25.734375 -Q 50.296875 21.921875 50.296875 15.828125 -Q 50.296875 7.71875 44.53125 3.140625 -Q 38.765625 -1.421875 28.515625 -1.421875 -Q 24.46875 -1.421875 20.015625 -0.5625 -Q 15.578125 0.296875 10.40625 2 -L 10.40625 11.28125 -Q 15.4375 8.6875 20.015625 7.390625 -Q 24.609375 6.109375 28.71875 6.109375 -Q 34.671875 6.109375 37.9375 8.515625 -Q 41.21875 10.9375 41.21875 15.28125 -Q 41.21875 21.53125 29.25 23.921875 -L 28.859375 24.03125 -L 25.484375 24.703125 -Q 17.71875 26.21875 14.15625 29.8125 -Q 10.59375 33.40625 10.59375 39.59375 -Q 10.59375 47.46875 15.90625 51.734375 -Q 21.234375 56 31.109375 56 -Q 35.5 56 39.546875 55.1875 -Q 43.609375 54.390625 47.515625 52.78125 -z -" id="DejaVuSansMono-115"/> - <path d="M 41.890625 17.578125 -Q 39.65625 11.859375 36.1875 2.546875 -Q 31.34375 -10.359375 29.6875 -13.1875 -Q 27.4375 -17 24.0625 -18.890625 -Q 20.703125 -20.796875 16.21875 -20.796875 -L 8.984375 -20.796875 -L 8.984375 -13.28125 -L 14.3125 -13.28125 -Q 18.265625 -13.28125 20.5 -10.984375 -Q 22.75 -8.6875 26.21875 0.875 -L 5.078125 54.6875 -L 14.59375 54.6875 -L 30.8125 11.921875 -L 46.78125 54.6875 -L 56.296875 54.6875 -z -" id="DejaVuSansMono-121"/> - <path d="M 30.078125 48.390625 -Q 23.25 48.390625 19.734375 43.0625 -Q 16.21875 37.75 16.21875 27.296875 -Q 16.21875 16.890625 19.734375 11.546875 -Q 23.25 6.203125 30.078125 6.203125 -Q 36.96875 6.203125 40.484375 11.546875 -Q 44 16.890625 44 27.296875 -Q 44 37.75 40.484375 43.0625 -Q 36.96875 48.390625 30.078125 48.390625 -z -M 30.078125 56 -Q 41.453125 56 47.484375 48.625 -Q 53.515625 41.265625 53.515625 27.296875 -Q 53.515625 13.28125 47.5 5.921875 -Q 41.5 -1.421875 30.078125 -1.421875 -Q 18.703125 -1.421875 12.6875 5.921875 -Q 6.6875 13.28125 6.6875 27.296875 -Q 6.6875 41.265625 12.6875 48.625 -Q 18.703125 56 30.078125 56 -z -" id="DejaVuSansMono-111"/> - <path d="M 56.390625 43.40625 -Q 53.515625 45.65625 50.53125 46.671875 -Q 47.5625 47.703125 44 47.703125 -Q 35.59375 47.703125 31.140625 42.421875 -Q 26.703125 37.15625 26.703125 27.203125 -L 26.703125 0 -L 17.671875 0 -L 17.671875 54.6875 -L 26.703125 54.6875 -L 26.703125 44 -Q 28.953125 49.8125 33.609375 52.90625 -Q 38.28125 56 44.671875 56 -Q 48 56 50.875 55.171875 -Q 53.765625 54.34375 56.390625 52.59375 -z -" id="DejaVuSansMono-114"/> - <path d="M 6.6875 72.90625 -L 16.609375 72.90625 -L 16.609375 43.015625 -L 43.609375 43.015625 -L 43.609375 72.90625 -L 53.515625 72.90625 -L 53.515625 0 -L 43.609375 0 -L 43.609375 34.71875 -L 16.609375 34.71875 -L 16.609375 0 -L 6.6875 0 -z -" id="DejaVuSansMono-72"/> - <path d="M 18.3125 6.890625 -L 18.3125 -20.796875 -L 9.28125 -20.796875 -L 9.28125 54.6875 -L 18.3125 54.6875 -L 18.3125 47.703125 -Q 20.5625 51.765625 24.296875 53.875 -Q 28.03125 56 32.90625 56 -Q 42.828125 56 48.46875 48.328125 -Q 54.109375 40.671875 54.109375 27.09375 -Q 54.109375 13.765625 48.4375 6.171875 -Q 42.78125 -1.421875 32.90625 -1.421875 -Q 27.9375 -1.421875 24.1875 0.703125 -Q 20.453125 2.828125 18.3125 6.890625 -z -M 44.671875 27.296875 -Q 44.671875 37.75 41.375 43.0625 -Q 38.09375 48.390625 31.59375 48.390625 -Q 25.046875 48.390625 21.671875 43.046875 -Q 18.3125 37.703125 18.3125 27.296875 -Q 18.3125 16.9375 21.671875 11.5625 -Q 25.046875 6.203125 31.59375 6.203125 -Q 38.09375 6.203125 41.375 11.515625 -Q 44.671875 16.84375 44.671875 27.296875 -z -" id="DejaVuSansMono-112"/> - <path d="M 37.890625 39.015625 -Q 45.0625 37.109375 48.875 32.25 -Q 52.6875 27.390625 52.6875 20.125 -Q 52.6875 10.0625 45.921875 4.3125 -Q 39.15625 -1.421875 27.203125 -1.421875 -Q 22.171875 -1.421875 16.9375 -0.484375 -Q 11.71875 0.4375 6.6875 2.203125 -L 6.6875 12.015625 -Q 11.671875 9.421875 16.5 8.15625 -Q 21.34375 6.890625 26.125 6.890625 -Q 34.234375 6.890625 38.578125 10.546875 -Q 42.921875 14.203125 42.921875 21.09375 -Q 42.921875 27.4375 38.578125 31.171875 -Q 34.234375 34.90625 26.8125 34.90625 -L 19.28125 34.90625 -L 19.28125 43.015625 -L 26.8125 43.015625 -Q 33.59375 43.015625 37.40625 45.984375 -Q 41.21875 48.96875 41.21875 54.296875 -Q 41.21875 59.90625 37.671875 62.90625 -Q 34.125 65.921875 27.59375 65.921875 -Q 23.25 65.921875 18.609375 64.9375 -Q 13.96875 63.96875 8.890625 62.015625 -L 8.890625 71.09375 -Q 14.796875 72.65625 19.40625 73.4375 -Q 24.03125 74.21875 27.59375 74.21875 -Q 38.234375 74.21875 44.609375 68.875 -Q 50.984375 63.53125 50.984375 54.6875 -Q 50.984375 48.6875 47.625 44.671875 -Q 44.28125 40.671875 37.890625 39.015625 -z -" id="DejaVuSansMono-51"/> - </defs> - <g transform="translate(144.955236 192.590474)rotate(-90)scale(0.07 -0.07)"> - <use xlink:href="#DejaVuSansMono-69"/> - <use x="60.205078" xlink:href="#DejaVuSansMono-79"/> - <use x="120.410156" xlink:href="#DejaVuSansMono-83"/> - <use x="180.615234" xlink:href="#DejaVuSansMono-95"/> - <use x="240.820312" xlink:href="#DejaVuSansMono-100"/> - <use x="301.025391" xlink:href="#DejaVuSansMono-101"/> - <use x="361.230469" xlink:href="#DejaVuSansMono-110"/> - <use x="421.435547" xlink:href="#DejaVuSansMono-115"/> - <use x="481.640625" xlink:href="#DejaVuSansMono-105"/> - <use x="541.845703" xlink:href="#DejaVuSansMono-116"/> - <use x="602.050781" xlink:href="#DejaVuSansMono-121"/> - <use x="662.255859" xlink:href="#DejaVuSansMono-95"/> - <use x="722.460938" xlink:href="#DejaVuSansMono-110"/> - <use x="782.666016" xlink:href="#DejaVuSansMono-111"/> - <use x="842.871094" xlink:href="#DejaVuSansMono-114"/> - <use x="903.076172" xlink:href="#DejaVuSansMono-109"/> - <use x="963.28125" xlink:href="#DejaVuSansMono-95"/> - <use x="1023.486328" xlink:href="#DejaVuSansMono-72"/> - <use x="1083.691406" xlink:href="#DejaVuSansMono-95"/> - <use x="1143.896484" xlink:href="#DejaVuSansMono-112"/> - <use x="1204.101562" xlink:href="#DejaVuSansMono-95"/> - <use x="1264.306641" xlink:href="#DejaVuSansMono-99"/> - <use x="1324.511719" xlink:href="#DejaVuSansMono-109"/> - <use x="1384.716797" xlink:href="#DejaVuSansMono-51"/> - </g> - </g> - <g id="text_14"> - <!-- EOS_temperature_norm_K --> - <defs> - <path d="M 9.515625 20.703125 -L 9.515625 54.59375 -L 18.5 54.59375 -L 18.5 20.703125 -Q 18.5 13.328125 21.109375 9.859375 -Q 23.734375 6.390625 29.203125 6.390625 -Q 35.546875 6.390625 38.90625 10.859375 -Q 42.28125 15.328125 42.28125 23.6875 -L 42.28125 54.59375 -L 51.3125 54.59375 -L 51.3125 0 -L 42.28125 0 -L 42.28125 8.203125 -Q 39.890625 3.46875 35.765625 1.015625 -Q 31.640625 -1.421875 26.125 -1.421875 -Q 17.71875 -1.421875 13.609375 4.078125 -Q 9.515625 9.578125 9.515625 20.703125 -z -" id="DejaVuSansMono-117"/> - <path d="M 6.6875 72.90625 -L 16.609375 72.90625 -L 16.609375 40.484375 -L 47.40625 72.90625 -L 58.984375 72.90625 -L 30.609375 43.109375 -L 59.8125 0 -L 47.90625 0 -L 24.125 36.53125 -L 16.609375 28.515625 -L 16.609375 0 -L 6.6875 0 -z -" id="DejaVuSansMono-75"/> - </defs> - <g transform="translate(37.862259 67.750649)scale(0.07 -0.07)"> - <use xlink:href="#DejaVuSansMono-69"/> - <use x="60.205078" xlink:href="#DejaVuSansMono-79"/> - <use x="120.410156" xlink:href="#DejaVuSansMono-83"/> - <use x="180.615234" xlink:href="#DejaVuSansMono-95"/> - <use x="240.820312" xlink:href="#DejaVuSansMono-116"/> - <use x="301.025391" xlink:href="#DejaVuSansMono-101"/> - <use x="361.230469" xlink:href="#DejaVuSansMono-109"/> - <use x="421.435547" xlink:href="#DejaVuSansMono-112"/> - <use x="481.640625" xlink:href="#DejaVuSansMono-101"/> - <use x="541.845703" xlink:href="#DejaVuSansMono-114"/> - <use x="602.050781" xlink:href="#DejaVuSansMono-97"/> - <use x="662.255859" xlink:href="#DejaVuSansMono-116"/> - <use x="722.460938" xlink:href="#DejaVuSansMono-117"/> - <use x="782.666016" xlink:href="#DejaVuSansMono-114"/> - <use x="842.871094" xlink:href="#DejaVuSansMono-101"/> - <use x="903.076172" xlink:href="#DejaVuSansMono-95"/> - <use x="963.28125" xlink:href="#DejaVuSansMono-110"/> - <use x="1023.486328" xlink:href="#DejaVuSansMono-111"/> - <use x="1083.691406" xlink:href="#DejaVuSansMono-114"/> - <use x="1143.896484" xlink:href="#DejaVuSansMono-109"/> - <use x="1204.101562" xlink:href="#DejaVuSansMono-95"/> - <use x="1264.306641" xlink:href="#DejaVuSansMono-75"/> - </g> - </g> - </g> - </g> - <defs> - <clipPath id="p70b35b528f"> - <rect height="195.048" width="190.512" x="34.02" y="2.268"/> - </clipPath> - </defs> -</svg> diff --git a/doc/RTD/source/SubgridModels/EAGLE/EAGLE_SF_Z_dep.svg b/doc/RTD/source/SubgridModels/EAGLE/EAGLE_SF_Z_dep.svg deleted file mode 100644 index 5314e6c83b0e394cc1262eb59fbfaf763151923a..0000000000000000000000000000000000000000 --- a/doc/RTD/source/SubgridModels/EAGLE/EAGLE_SF_Z_dep.svg +++ /dev/null @@ -1,2649 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<!-- Created with matplotlib (https://matplotlib.org/) --> -<svg height="226.8pt" version="1.1" viewBox="0 0 226.8 226.8" width="226.8pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <defs> - <style type="text/css"> -*{stroke-linecap:butt;stroke-linejoin:round;} - </style> - </defs> - <g id="figure_1"> - <g id="patch_1"> - <path d="M 0 226.8 -L 226.8 226.8 -L 226.8 0 -L 0 0 -z -" style="fill:#ffffff;"/> - </g> - <g id="axes_1"> - <g id="patch_2"> - <path d="M 34.02 197.316 -L 224.532 197.316 -L 224.532 2.268 -L 34.02 2.268 -z -" style="fill:#ffffff;"/> - </g> - <g id="PathCollection_1"> - <defs> - <path d="M 0 1 -C 0.265203 1 0.51958 0.894634 0.707107 0.707107 -C 0.894634 0.51958 1 0.265203 1 0 -C 1 -0.265203 0.894634 -0.51958 0.707107 -0.707107 -C 0.51958 -0.894634 0.265203 -1 0 -1 -C -0.265203 -1 -0.51958 -0.894634 -0.707107 -0.707107 -C -0.894634 -0.51958 -1 -0.265203 -1 0 -C -1 0.265203 -0.894634 0.51958 -0.707107 0.707107 -C -0.51958 0.894634 -0.265203 1 0 1 -z -" id="mfeca7ee311" style="stroke:#000000;"/> - </defs> - <g clip-path="url(#p23ab05f3c8)"> - <use style="stroke:#000000;" x="151.076832" xlink:href="#mfeca7ee311" y="99.792"/> - </g> - </g> - <g id="matplotlib.axis_1"> - <g id="xtick_1"> - <g id="line2d_1"> - <defs> - <path d="M 0 0 -L 0 3.5 -" id="mf7651b78e9" style="stroke:#000000;stroke-width:0.8;"/> - </defs> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#mf7651b78e9" y="197.316"/> - </g> - </g> - <g id="text_1"> - <!-- $\mathdefault{10^{-7}}$ --> - <defs> - <path d="M 8.90625 57.09375 -L 8.90625 60.203125 -Q 20.90625 60.203125 27.09375 66.59375 -Q 28.796875 66.59375 29.09375 66.1875 -Q 29.40625 65.796875 29.40625 64 -L 29.40625 7.90625 -Q 29.40625 4.90625 30.84375 4 -Q 32.296875 3.09375 38.703125 3.09375 -L 41.90625 3.09375 -L 41.90625 0 -Q 38.40625 0.296875 25.703125 0.296875 -Q 13 0.296875 9.5 0 -L 9.5 3.09375 -L 12.703125 3.09375 -Q 19 3.09375 20.5 4 -Q 22 4.90625 22 7.90625 -L 22 59.703125 -Q 16.796875 57.09375 8.90625 57.09375 -z -" id="CMUSerif-Roman-49"/> - <path d="M 3.90625 32 -Q 3.90625 46.703125 7.59375 54.703125 -Q 12.796875 66.59375 25 66.59375 -Q 27.59375 66.59375 30.296875 65.890625 -Q 33 65.203125 36.453125 62.5 -Q 39.90625 59.796875 42 55.40625 -Q 46 46.90625 46 32 -Q 46 17.40625 42.296875 9.40625 -Q 36.90625 -2.203125 24.90625 -2.203125 -Q 20.40625 -2.203125 15.84375 0.09375 -Q 11.296875 2.40625 8.40625 7.90625 -Q 3.90625 16.203125 3.90625 32 -z -M 12.203125 33.203125 -Q 12.203125 18.09375 13.296875 12.09375 -Q 14.5 5.59375 17.84375 2.796875 -Q 21.203125 0 24.90625 0 -Q 28.90625 0 32.25 3 -Q 35.59375 6 36.59375 12.5 -Q 37.703125 18.90625 37.703125 33.203125 -Q 37.703125 47.09375 36.703125 52.703125 -Q 35.40625 59.203125 31.90625 61.796875 -Q 28.40625 64.40625 24.90625 64.40625 -Q 23.59375 64.40625 22.1875 64 -Q 20.796875 63.59375 18.796875 62.5 -Q 16.796875 61.40625 15.25 58.59375 -Q 13.703125 55.796875 13 51.59375 -Q 12.203125 46.203125 12.203125 33.203125 -z -" id="CMUSerif-Roman-48"/> - <path d="M 1 18.59375 -L 1 24.5 -L 27.59375 24.5 -L 27.59375 18.59375 -z -" id="CMUSerif-Roman-45"/> - <path d="M 5.59375 47 -L 8.90625 67.59375 -L 11.40625 67.59375 -Q 11.703125 66.40625 12.203125 65.84375 -Q 12.703125 65.296875 15.546875 64.84375 -Q 18.40625 64.40625 24.203125 64.40625 -L 48.5 64.40625 -Q 48.5 62.09375 47.59375 60.90625 -L 34.09375 41.90625 -Q 29.796875 35.90625 27.90625 24.796875 -Q 26.796875 17.40625 26.796875 8.40625 -L 26.796875 3.296875 -Q 26.796875 -2.203125 22.1875 -2.203125 -Q 17.59375 -2.203125 17.59375 3.296875 -Q 17.59375 22.40625 29.90625 40.90625 -Q 31.203125 42.796875 36.046875 49.59375 -Q 40.90625 56.40625 41.09375 56.703125 -L 20.40625 56.703125 -Q 11.296875 56.703125 10.59375 56.09375 -Q 9.59375 55.203125 8.09375 47 -z -" id="CMUSerif-Roman-55"/> - </defs> - <g transform="translate(25.92 211.256625)scale(0.1 -0.1)"> - <use transform="translate(0 0.51875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.51875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.684375)scale(0.7)" xlink:href="#CMUSerif-Roman-45"/> - <use transform="translate(124.064102 30.684375)scale(0.7)" xlink:href="#CMUSerif-Roman-55"/> - </g> - </g> - </g> - <g id="xtick_2"> - <g id="line2d_2"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="88.452" xlink:href="#mf7651b78e9" y="197.316"/> - </g> - </g> - <g id="text_2"> - <!-- $\mathdefault{10^{-5}}$ --> - <defs> - <path d="M 5 16.09375 -Q 5 19.09375 6.59375 20.25 -Q 8.203125 21.40625 9.90625 21.40625 -Q 12.203125 21.40625 13.546875 19.953125 -Q 14.90625 18.5 14.90625 16.5 -Q 14.90625 14.5 13.546875 13.046875 -Q 12.203125 11.59375 9.90625 11.59375 -Q 8.796875 11.59375 8.203125 11.796875 -Q 9.5 7.203125 13.546875 3.890625 -Q 17.59375 0.59375 22.90625 0.59375 -Q 29.59375 0.59375 33.59375 7.09375 -Q 36 11.296875 36 20.796875 -Q 36 29.203125 34.203125 33.40625 -Q 31.40625 39.796875 25.703125 39.796875 -Q 17.59375 39.796875 12.796875 32.796875 -Q 12.203125 31.90625 11.5 31.90625 -Q 10.5 31.90625 10.296875 32.453125 -Q 10.09375 33 10.09375 34.5 -L 10.09375 64.09375 -Q 10.09375 66.5 11.09375 66.5 -Q 11.5 66.5 12.296875 66.203125 -Q 18.59375 63.40625 25.59375 63.40625 -Q 32.796875 63.40625 39.203125 66.296875 -Q 39.703125 66.59375 40 66.59375 -Q 41 66.59375 41 65.5 -Q 41 65.09375 40.203125 63.9375 -Q 39.40625 62.796875 37.703125 61.296875 -Q 36 59.796875 33.796875 58.390625 -Q 31.59375 57 28.390625 56.046875 -Q 25.203125 55.09375 21.703125 55.09375 -Q 17.5 55.09375 13.203125 56.40625 -L 13.203125 36.90625 -Q 18.40625 42 25.90625 42 -Q 33.90625 42 39.40625 35.546875 -Q 44.90625 29.09375 44.90625 20.09375 -Q 44.90625 10.703125 38.40625 4.25 -Q 31.90625 -2.203125 23.09375 -2.203125 -Q 15.09375 -2.203125 10.046875 3.5 -Q 5 9.203125 5 16.09375 -z -" id="CMUSerif-Roman-53"/> - </defs> - <g transform="translate(80.352 211.256625)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-45"/> - <use transform="translate(124.064102 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-53"/> - </g> - </g> - </g> - <g id="xtick_3"> - <g id="line2d_3"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="142.884" xlink:href="#mf7651b78e9" y="197.316"/> - </g> - </g> - <g id="text_3"> - <!-- $\mathdefault{10^{-3}}$ --> - <defs> - <path d="M 4.203125 13.5 -Q 4.203125 16.5 5.890625 17.890625 -Q 7.59375 19.296875 9.796875 19.296875 -Q 12.09375 19.296875 13.75 17.796875 -Q 15.40625 16.296875 15.40625 13.703125 -Q 15.40625 10.90625 13.453125 9.34375 -Q 11.5 7.796875 8.796875 8.203125 -Q 11.203125 4.203125 15.59375 2.390625 -Q 20 0.59375 24.09375 0.59375 -Q 28.40625 0.59375 31.90625 4.296875 -Q 35.40625 8 35.40625 17.09375 -Q 35.40625 24.796875 32.40625 29.25 -Q 29.40625 33.703125 23.5 33.703125 -L 19.09375 33.703125 -Q 17.59375 33.703125 17.140625 33.84375 -Q 16.703125 34 16.703125 34.796875 -Q 16.703125 35.796875 18.203125 36 -Q 19.703125 36 22.09375 36.296875 -Q 27.90625 36.5 31 41.5 -Q 33.796875 46.203125 33.796875 52.90625 -Q 33.796875 59 30.890625 61.546875 -Q 28 64.09375 24.203125 64.09375 -Q 20.703125 64.09375 16.84375 62.640625 -Q 13 61.203125 10.90625 57.90625 -Q 17.09375 57.90625 17.09375 52.90625 -Q 17.09375 50.703125 15.6875 49.25 -Q 14.296875 47.796875 12 47.796875 -Q 9.796875 47.796875 8.34375 49.1875 -Q 6.90625 50.59375 6.90625 53 -Q 6.90625 58.703125 12 62.640625 -Q 17.09375 66.59375 24.59375 66.59375 -Q 32 66.59375 37.5 62.6875 -Q 43 58.796875 43 52.796875 -Q 43 46.90625 39.09375 42.046875 -Q 35.203125 37.203125 29 35.203125 -Q 36.59375 33.703125 41.140625 28.546875 -Q 45.703125 23.40625 45.703125 17.09375 -Q 45.703125 9.296875 39.546875 3.546875 -Q 33.40625 -2.203125 24.40625 -2.203125 -Q 16.09375 -2.203125 10.140625 2.296875 -Q 4.203125 6.796875 4.203125 13.5 -z -" id="CMUSerif-Roman-51"/> - </defs> - <g transform="translate(134.784 211.256625)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-45"/> - <use transform="translate(124.064102 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-51"/> - </g> - </g> - </g> - <g id="xtick_4"> - <g id="line2d_4"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="197.316" xlink:href="#mf7651b78e9" y="197.316"/> - </g> - </g> - <g id="text_4"> - <!-- $\mathdefault{10^{-1}}$ --> - <g transform="translate(189.216 211.256625)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-45"/> - <use transform="translate(124.064102 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-49"/> - </g> - </g> - </g> - <g id="text_5"> - <!-- Metallicity (metal mass fraction) $Z$ [-] --> - <defs> - <path d="M 3.703125 0 -L 3.703125 3.09375 -Q 7.296875 3.09375 9.59375 3.796875 -Q 11.90625 4.5 12.75 5.84375 -Q 13.59375 7.203125 13.796875 8.09375 -Q 14 9 14 10.5 -L 14 60.5 -Q 14 63.40625 12.75 64.296875 -Q 11.5 65.203125 6.09375 65.203125 -L 3.703125 65.203125 -L 3.703125 68.296875 -L 20.59375 68.296875 -Q 22.40625 68.296875 22.90625 68 -Q 23.40625 67.703125 24.09375 66.09375 -L 45.796875 10.09375 -L 67.703125 66.40625 -Q 68.203125 67.796875 68.640625 68.046875 -Q 69.09375 68.296875 71 68.296875 -L 87.90625 68.296875 -L 87.90625 65.203125 -L 85.5 65.203125 -Q 80.09375 65.203125 78.84375 64.296875 -Q 77.59375 63.40625 77.59375 60.5 -L 77.59375 7.796875 -Q 77.59375 4.90625 78.84375 4 -Q 80.09375 3.09375 85.5 3.09375 -L 87.90625 3.09375 -L 87.90625 0 -Q 84.203125 0.296875 73.59375 0.296875 -Q 62.90625 0.296875 59.203125 0 -L 59.203125 3.09375 -L 61.59375 3.09375 -Q 67 3.09375 68.25 4 -Q 69.5 4.90625 69.5 7.796875 -L 69.5 65.203125 -L 69.40625 65.203125 -L 44.796875 1.90625 -Q 44.09375 0 43 0 -Q 41.796875 0 41 2.203125 -L 16.90625 64.40625 -L 16.796875 64.40625 -L 16.796875 10.5 -Q 16.796875 9 17 8.09375 -Q 17.203125 7.203125 18.046875 5.84375 -Q 18.90625 4.5 21.203125 3.796875 -Q 23.5 3.09375 27.09375 3.09375 -L 27.09375 0 -Q 16.59375 0.296875 15.390625 0.296875 -Q 14.203125 0.296875 3.703125 0 -z -" id="CMUSerif-Roman-77"/> - <path d="M 2.796875 22 -Q 2.796875 31.40625 8.84375 38.09375 -Q 14.90625 44.796875 23.59375 44.796875 -Q 32.40625 44.796875 36.953125 39.09375 -Q 41.5 33.40625 41.5 25.203125 -Q 41.5 23.703125 41.09375 23.390625 -Q 40.703125 23.09375 39 23.09375 -L 11.09375 23.09375 -Q 11.09375 12.90625 14.09375 8.09375 -Q 18.296875 1.40625 25.40625 1.40625 -Q 26.40625 1.40625 27.546875 1.59375 -Q 28.703125 1.796875 31.09375 2.640625 -Q 33.5 3.5 35.59375 5.796875 -Q 37.703125 8.09375 38.90625 11.703125 -Q 39.203125 13.09375 40.203125 13.09375 -Q 41.5 13.09375 41.5 11.90625 -Q 41.5 11 40.546875 9.046875 -Q 39.59375 7.09375 37.796875 4.75 -Q 36 2.40625 32.5 0.65625 -Q 29 -1.09375 24.796875 -1.09375 -Q 16 -1.09375 9.390625 5.546875 -Q 2.796875 12.203125 2.796875 22 -z -M 11.203125 25.203125 -L 34.90625 25.203125 -Q 34.90625 27.296875 34.546875 29.640625 -Q 34.203125 32 33.140625 35.25 -Q 32.09375 38.5 29.640625 40.546875 -Q 27.203125 42.59375 23.59375 42.59375 -Q 22 42.59375 20.25 41.890625 -Q 18.5 41.203125 16.390625 39.546875 -Q 14.296875 37.90625 12.84375 34.15625 -Q 11.40625 30.40625 11.203125 25.203125 -z -" id="CMUSerif-Roman-101"/> - <path d="M 1.90625 40 -L 1.90625 42.203125 -Q 6.5 42.40625 9.546875 45.65625 -Q 12.59375 48.90625 13.640625 52.90625 -Q 14.703125 56.90625 14.796875 61.5 -L 17.296875 61.5 -L 17.296875 43.09375 -L 31.59375 43.09375 -L 31.59375 40 -L 17.296875 40 -L 17.296875 12.203125 -Q 17.296875 1.40625 24 1.40625 -Q 26.90625 1.40625 28.796875 4.34375 -Q 30.703125 7.296875 30.703125 12.59375 -L 30.703125 18.09375 -L 33.203125 18.09375 -L 33.203125 12.40625 -Q 33.203125 7 30.703125 2.953125 -Q 28.203125 -1.09375 23.296875 -1.09375 -Q 21.5 -1.09375 19.703125 -0.640625 -Q 17.90625 -0.203125 15.59375 1 -Q 13.296875 2.203125 11.84375 5.140625 -Q 10.40625 8.09375 10.40625 12.40625 -L 10.40625 40 -z -" id="CMUSerif-Roman-116"/> - <path d="M 4.203125 9.5 -Q 4.203125 18 14.203125 22.5 -Q 20.203125 25.40625 32.59375 26.09375 -L 32.59375 29.796875 -Q 32.59375 36 29.34375 39.296875 -Q 26.09375 42.59375 22 42.59375 -Q 14.703125 42.59375 11.203125 38 -Q 14.203125 37.90625 15.25 36.40625 -Q 16.296875 34.90625 16.296875 33.40625 -Q 16.296875 31.40625 15.046875 30.09375 -Q 13.796875 28.796875 11.703125 28.796875 -Q 9.703125 28.796875 8.390625 30.046875 -Q 7.09375 31.296875 7.09375 33.5 -Q 7.09375 38.40625 11.5 41.59375 -Q 15.90625 44.796875 22.203125 44.796875 -Q 30.40625 44.796875 35.90625 39.296875 -Q 37.59375 37.59375 38.4375 35.390625 -Q 39.296875 33.203125 39.390625 31.75 -Q 39.5 30.296875 39.5 27.5 -L 39.5 7.5 -Q 39.5 6.90625 39.703125 5.953125 -Q 39.90625 5 40.796875 3.75 -Q 41.703125 2.5 43.203125 2.5 -Q 46.796875 2.5 46.796875 8.90625 -L 46.796875 14.5 -L 49.296875 14.5 -L 49.296875 8.90625 -Q 49.296875 3.59375 46.5 1.5 -Q 43.703125 -0.59375 41.09375 -0.59375 -Q 37.796875 -0.59375 35.6875 1.84375 -Q 33.59375 4.296875 33.296875 7.59375 -Q 31.796875 3.796875 28.34375 1.34375 -Q 24.90625 -1.09375 20.203125 -1.09375 -Q 16.59375 -1.09375 13.1875 -0.1875 -Q 9.796875 0.703125 7 3.203125 -Q 4.203125 5.703125 4.203125 9.5 -z -M 11.90625 9.59375 -Q 11.90625 5.90625 14.546875 3.5 -Q 17.203125 1.09375 20.90625 1.09375 -Q 25.09375 1.09375 28.84375 4.34375 -Q 32.59375 7.59375 32.59375 14 -L 32.59375 24 -Q 21.5 23.59375 16.703125 19.1875 -Q 11.90625 14.796875 11.90625 9.59375 -z -" id="CMUSerif-Roman-97"/> - <path d="M 3.296875 0 -L 3.296875 3.09375 -Q 8.59375 3.09375 9.84375 3.75 -Q 11.09375 4.40625 11.09375 7.59375 -L 11.09375 59.59375 -Q 11.09375 63.296875 9.796875 64.25 -Q 8.5 65.203125 3.296875 65.203125 -L 3.296875 68.296875 -L 17.703125 69.40625 -L 17.703125 7.59375 -Q 17.703125 4.40625 18.953125 3.75 -Q 20.203125 3.09375 25.5 3.09375 -L 25.5 0 -Q 24.296875 0 21.75 0.09375 -Q 19.203125 0.203125 17.34375 0.25 -Q 15.5 0.296875 14.40625 0.296875 -Q 13.203125 0.296875 3.296875 0 -z -" id="CMUSerif-Roman-108"/> - <path d="M 3.296875 0 -L 3.296875 3.09375 -Q 8.59375 3.09375 9.84375 3.75 -Q 11.09375 4.40625 11.09375 7.59375 -L 11.09375 34.5 -Q 11.09375 38.203125 9.84375 39.09375 -Q 8.59375 40 3.703125 40 -L 3.703125 43.09375 -L 17.703125 44.203125 -L 17.703125 7.5 -Q 17.703125 4.5 18.75 3.796875 -Q 19.796875 3.09375 24.703125 3.09375 -L 24.703125 0 -Q 14.5 0.296875 14.296875 0.296875 -Q 12.90625 0.296875 3.296875 0 -z -M 7.5 61.59375 -Q 7.5 63.59375 9.046875 65.25 -Q 10.59375 66.90625 12.796875 66.90625 -Q 15 66.90625 16.546875 65.40625 -Q 18.09375 63.90625 18.09375 61.59375 -Q 18.09375 59.296875 16.546875 57.796875 -Q 15 56.296875 12.796875 56.296875 -Q 10.5 56.296875 9 57.890625 -Q 7.5 59.5 7.5 61.59375 -z -" id="CMUSerif-Roman-105"/> - <path d="M 16.09375 -1.09375 -Q 3.40625 12.09375 3.40625 21.59375 -Q 3.40625 31.09375 9.65625 37.9375 -Q 15.90625 44.796875 25.09375 44.796875 -Q 31.203125 44.796875 35.796875 41.890625 -Q 40.40625 39 40.40625 34.09375 -Q 40.40625 31.90625 39.09375 30.65625 -Q 37.796875 29.40625 35.796875 29.40625 -Q 33.703125 29.40625 32.453125 30.703125 -Q 31.203125 32 31.203125 34 -Q 31.203125 34.90625 31.5 35.75 -Q 31.796875 36.59375 32.890625 37.546875 -Q 34 38.5 35.90625 38.59375 -Q 32.296875 42.296875 25.203125 42.296875 -Q 20.09375 42.296875 15.890625 37.5 -Q 11.703125 32.703125 11.703125 21.796875 -Q 11.703125 16.09375 13.09375 11.890625 -Q 14.5 7.703125 16.796875 5.546875 -Q 19.09375 3.40625 21.34375 2.40625 -Q 23.59375 1.40625 25.796875 1.40625 -Q 35.59375 1.40625 38.90625 11.90625 -Q 39.203125 12.90625 40.203125 12.90625 -Q 41.5 12.90625 41.5 11.90625 -Q 41.5 11.40625 41.09375 10.15625 -Q 40.703125 8.90625 39.5 6.90625 -Q 38.296875 4.90625 36.546875 3.15625 -Q 34.796875 1.40625 31.75 0.15625 -Q 28.703125 -1.09375 24.90625 -1.09375 -Q 16.09375 -1.09375 3.40625 12.09375 -z -" id="CMUSerif-Roman-99"/> - <path d="M 1.90625 -12.40625 -Q 1.90625 -10.296875 3.15625 -9.1875 -Q 4.40625 -8.09375 6.09375 -8.09375 -Q 7.90625 -8.09375 9.09375 -9.25 -Q 10.296875 -10.40625 10.296875 -12.296875 -Q 10.296875 -16 6.40625 -16.5 -Q 8.296875 -18.296875 11.09375 -18.296875 -Q 14.09375 -18.296875 16.5 -16.09375 -Q 18.90625 -13.90625 19.953125 -11.796875 -Q 21 -9.703125 22.5 -5.90625 -Q 23.90625 -2.90625 25 0 -L 10 36.5 -Q 9 38.90625 7.5 39.453125 -Q 6 40 1.90625 40 -L 1.90625 43.09375 -Q 6.40625 42.796875 11.59375 42.796875 -Q 14.703125 42.796875 22.5 43.09375 -L 22.5 40 -Q 16.90625 40 16.90625 37.40625 -Q 16.90625 37.09375 17.5 35.59375 -L 28.59375 8.703125 -L 38.703125 33.296875 -Q 39.296875 34.703125 39.296875 35.703125 -Q 39.296875 39.796875 34.59375 40 -L 34.59375 43.09375 -Q 41.203125 42.796875 43.296875 42.796875 -Q 47.40625 42.796875 50.796875 43.09375 -L 50.796875 40 -Q 44.09375 40 41.5 33.59375 -L 23.90625 -9.09375 -Q 19.09375 -20.5 11.09375 -20.5 -Q 7.296875 -20.5 4.59375 -18.140625 -Q 1.90625 -15.796875 1.90625 -12.40625 -z -" id="CMUSerif-Roman-121"/> - <path id="CMUSerif-Roman-32"/> - <path d="M 9.90625 25 -Q 9.90625 41.90625 16.203125 55.5 -Q 18.90625 61.203125 22.65625 66 -Q 26.40625 70.796875 28.90625 72.890625 -Q 31.40625 75 32.09375 75 -Q 33.09375 75 33.09375 74 -Q 33.09375 73.5 31.796875 72.296875 -Q 15.703125 55.90625 15.703125 25 -Q 15.703125 -6 31.40625 -21.796875 -Q 33.09375 -23.5 33.09375 -24 -Q 33.09375 -25 32.09375 -25 -Q 31.40625 -25 29 -23 -Q 26.59375 -21 22.890625 -16.390625 -Q 19.203125 -11.796875 16.5 -6.203125 -Q 9.90625 7.40625 9.90625 25 -z -" id="CMUSerif-Roman-40"/> - <path d="M 3.203125 0 -L 3.203125 3.09375 -Q 8.5 3.09375 9.75 3.75 -Q 11 4.40625 11 7.59375 -L 11 34.40625 -Q 11 38.09375 9.703125 39.046875 -Q 8.40625 40 3.203125 40 -L 3.203125 43.09375 -L 17.296875 44.203125 -L 17.296875 33.703125 -Q 22 44.203125 32.09375 44.203125 -Q 43.796875 44.203125 45.40625 34.40625 -Q 47.09375 38.203125 50.6875 41.203125 -Q 54.296875 44.203125 59.90625 44.203125 -Q 67.40625 44.203125 70.40625 40.5 -Q 72.59375 38 73.046875 35.203125 -Q 73.5 32.40625 73.5 25.203125 -L 73.5 6.09375 -Q 73.59375 4 75.1875 3.546875 -Q 76.796875 3.09375 81.296875 3.09375 -L 81.296875 0 -Q 71.09375 0.296875 70.09375 0.296875 -Q 69.296875 0.296875 58.796875 0 -L 58.796875 3.09375 -Q 64.09375 3.09375 65.34375 3.75 -Q 66.59375 4.40625 66.59375 7.59375 -L 66.59375 30.90625 -Q 66.59375 36 65.046875 39 -Q 63.5 42 59.203125 42 -Q 54 42 49.84375 37.640625 -Q 45.703125 33.296875 45.703125 26 -L 45.703125 7.59375 -Q 45.703125 4.40625 46.953125 3.75 -Q 48.203125 3.09375 53.5 3.09375 -L 53.5 0 -Q 43.296875 0.296875 42.296875 0.296875 -Q 41.5 0.296875 31 0 -L 31 3.09375 -Q 36.296875 3.09375 37.546875 3.75 -Q 38.796875 4.40625 38.796875 7.59375 -L 38.796875 30.90625 -Q 38.796875 36 37.25 39 -Q 35.703125 42 31.40625 42 -Q 26.203125 42 22.046875 37.640625 -Q 17.90625 33.296875 17.90625 26 -L 17.90625 7.59375 -Q 17.90625 4.40625 19.15625 3.75 -Q 20.40625 3.09375 25.703125 3.09375 -L 25.703125 0 -Q 15.5 0.296875 14.5 0.296875 -Q 13.703125 0.296875 3.203125 0 -z -" id="CMUSerif-Roman-109"/> - <path d="M 3.296875 1.296875 -L 3.296875 14.5 -Q 3.296875 15.59375 3.34375 16 -Q 3.40625 16.40625 3.703125 16.703125 -Q 4 17 4.59375 17 -Q 5.296875 17 5.546875 16.703125 -Q 5.796875 16.40625 6 15.296875 -Q 7.5 8.40625 10.75 4.75 -Q 14 1.09375 19.90625 1.09375 -Q 25.5 1.09375 28.34375 3.59375 -Q 31.203125 6.09375 31.203125 10.203125 -Q 31.203125 17.5 20.796875 19.40625 -Q 14.796875 20.59375 12.296875 21.390625 -Q 9.796875 22.203125 7.59375 24 -Q 3.296875 27.5 3.296875 32.5 -Q 3.296875 37.5 7.09375 41.140625 -Q 10.90625 44.796875 19.296875 44.796875 -Q 24.90625 44.796875 28.703125 42 -Q 29.796875 42.90625 30.40625 43.59375 -Q 31.703125 44.796875 32.40625 44.796875 -Q 33.203125 44.796875 33.34375 44.296875 -Q 33.5 43.796875 33.5 42.40625 -L 33.5 32.296875 -Q 33.5 31.203125 33.453125 30.796875 -Q 33.40625 30.40625 33.09375 30.15625 -Q 32.796875 29.90625 32.203125 29.90625 -Q 31.09375 29.90625 31 30.796875 -Q 30.203125 42.90625 19.296875 42.90625 -Q 13.40625 42.90625 10.75 40.65625 -Q 8.09375 38.40625 8.09375 35.296875 -Q 8.09375 33.59375 8.890625 32.296875 -Q 9.703125 31 10.75 30.25 -Q 11.796875 29.5 13.75 28.796875 -Q 15.703125 28.09375 16.890625 27.84375 -Q 18.09375 27.59375 20.40625 27.09375 -Q 28.40625 25.59375 31.796875 22.296875 -Q 36 18.09375 36 12.796875 -Q 36 6.90625 32 2.90625 -Q 28 -1.09375 19.90625 -1.09375 -Q 13.40625 -1.09375 8.90625 3.203125 -Q 8.296875 2.59375 7.84375 2.09375 -Q 7.40625 1.59375 7.25 1.390625 -Q 7.09375 1.203125 7.046875 1.09375 -Q 7 1 6.90625 0.90625 -Q 4.90625 -1.09375 4.40625 -1.09375 -Q 3.59375 -1.09375 3.4375 -0.59375 -Q 3.296875 -0.09375 3.296875 1.296875 -z -" id="CMUSerif-Roman-115"/> - <path d="M 3.296875 40 -L 3.296875 43.09375 -L 11.203125 43.09375 -L 11.203125 54.59375 -Q 11.203125 62 16 66.25 -Q 20.796875 70.5 26.703125 70.5 -Q 30.59375 70.5 33.140625 68.390625 -Q 35.703125 66.296875 35.703125 63.5 -Q 35.703125 61.59375 34.546875 60.34375 -Q 33.40625 59.09375 31.296875 59.09375 -Q 29.296875 59.09375 28.140625 60.34375 -Q 27 61.59375 27 63.40625 -Q 27 66.59375 30 67.59375 -Q 28.5 68.296875 26.703125 68.296875 -Q 23.09375 68.296875 20.296875 64.59375 -Q 17.5 60.90625 17.5 54.703125 -L 17.5 43.09375 -L 29.203125 43.09375 -L 29.203125 40 -L 17.796875 40 -L 17.796875 7.796875 -Q 17.796875 4.90625 19 4 -Q 20.203125 3.09375 25.40625 3.09375 -L 27.5 3.09375 -L 27.5 0 -Q 23.5 0.296875 14.796875 0.296875 -Q 13.59375 0.296875 11.6875 0.25 -Q 9.796875 0.203125 7.296875 0.09375 -Q 4.796875 0 3.40625 0 -L 3.40625 3.09375 -Q 8.703125 3.09375 9.953125 3.75 -Q 11.203125 4.40625 11.203125 7.59375 -L 11.203125 40 -z -" id="CMUSerif-Roman-102"/> - <path d="M 2.796875 0 -L 2.796875 3.09375 -Q 8.09375 3.09375 9.34375 3.75 -Q 10.59375 4.40625 10.59375 7.59375 -L 10.59375 34.40625 -Q 10.59375 38.09375 9.296875 39.046875 -Q 8 40 2.796875 40 -L 2.796875 43.09375 -L 16.703125 44.203125 -L 16.703125 33.203125 -Q 18.09375 37.5 21.09375 40.84375 -Q 24.09375 44.203125 29 44.203125 -Q 32.203125 44.203125 34.296875 42.390625 -Q 36.40625 40.59375 36.40625 38.09375 -Q 36.40625 35.90625 35.046875 34.796875 -Q 33.703125 33.703125 32.09375 33.703125 -Q 30.296875 33.703125 29.046875 34.84375 -Q 27.796875 36 27.796875 38 -Q 27.796875 39.203125 28.34375 40.140625 -Q 28.90625 41.09375 29.34375 41.4375 -Q 29.796875 41.796875 30.09375 41.90625 -Q 29.90625 42 29 42 -Q 23.5 42 20.34375 36.5 -Q 17.203125 31 17.203125 23.203125 -L 17.203125 7.796875 -Q 17.203125 4.90625 18.390625 4 -Q 19.59375 3.09375 24.796875 3.09375 -L 26.90625 3.09375 -L 26.90625 0 -Q 22.90625 0.296875 14.203125 0.296875 -Q 13 0.296875 11.09375 0.25 -Q 9.203125 0.203125 6.703125 0.09375 -Q 4.203125 0 2.796875 0 -z -" id="CMUSerif-Roman-114"/> - <path d="M 16 -1.09375 -Q 2.796875 11.90625 2.796875 21.40625 -Q 2.796875 30.90625 9.25 37.84375 -Q 15.703125 44.796875 25 44.796875 -Q 34.09375 44.796875 40.59375 37.890625 -Q 47.09375 31 47.09375 21.40625 -Q 47.09375 12 40.546875 5.453125 -Q 34 -1.09375 24.90625 -1.09375 -Q 16 -1.09375 2.796875 11.90625 -z -M 11.09375 22.203125 -Q 11.09375 12.5 13.59375 8.09375 -Q 17.5 1.40625 25 1.40625 -Q 28.703125 1.40625 31.796875 3.40625 -Q 34.90625 5.40625 36.59375 8.796875 -Q 38.796875 13.203125 38.796875 22.203125 -Q 38.796875 31.796875 36.203125 36.09375 -Q 32.296875 42.59375 24.90625 42.59375 -Q 21.703125 42.59375 18.546875 40.890625 -Q 15.40625 39.203125 13.5 35.90625 -Q 11.09375 31.5 11.09375 22.203125 -z -" id="CMUSerif-Roman-111"/> - <path d="M 3.203125 0 -L 3.203125 3.09375 -Q 8.5 3.09375 9.75 3.75 -Q 11 4.40625 11 7.59375 -L 11 34.40625 -Q 11 38.09375 9.703125 39.046875 -Q 8.40625 40 3.203125 40 -L 3.203125 43.09375 -L 17.296875 44.203125 -L 17.296875 33.703125 -Q 22 44.203125 32.09375 44.203125 -Q 39.59375 44.203125 42.59375 40.5 -Q 44.796875 38 45.25 35.203125 -Q 45.703125 32.40625 45.703125 25.203125 -L 45.703125 6.09375 -Q 45.796875 4 47.390625 3.546875 -Q 49 3.09375 53.5 3.09375 -L 53.5 0 -Q 43.296875 0.296875 42.296875 0.296875 -Q 41.5 0.296875 31 0 -L 31 3.09375 -Q 36.296875 3.09375 37.546875 3.75 -Q 38.796875 4.40625 38.796875 7.59375 -L 38.796875 30.90625 -Q 38.796875 36 37.25 39 -Q 35.703125 42 31.40625 42 -Q 26.203125 42 22.046875 37.640625 -Q 17.90625 33.296875 17.90625 26 -L 17.90625 7.59375 -Q 17.90625 4.40625 19.15625 3.75 -Q 20.40625 3.09375 25.703125 3.09375 -L 25.703125 0 -Q 15.5 0.296875 14.5 0.296875 -Q 13.703125 0.296875 3.203125 0 -z -" id="CMUSerif-Roman-110"/> - <path d="M 5.703125 -24 -Q 5.703125 -23.5 7 -22.296875 -Q 23.09375 -5.90625 23.09375 25 -Q 23.09375 56 7.59375 71.703125 -Q 5.703125 73.5 5.703125 74 -Q 5.703125 75 6.703125 75 -Q 7.40625 75 9.796875 73 -Q 12.203125 71 15.890625 66.390625 -Q 19.59375 61.796875 22.296875 56.203125 -Q 28.90625 42.59375 28.90625 25 -Q 28.90625 8.09375 22.59375 -5.5 -Q 19.90625 -11.203125 16.15625 -16 -Q 12.40625 -20.796875 9.90625 -22.890625 -Q 7.40625 -25 6.703125 -25 -Q 5.703125 -25 5.703125 -24 -z -" id="CMUSerif-Roman-41"/> - <path d="M 5.8125 0.78125 -Q 5.8125 2.25 6.5 3.078125 -L 61.53125 64.796875 -L 46.78125 64.796875 -Q 39.453125 64.796875 34.640625 63.0625 -Q 29.828125 61.328125 26.671875 57.296875 -Q 23.53125 53.265625 21.390625 46.296875 -Q 21.1875 45.40625 20.40625 45.40625 -L 19.484375 45.40625 -Q 18.5 45.40625 18.5 46.6875 -L 24.8125 67.390625 -Q 25 68.3125 25.78125 68.3125 -L 71.390625 68.3125 -Q 72.21875 68.3125 72.21875 67.484375 -Q 72.21875 66.015625 71.578125 65.375 -L 16.796875 3.8125 -L 31.984375 3.8125 -Q 40.828125 3.8125 45.875 5.984375 -Q 50.921875 8.15625 53.875 12.84375 -Q 56.84375 17.53125 59.625 26.21875 -Q 59.71875 26.5625 59.984375 26.828125 -Q 60.25 27.09375 60.59375 27.09375 -L 61.53125 27.09375 -Q 62.5 27.09375 62.5 25.78125 -L 54.59375 0.875 -Q 54.15625 0 53.609375 0 -L 6.6875 0 -Q 5.8125 0 5.8125 0.78125 -z -" id="Cmmi10-90"/> - <path d="M 10.40625 -25 -L 10.40625 75 -L 25.5 75 -L 25.5 72.703125 -L 17.09375 72.703125 -L 17.09375 -22.703125 -L 25.5 -22.703125 -L 25.5 -25 -z -" id="CMUSerif-Roman-91"/> - <path d="M 2.09375 -22.703125 -L 10.5 -22.703125 -L 10.5 72.703125 -L 2.09375 72.703125 -L 2.09375 75 -L 17.203125 75 -L 17.203125 -25 -L 2.09375 -25 -z -" id="CMUSerif-Roman-93"/> - </defs> - <g transform="translate(45.976 222.69725)scale(0.1 -0.1)"> - <use xlink:href="#CMUSerif-Roman-77"/> - <use transform="translate(91.599991 0)" xlink:href="#CMUSerif-Roman-101"/> - <use transform="translate(135.999985 0)" xlink:href="#CMUSerif-Roman-116"/> - <use transform="translate(174.799973 0)" xlink:href="#CMUSerif-Roman-97"/> - <use transform="translate(224.799957 0)" xlink:href="#CMUSerif-Roman-108"/> - <use transform="translate(252.499954 0)" xlink:href="#CMUSerif-Roman-108"/> - <use transform="translate(280.199951 0)" xlink:href="#CMUSerif-Roman-105"/> - <use transform="translate(307.899948 0)" xlink:href="#CMUSerif-Roman-99"/> - <use transform="translate(352.299942 0)" xlink:href="#CMUSerif-Roman-105"/> - <use transform="translate(379.999939 0)" xlink:href="#CMUSerif-Roman-116"/> - <use transform="translate(418.799927 0)" xlink:href="#CMUSerif-Roman-121"/> - <use transform="translate(471.499924 0)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(504.799911 0)" xlink:href="#CMUSerif-Roman-40"/> - <use transform="translate(543.599899 0)" xlink:href="#CMUSerif-Roman-109"/> - <use transform="translate(626.899887 0)" xlink:href="#CMUSerif-Roman-101"/> - <use transform="translate(671.299881 0)" xlink:href="#CMUSerif-Roman-116"/> - <use transform="translate(710.099869 0)" xlink:href="#CMUSerif-Roman-97"/> - <use transform="translate(760.099854 0)" xlink:href="#CMUSerif-Roman-108"/> - <use transform="translate(787.79985 0)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(821.099838 0)" xlink:href="#CMUSerif-Roman-109"/> - <use transform="translate(904.399826 0)" xlink:href="#CMUSerif-Roman-97"/> - <use transform="translate(954.399811 0)" xlink:href="#CMUSerif-Roman-115"/> - <use transform="translate(993.799805 0)" xlink:href="#CMUSerif-Roman-115"/> - <use transform="translate(1033.199799 0)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(1066.499786 0)" xlink:href="#CMUSerif-Roman-102"/> - <use transform="translate(1096.999771 0)" xlink:href="#CMUSerif-Roman-114"/> - <use transform="translate(1136.099762 0)" xlink:href="#CMUSerif-Roman-97"/> - <use transform="translate(1186.099747 0)" xlink:href="#CMUSerif-Roman-99"/> - <use transform="translate(1230.499741 0)" xlink:href="#CMUSerif-Roman-116"/> - <use transform="translate(1269.299728 0)" xlink:href="#CMUSerif-Roman-105"/> - <use transform="translate(1296.999725 0)" xlink:href="#CMUSerif-Roman-111"/> - <use transform="translate(1346.99971 0)" xlink:href="#CMUSerif-Roman-110"/> - <use transform="translate(1402.499695 0)" xlink:href="#CMUSerif-Roman-41"/> - <use transform="translate(1441.299683 0)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(1474.59967 0)" xlink:href="#Cmmi10-90"/> - <use transform="translate(1542.812561 0)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(1576.112549 0)" xlink:href="#CMUSerif-Roman-91"/> - <use transform="translate(1603.912537 0)" xlink:href="#CMUSerif-Roman-45"/> - <use transform="translate(1637.212524 0)" xlink:href="#CMUSerif-Roman-93"/> - </g> - </g> - </g> - <g id="matplotlib.axis_2"> - <g id="ytick_1"> - <g id="line2d_5"> - <defs> - <path d="M 0 0 -L -3.5 0 -" id="m7bcf80c517" style="stroke:#000000;stroke-width:0.8;"/> - </defs> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#m7bcf80c517" y="172.059569"/> - </g> - </g> - <g id="text_6"> - <!-- $\mathdefault{10^{-3}}$ --> - <g transform="translate(10.82 175.529881)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-45"/> - <use transform="translate(124.064102 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-51"/> - </g> - </g> - </g> - <g id="ytick_2"> - <g id="line2d_6"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#m7bcf80c517" y="135.925784"/> - </g> - </g> - <g id="text_7"> - <!-- $\mathdefault{10^{-2}}$ --> - <defs> - <path d="M 5 0 -Q 5 1.796875 5.140625 2.34375 -Q 5.296875 2.90625 6.09375 3.703125 -L 25.296875 25.09375 -Q 35.796875 36.90625 35.796875 47.203125 -Q 35.796875 53.90625 32.296875 58.703125 -Q 28.796875 63.5 22.40625 63.5 -Q 18 63.5 14.296875 60.796875 -Q 10.59375 58.09375 8.90625 53.296875 -Q 9.203125 53.40625 10.203125 53.40625 -Q 12.703125 53.40625 14.09375 51.84375 -Q 15.5 50.296875 15.5 48.203125 -Q 15.5 45.5 13.75 44.203125 -Q 12 42.90625 10.296875 42.90625 -Q 9.59375 42.90625 8.6875 43.046875 -Q 7.796875 43.203125 6.390625 44.59375 -Q 5 46 5 48.5 -Q 5 55.5 10.296875 61.046875 -Q 15.59375 66.59375 23.703125 66.59375 -Q 32.90625 66.59375 38.90625 61.140625 -Q 44.90625 55.703125 44.90625 47.203125 -Q 44.90625 44.203125 44 41.5 -Q 43.09375 38.796875 41.890625 36.6875 -Q 40.703125 34.59375 37.5 31.25 -Q 34.296875 27.90625 31.6875 25.5 -Q 29.09375 23.09375 23.296875 18 -L 12.703125 7.703125 -L 30.703125 7.703125 -Q 39.5 7.703125 40.203125 8.5 -Q 41.203125 9.90625 42.40625 17.40625 -L 44.90625 17.40625 -L 42.09375 0 -z -" id="CMUSerif-Roman-50"/> - </defs> - <g transform="translate(10.82 139.396097)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-45"/> - <use transform="translate(124.064102 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-50"/> - </g> - </g> - </g> - <g id="ytick_3"> - <g id="line2d_7"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#m7bcf80c517" y="99.792"/> - </g> - </g> - <g id="text_8"> - <!-- $\mathdefault{10^{-1}}$ --> - <g transform="translate(10.82 103.262312)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-45"/> - <use transform="translate(124.064102 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-49"/> - </g> - </g> - </g> - <g id="ytick_4"> - <g id="line2d_8"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#m7bcf80c517" y="63.658216"/> - </g> - </g> - <g id="text_9"> - <!-- $\mathdefault{10^{0}}$ --> - <g transform="translate(13.22 67.128528)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-48"/> - </g> - </g> - </g> - <g id="ytick_5"> - <g id="line2d_9"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#m7bcf80c517" y="27.524431"/> - </g> - </g> - <g id="text_10"> - <!-- $\mathdefault{10^{1}}$ --> - <g transform="translate(13.22 30.994744)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-49"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-49"/> - </g> - </g> - </g> - <g id="ytick_6"> - <g id="line2d_10"> - <defs> - <path d="M 0 0 -L -2 0 -" id="mb9ef9ffb1f" style="stroke:#000000;stroke-width:0.6;"/> - </defs> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="197.316"/> - </g> - </g> - </g> - <g id="ytick_7"> - <g id="line2d_11"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="190.953156"/> - </g> - </g> - </g> - <g id="ytick_8"> - <g id="line2d_12"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="186.438647"/> - </g> - </g> - </g> - <g id="ytick_9"> - <g id="line2d_13"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="182.936922"/> - </g> - </g> - </g> - <g id="ytick_10"> - <g id="line2d_14"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="180.075803"/> - </g> - </g> - </g> - <g id="ytick_11"> - <g id="line2d_15"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="177.656763"/> - </g> - </g> - </g> - <g id="ytick_12"> - <g id="line2d_16"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="175.561294"/> - </g> - </g> - </g> - <g id="ytick_13"> - <g id="line2d_17"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="173.71296"/> - </g> - </g> - </g> - <g id="ytick_14"> - <g id="line2d_18"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="161.182216"/> - </g> - </g> - </g> - <g id="ytick_15"> - <g id="line2d_19"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="154.819372"/> - </g> - </g> - </g> - <g id="ytick_16"> - <g id="line2d_20"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="150.304863"/> - </g> - </g> - </g> - <g id="ytick_17"> - <g id="line2d_21"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="146.803137"/> - </g> - </g> - </g> - <g id="ytick_18"> - <g id="line2d_22"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="143.942019"/> - </g> - </g> - </g> - <g id="ytick_19"> - <g id="line2d_23"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="141.522978"/> - </g> - </g> - </g> - <g id="ytick_20"> - <g id="line2d_24"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="139.42751"/> - </g> - </g> - </g> - <g id="ytick_21"> - <g id="line2d_25"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="137.579176"/> - </g> - </g> - </g> - <g id="ytick_22"> - <g id="line2d_26"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="125.048431"/> - </g> - </g> - </g> - <g id="ytick_23"> - <g id="line2d_27"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="118.685588"/> - </g> - </g> - </g> - <g id="ytick_24"> - <g id="line2d_28"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="114.171078"/> - </g> - </g> - </g> - <g id="ytick_25"> - <g id="line2d_29"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="110.669353"/> - </g> - </g> - </g> - <g id="ytick_26"> - <g id="line2d_30"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="107.808235"/> - </g> - </g> - </g> - <g id="ytick_27"> - <g id="line2d_31"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="105.389194"/> - </g> - </g> - </g> - <g id="ytick_28"> - <g id="line2d_32"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="103.293726"/> - </g> - </g> - </g> - <g id="ytick_29"> - <g id="line2d_33"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="101.445391"/> - </g> - </g> - </g> - <g id="ytick_30"> - <g id="line2d_34"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="88.914647"/> - </g> - </g> - </g> - <g id="ytick_31"> - <g id="line2d_35"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="82.551803"/> - </g> - </g> - </g> - <g id="ytick_32"> - <g id="line2d_36"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="78.037294"/> - </g> - </g> - </g> - <g id="ytick_33"> - <g id="line2d_37"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="74.535569"/> - </g> - </g> - </g> - <g id="ytick_34"> - <g id="line2d_38"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="71.674451"/> - </g> - </g> - </g> - <g id="ytick_35"> - <g id="line2d_39"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="69.25541"/> - </g> - </g> - </g> - <g id="ytick_36"> - <g id="line2d_40"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="67.159941"/> - </g> - </g> - </g> - <g id="ytick_37"> - <g id="line2d_41"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="65.311607"/> - </g> - </g> - </g> - <g id="ytick_38"> - <g id="line2d_42"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="52.780863"/> - </g> - </g> - </g> - <g id="ytick_39"> - <g id="line2d_43"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="46.418019"/> - </g> - </g> - </g> - <g id="ytick_40"> - <g id="line2d_44"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="41.90351"/> - </g> - </g> - </g> - <g id="ytick_41"> - <g id="line2d_45"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="38.401784"/> - </g> - </g> - </g> - <g id="ytick_42"> - <g id="line2d_46"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="35.540666"/> - </g> - </g> - </g> - <g id="ytick_43"> - <g id="line2d_47"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="33.121625"/> - </g> - </g> - </g> - <g id="ytick_44"> - <g id="line2d_48"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="31.026157"/> - </g> - </g> - </g> - <g id="ytick_45"> - <g id="line2d_49"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="29.177823"/> - </g> - </g> - </g> - <g id="ytick_46"> - <g id="line2d_50"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="16.647078"/> - </g> - </g> - </g> - <g id="ytick_47"> - <g id="line2d_51"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="10.284235"/> - </g> - </g> - </g> - <g id="ytick_48"> - <g id="line2d_52"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="5.769726"/> - </g> - </g> - </g> - <g id="ytick_49"> - <g id="line2d_53"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mb9ef9ffb1f" y="2.268"/> - </g> - </g> - </g> - <g id="text_11"> - <!-- SF threshold number density $n_{\rm H, thresh}$ [cm$^{-3}$] --> - <defs> - <path d="M 5.59375 0.203125 -L 5.59375 20.203125 -Q 5.59375 21.296875 5.640625 21.6875 -Q 5.703125 22.09375 6 22.390625 -Q 6.296875 22.703125 6.90625 22.703125 -Q 8 22.703125 8.09375 21.703125 -Q 8.40625 11.796875 14.296875 6.296875 -Q 20.09375 0.90625 30.09375 0.90625 -Q 36.09375 0.90625 39.796875 5.203125 -Q 43.5 9.5 43.5 15.203125 -Q 43.5 20.59375 40.40625 24.40625 -Q 39.09375 26.09375 37.4375 27.1875 -Q 35.796875 28.296875 34.796875 28.640625 -Q 33.796875 29 31.90625 29.5 -Q 19.5 32.5 18.703125 32.796875 -Q 12.796875 34.796875 9.1875 39.84375 -Q 5.59375 44.90625 5.59375 51.09375 -Q 5.59375 59.09375 11.25 64.796875 -Q 16.90625 70.5 25.09375 70.5 -Q 29.203125 70.5 32.640625 69.203125 -Q 36.09375 67.90625 37.5 66.75 -Q 38.90625 65.59375 41.09375 63.5 -L 44.59375 69.203125 -Q 45.40625 70.5 46.09375 70.5 -Q 46.90625 70.5 47.046875 70.046875 -Q 47.203125 69.59375 47.203125 68.09375 -L 47.203125 48 -Q 47.203125 46.90625 47.140625 46.5 -Q 47.09375 46.09375 46.796875 45.84375 -Q 46.5 45.59375 45.90625 45.59375 -Q 44.90625 45.59375 44.703125 46.796875 -Q 41.90625 67.703125 25.203125 67.703125 -Q 19.5 67.703125 15.75 63.84375 -Q 12 60 12 54.59375 -Q 12 50.203125 14.75 46.59375 -Q 17.5 43 22.09375 41.90625 -L 34.90625 38.796875 -Q 41.296875 37.296875 45.59375 31.640625 -Q 49.90625 26 49.90625 18.59375 -Q 49.90625 10.09375 44.34375 3.9375 -Q 38.796875 -2.203125 30.203125 -2.203125 -Q 24 -2.203125 19.203125 -0.140625 -Q 14.40625 1.90625 11.796875 4.796875 -Q 9.796875 1.5 8.5 -0.40625 -L 8.203125 -0.90625 -Q 7.40625 -2.203125 6.703125 -2.203125 -Q 5.90625 -2.203125 5.75 -1.703125 -Q 5.59375 -1.203125 5.59375 0.203125 -z -" id="CMUSerif-Roman-83"/> - <path d="M 3.296875 0 -L 3.296875 3.09375 -L 5.703125 3.09375 -Q 11.09375 3.09375 12.34375 4 -Q 13.59375 4.90625 13.59375 7.796875 -L 13.59375 60.203125 -Q 13.59375 63.09375 12.34375 64 -Q 11.09375 64.90625 5.703125 64.90625 -L 3.296875 64.90625 -L 3.296875 68 -L 58.203125 68 -L 61 45.5 -L 58.5 45.5 -Q 57.796875 51.203125 56.890625 54.453125 -Q 56 57.703125 53.953125 60.296875 -Q 51.90625 62.90625 48.453125 63.90625 -Q 45 64.90625 39.40625 64.90625 -L 27.40625 64.90625 -Q 24 64.90625 23.25 64.203125 -Q 22.5 63.5 22.5 60.90625 -L 22.5 35.59375 -L 31.09375 35.59375 -Q 37.90625 35.59375 39.796875 38.046875 -Q 41.703125 40.5 41.703125 47.296875 -L 44.203125 47.296875 -L 44.203125 20.796875 -L 41.703125 20.796875 -Q 41.703125 27.703125 39.796875 30.09375 -Q 37.90625 32.5 31.09375 32.5 -L 22.5 32.5 -L 22.5 7.90625 -Q 22.5 5.796875 22.84375 5 -Q 23.203125 4.203125 25.296875 3.640625 -Q 27.40625 3.09375 32 3.09375 -L 35.296875 3.09375 -L 35.296875 0 -Q 31.703125 0.296875 18.5 0.296875 -Q 6.796875 0.296875 3.296875 0 -z -" id="CMUSerif-Roman-70"/> - <path d="M 3.203125 0 -L 3.203125 3.09375 -Q 8.5 3.09375 9.75 3.75 -Q 11 4.40625 11 7.59375 -L 11 59.59375 -Q 11 63.296875 9.703125 64.25 -Q 8.40625 65.203125 3.203125 65.203125 -L 3.203125 68.296875 -L 17.59375 69.40625 -L 17.59375 34.59375 -L 17.703125 34.59375 -Q 19.296875 38.203125 22.890625 41.203125 -Q 26.5 44.203125 32.09375 44.203125 -Q 39.59375 44.203125 42.59375 40.5 -Q 44.796875 38 45.25 35.203125 -Q 45.703125 32.40625 45.703125 25.203125 -L 45.703125 6.09375 -Q 45.796875 4 47.390625 3.546875 -Q 49 3.09375 53.5 3.09375 -L 53.5 0 -Q 43.296875 0.296875 42.296875 0.296875 -Q 41.5 0.296875 31 0 -L 31 3.09375 -Q 36.296875 3.09375 37.546875 3.75 -Q 38.796875 4.40625 38.796875 7.59375 -L 38.796875 30.90625 -Q 38.796875 36 37.25 39 -Q 35.703125 42 31.40625 42 -Q 26.203125 42 22.046875 37.640625 -Q 17.90625 33.296875 17.90625 26 -L 17.90625 7.59375 -Q 17.90625 4.40625 19.15625 3.75 -Q 20.40625 3.09375 25.703125 3.09375 -L 25.703125 0 -Q 15.5 0.296875 14.5 0.296875 -Q 13.703125 0.296875 3.203125 0 -z -" id="CMUSerif-Roman-104"/> - <path d="M 3.40625 21.5 -Q 3.40625 31 10.046875 37.59375 -Q 16.703125 44.203125 25.703125 44.203125 -Q 33.296875 44.203125 38.296875 38 -L 38.296875 59.59375 -Q 38.296875 63.296875 37 64.25 -Q 35.703125 65.203125 30.5 65.203125 -L 30.5 68.296875 -L 44.90625 69.40625 -L 44.90625 8.703125 -Q 44.90625 5 46.203125 4.046875 -Q 47.5 3.09375 52.703125 3.09375 -L 52.703125 0 -L 38 -1.09375 -L 38 5.5 -Q 32.796875 -1.09375 24.59375 -1.09375 -Q 16 -1.09375 9.703125 5.5 -Q 3.40625 12.09375 3.40625 21.5 -z -M 11.703125 21.40625 -Q 11.703125 12.09375 14.59375 7.5 -Q 18.59375 1.09375 25.09375 1.09375 -Q 32.5 1.09375 36.90625 8.09375 -Q 38 9.796875 38 11.796875 -L 38 32.296875 -Q 38 34.296875 36.90625 36 -Q 32.796875 42 26.09375 42 -Q 19.09375 42 14.796875 35.59375 -Q 11.703125 30.796875 11.703125 21.40625 -z -" id="CMUSerif-Roman-100"/> - <path d="M 3.203125 40 -L 3.203125 43.09375 -L 17.90625 44.203125 -L 17.90625 11 -Q 17.90625 8.59375 18.09375 7.1875 -Q 18.296875 5.796875 19.09375 4.1875 -Q 19.90625 2.59375 21.796875 1.84375 -Q 23.703125 1.09375 26.703125 1.09375 -Q 32.09375 1.09375 35.4375 5.546875 -Q 38.796875 10 38.796875 16.59375 -L 38.796875 34.40625 -Q 38.796875 38.09375 37.5 39.046875 -Q 36.203125 40 31 40 -L 31 43.09375 -L 45.703125 44.203125 -L 45.703125 8.703125 -Q 45.703125 5 47 4.046875 -Q 48.296875 3.09375 53.5 3.09375 -L 53.5 0 -L 39.09375 -1.09375 -L 39.09375 7.90625 -Q 34.90625 -1.09375 26.203125 -1.09375 -Q 21.796875 -1.09375 18.796875 0 -Q 15.796875 1.09375 14.296875 2.5 -Q 12.796875 3.90625 12 6.59375 -Q 11.203125 9.296875 11.09375 10.9375 -Q 11 12.59375 11 15.796875 -L 11 30.796875 -Q 11 37.59375 10 38.796875 -Q 9 40 3.203125 40 -z -" id="CMUSerif-Roman-117"/> - <path d="M 2.796875 65.203125 -L 2.796875 68.296875 -L 17.203125 69.40625 -L 17.203125 37.703125 -Q 23 44.203125 30.90625 44.203125 -Q 39.5 44.203125 45.796875 37.59375 -Q 52.09375 31 52.09375 21.59375 -Q 52.09375 12.09375 45.5 5.5 -Q 38.90625 -1.09375 29.796875 -1.09375 -Q 21.5 -1.09375 16.703125 6.203125 -Q 13.203125 0.09375 13.09375 0 -L 10.59375 0 -L 10.59375 59.59375 -Q 10.59375 63.296875 9.296875 64.25 -Q 8 65.203125 2.796875 65.203125 -z -M 17.5 11.40625 -Q 17.5 9.296875 18.90625 7.203125 -Q 22.90625 1.09375 29.40625 1.09375 -Q 36.40625 1.09375 40.703125 7.5 -Q 43.796875 12.296875 43.796875 21.703125 -Q 43.796875 31 40.90625 35.59375 -Q 36.90625 42 30.40625 42 -Q 23.09375 42 18.59375 35.59375 -Q 17.5 34 17.5 32 -z -" id="CMUSerif-Roman-98"/> - <path d="M 7.71875 1.703125 -Q 7.71875 2.296875 7.8125 2.59375 -L 15.28125 32.421875 -Q 16.015625 35.203125 16.015625 37.3125 -Q 16.015625 41.609375 13.09375 41.609375 -Q 9.96875 41.609375 8.453125 37.859375 -Q 6.9375 34.125 5.515625 28.421875 -Q 5.515625 28.125 5.21875 27.953125 -Q 4.9375 27.78125 4.6875 27.78125 -L 3.515625 27.78125 -Q 3.171875 27.78125 2.921875 28.140625 -Q 2.6875 28.515625 2.6875 28.8125 -Q 3.765625 33.15625 4.765625 36.171875 -Q 5.765625 39.203125 7.890625 41.6875 -Q 10.015625 44.1875 13.1875 44.1875 -Q 16.9375 44.1875 19.8125 41.8125 -Q 22.703125 39.453125 22.703125 35.796875 -Q 25.6875 39.703125 29.6875 41.9375 -Q 33.6875 44.1875 38.1875 44.1875 -Q 41.75 44.1875 44.328125 42.96875 -Q 46.921875 41.75 48.359375 39.28125 -Q 49.8125 36.8125 49.8125 33.40625 -Q 49.8125 29.296875 47.96875 23.484375 -Q 46.140625 17.671875 43.40625 10.5 -Q 42 7.234375 42 4.5 -Q 42 1.515625 44.28125 1.515625 -Q 48.1875 1.515625 50.796875 5.703125 -Q 53.421875 9.90625 54.5 14.703125 -Q 54.6875 15.28125 55.328125 15.28125 -L 56.5 15.28125 -Q 56.890625 15.28125 57.15625 15.03125 -Q 57.421875 14.796875 57.421875 14.40625 -Q 57.421875 14.3125 57.328125 14.109375 -Q 55.953125 8.453125 52.5625 3.65625 -Q 49.171875 -1.125 44.09375 -1.125 -Q 40.578125 -1.125 38.078125 1.296875 -Q 35.59375 3.71875 35.59375 7.171875 -Q 35.59375 9.03125 36.375 11.078125 -Q 37.640625 14.359375 39.28125 18.890625 -Q 40.921875 23.4375 41.96875 27.578125 -Q 43.015625 31.734375 43.015625 34.90625 -Q 43.015625 37.703125 41.859375 39.65625 -Q 40.71875 41.609375 37.984375 41.609375 -Q 34.328125 41.609375 31.25 39.984375 -Q 28.171875 38.375 25.875 35.71875 -Q 23.578125 33.0625 21.6875 29.390625 -L 14.890625 2.203125 -Q 14.546875 0.828125 13.34375 -0.140625 -Q 12.15625 -1.125 10.6875 -1.125 -Q 9.46875 -1.125 8.59375 -0.34375 -Q 7.71875 0.4375 7.71875 1.703125 -z -" id="Cmmi10-110"/> - <path d="M 3.078125 0 -L 3.078125 3.515625 -Q 13.375 3.515625 13.375 6.6875 -L 13.375 61.625 -Q 13.375 64.796875 3.078125 64.796875 -L 3.078125 68.3125 -L 33.015625 68.3125 -L 33.015625 64.796875 -Q 22.703125 64.796875 22.703125 61.625 -L 22.703125 37.3125 -L 52.203125 37.3125 -L 52.203125 61.625 -Q 52.203125 64.796875 41.890625 64.796875 -L 41.890625 68.3125 -L 71.78125 68.3125 -L 71.78125 64.796875 -Q 61.53125 64.796875 61.53125 61.625 -L 61.53125 6.6875 -Q 61.53125 3.515625 71.78125 3.515625 -L 71.78125 0 -L 41.890625 0 -L 41.890625 3.515625 -Q 52.203125 3.515625 52.203125 6.6875 -L 52.203125 33.796875 -L 22.703125 33.796875 -L 22.703125 6.6875 -Q 22.703125 3.515625 33.015625 3.515625 -L 33.015625 0 -z -" id="Cmr10-72"/> - <path d="M 9.90625 -18.015625 -Q 9.90625 -17.578125 10.296875 -17.1875 -Q 13.921875 -13.71875 15.921875 -9.171875 -Q 17.921875 -4.640625 17.921875 0.390625 -L 17.921875 1.609375 -Q 16.3125 0 13.921875 0 -Q 11.625 0 10.015625 1.609375 -Q 8.40625 3.21875 8.40625 5.515625 -Q 8.40625 7.859375 10.015625 9.421875 -Q 11.625 10.984375 13.921875 10.984375 -Q 17.484375 10.984375 19 7.6875 -Q 20.515625 4.390625 20.515625 0.390625 -Q 20.515625 -5.171875 18.28125 -10.171875 -Q 16.0625 -15.1875 12.015625 -19.1875 -Q 11.625 -19.390625 11.375 -19.390625 -Q 10.890625 -19.390625 10.390625 -18.9375 -Q 9.90625 -18.5 9.90625 -18.015625 -z -" id="Cmmi10-59"/> - <path d="M 10.203125 12.015625 -L 10.203125 39.59375 -L 1.90625 39.59375 -L 1.90625 42.1875 -Q 8.453125 42.1875 11.515625 48.28125 -Q 14.59375 54.390625 14.59375 61.53125 -L 17.484375 61.53125 -L 17.484375 43.109375 -L 31.59375 43.109375 -L 31.59375 39.59375 -L 17.484375 39.59375 -L 17.484375 12.203125 -Q 17.484375 8.0625 18.875 4.9375 -Q 20.265625 1.8125 23.875 1.8125 -Q 27.296875 1.8125 28.8125 5.109375 -Q 30.328125 8.40625 30.328125 12.203125 -L 30.328125 18.109375 -L 33.203125 18.109375 -L 33.203125 12.015625 -Q 33.203125 8.890625 32.046875 5.828125 -Q 30.90625 2.78125 28.65625 0.828125 -Q 26.421875 -1.125 23.1875 -1.125 -Q 17.1875 -1.125 13.6875 2.46875 -Q 10.203125 6.0625 10.203125 12.015625 -z -" id="Cmr10-116"/> - <path d="M 2.984375 0 -L 2.984375 3.515625 -Q 6.390625 3.515625 8.59375 4.046875 -Q 10.796875 4.59375 10.796875 6.6875 -L 10.796875 59.1875 -Q 10.796875 61.859375 9.984375 63.0625 -Q 9.1875 64.265625 7.671875 64.53125 -Q 6.15625 64.796875 2.984375 64.796875 -L 2.984375 68.3125 -L 17.828125 69.390625 -L 17.828125 35.015625 -Q 19.921875 39.15625 23.671875 41.671875 -Q 27.4375 44.1875 31.984375 44.1875 -Q 38.921875 44.1875 42.40625 40.859375 -Q 45.90625 37.546875 45.90625 30.71875 -L 45.90625 6.6875 -Q 45.90625 4.59375 48.09375 4.046875 -Q 50.296875 3.515625 53.71875 3.515625 -L 53.71875 0 -L 30.8125 0 -L 30.8125 3.515625 -Q 34.234375 3.515625 36.421875 4.046875 -Q 38.625 4.59375 38.625 6.6875 -L 38.625 30.421875 -Q 38.625 35.296875 37.203125 38.453125 -Q 35.796875 41.609375 31.390625 41.609375 -Q 25.59375 41.609375 21.84375 36.96875 -Q 18.109375 32.328125 18.109375 26.421875 -L 18.109375 6.6875 -Q 18.109375 4.59375 20.3125 4.046875 -Q 22.515625 3.515625 25.875 3.515625 -L 25.875 0 -z -" id="Cmr10-104"/> - <path d="M 2.59375 0 -L 2.59375 3.515625 -Q 6 3.515625 8.203125 4.046875 -Q 10.40625 4.59375 10.40625 6.6875 -L 10.40625 33.984375 -Q 10.40625 36.671875 9.59375 37.859375 -Q 8.796875 39.0625 7.28125 39.328125 -Q 5.765625 39.59375 2.59375 39.59375 -L 2.59375 43.109375 -L 16.890625 44.1875 -L 16.890625 34.421875 -Q 18.5 38.765625 21.484375 41.46875 -Q 24.46875 44.1875 28.71875 44.1875 -Q 31.6875 44.1875 34.03125 42.421875 -Q 36.375 40.671875 36.375 37.796875 -Q 36.375 35.984375 35.078125 34.640625 -Q 33.796875 33.296875 31.890625 33.296875 -Q 30.03125 33.296875 28.703125 34.609375 -Q 27.390625 35.9375 27.390625 37.796875 -Q 27.390625 40.484375 29.296875 41.609375 -L 28.71875 41.609375 -Q 24.65625 41.609375 22.09375 38.671875 -Q 19.53125 35.75 18.453125 31.390625 -Q 17.390625 27.046875 17.390625 23.09375 -L 17.390625 6.6875 -Q 17.390625 3.515625 27.09375 3.515625 -L 27.09375 0 -z -" id="Cmr10-114"/> - <path d="M 24.90625 -1.125 -Q 18.796875 -1.125 13.6875 2.078125 -Q 8.59375 5.28125 5.6875 10.625 -Q 2.78125 15.96875 2.78125 21.921875 -Q 2.78125 27.78125 5.4375 33.046875 -Q 8.109375 38.328125 12.859375 41.578125 -Q 17.625 44.828125 23.484375 44.828125 -Q 28.078125 44.828125 31.46875 43.28125 -Q 34.859375 41.75 37.0625 39.015625 -Q 39.265625 36.28125 40.375 32.5625 -Q 41.5 28.859375 41.5 24.421875 -Q 41.5 23.09375 40.484375 23.09375 -L 11.53125 23.09375 -L 11.53125 22.015625 -Q 11.53125 13.71875 14.875 7.765625 -Q 18.21875 1.8125 25.78125 1.8125 -Q 28.859375 1.8125 31.46875 3.171875 -Q 34.078125 4.546875 36 6.984375 -Q 37.9375 9.421875 38.625 12.203125 -Q 38.71875 12.546875 38.984375 12.8125 -Q 39.265625 13.09375 39.59375 13.09375 -L 40.484375 13.09375 -Q 41.5 13.09375 41.5 11.8125 -Q 40.09375 6.15625 35.40625 2.515625 -Q 30.71875 -1.125 24.90625 -1.125 -z -M 11.625 25.59375 -L 34.421875 25.59375 -Q 34.421875 29.34375 33.375 33.203125 -Q 32.328125 37.0625 29.875 39.625 -Q 27.4375 42.1875 23.484375 42.1875 -Q 17.828125 42.1875 14.71875 36.890625 -Q 11.625 31.59375 11.625 25.59375 -z -" id="Cmr10-101"/> - <path d="M 3.328125 -0.296875 -L 3.328125 16.015625 -Q 3.328125 16.796875 4.203125 16.796875 -L 5.421875 16.796875 -Q 6 16.796875 6.203125 16.015625 -Q 8.984375 1.515625 19.671875 1.515625 -Q 24.421875 1.515625 27.609375 3.65625 -Q 30.8125 5.8125 30.8125 10.296875 -Q 30.8125 13.53125 28.3125 15.796875 -Q 25.828125 18.0625 22.40625 18.890625 -L 15.71875 20.21875 -Q 12.359375 20.953125 9.59375 22.453125 -Q 6.84375 23.96875 5.078125 26.484375 -Q 3.328125 29 3.328125 32.328125 -Q 3.328125 36.71875 5.640625 39.515625 -Q 7.953125 42.328125 11.65625 43.578125 -Q 15.375 44.828125 19.671875 44.828125 -Q 24.8125 44.828125 28.609375 42.09375 -L 31.5 44.578125 -Q 31.5 44.828125 31.984375 44.828125 -L 32.71875 44.828125 -Q 33.015625 44.828125 33.25 44.546875 -Q 33.5 44.28125 33.5 44 -L 33.5 30.90625 -Q 33.5 29.984375 32.71875 29.984375 -L 31.5 29.984375 -Q 30.609375 29.984375 30.609375 30.90625 -Q 30.609375 36.140625 27.703125 39.3125 -Q 24.8125 42.484375 19.578125 42.484375 -Q 15.09375 42.484375 11.796875 40.8125 -Q 8.5 39.15625 8.5 35.109375 -Q 8.5 32.328125 10.859375 30.546875 -Q 13.234375 28.765625 16.40625 27.984375 -L 23.1875 26.703125 -Q 26.609375 25.921875 29.5625 24.0625 -Q 32.515625 22.21875 34.25 19.375 -Q 35.984375 16.546875 35.984375 12.984375 -Q 35.984375 9.375 34.734375 6.703125 -Q 33.5 4.046875 31.265625 2.28125 -Q 29.046875 0.53125 26.015625 -0.296875 -Q 23 -1.125 19.671875 -1.125 -Q 13.421875 -1.125 8.984375 3.078125 -L 5.328125 -0.875 -Q 5.328125 -1.125 4.78125 -1.125 -L 4.203125 -1.125 -Q 3.328125 -1.125 3.328125 -0.296875 -z -" id="Cmr10-115"/> - <path d="M 10.203125 23 -Q 9.375 23 8.828125 23.625 -Q 8.296875 24.265625 8.296875 25 -Q 8.296875 25.734375 8.828125 26.359375 -Q 9.375 27 10.203125 27 -L 67.578125 27 -Q 68.359375 27 68.875 26.359375 -Q 69.390625 25.734375 69.390625 25 -Q 69.390625 24.265625 68.875 23.625 -Q 68.359375 23 67.578125 23 -z -" id="Cmsy10-161"/> - <path d="M 9.515625 7.71875 -Q 11.859375 4.296875 15.8125 2.640625 -Q 19.78125 0.984375 24.3125 0.984375 -Q 30.125 0.984375 32.5625 5.9375 -Q 35.015625 10.890625 35.015625 17.1875 -Q 35.015625 20.015625 34.5 22.84375 -Q 33.984375 25.6875 32.765625 28.125 -Q 31.546875 30.5625 29.421875 32.03125 -Q 27.296875 33.5 24.21875 33.5 -L 17.578125 33.5 -Q 16.703125 33.5 16.703125 34.421875 -L 16.703125 35.296875 -Q 16.703125 36.078125 17.578125 36.078125 -L 23.09375 36.53125 -Q 26.609375 36.53125 28.921875 39.15625 -Q 31.25 41.796875 32.328125 45.578125 -Q 33.40625 49.359375 33.40625 52.78125 -Q 33.40625 57.5625 31.15625 60.640625 -Q 28.90625 63.71875 24.3125 63.71875 -Q 20.515625 63.71875 17.046875 62.28125 -Q 13.578125 60.84375 11.53125 57.90625 -Q 11.71875 57.953125 11.859375 57.984375 -Q 12.015625 58.015625 12.203125 58.015625 -Q 14.453125 58.015625 15.96875 56.453125 -Q 17.484375 54.890625 17.484375 52.6875 -Q 17.484375 50.53125 15.96875 48.96875 -Q 14.453125 47.40625 12.203125 47.40625 -Q 10.015625 47.40625 8.453125 48.96875 -Q 6.890625 50.53125 6.890625 52.6875 -Q 6.890625 56.984375 9.46875 60.15625 -Q 12.0625 63.328125 16.140625 64.96875 -Q 20.21875 66.609375 24.3125 66.609375 -Q 27.34375 66.609375 30.703125 65.703125 -Q 34.078125 64.796875 36.8125 63.109375 -Q 39.546875 61.421875 41.28125 58.78125 -Q 43.015625 56.15625 43.015625 52.78125 -Q 43.015625 48.578125 41.140625 45.015625 -Q 39.265625 41.453125 35.984375 38.859375 -Q 32.71875 36.28125 28.8125 35.015625 -Q 33.15625 34.1875 37.0625 31.734375 -Q 40.96875 29.296875 43.328125 25.484375 -Q 45.703125 21.6875 45.703125 17.28125 -Q 45.703125 11.765625 42.671875 7.296875 -Q 39.65625 2.828125 34.71875 0.3125 -Q 29.78125 -2.203125 24.3125 -2.203125 -Q 19.625 -2.203125 14.90625 -0.40625 -Q 10.203125 1.375 7.203125 4.9375 -Q 4.203125 8.5 4.203125 13.484375 -Q 4.203125 15.96875 5.859375 17.625 -Q 7.515625 19.28125 10.015625 19.28125 -Q 11.625 19.28125 12.96875 18.53125 -Q 14.3125 17.78125 15.0625 16.40625 -Q 15.828125 15.046875 15.828125 13.484375 -Q 15.828125 11.03125 14.109375 9.375 -Q 12.40625 7.71875 10.015625 7.71875 -z -" id="Cmr10-51"/> - </defs> - <g transform="translate(8.72 198.042)rotate(-90)scale(0.1 -0.1)"> - <use transform="translate(0 0.109375)" xlink:href="#CMUSerif-Roman-83"/> - <use transform="translate(55.499985 0.109375)" xlink:href="#CMUSerif-Roman-70"/> - <use transform="translate(120.699982 0.109375)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(153.999969 0.109375)" xlink:href="#CMUSerif-Roman-116"/> - <use transform="translate(192.799957 0.109375)" xlink:href="#CMUSerif-Roman-104"/> - <use transform="translate(248.299942 0.109375)" xlink:href="#CMUSerif-Roman-114"/> - <use transform="translate(287.399933 0.109375)" xlink:href="#CMUSerif-Roman-101"/> - <use transform="translate(331.799927 0.109375)" xlink:href="#CMUSerif-Roman-115"/> - <use transform="translate(371.199921 0.109375)" xlink:href="#CMUSerif-Roman-104"/> - <use transform="translate(426.699905 0.109375)" xlink:href="#CMUSerif-Roman-111"/> - <use transform="translate(476.69989 0.109375)" xlink:href="#CMUSerif-Roman-108"/> - <use transform="translate(504.399887 0.109375)" xlink:href="#CMUSerif-Roman-100"/> - <use transform="translate(559.899872 0.109375)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(593.19986 0.109375)" xlink:href="#CMUSerif-Roman-110"/> - <use transform="translate(648.699844 0.109375)" xlink:href="#CMUSerif-Roman-117"/> - <use transform="translate(704.199829 0.109375)" xlink:href="#CMUSerif-Roman-109"/> - <use transform="translate(787.499817 0.109375)" xlink:href="#CMUSerif-Roman-98"/> - <use transform="translate(842.999802 0.109375)" xlink:href="#CMUSerif-Roman-101"/> - <use transform="translate(887.399796 0.109375)" xlink:href="#CMUSerif-Roman-114"/> - <use transform="translate(926.499786 0.109375)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(959.799774 0.109375)" xlink:href="#CMUSerif-Roman-100"/> - <use transform="translate(1015.299759 0.109375)" xlink:href="#CMUSerif-Roman-101"/> - <use transform="translate(1059.699753 0.109375)" xlink:href="#CMUSerif-Roman-110"/> - <use transform="translate(1115.199738 0.109375)" xlink:href="#CMUSerif-Roman-115"/> - <use transform="translate(1154.599731 0.109375)" xlink:href="#CMUSerif-Roman-105"/> - <use transform="translate(1182.299728 0.109375)" xlink:href="#CMUSerif-Roman-116"/> - <use transform="translate(1221.099716 0.109375)" xlink:href="#CMUSerif-Roman-121"/> - <use transform="translate(1273.799713 0.109375)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(1307.099701 0.109375)" xlink:href="#Cmmi10-110"/> - <use transform="translate(1367.109467 -16.896875)scale(0.7)" xlink:href="#Cmr10-72"/> - <use transform="translate(1419.609467 -16.896875)scale(0.7)" xlink:href="#Cmmi10-59"/> - <use transform="translate(1450.651459 -16.896875)scale(0.7)" xlink:href="#Cmr10-116"/> - <use transform="translate(1477.82431 -16.896875)scale(0.7)" xlink:href="#Cmr10-104"/> - <use transform="translate(1516.686615 -16.896875)scale(0.7)" xlink:href="#Cmr10-114"/> - <use transform="translate(1544.064545 -16.896875)scale(0.7)" xlink:href="#Cmr10-101"/> - <use transform="translate(1575.133881 -16.896875)scale(0.7)" xlink:href="#Cmr10-115"/> - <use transform="translate(1602.716888 -16.896875)scale(0.7)" xlink:href="#Cmr10-104"/> - <use transform="translate(1647.956537 0.109375)" xlink:href="#CMUSerif-Roman-32"/> - <use transform="translate(1681.256525 0.109375)" xlink:href="#CMUSerif-Roman-91"/> - <use transform="translate(1709.056512 0.109375)" xlink:href="#CMUSerif-Roman-99"/> - <use transform="translate(1753.456506 0.109375)" xlink:href="#CMUSerif-Roman-109"/> - <use transform="translate(1841.220635 38.373438)scale(0.7)" xlink:href="#Cmsy10-161"/> - <use transform="translate(1895.600518 38.373438)scale(0.7)" xlink:href="#Cmr10-51"/> - <use transform="translate(1936.977861 0.109375)" xlink:href="#CMUSerif-Roman-93"/> - </g> - </g> - </g> - <g id="line2d_54"> - <path clip-path="url(#p23ab05f3c8)" d="M 6.804 27.524431 -L 66.139784 27.620407 -L 227.8 164.984202 -L 227.8 164.984202 -" style="fill:none;stroke:#000000;stroke-linecap:square;"/> - </g> - <g id="line2d_55"> - <path clip-path="url(#p23ab05f3c8)" d="M 128.653332 63.658216 -L 183.085332 109.90946 -" style="fill:none;stroke:#000000;stroke-dasharray:2.22,0.96;stroke-dashoffset:0;stroke-width:0.6;"/> - </g> - <g id="line2d_56"> - <path clip-path="url(#p23ab05f3c8)" d="M -1 27.524431 -L 227.8 27.524431 -" style="fill:none;stroke:#000000;stroke-dasharray:0.6,0.99;stroke-dashoffset:0;stroke-width:0.6;"/> - </g> - <g id="line2d_57"> - <path clip-path="url(#p23ab05f3c8)" d="M 151.076832 227.8 -L 151.076832 99.792 -" style="fill:none;stroke:#000000;stroke-dasharray:0.6,0.99;stroke-dashoffset:0;stroke-width:0.6;"/> - </g> - <g id="line2d_58"> - <path clip-path="url(#p23ab05f3c8)" d="M -1 99.792 -L 151.076832 99.792 -" style="fill:none;stroke:#000000;stroke-dasharray:0.6,0.99;stroke-dashoffset:0;stroke-width:0.6;"/> - </g> - <g id="patch_3"> - <path d="M 34.02 197.316 -L 34.02 2.268 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="patch_4"> - <path d="M 224.532 197.316 -L 224.532 2.268 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="patch_5"> - <path d="M 34.02 197.316 -L 224.532 197.316 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="patch_6"> - <path d="M 34.02 2.268 -L 224.532 2.268 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="patch_7"> - <path d="M 174.027021 190.953156 -Q 174.027021 184.004135 174.027021 177.055114 -L 172.577021 177.055114 -Q 173.327021 174.557342 174.077021 172.059569 -Q 174.827021 174.557342 175.577021 177.055114 -L 174.127021 177.055114 -Q 174.127021 184.004135 174.127021 190.953156 -L 174.027021 190.953156 -z -" style="stroke:#000000;stroke-linecap:round;"/> - </g> - <g id="text_12"> - <!-- ${Z_\odot}$ --> - <defs> - <path d="M 38.921875 -8.296875 -Q 32.078125 -8.296875 26.0625 -5.703125 -Q 20.0625 -3.125 15.40625 1.484375 -Q 10.75 6.109375 8.171875 12.1875 -Q 5.609375 18.265625 5.609375 25 -Q 5.609375 31.84375 8.140625 37.84375 -Q 10.6875 43.84375 15.375 48.53125 -Q 20.0625 53.21875 26.0625 55.75 -Q 32.078125 58.296875 38.921875 58.296875 -Q 45.703125 58.296875 51.75 55.703125 -Q 57.8125 53.125 62.40625 48.5 -Q 67 43.890625 69.5625 37.828125 -Q 72.125 31.78125 72.125 25 -Q 72.125 18.3125 69.53125 12.1875 -Q 66.9375 6.0625 62.375 1.484375 -Q 57.8125 -3.078125 51.75 -5.6875 -Q 45.703125 -8.296875 38.921875 -8.296875 -z -M 38.921875 -5.421875 -Q 44.96875 -5.421875 50.53125 -3.046875 -Q 56.109375 -0.6875 60.296875 3.515625 -Q 64.5 7.71875 66.84375 13.25 -Q 69.1875 18.796875 69.1875 25 -Q 69.1875 31.203125 66.8125 36.796875 -Q 64.453125 42.390625 60.34375 46.515625 -Q 56.25 50.640625 50.703125 53.03125 -Q 45.171875 55.421875 38.921875 55.421875 -Q 32.671875 55.421875 27.09375 53.03125 -Q 21.53125 50.640625 17.421875 46.53125 -Q 13.328125 42.4375 10.90625 36.71875 -Q 8.5 31 8.5 25 -Q 8.5 19 10.859375 13.359375 -Q 13.234375 7.71875 17.453125 3.515625 -Q 21.6875 -0.6875 27.265625 -3.046875 -Q 32.859375 -5.421875 38.921875 -5.421875 -z -M 38.921875 17.828125 -Q 36.03125 17.828125 33.859375 19.953125 -Q 31.6875 22.078125 31.6875 25 -Q 31.6875 27 32.65625 28.609375 -Q 33.640625 30.21875 35.296875 31.1875 -Q 36.96875 32.171875 38.921875 32.171875 -Q 40.765625 32.171875 42.40625 31.1875 -Q 44.046875 30.21875 45.015625 28.609375 -Q 46 27 46 25 -Q 46 22.078125 43.875 19.953125 -Q 41.75 17.828125 38.921875 17.828125 -z -" id="Cmsy10-175"/> - </defs> - <g transform="translate(175.655329 188.534116)scale(0.09 -0.09)"> - <use transform="translate(0 0.6875)" xlink:href="#Cmmi10-90"/> - <use transform="translate(80.503906 -16.31875)scale(0.7)" xlink:href="#Cmsy10-175"/> - </g> - </g> - <g id="text_13"> - <!-- Z^threshold_slope --> - <defs> - <path d="M 8.6875 72.90625 -L 56 72.90625 -L 56 65.375 -L 17.921875 8.296875 -L 57.078125 8.296875 -L 57.078125 0 -L 7.625 0 -L 7.625 7.515625 -L 44.671875 64.59375 -L 8.6875 64.59375 -z -" id="DejaVuSansMono-90"/> - <path d="M 34.421875 72.90625 -L 56.6875 45.703125 -L 48 45.703125 -L 30.078125 64.984375 -L 12.203125 45.703125 -L 3.515625 45.703125 -L 25.78125 72.90625 -z -" id="DejaVuSansMono-94"/> - <path d="M 29.984375 70.21875 -L 29.984375 54.6875 -L 50.390625 54.6875 -L 50.390625 47.703125 -L 29.984375 47.703125 -L 29.984375 18.015625 -Q 29.984375 11.96875 32.28125 9.5625 -Q 34.578125 7.171875 40.28125 7.171875 -L 50.390625 7.171875 -L 50.390625 0 -L 39.40625 0 -Q 29.296875 0 25.140625 4.046875 -Q 21 8.109375 21 18.015625 -L 21 47.703125 -L 6.390625 47.703125 -L 6.390625 54.6875 -L 21 54.6875 -L 21 70.21875 -z -" id="DejaVuSansMono-116"/> - <path d="M 51.3125 33.890625 -L 51.3125 0 -L 42.28125 0 -L 42.28125 33.890625 -Q 42.28125 41.265625 39.6875 44.71875 -Q 37.109375 48.1875 31.59375 48.1875 -Q 25.296875 48.1875 21.890625 43.71875 -Q 18.5 39.265625 18.5 30.90625 -L 18.5 0 -L 9.515625 0 -L 9.515625 75.984375 -L 18.5 75.984375 -L 18.5 46.484375 -Q 20.90625 51.171875 25 53.578125 -Q 29.109375 56 34.71875 56 -Q 43.0625 56 47.1875 50.5 -Q 51.3125 45.015625 51.3125 33.890625 -z -" id="DejaVuSansMono-104"/> - <path d="M 56.390625 43.40625 -Q 53.515625 45.65625 50.53125 46.671875 -Q 47.5625 47.703125 44 47.703125 -Q 35.59375 47.703125 31.140625 42.421875 -Q 26.703125 37.15625 26.703125 27.203125 -L 26.703125 0 -L 17.671875 0 -L 17.671875 54.6875 -L 26.703125 54.6875 -L 26.703125 44 -Q 28.953125 49.8125 33.609375 52.90625 -Q 38.28125 56 44.671875 56 -Q 48 56 50.875 55.171875 -Q 53.765625 54.34375 56.390625 52.59375 -z -" id="DejaVuSansMono-114"/> - <path d="M 54.296875 29.59375 -L 54.296875 25.203125 -L 15.375 25.203125 -L 15.375 24.90625 -Q 15.375 15.96875 20.03125 11.078125 -Q 24.703125 6.203125 33.203125 6.203125 -Q 37.5 6.203125 42.1875 7.5625 -Q 46.875 8.9375 52.203125 11.71875 -L 52.203125 2.78125 -Q 47.078125 0.6875 42.3125 -0.359375 -Q 37.546875 -1.421875 33.109375 -1.421875 -Q 20.359375 -1.421875 13.171875 6.21875 -Q 6 13.875 6 27.296875 -Q 6 40.375 13.03125 48.1875 -Q 20.0625 56 31.78125 56 -Q 42.234375 56 48.265625 48.921875 -Q 54.296875 41.84375 54.296875 29.59375 -z -M 45.3125 32.234375 -Q 45.125 40.140625 41.578125 44.265625 -Q 38.03125 48.390625 31.390625 48.390625 -Q 24.90625 48.390625 20.703125 44.09375 -Q 16.5 39.796875 15.71875 32.171875 -z -" id="DejaVuSansMono-101"/> - <path d="M 47.515625 52.78125 -L 47.515625 44 -Q 43.65625 46.234375 39.75 47.359375 -Q 35.84375 48.484375 31.78125 48.484375 -Q 25.6875 48.484375 22.671875 46.5 -Q 19.671875 44.53125 19.671875 40.484375 -Q 19.671875 36.8125 21.921875 35 -Q 24.171875 33.203125 33.109375 31.5 -L 36.71875 30.8125 -Q 43.40625 29.546875 46.84375 25.734375 -Q 50.296875 21.921875 50.296875 15.828125 -Q 50.296875 7.71875 44.53125 3.140625 -Q 38.765625 -1.421875 28.515625 -1.421875 -Q 24.46875 -1.421875 20.015625 -0.5625 -Q 15.578125 0.296875 10.40625 2 -L 10.40625 11.28125 -Q 15.4375 8.6875 20.015625 7.390625 -Q 24.609375 6.109375 28.71875 6.109375 -Q 34.671875 6.109375 37.9375 8.515625 -Q 41.21875 10.9375 41.21875 15.28125 -Q 41.21875 21.53125 29.25 23.921875 -L 28.859375 24.03125 -L 25.484375 24.703125 -Q 17.71875 26.21875 14.15625 29.8125 -Q 10.59375 33.40625 10.59375 39.59375 -Q 10.59375 47.46875 15.90625 51.734375 -Q 21.234375 56 31.109375 56 -Q 35.5 56 39.546875 55.1875 -Q 43.609375 54.390625 47.515625 52.78125 -z -" id="DejaVuSansMono-115"/> - <path d="M 30.078125 48.390625 -Q 23.25 48.390625 19.734375 43.0625 -Q 16.21875 37.75 16.21875 27.296875 -Q 16.21875 16.890625 19.734375 11.546875 -Q 23.25 6.203125 30.078125 6.203125 -Q 36.96875 6.203125 40.484375 11.546875 -Q 44 16.890625 44 27.296875 -Q 44 37.75 40.484375 43.0625 -Q 36.96875 48.390625 30.078125 48.390625 -z -M 30.078125 56 -Q 41.453125 56 47.484375 48.625 -Q 53.515625 41.265625 53.515625 27.296875 -Q 53.515625 13.28125 47.5 5.921875 -Q 41.5 -1.421875 30.078125 -1.421875 -Q 18.703125 -1.421875 12.6875 5.921875 -Q 6.6875 13.28125 6.6875 27.296875 -Q 6.6875 41.265625 12.6875 48.625 -Q 18.703125 56 30.078125 56 -z -" id="DejaVuSansMono-111"/> - <path d="M 31.203125 19.828125 -Q 31.203125 13.765625 33.421875 10.6875 -Q 35.640625 7.625 39.984375 7.625 -L 50.484375 7.625 -L 50.484375 0 -L 39.109375 0 -Q 31.0625 0 26.640625 5.171875 -Q 22.21875 10.359375 22.21875 19.828125 -L 22.21875 69.484375 -L 7.8125 69.484375 -L 7.8125 76.515625 -L 31.203125 76.515625 -z -" id="DejaVuSansMono-108"/> - <path d="M 41.890625 47.703125 -L 41.890625 75.984375 -L 50.875 75.984375 -L 50.875 0 -L 41.890625 0 -L 41.890625 6.890625 -Q 39.65625 2.828125 35.90625 0.703125 -Q 32.171875 -1.421875 27.296875 -1.421875 -Q 17.390625 -1.421875 11.6875 6.265625 -Q 6 13.96875 6 27.484375 -Q 6 40.828125 11.71875 48.40625 -Q 17.4375 56 27.296875 56 -Q 32.234375 56 35.984375 53.875 -Q 39.75 51.765625 41.890625 47.703125 -z -M 15.484375 27.296875 -Q 15.484375 16.84375 18.796875 11.515625 -Q 22.125 6.203125 28.609375 6.203125 -Q 35.109375 6.203125 38.5 11.5625 -Q 41.890625 16.9375 41.890625 27.296875 -Q 41.890625 37.703125 38.5 43.046875 -Q 35.109375 48.390625 28.609375 48.390625 -Q 22.125 48.390625 18.796875 43.0625 -Q 15.484375 37.75 15.484375 27.296875 -z -" id="DejaVuSansMono-100"/> - <path d="M 60.203125 -19.671875 -L 60.203125 -23.578125 -L 0 -23.578125 -L 0 -19.671875 -z -" id="DejaVuSansMono-95"/> - <path d="M 18.3125 6.890625 -L 18.3125 -20.796875 -L 9.28125 -20.796875 -L 9.28125 54.6875 -L 18.3125 54.6875 -L 18.3125 47.703125 -Q 20.5625 51.765625 24.296875 53.875 -Q 28.03125 56 32.90625 56 -Q 42.828125 56 48.46875 48.328125 -Q 54.109375 40.671875 54.109375 27.09375 -Q 54.109375 13.765625 48.4375 6.171875 -Q 42.78125 -1.421875 32.90625 -1.421875 -Q 27.9375 -1.421875 24.1875 0.703125 -Q 20.453125 2.828125 18.3125 6.890625 -z -M 44.671875 27.296875 -Q 44.671875 37.75 41.375 43.0625 -Q 38.09375 48.390625 31.59375 48.390625 -Q 25.046875 48.390625 21.671875 43.046875 -Q 18.3125 37.703125 18.3125 27.296875 -Q 18.3125 16.9375 21.671875 11.5625 -Q 25.046875 6.203125 31.59375 6.203125 -Q 38.09375 6.203125 41.375 11.515625 -Q 44.671875 16.84375 44.671875 27.296875 -z -" id="DejaVuSansMono-112"/> - </defs> - <g transform="translate(129.714233 61.930385)rotate(-320)scale(0.07 -0.07)"> - <use xlink:href="#DejaVuSansMono-90"/> - <use x="60.205078" xlink:href="#DejaVuSansMono-94"/> - <use x="120.410156" xlink:href="#DejaVuSansMono-116"/> - <use x="180.615234" xlink:href="#DejaVuSansMono-104"/> - <use x="240.820312" xlink:href="#DejaVuSansMono-114"/> - <use x="301.025391" xlink:href="#DejaVuSansMono-101"/> - <use x="361.230469" xlink:href="#DejaVuSansMono-115"/> - <use x="421.435547" xlink:href="#DejaVuSansMono-104"/> - <use x="481.640625" xlink:href="#DejaVuSansMono-111"/> - <use x="541.845703" xlink:href="#DejaVuSansMono-108"/> - <use x="602.050781" xlink:href="#DejaVuSansMono-100"/> - <use x="662.255859" xlink:href="#DejaVuSansMono-95"/> - <use x="722.460938" xlink:href="#DejaVuSansMono-115"/> - <use x="782.666016" xlink:href="#DejaVuSansMono-108"/> - <use x="842.871094" xlink:href="#DejaVuSansMono-111"/> - <use x="903.076172" xlink:href="#DejaVuSansMono-112"/> - <use x="963.28125" xlink:href="#DejaVuSansMono-101"/> - </g> - </g> - <g id="text_14"> - <!-- threshold_max_density_H_p_cm3 --> - <defs> - <path d="M 33.015625 49.125 -Q 34.671875 52.640625 37.234375 54.3125 -Q 39.796875 56 43.40625 56 -Q 50 56 52.703125 50.890625 -Q 55.421875 45.796875 55.421875 31.6875 -L 55.421875 0 -L 47.21875 0 -L 47.21875 31.296875 -Q 47.21875 42.875 45.921875 45.671875 -Q 44.625 48.484375 41.21875 48.484375 -Q 37.3125 48.484375 35.859375 45.484375 -Q 34.421875 42.484375 34.421875 31.296875 -L 34.421875 0 -L 26.21875 0 -L 26.21875 31.296875 -Q 26.21875 43.015625 24.828125 45.75 -Q 23.4375 48.484375 19.828125 48.484375 -Q 16.265625 48.484375 14.875 45.484375 -Q 13.484375 42.484375 13.484375 31.296875 -L 13.484375 0 -L 5.328125 0 -L 5.328125 54.6875 -L 13.484375 54.6875 -L 13.484375 50 -Q 15.09375 52.9375 17.5 54.46875 -Q 19.921875 56 23 56 -Q 26.703125 56 29.171875 54.296875 -Q 31.640625 52.59375 33.015625 49.125 -z -" id="DejaVuSansMono-109"/> - <path d="M 34.28125 27.484375 -L 31.296875 27.484375 -Q 23.4375 27.484375 19.453125 24.71875 -Q 15.484375 21.96875 15.484375 16.5 -Q 15.484375 11.578125 18.453125 8.84375 -Q 21.4375 6.109375 26.703125 6.109375 -Q 34.125 6.109375 38.375 11.25 -Q 42.625 16.40625 42.671875 25.484375 -L 42.671875 27.484375 -z -M 51.703125 31.203125 -L 51.703125 0 -L 42.671875 0 -L 42.671875 8.109375 -Q 39.796875 3.21875 35.421875 0.890625 -Q 31.0625 -1.421875 24.8125 -1.421875 -Q 16.453125 -1.421875 11.46875 3.296875 -Q 6.5 8.015625 6.5 15.921875 -Q 6.5 25.046875 12.625 29.78125 -Q 18.75 34.515625 30.609375 34.515625 -L 42.671875 34.515625 -L 42.671875 35.9375 -Q 42.625 42.484375 39.34375 45.4375 -Q 36.078125 48.390625 28.90625 48.390625 -Q 24.3125 48.390625 19.625 47.0625 -Q 14.9375 45.75 10.5 43.21875 -L 10.5 52.203125 -Q 15.484375 54.109375 20.046875 55.046875 -Q 24.609375 56 28.90625 56 -Q 35.6875 56 40.5 54 -Q 45.3125 52 48.296875 48 -Q 50.140625 45.5625 50.921875 41.96875 -Q 51.703125 38.375 51.703125 31.203125 -z -" id="DejaVuSansMono-97"/> - <path d="M 54.59375 54.6875 -L 35.015625 28.515625 -L 56.5 0 -L 46.09375 0 -L 30.078125 21.921875 -L 14.109375 0 -L 3.71875 0 -L 25.203125 28.515625 -L 5.609375 54.6875 -L 15.578125 54.6875 -L 30.078125 34.90625 -L 44.484375 54.6875 -z -" id="DejaVuSansMono-120"/> - <path d="M 51.3125 33.890625 -L 51.3125 0 -L 42.28125 0 -L 42.28125 33.890625 -Q 42.28125 41.265625 39.6875 44.71875 -Q 37.109375 48.1875 31.59375 48.1875 -Q 25.296875 48.1875 21.890625 43.71875 -Q 18.5 39.265625 18.5 30.90625 -L 18.5 0 -L 9.515625 0 -L 9.515625 54.6875 -L 18.5 54.6875 -L 18.5 46.484375 -Q 20.90625 51.171875 25 53.578125 -Q 29.109375 56 34.71875 56 -Q 43.0625 56 47.1875 50.5 -Q 51.3125 45.015625 51.3125 33.890625 -z -" id="DejaVuSansMono-110"/> - <path d="M 12.5 54.6875 -L 35.5 54.6875 -L 35.5 6.984375 -L 53.328125 6.984375 -L 53.328125 0 -L 8.6875 0 -L 8.6875 6.984375 -L 26.515625 6.984375 -L 26.515625 47.703125 -L 12.5 47.703125 -z -M 26.515625 75.984375 -L 35.5 75.984375 -L 35.5 64.59375 -L 26.515625 64.59375 -z -" id="DejaVuSansMono-105"/> - <path d="M 41.890625 17.578125 -Q 39.65625 11.859375 36.1875 2.546875 -Q 31.34375 -10.359375 29.6875 -13.1875 -Q 27.4375 -17 24.0625 -18.890625 -Q 20.703125 -20.796875 16.21875 -20.796875 -L 8.984375 -20.796875 -L 8.984375 -13.28125 -L 14.3125 -13.28125 -Q 18.265625 -13.28125 20.5 -10.984375 -Q 22.75 -8.6875 26.21875 0.875 -L 5.078125 54.6875 -L 14.59375 54.6875 -L 30.8125 11.921875 -L 46.78125 54.6875 -L 56.296875 54.6875 -z -" id="DejaVuSansMono-121"/> - <path d="M 6.6875 72.90625 -L 16.609375 72.90625 -L 16.609375 43.015625 -L 43.609375 43.015625 -L 43.609375 72.90625 -L 53.515625 72.90625 -L 53.515625 0 -L 43.609375 0 -L 43.609375 34.71875 -L 16.609375 34.71875 -L 16.609375 0 -L 6.6875 0 -z -" id="DejaVuSansMono-72"/> - <path d="M 51.8125 2.78125 -Q 48.1875 0.6875 44.359375 -0.359375 -Q 40.53125 -1.421875 36.53125 -1.421875 -Q 23.828125 -1.421875 16.671875 6.1875 -Q 9.515625 13.8125 9.515625 27.296875 -Q 9.515625 40.765625 16.671875 48.375 -Q 23.828125 56 36.53125 56 -Q 40.484375 56 44.234375 54.96875 -Q 48 53.953125 51.8125 51.8125 -L 51.8125 42.390625 -Q 48.25 45.5625 44.65625 46.96875 -Q 41.0625 48.390625 36.53125 48.390625 -Q 28.078125 48.390625 23.53125 42.921875 -Q 19 37.453125 19 27.296875 -Q 19 17.1875 23.5625 11.6875 -Q 28.125 6.203125 36.53125 6.203125 -Q 41.21875 6.203125 44.921875 7.640625 -Q 48.640625 9.078125 51.8125 12.109375 -z -" id="DejaVuSansMono-99"/> - <path d="M 37.890625 39.015625 -Q 45.0625 37.109375 48.875 32.25 -Q 52.6875 27.390625 52.6875 20.125 -Q 52.6875 10.0625 45.921875 4.3125 -Q 39.15625 -1.421875 27.203125 -1.421875 -Q 22.171875 -1.421875 16.9375 -0.484375 -Q 11.71875 0.4375 6.6875 2.203125 -L 6.6875 12.015625 -Q 11.671875 9.421875 16.5 8.15625 -Q 21.34375 6.890625 26.125 6.890625 -Q 34.234375 6.890625 38.578125 10.546875 -Q 42.921875 14.203125 42.921875 21.09375 -Q 42.921875 27.4375 38.578125 31.171875 -Q 34.234375 34.90625 26.8125 34.90625 -L 19.28125 34.90625 -L 19.28125 43.015625 -L 26.8125 43.015625 -Q 33.59375 43.015625 37.40625 45.984375 -Q 41.21875 48.96875 41.21875 54.296875 -Q 41.21875 59.90625 37.671875 62.90625 -Q 34.125 65.921875 27.59375 65.921875 -Q 23.25 65.921875 18.609375 64.9375 -Q 13.96875 63.96875 8.890625 62.015625 -L 8.890625 71.09375 -Q 14.796875 72.65625 19.40625 73.4375 -Q 24.03125 74.21875 27.59375 74.21875 -Q 38.234375 74.21875 44.609375 68.875 -Q 50.984375 63.53125 50.984375 54.6875 -Q 50.984375 48.6875 47.625 44.671875 -Q 44.28125 40.671875 37.890625 39.015625 -z -" id="DejaVuSansMono-51"/> - </defs> - <g transform="translate(101.437332 24.663313)scale(0.07 -0.07)"> - <use xlink:href="#DejaVuSansMono-116"/> - <use x="60.205078" xlink:href="#DejaVuSansMono-104"/> - <use x="120.410156" xlink:href="#DejaVuSansMono-114"/> - <use x="180.615234" xlink:href="#DejaVuSansMono-101"/> - <use x="240.820312" xlink:href="#DejaVuSansMono-115"/> - <use x="301.025391" xlink:href="#DejaVuSansMono-104"/> - <use x="361.230469" xlink:href="#DejaVuSansMono-111"/> - <use x="421.435547" xlink:href="#DejaVuSansMono-108"/> - <use x="481.640625" xlink:href="#DejaVuSansMono-100"/> - <use x="541.845703" xlink:href="#DejaVuSansMono-95"/> - <use x="602.050781" xlink:href="#DejaVuSansMono-109"/> - <use x="662.255859" xlink:href="#DejaVuSansMono-97"/> - <use x="722.460938" xlink:href="#DejaVuSansMono-120"/> - <use x="782.666016" xlink:href="#DejaVuSansMono-95"/> - <use x="842.871094" xlink:href="#DejaVuSansMono-100"/> - <use x="903.076172" xlink:href="#DejaVuSansMono-101"/> - <use x="963.28125" xlink:href="#DejaVuSansMono-110"/> - <use x="1023.486328" xlink:href="#DejaVuSansMono-115"/> - <use x="1083.691406" xlink:href="#DejaVuSansMono-105"/> - <use x="1143.896484" xlink:href="#DejaVuSansMono-116"/> - <use x="1204.101562" xlink:href="#DejaVuSansMono-121"/> - <use x="1264.306641" xlink:href="#DejaVuSansMono-95"/> - <use x="1324.511719" xlink:href="#DejaVuSansMono-72"/> - <use x="1384.716797" xlink:href="#DejaVuSansMono-95"/> - <use x="1444.921875" xlink:href="#DejaVuSansMono-112"/> - <use x="1505.126953" xlink:href="#DejaVuSansMono-95"/> - <use x="1565.332031" xlink:href="#DejaVuSansMono-99"/> - <use x="1625.537109" xlink:href="#DejaVuSansMono-109"/> - <use x="1685.742188" xlink:href="#DejaVuSansMono-51"/> - </g> - </g> - <g id="text_15"> - <!-- threshold_norm_H_p_cm3 --> - <g transform="translate(47.005332 96.930882)scale(0.07 -0.07)"> - <use xlink:href="#DejaVuSansMono-116"/> - <use x="60.205078" xlink:href="#DejaVuSansMono-104"/> - <use x="120.410156" xlink:href="#DejaVuSansMono-114"/> - <use x="180.615234" xlink:href="#DejaVuSansMono-101"/> - <use x="240.820312" xlink:href="#DejaVuSansMono-115"/> - <use x="301.025391" xlink:href="#DejaVuSansMono-104"/> - <use x="361.230469" xlink:href="#DejaVuSansMono-111"/> - <use x="421.435547" xlink:href="#DejaVuSansMono-108"/> - <use x="481.640625" xlink:href="#DejaVuSansMono-100"/> - <use x="541.845703" xlink:href="#DejaVuSansMono-95"/> - <use x="602.050781" xlink:href="#DejaVuSansMono-110"/> - <use x="662.255859" xlink:href="#DejaVuSansMono-111"/> - <use x="722.460938" xlink:href="#DejaVuSansMono-114"/> - <use x="782.666016" xlink:href="#DejaVuSansMono-109"/> - <use x="842.871094" xlink:href="#DejaVuSansMono-95"/> - <use x="903.076172" xlink:href="#DejaVuSansMono-72"/> - <use x="963.28125" xlink:href="#DejaVuSansMono-95"/> - <use x="1023.486328" xlink:href="#DejaVuSansMono-112"/> - <use x="1083.691406" xlink:href="#DejaVuSansMono-95"/> - <use x="1143.896484" xlink:href="#DejaVuSansMono-99"/> - <use x="1204.101562" xlink:href="#DejaVuSansMono-109"/> - <use x="1264.306641" xlink:href="#DejaVuSansMono-51"/> - </g> - </g> - <g id="text_16"> - <!-- threshold_Z0 --> - <defs> - <path d="M 23.578125 36.625 -Q 23.578125 39.3125 25.453125 41.265625 -Q 27.34375 43.21875 29.984375 43.21875 -Q 32.71875 43.21875 34.671875 41.265625 -Q 36.625 39.3125 36.625 36.625 -Q 36.625 33.890625 34.6875 31.984375 -Q 32.765625 30.078125 29.984375 30.078125 -Q 27.25 30.078125 25.40625 31.9375 -Q 23.578125 33.796875 23.578125 36.625 -z -M 30.078125 66.40625 -Q 23.1875 66.40625 19.796875 58.984375 -Q 16.40625 51.5625 16.40625 36.375 -Q 16.40625 21.234375 19.796875 13.8125 -Q 23.1875 6.390625 30.078125 6.390625 -Q 37.015625 6.390625 40.40625 13.8125 -Q 43.796875 21.234375 43.796875 36.375 -Q 43.796875 51.5625 40.40625 58.984375 -Q 37.015625 66.40625 30.078125 66.40625 -z -M 30.078125 74.21875 -Q 41.75 74.21875 47.734375 64.640625 -Q 53.71875 55.078125 53.71875 36.375 -Q 53.71875 17.71875 47.734375 8.140625 -Q 41.75 -1.421875 30.078125 -1.421875 -Q 18.40625 -1.421875 12.453125 8.140625 -Q 6.5 17.71875 6.5 36.375 -Q 6.5 55.078125 12.453125 64.640625 -Q 18.40625 74.21875 30.078125 74.21875 -z -" id="DejaVuSansMono-48"/> - </defs> - <g transform="translate(148.181028 186.438647)rotate(-90)scale(0.07 -0.07)"> - <use xlink:href="#DejaVuSansMono-116"/> - <use x="60.205078" xlink:href="#DejaVuSansMono-104"/> - <use x="120.410156" xlink:href="#DejaVuSansMono-114"/> - <use x="180.615234" xlink:href="#DejaVuSansMono-101"/> - <use x="240.820312" xlink:href="#DejaVuSansMono-115"/> - <use x="301.025391" xlink:href="#DejaVuSansMono-104"/> - <use x="361.230469" xlink:href="#DejaVuSansMono-111"/> - <use x="421.435547" xlink:href="#DejaVuSansMono-108"/> - <use x="481.640625" xlink:href="#DejaVuSansMono-100"/> - <use x="541.845703" xlink:href="#DejaVuSansMono-95"/> - <use x="602.050781" xlink:href="#DejaVuSansMono-90"/> - <use x="662.255859" xlink:href="#DejaVuSansMono-48"/> - </g> - </g> - </g> - </g> - <defs> - <clipPath id="p23ab05f3c8"> - <rect height="195.048" width="190.512" x="34.02" y="2.268"/> - </clipPath> - </defs> -</svg> diff --git a/doc/RTD/source/SubgridModels/EAGLE/EAGLE_entropy_floor.svg b/doc/RTD/source/SubgridModels/EAGLE/EAGLE_entropy_floor.svg deleted file mode 100644 index a5ee0fe738d924018986b00a80bdec2e2311afd4..0000000000000000000000000000000000000000 --- a/doc/RTD/source/SubgridModels/EAGLE/EAGLE_entropy_floor.svg +++ /dev/null @@ -1,2540 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<!-- Created with matplotlib (http://matplotlib.org/) --> -<svg height="226pt" version="1.1" viewBox="0 0 226 226" width="226pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <defs> - <style type="text/css"> -*{stroke-linecap:butt;stroke-linejoin:round;} - </style> - </defs> - <g id="figure_1"> - <g id="patch_1"> - <path d="M 0 226.8 -L 226.8 226.8 -L 226.8 0 -L 0 0 -z -" style="fill:#ffffff;"/> - </g> - <g id="axes_1"> - <g id="patch_2"> - <path d="M 34.02 197.316 -L 224.532 197.316 -L 224.532 2.268 -L 34.02 2.268 -z -" style="fill:#ffffff;"/> - </g> - <g id="PolyCollection_1"> - <defs> - <path d="M 77.714425 -156.365649 -L 77.714425 -14.805175 -L 250.907152 -14.805175 -L 250.907152 -156.365649 -L 250.907152 -156.365649 -L 77.714425 -156.365649 -z -" id="m97efab0c60" style="stroke:#e6e6e6;"/> - </defs> - <g clip-path="url(#p5e3fe66b1e)"> - <use style="fill:#e6e6e6;stroke:#e6e6e6;" x="0" xlink:href="#m97efab0c60" y="226.8"/> - </g> - </g> - <g id="PolyCollection_2"> - <path clip-path="url(#p5e3fe66b1e)" d="M 146.991516 49022.756825 -L 146.991516 85.113175 -L 250.907152 -12.410825 -L 250.907152 49022.756825 -L 250.907152 49022.756825 -L 146.991516 49022.756825 -z -" style="fill:#e6e6e6;stroke:#e6e6e6;"/> - </g> - <g id="PathCollection_1"> - <defs> - <path d="M 0 1 -C 0.265203 1 0.51958 0.894634 0.707107 0.707107 -C 0.894634 0.51958 1 0.265203 1 0 -C 1 -0.265203 0.894634 -0.51958 0.707107 -0.707107 -C 0.51958 -0.894634 0.265203 -1 0 -1 -C -0.265203 -1 -0.51958 -0.894634 -0.707107 -0.707107 -C -0.894634 -0.51958 -1 -0.265203 -1 0 -C -1 0.265203 -0.894634 0.51958 -0.707107 0.707107 -C -0.51958 0.894634 -0.265203 1 0 1 -z -" id="me4af860824" style="stroke:#000000;"/> - </defs> - <g clip-path="url(#p5e3fe66b1e)"> - <use style="stroke:#000000;" x="77.714425" xlink:href="#me4af860824" y="70.434351"/> - </g> - </g> - <g id="PathCollection_2"> - <g clip-path="url(#p5e3fe66b1e)"> - <use style="stroke:#000000;" x="146.991516" xlink:href="#me4af860824" y="85.113175"/> - </g> - </g> - <g id="matplotlib.axis_1"> - <g id="xtick_1"> - <g id="line2d_1"> - <defs> - <path d="M 0 0 -L 0 3.5 -" id="m680b56acf8" style="stroke:#000000;stroke-width:0.8;"/> - </defs> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="60.395152" xlink:href="#m680b56acf8" y="197.316"/> - </g> - </g> - <g id="text_1"> - <!-- $\mathdefault{10^{-6}}$ --> - <defs> - <path d="M 8.90625 57.09375 -L 8.90625 60.203125 -Q 20.90625 60.203125 27.09375 66.59375 -Q 28.796875 66.59375 29.09375 66.1875 -Q 29.40625 65.796875 29.40625 64 -L 29.40625 7.90625 -Q 29.40625 4.90625 30.84375 4 -Q 32.296875 3.09375 38.703125 3.09375 -L 41.90625 3.09375 -L 41.90625 0 -Q 38.40625 0.296875 25.703125 0.296875 -Q 13 0.296875 9.5 0 -L 9.5 3.09375 -L 12.703125 3.09375 -Q 19 3.09375 20.5 4 -Q 22 4.90625 22 7.90625 -L 22 59.703125 -Q 16.796875 57.09375 8.90625 57.09375 -z -" id="CMUSerif-Roman-31"/> - <path d="M 3.90625 32 -Q 3.90625 46.703125 7.59375 54.703125 -Q 12.796875 66.59375 25 66.59375 -Q 27.59375 66.59375 30.296875 65.890625 -Q 33 65.203125 36.453125 62.5 -Q 39.90625 59.796875 42 55.40625 -Q 46 46.90625 46 32 -Q 46 17.40625 42.296875 9.40625 -Q 36.90625 -2.203125 24.90625 -2.203125 -Q 20.40625 -2.203125 15.84375 0.09375 -Q 11.296875 2.40625 8.40625 7.90625 -Q 3.90625 16.203125 3.90625 32 -z -M 12.203125 33.203125 -Q 12.203125 18.09375 13.296875 12.09375 -Q 14.5 5.59375 17.84375 2.796875 -Q 21.203125 0 24.90625 0 -Q 28.90625 0 32.25 3 -Q 35.59375 6 36.59375 12.5 -Q 37.703125 18.90625 37.703125 33.203125 -Q 37.703125 47.09375 36.703125 52.703125 -Q 35.40625 59.203125 31.90625 61.796875 -Q 28.40625 64.40625 24.90625 64.40625 -Q 23.59375 64.40625 22.1875 64 -Q 20.796875 63.59375 18.796875 62.5 -Q 16.796875 61.40625 15.25 58.59375 -Q 13.703125 55.796875 13 51.59375 -Q 12.203125 46.203125 12.203125 33.203125 -z -" id="CMUSerif-Roman-30"/> - <path d="M 1 18.59375 -L 1 24.5 -L 27.59375 24.5 -L 27.59375 18.59375 -z -" id="CMUSerif-Roman-2d"/> - <path d="M 4.203125 31.59375 -Q 4.203125 47.296875 12.203125 56.9375 -Q 20.203125 66.59375 30.5 66.59375 -Q 36.5 66.59375 39.84375 63.546875 -Q 43.203125 60.5 43.203125 55.796875 -Q 43.203125 53.203125 41.703125 52.09375 -Q 40.203125 51 38.59375 51 -Q 36.796875 51 35.390625 52.203125 -Q 34 53.40625 34 55.59375 -Q 34 60.09375 39.5 60.09375 -Q 36.90625 64.09375 30.703125 64.09375 -Q 28.796875 64.09375 26.84375 63.546875 -Q 24.90625 63 22.34375 61.140625 -Q 19.796875 59.296875 17.84375 56.34375 -Q 15.90625 53.40625 14.546875 47.90625 -Q 13.203125 42.40625 13.203125 35.203125 -L 13.203125 32.796875 -Q 17.296875 42.703125 25.6875 42.703125 -Q 34.09375 42.703125 39.890625 36.296875 -Q 45.703125 29.90625 45.703125 20.40625 -Q 45.703125 10.703125 39.640625 4.25 -Q 33.59375 -2.203125 25.09375 -2.203125 -Q 21.296875 -2.203125 17.84375 -0.59375 -Q 14.40625 1 11.203125 4.59375 -Q 8 8.203125 6.09375 15.140625 -Q 4.203125 22.09375 4.203125 31.59375 -z -M 13.40625 22.59375 -Q 13.40625 12.796875 15.203125 8.09375 -Q 15.5 7.296875 16.140625 6.25 -Q 16.796875 5.203125 17.9375 3.796875 -Q 19.09375 2.40625 21 1.5 -Q 22.90625 0.59375 25.09375 0.59375 -Q 31.796875 0.59375 35 7.09375 -Q 36.703125 10.703125 36.703125 20.5 -Q 36.703125 30.5 34.90625 34.203125 -Q 31.796875 40.40625 25.59375 40.40625 -Q 21.40625 40.40625 18.5 37.5 -Q 15.59375 34.59375 14.5 30.75 -Q 13.40625 26.90625 13.40625 22.59375 -z -" id="CMUSerif-Roman-36"/> - </defs> - <g transform="translate(52.295152 211.256625)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-31"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-30"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-2d"/> - <use transform="translate(124.064102 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-36"/> - </g> - </g> - </g> - <g id="xtick_2"> - <g id="line2d_2"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="95.033698" xlink:href="#m680b56acf8" y="197.316"/> - </g> - </g> - <g id="text_2"> - <!-- $\mathdefault{10^{-4}}$ --> - <defs> - <path d="M 2.796875 16.5 -L 2.796875 19.59375 -L 33.5 66.5 -Q 34.296875 67.703125 35.5 67.703125 -Q 36.59375 67.703125 36.84375 67.25 -Q 37.09375 66.796875 37.09375 65.09375 -L 37.09375 19.59375 -L 47.09375 19.59375 -L 47.09375 16.5 -L 37.09375 16.5 -L 37.09375 7.796875 -Q 37.09375 4.90625 38.296875 4 -Q 39.5 3.09375 44.703125 3.09375 -L 46.796875 3.09375 -L 46.796875 0 -Q 42.703125 0.296875 33.203125 0.296875 -Q 23.796875 0.296875 19.703125 0 -L 19.703125 3.09375 -L 21.796875 3.09375 -Q 27 3.09375 28.203125 4 -Q 29.40625 4.90625 29.40625 7.796875 -L 29.40625 16.5 -z -M 5.59375 19.59375 -L 30 19.59375 -L 30 56.90625 -z -" id="CMUSerif-Roman-34"/> - </defs> - <g transform="translate(86.933698 211.256625)scale(0.1 -0.1)"> - <use transform="translate(0 0.442188)" xlink:href="#CMUSerif-Roman-31"/> - <use transform="translate(49.999985 0.442188)" xlink:href="#CMUSerif-Roman-30"/> - <use transform="translate(100.75411 30.607813)scale(0.7)" xlink:href="#CMUSerif-Roman-2d"/> - <use transform="translate(124.064102 30.607813)scale(0.7)" xlink:href="#CMUSerif-Roman-34"/> - </g> - </g> - </g> - <g id="xtick_3"> - <g id="line2d_3"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="129.672243" xlink:href="#m680b56acf8" y="197.316"/> - </g> - </g> - <g id="text_3"> - <!-- $\mathdefault{10^{-2}}$ --> - <defs> - <path d="M 5 0 -Q 5 1.796875 5.140625 2.34375 -Q 5.296875 2.90625 6.09375 3.703125 -L 25.296875 25.09375 -Q 35.796875 36.90625 35.796875 47.203125 -Q 35.796875 53.90625 32.296875 58.703125 -Q 28.796875 63.5 22.40625 63.5 -Q 18 63.5 14.296875 60.796875 -Q 10.59375 58.09375 8.90625 53.296875 -Q 9.203125 53.40625 10.203125 53.40625 -Q 12.703125 53.40625 14.09375 51.84375 -Q 15.5 50.296875 15.5 48.203125 -Q 15.5 45.5 13.75 44.203125 -Q 12 42.90625 10.296875 42.90625 -Q 9.59375 42.90625 8.6875 43.046875 -Q 7.796875 43.203125 6.390625 44.59375 -Q 5 46 5 48.5 -Q 5 55.5 10.296875 61.046875 -Q 15.59375 66.59375 23.703125 66.59375 -Q 32.90625 66.59375 38.90625 61.140625 -Q 44.90625 55.703125 44.90625 47.203125 -Q 44.90625 44.203125 44 41.5 -Q 43.09375 38.796875 41.890625 36.6875 -Q 40.703125 34.59375 37.5 31.25 -Q 34.296875 27.90625 31.6875 25.5 -Q 29.09375 23.09375 23.296875 18 -L 12.703125 7.703125 -L 30.703125 7.703125 -Q 39.5 7.703125 40.203125 8.5 -Q 41.203125 9.90625 42.40625 17.40625 -L 44.90625 17.40625 -L 42.09375 0 -z -" id="CMUSerif-Roman-32"/> - </defs> - <g transform="translate(121.572243 211.256625)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-31"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-30"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-2d"/> - <use transform="translate(124.064102 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-32"/> - </g> - </g> - </g> - <g id="xtick_4"> - <g id="line2d_4"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="164.310789" xlink:href="#m680b56acf8" y="197.316"/> - </g> - </g> - <g id="text_4"> - <!-- $\mathdefault{10^{0}}$ --> - <g transform="translate(157.410789 211.256625)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-31"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-30"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-30"/> - </g> - </g> - </g> - <g id="xtick_5"> - <g id="line2d_5"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="198.949334" xlink:href="#m680b56acf8" y="197.316"/> - </g> - </g> - <g id="text_5"> - <!-- $\mathdefault{10^{2}}$ --> - <g transform="translate(192.049334 211.256625)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-31"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-30"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-32"/> - </g> - </g> - </g> - <g id="text_6"> - <!-- Hydrogen number density $n_{\rm H}$ [cm$^{-3}$] --> - <defs> - <path d="M 3.296875 0 -L 3.296875 3.09375 -L 5.703125 3.09375 -Q 11.09375 3.09375 12.34375 4 -Q 13.59375 4.90625 13.59375 7.796875 -L 13.59375 60.5 -Q 13.59375 63.40625 12.34375 64.296875 -Q 11.09375 65.203125 5.703125 65.203125 -L 3.296875 65.203125 -L 3.296875 68.296875 -Q 6.796875 68 18.09375 68 -Q 29.296875 68 32.796875 68.296875 -L 32.796875 65.203125 -L 30.40625 65.203125 -Q 25 65.203125 23.75 64.296875 -Q 22.5 63.40625 22.5 60.5 -L 22.5 37.09375 -L 52.40625 37.09375 -L 52.40625 60.5 -Q 52.40625 63.40625 51.15625 64.296875 -Q 49.90625 65.203125 44.5 65.203125 -L 42.09375 65.203125 -L 42.09375 68.296875 -Q 45.59375 68 56.90625 68 -Q 68.09375 68 71.59375 68.296875 -L 71.59375 65.203125 -L 69.203125 65.203125 -Q 63.796875 65.203125 62.546875 64.296875 -Q 61.296875 63.40625 61.296875 60.5 -L 61.296875 7.796875 -Q 61.296875 4.90625 62.546875 4 -Q 63.796875 3.09375 69.203125 3.09375 -L 71.59375 3.09375 -L 71.59375 0 -Q 68.09375 0.296875 56.796875 0.296875 -Q 45.59375 0.296875 42.09375 0 -L 42.09375 3.09375 -L 44.5 3.09375 -Q 49.90625 3.09375 51.15625 4 -Q 52.40625 4.90625 52.40625 7.796875 -L 52.40625 34 -L 22.5 34 -L 22.5 7.796875 -Q 22.5 4.90625 23.75 4 -Q 25 3.09375 30.40625 3.09375 -L 32.796875 3.09375 -L 32.796875 0 -Q 29.296875 0.296875 18 0.296875 -Q 6.796875 0.296875 3.296875 0 -z -" id="CMUSerif-Roman-48"/> - <path d="M 1.90625 -12.40625 -Q 1.90625 -10.296875 3.15625 -9.1875 -Q 4.40625 -8.09375 6.09375 -8.09375 -Q 7.90625 -8.09375 9.09375 -9.25 -Q 10.296875 -10.40625 10.296875 -12.296875 -Q 10.296875 -16 6.40625 -16.5 -Q 8.296875 -18.296875 11.09375 -18.296875 -Q 14.09375 -18.296875 16.5 -16.09375 -Q 18.90625 -13.90625 19.953125 -11.796875 -Q 21 -9.703125 22.5 -5.90625 -Q 23.90625 -2.90625 25 0 -L 10 36.5 -Q 9 38.90625 7.5 39.453125 -Q 6 40 1.90625 40 -L 1.90625 43.09375 -Q 6.40625 42.796875 11.59375 42.796875 -Q 14.703125 42.796875 22.5 43.09375 -L 22.5 40 -Q 16.90625 40 16.90625 37.40625 -Q 16.90625 37.09375 17.5 35.59375 -L 28.59375 8.703125 -L 38.703125 33.296875 -Q 39.296875 34.703125 39.296875 35.703125 -Q 39.296875 39.796875 34.59375 40 -L 34.59375 43.09375 -Q 41.203125 42.796875 43.296875 42.796875 -Q 47.40625 42.796875 50.796875 43.09375 -L 50.796875 40 -Q 44.09375 40 41.5 33.59375 -L 23.90625 -9.09375 -Q 19.09375 -20.5 11.09375 -20.5 -Q 7.296875 -20.5 4.59375 -18.140625 -Q 1.90625 -15.796875 1.90625 -12.40625 -z -" id="CMUSerif-Roman-79"/> - <path d="M 3.40625 21.5 -Q 3.40625 31 10.046875 37.59375 -Q 16.703125 44.203125 25.703125 44.203125 -Q 33.296875 44.203125 38.296875 38 -L 38.296875 59.59375 -Q 38.296875 63.296875 37 64.25 -Q 35.703125 65.203125 30.5 65.203125 -L 30.5 68.296875 -L 44.90625 69.40625 -L 44.90625 8.703125 -Q 44.90625 5 46.203125 4.046875 -Q 47.5 3.09375 52.703125 3.09375 -L 52.703125 0 -L 38 -1.09375 -L 38 5.5 -Q 32.796875 -1.09375 24.59375 -1.09375 -Q 16 -1.09375 9.703125 5.5 -Q 3.40625 12.09375 3.40625 21.5 -z -M 11.703125 21.40625 -Q 11.703125 12.09375 14.59375 7.5 -Q 18.59375 1.09375 25.09375 1.09375 -Q 32.5 1.09375 36.90625 8.09375 -Q 38 9.796875 38 11.796875 -L 38 32.296875 -Q 38 34.296875 36.90625 36 -Q 32.796875 42 26.09375 42 -Q 19.09375 42 14.796875 35.59375 -Q 11.703125 30.796875 11.703125 21.40625 -z -" id="CMUSerif-Roman-64"/> - <path d="M 2.796875 0 -L 2.796875 3.09375 -Q 8.09375 3.09375 9.34375 3.75 -Q 10.59375 4.40625 10.59375 7.59375 -L 10.59375 34.40625 -Q 10.59375 38.09375 9.296875 39.046875 -Q 8 40 2.796875 40 -L 2.796875 43.09375 -L 16.703125 44.203125 -L 16.703125 33.203125 -Q 18.09375 37.5 21.09375 40.84375 -Q 24.09375 44.203125 29 44.203125 -Q 32.203125 44.203125 34.296875 42.390625 -Q 36.40625 40.59375 36.40625 38.09375 -Q 36.40625 35.90625 35.046875 34.796875 -Q 33.703125 33.703125 32.09375 33.703125 -Q 30.296875 33.703125 29.046875 34.84375 -Q 27.796875 36 27.796875 38 -Q 27.796875 39.203125 28.34375 40.140625 -Q 28.90625 41.09375 29.34375 41.4375 -Q 29.796875 41.796875 30.09375 41.90625 -Q 29.90625 42 29 42 -Q 23.5 42 20.34375 36.5 -Q 17.203125 31 17.203125 23.203125 -L 17.203125 7.796875 -Q 17.203125 4.90625 18.390625 4 -Q 19.59375 3.09375 24.796875 3.09375 -L 26.90625 3.09375 -L 26.90625 0 -Q 22.90625 0.296875 14.203125 0.296875 -Q 13 0.296875 11.09375 0.25 -Q 9.203125 0.203125 6.703125 0.09375 -Q 4.203125 0 2.796875 0 -z -" id="CMUSerif-Roman-72"/> - <path d="M 16 -1.09375 -Q 2.796875 11.90625 2.796875 21.40625 -Q 2.796875 30.90625 9.25 37.84375 -Q 15.703125 44.796875 25 44.796875 -Q 34.09375 44.796875 40.59375 37.890625 -Q 47.09375 31 47.09375 21.40625 -Q 47.09375 12 40.546875 5.453125 -Q 34 -1.09375 24.90625 -1.09375 -Q 16 -1.09375 2.796875 11.90625 -z -M 11.09375 22.203125 -Q 11.09375 12.5 13.59375 8.09375 -Q 17.5 1.40625 25 1.40625 -Q 28.703125 1.40625 31.796875 3.40625 -Q 34.90625 5.40625 36.59375 8.796875 -Q 38.796875 13.203125 38.796875 22.203125 -Q 38.796875 31.796875 36.203125 36.09375 -Q 32.296875 42.59375 24.90625 42.59375 -Q 21.703125 42.59375 18.546875 40.890625 -Q 15.40625 39.203125 13.5 35.90625 -Q 11.09375 31.5 11.09375 22.203125 -z -" id="CMUSerif-Roman-6f"/> - <path d="M 2.796875 -7.90625 -Q 2.796875 -4.703125 5.25 -1.890625 -Q 7.703125 0.90625 12 2.09375 -Q 7.59375 4.90625 7.59375 11 -Q 7.59375 15.703125 10.703125 19.296875 -Q 6 23.203125 6 29.59375 -Q 6 35.5 10.703125 39.84375 -Q 15.40625 44.203125 22.203125 44.203125 -Q 28.203125 44.203125 32.796875 40.59375 -Q 37.59375 45.296875 43.40625 45.296875 -Q 46 45.296875 47.25 43.6875 -Q 48.5 42.09375 48.5 40.40625 -Q 48.5 38.90625 47.546875 38.15625 -Q 46.59375 37.40625 45.59375 37.40625 -Q 44.40625 37.40625 43.546875 38.203125 -Q 42.703125 39 42.703125 40.296875 -Q 42.703125 42.40625 44.296875 43 -Q 44 43.09375 43.296875 43.09375 -Q 38.40625 43.09375 34.296875 39.203125 -Q 38.40625 35.40625 38.40625 29.5 -Q 38.40625 23.59375 33.703125 19.25 -Q 29 14.90625 22.203125 14.90625 -Q 16.59375 14.90625 12.296875 18 -Q 10.59375 16 10.59375 13.296875 -Q 10.59375 10.796875 12.09375 8.84375 -Q 13.59375 6.90625 15.90625 6.59375 -Q 16.59375 6.5 23.40625 6.5 -Q 27.40625 6.5 29.59375 6.390625 -Q 31.796875 6.296875 34.9375 5.640625 -Q 38.09375 5 40.59375 3.703125 -Q 47.09375 0.09375 47.09375 -7.703125 -Q 47.09375 -13.40625 40.546875 -17 -Q 34 -20.59375 24.90625 -20.59375 -Q 15.703125 -20.59375 9.25 -16.9375 -Q 2.796875 -13.296875 2.796875 -7.90625 -z -M 8 -7.90625 -Q 8 -12 12.84375 -15.140625 -Q 17.703125 -18.296875 25 -18.296875 -Q 32.203125 -18.296875 37.046875 -15.1875 -Q 41.90625 -12.09375 41.90625 -7.90625 -Q 41.90625 -4.90625 40.203125 -3 -Q 38.5 -1.09375 35 -0.34375 -Q 31.5 0.40625 29.046875 0.546875 -Q 26.59375 0.703125 22.09375 0.703125 -L 16.203125 0.703125 -Q 12.796875 0.5 10.390625 -2 -Q 8 -4.5 8 -7.90625 -z -M 13.5 29.5 -Q 13.5 17.203125 22.203125 17.203125 -Q 26.59375 17.203125 29.296875 21.203125 -Q 30.90625 23.90625 30.90625 29.59375 -Q 30.90625 41.90625 22.203125 41.90625 -Q 17.796875 41.90625 15.09375 37.90625 -Q 13.5 35.203125 13.5 29.5 -z -" id="CMUSerif-Roman-67"/> - <path d="M 2.796875 22 -Q 2.796875 31.40625 8.84375 38.09375 -Q 14.90625 44.796875 23.59375 44.796875 -Q 32.40625 44.796875 36.953125 39.09375 -Q 41.5 33.40625 41.5 25.203125 -Q 41.5 23.703125 41.09375 23.390625 -Q 40.703125 23.09375 39 23.09375 -L 11.09375 23.09375 -Q 11.09375 12.90625 14.09375 8.09375 -Q 18.296875 1.40625 25.40625 1.40625 -Q 26.40625 1.40625 27.546875 1.59375 -Q 28.703125 1.796875 31.09375 2.640625 -Q 33.5 3.5 35.59375 5.796875 -Q 37.703125 8.09375 38.90625 11.703125 -Q 39.203125 13.09375 40.203125 13.09375 -Q 41.5 13.09375 41.5 11.90625 -Q 41.5 11 40.546875 9.046875 -Q 39.59375 7.09375 37.796875 4.75 -Q 36 2.40625 32.5 0.65625 -Q 29 -1.09375 24.796875 -1.09375 -Q 16 -1.09375 9.390625 5.546875 -Q 2.796875 12.203125 2.796875 22 -z -M 11.203125 25.203125 -L 34.90625 25.203125 -Q 34.90625 27.296875 34.546875 29.640625 -Q 34.203125 32 33.140625 35.25 -Q 32.09375 38.5 29.640625 40.546875 -Q 27.203125 42.59375 23.59375 42.59375 -Q 22 42.59375 20.25 41.890625 -Q 18.5 41.203125 16.390625 39.546875 -Q 14.296875 37.90625 12.84375 34.15625 -Q 11.40625 30.40625 11.203125 25.203125 -z -" id="CMUSerif-Roman-65"/> - <path d="M 3.203125 0 -L 3.203125 3.09375 -Q 8.5 3.09375 9.75 3.75 -Q 11 4.40625 11 7.59375 -L 11 34.40625 -Q 11 38.09375 9.703125 39.046875 -Q 8.40625 40 3.203125 40 -L 3.203125 43.09375 -L 17.296875 44.203125 -L 17.296875 33.703125 -Q 22 44.203125 32.09375 44.203125 -Q 39.59375 44.203125 42.59375 40.5 -Q 44.796875 38 45.25 35.203125 -Q 45.703125 32.40625 45.703125 25.203125 -L 45.703125 6.09375 -Q 45.796875 4 47.390625 3.546875 -Q 49 3.09375 53.5 3.09375 -L 53.5 0 -Q 43.296875 0.296875 42.296875 0.296875 -Q 41.5 0.296875 31 0 -L 31 3.09375 -Q 36.296875 3.09375 37.546875 3.75 -Q 38.796875 4.40625 38.796875 7.59375 -L 38.796875 30.90625 -Q 38.796875 36 37.25 39 -Q 35.703125 42 31.40625 42 -Q 26.203125 42 22.046875 37.640625 -Q 17.90625 33.296875 17.90625 26 -L 17.90625 7.59375 -Q 17.90625 4.40625 19.15625 3.75 -Q 20.40625 3.09375 25.703125 3.09375 -L 25.703125 0 -Q 15.5 0.296875 14.5 0.296875 -Q 13.703125 0.296875 3.203125 0 -z -" id="CMUSerif-Roman-6e"/> - <path id="CMUSerif-Roman-20"/> - <path d="M 3.203125 40 -L 3.203125 43.09375 -L 17.90625 44.203125 -L 17.90625 11 -Q 17.90625 8.59375 18.09375 7.1875 -Q 18.296875 5.796875 19.09375 4.1875 -Q 19.90625 2.59375 21.796875 1.84375 -Q 23.703125 1.09375 26.703125 1.09375 -Q 32.09375 1.09375 35.4375 5.546875 -Q 38.796875 10 38.796875 16.59375 -L 38.796875 34.40625 -Q 38.796875 38.09375 37.5 39.046875 -Q 36.203125 40 31 40 -L 31 43.09375 -L 45.703125 44.203125 -L 45.703125 8.703125 -Q 45.703125 5 47 4.046875 -Q 48.296875 3.09375 53.5 3.09375 -L 53.5 0 -L 39.09375 -1.09375 -L 39.09375 7.90625 -Q 34.90625 -1.09375 26.203125 -1.09375 -Q 21.796875 -1.09375 18.796875 0 -Q 15.796875 1.09375 14.296875 2.5 -Q 12.796875 3.90625 12 6.59375 -Q 11.203125 9.296875 11.09375 10.9375 -Q 11 12.59375 11 15.796875 -L 11 30.796875 -Q 11 37.59375 10 38.796875 -Q 9 40 3.203125 40 -z -" id="CMUSerif-Roman-75"/> - <path d="M 3.203125 0 -L 3.203125 3.09375 -Q 8.5 3.09375 9.75 3.75 -Q 11 4.40625 11 7.59375 -L 11 34.40625 -Q 11 38.09375 9.703125 39.046875 -Q 8.40625 40 3.203125 40 -L 3.203125 43.09375 -L 17.296875 44.203125 -L 17.296875 33.703125 -Q 22 44.203125 32.09375 44.203125 -Q 43.796875 44.203125 45.40625 34.40625 -Q 47.09375 38.203125 50.6875 41.203125 -Q 54.296875 44.203125 59.90625 44.203125 -Q 67.40625 44.203125 70.40625 40.5 -Q 72.59375 38 73.046875 35.203125 -Q 73.5 32.40625 73.5 25.203125 -L 73.5 6.09375 -Q 73.59375 4 75.1875 3.546875 -Q 76.796875 3.09375 81.296875 3.09375 -L 81.296875 0 -Q 71.09375 0.296875 70.09375 0.296875 -Q 69.296875 0.296875 58.796875 0 -L 58.796875 3.09375 -Q 64.09375 3.09375 65.34375 3.75 -Q 66.59375 4.40625 66.59375 7.59375 -L 66.59375 30.90625 -Q 66.59375 36 65.046875 39 -Q 63.5 42 59.203125 42 -Q 54 42 49.84375 37.640625 -Q 45.703125 33.296875 45.703125 26 -L 45.703125 7.59375 -Q 45.703125 4.40625 46.953125 3.75 -Q 48.203125 3.09375 53.5 3.09375 -L 53.5 0 -Q 43.296875 0.296875 42.296875 0.296875 -Q 41.5 0.296875 31 0 -L 31 3.09375 -Q 36.296875 3.09375 37.546875 3.75 -Q 38.796875 4.40625 38.796875 7.59375 -L 38.796875 30.90625 -Q 38.796875 36 37.25 39 -Q 35.703125 42 31.40625 42 -Q 26.203125 42 22.046875 37.640625 -Q 17.90625 33.296875 17.90625 26 -L 17.90625 7.59375 -Q 17.90625 4.40625 19.15625 3.75 -Q 20.40625 3.09375 25.703125 3.09375 -L 25.703125 0 -Q 15.5 0.296875 14.5 0.296875 -Q 13.703125 0.296875 3.203125 0 -z -" id="CMUSerif-Roman-6d"/> - <path d="M 2.796875 65.203125 -L 2.796875 68.296875 -L 17.203125 69.40625 -L 17.203125 37.703125 -Q 23 44.203125 30.90625 44.203125 -Q 39.5 44.203125 45.796875 37.59375 -Q 52.09375 31 52.09375 21.59375 -Q 52.09375 12.09375 45.5 5.5 -Q 38.90625 -1.09375 29.796875 -1.09375 -Q 21.5 -1.09375 16.703125 6.203125 -Q 13.203125 0.09375 13.09375 0 -L 10.59375 0 -L 10.59375 59.59375 -Q 10.59375 63.296875 9.296875 64.25 -Q 8 65.203125 2.796875 65.203125 -z -M 17.5 11.40625 -Q 17.5 9.296875 18.90625 7.203125 -Q 22.90625 1.09375 29.40625 1.09375 -Q 36.40625 1.09375 40.703125 7.5 -Q 43.796875 12.296875 43.796875 21.703125 -Q 43.796875 31 40.90625 35.59375 -Q 36.90625 42 30.40625 42 -Q 23.09375 42 18.59375 35.59375 -Q 17.5 34 17.5 32 -z -" id="CMUSerif-Roman-62"/> - <path d="M 3.296875 1.296875 -L 3.296875 14.5 -Q 3.296875 15.59375 3.34375 16 -Q 3.40625 16.40625 3.703125 16.703125 -Q 4 17 4.59375 17 -Q 5.296875 17 5.546875 16.703125 -Q 5.796875 16.40625 6 15.296875 -Q 7.5 8.40625 10.75 4.75 -Q 14 1.09375 19.90625 1.09375 -Q 25.5 1.09375 28.34375 3.59375 -Q 31.203125 6.09375 31.203125 10.203125 -Q 31.203125 17.5 20.796875 19.40625 -Q 14.796875 20.59375 12.296875 21.390625 -Q 9.796875 22.203125 7.59375 24 -Q 3.296875 27.5 3.296875 32.5 -Q 3.296875 37.5 7.09375 41.140625 -Q 10.90625 44.796875 19.296875 44.796875 -Q 24.90625 44.796875 28.703125 42 -Q 29.796875 42.90625 30.40625 43.59375 -Q 31.703125 44.796875 32.40625 44.796875 -Q 33.203125 44.796875 33.34375 44.296875 -Q 33.5 43.796875 33.5 42.40625 -L 33.5 32.296875 -Q 33.5 31.203125 33.453125 30.796875 -Q 33.40625 30.40625 33.09375 30.15625 -Q 32.796875 29.90625 32.203125 29.90625 -Q 31.09375 29.90625 31 30.796875 -Q 30.203125 42.90625 19.296875 42.90625 -Q 13.40625 42.90625 10.75 40.65625 -Q 8.09375 38.40625 8.09375 35.296875 -Q 8.09375 33.59375 8.890625 32.296875 -Q 9.703125 31 10.75 30.25 -Q 11.796875 29.5 13.75 28.796875 -Q 15.703125 28.09375 16.890625 27.84375 -Q 18.09375 27.59375 20.40625 27.09375 -Q 28.40625 25.59375 31.796875 22.296875 -Q 36 18.09375 36 12.796875 -Q 36 6.90625 32 2.90625 -Q 28 -1.09375 19.90625 -1.09375 -Q 13.40625 -1.09375 8.90625 3.203125 -Q 8.296875 2.59375 7.84375 2.09375 -Q 7.40625 1.59375 7.25 1.390625 -Q 7.09375 1.203125 7.046875 1.09375 -Q 7 1 6.90625 0.90625 -Q 4.90625 -1.09375 4.40625 -1.09375 -Q 3.59375 -1.09375 3.4375 -0.59375 -Q 3.296875 -0.09375 3.296875 1.296875 -z -" id="CMUSerif-Roman-73"/> - <path d="M 3.296875 0 -L 3.296875 3.09375 -Q 8.59375 3.09375 9.84375 3.75 -Q 11.09375 4.40625 11.09375 7.59375 -L 11.09375 34.5 -Q 11.09375 38.203125 9.84375 39.09375 -Q 8.59375 40 3.703125 40 -L 3.703125 43.09375 -L 17.703125 44.203125 -L 17.703125 7.5 -Q 17.703125 4.5 18.75 3.796875 -Q 19.796875 3.09375 24.703125 3.09375 -L 24.703125 0 -Q 14.5 0.296875 14.296875 0.296875 -Q 12.90625 0.296875 3.296875 0 -z -M 7.5 61.59375 -Q 7.5 63.59375 9.046875 65.25 -Q 10.59375 66.90625 12.796875 66.90625 -Q 15 66.90625 16.546875 65.40625 -Q 18.09375 63.90625 18.09375 61.59375 -Q 18.09375 59.296875 16.546875 57.796875 -Q 15 56.296875 12.796875 56.296875 -Q 10.5 56.296875 9 57.890625 -Q 7.5 59.5 7.5 61.59375 -z -" id="CMUSerif-Roman-69"/> - <path d="M 1.90625 40 -L 1.90625 42.203125 -Q 6.5 42.40625 9.546875 45.65625 -Q 12.59375 48.90625 13.640625 52.90625 -Q 14.703125 56.90625 14.796875 61.5 -L 17.296875 61.5 -L 17.296875 43.09375 -L 31.59375 43.09375 -L 31.59375 40 -L 17.296875 40 -L 17.296875 12.203125 -Q 17.296875 1.40625 24 1.40625 -Q 26.90625 1.40625 28.796875 4.34375 -Q 30.703125 7.296875 30.703125 12.59375 -L 30.703125 18.09375 -L 33.203125 18.09375 -L 33.203125 12.40625 -Q 33.203125 7 30.703125 2.953125 -Q 28.203125 -1.09375 23.296875 -1.09375 -Q 21.5 -1.09375 19.703125 -0.640625 -Q 17.90625 -0.203125 15.59375 1 -Q 13.296875 2.203125 11.84375 5.140625 -Q 10.40625 8.09375 10.40625 12.40625 -L 10.40625 40 -z -" id="CMUSerif-Roman-74"/> - <path d="M 7.71875 1.703125 -Q 7.71875 2.296875 7.8125 2.59375 -L 15.28125 32.421875 -Q 16.015625 35.203125 16.015625 37.3125 -Q 16.015625 41.609375 13.09375 41.609375 -Q 9.96875 41.609375 8.453125 37.859375 -Q 6.9375 34.125 5.515625 28.421875 -Q 5.515625 28.125 5.21875 27.953125 -Q 4.9375 27.78125 4.6875 27.78125 -L 3.515625 27.78125 -Q 3.171875 27.78125 2.921875 28.140625 -Q 2.6875 28.515625 2.6875 28.8125 -Q 3.765625 33.15625 4.765625 36.171875 -Q 5.765625 39.203125 7.890625 41.6875 -Q 10.015625 44.1875 13.1875 44.1875 -Q 16.9375 44.1875 19.8125 41.8125 -Q 22.703125 39.453125 22.703125 35.796875 -Q 25.6875 39.703125 29.6875 41.9375 -Q 33.6875 44.1875 38.1875 44.1875 -Q 41.75 44.1875 44.328125 42.96875 -Q 46.921875 41.75 48.359375 39.28125 -Q 49.8125 36.8125 49.8125 33.40625 -Q 49.8125 29.296875 47.96875 23.484375 -Q 46.140625 17.671875 43.40625 10.5 -Q 42 7.234375 42 4.5 -Q 42 1.515625 44.28125 1.515625 -Q 48.1875 1.515625 50.796875 5.703125 -Q 53.421875 9.90625 54.5 14.703125 -Q 54.6875 15.28125 55.328125 15.28125 -L 56.5 15.28125 -Q 56.890625 15.28125 57.15625 15.03125 -Q 57.421875 14.796875 57.421875 14.40625 -Q 57.421875 14.3125 57.328125 14.109375 -Q 55.953125 8.453125 52.5625 3.65625 -Q 49.171875 -1.125 44.09375 -1.125 -Q 40.578125 -1.125 38.078125 1.296875 -Q 35.59375 3.71875 35.59375 7.171875 -Q 35.59375 9.03125 36.375 11.078125 -Q 37.640625 14.359375 39.28125 18.890625 -Q 40.921875 23.4375 41.96875 27.578125 -Q 43.015625 31.734375 43.015625 34.90625 -Q 43.015625 37.703125 41.859375 39.65625 -Q 40.71875 41.609375 37.984375 41.609375 -Q 34.328125 41.609375 31.25 39.984375 -Q 28.171875 38.375 25.875 35.71875 -Q 23.578125 33.0625 21.6875 29.390625 -L 14.890625 2.203125 -Q 14.546875 0.828125 13.34375 -0.140625 -Q 12.15625 -1.125 10.6875 -1.125 -Q 9.46875 -1.125 8.59375 -0.34375 -Q 7.71875 0.4375 7.71875 1.703125 -z -" id="Cmmi10-6e"/> - <path d="M 3.078125 0 -L 3.078125 3.515625 -Q 13.375 3.515625 13.375 6.6875 -L 13.375 61.625 -Q 13.375 64.796875 3.078125 64.796875 -L 3.078125 68.3125 -L 33.015625 68.3125 -L 33.015625 64.796875 -Q 22.703125 64.796875 22.703125 61.625 -L 22.703125 37.3125 -L 52.203125 37.3125 -L 52.203125 61.625 -Q 52.203125 64.796875 41.890625 64.796875 -L 41.890625 68.3125 -L 71.78125 68.3125 -L 71.78125 64.796875 -Q 61.53125 64.796875 61.53125 61.625 -L 61.53125 6.6875 -Q 61.53125 3.515625 71.78125 3.515625 -L 71.78125 0 -L 41.890625 0 -L 41.890625 3.515625 -Q 52.203125 3.515625 52.203125 6.6875 -L 52.203125 33.796875 -L 22.703125 33.796875 -L 22.703125 6.6875 -Q 22.703125 3.515625 33.015625 3.515625 -L 33.015625 0 -z -" id="Cmr10-48"/> - <path d="M 10.40625 -25 -L 10.40625 75 -L 25.5 75 -L 25.5 72.703125 -L 17.09375 72.703125 -L 17.09375 -22.703125 -L 25.5 -22.703125 -L 25.5 -25 -z -" id="CMUSerif-Roman-5b"/> - <path d="M 16.09375 -1.09375 -Q 3.40625 12.09375 3.40625 21.59375 -Q 3.40625 31.09375 9.65625 37.9375 -Q 15.90625 44.796875 25.09375 44.796875 -Q 31.203125 44.796875 35.796875 41.890625 -Q 40.40625 39 40.40625 34.09375 -Q 40.40625 31.90625 39.09375 30.65625 -Q 37.796875 29.40625 35.796875 29.40625 -Q 33.703125 29.40625 32.453125 30.703125 -Q 31.203125 32 31.203125 34 -Q 31.203125 34.90625 31.5 35.75 -Q 31.796875 36.59375 32.890625 37.546875 -Q 34 38.5 35.90625 38.59375 -Q 32.296875 42.296875 25.203125 42.296875 -Q 20.09375 42.296875 15.890625 37.5 -Q 11.703125 32.703125 11.703125 21.796875 -Q 11.703125 16.09375 13.09375 11.890625 -Q 14.5 7.703125 16.796875 5.546875 -Q 19.09375 3.40625 21.34375 2.40625 -Q 23.59375 1.40625 25.796875 1.40625 -Q 35.59375 1.40625 38.90625 11.90625 -Q 39.203125 12.90625 40.203125 12.90625 -Q 41.5 12.90625 41.5 11.90625 -Q 41.5 11.40625 41.09375 10.15625 -Q 40.703125 8.90625 39.5 6.90625 -Q 38.296875 4.90625 36.546875 3.15625 -Q 34.796875 1.40625 31.75 0.15625 -Q 28.703125 -1.09375 24.90625 -1.09375 -Q 16.09375 -1.09375 3.40625 12.09375 -z -" id="CMUSerif-Roman-63"/> - <path d="M 10.203125 23 -Q 9.375 23 8.828125 23.625 -Q 8.296875 24.265625 8.296875 25 -Q 8.296875 25.734375 8.828125 26.359375 -Q 9.375 27 10.203125 27 -L 67.578125 27 -Q 68.359375 27 68.875 26.359375 -Q 69.390625 25.734375 69.390625 25 -Q 69.390625 24.265625 68.875 23.625 -Q 68.359375 23 67.578125 23 -z -" id="Cmsy10-a1"/> - <path d="M 9.515625 7.71875 -Q 11.859375 4.296875 15.8125 2.640625 -Q 19.78125 0.984375 24.3125 0.984375 -Q 30.125 0.984375 32.5625 5.9375 -Q 35.015625 10.890625 35.015625 17.1875 -Q 35.015625 20.015625 34.5 22.84375 -Q 33.984375 25.6875 32.765625 28.125 -Q 31.546875 30.5625 29.421875 32.03125 -Q 27.296875 33.5 24.21875 33.5 -L 17.578125 33.5 -Q 16.703125 33.5 16.703125 34.421875 -L 16.703125 35.296875 -Q 16.703125 36.078125 17.578125 36.078125 -L 23.09375 36.53125 -Q 26.609375 36.53125 28.921875 39.15625 -Q 31.25 41.796875 32.328125 45.578125 -Q 33.40625 49.359375 33.40625 52.78125 -Q 33.40625 57.5625 31.15625 60.640625 -Q 28.90625 63.71875 24.3125 63.71875 -Q 20.515625 63.71875 17.046875 62.28125 -Q 13.578125 60.84375 11.53125 57.90625 -Q 11.71875 57.953125 11.859375 57.984375 -Q 12.015625 58.015625 12.203125 58.015625 -Q 14.453125 58.015625 15.96875 56.453125 -Q 17.484375 54.890625 17.484375 52.6875 -Q 17.484375 50.53125 15.96875 48.96875 -Q 14.453125 47.40625 12.203125 47.40625 -Q 10.015625 47.40625 8.453125 48.96875 -Q 6.890625 50.53125 6.890625 52.6875 -Q 6.890625 56.984375 9.46875 60.15625 -Q 12.0625 63.328125 16.140625 64.96875 -Q 20.21875 66.609375 24.3125 66.609375 -Q 27.34375 66.609375 30.703125 65.703125 -Q 34.078125 64.796875 36.8125 63.109375 -Q 39.546875 61.421875 41.28125 58.78125 -Q 43.015625 56.15625 43.015625 52.78125 -Q 43.015625 48.578125 41.140625 45.015625 -Q 39.265625 41.453125 35.984375 38.859375 -Q 32.71875 36.28125 28.8125 35.015625 -Q 33.15625 34.1875 37.0625 31.734375 -Q 40.96875 29.296875 43.328125 25.484375 -Q 45.703125 21.6875 45.703125 17.28125 -Q 45.703125 11.765625 42.671875 7.296875 -Q 39.65625 2.828125 34.71875 0.3125 -Q 29.78125 -2.203125 24.3125 -2.203125 -Q 19.625 -2.203125 14.90625 -0.40625 -Q 10.203125 1.375 7.203125 4.9375 -Q 4.203125 8.5 4.203125 13.484375 -Q 4.203125 15.96875 5.859375 17.625 -Q 7.515625 19.28125 10.015625 19.28125 -Q 11.625 19.28125 12.96875 18.53125 -Q 14.3125 17.78125 15.0625 16.40625 -Q 15.828125 15.046875 15.828125 13.484375 -Q 15.828125 11.03125 14.109375 9.375 -Q 12.40625 7.71875 10.015625 7.71875 -z -" id="Cmr10-33"/> - <path d="M 2.09375 -22.703125 -L 10.5 -22.703125 -L 10.5 72.703125 -L 2.09375 72.703125 -L 2.09375 75 -L 17.203125 75 -L 17.203125 -25 -L 2.09375 -25 -z -" id="CMUSerif-Roman-5d"/> - </defs> - <g transform="translate(48.976 221.69725)scale(0.1 -0.1)"> - <use transform="translate(0 0.109375)" xlink:href="#CMUSerif-Roman-48"/> - <use transform="translate(74.999985 0.109375)" xlink:href="#CMUSerif-Roman-79"/> - <use transform="translate(127.699982 0.109375)" xlink:href="#CMUSerif-Roman-64"/> - <use transform="translate(183.199966 0.109375)" xlink:href="#CMUSerif-Roman-72"/> - <use transform="translate(222.299957 0.109375)" xlink:href="#CMUSerif-Roman-6f"/> - <use transform="translate(272.299942 0.109375)" xlink:href="#CMUSerif-Roman-67"/> - <use transform="translate(322.299927 0.109375)" xlink:href="#CMUSerif-Roman-65"/> - <use transform="translate(366.699921 0.109375)" xlink:href="#CMUSerif-Roman-6e"/> - <use transform="translate(422.199905 0.109375)" xlink:href="#CMUSerif-Roman-20"/> - <use transform="translate(455.499893 0.109375)" xlink:href="#CMUSerif-Roman-6e"/> - <use transform="translate(510.999878 0.109375)" xlink:href="#CMUSerif-Roman-75"/> - <use transform="translate(566.499863 0.109375)" xlink:href="#CMUSerif-Roman-6d"/> - <use transform="translate(649.79985 0.109375)" xlink:href="#CMUSerif-Roman-62"/> - <use transform="translate(705.299835 0.109375)" xlink:href="#CMUSerif-Roman-65"/> - <use transform="translate(749.699829 0.109375)" xlink:href="#CMUSerif-Roman-72"/> - <use transform="translate(788.79982 0.109375)" xlink:href="#CMUSerif-Roman-20"/> - <use transform="translate(822.099808 0.109375)" xlink:href="#CMUSerif-Roman-64"/> - <use transform="translate(877.599792 0.109375)" xlink:href="#CMUSerif-Roman-65"/> - <use transform="translate(921.999786 0.109375)" xlink:href="#CMUSerif-Roman-6e"/> - <use transform="translate(977.499771 0.109375)" xlink:href="#CMUSerif-Roman-73"/> - <use transform="translate(1016.899765 0.109375)" xlink:href="#CMUSerif-Roman-69"/> - <use transform="translate(1044.599762 0.109375)" xlink:href="#CMUSerif-Roman-74"/> - <use transform="translate(1083.39975 0.109375)" xlink:href="#CMUSerif-Roman-79"/> - <use transform="translate(1136.099747 0.109375)" xlink:href="#CMUSerif-Roman-20"/> - <use transform="translate(1169.399734 0.109375)" xlink:href="#Cmmi10-6e"/> - <use transform="translate(1229.4095 -16.896875)scale(0.7)" xlink:href="#Cmr10-48"/> - <use transform="translate(1288.286844 0.109375)" xlink:href="#CMUSerif-Roman-20"/> - <use transform="translate(1321.586832 0.109375)" xlink:href="#CMUSerif-Roman-5b"/> - <use transform="translate(1349.386819 0.109375)" xlink:href="#CMUSerif-Roman-63"/> - <use transform="translate(1393.786813 0.109375)" xlink:href="#CMUSerif-Roman-6d"/> - <use transform="translate(1481.550942 38.373438)scale(0.7)" xlink:href="#Cmsy10-a1"/> - <use transform="translate(1535.930825 38.373438)scale(0.7)" xlink:href="#Cmr10-33"/> - <use transform="translate(1577.308168 0.109375)" xlink:href="#CMUSerif-Roman-5d"/> - </g> - </g> - </g> - <g id="matplotlib.axis_2"> - <g id="ytick_1"> - <g id="line2d_6"> - <defs> - <path d="M 0 0 -L -3.5 0 -" id="mefc29cf603" style="stroke:#000000;stroke-width:0.8;"/> - </defs> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#mefc29cf603" y="163.232825"/> - </g> - </g> - <g id="text_7"> - <!-- $\mathdefault{10^{2}}$ --> - <g transform="translate(13.22 166.703137)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-31"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-30"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-32"/> - </g> - </g> - </g> - <g id="ytick_2"> - <g id="line2d_7"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#mefc29cf603" y="114.470825"/> - </g> - </g> - <g id="text_8"> - <!-- $\mathdefault{10^{3}}$ --> - <defs> - <path d="M 4.203125 13.5 -Q 4.203125 16.5 5.890625 17.890625 -Q 7.59375 19.296875 9.796875 19.296875 -Q 12.09375 19.296875 13.75 17.796875 -Q 15.40625 16.296875 15.40625 13.703125 -Q 15.40625 10.90625 13.453125 9.34375 -Q 11.5 7.796875 8.796875 8.203125 -Q 11.203125 4.203125 15.59375 2.390625 -Q 20 0.59375 24.09375 0.59375 -Q 28.40625 0.59375 31.90625 4.296875 -Q 35.40625 8 35.40625 17.09375 -Q 35.40625 24.796875 32.40625 29.25 -Q 29.40625 33.703125 23.5 33.703125 -L 19.09375 33.703125 -Q 17.59375 33.703125 17.140625 33.84375 -Q 16.703125 34 16.703125 34.796875 -Q 16.703125 35.796875 18.203125 36 -Q 19.703125 36 22.09375 36.296875 -Q 27.90625 36.5 31 41.5 -Q 33.796875 46.203125 33.796875 52.90625 -Q 33.796875 59 30.890625 61.546875 -Q 28 64.09375 24.203125 64.09375 -Q 20.703125 64.09375 16.84375 62.640625 -Q 13 61.203125 10.90625 57.90625 -Q 17.09375 57.90625 17.09375 52.90625 -Q 17.09375 50.703125 15.6875 49.25 -Q 14.296875 47.796875 12 47.796875 -Q 9.796875 47.796875 8.34375 49.1875 -Q 6.90625 50.59375 6.90625 53 -Q 6.90625 58.703125 12 62.640625 -Q 17.09375 66.59375 24.59375 66.59375 -Q 32 66.59375 37.5 62.6875 -Q 43 58.796875 43 52.796875 -Q 43 46.90625 39.09375 42.046875 -Q 35.203125 37.203125 29 35.203125 -Q 36.59375 33.703125 41.140625 28.546875 -Q 45.703125 23.40625 45.703125 17.09375 -Q 45.703125 9.296875 39.546875 3.546875 -Q 33.40625 -2.203125 24.40625 -2.203125 -Q 16.09375 -2.203125 10.140625 2.296875 -Q 4.203125 6.796875 4.203125 13.5 -z -" id="CMUSerif-Roman-33"/> - </defs> - <g transform="translate(13.22 117.941137)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-31"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-30"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-33"/> - </g> - </g> - </g> - <g id="ytick_3"> - <g id="line2d_8"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#mefc29cf603" y="65.708825"/> - </g> - </g> - <g id="text_9"> - <!-- $\mathdefault{10^{4}}$ --> - <g transform="translate(13.22 69.179137)scale(0.1 -0.1)"> - <use transform="translate(0 0.442188)" xlink:href="#CMUSerif-Roman-31"/> - <use transform="translate(49.999985 0.442188)" xlink:href="#CMUSerif-Roman-30"/> - <use transform="translate(100.75411 30.607813)scale(0.7)" xlink:href="#CMUSerif-Roman-34"/> - </g> - </g> - </g> - <g id="ytick_4"> - <g id="line2d_9"> - <g> - <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#mefc29cf603" y="16.946825"/> - </g> - </g> - <g id="text_10"> - <!-- $\mathdefault{10^{5}}$ --> - <defs> - <path d="M 5 16.09375 -Q 5 19.09375 6.59375 20.25 -Q 8.203125 21.40625 9.90625 21.40625 -Q 12.203125 21.40625 13.546875 19.953125 -Q 14.90625 18.5 14.90625 16.5 -Q 14.90625 14.5 13.546875 13.046875 -Q 12.203125 11.59375 9.90625 11.59375 -Q 8.796875 11.59375 8.203125 11.796875 -Q 9.5 7.203125 13.546875 3.890625 -Q 17.59375 0.59375 22.90625 0.59375 -Q 29.59375 0.59375 33.59375 7.09375 -Q 36 11.296875 36 20.796875 -Q 36 29.203125 34.203125 33.40625 -Q 31.40625 39.796875 25.703125 39.796875 -Q 17.59375 39.796875 12.796875 32.796875 -Q 12.203125 31.90625 11.5 31.90625 -Q 10.5 31.90625 10.296875 32.453125 -Q 10.09375 33 10.09375 34.5 -L 10.09375 64.09375 -Q 10.09375 66.5 11.09375 66.5 -Q 11.5 66.5 12.296875 66.203125 -Q 18.59375 63.40625 25.59375 63.40625 -Q 32.796875 63.40625 39.203125 66.296875 -Q 39.703125 66.59375 40 66.59375 -Q 41 66.59375 41 65.5 -Q 41 65.09375 40.203125 63.9375 -Q 39.40625 62.796875 37.703125 61.296875 -Q 36 59.796875 33.796875 58.390625 -Q 31.59375 57 28.390625 56.046875 -Q 25.203125 55.09375 21.703125 55.09375 -Q 17.5 55.09375 13.203125 56.40625 -L 13.203125 36.90625 -Q 18.40625 42 25.90625 42 -Q 33.90625 42 39.40625 35.546875 -Q 44.90625 29.09375 44.90625 20.09375 -Q 44.90625 10.703125 38.40625 4.25 -Q 31.90625 -2.203125 23.09375 -2.203125 -Q 15.09375 -2.203125 10.046875 3.5 -Q 5 9.203125 5 16.09375 -z -" id="CMUSerif-Roman-35"/> - </defs> - <g transform="translate(13.22 20.417137)scale(0.1 -0.1)"> - <use transform="translate(0 0.21875)" xlink:href="#CMUSerif-Roman-31"/> - <use transform="translate(49.999985 0.21875)" xlink:href="#CMUSerif-Roman-30"/> - <use transform="translate(100.75411 30.384375)scale(0.7)" xlink:href="#CMUSerif-Roman-35"/> - </g> - </g> - </g> - <g id="ytick_5"> - <g id="line2d_10"> - <defs> - <path d="M 0 0 -L -2 0 -" id="m75a05ee26c" style="stroke:#000000;stroke-width:0.6;"/> - </defs> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="197.316"/> - </g> - </g> - </g> - <g id="ytick_6"> - <g id="line2d_11"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="188.729438"/> - </g> - </g> - </g> - <g id="ytick_7"> - <g id="line2d_12"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="182.637175"/> - </g> - </g> - </g> - <g id="ytick_8"> - <g id="line2d_13"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="177.911649"/> - </g> - </g> - </g> - <g id="ytick_9"> - <g id="line2d_14"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="174.050613"/> - </g> - </g> - </g> - <g id="ytick_10"> - <g id="line2d_15"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="170.786154"/> - </g> - </g> - </g> - <g id="ytick_11"> - <g id="line2d_16"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="167.958351"/> - </g> - </g> - </g> - <g id="ytick_12"> - <g id="line2d_17"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="165.464051"/> - </g> - </g> - </g> - <g id="ytick_13"> - <g id="line2d_18"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="148.554"/> - </g> - </g> - </g> - <g id="ytick_14"> - <g id="line2d_19"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="139.967438"/> - </g> - </g> - </g> - <g id="ytick_15"> - <g id="line2d_20"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="133.875175"/> - </g> - </g> - </g> - <g id="ytick_16"> - <g id="line2d_21"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="129.149649"/> - </g> - </g> - </g> - <g id="ytick_17"> - <g id="line2d_22"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="125.288613"/> - </g> - </g> - </g> - <g id="ytick_18"> - <g id="line2d_23"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="122.024154"/> - </g> - </g> - </g> - <g id="ytick_19"> - <g id="line2d_24"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="119.196351"/> - </g> - </g> - </g> - <g id="ytick_20"> - <g id="line2d_25"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="116.702051"/> - </g> - </g> - </g> - <g id="ytick_21"> - <g id="line2d_26"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="99.792"/> - </g> - </g> - </g> - <g id="ytick_22"> - <g id="line2d_27"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="91.205438"/> - </g> - </g> - </g> - <g id="ytick_23"> - <g id="line2d_28"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="85.113175"/> - </g> - </g> - </g> - <g id="ytick_24"> - <g id="line2d_29"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="80.387649"/> - </g> - </g> - </g> - <g id="ytick_25"> - <g id="line2d_30"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="76.526613"/> - </g> - </g> - </g> - <g id="ytick_26"> - <g id="line2d_31"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="73.262154"/> - </g> - </g> - </g> - <g id="ytick_27"> - <g id="line2d_32"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="70.434351"/> - </g> - </g> - </g> - <g id="ytick_28"> - <g id="line2d_33"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="67.940051"/> - </g> - </g> - </g> - <g id="ytick_29"> - <g id="line2d_34"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="51.03"/> - </g> - </g> - </g> - <g id="ytick_30"> - <g id="line2d_35"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="42.443438"/> - </g> - </g> - </g> - <g id="ytick_31"> - <g id="line2d_36"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="36.351175"/> - </g> - </g> - </g> - <g id="ytick_32"> - <g id="line2d_37"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="31.625649"/> - </g> - </g> - </g> - <g id="ytick_33"> - <g id="line2d_38"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="27.764613"/> - </g> - </g> - </g> - <g id="ytick_34"> - <g id="line2d_39"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="24.500154"/> - </g> - </g> - </g> - <g id="ytick_35"> - <g id="line2d_40"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="21.672351"/> - </g> - </g> - </g> - <g id="ytick_36"> - <g id="line2d_41"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="19.178051"/> - </g> - </g> - </g> - <g id="ytick_37"> - <g id="line2d_42"> - <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m75a05ee26c" y="2.268"/> - </g> - </g> - </g> - <g id="text_11"> - <!-- Temperature $T$ [K] --> - <defs> - <path d="M 3.59375 45.203125 -L 5.5 67.703125 -L 66.59375 67.703125 -L 68.5 45.203125 -L 66 45.203125 -Q 65.59375 49.703125 65.25 52.296875 -Q 64.90625 54.90625 64.046875 57.34375 -Q 63.203125 59.796875 62.140625 61 -Q 61.09375 62.203125 59.09375 63.140625 -Q 57.09375 64.09375 54.5 64.34375 -Q 51.90625 64.59375 48 64.59375 -Q 43.40625 64.59375 42.296875 64.40625 -Q 41.09375 64.09375 40.796875 63.25 -Q 40.5 62.40625 40.5 60.59375 -L 40.5 7.90625 -Q 40.5 5.90625 40.890625 5.09375 -Q 41.296875 4.296875 43.59375 3.6875 -Q 45.90625 3.09375 51 3.09375 -L 55 3.09375 -L 55 0 -Q 50.90625 0.296875 36 0.296875 -Q 21.203125 0.296875 17.09375 0 -L 17.09375 3.09375 -L 21.09375 3.09375 -Q 26.203125 3.09375 28.5 3.6875 -Q 30.796875 4.296875 31.1875 5.09375 -Q 31.59375 5.90625 31.59375 7.90625 -L 31.59375 60.59375 -Q 31.59375 62 31.5 62.59375 -Q 31.40625 63.203125 30.953125 63.703125 -Q 30.5 64.203125 29.5 64.390625 -Q 28.5 64.59375 24.09375 64.59375 -Q 20.203125 64.59375 17.59375 64.34375 -Q 15 64.09375 13 63.140625 -Q 11 62.203125 9.953125 61 -Q 8.90625 59.796875 8.046875 57.34375 -Q 7.203125 54.90625 6.84375 52.296875 -Q 6.5 49.703125 6.09375 45.203125 -z -" id="CMUSerif-Roman-54"/> - <path d="M 2.796875 -16.296875 -Q 8.09375 -16.296875 9.34375 -15.640625 -Q 10.59375 -15 10.59375 -11.796875 -L 10.59375 35 -Q 10.59375 38.296875 9.34375 39.140625 -Q 8.09375 40 2.796875 40 -L 2.796875 43.09375 -L 17.203125 44.203125 -L 17.203125 37.59375 -Q 23.203125 44.203125 31.203125 44.203125 -Q 39.703125 44.203125 45.890625 37.59375 -Q 52.09375 31 52.09375 21.59375 -Q 52.09375 12.09375 45.5 5.5 -Q 38.90625 -1.09375 29.796875 -1.09375 -Q 24.796875 -1.09375 21.4375 1.453125 -Q 18.09375 4 17.5 5.90625 -L 17.5 5 -L 17.5 -11.796875 -Q 17.5 -15 18.75 -15.640625 -Q 20 -16.296875 25.296875 -16.296875 -L 25.296875 -19.40625 -Q 14.796875 -19.09375 14 -19.09375 -Q 13 -19.09375 2.796875 -19.40625 -z -M 17.5 11.40625 -Q 17.5 9.90625 17.703125 9.34375 -Q 17.90625 8.796875 18.90625 7.203125 -Q 22.90625 1.09375 29.40625 1.09375 -Q 35.09375 1.09375 39.4375 6.9375 -Q 43.796875 12.796875 43.796875 21.59375 -Q 43.796875 30 39.84375 35.84375 -Q 35.90625 41.703125 30.40625 41.703125 -Q 26.5 41.703125 23.09375 39.59375 -Q 19.703125 37.5 17.5 33.703125 -z -" id="CMUSerif-Roman-70"/> - <path d="M 4.203125 9.5 -Q 4.203125 18 14.203125 22.5 -Q 20.203125 25.40625 32.59375 26.09375 -L 32.59375 29.796875 -Q 32.59375 36 29.34375 39.296875 -Q 26.09375 42.59375 22 42.59375 -Q 14.703125 42.59375 11.203125 38 -Q 14.203125 37.90625 15.25 36.40625 -Q 16.296875 34.90625 16.296875 33.40625 -Q 16.296875 31.40625 15.046875 30.09375 -Q 13.796875 28.796875 11.703125 28.796875 -Q 9.703125 28.796875 8.390625 30.046875 -Q 7.09375 31.296875 7.09375 33.5 -Q 7.09375 38.40625 11.5 41.59375 -Q 15.90625 44.796875 22.203125 44.796875 -Q 30.40625 44.796875 35.90625 39.296875 -Q 37.59375 37.59375 38.4375 35.390625 -Q 39.296875 33.203125 39.390625 31.75 -Q 39.5 30.296875 39.5 27.5 -L 39.5 7.5 -Q 39.5 6.90625 39.703125 5.953125 -Q 39.90625 5 40.796875 3.75 -Q 41.703125 2.5 43.203125 2.5 -Q 46.796875 2.5 46.796875 8.90625 -L 46.796875 14.5 -L 49.296875 14.5 -L 49.296875 8.90625 -Q 49.296875 3.59375 46.5 1.5 -Q 43.703125 -0.59375 41.09375 -0.59375 -Q 37.796875 -0.59375 35.6875 1.84375 -Q 33.59375 4.296875 33.296875 7.59375 -Q 31.796875 3.796875 28.34375 1.34375 -Q 24.90625 -1.09375 20.203125 -1.09375 -Q 16.59375 -1.09375 13.1875 -0.1875 -Q 9.796875 0.703125 7 3.203125 -Q 4.203125 5.703125 4.203125 9.5 -z -M 11.90625 9.59375 -Q 11.90625 5.90625 14.546875 3.5 -Q 17.203125 1.09375 20.90625 1.09375 -Q 25.09375 1.09375 28.84375 4.34375 -Q 32.59375 7.59375 32.59375 14 -L 32.59375 24 -Q 21.5 23.59375 16.703125 19.1875 -Q 11.90625 14.796875 11.90625 9.59375 -z -" id="CMUSerif-Roman-61"/> - <path d="M 4.59375 1.3125 -Q 4.640625 1.5625 4.8125 2.1875 -Q 4.984375 2.828125 5.25 3.171875 -Q 5.515625 3.515625 6 3.515625 -Q 14.59375 3.515625 17.390625 4 -Q 20.0625 4.6875 20.609375 6.890625 -L 34.28125 61.8125 -Q 34.71875 63.03125 34.71875 64.015625 -Q 34.71875 64.796875 31.203125 64.796875 -L 25.390625 64.796875 -Q 18.703125 64.796875 15.0625 62.734375 -Q 11.421875 60.6875 9.71875 57.3125 -Q 8.015625 53.953125 5.328125 46.296875 -Q 4.984375 45.40625 4.296875 45.40625 -L 3.421875 45.40625 -Q 2.390625 45.40625 2.390625 46.6875 -L 9.515625 67.390625 -Q 9.71875 68.3125 10.5 68.3125 -L 69.578125 68.3125 -Q 70.609375 68.3125 70.609375 67 -L 67.28125 46.296875 -Q 67.28125 46 66.9375 45.703125 -Q 66.609375 45.40625 66.3125 45.40625 -L 65.375 45.40625 -Q 64.40625 45.40625 64.40625 46.6875 -Q 65.484375 53.765625 65.484375 56.6875 -Q 65.484375 60.203125 64.015625 62 -Q 62.546875 63.8125 60.203125 64.296875 -Q 57.859375 64.796875 54.109375 64.796875 -L 48.1875 64.796875 -Q 45.515625 64.796875 44.578125 64.296875 -Q 43.65625 63.8125 43.015625 61.375 -L 29.296875 6.5 -Q 29.25 6.296875 29.21875 6.09375 -Q 29.203125 5.90625 29.109375 5.609375 -Q 29.109375 4.34375 30.609375 4 -Q 33.203125 3.515625 41.703125 3.515625 -Q 42.671875 3.515625 42.671875 2.203125 -Q 42.328125 0.78125 42.125 0.390625 -Q 41.9375 0 41.015625 0 -L 5.609375 0 -Q 4.59375 0 4.59375 1.3125 -z -" id="Cmmi10-54"/> - <path d="M 3.296875 0 -L 3.296875 3.09375 -L 5.703125 3.09375 -Q 11.09375 3.09375 12.34375 4 -Q 13.59375 4.90625 13.59375 7.796875 -L 13.59375 60.5 -Q 13.59375 63.40625 12.34375 64.296875 -Q 11.09375 65.203125 5.703125 65.203125 -L 3.296875 65.203125 -L 3.296875 68.296875 -Q 6.796875 68 18.09375 68 -Q 29.296875 68 32.796875 68.296875 -L 32.796875 65.203125 -L 30.40625 65.203125 -Q 25 65.203125 23.75 64.296875 -Q 22.5 63.40625 22.5 60.5 -L 22.5 28.703125 -L 53.796875 58.59375 -Q 55.59375 60.203125 55.59375 61.90625 -Q 55.59375 62.5 55.34375 63.140625 -Q 55.09375 63.796875 53.9375 64.5 -Q 52.796875 65.203125 51 65.203125 -L 51 68.296875 -Q 54.40625 68 63.703125 68 -Q 69.59375 68 72.203125 68.296875 -L 72.203125 65.203125 -Q 63.90625 65.09375 58 59.203125 -L 40 41.90625 -L 63.09375 7.90625 -Q 65.203125 4.796875 67.25 3.9375 -Q 69.296875 3.09375 73.59375 3.09375 -L 73.59375 0 -Q 67.296875 0.296875 62.09375 0.296875 -Q 51.296875 0.296875 47.796875 0 -L 47.796875 3.09375 -Q 53.703125 3.09375 53.703125 6.09375 -Q 53.703125 7.203125 52.203125 9.5 -L 34.09375 36.296875 -L 22.5 25.296875 -L 22.5 7.796875 -Q 22.5 4.90625 23.75 4 -Q 25 3.09375 30.40625 3.09375 -L 32.796875 3.09375 -L 32.796875 0 -Q 29.296875 0.296875 18 0.296875 -Q 6.796875 0.296875 3.296875 0 -z -" id="CMUSerif-Roman-4b"/> - </defs> - <g transform="translate(8.72 141.042)rotate(-90)scale(0.1 -0.1)"> - <use xlink:href="#CMUSerif-Roman-54"/> - <use transform="translate(72.199982 0)" xlink:href="#CMUSerif-Roman-65"/> - <use transform="translate(116.599976 0)" xlink:href="#CMUSerif-Roman-6d"/> - <use transform="translate(199.899963 0)" xlink:href="#CMUSerif-Roman-70"/> - <use transform="translate(255.399948 0)" xlink:href="#CMUSerif-Roman-65"/> - <use transform="translate(299.799942 0)" xlink:href="#CMUSerif-Roman-72"/> - <use transform="translate(338.899933 0)" xlink:href="#CMUSerif-Roman-61"/> - <use transform="translate(388.899918 0)" xlink:href="#CMUSerif-Roman-74"/> - <use transform="translate(427.699905 0)" xlink:href="#CMUSerif-Roman-75"/> - <use transform="translate(483.19989 0)" xlink:href="#CMUSerif-Roman-72"/> - <use transform="translate(522.299881 0)" xlink:href="#CMUSerif-Roman-65"/> - <use transform="translate(566.699875 0)" xlink:href="#CMUSerif-Roman-20"/> - <use transform="translate(599.999863 0)" xlink:href="#Cmmi10-54"/> - <use transform="translate(658.3983 0)" xlink:href="#CMUSerif-Roman-20"/> - <use transform="translate(691.698288 0)" xlink:href="#CMUSerif-Roman-5b"/> - <use transform="translate(719.498276 0)" xlink:href="#CMUSerif-Roman-4b"/> - <use transform="translate(797.198257 0)" xlink:href="#CMUSerif-Roman-5d"/> - </g> - </g> - </g> - <g id="line2d_43"> - <path clip-path="url(#p5e3fe66b1e)" d="M 77.714425 70.434351 -L 227.8 70.434351 -L 227.8 70.434351 -" style="fill:none;stroke:#000000;stroke-linecap:square;"/> - </g> - <g id="line2d_44"> - <path clip-path="url(#p5e3fe66b1e)" d="M 146.991516 85.113175 -L 227.8 9.275054 -L 227.8 9.275054 -" style="fill:none;stroke:#000000;stroke-linecap:square;"/> - </g> - <g id="line2d_45"> - <path clip-path="url(#p5e3fe66b1e)" d="M -1 70.434351 -L 77.714425 70.434351 -" style="fill:none;stroke:#000000;stroke-dasharray:0.6,0.99;stroke-dashoffset:0;stroke-width:0.6;"/> - </g> - <g id="line2d_46"> - <path clip-path="url(#p5e3fe66b1e)" d="M -1 85.113175 -L 146.991516 85.113175 -" style="fill:none;stroke:#000000;stroke-dasharray:0.6,0.99;stroke-dashoffset:0;stroke-width:0.6;"/> - </g> - <g id="line2d_47"> - <path clip-path="url(#p5e3fe66b1e)" d="M 77.714425 197.316 -L 77.714425 70.434351 -" style="fill:none;stroke:#000000;stroke-dasharray:0.6,0.99;stroke-dashoffset:0;stroke-width:0.6;"/> - </g> - <g id="line2d_48"> - <path clip-path="url(#p5e3fe66b1e)" d="M 146.991516 197.316 -L 146.991516 85.113175 -" style="fill:none;stroke:#000000;stroke-dasharray:0.6,0.99;stroke-dashoffset:0;stroke-width:0.6;"/> - </g> - <g id="line2d_49"> - <path clip-path="url(#p5e3fe66b1e)" d="M 68.658545 43.904505 -L 103.297091 43.904505 -" style="fill:none;stroke:#000000;stroke-dasharray:2.22,0.96;stroke-dashoffset:0;stroke-width:0.6;"/> - </g> - <g id="line2d_50"> - <path clip-path="url(#p5e3fe66b1e)" d="M 155.254909 57.122263 -L 189.893455 24.614263 -" style="fill:none;stroke:#000000;stroke-dasharray:2.22,0.96;stroke-dashoffset:0;stroke-width:0.6;"/> - </g> - <g id="patch_3"> - <path d="M 34.02 197.316 -L 34.02 2.268 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="patch_4"> - <path d="M 224.532 197.316 -L 224.532 2.268 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="patch_5"> - <path d="M 34.02 197.316 -L 224.532 197.316 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="patch_6"> - <path d="M 34.02 2.268 -L 224.532 2.268 -" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> - </g> - <g id="text_12"> - <!-- $n_{\rm H}$^Cool_gamma_effective - 1 --> - <defs> - <path d="M 34.421875 72.90625 -L 56.6875 45.703125 -L 48 45.703125 -L 30.078125 64.984375 -L 12.203125 45.703125 -L 3.515625 45.703125 -L 25.78125 72.90625 -z -" id="DejaVuSansMono-5e"/> - <path d="M 52.390625 2.59375 -Q 48.640625 0.59375 44.671875 -0.40625 -Q 40.71875 -1.421875 36.28125 -1.421875 -Q 22.265625 -1.421875 14.515625 8.484375 -Q 6.78125 18.40625 6.78125 36.375 -Q 6.78125 54.25 14.5625 64.234375 -Q 22.359375 74.21875 36.28125 74.21875 -Q 40.71875 74.21875 44.671875 73.21875 -Q 48.640625 72.21875 52.390625 70.21875 -L 52.390625 60.109375 -Q 48.78125 63.09375 44.625 64.65625 -Q 40.484375 66.21875 36.28125 66.21875 -Q 26.65625 66.21875 21.875 58.796875 -Q 17.09375 51.375 17.09375 36.375 -Q 17.09375 21.4375 21.875 14.015625 -Q 26.65625 6.59375 36.28125 6.59375 -Q 40.578125 6.59375 44.703125 8.15625 -Q 48.828125 9.71875 52.390625 12.703125 -z -" id="DejaVuSansMono-43"/> - <path d="M 30.078125 48.390625 -Q 23.25 48.390625 19.734375 43.0625 -Q 16.21875 37.75 16.21875 27.296875 -Q 16.21875 16.890625 19.734375 11.546875 -Q 23.25 6.203125 30.078125 6.203125 -Q 36.96875 6.203125 40.484375 11.546875 -Q 44 16.890625 44 27.296875 -Q 44 37.75 40.484375 43.0625 -Q 36.96875 48.390625 30.078125 48.390625 -z -M 30.078125 56 -Q 41.453125 56 47.484375 48.625 -Q 53.515625 41.265625 53.515625 27.296875 -Q 53.515625 13.28125 47.5 5.921875 -Q 41.5 -1.421875 30.078125 -1.421875 -Q 18.703125 -1.421875 12.6875 5.921875 -Q 6.6875 13.28125 6.6875 27.296875 -Q 6.6875 41.265625 12.6875 48.625 -Q 18.703125 56 30.078125 56 -z -" id="DejaVuSansMono-6f"/> - <path d="M 31.203125 19.828125 -Q 31.203125 13.765625 33.421875 10.6875 -Q 35.640625 7.625 39.984375 7.625 -L 50.484375 7.625 -L 50.484375 0 -L 39.109375 0 -Q 31.0625 0 26.640625 5.171875 -Q 22.21875 10.359375 22.21875 19.828125 -L 22.21875 69.484375 -L 7.8125 69.484375 -L 7.8125 76.515625 -L 31.203125 76.515625 -z -" id="DejaVuSansMono-6c"/> - <path d="M 60.203125 -19.671875 -L 60.203125 -23.578125 -L 0 -23.578125 -L 0 -19.671875 -z -" id="DejaVuSansMono-5f"/> - <path d="M 41.890625 27.78125 -Q 41.890625 37.890625 38.59375 43.140625 -Q 35.296875 48.390625 29 48.390625 -Q 22.40625 48.390625 18.9375 43.140625 -Q 15.484375 37.890625 15.484375 27.78125 -Q 15.484375 17.671875 18.96875 12.375 -Q 22.46875 7.078125 29.109375 7.078125 -Q 35.296875 7.078125 38.59375 12.390625 -Q 41.890625 17.71875 41.890625 27.78125 -z -M 50.875 3.515625 -Q 50.875 -8.796875 45.0625 -15.140625 -Q 39.265625 -21.484375 27.984375 -21.484375 -Q 24.265625 -21.484375 20.203125 -20.796875 -Q 16.15625 -20.125 12.109375 -18.796875 -L 12.109375 -9.90625 -Q 16.890625 -12.15625 20.796875 -13.234375 -Q 24.703125 -14.3125 27.984375 -14.3125 -Q 35.25 -14.3125 38.5625 -10.34375 -Q 41.890625 -6.390625 41.890625 2.203125 -L 41.890625 2.59375 -L 41.890625 8.6875 -Q 39.75 4.109375 36.03125 1.859375 -Q 32.328125 -0.390625 27 -0.390625 -Q 17.4375 -0.390625 11.71875 7.265625 -Q 6 14.9375 6 27.78125 -Q 6 40.671875 11.71875 48.328125 -Q 17.4375 56 27 56 -Q 32.28125 56 35.9375 53.90625 -Q 39.59375 51.8125 41.890625 47.40625 -L 41.890625 54.5 -L 50.875 54.5 -z -" id="DejaVuSansMono-67"/> - <path d="M 34.28125 27.484375 -L 31.296875 27.484375 -Q 23.4375 27.484375 19.453125 24.71875 -Q 15.484375 21.96875 15.484375 16.5 -Q 15.484375 11.578125 18.453125 8.84375 -Q 21.4375 6.109375 26.703125 6.109375 -Q 34.125 6.109375 38.375 11.25 -Q 42.625 16.40625 42.671875 25.484375 -L 42.671875 27.484375 -z -M 51.703125 31.203125 -L 51.703125 0 -L 42.671875 0 -L 42.671875 8.109375 -Q 39.796875 3.21875 35.421875 0.890625 -Q 31.0625 -1.421875 24.8125 -1.421875 -Q 16.453125 -1.421875 11.46875 3.296875 -Q 6.5 8.015625 6.5 15.921875 -Q 6.5 25.046875 12.625 29.78125 -Q 18.75 34.515625 30.609375 34.515625 -L 42.671875 34.515625 -L 42.671875 35.9375 -Q 42.625 42.484375 39.34375 45.4375 -Q 36.078125 48.390625 28.90625 48.390625 -Q 24.3125 48.390625 19.625 47.0625 -Q 14.9375 45.75 10.5 43.21875 -L 10.5 52.203125 -Q 15.484375 54.109375 20.046875 55.046875 -Q 24.609375 56 28.90625 56 -Q 35.6875 56 40.5 54 -Q 45.3125 52 48.296875 48 -Q 50.140625 45.5625 50.921875 41.96875 -Q 51.703125 38.375 51.703125 31.203125 -z -" id="DejaVuSansMono-61"/> - <path d="M 33.015625 49.125 -Q 34.671875 52.640625 37.234375 54.3125 -Q 39.796875 56 43.40625 56 -Q 50 56 52.703125 50.890625 -Q 55.421875 45.796875 55.421875 31.6875 -L 55.421875 0 -L 47.21875 0 -L 47.21875 31.296875 -Q 47.21875 42.875 45.921875 45.671875 -Q 44.625 48.484375 41.21875 48.484375 -Q 37.3125 48.484375 35.859375 45.484375 -Q 34.421875 42.484375 34.421875 31.296875 -L 34.421875 0 -L 26.21875 0 -L 26.21875 31.296875 -Q 26.21875 43.015625 24.828125 45.75 -Q 23.4375 48.484375 19.828125 48.484375 -Q 16.265625 48.484375 14.875 45.484375 -Q 13.484375 42.484375 13.484375 31.296875 -L 13.484375 0 -L 5.328125 0 -L 5.328125 54.6875 -L 13.484375 54.6875 -L 13.484375 50 -Q 15.09375 52.9375 17.5 54.46875 -Q 19.921875 56 23 56 -Q 26.703125 56 29.171875 54.296875 -Q 31.640625 52.59375 33.015625 49.125 -z -" id="DejaVuSansMono-6d"/> - <path d="M 54.296875 29.59375 -L 54.296875 25.203125 -L 15.375 25.203125 -L 15.375 24.90625 -Q 15.375 15.96875 20.03125 11.078125 -Q 24.703125 6.203125 33.203125 6.203125 -Q 37.5 6.203125 42.1875 7.5625 -Q 46.875 8.9375 52.203125 11.71875 -L 52.203125 2.78125 -Q 47.078125 0.6875 42.3125 -0.359375 -Q 37.546875 -1.421875 33.109375 -1.421875 -Q 20.359375 -1.421875 13.171875 6.21875 -Q 6 13.875 6 27.296875 -Q 6 40.375 13.03125 48.1875 -Q 20.0625 56 31.78125 56 -Q 42.234375 56 48.265625 48.921875 -Q 54.296875 41.84375 54.296875 29.59375 -z -M 45.3125 32.234375 -Q 45.125 40.140625 41.578125 44.265625 -Q 38.03125 48.390625 31.390625 48.390625 -Q 24.90625 48.390625 20.703125 44.09375 -Q 16.5 39.796875 15.71875 32.171875 -z -" id="DejaVuSansMono-65"/> - <path d="M 51.90625 75.984375 -L 51.90625 68.5 -L 41.703125 68.5 -Q 36.859375 68.5 34.984375 66.515625 -Q 33.109375 64.546875 33.109375 59.515625 -L 33.109375 54.6875 -L 51.90625 54.6875 -L 51.90625 47.703125 -L 33.109375 47.703125 -L 33.109375 0 -L 24.125 0 -L 24.125 47.703125 -L 9.515625 47.703125 -L 9.515625 54.6875 -L 24.125 54.6875 -L 24.125 58.5 -Q 24.125 67.484375 28.25 71.734375 -Q 32.375 75.984375 41.109375 75.984375 -z -" id="DejaVuSansMono-66"/> - <path d="M 51.8125 2.78125 -Q 48.1875 0.6875 44.359375 -0.359375 -Q 40.53125 -1.421875 36.53125 -1.421875 -Q 23.828125 -1.421875 16.671875 6.1875 -Q 9.515625 13.8125 9.515625 27.296875 -Q 9.515625 40.765625 16.671875 48.375 -Q 23.828125 56 36.53125 56 -Q 40.484375 56 44.234375 54.96875 -Q 48 53.953125 51.8125 51.8125 -L 51.8125 42.390625 -Q 48.25 45.5625 44.65625 46.96875 -Q 41.0625 48.390625 36.53125 48.390625 -Q 28.078125 48.390625 23.53125 42.921875 -Q 19 37.453125 19 27.296875 -Q 19 17.1875 23.5625 11.6875 -Q 28.125 6.203125 36.53125 6.203125 -Q 41.21875 6.203125 44.921875 7.640625 -Q 48.640625 9.078125 51.8125 12.109375 -z -" id="DejaVuSansMono-63"/> - <path d="M 29.984375 70.21875 -L 29.984375 54.6875 -L 50.390625 54.6875 -L 50.390625 47.703125 -L 29.984375 47.703125 -L 29.984375 18.015625 -Q 29.984375 11.96875 32.28125 9.5625 -Q 34.578125 7.171875 40.28125 7.171875 -L 50.390625 7.171875 -L 50.390625 0 -L 39.40625 0 -Q 29.296875 0 25.140625 4.046875 -Q 21 8.109375 21 18.015625 -L 21 47.703125 -L 6.390625 47.703125 -L 6.390625 54.6875 -L 21 54.6875 -L 21 70.21875 -z -" id="DejaVuSansMono-74"/> - <path d="M 12.5 54.6875 -L 35.5 54.6875 -L 35.5 6.984375 -L 53.328125 6.984375 -L 53.328125 0 -L 8.6875 0 -L 8.6875 6.984375 -L 26.515625 6.984375 -L 26.515625 47.703125 -L 12.5 47.703125 -z -M 26.515625 75.984375 -L 35.5 75.984375 -L 35.5 64.59375 -L 26.515625 64.59375 -z -" id="DejaVuSansMono-69"/> - <path d="M 4.890625 54.6875 -L 14.203125 54.6875 -L 30.078125 8.796875 -L 46 54.6875 -L 55.328125 54.6875 -L 35.890625 0 -L 24.3125 0 -z -" id="DejaVuSansMono-76"/> - <path id="DejaVuSansMono-20"/> - <path d="M 17.390625 31.390625 -L 42.828125 31.390625 -L 42.828125 23.390625 -L 17.390625 23.390625 -z -" id="DejaVuSansMono-2d"/> - <path d="M 13.1875 8.296875 -L 28.515625 8.296875 -L 28.515625 64.015625 -L 12.015625 60.296875 -L 12.015625 69.28125 -L 28.421875 72.90625 -L 38.28125 72.90625 -L 38.28125 8.296875 -L 53.421875 8.296875 -L 53.421875 0 -L 13.1875 0 -z -" id="DejaVuSansMono-31"/> - </defs> - <g transform="translate(60.395152 52.770701)scale(0.055 -0.055)"> - <use transform="translate(0 0.484375)" xlink:href="#Cmmi10-6e"/> - <use transform="translate(60.009766 -16.521875)scale(0.7)" xlink:href="#Cmr10-48"/> - <use transform="translate(118.887109 0.484375)" xlink:href="#DejaVuSansMono-5e"/> - <use transform="translate(179.092187 0.484375)" xlink:href="#DejaVuSansMono-43"/> - <use transform="translate(239.297266 0.484375)" xlink:href="#DejaVuSansMono-6f"/> - <use transform="translate(299.502344 0.484375)" xlink:href="#DejaVuSansMono-6f"/> - <use transform="translate(359.707422 0.484375)" xlink:href="#DejaVuSansMono-6c"/> - <use transform="translate(419.9125 0.484375)" xlink:href="#DejaVuSansMono-5f"/> - <use transform="translate(480.117578 0.484375)" xlink:href="#DejaVuSansMono-67"/> - <use transform="translate(540.322656 0.484375)" xlink:href="#DejaVuSansMono-61"/> - <use transform="translate(600.527734 0.484375)" xlink:href="#DejaVuSansMono-6d"/> - <use transform="translate(660.732813 0.484375)" xlink:href="#DejaVuSansMono-6d"/> - <use transform="translate(720.937891 0.484375)" xlink:href="#DejaVuSansMono-61"/> - <use transform="translate(781.142969 0.484375)" xlink:href="#DejaVuSansMono-5f"/> - <use transform="translate(841.348047 0.484375)" xlink:href="#DejaVuSansMono-65"/> - <use transform="translate(901.553125 0.484375)" xlink:href="#DejaVuSansMono-66"/> - <use transform="translate(961.758203 0.484375)" xlink:href="#DejaVuSansMono-66"/> - <use transform="translate(1021.963281 0.484375)" xlink:href="#DejaVuSansMono-65"/> - <use transform="translate(1082.168359 0.484375)" xlink:href="#DejaVuSansMono-63"/> - <use transform="translate(1142.373437 0.484375)" xlink:href="#DejaVuSansMono-74"/> - <use transform="translate(1202.578516 0.484375)" xlink:href="#DejaVuSansMono-69"/> - <use transform="translate(1262.783594 0.484375)" xlink:href="#DejaVuSansMono-76"/> - <use transform="translate(1322.988672 0.484375)" xlink:href="#DejaVuSansMono-65"/> - <use transform="translate(1383.19375 0.484375)" xlink:href="#DejaVuSansMono-20"/> - <use transform="translate(1443.398828 0.484375)" xlink:href="#DejaVuSansMono-2d"/> - <use transform="translate(1503.603906 0.484375)" xlink:href="#DejaVuSansMono-20"/> - <use transform="translate(1563.808984 0.484375)" xlink:href="#DejaVuSansMono-31"/> - </g> - </g> - <g id="text_13"> - <!-- $n_{\rm H}$^Jeans_gamma_effective - 1 --> - <defs> - <path d="M 5.328125 2.984375 -L 5.328125 14.5 -Q 9.765625 10.546875 14.5 8.5625 -Q 19.234375 6.59375 24.3125 6.59375 -Q 31.296875 6.59375 34.046875 10.234375 -Q 36.8125 13.875 36.8125 23.78125 -L 36.8125 64.59375 -L 18.21875 64.59375 -L 18.21875 72.90625 -L 46.6875 72.90625 -L 46.6875 23.78125 -Q 46.6875 10.015625 41.53125 4.296875 -Q 36.375 -1.421875 24.3125 -1.421875 -Q 19.625 -1.421875 14.984375 -0.34375 -Q 10.359375 0.734375 5.328125 2.984375 -z -" id="DejaVuSansMono-4a"/> - <path d="M 51.3125 33.890625 -L 51.3125 0 -L 42.28125 0 -L 42.28125 33.890625 -Q 42.28125 41.265625 39.6875 44.71875 -Q 37.109375 48.1875 31.59375 48.1875 -Q 25.296875 48.1875 21.890625 43.71875 -Q 18.5 39.265625 18.5 30.90625 -L 18.5 0 -L 9.515625 0 -L 9.515625 54.6875 -L 18.5 54.6875 -L 18.5 46.484375 -Q 20.90625 51.171875 25 53.578125 -Q 29.109375 56 34.71875 56 -Q 43.0625 56 47.1875 50.5 -Q 51.3125 45.015625 51.3125 33.890625 -z -" id="DejaVuSansMono-6e"/> - <path d="M 47.515625 52.78125 -L 47.515625 44 -Q 43.65625 46.234375 39.75 47.359375 -Q 35.84375 48.484375 31.78125 48.484375 -Q 25.6875 48.484375 22.671875 46.5 -Q 19.671875 44.53125 19.671875 40.484375 -Q 19.671875 36.8125 21.921875 35 -Q 24.171875 33.203125 33.109375 31.5 -L 36.71875 30.8125 -Q 43.40625 29.546875 46.84375 25.734375 -Q 50.296875 21.921875 50.296875 15.828125 -Q 50.296875 7.71875 44.53125 3.140625 -Q 38.765625 -1.421875 28.515625 -1.421875 -Q 24.46875 -1.421875 20.015625 -0.5625 -Q 15.578125 0.296875 10.40625 2 -L 10.40625 11.28125 -Q 15.4375 8.6875 20.015625 7.390625 -Q 24.609375 6.109375 28.71875 6.109375 -Q 34.671875 6.109375 37.9375 8.515625 -Q 41.21875 10.9375 41.21875 15.28125 -Q 41.21875 21.53125 29.25 23.921875 -L 28.859375 24.03125 -L 25.484375 24.703125 -Q 17.71875 26.21875 14.15625 29.8125 -Q 10.59375 33.40625 10.59375 39.59375 -Q 10.59375 47.46875 15.90625 51.734375 -Q 21.234375 56 31.109375 56 -Q 35.5 56 39.546875 55.1875 -Q 43.609375 54.390625 47.515625 52.78125 -z -" id="DejaVuSansMono-73"/> - </defs> - <g transform="translate(151.213631 69.615498)rotate(-43)scale(0.055 -0.055)"> - <use transform="translate(0 0.015625)" xlink:href="#Cmmi10-6e"/> - <use transform="translate(60.009766 -16.990625)scale(0.7)" xlink:href="#Cmr10-48"/> - <use transform="translate(118.887109 0.015625)" xlink:href="#DejaVuSansMono-5e"/> - <use transform="translate(179.092187 0.015625)" xlink:href="#DejaVuSansMono-4a"/> - <use transform="translate(239.297266 0.015625)" xlink:href="#DejaVuSansMono-65"/> - <use transform="translate(299.502344 0.015625)" xlink:href="#DejaVuSansMono-61"/> - <use transform="translate(359.707422 0.015625)" xlink:href="#DejaVuSansMono-6e"/> - <use transform="translate(419.9125 0.015625)" xlink:href="#DejaVuSansMono-73"/> - <use transform="translate(480.117578 0.015625)" xlink:href="#DejaVuSansMono-5f"/> - <use transform="translate(540.322656 0.015625)" xlink:href="#DejaVuSansMono-67"/> - <use transform="translate(600.527734 0.015625)" xlink:href="#DejaVuSansMono-61"/> - <use transform="translate(660.732813 0.015625)" xlink:href="#DejaVuSansMono-6d"/> - <use transform="translate(720.937891 0.015625)" xlink:href="#DejaVuSansMono-6d"/> - <use transform="translate(781.142969 0.015625)" xlink:href="#DejaVuSansMono-61"/> - <use transform="translate(841.348047 0.015625)" xlink:href="#DejaVuSansMono-5f"/> - <use transform="translate(901.553125 0.015625)" xlink:href="#DejaVuSansMono-65"/> - <use transform="translate(961.758203 0.015625)" xlink:href="#DejaVuSansMono-66"/> - <use transform="translate(1021.963281 0.015625)" xlink:href="#DejaVuSansMono-66"/> - <use transform="translate(1082.168359 0.015625)" xlink:href="#DejaVuSansMono-65"/> - <use transform="translate(1142.373437 0.015625)" xlink:href="#DejaVuSansMono-63"/> - <use transform="translate(1202.578516 0.015625)" xlink:href="#DejaVuSansMono-74"/> - <use transform="translate(1262.783594 0.015625)" xlink:href="#DejaVuSansMono-69"/> - <use transform="translate(1322.988672 0.015625)" xlink:href="#DejaVuSansMono-76"/> - <use transform="translate(1383.19375 0.015625)" xlink:href="#DejaVuSansMono-65"/> - <use transform="translate(1443.398828 0.015625)" xlink:href="#DejaVuSansMono-20"/> - <use transform="translate(1503.603906 0.015625)" xlink:href="#DejaVuSansMono-2d"/> - <use transform="translate(1563.808984 0.015625)" xlink:href="#DejaVuSansMono-20"/> - <use transform="translate(1624.014062 0.015625)" xlink:href="#DejaVuSansMono-31"/> - </g> - </g> - <g id="text_14"> - <!-- Cool_density_threshold_H_p_cm3 --> - <defs> - <path d="M 41.890625 47.703125 -L 41.890625 75.984375 -L 50.875 75.984375 -L 50.875 0 -L 41.890625 0 -L 41.890625 6.890625 -Q 39.65625 2.828125 35.90625 0.703125 -Q 32.171875 -1.421875 27.296875 -1.421875 -Q 17.390625 -1.421875 11.6875 6.265625 -Q 6 13.96875 6 27.484375 -Q 6 40.828125 11.71875 48.40625 -Q 17.4375 56 27.296875 56 -Q 32.234375 56 35.984375 53.875 -Q 39.75 51.765625 41.890625 47.703125 -z -M 15.484375 27.296875 -Q 15.484375 16.84375 18.796875 11.515625 -Q 22.125 6.203125 28.609375 6.203125 -Q 35.109375 6.203125 38.5 11.5625 -Q 41.890625 16.9375 41.890625 27.296875 -Q 41.890625 37.703125 38.5 43.046875 -Q 35.109375 48.390625 28.609375 48.390625 -Q 22.125 48.390625 18.796875 43.0625 -Q 15.484375 37.75 15.484375 27.296875 -z -" id="DejaVuSansMono-64"/> - <path d="M 41.890625 17.578125 -Q 39.65625 11.859375 36.1875 2.546875 -Q 31.34375 -10.359375 29.6875 -13.1875 -Q 27.4375 -17 24.0625 -18.890625 -Q 20.703125 -20.796875 16.21875 -20.796875 -L 8.984375 -20.796875 -L 8.984375 -13.28125 -L 14.3125 -13.28125 -Q 18.265625 -13.28125 20.5 -10.984375 -Q 22.75 -8.6875 26.21875 0.875 -L 5.078125 54.6875 -L 14.59375 54.6875 -L 30.8125 11.921875 -L 46.78125 54.6875 -L 56.296875 54.6875 -z -" id="DejaVuSansMono-79"/> - <path d="M 51.3125 33.890625 -L 51.3125 0 -L 42.28125 0 -L 42.28125 33.890625 -Q 42.28125 41.265625 39.6875 44.71875 -Q 37.109375 48.1875 31.59375 48.1875 -Q 25.296875 48.1875 21.890625 43.71875 -Q 18.5 39.265625 18.5 30.90625 -L 18.5 0 -L 9.515625 0 -L 9.515625 75.984375 -L 18.5 75.984375 -L 18.5 46.484375 -Q 20.90625 51.171875 25 53.578125 -Q 29.109375 56 34.71875 56 -Q 43.0625 56 47.1875 50.5 -Q 51.3125 45.015625 51.3125 33.890625 -z -" id="DejaVuSansMono-68"/> - <path d="M 56.390625 43.40625 -Q 53.515625 45.65625 50.53125 46.671875 -Q 47.5625 47.703125 44 47.703125 -Q 35.59375 47.703125 31.140625 42.421875 -Q 26.703125 37.15625 26.703125 27.203125 -L 26.703125 0 -L 17.671875 0 -L 17.671875 54.6875 -L 26.703125 54.6875 -L 26.703125 44 -Q 28.953125 49.8125 33.609375 52.90625 -Q 38.28125 56 44.671875 56 -Q 48 56 50.875 55.171875 -Q 53.765625 54.34375 56.390625 52.59375 -z -" id="DejaVuSansMono-72"/> - <path d="M 6.6875 72.90625 -L 16.609375 72.90625 -L 16.609375 43.015625 -L 43.609375 43.015625 -L 43.609375 72.90625 -L 53.515625 72.90625 -L 53.515625 0 -L 43.609375 0 -L 43.609375 34.71875 -L 16.609375 34.71875 -L 16.609375 0 -L 6.6875 0 -z -" id="DejaVuSansMono-48"/> - <path d="M 18.3125 6.890625 -L 18.3125 -20.796875 -L 9.28125 -20.796875 -L 9.28125 54.6875 -L 18.3125 54.6875 -L 18.3125 47.703125 -Q 20.5625 51.765625 24.296875 53.875 -Q 28.03125 56 32.90625 56 -Q 42.828125 56 48.46875 48.328125 -Q 54.109375 40.671875 54.109375 27.09375 -Q 54.109375 13.765625 48.4375 6.171875 -Q 42.78125 -1.421875 32.90625 -1.421875 -Q 27.9375 -1.421875 24.1875 0.703125 -Q 20.453125 2.828125 18.3125 6.890625 -z -M 44.671875 27.296875 -Q 44.671875 37.75 41.375 43.0625 -Q 38.09375 48.390625 31.59375 48.390625 -Q 25.046875 48.390625 21.671875 43.046875 -Q 18.3125 37.703125 18.3125 27.296875 -Q 18.3125 16.9375 21.671875 11.5625 -Q 25.046875 6.203125 31.59375 6.203125 -Q 38.09375 6.203125 41.375 11.515625 -Q 44.671875 16.84375 44.671875 27.296875 -z -" id="DejaVuSansMono-70"/> - <path d="M 37.890625 39.015625 -Q 45.0625 37.109375 48.875 32.25 -Q 52.6875 27.390625 52.6875 20.125 -Q 52.6875 10.0625 45.921875 4.3125 -Q 39.15625 -1.421875 27.203125 -1.421875 -Q 22.171875 -1.421875 16.9375 -0.484375 -Q 11.71875 0.4375 6.6875 2.203125 -L 6.6875 12.015625 -Q 11.671875 9.421875 16.5 8.15625 -Q 21.34375 6.890625 26.125 6.890625 -Q 34.234375 6.890625 38.578125 10.546875 -Q 42.921875 14.203125 42.921875 21.09375 -Q 42.921875 27.4375 38.578125 31.171875 -Q 34.234375 34.90625 26.8125 34.90625 -L 19.28125 34.90625 -L 19.28125 43.015625 -L 26.8125 43.015625 -Q 33.59375 43.015625 37.40625 45.984375 -Q 41.21875 48.96875 41.21875 54.296875 -Q 41.21875 59.90625 37.671875 62.90625 -Q 34.125 65.921875 27.59375 65.921875 -Q 23.25 65.921875 18.609375 64.9375 -Q 13.96875 63.96875 8.890625 62.015625 -L 8.890625 71.09375 -Q 14.796875 72.65625 19.40625 73.4375 -Q 24.03125 74.21875 27.59375 74.21875 -Q 38.234375 74.21875 44.609375 68.875 -Q 50.984375 63.53125 50.984375 54.6875 -Q 50.984375 48.6875 47.625 44.671875 -Q 44.28125 40.671875 37.890625 39.015625 -z -" id="DejaVuSansMono-33"/> - </defs> - <g transform="translate(76.031817 194.356252)rotate(-90)scale(0.055 -0.055)"> - <use xlink:href="#DejaVuSansMono-43"/> - <use x="60.205078" xlink:href="#DejaVuSansMono-6f"/> - <use x="120.410156" xlink:href="#DejaVuSansMono-6f"/> - <use x="180.615234" xlink:href="#DejaVuSansMono-6c"/> - <use x="240.820312" xlink:href="#DejaVuSansMono-5f"/> - <use x="301.025391" xlink:href="#DejaVuSansMono-64"/> - <use x="361.230469" xlink:href="#DejaVuSansMono-65"/> - <use x="421.435547" xlink:href="#DejaVuSansMono-6e"/> - <use x="481.640625" xlink:href="#DejaVuSansMono-73"/> - <use x="541.845703" xlink:href="#DejaVuSansMono-69"/> - <use x="602.050781" xlink:href="#DejaVuSansMono-74"/> - <use x="662.255859" xlink:href="#DejaVuSansMono-79"/> - <use x="722.460938" xlink:href="#DejaVuSansMono-5f"/> - <use x="782.666016" xlink:href="#DejaVuSansMono-74"/> - <use x="842.871094" xlink:href="#DejaVuSansMono-68"/> - <use x="903.076172" xlink:href="#DejaVuSansMono-72"/> - <use x="963.28125" xlink:href="#DejaVuSansMono-65"/> - <use x="1023.486328" xlink:href="#DejaVuSansMono-73"/> - <use x="1083.691406" xlink:href="#DejaVuSansMono-68"/> - <use x="1143.896484" xlink:href="#DejaVuSansMono-6f"/> - <use x="1204.101562" xlink:href="#DejaVuSansMono-6c"/> - <use x="1264.306641" xlink:href="#DejaVuSansMono-64"/> - <use x="1324.511719" xlink:href="#DejaVuSansMono-5f"/> - <use x="1384.716797" xlink:href="#DejaVuSansMono-48"/> - <use x="1444.921875" xlink:href="#DejaVuSansMono-5f"/> - <use x="1505.126953" xlink:href="#DejaVuSansMono-70"/> - <use x="1565.332031" xlink:href="#DejaVuSansMono-5f"/> - <use x="1625.537109" xlink:href="#DejaVuSansMono-63"/> - <use x="1685.742188" xlink:href="#DejaVuSansMono-6d"/> - <use x="1745.947266" xlink:href="#DejaVuSansMono-33"/> - </g> - </g> - <g id="text_15"> - <!-- Jeans_density_threshold_H_p_cm3 --> - <g transform="translate(145.308908 194.356252)rotate(-90)scale(0.055 -0.055)"> - <use xlink:href="#DejaVuSansMono-4a"/> - <use x="60.205078" xlink:href="#DejaVuSansMono-65"/> - <use x="120.410156" xlink:href="#DejaVuSansMono-61"/> - <use x="180.615234" xlink:href="#DejaVuSansMono-6e"/> - <use x="240.820312" xlink:href="#DejaVuSansMono-73"/> - <use x="301.025391" xlink:href="#DejaVuSansMono-5f"/> - <use x="361.230469" xlink:href="#DejaVuSansMono-64"/> - <use x="421.435547" xlink:href="#DejaVuSansMono-65"/> - <use x="481.640625" xlink:href="#DejaVuSansMono-6e"/> - <use x="541.845703" xlink:href="#DejaVuSansMono-73"/> - <use x="602.050781" xlink:href="#DejaVuSansMono-69"/> - <use x="662.255859" xlink:href="#DejaVuSansMono-74"/> - <use x="722.460938" xlink:href="#DejaVuSansMono-79"/> - <use x="782.666016" xlink:href="#DejaVuSansMono-5f"/> - <use x="842.871094" xlink:href="#DejaVuSansMono-74"/> - <use x="903.076172" xlink:href="#DejaVuSansMono-68"/> - <use x="963.28125" xlink:href="#DejaVuSansMono-72"/> - <use x="1023.486328" xlink:href="#DejaVuSansMono-65"/> - <use x="1083.691406" xlink:href="#DejaVuSansMono-73"/> - <use x="1143.896484" xlink:href="#DejaVuSansMono-68"/> - <use x="1204.101562" xlink:href="#DejaVuSansMono-6f"/> - <use x="1264.306641" xlink:href="#DejaVuSansMono-6c"/> - <use x="1324.511719" xlink:href="#DejaVuSansMono-64"/> - <use x="1384.716797" xlink:href="#DejaVuSansMono-5f"/> - <use x="1444.921875" xlink:href="#DejaVuSansMono-48"/> - <use x="1505.126953" xlink:href="#DejaVuSansMono-5f"/> - <use x="1565.332031" xlink:href="#DejaVuSansMono-70"/> - <use x="1625.537109" xlink:href="#DejaVuSansMono-5f"/> - <use x="1685.742188" xlink:href="#DejaVuSansMono-63"/> - <use x="1745.947266" xlink:href="#DejaVuSansMono-6d"/> - <use x="1806.152344" xlink:href="#DejaVuSansMono-33"/> - </g> - </g> - <g id="text_16"> - <!-- Cool_temperature_norm_K --> - <defs> - <path d="M 9.515625 20.703125 -L 9.515625 54.59375 -L 18.5 54.59375 -L 18.5 20.703125 -Q 18.5 13.328125 21.109375 9.859375 -Q 23.734375 6.390625 29.203125 6.390625 -Q 35.546875 6.390625 38.90625 10.859375 -Q 42.28125 15.328125 42.28125 23.6875 -L 42.28125 54.59375 -L 51.3125 54.59375 -L 51.3125 0 -L 42.28125 0 -L 42.28125 8.203125 -Q 39.890625 3.46875 35.765625 1.015625 -Q 31.640625 -1.421875 26.125 -1.421875 -Q 17.71875 -1.421875 13.609375 4.078125 -Q 9.515625 9.578125 9.515625 20.703125 -z -" id="DejaVuSansMono-75"/> - <path d="M 6.6875 72.90625 -L 16.609375 72.90625 -L 16.609375 40.484375 -L 47.40625 72.90625 -L 58.984375 72.90625 -L 30.609375 43.109375 -L 59.8125 0 -L 47.90625 0 -L 24.125 36.53125 -L 16.609375 28.515625 -L 16.609375 0 -L 6.6875 0 -z -" id="DejaVuSansMono-4b"/> - </defs> - <g transform="translate(37.862259 67.119164)scale(0.055 -0.055)"> - <use xlink:href="#DejaVuSansMono-43"/> - <use x="60.205078" xlink:href="#DejaVuSansMono-6f"/> - <use x="120.410156" xlink:href="#DejaVuSansMono-6f"/> - <use x="180.615234" xlink:href="#DejaVuSansMono-6c"/> - <use x="240.820312" xlink:href="#DejaVuSansMono-5f"/> - <use x="301.025391" xlink:href="#DejaVuSansMono-74"/> - <use x="361.230469" xlink:href="#DejaVuSansMono-65"/> - <use x="421.435547" xlink:href="#DejaVuSansMono-6d"/> - <use x="481.640625" xlink:href="#DejaVuSansMono-70"/> - <use x="541.845703" xlink:href="#DejaVuSansMono-65"/> - <use x="602.050781" xlink:href="#DejaVuSansMono-72"/> - <use x="662.255859" xlink:href="#DejaVuSansMono-61"/> - <use x="722.460938" xlink:href="#DejaVuSansMono-74"/> - <use x="782.666016" xlink:href="#DejaVuSansMono-75"/> - <use x="842.871094" xlink:href="#DejaVuSansMono-72"/> - <use x="903.076172" xlink:href="#DejaVuSansMono-65"/> - <use x="963.28125" xlink:href="#DejaVuSansMono-5f"/> - <use x="1023.486328" xlink:href="#DejaVuSansMono-6e"/> - <use x="1083.691406" xlink:href="#DejaVuSansMono-6f"/> - <use x="1143.896484" xlink:href="#DejaVuSansMono-72"/> - <use x="1204.101562" xlink:href="#DejaVuSansMono-6d"/> - <use x="1264.306641" xlink:href="#DejaVuSansMono-5f"/> - <use x="1324.511719" xlink:href="#DejaVuSansMono-4b"/> - </g> - </g> - <g id="text_17"> - <!-- Jeans_temperature_norm_K --> - <g transform="translate(37.862259 81.797988)scale(0.055 -0.055)"> - <use xlink:href="#DejaVuSansMono-4a"/> - <use x="60.205078" xlink:href="#DejaVuSansMono-65"/> - <use x="120.410156" xlink:href="#DejaVuSansMono-61"/> - <use x="180.615234" xlink:href="#DejaVuSansMono-6e"/> - <use x="240.820312" xlink:href="#DejaVuSansMono-73"/> - <use x="301.025391" xlink:href="#DejaVuSansMono-5f"/> - <use x="361.230469" xlink:href="#DejaVuSansMono-74"/> - <use x="421.435547" xlink:href="#DejaVuSansMono-65"/> - <use x="481.640625" xlink:href="#DejaVuSansMono-6d"/> - <use x="541.845703" xlink:href="#DejaVuSansMono-70"/> - <use x="602.050781" xlink:href="#DejaVuSansMono-65"/> - <use x="662.255859" xlink:href="#DejaVuSansMono-72"/> - <use x="722.460938" xlink:href="#DejaVuSansMono-61"/> - <use x="782.666016" xlink:href="#DejaVuSansMono-74"/> - <use x="842.871094" xlink:href="#DejaVuSansMono-75"/> - <use x="903.076172" xlink:href="#DejaVuSansMono-72"/> - <use x="963.28125" xlink:href="#DejaVuSansMono-65"/> - <use x="1023.486328" xlink:href="#DejaVuSansMono-5f"/> - <use x="1083.691406" xlink:href="#DejaVuSansMono-6e"/> - <use x="1143.896484" xlink:href="#DejaVuSansMono-6f"/> - <use x="1204.101562" xlink:href="#DejaVuSansMono-72"/> - <use x="1264.306641" xlink:href="#DejaVuSansMono-6d"/> - <use x="1324.511719" xlink:href="#DejaVuSansMono-5f"/> - <use x="1384.716797" xlink:href="#DejaVuSansMono-4b"/> - </g> - </g> - </g> - </g> - <defs> - <clipPath id="p5e3fe66b1e"> - <rect height="195.048" width="190.512" x="34.02" y="2.268"/> - </clipPath> - </defs> -</svg> diff --git a/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_SF_EOS.py b/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_SF_EOS.py index 88ca56d750bf716fea8b4bf72b70c2b598953ac7..e5c954127c0ed88aef8a277a1ea9a4dc1f8bff70 100644 --- a/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_SF_EOS.py +++ b/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_SF_EOS.py @@ -1,3 +1,9 @@ +import os + +if os.path.exists("EAGLE_SF_EOS.svg"): + # do not generate plot again + exit() + import matplotlib matplotlib.use("Agg") diff --git a/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_SF_Z_dep.py b/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_SF_Z_dep.py index 26ae522947ecc9e75f6f287bafed0bb9acb9134a..26cda85bea458731906e80126b160626fbee2edd 100644 --- a/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_SF_Z_dep.py +++ b/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_SF_Z_dep.py @@ -1,3 +1,9 @@ +import os + +if os.path.exists("EAGLE_SF_Z_dep.svg"): + # do not generate plot again + exit() + import matplotlib matplotlib.use("Agg") diff --git a/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_entropy_floor.py b/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_entropy_floor.py index 00de0e382e1e7f04e7508703addea3464edccd43..66d38c2b47cbc6b984cc45f3ce316f3134a706e0 100644 --- a/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_entropy_floor.py +++ b/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_entropy_floor.py @@ -1,3 +1,9 @@ +import os + +if os.path.exists("EAGLE_entropy_floor.svg"): + # do not generate plot again + exit() + import matplotlib matplotlib.use("Agg") diff --git a/doc/RTD/source/SubgridModels/index.rst b/doc/RTD/source/SubgridModels/index.rst index 9dba18c3f5595dc3b2f8275c7610c9bb32ce2b43..d835e6baf442ed6988cafbe70c92fe5992f04ca2 100644 --- a/doc/RTD/source/SubgridModels/index.rst +++ b/doc/RTD/source/SubgridModels/index.rst @@ -17,3 +17,4 @@ be use as an empty canvas to be copied to create additional models. QuickLymanAlpha/index GEAR/index Basic/index + AGNSpinJets/index diff --git a/doc/RTD/source/conf.py b/doc/RTD/source/conf.py index 24e89bdd11a2affec726838bf6e984687cb77e44..c14bfc6263af7bfe75e95f793638846d52b301e4 100644 --- a/doc/RTD/source/conf.py +++ b/doc/RTD/source/conf.py @@ -19,7 +19,7 @@ # -- Project information ----------------------------------------------------- project = "SWIFT: SPH With Inter-dependent Fine-grained Tasking" -copyright = "2014-2021, SWIFT Collaboration" +copyright = "2014-2022, SWIFT Collaboration" author = "SWIFT Team" # The short X.Y version @@ -27,6 +27,20 @@ version = "0.9" # The full version, including alpha/beta/rc tags release = "0.9.0" +# -- Find additional scripts to run as part of the documentation build ------- +import glob +import os +import subprocess + +additional_scripts = glob.glob("**/*.py", recursive=True) +# remove this script +additional_scripts.remove("conf.py") +for additional_script in additional_scripts: + wdir, script = os.path.split(additional_script) + print(f"Running {additional_script}...") + status = subprocess.run(f"python3 {script}", shell=True, cwd=wdir) + if not status.returncode == 0: + raise RuntimeError(f"Could not run script!") # -- General configuration --------------------------------------------------- diff --git a/examples/parameter_example.yml b/examples/parameter_example.yml index bb33b1351ce6a64ad0a8fb834202099fe0896fa0..9272c209455dc3fe068ec7d7087df2b5b1965ac1 100644 --- a/examples/parameter_example.yml +++ b/examples/parameter_example.yml @@ -659,6 +659,73 @@ EAGLEAGN: merger_max_distance_ratio: 3.0 # Maximal distance over which two BHs can merge, in units of the softening length. minimum_timestep_Myr: 1.0 # Minimum time-step size for BHs in Mega-years. The time-step size is computed based on the accretion rate and this serves as a minimum. Defaults to FLT_MAX. +# Spin-jet AGN model +SPINJETAGN: + subgrid_seed_mass_Msun: 1e5 # Black hole subgrid mass at creation time in solar masses. + use_subgrid_mass_from_ics: 1 # (Optional) Use subgrid masses specified in ICs [1, default], or initialise them to particle masses [0]? + with_subgrid_mass_check: 1 # (Optional) Verify that initial black hole subgrid masses are positive [1, default]. Only used if use_subgrid_mass_from_ics is 1. + use_multi_phase_bondi: 0 # Compute Bondi rates per neighbour particle [1] or for the smoothed ambient gas around the black hole [0]? + use_subgrid_gas_properties: 1 # Use subgrid density [1] or dynamical density [0] to calculate BH accretion rates? + use_krumholz: 1 # Use Krumholz et al. (2006) [1] or standard Bondi-Hoyle-Lyttleton formula [0] for black hole accretion rates? Only used if multi_phase_bondi is 0. + with_krumholz_vorticity: 0 # Include the vorticity term in Krumholz et al. formula? Only used if use_multi_phase_bondi is 0. + with_angmom_limiter: 0 # Are we applying the Rosas-Guevara (2015) viscous time-scale reduction term? + viscous_alpha: 1e6 # Normalisation constant of the viscous time-scale in the accretion reduction term. Only used if with_angmom_limiter is 1. + with_boost_factor: 0 # Are we using the model from Booth, Schaye (2009)? + boost_alpha: 1. # Lowest value for the accretion effeciency for the Booth, Schaye 2009 accretion model. + boost_beta: 2. # Slope of the power law for the Booth, Schaye 2009 model, set beta to zero for constant alpha models. + boost_n_h_star_cm3: 0.1 # Normalization of the power law for the Booth Schaye 2009 model in cgs (cm^-3). + max_eddington_fraction: 1. # Maximal allowed accretion rate in units of the Eddington rate. + eddington_fraction_for_recording: 0.1 # Record the last time BHs reached an Eddington ratio above this threshold. + use_nibbling: 1 # Continuously transfer small amounts of mass from all gas neighbours to a black hole [1] or stochastically swallow whole gas particles [0]? + min_gas_mass_for_nibbling_Msun: 9e5 # Minimum mass for a gas particle to be nibbled from [M_Sun]. Only used if use_nibbling is 1. + coupling_efficiency: 0.15 # Fraction of the radiated energy that couples to the gas in feedback events. + AGN_delta_T_K: 3.16228e8 # Change in temperature to apply to the gas particle in an AGN feedback event in Kelvin. + AGN_num_ngb_to_heat: 1. # Target number of gas neighbours to heat in an AGN feedback event. + with_potential_correction: 1 # Subtract BH's own contribution to the potential of neighbours when determining repositioning targets. + max_reposition_mass_Msun: 2e8 # Maximal BH mass considered for BH repositioning in solar masses. + max_reposition_distance_ratio: 3.0 # Maximal distance a BH can be repositioned, in units of the softening length. + with_reposition_velocity_threshold: 0 # Should we only reposition to particles that move slowly w.r.t. the black hole? + max_reposition_velocity_ratio: 0.25 # Maximal velocity offset of a particle to reposition a BH to, in units of the ambient sound speed of the BH. Only meaningful if with_reposition_velocity_ratio is 1. + min_reposition_velocity_threshold_km_p_s: -1.0 # Minimal value of the velocity threshold for repositioning [km/s], set to < 0 for no effect. Only meaningful if with_reposition_velocity_ratio is 1. + set_reposition_speed: 0 # Should we reposition black holes with (at most) a prescribed speed towards the potential minimum? + reposition_coefficient_upsilon: 0.001 # Repositioning speed normalisation [km/s/M_sun]. Only meaningful if set_reposition_speed is 1. + reposition_exponent_xi: 1.0 # (Optional) Scaling of repositioning velocity with BH subgrid mass (default: 1.0, linear). Only meaningful if set_reposition_speed is 1. + with_potential_correction: 1 # Should the BH's own contribution to the potential be removed from the neighbour's potentials when looking for repositioning targets. + threshold_major_merger: 0.333 # Mass ratio threshold to consider a BH merger as 'major' + threshold_minor_merger: 0.1 # Mass ratio threshold to consider a BH merger as 'minor' + merger_threshold_type: DynamicalEscapeVelocity # Type of velocity threshold for BH mergers (CircularVelocity as in EAGLE, EscapeVelocity, or DynamicalEscapeVelocity) + merger_max_distance_ratio: 3.0 # Maximal distance over which two BHs can merge, in units of the softening length. + AGN_use_deterministic_feedback: 1 # Deterministic (1) or stochastic (0) AGN feedback model + AGN_feedback_model: Isotropic # AGN feedback model (Isotropic or MinimumDistance) + minimum_timestep_yr: 1000.0 # Minimum time-step of black-hole particles + include_jets: 1 # Global switch whether to include jet feedback [1] or not [0]. + turn_off_radiative_feedback: 0 # Global switch whether to turn off radiative (thermal) feedback [1] or not [0]. This should only be used if 'include_jets' is set to 1, since we want feedback in some form or another. + alpha_acc: 0.2 # Viscous alpha of the subgrid accretion disks. Likely to be within the 0.1-0.3 range. The main effect is that it sets the transition accretion rate between thin and thick disk, as dot(m) = 0.1 * alpha^2 + 0.035 * alpha. + AGN_jet_velocity_model: BlackHoleMass # How AGN jet velocities are calculated. If 'Constant', a single value is used. If 'BlackHoleMass', then an empirical relation between halo mass and black hole mass is used to calculate jet velocities. 'HaloMass' is currently not supported. + v_jet_km_p_s: 10000. # Jet velocity to use if 'AGN_jet_velocity_model' is 'Constant'. Units are km/s. + v_jet_cs_ratio: 10. # This sets the jet velocity to v_jet_cs_ratio times the sound speed of the hot gas of the parent halo the black hole is in. This is used if 'AGN_jet_velocity_model' is 'BlackHoleMass'. + v_jet_BH_mass_scaling_reference_mass_Msun: 3.4e3 # The reference mass used in the relation between halo mass and BH mass used to calculate jet velocities. Only used if 'AGN_jet_velocity_model' is 'BlackHoleMass'. + v_jet_BH_mass_scaling_slope: 0.65 # The slope of the relation between halo mass and BH mass used to calculate jet velocities. Only used if 'AGN_jet_velocity_model' is 'BlackHoleMass'. + opening_angle_in_degrees: 7.5 # The half-opening angle of the jet in degrees. Should use values < 15 unless for tests. + N_jet: 2 # Target number of particles to kick as part of a single jet feedback event. Should be a multiple of 2 to ensure approximate momentum conservation (we always kick particles in pairs, one from each 'side' of the BH, relative to the spin vector). + AGN_jet_feedback_model: SpinAxis # Which particles to kick from the black hole smoothing kernels. Should be 'SpinAxis', 'MinimumDistance', 'MaximumDistance' or 'MinimumDensity' + eps_f_jet: 1. # Coupling efficiency for jet feedback. No reason to expect this to be less than 1. + fix_jet_efficiency: 0 # Global switch whether to fix jet efficiency to a particular value [1], or use a spin-dependant formula [0]. If used, jets will be launched exclusively along the z axis. Should be set to 1 only for tests. + jet_efficiency: 0.1 # The constant jet efficiency used if 'fix_jet_efficiency' is set to 1. + fix_radiative_efficiency: 0 # Global switch whether to fix the radiative efficiency to a particular value [1], or use a spin-dependant formula [0]. + radiative_efficiency: 0.1 # The constant jet efficiency used if 'fix_radiative_efficiency' is set to 1. Otherwise, this value is used to define the Eddington accretion rate. + TD_region: B # How to treat the subgrid accretion disk if it is thin, according to the Shakura & Sunyaev (1973) model. If set to B, region b will be used. If set to C, region c will be used. + include_GRMHD_spindown: 1 # Whether to include high jet spindown rates from GRMHD simulations [1], or use an analytical formula that assumes extraction of energy from the rotational mass/energy of the BH. + include_ADIOS_suppression: 1 # Whether to suppress the accretion rate in the fully thick disc regime [1] (Eddington rate below 0.2alpha^2) by the amount expected to be taken away by isotropic kinetic disk winds. + ADIOS_R_in: 30. # If include_ADIOS_accr_suppression is set to 1, this parameter controls the inner radius within which winds are not important. + ADIOS_s: 0.4 # Slope of the accretion rate - radius relationship if include_ADIOS_accr_suppression is set to 1. + turn_off_secondary_feedback: 1 # If set to 1, there will be only radiative (thermal) feedback in the thin disk mode, and only jets in the thick disk mode. + jet_h_r_slope: 1. # The slope of the dependence of jet efficiency on aspect ratio of the subgrid accretion disk, H/R. Default value is 1, and another reasonable value is 0 (same jet efficiency for all disks). Reality could be anything in between. + delta_ADAF: 0.2 # Electron heating parameter, which controls the strength of radiative feedback in thick disks. Should be between 0.1 and 0.5. This parameter is only used if turn_off_secondary_feedback is set to 0. + include_slim_disk: 0 # Global switch whether to include super-Eddington accretion, modeled as the slim disk. If set to 0, disks will be considered thin even at very large accretion rates. + TD_SD_eps_r_threshold: 0.75 # Parameter controlling the transition from thin to slim disk. Accretion disk will be slim if radiative efficiency satisfies eps_slim < TD_SD_eps_r_threshold * eps_thin. This parameter is only used if include_slim_disk is set to 1. + + # Parameters related to the neutrinos -------------------------------------------- Neutrino: use_delta_f: 1 # Use the delta-f method for shot noise reduction @@ -807,4 +874,4 @@ Lightcone1: gas_filtering_enabled: 1 # Enable filtering out of certain gas particles from particle outputs min_z_for_gas_filtering: 0.025 # Filter gas particles above this redshift, output all below min_temp_for_filtered_gas: 1.0e5 # Above min_z_for_gas_filtering only output gas with temperature above this - min_nh_for_filtered_gas: 1.0e-6 # Above min_z_for_gas_filtering only output gas with nh/(1+z)^4 above this \ No newline at end of file + min_nh_for_filtered_gas: 1.0e-6 # Above min_z_for_gas_filtering only output gas with nh/(1+z)^4 above this diff --git a/src/Makefile.am b/src/Makefile.am index b2a641a8d7b6fb75910195c034d8ba7642a0f4ff..45921f37b1c7696c53611289a64d024eeb11845a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -451,6 +451,11 @@ nobase_noinst_HEADERS += black_holes/EAGLE/black_holes.h black_holes/EAGLE/black nobase_noinst_HEADERS += black_holes/EAGLE/black_holes_part.h black_holes/EAGLE/black_holes_iact.h nobase_noinst_HEADERS += black_holes/EAGLE/black_holes_properties.h black_holes/EAGLE/black_holes_parameters.h nobase_noinst_HEADERS += black_holes/EAGLE/black_holes_struct.h black_holes/EAGLE/black_holes_debug.h +nobase_noinst_HEADERS += black_holes/SPIN_JET/black_holes.h black_holes/SPIN_JET/black_holes_io.h +nobase_noinst_HEADERS += black_holes/SPIN_JET/black_holes_part.h black_holes/SPIN_JET/black_holes_iact.h +nobase_noinst_HEADERS += black_holes/SPIN_JET/black_holes_properties.h black_holes/SPIN_JET/black_holes_parameters.h +nobase_noinst_HEADERS += black_holes/SPIN_JET/black_holes_spin.h black_holes/SPIN_JET/black_holes_struct.h +nobase_noinst_HEADERS += black_holes/SPIN_JET/black_holes_debug.h nobase_noinst_HEADERS += pressure_floor/GEAR/pressure_floor.h pressure_floor/none/pressure_floor.h nobase_noinst_HEADERS += pressure_floor/GEAR/pressure_floor_iact.h pressure_floor/none/pressure_floor_iact.h nobase_noinst_HEADERS += pressure_floor/GEAR/pressure_floor_struct.h pressure_floor/none/pressure_floor_struct.h diff --git a/src/black_holes.h b/src/black_holes.h index cd3004067a05a34cc1419385fe9cb5fa917d2cc9..ea79a5fd524529143aa112f344c19771bbe04c72 100644 --- a/src/black_holes.h +++ b/src/black_holes.h @@ -29,6 +29,9 @@ #elif defined(BLACK_HOLES_EAGLE) #include "./black_holes/EAGLE/black_holes.h" #include "./black_holes/EAGLE/black_holes_iact.h" +#elif defined(BLACK_HOLES_SPIN_JET) +#include "./black_holes/SPIN_JET/black_holes.h" +#include "./black_holes/SPIN_JET/black_holes_iact.h" #else #error "Invalid choice of black hole model" #endif diff --git a/src/black_holes/Default/black_holes.h b/src/black_holes/Default/black_holes.h index bcaf8af38e7c36a055fddb68752676220ac005d1..5994a0bde26011f37fdf3d903a54be104093c9d5 100644 --- a/src/black_holes/Default/black_holes.h +++ b/src/black_holes/Default/black_holes.h @@ -211,11 +211,12 @@ __attribute__((always_inline)) INLINE static void black_holes_swallow_part( * @param time Time since the start of the simulation (non-cosmo mode). * @param with_cosmology Are we running with cosmology? * @param props The properties of the black hole scheme. + * @param constants The physical constants in internal units. */ __attribute__((always_inline)) INLINE static void black_holes_swallow_bpart( struct bpart* bpi, const struct bpart* bpj, const struct cosmology* cosmo, const double time, const int with_cosmology, - const struct black_holes_props* props) { + const struct black_holes_props* props, const struct phys_const* constants) { /* Nothing to do here: No merging in the default model */ } @@ -314,11 +315,13 @@ black_holes_store_potential_in_part(struct black_holes_part_data* p_data, * @param cosmo The current cosmological model. * @param p The #part that became a black hole. * @param xp The #xpart that became a black hole. + * @param ti_current the current time on the time-line. */ INLINE static void black_holes_create_from_gas( struct bpart* bp, const struct black_holes_props* props, const struct phys_const* constants, const struct cosmology* cosmo, - const struct part* p, const struct xpart* xp) { + const struct part* p, const struct xpart* xp, + const integertime_t ti_current) { /* First initialisation */ black_holes_init_bpart(bp); diff --git a/src/black_holes/EAGLE/black_holes.h b/src/black_holes/EAGLE/black_holes.h index 9b11fa5c274c118bee5ba68c85c479d73d22f16e..3ef5eb4d907d035d875796c8e20aac43a42f9934 100644 --- a/src/black_holes/EAGLE/black_holes.h +++ b/src/black_holes/EAGLE/black_holes.h @@ -447,11 +447,12 @@ __attribute__((always_inline)) INLINE static void black_holes_swallow_part( * @param time Time since the start of the simulation (non-cosmo mode). * @param with_cosmology Are we running with cosmology? * @param props The properties of the black hole scheme. + * @param constants The physical constants in internal units. */ __attribute__((always_inline)) INLINE static void black_holes_swallow_bpart( struct bpart* bpi, const struct bpart* bpj, const struct cosmology* cosmo, const double time, const int with_cosmology, - const struct black_holes_props* props) { + const struct black_holes_props* props, const struct phys_const* constants) { /* Get the current dynamical masses */ const float bpi_dyn_mass = bpi->mass; @@ -1246,11 +1247,13 @@ black_holes_store_potential_in_part(struct black_holes_part_data* p_data, * @param cosmo The current cosmological model. * @param p The #part that became a black hole. * @param xp The #xpart that became a black hole. + * @param ti_current the current time on the time-line. */ INLINE static void black_holes_create_from_gas( struct bpart* bp, const struct black_holes_props* props, const struct phys_const* constants, const struct cosmology* cosmo, - const struct part* p, const struct xpart* xp) { + const struct part* p, const struct xpart* xp, + const integertime_t ti_current) { /* All the non-basic properties of the black hole have been zeroed * in the FOF code. We update them here. diff --git a/src/black_holes/SPIN_JET/black_holes.h b/src/black_holes/SPIN_JET/black_holes.h new file mode 100644 index 0000000000000000000000000000000000000000..58b8afa40642957b2f19509709443005331805c1 --- /dev/null +++ b/src/black_holes/SPIN_JET/black_holes.h @@ -0,0 +1,1529 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Copyright (c) 2020 Matthieu Schaller (schaller@strw.leidenuniv.nl) + * Copyright (c) 2022 Filip Husko (filip.husko@durham.ac.uk) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + ******************************************************************************/ + +#ifndef SWIFT_SPIN_JET_BLACK_HOLES_H +#define SWIFT_SPIN_JET_BLACK_HOLES_H + +/* Local includes */ +#include "black_holes_properties.h" +#include "black_holes_spin.h" +#include "black_holes_struct.h" +#include "cooling_properties.h" +#include "cosmology.h" +#include "dimension.h" +#include "gravity.h" +#include "kernel_hydro.h" +#include "minmax.h" +#include "physical_constants.h" +#include "random.h" +#include "rays.h" + +/* Standard includes */ +#include <float.h> +#include <math.h> + +/** + * @brief Computes the time-step of a given black hole particle. + * + * @param bp Pointer to the s-particle data. + * @param props The properties of the black hole scheme. + * @param constants The physical constants (in internal units). + */ +__attribute__((always_inline)) INLINE static float black_holes_compute_timestep( + const struct bpart* const bp, const struct black_holes_props* props, + const struct phys_const* constants, const struct cosmology* cosmo) { + + /* Do something if and only if the accretion rate is non-zero */ + if (bp->accretion_rate > 0.f) { + + /* Gather some physical constants (all in internal units) */ + const double c = constants->const_speed_light_c; + + /* Compute instantaneous energy supply rate to the BH energy reservoir + * which is proportional to the BH mass accretion rate */ + const double Energy_rate = bp->radiative_efficiency * props->epsilon_f * + bp->accretion_rate * c * c; + + /* Compute instantaneous jet energy supply rate to the BH jet reservoir + * which is proportional to the BH mass accretion rate */ + const double Jet_rate = + bp->jet_efficiency * props->eps_f_jet * bp->accretion_rate * c * c; + + /* Compute average heating energy in AGN feedback, both thermal and jet */ + + /* Average particle mass in BH's kernel */ + const double mean_ngb_mass = bp->ngb_mass / ((double)bp->num_ngbs); + /* Without multiplying by mean_ngb_mass we'd get energy per unit mass */ + const double E_heat = + props->AGN_delta_T_desired * props->temp_to_u_factor * mean_ngb_mass; + const double E_jet = 0.5 * mean_ngb_mass * bp->v_jet * bp->v_jet; + + /* Compute average time between energy injections for the given accretion + * rate. The time is multiplied by the number of Ngbs to heat because + * if more particles are heated at once then the time between different + * AGN feedback events increases proportionally. */ + const double dt_heat = E_heat * props->num_ngbs_to_heat / Energy_rate; + + /* Similar for jets, with N_jet the target number of particles to kick. */ + const double dt_jet = E_jet * props->N_jet / Jet_rate; + + /* Pick the shorter of the two feedback time steps */ + double bh_timestep = min(dt_jet, dt_heat); + + /* See if the spin evolution time step is even smaller */ + bh_timestep = min(bh_timestep, bp->dt_ang_mom); + + /* The final timestep of the BH cannot be smaller than the miminum allowed + * time-step */ + bh_timestep = max(bh_timestep, props->time_step_min); + + return bh_timestep; + } + return FLT_MAX; +} + +/** + * @brief Initialises the b-particles for the first time + * + * This function is called only once just after the ICs have been + * read in to do some conversions. + * + * @param bp The particle to act upon + * @param props The properties of the black holes model. + */ +__attribute__((always_inline)) INLINE static void black_holes_first_init_bpart( + struct bpart* bp, const struct black_holes_props* props) { + + bp->time_bin = 0; + if (props->use_subgrid_mass_from_ics == 0) { + bp->subgrid_mass = bp->mass; + + } else if (props->with_subgrid_mass_check && bp->subgrid_mass <= 0) + error( + "Black hole %lld has a subgrid mass of %f (internal units).\n" + "If this is because the ICs do not contain a 'SubgridMass' data " + "set, you should set the parameter " + "'EAGLEAGN:use_subgrid_mass_from_ics' to 0 to initialize the " + "black hole subgrid masses to the corresponding dynamical masses.\n" + "If the subgrid mass is intentionally set to this value, you can " + "disable this error by setting 'EAGLEAGN:with_subgrid_mass_check' " + "to 0.", + bp->id, bp->subgrid_mass); + bp->total_accreted_mass = 0.f; + bp->accretion_rate = 0.f; + bp->formation_time = -1.f; + bp->energy_reservoir = 0.f; + bp->cumulative_number_seeds = 1; + bp->number_of_mergers = 0; + bp->number_of_gas_swallows = 0; + bp->number_of_direct_gas_swallows = 0; + bp->number_of_repositions = 0; + bp->number_of_reposition_attempts = 0; + bp->number_of_time_steps = 0; + bp->last_high_Eddington_fraction_scale_factor = -1.f; + bp->last_minor_merger_time = -1.; + bp->last_major_merger_time = -1.; + bp->last_AGN_event_time = -1.; + bp->swallowed_angular_momentum[0] = 0.f; + bp->swallowed_angular_momentum[1] = 0.f; + bp->swallowed_angular_momentum[2] = 0.f; + bp->accreted_angular_momentum[0] = 0.f; + bp->accreted_angular_momentum[1] = 0.f; + bp->accreted_angular_momentum[2] = 0.f; + bp->dt_heat = 0.f; + bp->AGN_number_of_AGN_events = 0; + bp->AGN_number_of_energy_injections = 0; + bp->aspect_ratio = 0.01f; + bp->jet_efficiency = 0.1f; + bp->radiative_efficiency = 0.1f; + bp->accretion_disk_angle = 0.01f; + bp->accretion_mode = BH_thin_disc; + bp->eddington_fraction = 0.01f; + bp->jet_reservoir = 0.f; + bp->total_jet_energy = 0.f; + bp->dt_jet = 0.f; + bp->dt_ang_mom = 0.f; + bp->AGN_number_of_AGN_jet_events = 0; + bp->AGN_number_of_jet_injections = 0; + bp->group_mass = 0.f; + + black_holes_mark_bpart_as_not_swallowed(&bp->merger_data); +} + +/** + * @brief Prepares a b-particle for its interactions + * + * @param bp The particle to act upon + */ +__attribute__((always_inline)) INLINE static void black_holes_init_bpart( + struct bpart* bp) { + +#ifdef DEBUG_INTERACTIONS_BLACK_HOLES + for (int i = 0; i < MAX_NUM_OF_NEIGHBOURS_STARS; ++i) + bp->ids_ngbs_density[i] = -1; + bp->num_ngb_density = 0; +#endif + + bp->density.wcount = 0.f; + bp->density.wcount_dh = 0.f; + bp->rho_gas = 0.f; + bp->sound_speed_gas = 0.f; + bp->velocity_gas[0] = 0.f; + bp->velocity_gas[1] = 0.f; + bp->velocity_gas[2] = 0.f; + bp->spec_angular_momentum_gas[0] = 0.f; + bp->spec_angular_momentum_gas[1] = 0.f; + bp->spec_angular_momentum_gas[2] = 0.f; + bp->curl_v_gas[0] = 0.f; + bp->curl_v_gas[1] = 0.f; + bp->curl_v_gas[2] = 0.f; + bp->velocity_dispersion_gas = 0.f; + bp->ngb_mass = 0.f; + bp->num_ngbs = 0; + bp->reposition.delta_x[0] = -FLT_MAX; + bp->reposition.delta_x[1] = -FLT_MAX; + bp->reposition.delta_x[2] = -FLT_MAX; + bp->reposition.min_potential = FLT_MAX; + bp->reposition.potential = FLT_MAX; + bp->accretion_rate = 0.f; /* Optionally accumulated ngb-by-ngb */ + bp->f_visc = FLT_MAX; + bp->mass_at_start_of_step = bp->mass; /* bp->mass may grow in nibbling mode */ + + /* Reset the rays carried by this BH */ + ray_init(bp->rays, spinjet_blackhole_number_of_rays); + ray_init(bp->rays_jet, spinjet_blackhole_number_of_rays); + ray_init(bp->rays_jet_pos, spinjet_blackhole_number_of_rays); +} + +/** + * @brief Predict additional particle fields forward in time when drifting + * + * The fields do not get predicted but we move the BH to its new position + * if a new one was calculated in the repositioning loop. + * + * @param bp The particle + * @param dt_drift The drift time-step for positions. + */ +__attribute__((always_inline)) INLINE static void black_holes_predict_extra( + struct bpart* restrict bp, float dt_drift) { + + /* Are we doing some repositioning? */ + if (bp->reposition.min_potential != FLT_MAX) { + +#ifdef SWIFT_DEBUG_CHECKS + if (bp->reposition.delta_x[0] == -FLT_MAX || + bp->reposition.delta_x[1] == -FLT_MAX || + bp->reposition.delta_x[2] == -FLT_MAX) { + error("Something went wrong with the new repositioning position"); + } + + const double dx = bp->reposition.delta_x[0]; + const double dy = bp->reposition.delta_x[1]; + const double dz = bp->reposition.delta_x[2]; + const double d = sqrt(dx * dx + dy * dy + dz * dz); + if (d > 1.01 * kernel_gamma * bp->h) + error("Repositioning BH beyond the kernel support!"); +#endif + + /* Move the black hole */ + bp->x[0] += bp->reposition.delta_x[0]; + bp->x[1] += bp->reposition.delta_x[1]; + bp->x[2] += bp->reposition.delta_x[2]; + + /* Move its gravity properties as well */ + bp->gpart->x[0] += bp->reposition.delta_x[0]; + bp->gpart->x[1] += bp->reposition.delta_x[1]; + bp->gpart->x[2] += bp->reposition.delta_x[2]; + + /* Store the delta position */ + bp->x_diff[0] -= bp->reposition.delta_x[0]; + bp->x_diff[1] -= bp->reposition.delta_x[1]; + bp->x_diff[2] -= bp->reposition.delta_x[2]; + + /* Reset the reposition variables */ + bp->reposition.delta_x[0] = -FLT_MAX; + bp->reposition.delta_x[1] = -FLT_MAX; + bp->reposition.delta_x[2] = -FLT_MAX; + bp->reposition.min_potential = FLT_MAX; + + /* Count the jump */ + bp->number_of_repositions++; + } +} + +/** + * @brief Sets the values to be predicted in the drifts to their values at a + * kick time + * + * @param bp The particle. + */ +__attribute__((always_inline)) INLINE static void +black_holes_reset_predicted_values(struct bpart* bp) {} + +/** + * @brief Kick the additional variables + * + * @param bp The particle to act upon + * @param dt The time-step for this kick + */ +__attribute__((always_inline)) INLINE static void black_holes_kick_extra( + struct bpart* bp, float dt) {} + +/** + * @brief Finishes the calculation of density on black holes + * + * @param bp The particle to act upon + * @param cosmo The current cosmological model. + */ +__attribute__((always_inline)) INLINE static void black_holes_end_density( + struct bpart* bp, const struct cosmology* cosmo) { + + /* Some smoothing length multiples. */ + const float h = bp->h; + const float h_inv = 1.0f / h; /* 1/h */ + const float h_inv_dim = pow_dimension(h_inv); /* 1/h^d */ + const float h_inv_dim_plus_one = h_inv_dim * h_inv; /* 1/h^(d+1) */ + + /* --- Finish the calculation by inserting the missing h factors --- */ + bp->density.wcount *= h_inv_dim; + bp->density.wcount_dh *= h_inv_dim_plus_one; + bp->rho_gas *= h_inv_dim; + const float rho_inv = 1.f / bp->rho_gas; + + /* For the following, we also have to undo the mass smoothing + * (N.B.: bp->velocity_gas is in BH frame, in internal units). */ + bp->sound_speed_gas *= h_inv_dim * rho_inv; + bp->velocity_gas[0] *= h_inv_dim * rho_inv; + bp->velocity_gas[1] *= h_inv_dim * rho_inv; + bp->velocity_gas[2] *= h_inv_dim * rho_inv; + bp->velocity_dispersion_gas *= h_inv_dim * rho_inv; + bp->spec_angular_momentum_gas[0] *= h_inv_dim * rho_inv; + bp->spec_angular_momentum_gas[1] *= h_inv_dim * rho_inv; + bp->spec_angular_momentum_gas[2] *= h_inv_dim * rho_inv; + + /* ... and for the curl, we also need to divide by an extra h factor */ + bp->curl_v_gas[0] *= h_inv_dim_plus_one * rho_inv; + bp->curl_v_gas[1] *= h_inv_dim_plus_one * rho_inv; + bp->curl_v_gas[2] *= h_inv_dim_plus_one * rho_inv; + + /* Calculate circular velocity at the smoothing radius from specific + * angular momentum (extra h_inv) */ + bp->circular_velocity_gas[0] = bp->spec_angular_momentum_gas[0] * h_inv; + bp->circular_velocity_gas[1] = bp->spec_angular_momentum_gas[1] * h_inv; + bp->circular_velocity_gas[2] = bp->spec_angular_momentum_gas[2] * h_inv; + + /* Calculate (actual) gas velocity dispersion. Currently, the variable + * 'velocity_dispersion_gas' holds <v^2> instead. */ + const double speed_gas2 = bp->velocity_gas[0] * bp->velocity_gas[0] + + bp->velocity_gas[1] * bp->velocity_gas[1] + + bp->velocity_gas[2] * bp->velocity_gas[2]; + + bp->velocity_dispersion_gas -= speed_gas2; + bp->velocity_dispersion_gas = sqrt(fabs(bp->velocity_dispersion_gas)); +} + +/** + * @brief Sets all particle fields to sensible values when the #spart has 0 + * ngbs. + * + * @param bp The particle to act upon + * @param cosmo The current cosmological model. + */ +__attribute__((always_inline)) INLINE static void +black_holes_bpart_has_no_neighbours(struct bpart* bp, + const struct cosmology* cosmo) { + + /* Some smoothing length multiples. */ + const float h = bp->h; + const float h_inv = 1.0f / h; /* 1/h */ + const float h_inv_dim = pow_dimension(h_inv); /* 1/h^d */ + + /* Re-set problematic values */ + bp->density.wcount = kernel_root * h_inv_dim; + bp->density.wcount_dh = 0.f; + + bp->velocity_gas[0] = FLT_MAX; + bp->velocity_gas[1] = FLT_MAX; + bp->velocity_gas[2] = FLT_MAX; + + bp->velocity_dispersion_gas = FLT_MAX; + + bp->curl_v_gas[0] = FLT_MAX; + bp->curl_v_gas[1] = FLT_MAX; + bp->curl_v_gas[2] = FLT_MAX; +} + +/** + * @brief Return the current instantaneous accretion rate of the BH. + * + * @param bp the #bpart. + */ +__attribute__((always_inline)) INLINE static double +black_holes_get_accretion_rate(const struct bpart* bp) { + return bp->accretion_rate; +} + +/** + * @brief Return the total accreted gas mass of this BH. + * + * @param bp the #bpart. + */ +__attribute__((always_inline)) INLINE static double +black_holes_get_accreted_mass(const struct bpart* bp) { + return bp->total_accreted_mass; +} + +/** + * @brief Return the subgrid mass of this BH. + * + * @param bp the #bpart. + */ +__attribute__((always_inline)) INLINE static double +black_holes_get_subgrid_mass(const struct bpart* bp) { + return bp->subgrid_mass; +} + +/** + * @brief Update the properties of a black hole particles by swallowing + * a gas particle. + * + * @param bp The #bpart to update. + * @param p The #part that is swallowed. + * @param xp The #xpart that is swallowed. + * @param cosmo The current cosmological model. + */ +__attribute__((always_inline)) INLINE static void black_holes_swallow_part( + struct bpart* bp, const struct part* p, const struct xpart* xp, + const struct cosmology* cosmo) { + + /* Get the current dynamical masses */ + const float gas_mass = hydro_get_mass(p); + const float BH_mass = bp->mass; + + /* Increase the dynamical mass of the BH. */ + bp->mass += gas_mass; + bp->gpart->mass += gas_mass; + + /* Physical velocity difference between the particles */ + const float dv[3] = {(bp->v[0] - p->v[0]) * cosmo->a_inv, + (bp->v[1] - p->v[1]) * cosmo->a_inv, + (bp->v[2] - p->v[2]) * cosmo->a_inv}; + + /* Physical distance between the particles */ + const float dx[3] = {(bp->x[0] - p->x[0]) * cosmo->a, + (bp->x[1] - p->x[1]) * cosmo->a, + (bp->x[2] - p->x[2]) * cosmo->a}; + + /* Collect the swallowed angular momentum */ + bp->swallowed_angular_momentum[0] += + gas_mass * (dx[1] * dv[2] - dx[2] * dv[1]); + bp->swallowed_angular_momentum[1] += + gas_mass * (dx[2] * dv[0] - dx[0] * dv[2]); + bp->swallowed_angular_momentum[2] += + gas_mass * (dx[0] * dv[1] - dx[1] * dv[0]); + + /* Update the BH momentum */ + const float BH_mom[3] = {BH_mass * bp->v[0] + gas_mass * p->v[0], + BH_mass * bp->v[1] + gas_mass * p->v[1], + BH_mass * bp->v[2] + gas_mass * p->v[2]}; + + bp->v[0] = BH_mom[0] / bp->mass; + bp->v[1] = BH_mom[1] / bp->mass; + bp->v[2] = BH_mom[2] / bp->mass; + bp->gpart->v_full[0] = bp->v[0]; + bp->gpart->v_full[1] = bp->v[1]; + bp->gpart->v_full[2] = bp->v[2]; + + const float dr = sqrt(dx[0] * dx[0] + dx[1] * dx[1] + dx[2] * dx[2]); + message( + "BH %lld swallowing gas particle %lld " + "(Delta_v = [%f, %f, %f] U_V, " + "Delta_x = [%f, %f, %f] U_L, " + "Delta_v_rad = %f)", + bp->id, p->id, -dv[0], -dv[1], -dv[2], -dx[0], -dx[1], -dx[2], + (dv[0] * dx[0] + dv[1] * dx[1] + dv[2] * dx[2]) / dr); + + /* Update the BH metal masses */ + struct chemistry_bpart_data* bp_chem = &bp->chemistry_data; + const struct chemistry_part_data* p_chem = &p->chemistry_data; + chemistry_add_part_to_bpart(bp_chem, p_chem, gas_mass); + + /* This BH swallowed a gas particle */ + bp->number_of_gas_swallows++; + bp->number_of_direct_gas_swallows++; + + /* This BH lost a neighbour */ + bp->num_ngbs--; + bp->ngb_mass -= gas_mass; + + /* The ray(s) should not point to the no-longer existing particle */ + ray_reset_part_id(bp->rays, spinjet_blackhole_number_of_rays, p->id); + ray_reset_part_id(bp->rays_jet, spinjet_blackhole_number_of_rays, p->id); + ray_reset_part_id(bp->rays_jet_pos, spinjet_blackhole_number_of_rays, p->id); +} + +/** + * @brief Update the properties of a black hole particles by swallowing + * a BH particle. + * + * @param bpi The #bpart to update. + * @param bpj The #bpart that is swallowed. + * @param cosmo The current cosmological model. + * @param time Time since the start of the simulation (non-cosmo mode). + * @param with_cosmology Are we running with cosmology? + * @param props The properties of the black hole scheme. + */ +__attribute__((always_inline)) INLINE static void black_holes_swallow_bpart( + struct bpart* bpi, const struct bpart* bpj, const struct cosmology* cosmo, + const double time, const int with_cosmology, + const struct black_holes_props* props, const struct phys_const* constants) { + + /* Get the current dynamical masses */ + const float bpi_dyn_mass = bpi->mass; + const float bpj_dyn_mass = bpj->mass; + + /* Is this merger ratio above the threshold for recording? */ + const double merger_ratio = bpj->subgrid_mass / bpi->subgrid_mass; + if (merger_ratio > props->major_merger_threshold) { + if (with_cosmology) { + bpi->last_major_merger_scale_factor = cosmo->a; + } else { + bpi->last_major_merger_time = time; + } + } else if (merger_ratio > props->minor_merger_threshold) { + if (with_cosmology) { + bpi->last_minor_merger_scale_factor = cosmo->a; + } else { + bpi->last_minor_merger_time = time; + } + } + + /* Evolve the black hole spin according to Rezzolla et al. (2008) fit */ + merger_spin_evolve(bpi, bpj, constants); + + /* Increase the masses of the BH. */ + bpi->mass += bpj->mass; + bpi->gpart->mass += bpj->mass; + bpi->subgrid_mass += bpj->subgrid_mass; + + /* We need to see if the new spin is positive or negative, by implementing + King et al. (2005) condition of (counter-)alignment. */ + const float gas_spec_ang_mom_norm = sqrtf( + bpi->spec_angular_momentum_gas[0] * bpi->spec_angular_momentum_gas[0] + + bpi->spec_angular_momentum_gas[1] * bpi->spec_angular_momentum_gas[1] + + bpi->spec_angular_momentum_gas[2] * bpi->spec_angular_momentum_gas[2]); + + float dot_product = -1.; + if (gas_spec_ang_mom_norm > 0.) { + dot_product = 1. / gas_spec_ang_mom_norm * + (bpi->spec_angular_momentum_gas[0] * + bpi->angular_momentum_direction[0] + + bpi->spec_angular_momentum_gas[1] * + bpi->angular_momentum_direction[1] + + bpi->spec_angular_momentum_gas[2] * + bpi->angular_momentum_direction[2]); + } else { + dot_product = 0.; + } + + if (j_BH(bpi, constants) * dot_product < + -0.5 * j_warp(bpi, constants, props)) { + bpi->spin = -1. * fabsf(bpi->spin); + } else { + bpi->spin = fabsf(bpi->spin); + } + + /* Update various quantities with new spin */ + decide_mode(bpi, props); + bpi->aspect_ratio = aspect_ratio(bpi, constants, props); + bpi->accretion_disk_angle = dot_product; + bpi->radiative_efficiency = rad_efficiency(bpi, props); + bpi->jet_efficiency = jet_efficiency(bpi, props); + + /* Collect the swallowed angular momentum */ + bpi->swallowed_angular_momentum[0] += bpj->swallowed_angular_momentum[0]; + bpi->swallowed_angular_momentum[1] += bpj->swallowed_angular_momentum[1]; + bpi->swallowed_angular_momentum[2] += bpj->swallowed_angular_momentum[2]; + + /* Update the BH momentum */ + const float BH_mom[3] = {bpi_dyn_mass * bpi->v[0] + bpj_dyn_mass * bpj->v[0], + bpi_dyn_mass * bpi->v[1] + bpj_dyn_mass * bpj->v[1], + bpi_dyn_mass * bpi->v[2] + bpj_dyn_mass * bpj->v[2]}; + + bpi->v[0] = BH_mom[0] / bpi->mass; + bpi->v[1] = BH_mom[1] / bpi->mass; + bpi->v[2] = BH_mom[2] / bpi->mass; + bpi->gpart->v_full[0] = bpi->v[0]; + bpi->gpart->v_full[1] = bpi->v[1]; + bpi->gpart->v_full[2] = bpi->v[2]; + + /* Update the BH metal masses */ + struct chemistry_bpart_data* bpi_chem = &bpi->chemistry_data; + const struct chemistry_bpart_data* bpj_chem = &bpj->chemistry_data; + chemistry_add_bpart_to_bpart(bpi_chem, bpj_chem); + + /* Update the energy reservoir */ + bpi->energy_reservoir += bpj->energy_reservoir; + + /* Update the jet reservoir */ + bpi->jet_reservoir += bpj->jet_reservoir; + + /* Add up all the BH seeds */ + bpi->cumulative_number_seeds += bpj->cumulative_number_seeds; + + /* Add up all the gas particles we swallowed */ + bpi->number_of_gas_swallows += bpj->number_of_gas_swallows; + + /* Add the subgrid angular momentum that we swallowed */ + bpi->accreted_angular_momentum[0] += bpj->accreted_angular_momentum[0]; + bpi->accreted_angular_momentum[1] += bpj->accreted_angular_momentum[1]; + bpi->accreted_angular_momentum[2] += bpj->accreted_angular_momentum[2]; + + /* We had another merger */ + bpi->number_of_mergers++; +} + +/** + * @brief Compute the accretion rate of the black hole and all the quantites + * required for the feedback loop. + * + * @param bp The black hole particle. + * @param props The properties of the black hole scheme. + * @param constants The physical constants (in internal units). + * @param cosmo The cosmological model. + * @param cooling Properties of the cooling model. + * @param floor_props Properties of the entropy fllor. + * @param time Time since the start of the simulation (non-cosmo mode). + * @param with_cosmology Are we running with cosmology? + * @param dt The time-step size (in physical internal units). + * @param ti_begin Integer time value at the beginning of timestep + */ +__attribute__((always_inline)) INLINE static void black_holes_prepare_feedback( + struct bpart* restrict bp, const struct black_holes_props* props, + const struct phys_const* constants, const struct cosmology* cosmo, + const struct cooling_function_data* cooling, + const struct entropy_floor_properties* floor_props, const double time, + const int with_cosmology, const double dt, const integertime_t ti_begin) { + + /* Record that the black hole has another active time step */ + bp->number_of_time_steps++; + + if (dt == 0. || bp->rho_gas == 0.) return; + +#ifdef SWIFT_DEBUG_CHECKS + if (bp->num_ngbs <= 0) { + error( + "The number of BH neighbours is %d, despite the fact that the gas " + " density in the BH kernel is non-zero.", + bp->num_ngbs); + } +#endif + + /* Gather some physical constants (all in internal units) */ + const double G = constants->const_newton_G; + const double c = constants->const_speed_light_c; + const double proton_mass = constants->const_proton_mass; + const double sigma_Thomson = constants->const_thomson_cross_section; + + /* (Subgrid) mass of the BH (internal units) */ + const double BH_mass = bp->subgrid_mass; + + /* Convert the quantities we gathered to physical frame (all internal units). + * Note: for the velocities this means peculiar velocities */ + const double gas_c_phys = bp->sound_speed_gas * cosmo->a_factor_sound_speed; + const double gas_c_phys2 = gas_c_phys * gas_c_phys; + const double gas_v_circular[3] = { + bp->circular_velocity_gas[0] * cosmo->a_inv, + bp->circular_velocity_gas[1] * cosmo->a_inv, + bp->circular_velocity_gas[2] * cosmo->a_inv}; + + /* Norm of the circular velocity of the gas around the BH */ + const double tangential_velocity2 = gas_v_circular[0] * gas_v_circular[0] + + gas_v_circular[1] * gas_v_circular[1] + + gas_v_circular[2] * gas_v_circular[2]; + const double tangential_velocity = sqrt(tangential_velocity2); + + /* We can now compute the accretion rate (internal units) */ + double accr_rate; + + if (props->use_multi_phase_bondi) { + + /* In this case, we are in 'multi-phase-Bondi' mode -- otherwise, + * the accretion_rate is still zero (was initialised to this) */ + const float hi_inv = 1.f / bp->h; + const float hi_inv_dim = pow_dimension(hi_inv); /* 1/h^d */ + accr_rate = bp->accretion_rate * + (4. * M_PI * G * G * BH_mass * BH_mass * hi_inv_dim); + } else { + + /* Standard approach: compute accretion rate for all gas simultaneously. + * + * Convert the quantities we gathered to physical frame (all internal + * units). Note: velocities are already in black hole frame. */ + const double gas_rho_phys = bp->rho_gas * cosmo->a3_inv; + const double gas_v_phys[3] = {bp->velocity_gas[0] * cosmo->a_inv, + bp->velocity_gas[1] * cosmo->a_inv, + bp->velocity_gas[2] * cosmo->a_inv}; + + const double gas_v_norm2 = gas_v_phys[0] * gas_v_phys[0] + + gas_v_phys[1] * gas_v_phys[1] + + gas_v_phys[2] * gas_v_phys[2]; + + /* In the Bondi-Hoyle-Lyttleton formula, the bulk flow of gas is + * added to the sound speed in quadrature. Treated separately (below) + * in the Krumholz et al. (2006) prescription */ + const double denominator2 = + props->use_krumholz ? gas_c_phys2 : gas_v_norm2 + gas_c_phys2; +#ifdef SWIFT_DEBUG_CHECKS + /* Make sure that the denominator is strictly positive */ + if (denominator2 <= 0) + error( + "Invalid denominator for BH particle %lld in Bondi rate " + "calculation.", + bp->id); +#endif + const double denominator_inv = 1. / sqrt(denominator2); + accr_rate = 4. * M_PI * G * G * BH_mass * BH_mass * gas_rho_phys * + denominator_inv * denominator_inv * denominator_inv; + + if (props->use_krumholz) { + + /* Compute the additional correction factors from Krumholz+06, + * accounting for bulk flow and turbulence of ambient gas. */ + const double lambda = 1.1; + const double gas_v_dispersion = + bp->velocity_dispersion_gas * cosmo->a_inv; + const double mach_turb = gas_v_dispersion / gas_c_phys; + const double mach_bulk = sqrt(gas_v_norm2) / gas_c_phys; + const double mach2 = mach_turb * mach_turb + mach_bulk * mach_bulk; + const double m1 = 1. + mach2; + const double mach_factor = + sqrt((lambda * lambda + mach2) / (m1 * m1 * m1 * m1)); + accr_rate *= mach_factor; + } + + if (props->with_krumholz_vorticity) { + + /* Change the accretion rate to equation (3) of Krumholz et al. (2006) + * by adding a vorticity-dependent term in inverse quadrature */ + + /* Convert curl to vorticity in physical units */ + const double gas_curlv_phys[3] = {bp->curl_v_gas[0] * cosmo->a2_inv, + bp->curl_v_gas[1] * cosmo->a2_inv, + bp->curl_v_gas[2] * cosmo->a2_inv}; + const double gas_vorticity = sqrt(gas_curlv_phys[0] * gas_curlv_phys[0] + + gas_curlv_phys[1] * gas_curlv_phys[1] + + gas_curlv_phys[2] * gas_curlv_phys[2]); + + const double Bondi_radius = G * BH_mass / gas_c_phys2; + const double omega_star = gas_vorticity * Bondi_radius / gas_c_phys; + const double f_omega_star = 1.0 / (1.0 + pow(omega_star, 0.9)); + const double mdot_omega = 4. * M_PI * gas_rho_phys * G * G * BH_mass * + BH_mass * denominator_inv * denominator_inv * + denominator_inv * 0.34 * f_omega_star; + + const double accr_rate_inv = 1. / accr_rate; + const double mdot_omega_inv = 1. / mdot_omega; + accr_rate = 1. / sqrt(accr_rate_inv * accr_rate_inv + + mdot_omega_inv * mdot_omega_inv); + } /* ends calculation of vorticity addition to Krumholz prescription */ + + } /* ends section without multi-phase accretion */ + + /* Compute the boost factor from Booth, Schaye (2009) */ + if (props->with_boost_factor) { + const double gas_rho_phys = bp->rho_gas * cosmo->a3_inv; + const double n_H = gas_rho_phys * 0.75 / proton_mass; + const double boost_ratio = n_H / props->boost_n_h_star; + const double boost_factor = + max(pow(boost_ratio, props->boost_beta), props->boost_alpha); + accr_rate *= boost_factor; + } + /* Compute the reduction factor from Rosas-Guevara et al. (2015) */ + if (props->with_angmom_limiter) { + const double Bondi_radius = G * BH_mass / gas_c_phys2; + const double Bondi_time = Bondi_radius / gas_c_phys; + const double r_times_v_tang = Bondi_radius * tangential_velocity; + const double r_times_v_tang_3 = + r_times_v_tang * r_times_v_tang * r_times_v_tang; + const double viscous_time = + 2. * M_PI * r_times_v_tang_3 / + (1e-6 * props->alpha_visc * G * G * BH_mass * BH_mass); + + const double f_visc = min(Bondi_time / viscous_time, 1.); + bp->f_visc = f_visc; + + /* Limit the accretion rate by the Bondi-to-viscous time ratio */ + accr_rate *= f_visc; + } else { + bp->f_visc = 1.0; + } + + /* Compute the Eddington rate (internal units) */ + const double Eddington_rate = + 4. * M_PI * G * BH_mass * proton_mass / + (props->radiative_efficiency * c * sigma_Thomson); + + /* Should we record this time as the most recent high accretion rate? */ + if (accr_rate > props->f_Edd_recording * Eddington_rate) { + if (with_cosmology) { + bp->last_high_Eddington_fraction_scale_factor = cosmo->a; + } else { + bp->last_high_Eddington_fraction_time = time; + } + } + + /* Limit the accretion rate to a fraction of the Eddington rate */ + accr_rate = min(accr_rate, props->f_Edd * Eddington_rate); + bp->accretion_rate = accr_rate; + bp->eddington_fraction = accr_rate / Eddington_rate; + + /* Define feedback-related quantities that we will update and need later on */ + double luminosity = 0.; + double jet_power = 0.; + + /* Check whether we are including ADIOS winds in the thick disk */ + if ((bp->accretion_mode == BH_thick_disc) && + (props->include_ADIOS_suppression)) { + const double Bondi_R = G * BH_mass / gas_c_phys2; + const float ADIOS_suppression = powf( + Bondi_R / (props->ADIOS_R_in * R_gravitational(BH_mass, constants)), + props->ADIOS_s); + accr_rate = accr_rate / ADIOS_suppression; + bp->accretion_rate = accr_rate; + bp->eddington_fraction = accr_rate / Eddington_rate; + } + + /* How much mass will be consumed over this time step? */ + double delta_m_0 = bp->accretion_rate * dt; + + /* Norm of the specific angular momentum, will be needed in a moment. */ + float spec_ang_mom_norm = sqrtf(max( + 0., + bp->spec_angular_momentum_gas[0] * bp->spec_angular_momentum_gas[0] + + bp->spec_angular_momentum_gas[1] * bp->spec_angular_momentum_gas[1] + + bp->spec_angular_momentum_gas[2] * bp->spec_angular_momentum_gas[2])); + + /* Cosine of the angle between the spin vector and the specific angular + momentum vector of gas around the BH. */ + float dot_product = -1.; + if (spec_ang_mom_norm > 0.) { + dot_product = + 1. / spec_ang_mom_norm * + (bp->spec_angular_momentum_gas[0] * bp->angular_momentum_direction[0] + + bp->spec_angular_momentum_gas[1] * bp->angular_momentum_direction[1] + + bp->spec_angular_momentum_gas[2] * bp->angular_momentum_direction[2]); + } else { + dot_product = 0.; + } + + /* Decide if accretion is prograde (spin positive) or retrograde + (spin negative) based on condition from King et al. (2005) */ + if ((j_BH(bp, constants) * dot_product < + -0.5 * j_warp(bp, constants, props)) && + (fabsf(bp->spin) > 0.001)) { + bp->spin = -1. * fabsf(bp->spin); + } else { + bp->spin = fabsf(bp->spin); + } + + /* Calculate how many warp increments the BH will swallow over this time + step */ + double n_i = 0.; + if (bp->accretion_rate > 0.) { + n_i = delta_m_0 / m_warp(bp, constants, props); + } + + /* Update the angular momentum vector of the BH based on how many + increments of warp angular momenta have been consumed. */ + if (spec_ang_mom_norm > 0.) { + + /* If spin is at its floor value of 0.01, we immediately redirect + the spin in the direction of the accreting gas */ + if (fabsf(bp->spin) <= 0.001) { + bp->angular_momentum_direction[0] = + bp->spec_angular_momentum_gas[0] / spec_ang_mom_norm; + bp->angular_momentum_direction[1] = + bp->spec_angular_momentum_gas[1] / spec_ang_mom_norm; + bp->angular_momentum_direction[2] = + bp->spec_angular_momentum_gas[2] / spec_ang_mom_norm; + } else { + const double ang_mom_total[3] = { + bp->angular_momentum_direction[0] * j_BH(bp, constants) + + n_i * bp->spec_angular_momentum_gas[0] / spec_ang_mom_norm * + j_warp(bp, constants, props), + bp->angular_momentum_direction[1] * j_BH(bp, constants) + + n_i * bp->spec_angular_momentum_gas[1] / spec_ang_mom_norm * + j_warp(bp, constants, props), + bp->angular_momentum_direction[2] * j_BH(bp, constants) + + n_i * bp->spec_angular_momentum_gas[2] / spec_ang_mom_norm * + j_warp(bp, constants, props)}; + + /* Modulus of the new J_BH */ + const double modulus = sqrt(ang_mom_total[0] * ang_mom_total[0] + + ang_mom_total[1] * ang_mom_total[1] + + ang_mom_total[2] * ang_mom_total[2]); + + if (modulus > 0.) { + bp->angular_momentum_direction[0] = ang_mom_total[0] / modulus; + bp->angular_momentum_direction[1] = ang_mom_total[1] / modulus; + bp->angular_momentum_direction[2] = ang_mom_total[2] / modulus; + } + } + } + + /* Check if we are fixing the jet along the z-axis. */ + if (props->fix_jet_efficiency) { + bp->angular_momentum_direction[0] = 0.; + bp->angular_momentum_direction[1] = 0.; + bp->angular_momentum_direction[2] = 1; + } + + /* The amount of mass the BH is actually swallowing, including the + effects of efficiencies. */ + const double delta_m_real = + delta_m_0 * (1. - rad_efficiency(bp, props) - jet_efficiency(bp, props)); + + /* Increase the reservoir*/ + bp->jet_reservoir += + delta_m_0 * c * c * props->eps_f_jet * jet_efficiency(bp, props); + bp->energy_reservoir += + delta_m_0 * c * c * props->epsilon_f * rad_efficiency(bp, props); + + float spin_final = -1.; + /* Calculate the change in the BH spin */ + if (bp->subgrid_mass > 0.) { + spin_final = bp->spin + delta_m_0 / bp->subgrid_mass * + da_dln_mbh_0(bp, constants, props); + } else { + error( + "Black hole with id %lld tried to evolve spin with zero " + "(or less) subgrid mass. ", + bp->id); + } + + /* Make sure that the spin does not shoot above 1 or below -1. Physically + this wouldn't happen because the spinup function goes to 0 at a=1, but + numerically it may happen due to finite increments. If this happens, + many spin-related quantities begin to diverge. We also want to avoid + spin equal to zero, or very close to it. The black hole time steps + become shorter and shorter as the BH approaches spin 0, so we simply + 'jump' through 0 instead, choosing a small value of 0.001 (in magnitude) + as a floor for the spin. The spin will always jump to +0.001 since the + spinup function will always make spin go from negative to positive at + these small values. */ + if (spin_final > 0.998) { + spin_final = 0.998; + } else if (spin_final < -0.998) { + spin_final = -0.998; + } else if (fabsf(spin_final) < 0.001) { + spin_final = 0.001; + } + + /* Update the spin and mass. */ + bp->spin = spin_final; + bp->subgrid_mass = bp->subgrid_mass + delta_m_real; + bp->total_accreted_mass = bp->total_accreted_mass + delta_m_real; + + if (bp->subgrid_mass < 0.) { + error( + "Black hole %lld has reached a negative mass (%f) due" + " to jet spindown.", + bp->id, bp->subgrid_mass); + } + + /* Update other quantities. */ + bp->accretion_disk_angle = dot_product; + bp->aspect_ratio = aspect_ratio(bp, constants, props); + if (props->fix_radiative_efficiency) { + bp->radiative_efficiency = props->radiative_efficiency; + } else { + bp->radiative_efficiency = rad_efficiency(bp, props); + } + if (props->fix_jet_efficiency) { + bp->jet_efficiency = props->jet_efficiency; + } else { + bp->jet_efficiency = jet_efficiency(bp, props); + } + + /* Final jet power at the end of the step */ + jet_power = bp->jet_efficiency * accr_rate * c * c; + + /* Final luminosity at the end of the step */ + luminosity = bp->radiative_efficiency * accr_rate * c * c; + + /* Increase the subgrid angular momentum according to what we accreted + * (already in physical units, a factors from velocity and radius cancel) */ + bp->accreted_angular_momentum[0] += + bp->spec_angular_momentum_gas[0] * delta_m_real; + bp->accreted_angular_momentum[1] += + bp->spec_angular_momentum_gas[1] * delta_m_real; + bp->accreted_angular_momentum[2] += + bp->spec_angular_momentum_gas[2] * delta_m_real; + + if (props->use_nibbling && bp->subgrid_mass < bp->mass) { + /* In this case, the BH is still accreting from its (assumed) subgrid gas + * mass reservoir left over when it was formed. There is some loss in this + * due to radiative and jet losses, so we must decrease the particle mass + * in proprtion to its current accretion rate. We do not account for this + * in the swallowing approach, however. */ + bp->mass -= + (bp->radiative_efficiency + bp->jet_efficiency) * accr_rate * dt; + if (bp->mass < 0) + error( + "Black hole %lld has reached a negative mass (%f). This is " + "not a great situation, so I am stopping.", + bp->id, bp->mass); + } + + /* Below we compute energy required to have a feedback event(s) + * Note that we have subtracted the particles we swallowed from the ngb_mass + * and num_ngbs accumulators. */ + + /* Mean gas particle mass in the BH's kernel */ + const double mean_ngb_mass = bp->ngb_mass / ((double)bp->num_ngbs); + /* Energy per unit mass corresponding to the temperature jump delta_T */ + double delta_u = props->AGN_delta_T_desired * props->temp_to_u_factor; + /* Number of energy injections at this time-step (will be computed below) */ + int number_of_energy_injections; + /* Average total energy needed to heat the target number of Ngbs */ + const double E_feedback_event = + delta_u * mean_ngb_mass * props->num_ngbs_to_heat; + + /* Compute and store BH heating-limited time-step */ + if (luminosity > 0.) { + const float dt_acc = delta_u * mean_ngb_mass * props->num_ngbs_to_heat / + (luminosity * props->epsilon_f); + bp->dt_heat = max(dt_acc, props->time_step_min); + } else { + bp->dt_heat = FLT_MAX; + } + + /* Compute and store BH jet-limited time-step */ + bp->v_jet = black_hole_feedback_dv_jet(bp, props, cosmo, constants); + const float V_jet = bp->v_jet; + if (jet_power > 0.) { + const float dt_acc2 = + 0.5 * mean_ngb_mass * V_jet * V_jet / (jet_power * props->eps_f_jet); + bp->dt_jet = max(dt_acc2, props->time_step_min); + } else { + bp->dt_jet = FLT_MAX; + } + + /* Are we doing some feedback? */ + if (bp->energy_reservoir > E_feedback_event) { + + /* Probability of heating. Relevant only for the stochastic model. */ + double prob = bp->energy_reservoir / (delta_u * bp->ngb_mass); + + /* Compute the number of energy injections based on probability if and + * only if we are using the stochastic (i.e. not deterministic) model + * and the probability prob < 1. */ + if (prob < 1. && !props->AGN_deterministic) { + + /* Initialise counter of energy injections */ + number_of_energy_injections = 0; + + /* How many AGN energy injections will we get? */ + for (int i = 0; i < bp->num_ngbs; i++) { + const double rand = random_unit_interval_part_ID_and_index( + bp->id, i, ti_begin, random_number_BH_feedback); + /* Increase the counter if we are lucky */ + if (rand < prob) number_of_energy_injections++; + } + } + /* Deterministic model or prob >= 1. */ + else { + /* We want to use up all energy available in the reservoir. Therefore, + * number_of_energy_injections is > or = props->num_ngbs_to_heat */ + number_of_energy_injections = + (int)(bp->energy_reservoir / (delta_u * mean_ngb_mass)); + } + + /* Maximum number of energy injections allowed */ + const int N_energy_injections_allowed = + min(spinjet_blackhole_number_of_rays, bp->num_ngbs); + + /* If there are more energy-injection events than min(the number of Ngbs in + * the kernel, maximum number of rays) then lower the number of events & + * proportionally increase the energy per event */ + if (number_of_energy_injections > N_energy_injections_allowed) { + + /* Increase the thermal energy per event */ + const double alpha_thermal = (double)number_of_energy_injections / + (double)N_energy_injections_allowed; + delta_u *= alpha_thermal; + /* Lower the maximum number of events to the max allowed value */ + number_of_energy_injections = N_energy_injections_allowed; + } + + /* Compute how much energy will be deposited onto the gas */ + /* Note that it will in general be different from E_feedback_event if + * gas particles are of different mass. */ + double Energy_deposited = 0.0; + + /* Count the number of unsuccessful energy injections (e.g., if the particle + * that the BH wants to heat has been swallowed and thus no longer exists) + */ + int N_unsuccessful_energy_injections = 0; + + for (int i = 0; i < number_of_energy_injections; i++) { + /* If the gas particle that the BH wants to heat has just been swallowed + * by the same BH, increment the counter of unsuccessful injections. If + * the particle has not been swallowed by the BH, increase the energy that + * will later be subtracted from the BH's energy reservoir. */ + if (bp->rays[i].id_min_length != -1) + Energy_deposited += delta_u * bp->rays[i].mass; + else + N_unsuccessful_energy_injections++; + } + + /* Store all of this in the black hole for delivery onto the gas. */ + bp->to_distribute.AGN_delta_u = delta_u; + bp->to_distribute.AGN_number_of_energy_injections = + number_of_energy_injections; + + /* Subtract the deposited energy from the BH energy reservoir. Note + * that in the stochastic case, the resulting value might be negative. + * This happens when (due to the probabilistic nature of the model) the + * BH injects more energy than it actually has in the reservoir. */ + bp->energy_reservoir -= Energy_deposited; + + /* Total number successful energy injections at this time-step. In each + * energy injection, a certain gas particle from the BH's kernel gets + * heated. (successful = the particle(s) that is going to get heated by + * this BH has not been swallowed by the same BH). */ + const int N_successful_energy_injections = + number_of_energy_injections - N_unsuccessful_energy_injections; + + /* Increase the number of energy injections the black hole has heated so + * far. Note that in the isotropic model, a gas particle may receive AGN + * energy several times at the same time-step. In this case, the number of + * particles heated at this time-step for this BH will be smaller than the + * total number of energy injections for this BH. */ + bp->AGN_number_of_energy_injections += N_successful_energy_injections; + + /* Increase the number of AGN events the black hole has had so far. + * If the BH does feedback, the number of AGN events is incremented by one + */ + bp->AGN_number_of_AGN_events += N_successful_energy_injections > 0; + + /* Update the total (cumulative) energy used for gas heating in AGN feedback + * by this BH */ + bp->AGN_cumulative_energy += Energy_deposited; + + /* Store the time/scale factor when the BH last did AGN feedback */ + if (N_successful_energy_injections) { + if (with_cosmology) { + bp->last_AGN_event_scale_factor = cosmo->a; + } else { + bp->last_AGN_event_time = time; + } + } + } else { + + /* Flag that we don't want to heat anyone */ + bp->to_distribute.AGN_delta_u = 0.f; + bp->to_distribute.AGN_number_of_energy_injections = 0; + } + + /* Calculate energy required for a jet event (with N_jet particles kicked) */ + const double E_jet_event = 0.5 * V_jet * V_jet * mean_ngb_mass * props->N_jet; + + /* Are we doing some feedback? */ + if (bp->jet_reservoir > E_jet_event) { + + int number_of_jet_injections; + double delta_u_jet = 0.5 * V_jet * V_jet; + + number_of_jet_injections = + (int)(bp->jet_reservoir / (0.5 * V_jet * V_jet * mean_ngb_mass)); + + /* Limit the number of injections to 2 x N_jet. The jet feedback time + steps will try to target so that the BH ejects N_jet particles every + time step, but excesses may build up. Allowing for more than N_jet + kicks lets these excesses get released.*/ + if (number_of_jet_injections > 2 * props->N_jet) { + number_of_jet_injections = 2 * props->N_jet; + } else { + number_of_jet_injections = props->N_jet; + } + + /* Compute how much jet energy will be deposited onto the gas */ + /* Note that it will in general be different from E_feedback_event if + * gas particles are of different mass. */ + double Jet_energy_deposited = 0.0; + + /* Count the number of unsuccessful energy injections (e.g., if the particle + * that the BH wants to heat has been swallowed and thus no longer exists) + */ + int N_unsuccessful_jet_injections = 0; + + for (int i = 0; i < number_of_jet_injections; i++) { + + /* If the gas particle that the BH wants to heat has just been swallowed + * by the same BH, increment the counter of unsuccessful injections. If + * the particle has not been swallowed by the BH, increase the energy that + * will later be subtracted from the BH's energy reservoir. + * Loop over jet both rays.*/ + + if (i % 2 == 0) { + if (bp->rays_jet[i].id_min_length != -1) { + Jet_energy_deposited += delta_u_jet * bp->rays_jet[i].mass; + } else { + N_unsuccessful_jet_injections++; + } + } else { + if (bp->rays_jet_pos[i].id_min_length != -1) { + Jet_energy_deposited += delta_u_jet * bp->rays_jet_pos[i].mass; + } else { + N_unsuccessful_jet_injections++; + } + } + } + + /* Store all of this in the black hole for delivery onto the gas. */ + bp->to_distribute.AGN_delta_u_jet = delta_u_jet; + bp->to_distribute.AGN_number_of_jet_injections = number_of_jet_injections; + + /* Subtract the deposited energy from the BH jet energy reservoir. Note + * that in the stochastic case, the resulting value might be negative. + * This happens when (due to the probabilistic nature of the model) the + * BH injects more energy than it actually has in the reservoir. */ + bp->jet_reservoir -= Jet_energy_deposited; + + /* Total number successful jet energy injections at this time-step. In each + * energy injection, a certain gas particle from the BH's kernel gets + * heated. (successful = the particle(s) that is going to get heated by + * this BH has not been swallowed by the same BH). */ + const int N_successful_jet_injections = + number_of_jet_injections - N_unsuccessful_jet_injections; + + /* Increase the number of jet energy injections the black hole has kicked + * so far. */ + bp->AGN_number_of_jet_injections += N_successful_jet_injections; + + /* Increase the number of AGN jet events the black hole has had so far. + * If the BH does feedback, the number of AGN events is incremented by one. + */ + bp->AGN_number_of_AGN_jet_events += N_successful_jet_injections > 0; + + /* Update the total (cumulative) energy used for gas heating in AGN jet + feedback by this BH */ + bp->total_jet_energy += Jet_energy_deposited; + + /* Store the time/scale factor when the BH last did AGN jet feedback */ + if (N_successful_jet_injections) { + if (with_cosmology) { + bp->last_AGN_jet_event_scale_factor = cosmo->a; + } else { + bp->last_AGN_jet_event_time = time; + } + } + } else { + + /* Flag that we don't want to kick anyone */ + bp->to_distribute.AGN_number_of_jet_injections = 0; + bp->to_distribute.AGN_delta_u_jet = 0.f; + } + + /* Decide the accretion mode of the BH, based on the new spin and Eddington + * fraction */ + decide_mode(bp, props); + + /* Calculate a BH angular momentum evolution time step. Ths timestep is + chosen so that the BH spin changes by around 10% relative to the current + spin value */ + if ((fabsf(bp->spin) > 0.001) && (bp->accretion_rate > 0.)) { + const float dt_ang_mom = 0.1 * fabsf(bp->spin) / + fabsf(da_dln_mbh_0(bp, constants, props)) * + bp->subgrid_mass / bp->accretion_rate; + bp->dt_ang_mom = dt_ang_mom; + } else { + bp->dt_ang_mom = FLT_MAX; + } +} + +/** + * @brief Finish the calculation of the new BH position. + * + * Here, we check that the BH should indeed be moved in the next drift. + * + * @param bp The black hole particle. + * @param props The properties of the black hole scheme. + * @param constants The physical constants (in internal units). + * @param cosmo The cosmological model. + * @param dt The black hole particle's time step. + * @param ti_begin The time at the start of the step + */ +__attribute__((always_inline)) INLINE static void black_holes_end_reposition( + struct bpart* restrict bp, const struct black_holes_props* props, + const struct phys_const* constants, const struct cosmology* cosmo, + const double dt, const integertime_t ti_begin) { + + /* First check: did we find any eligible neighbour particle to jump to? */ + if (bp->reposition.min_potential != FLT_MAX) { + + /* Record that we have a (possible) repositioning situation */ + bp->number_of_reposition_attempts++; + + /* Is the potential lower (i.e. the BH is at the bottom already) + * OR is the BH massive enough that we don't reposition? */ + const float potential = gravity_get_comoving_potential(bp->gpart); + if (potential < bp->reposition.min_potential || + bp->subgrid_mass > props->max_reposition_mass) { + + /* No need to reposition */ + bp->reposition.min_potential = FLT_MAX; + bp->reposition.delta_x[0] = -FLT_MAX; + bp->reposition.delta_x[1] = -FLT_MAX; + bp->reposition.delta_x[2] = -FLT_MAX; + } else if (props->set_reposition_speed) { + + /* If we are re-positioning, move the BH a fraction of delta_x, so + * that we have a well-defined re-positioning velocity. We have + * checked already that reposition_coefficient_upsilon is positive. */ + const float repos_vel = + props->reposition_coefficient_upsilon * + pow(bp->subgrid_mass / constants->const_solar_mass, + props->reposition_exponent_xi); + + const double dx = bp->reposition.delta_x[0]; + const double dy = bp->reposition.delta_x[1]; + const double dz = bp->reposition.delta_x[2]; + const double d = sqrt(dx * dx + dy * dy + dz * dz); + + /* Convert target reposition velocity to a fractional reposition + * along reposition.delta_x */ + + /* Exclude the pathological case of repositioning by zero distance */ + if (d > 0) { + double repos_frac = repos_vel * dt / d; + + /* We should never get negative repositioning fractions... */ + if (repos_frac < 0) + error("Wanting to reposition by negative fraction (%g)?", repos_frac); + + /* ... but fractions > 1 can occur if the target velocity is high. + * We do not want this, because it could lead to overshooting the + * actual potential minimum. */ + if (repos_frac > 1) repos_frac = 1.; + + bp->reposition.delta_x[0] *= repos_frac; + bp->reposition.delta_x[1] *= repos_frac; + bp->reposition.delta_x[2] *= repos_frac; + } + + /* ends section for fractional repositioning */ + } else { + + /* We _should_ reposition, but not fractionally. Here, we will + * reposition exactly on top of another gas particle - which + * could cause issues, so we add on a small fractional offset + * of magnitude 0.001 h in the reposition delta. */ + + /* Generate three random numbers in the interval [-0.5, 0.5[; id, + * id**2, and id**3 are required to give unique random numbers (as + * random_unit_interval is completely reproducible). */ + const float offset_dx = + random_unit_interval(bp->id, ti_begin, random_number_BH_reposition) - + 0.5f; + const float offset_dy = + random_unit_interval(bp->id * bp->id, ti_begin, + random_number_BH_reposition) - + 0.5f; + const float offset_dz = + random_unit_interval(bp->id * bp->id * bp->id, ti_begin, + random_number_BH_reposition) - + 0.5f; + + const float length_inv = + 1.0f / sqrtf(offset_dx * offset_dx + offset_dy * offset_dy + + offset_dz * offset_dz); + + const float norm = 0.001f * bp->h * length_inv; + + bp->reposition.delta_x[0] += offset_dx * norm; + bp->reposition.delta_x[1] += offset_dy * norm; + bp->reposition.delta_x[2] += offset_dz * norm; + } + } /* ends section if we found eligible repositioning target(s) */ +} + +/** + * @brief Reset acceleration fields of a particle + * + * This is the equivalent of hydro_reset_acceleration. + * We do not compute the acceleration on black hole, therefore no need to use + * it. + * + * @param bp The particle to act upon + */ +__attribute__((always_inline)) INLINE static void black_holes_reset_feedback( + struct bpart* restrict bp) { + + bp->to_distribute.AGN_delta_u = 0.f; + bp->to_distribute.AGN_number_of_energy_injections = 0; + +#ifdef DEBUG_INTERACTIONS_BLACK_HOLES + for (int i = 0; i < MAX_NUM_OF_NEIGHBOURS_STARS; ++i) + bp->ids_ngbs_force[i] = -1; + bp->num_ngb_force = 0; +#endif +} + +/** + * @brief Store the gravitational potential of a black hole by copying it from + * its #gpart friend. + * + * @param bp The black hole particle. + * @param gp The black hole's #gpart. + */ +__attribute__((always_inline)) INLINE static void +black_holes_store_potential_in_bpart(struct bpart* bp, const struct gpart* gp) { + +#ifdef SWIFT_DEBUG_CHECKS + if (bp->gpart != gp) error("Copying potential to the wrong black hole!"); +#endif + + bp->reposition.potential = gp->potential; +} + +/** + * @brief Store the gravitational potential of a particle by copying it from + * its #gpart friend. + * + * @param p_data The black hole data of a gas particle. + * @param gp The black hole's #gpart. + */ +__attribute__((always_inline)) INLINE static void +black_holes_store_potential_in_part(struct black_holes_part_data* p_data, + const struct gpart* gp) { + p_data->potential = gp->potential; +} + +/** + * @brief Initialise a BH particle that has just been seeded. + * + * @param bp The #bpart to initialise. + * @param props The properties of the black hole scheme. + * @param constants The physical constants in internal units. + * @param cosmo The current cosmological model. + * @param p The #part that became a black hole. + * @param xp The #xpart that became a black hole. + */ +INLINE static void black_holes_create_from_gas( + struct bpart* bp, const struct black_holes_props* props, + const struct phys_const* constants, const struct cosmology* cosmo, + const struct part* p, const struct xpart* xp, + const integertime_t ti_current) { + + /* All the non-basic properties of the black hole have been zeroed + * in the FOF code. We update them here. + * (i.e. position, velocity, mass, time-step have been set) */ + + /* Birth time */ + bp->formation_scale_factor = cosmo->a; + + /* Initial seed mass */ + bp->subgrid_mass = props->subgrid_seed_mass; + + /* Small initial spin in random direction*/ + bp->spin = 0.001f; + + const float rand_cos_theta = + 2. * + (0.5 - random_unit_interval(bp->id, ti_current, random_number_BH_spin)); + const float rand_sin_theta = + sqrtf(max(0., (1. - rand_cos_theta) * (1. + rand_cos_theta))); + const float rand_phi = + 2. * M_PI * + random_unit_interval(bp->id * bp->id, ti_current, random_number_BH_spin); + + bp->angular_momentum_direction[0] = rand_sin_theta * cos(rand_phi); + bp->angular_momentum_direction[1] = rand_sin_theta * sin(rand_phi); + bp->angular_momentum_direction[2] = rand_cos_theta; + + bp->aspect_ratio = 0.01f; + bp->jet_efficiency = 0.1f; + bp->radiative_efficiency = 0.1f; + bp->accretion_disk_angle = 0.01f; + bp->accretion_mode = BH_thin_disc; + bp->eddington_fraction = 0.01f; + bp->jet_reservoir = 0.f; + bp->total_jet_energy = 0.f; + bp->dt_jet = 0.f; + bp->dt_ang_mom = 0.f; + bp->v_jet = black_hole_feedback_dv_jet(bp, props, cosmo, constants); + bp->AGN_number_of_AGN_jet_events = 0; + bp->AGN_number_of_jet_injections = 0; + + /* We haven't accreted anything yet */ + bp->total_accreted_mass = 0.f; + bp->cumulative_number_seeds = 1; + bp->number_of_mergers = 0; + bp->number_of_gas_swallows = 0; + bp->number_of_direct_gas_swallows = 0; + bp->number_of_time_steps = 0; + + /* We haven't repositioned yet, nor attempted it */ + bp->number_of_repositions = 0; + bp->number_of_reposition_attempts = 0; + + /* Copy over the splitting struct */ + bp->split_data = xp->split_data; + + /* Initial metal masses */ + const float gas_mass = hydro_get_mass(p); + struct chemistry_bpart_data* bp_chem = &bp->chemistry_data; + const struct chemistry_part_data* p_chem = &p->chemistry_data; + chemistry_bpart_from_part(bp_chem, p_chem, gas_mass); + + /* No swallowed angular momentum */ + bp->swallowed_angular_momentum[0] = 0.f; + bp->swallowed_angular_momentum[1] = 0.f; + bp->swallowed_angular_momentum[2] = 0.f; + + /* Last time this BH had a high Eddington fraction */ + bp->last_high_Eddington_fraction_scale_factor = -1.f; + + /* Last time of mergers */ + bp->last_minor_merger_time = -1.; + bp->last_major_merger_time = -1.; + + /* First initialisation */ + black_holes_init_bpart(bp); + + black_holes_mark_bpart_as_not_swallowed(&bp->merger_data); +} + +/** + * @brief Store the halo mass in the fof algorithm for the black + * hole particle. + * + * @param p_data The black hole particle data. + * @param halo_mass The halo mass to update. + */ +__attribute__((always_inline)) INLINE static void black_holes_update_halo_mass( + struct bpart* bp, float halo_mass) { + bp->group_mass = halo_mass; +} + +#endif /* SWIFT_SPIN_JET_BLACK_HOLES_H */ diff --git a/src/black_holes/SPIN_JET/black_holes_debug.h b/src/black_holes/SPIN_JET/black_holes_debug.h new file mode 100644 index 0000000000000000000000000000000000000000..62cf4802dc7121e6a2a73ceba414c71530102771 --- /dev/null +++ b/src/black_holes/SPIN_JET/black_holes_debug.h @@ -0,0 +1,30 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Copyright (c) 2022 Bert Vandenbroucke (bert.vandenbroucke@gmail.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + ******************************************************************************/ +#ifndef SWIFT_BLACK_HOLES_SPIN_JET_DEBUG_H +#define SWIFT_BLACK_HOLES_SPIN_JET_DEBUG_H + +__attribute__((always_inline)) INLINE static void black_holes_debug_particle( + const struct part* p, const struct xpart* xp) { + + warning("[PID%lld] black_holes_part_data:", p->id); + warning("[PID%lld] swallow_id=%lld, potential=%.3e", p->id, + p->black_holes_data.swallow_id, p->black_holes_data.potential); +} + +#endif /* SWIFT_BLACK_HOLES_SPIN_JET_DEBUG_H */ diff --git a/src/black_holes/SPIN_JET/black_holes_iact.h b/src/black_holes/SPIN_JET/black_holes_iact.h new file mode 100644 index 0000000000000000000000000000000000000000..d49534cb6a44eb3d6efc1f841308fe8fe829bd4c --- /dev/null +++ b/src/black_holes/SPIN_JET/black_holes_iact.h @@ -0,0 +1,1091 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Copyright (c) 2020 Matthieu Schaller (schaller@strw.leidenuniv.nl) + * Copyright (c) 2022 Filip Husko (filip.husko@durham.ac.uk) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + ******************************************************************************/ +#ifndef SWIFT_SPIN_JET_BH_IACT_H +#define SWIFT_SPIN_JET_BH_IACT_H + +/* Local includes */ +#include "black_holes_parameters.h" +#include "engine.h" +#include "equation_of_state.h" +#include "gravity.h" +#include "gravity_iact.h" +#include "hydro.h" +#include "random.h" +#include "rays.h" +#include "space.h" +#include "timestep_sync_part.h" +#include "tracers.h" + +/** + * @brief Density interaction between two particles (non-symmetric). + * + * @param r2 Comoving square distance between the two particles. + * @param dx Comoving vector separating both particles (pi - pj). + * @param hi Comoving smoothing-length of particle i. + * @param hj Comoving smoothing-length of particle j. + * @param bi First particle (black hole). + * @param pj Second particle (gas, not updated). + * @param xpj The extended data of the second particle (not updated). + * @param with_cosmology Are we doing a cosmological run? + * @param cosmo The cosmological model. + * @param grav_props The properties of the gravity scheme (softening, G, ...). + * @param bh_props The properties of the BH scheme + * @param ti_current Current integer time value (for random numbers). + * @param time Current physical time in the simulation. + * @param step The current time-step. + */ +__attribute__((always_inline)) INLINE static void +runner_iact_nonsym_bh_gas_density( + const float r2, const float *dx, const float hi, const float hj, + struct bpart *bi, const struct part *pj, const struct xpart *xpj, + const int with_cosmology, const struct cosmology *cosmo, + const struct gravity_props *grav_props, + const struct black_holes_props *bh_props, + const struct entropy_floor_properties *floor_props, + const integertime_t ti_current, const double time) { + + float wi, wi_dx; + + /* Get r. */ + const float r = sqrtf(r2); + const float r_inv = 1.f / r; + + /* Compute the kernel function */ + const float hi_inv = 1.0f / hi; + const float ui = r * hi_inv; + kernel_deval(ui, &wi, &wi_dx); + + /* Compute contribution to the number of neighbours */ + bi->density.wcount += wi; + bi->density.wcount_dh -= (hydro_dimension * wi + ui * wi_dx); + + /* Contribution to the number of neighbours */ + bi->num_ngbs++; + + /* Neighbour gas mass */ + const float mj = hydro_get_mass(pj); + + /* Contribution to the BH gas density */ + bi->rho_gas += mj * wi; + + /* Contribution to the total neighbour mass */ + bi->ngb_mass += mj; + + /* Neighbour's sound speed */ + float cj; + if (bh_props->use_subgrid_gas_properties && engine_current_step >= 0) { + const float pressure_j = hydro_get_comoving_pressure(pj); + const float subgrid_dens = cooling_get_subgrid_density(pj, xpj); + cj = gas_soundspeed_from_pressure( + subgrid_dens * cosmo->a * cosmo->a * cosmo->a, pressure_j); + } else { + cj = hydro_get_comoving_soundspeed(pj); + } + + /* Contribution to the smoothed sound speed */ + bi->sound_speed_gas += mj * cj * wi; + + /* Neighbour's (drifted) velocity in the frame of the black hole + * (we do include a Hubble term) */ + const float dv[3] = {pj->v[0] - bi->v[0], pj->v[1] - bi->v[1], + pj->v[2] - bi->v[2]}; + + const float a = cosmo->a; + const float H = cosmo->H; + const float a2H = a * a * H; + + /* Calculate the velocity with the Hubble flow */ + const float v_plus_H_flow[3] = {a2H * dx[0] + dv[0], a2H * dx[1] + dv[1], + a2H * dx[2] + dv[2]}; + + /* Contribution to the smoothed velocity (gas w.r.t. black hole) */ + bi->velocity_gas[0] += mj * dv[0] * wi; + bi->velocity_gas[1] += mj * dv[1] * wi; + bi->velocity_gas[2] += mj * dv[2] * wi; + + /* Contribution to the specific angular momentum of gas, which is later + * converted to the circular velocity at the smoothing length */ + bi->spec_angular_momentum_gas[0] -= mj * wi * (dx[1] * dv[2] - dx[2] * dv[1]); + bi->spec_angular_momentum_gas[1] -= mj * wi * (dx[2] * dv[0] - dx[0] * dv[2]); + bi->spec_angular_momentum_gas[2] -= mj * wi * (dx[0] * dv[1] - dx[1] * dv[0]); + + /* Contribution to the smoothed squared relative velocity (for dispersion) + * We will convert this to actual dispersion later. */ + const float norm_v2 = v_plus_H_flow[0] * v_plus_H_flow[0] + + v_plus_H_flow[1] * v_plus_H_flow[1] + + v_plus_H_flow[2] * v_plus_H_flow[2]; + + bi->velocity_dispersion_gas += norm_v2 * wi * mj; + + if (bh_props->use_multi_phase_bondi) { + /* Contribution to BH accretion rate + * + * i) Calculate denominator in Bondi formula */ + const double gas_v_phys[3] = {dv[0] * cosmo->a_inv, dv[1] * cosmo->a_inv, + dv[2] * cosmo->a_inv}; + const double gas_v_norm2 = gas_v_phys[0] * gas_v_phys[0] + + gas_v_phys[1] * gas_v_phys[1] + + gas_v_phys[2] * gas_v_phys[2]; + + const double gas_c_phys = cj * cosmo->a_factor_sound_speed; + const double gas_c_phys2 = gas_c_phys * gas_c_phys; + const double denominator2 = gas_v_norm2 + gas_c_phys2; + +#ifdef SWIFT_DEBUG_CHECKS + /* Make sure that the denominator is strictly positive */ + if (denominator2 <= 0) + error( + "Invalid denominator for BH particle %lld and gas particle " + "%lld in Bondi rate calculation.", + bi->id, pj->id); +#endif + const double denominator_inv = 1. / sqrt(denominator2); + + /* ii) Contribution of gas particle to the BH accretion rate + * (without constant pre-factor) + * N.B.: rhoj is the weighted contribution to BH gas density. */ + const float rhoj = mj * wi * cosmo->a3_inv; + bi->accretion_rate += + rhoj * denominator_inv * denominator_inv * denominator_inv; + } /* End of accretion contribution calculation */ + + /* Need to compute gas vorticity around the black hole, in analogy to + * calculation for Balsara switch in hydro part */ + + /* Factor to make sure we get curl, not angular momentum */ + const float faci = mj * wi_dx * r_inv; + + /* Compute dv cross r */ + const float v_cross_r[3] = {dv[1] * dx[2] - dv[2] * dx[1], + dv[2] * dx[0] - dv[0] * dx[2], + dv[0] * dx[1] - dv[1] * dx[0]}; + + bi->curl_v_gas[0] += faci * v_cross_r[0]; + bi->curl_v_gas[1] += faci * v_cross_r[1]; + bi->curl_v_gas[2] += faci * v_cross_r[2]; + +#ifdef DEBUG_INTERACTIONS_BH + /* Update ngb counters */ + if (si->num_ngb_density < MAX_NUM_OF_NEIGHBOURS_BH) + bi->ids_ngbs_density[si->num_ngb_density] = pj->id; + + /* Update ngb counters */ + ++si->num_ngb_density; +#endif + + /* Gas particle id */ + const long long gas_id = pj->id; + + /* Choose AGN feedback model */ + switch (bh_props->feedback_model) { + case AGN_isotropic_model: { + /* Compute arc lengths in AGN isotropic feedback and collect + * relevant data for later use in the feedback_apply loop */ + + /* Loop over rays */ + for (int i = 0; i < spinjet_blackhole_number_of_rays; i++) { + + /* We generate two random numbers that we use + to randomly select the direction of the ith ray */ + + /* Random number in [0, 1[ */ + const double rand_theta = random_unit_interval_part_ID_and_index( + bi->id, i, ti_current, + random_number_isotropic_AGN_feedback_ray_theta); + + /* Random number in [0, 1[ */ + const double rand_phi = random_unit_interval_part_ID_and_index( + bi->id, i, ti_current, + random_number_isotropic_AGN_feedback_ray_phi); + + /* Compute arc length */ + ray_minimise_arclength(dx, r, bi->rays + i, + /*ray_type=*/ray_feedback_thermal, gas_id, + rand_theta, rand_phi, mj, /*ray_ext=*/NULL, + /*v=*/NULL); + } + break; + } + case AGN_minimum_distance_model: { + /* Compute the size of the array that we want to sort. If the current + * function is called for the first time (at this time-step for this BH), + * then bi->num_ngbs = 1 and there is nothing to sort. Note that the + * maximum size of the sorted array cannot be larger then the maximum + * number of rays. */ + const int arr_size = min(bi->num_ngbs, spinjet_blackhole_number_of_rays); + + /* Minimise separation between the gas particles and the BH. The rays + * structs with smaller ids in the ray array will refer to the particles + * with smaller distances to the BH. */ + ray_minimise_distance(r, bi->rays, arr_size, gas_id, mj); + break; + } + } + + const int arr_size_jet = min(bi->num_ngbs, spinjet_blackhole_number_of_rays); + + /* Scalar product of the spin vector and position vector of the gas particle + relative to the BH */ + float cosine_theta = -dx[0] * bi->angular_momentum_direction[0] - + dx[1] * bi->angular_momentum_direction[1] - + dx[2] * bi->angular_momentum_direction[2]; + + /* Norm of the scalar product (ang. mom. dir. is already normalized) */ + const float norm = sqrtf(dx[0] * dx[0] + dx[1] * dx[1] + dx[2] * dx[2]); + + /* Apply the norm to find the cosine of the angle between the two vectors, + if norm is 0 then manually set to small value */ + if (norm > 0.) { + cosine_theta = cosine_theta / norm; + } else { + cosine_theta = 0.001; + } + + /* Define a variable which will be used in ray sorting to make sure that + jet-kicked particles always end up at the end of the rays*/ + float ray_jet_correction = 0.; + + /* Define variables that we will minimize. Two because we have two rays. */ + float quantity_to_minimize = 0.; + float quantity_to_minimize_pos = 0.; + + /* Calculate relative velocity of particle and BH, to be used to see if + this particle was recently kicked */ + const float relative_velocity = + sqrtf((bi->v[0] - xpj->v_full[0]) * (bi->v[0] - xpj->v_full[0]) + + (bi->v[1] - xpj->v_full[1]) * (bi->v[1] - xpj->v_full[1]) + + (bi->v[2] - xpj->v_full[2]) * (bi->v[2] - xpj->v_full[2])) * + cosmo->a_inv; + + /* Choose AGN jet feedback model. Here we calculate the quantities to + minimize, depending on the model. We calculate two numbers, one for each + side of the BH. Particles are prioritized to be kicked from the 'same' + hemisphere as defined by the BH. However, there may be cases in which one + hemisphere is empty, so particles from the other side are used. If the + particle is on the 'wrong' side of the BH, relative to the spin vector, we + still put it in each ray, but they are pushed to the end (modulo other + particles that were already kicked */ + switch (bh_props->jet_feedback_model) { + case AGN_jet_minimum_distance_model: { + + /* Check if relative velocity is significant fraction of jet launching + velocity. If it is, set the ray correction variable to some large + value. */ + if (relative_velocity > 0.3 * bi->v_jet) { + ray_jet_correction = 1e11 * bi->h; + } + + /* In this case we minimize using particle separations from the BH, with + the order closest --> farthest */ + if (cosine_theta < 0) { + quantity_to_minimize = r + ray_jet_correction; + quantity_to_minimize_pos = 1e8 * r + ray_jet_correction; + } else { + quantity_to_minimize = 1e8 * r + ray_jet_correction; + quantity_to_minimize_pos = r + ray_jet_correction; + } + break; + } + case AGN_jet_maximum_distance_model: { + + /* Check if relative velocity is significant fraction of jet launching + velocity. If it is, set the ray correction variable to some large + value. */ + if (relative_velocity > 0.3 * bi->v_jet) { + ray_jet_correction = 1e13 * 1. / bi->h; + } + + /* In this case we minimize using particle separations from the BH, with + the order farthest --> closest */ + if (cosine_theta < 0) { + quantity_to_minimize = r_inv + ray_jet_correction; + quantity_to_minimize_pos = 1e8 * r_inv + ray_jet_correction; + } else { + quantity_to_minimize = 1e8 * r_inv + ray_jet_correction; + quantity_to_minimize_pos = r_inv + ray_jet_correction; + } + break; + } + case AGN_jet_spin_axis_model: { + + /* Check if relative velocity is significant fraction of jet launching + velocity. If it is, set the ray correction variable to some large + value. */ + if (relative_velocity > 0.3 * bi->v_jet) { + ray_jet_correction = 1e3; + } + + /* In this case we minimize using the angle (cosine) between the position + vector of the particle (relative to the BH) and the spin vector of the + BH. I.e. we launch particles along the spin axis, regardless of the + distances from the BH. */ + if (cosine_theta < 0) { + quantity_to_minimize = -fabsf(cosine_theta) + ray_jet_correction; + quantity_to_minimize_pos = + -1e8 * fabsf(cosine_theta) + ray_jet_correction; + } else { + quantity_to_minimize = -1e8 * fabsf(cosine_theta) + ray_jet_correction; + quantity_to_minimize_pos = -fabsf(cosine_theta) + ray_jet_correction; + } + break; + } + case AGN_jet_minimum_density_model: { + + /* Check if relative velocity is significant fraction of jet launching + velocity. If it is, set the ray correction variable to some large + value. */ + if (relative_velocity > 0.3 * bi->v_jet) { + ray_jet_correction = 1e15 * pj->rho; + } + + /* In this case we minimize using particle densities, i.e. we target the + low-density gas. */ + if (cosine_theta < 0) { + quantity_to_minimize = pj->rho + ray_jet_correction; + quantity_to_minimize_pos = 1e8 * pj->rho + ray_jet_correction; + } else { + quantity_to_minimize = 1e8 * pj->rho + ray_jet_correction; + quantity_to_minimize_pos = pj->rho + ray_jet_correction; + } + break; + } + } + + /* Loop over rays and do the actual minimization */ + for (int i = 0; i < spinjet_blackhole_number_of_rays; i++) { + ray_minimise_distance(quantity_to_minimize, bi->rays_jet, arr_size_jet, + gas_id, pj->mass); + ray_minimise_distance(quantity_to_minimize_pos, bi->rays_jet_pos, + arr_size_jet, gas_id, pj->mass); + } +} + +/** + * @brief Swallowing interaction between two particles (non-symmetric). + * + * Function used to identify the gas particle that this BH may move towards. + * + * @param r2 Comoving square distance between the two particles. + * @param dx Comoving vector separating both particles (pi - pj). + * @param hi Comoving smoothing-length of particle i. + * @param hj Comoving smoothing-length of particle j. + * @param bi First particle (black hole). + * @param pj Second particle (gas) + * @param xpj The extended data of the second particle. + * @param with_cosmology Are we doing a cosmological run? + * @param cosmo The cosmological model. + * @param grav_props The properties of the gravity scheme (softening, G, ...). + * @param bh_props The properties of the BH scheme + * @param ti_current Current integer time value (for random numbers). + * @param time Current physical time in the simulation. + * @param step The current time-step. + */ +__attribute__((always_inline)) INLINE static void +runner_iact_nonsym_bh_gas_repos( + const float r2, const float *dx, const float hi, const float hj, + struct bpart *bi, const struct part *pj, const struct xpart *xpj, + const int with_cosmology, const struct cosmology *cosmo, + const struct gravity_props *grav_props, + const struct black_holes_props *bh_props, + const struct entropy_floor_properties *floor_props, + const integertime_t ti_current, const double time) { + + float wi; + + /* Get r. */ + const float r = sqrtf(r2); + + /* Compute the kernel function */ + const float hi_inv = 1.0f / hi; + const float ui = r * hi_inv; + kernel_eval(ui, &wi); + + /* Start by checking the repositioning criteria */ + + /* (Square of) Max repositioning distance allowed based on the softening */ + const float max_dist_repos2 = + kernel_gravity_softening_plummer_equivalent_inv * + kernel_gravity_softening_plummer_equivalent_inv * + bh_props->max_reposition_distance_ratio * + bh_props->max_reposition_distance_ratio * grav_props->epsilon_baryon_cur * + grav_props->epsilon_baryon_cur; + + /* Is this gas neighbour close enough that we can consider its potential + for repositioning? */ + if (r2 < max_dist_repos2) { + + /* Flag to check whether neighbour is slow enough to be considered + * as repositioning target. Always true if velocity cut is switched off. */ + int neighbour_is_slow_enough = 1; + if (bh_props->with_reposition_velocity_threshold) { + + /* Compute relative peculiar velocity between the two BHs + * Recall that in SWIFT v is (v_pec * a) */ + const float delta_v[3] = {bi->v[0] - pj->v[0], bi->v[1] - pj->v[1], + bi->v[2] - pj->v[2]}; + const float v2 = delta_v[0] * delta_v[0] + delta_v[1] * delta_v[1] + + delta_v[2] * delta_v[2]; + const float v2_pec = v2 * cosmo->a2_inv; + + /* Compute the maximum allowed velocity */ + float v2_max = bh_props->max_reposition_velocity_ratio * + bh_props->max_reposition_velocity_ratio * + bi->sound_speed_gas * bi->sound_speed_gas; + + /* If desired, limit the value of the threshold (v2_max) to be no + * smaller than a user-defined value */ + if (bh_props->min_reposition_velocity_threshold > 0) { + const float v2_min_thresh = + bh_props->min_reposition_velocity_threshold * + bh_props->min_reposition_velocity_threshold; + v2_max = max(v2_max, v2_min_thresh); + } + + /* Is the neighbour too fast to jump to? */ + if (v2_pec >= v2_max) neighbour_is_slow_enough = 0; + } + + if (neighbour_is_slow_enough) { + + float potential = pj->black_holes_data.potential; + + if (bh_props->correct_bh_potential_for_repositioning) { + /* Let's not include the contribution of the BH + * itself to the potential of the gas particle */ + + /* Note: This assumes the BH and gas have the same + * softening, which is currently true */ + const float eps = gravity_get_softening(bi->gpart, grav_props); + const float eps2 = eps * eps; + const float eps_inv = 1.f / eps; + const float eps_inv3 = eps_inv * eps_inv * eps_inv; + const float BH_mass = bi->mass; + + /* Compute the Newtonian or truncated potential the BH + * exherts onto the gas particle */ + float dummy, pot_ij; + runner_iact_grav_pp_full(r2, eps2, eps_inv, eps_inv3, BH_mass, &dummy, + &pot_ij); + + /* Deduct the BH contribution */ + potential -= pot_ij * grav_props->G_Newton; + } + + /* Is the potential lower? */ + if (potential < bi->reposition.min_potential) { + + /* Store this as our new best */ + bi->reposition.min_potential = potential; + bi->reposition.delta_x[0] = -dx[0]; + bi->reposition.delta_x[1] = -dx[1]; + bi->reposition.delta_x[2] = -dx[2]; + } + } + } +} + +/** + * @brief Swallowing interaction between two particles (non-symmetric). + * + * Function used to flag the gas particles that will be swallowed + * by the black hole particle. + * + * @param r2 Comoving square distance between the two particles. + * @param dx Comoving vector separating both particles (pi - pj). + * @param hi Comoving smoothing-length of particle i. + * @param hj Comoving smoothing-length of particle j. + * @param bi First particle (black hole). + * @param pj Second particle (gas) + * @param xpj The extended data of the second particle. + * @param with_cosmology Are we doing a cosmological run? + * @param cosmo The cosmological model. + * @param grav_props The properties of the gravity scheme (softening, G, ...). + * @param bh_props The properties of the BH scheme + * @param ti_current Current integer time value (for random numbers). + * @param time Current physical time in the simulation. + * @param step The current time-step. + */ +__attribute__((always_inline)) INLINE static void +runner_iact_nonsym_bh_gas_swallow( + const float r2, const float *dx, const float hi, const float hj, + struct bpart *bi, struct part *pj, struct xpart *xpj, + const int with_cosmology, const struct cosmology *cosmo, + const struct gravity_props *grav_props, + const struct black_holes_props *bh_props, + const struct entropy_floor_properties *floor_props, + const integertime_t ti_current, const double time) { + + float wi; + + /* Get r. */ + const float r = sqrtf(r2); + + /* Compute the kernel function */ + const float hi_inv = 1.0f / hi; + const float hi_inv_dim = pow_dimension(hi_inv); + const float ui = r * hi_inv; + kernel_eval(ui, &wi); + + /* Check if the BH needs to be fed. If not, we're done here */ + const float bh_mass_deficit = bi->subgrid_mass - bi->mass_at_start_of_step; + if (bh_mass_deficit <= 0) return; + + if (bh_props->use_nibbling) { + + /* If we do nibbling, things are quite straightforward. We transfer + * the mass and all associated quantities right here. */ + + const float bi_mass_orig = bi->mass; + const float pj_mass_orig = hydro_get_mass(pj); + + /* Don't nibble from particles that are too small already */ + if (pj_mass_orig < bh_props->min_gas_mass_for_nibbling) return; + + /* Next line is equivalent to w_ij * m_j / Sum_j (w_ij * m_j) */ + const float particle_weight = hi_inv_dim * wi * pj_mass_orig / bi->rho_gas; + float nibble_mass = bh_mass_deficit * particle_weight; + + /* We radiated away some of the accreted mass, so need to take slightly + * more from the gas than the BH gained */ + const float excess_fraction = 1.0 / (1.0 - bi->radiative_efficiency); + + /* Need to check whether nibbling would push gas mass below minimum + * allowed mass */ + float new_gas_mass = pj_mass_orig - nibble_mass * excess_fraction; + if (new_gas_mass < bh_props->min_gas_mass_for_nibbling) { + new_gas_mass = bh_props->min_gas_mass_for_nibbling; + nibble_mass = (pj_mass_orig - bh_props->min_gas_mass_for_nibbling) / + excess_fraction; + } + + /* Correct for nibbling the particle mass that is stored in rays */ + for (int i = 0; i < spinjet_blackhole_number_of_rays; i++) { + if (bi->rays[i].id_min_length == pj->id) bi->rays[i].mass = new_gas_mass; + if (bi->rays_jet[i].id_min_length == pj->id) { + bi->rays_jet[i].mass = new_gas_mass; + } + if (bi->rays_jet_pos[i].id_min_length == pj->id) { + bi->rays_jet_pos[i].mass = new_gas_mass; + } + } + + /* Transfer (dynamical) mass from the gas particle to the BH */ + bi->mass += nibble_mass; + hydro_set_mass(pj, new_gas_mass); + + /* Add the angular momentum of the accreted gas to the BH total. + * Note no change to gas here. The cosmological conversion factors for + * velocity (a^-1) and distance (a) cancel out, so the angular momentum + * is already in physical units. */ + const float dv[3] = {bi->v[0] - pj->v[0], bi->v[1] - pj->v[1], + bi->v[2] - pj->v[2]}; + bi->swallowed_angular_momentum[0] += + nibble_mass * (dx[1] * dv[2] - dx[2] * dv[1]); + bi->swallowed_angular_momentum[1] += + nibble_mass * (dx[2] * dv[0] - dx[0] * dv[2]); + bi->swallowed_angular_momentum[2] += + nibble_mass * (dx[0] * dv[1] - dx[1] * dv[0]); + + /* Update the BH momentum and velocity. Again, no change to gas here. */ + const float bi_mom[3] = {bi_mass_orig * bi->v[0] + nibble_mass * pj->v[0], + bi_mass_orig * bi->v[1] + nibble_mass * pj->v[1], + bi_mass_orig * bi->v[2] + nibble_mass * pj->v[2]}; + + bi->v[0] = bi_mom[0] / bi->mass; + bi->v[1] = bi_mom[1] / bi->mass; + bi->v[2] = bi_mom[2] / bi->mass; + + const float nibbled_mass = nibble_mass * excess_fraction; + const float nibbled_fraction = nibbled_mass / pj_mass_orig; + + /* Update the BH and also gas metal masses */ + struct chemistry_bpart_data *bi_chem = &bi->chemistry_data; + struct chemistry_part_data *pj_chem = &pj->chemistry_data; + chemistry_transfer_part_to_bpart(bi_chem, pj_chem, nibbled_mass, + nibbled_fraction); + + } else { /* ends nibbling section, below comes swallowing */ + + /* Probability to swallow this particle + * Recall that in SWIFT the SPH kernel is recovered by computing + * kernel_eval() and muliplying by (1/h^d) */ + const float prob = + (bi->subgrid_mass - bi->mass) * hi_inv_dim * wi / bi->rho_gas; + + /* Draw a random number (Note mixing both IDs) */ + const float rand = random_unit_interval(bi->id + pj->id, ti_current, + random_number_BH_swallow); + + /* Are we lucky? */ + if (rand < prob) { + + /* This particle is swallowed by the BH with the largest ID of all the + * candidates wanting to swallow it */ + if (pj->black_holes_data.swallow_id < bi->id) { + + message("BH %lld wants to swallow gas particle %lld", bi->id, pj->id); + + pj->black_holes_data.swallow_id = bi->id; + + } else { + + message( + "BH %lld wants to swallow gas particle %lld BUT CANNOT (old " + "swallow id=%lld)", + bi->id, pj->id, pj->black_holes_data.swallow_id); + } + } + } /* ends section for swallowing */ +} + +/** + * @brief Swallowing interaction between two BH particles (non-symmetric). + * + * Function used to identify the BH particle that this BH may move towards. + * + * @param r2 Comoving square distance between the two particles. + * @param dx Comoving vector separating both particles (pi - pj). + * @param hi Comoving smoothing-length of particle i. + * @param hj Comoving smoothing-length of particle j. + * @param bi First particle (black hole). + * @param bj Second particle (black hole) + * @param cosmo The cosmological model. + * @param grav_props The properties of the gravity scheme (softening, G, ...). + * @param bh_props The properties of the BH scheme + * @param ti_current Current integer time value (for random numbers). + */ +__attribute__((always_inline)) INLINE static void +runner_iact_nonsym_bh_bh_repos(const float r2, const float *dx, const float hi, + const float hj, struct bpart *bi, + struct bpart *bj, const struct cosmology *cosmo, + const struct gravity_props *grav_props, + const struct black_holes_props *bh_props, + const integertime_t ti_current) { + + /* Compute relative peculiar velocity between the two BHs + * Recall that in SWIFT v is (v_pec * a) */ + const float delta_v[3] = {bi->v[0] - bj->v[0], bi->v[1] - bj->v[1], + bi->v[2] - bj->v[2]}; + const float v2 = delta_v[0] * delta_v[0] + delta_v[1] * delta_v[1] + + delta_v[2] * delta_v[2]; + + const float v2_pec = v2 * cosmo->a2_inv; + + /* (Square of) Max repositioning distance allowed based on the softening */ + const float max_dist_repos2 = + kernel_gravity_softening_plummer_equivalent_inv * + kernel_gravity_softening_plummer_equivalent_inv * + bh_props->max_reposition_distance_ratio * + bh_props->max_reposition_distance_ratio * grav_props->epsilon_baryon_cur * + grav_props->epsilon_baryon_cur; + + /* Is this BH neighbour close enough that we can consider its potential + for repositioning? */ + if (r2 < max_dist_repos2) { + + /* Flag to check whether neighbour is slow enough to be considered + * as repositioning target. Always true if velocity cut switched off */ + int neighbour_is_slow_enough = 1; + if (bh_props->with_reposition_velocity_threshold) { + + /* Compute the maximum allowed velocity */ + float v2_max = bh_props->max_reposition_velocity_ratio * + bh_props->max_reposition_velocity_ratio * + bi->sound_speed_gas * bi->sound_speed_gas; + + /* If desired, limit the value of the threshold (v2_max) to be no + * smaller than a user-defined value */ + if (bh_props->min_reposition_velocity_threshold > 0) { + const float v2_min_thresh = + bh_props->min_reposition_velocity_threshold * + bh_props->min_reposition_velocity_threshold; + v2_max = max(v2_max, v2_min_thresh); + } + + /* Is the neighbour too fast to jump to? */ + if (v2_pec >= v2_max) neighbour_is_slow_enough = 0; + } + + if (neighbour_is_slow_enough) { + + float potential = bj->reposition.potential; + + if (bh_props->correct_bh_potential_for_repositioning) { + + /* Let's not include the contribution of the BH i + * to the potential of the BH j */ + + const float eps = gravity_get_softening(bi->gpart, grav_props); + const float eps2 = eps * eps; + const float eps_inv = 1.f / eps; + const float eps_inv3 = eps_inv * eps_inv * eps_inv; + const float BH_mass = bi->mass; + + /* Compute the Newtonian or truncated potential the BH + * exherts onto the gas particle */ + float dummy, pot_ij; + runner_iact_grav_pp_full(r2, eps2, eps_inv, eps_inv3, BH_mass, &dummy, + &pot_ij); + + /* Deduct the BH contribution */ + potential -= pot_ij * grav_props->G_Newton; + } + + /* Is the potential lower? */ + if (potential < bi->reposition.min_potential) { + + /* Store this as our new best */ + bi->reposition.min_potential = potential; + bi->reposition.delta_x[0] = -dx[0]; + bi->reposition.delta_x[1] = -dx[1]; + bi->reposition.delta_x[2] = -dx[2]; + } + } + } +} + +/** + * @brief Swallowing interaction between two BH particles (non-symmetric). + * + * Function used to flag the BH particles that will be swallowed + * by the black hole particle. + * + * @param r2 Comoving square distance between the two particles. + * @param dx Comoving vector separating both particles (pi - pj). + * @param hi Comoving smoothing-length of particle i. + * @param hj Comoving smoothing-length of particle j. + * @param bi First particle (black hole). + * @param bj Second particle (black hole) + * @param cosmo The cosmological model. + * @param grav_props The properties of the gravity scheme (softening, G, ...). + * @param bh_props The properties of the BH scheme + * @param ti_current Current integer time value (for random numbers). + */ +__attribute__((always_inline)) INLINE static void +runner_iact_nonsym_bh_bh_swallow(const float r2, const float *dx, + const float hi, const float hj, + struct bpart *bi, struct bpart *bj, + const struct cosmology *cosmo, + const struct gravity_props *grav_props, + const struct black_holes_props *bh_props, + const integertime_t ti_current) { + + /* Compute relative peculiar velocity between the two BHs + * Recall that in SWIFT v is (v_pec * a) */ + const float delta_v[3] = {bi->v[0] - bj->v[0], bi->v[1] - bj->v[1], + bi->v[2] - bj->v[2]}; + const float v2 = delta_v[0] * delta_v[0] + delta_v[1] * delta_v[1] + + delta_v[2] * delta_v[2]; + + const float v2_pec = v2 * cosmo->a2_inv; + + /* Find the most massive of the two BHs */ + float M = bi->subgrid_mass; + float h = hi; + if (bj->subgrid_mass > M) { + M = bj->subgrid_mass; + h = hj; + } + + /* (Square of) max swallowing distance allowed based on the softening */ + const float max_dist_merge2 = + kernel_gravity_softening_plummer_equivalent_inv * + kernel_gravity_softening_plummer_equivalent_inv * + bh_props->max_merging_distance_ratio * + bh_props->max_merging_distance_ratio * grav_props->epsilon_baryon_cur * + grav_props->epsilon_baryon_cur; + + const float G_Newton = grav_props->G_Newton; + + /* The BH with the smaller mass will be merged onto the one with the + * larger mass. + * To avoid rounding issues, we additionally check for IDs if the BHs + * have the exact same mass. */ + if ((bj->subgrid_mass < bi->subgrid_mass) || + (bj->subgrid_mass == bi->subgrid_mass && bj->id < bi->id)) { + + /* Maximum velocity difference between BHs allowed to merge */ + float v2_threshold; + + if (bh_props->merger_threshold_type == BH_mergers_circular_velocity) { + + /* 'Old-style' merger threshold using circular velocity at the + * edge of the more massive BH's kernel (note: we are using the kernel + * support radius here and not just the smoothing length). */ + v2_threshold = G_Newton * M / (kernel_gamma * h); + } else { + + /* Arguably better merger threshold using the escape velocity at + * the distance between the BHs */ + + if (bh_props->merger_threshold_type == BH_mergers_escape_velocity) { + /* Standard formula (not softening BH interactions) */ + v2_threshold = 2.f * G_Newton * M / sqrt(r2); + } else if (bh_props->merger_threshold_type == + BH_mergers_dynamical_escape_velocity) { + /* General two-body escape velocity based on dynamical masses */ + v2_threshold = 2.f * G_Newton * (bi->mass + bj->mass) / sqrt(r2); + } else { + error("Unexpected BH merger threshold type!"); + v2_threshold = 0.f; + } + } /* Ends sections for different merger thresholds */ + + if ((v2_pec < v2_threshold) && (r2 < max_dist_merge2)) { + + /* This particle is swallowed by the BH with the largest ID of all the + * candidates wanting to swallow it */ + if ((bj->merger_data.swallow_mass < bi->subgrid_mass) || + (bj->merger_data.swallow_mass == bi->subgrid_mass && + bj->merger_data.swallow_id < bi->id)) { + + message("BH %lld wants to swallow BH particle %lld", bi->id, bj->id); + + bj->merger_data.swallow_id = bi->id; + bj->merger_data.swallow_mass = bi->subgrid_mass; + + } else { + + message( + "BH %lld wants to swallow gas particle %lld BUT CANNOT (old " + "swallow id=%lld)", + bi->id, bj->id, bj->merger_data.swallow_id); + } + } + } +} + +/** + * @brief Feedback interaction between two particles (non-symmetric). + * + * @param r2 Comoving square distance between the two particles. + * @param dx Comoving vector separating both particles (pi - pj). + * @param hi Comoving smoothing-length of particle i. + * @param hj Comoving smoothing-length of particle j. + * @param bi First particle (black hole). + * @param pj Second particle (gas) + * @param xpj The extended data of the second particle. + * @param with_cosmology Are we doing a cosmological run? + * @param cosmo The cosmological model. + * @param grav_props The properties of the gravity scheme (softening, G, ...). + * @param bh_props The properties of the BH scheme + * @param ti_current Current integer time value (for random numbers). + * @param time current physical time in the simulation + * @param step The current time-step. + */ +__attribute__((always_inline)) INLINE static void +runner_iact_nonsym_bh_gas_feedback( + const float r2, const float *dx, const float hi, const float hj, + const struct bpart *bi, struct part *pj, struct xpart *xpj, + const int with_cosmology, const struct cosmology *cosmo, + const struct gravity_props *grav_props, + const struct black_holes_props *bh_props, + const struct entropy_floor_properties *floor_props, + const integertime_t ti_current, const double time) { + + /* Number of energy injections per BH per time-step */ + const int num_energy_injections_per_BH = + bi->to_distribute.AGN_number_of_energy_injections; + + /* Are we doing some feedback? */ + if (num_energy_injections_per_BH > 0) { + + /* Number of energy injections that have reached this gas particle */ + int num_of_energy_inj_received_by_gas = 0; + + /* Find out how many rays (= energy injections) this gas particle + * has received */ + for (int i = 0; i < num_energy_injections_per_BH; i++) { + if (pj->id == bi->rays[i].id_min_length) + num_of_energy_inj_received_by_gas++; + } + + /* If the number of received rays is non-zero, inject + * AGN energy in thermal form */ + if (num_of_energy_inj_received_by_gas > 0) { + + /* Compute new energy per unit mass of this particle + * The energy the particle receives is proportional to the number of rays + * (num_of_energy_inj_received_by_gas) to which the particle was found to + * be closest. */ + const double u_init = hydro_get_physical_internal_energy(pj, xpj, cosmo); + const float delta_u = bi->to_distribute.AGN_delta_u * + (float)num_of_energy_inj_received_by_gas; + const double u_new = u_init + delta_u; + + hydro_set_physical_internal_energy(pj, xpj, cosmo, u_new); + hydro_set_drifted_physical_internal_energy(pj, cosmo, u_new); + + /* Impose maximal viscosity */ + hydro_diffusive_feedback_reset(pj); + + /* Store the feedback energy */ + const double delta_energy = delta_u * hydro_get_mass(pj); + tracers_after_black_holes_feedback(pj, xpj, with_cosmology, cosmo->a, + time, delta_energy); + + /* message( */ + /* "We did some AGN heating! id %llu BH id %llu probability " */ + /* " %.5e random_num %.5e du %.5e du/ini %.5e", */ + /* pj->id, bi->id, prob, rand, delta_u, delta_u / u_init); */ + + /* Synchronize the particle on the timeline */ + timestep_sync_part(pj); + } + } + + /* Number of jet injections per BH per time-step */ + const int num_jet_injections_per_BH = + bi->to_distribute.AGN_number_of_jet_injections; + + /* Are we doing some jet feedback? */ + if (num_jet_injections_per_BH > 0) { + + /* Number of jet injections that have reached this gas particle */ + int num_of_jet_inj_received_by_gas = 0; + + /* Define a variable to assign a velocity kick direction depending + on which side of the BH smoothing kernel the particle is */ + float direction = 0.; + + /* Find out if this gas particle has received any jet injections (rays). + Loop through num_jet_injections divided by 2 because of two sets of rays */ + for (int i = 0; i < num_jet_injections_per_BH / 2; i++) { + if (pj->id == bi->rays_jet[i].id_min_length) { + + num_of_jet_inj_received_by_gas++; + + /*This particle is in the 'negative' hemisphere (pointing away from the + spin vector of the BH), so it receives a negative kick direction */ + direction = -1.; + } + } + + for (int i = 0; i < num_jet_injections_per_BH / 2; i++) { + if (pj->id == bi->rays_jet_pos[i].id_min_length) { + + num_of_jet_inj_received_by_gas++; + + /* This particle is in the 'positive' hemisphere (pointing in the + direction of the spin vector of the BH), so it receives a positive + kick direction */ + direction = 1.; + } + } + + /* If the number of received rays is non-zero, inject + * AGN jet energy as a kinetic kick */ + if (num_of_jet_inj_received_by_gas > 0) { + + /* Get the kinetic energy per unit mass */ + const float delta_u_jet = bi->to_distribute.AGN_delta_u_jet * + (float)num_of_jet_inj_received_by_gas; + + /* Get the (physical) kick velocity, and convert to code units */ + const float vel_kick = sqrtf(2. * delta_u_jet) * cosmo->a; + + /* Compute velocity kick direction using a function for generating a + * random unit vector within a cone around the spin vector.*/ + float vel_kick_direction[3]; + random_direction_in_cone(bi->id, pj->id, ti_current, + random_number_BH_kick, bh_props->opening_angle, + bi->angular_momentum_direction, + vel_kick_direction); + + /* Include the -1./1. factor (direction) which accounts for kicks in the + * opposite direction of the spin vector */ + vel_kick_direction[0] = direction * vel_kick_direction[0]; + vel_kick_direction[1] = direction * vel_kick_direction[1]; + vel_kick_direction[2] = direction * vel_kick_direction[2]; + + /* Get the initial velocity */ + const float v_init[3] = {xpj->v_full[0], xpj->v_full[1], xpj->v_full[2]}; + + /* We compute this final velocity by requiring that the final energy and + * the inital one differ by the energy received by the particle, i.e. + * + * (pi + delta_pi)^2 / (2m) - pi^2 / (2m) = u, + * + * u here being the energy per unit mass received by the particle. pi is + * the initial momentum, and the momenta terms are expressed in vector + * form. The equation, if expressed in terms of velocities, amounts to + * + * norm(delta_v) + 2 * norm(delta_v) * norm(v_i) * cos_theta_v = v_k^2. + * + * Here, delta_v is the change in velocity which we wish to apply, v_i is + * the initial velocity, cos_theta_v the cosine of the angle between the + * two and v_k^2 is the vel_kick term computed from the energy received + * by the particle. The delta_v applied to the particle will differ in + * norm from the parameter v_j used for jet feedback for two reasons: + * 1) v_k is slightly different from v_j if the particle mass is not + * equal to the mean neighbour mass, and 2) the presence of the initial + * velocity means we need to increase the magnitude of the velocity by + * less than v_j in order to increase its energy by (1/2)mv_j^2. We solve + * the above quadratic equation for the norm(delta_v). We begin by + * calculating norm(v_i) * cos_theta_v, which is the initial velocity + * projected onto the velocity kick direction. */ + const float v_init_proj = v_init[0] * vel_kick_direction[0] + + v_init[1] * vel_kick_direction[1] + + v_init[2] * vel_kick_direction[2]; + const float delta_v = + sqrtf(max(0., v_init_proj * v_init_proj + vel_kick * vel_kick)) - + v_init_proj; + + /* Calculate final velocity by adding delta_v in the direction of the kick + */ + xpj->v_full[0] += delta_v * vel_kick_direction[0]; + xpj->v_full[1] += delta_v * vel_kick_direction[1]; + xpj->v_full[2] += delta_v * vel_kick_direction[2]; + +#ifdef SWIFT_DEBUG_CHECKS + message( + "Black hole with id %lld kicked particle with id %lld , with a final " + "velocity of (%f, %f, %f).", + bi->id, pj->id, xpj->v_full[0], xpj->v_full[1], xpj->v_full[2]); +#endif + + /* Store the jet energy */ + const double delta_energy_jet = delta_u_jet * hydro_get_mass(pj); + tracers_after_jet_feedback(pj, xpj, with_cosmology, cosmo->a, time, + delta_energy_jet); + + /* Impose maximal viscosity */ + hydro_diffusive_feedback_reset(pj); + + /* Update the signal velocity */ + hydro_set_v_sig_based_on_velocity_kick(pj, cosmo, + sqrtf(2. * delta_u_jet)); + + /* Synchronize particle on the time-line */ + timestep_sync_part(pj); + } + } + +#ifdef DEBUG_INTERACTIONS_BH + /* Update ngb counters */ + if (si->num_ngb_force < MAX_NUM_OF_NEIGHBOURS_BH) + bi->ids_ngbs_force[si->num_ngb_force] = pj->id; + + /* Update ngb counters */ + ++si->num_ngb_force; +#endif +} + +#endif /* SWIFT_SPIN_JET_BH_IACT_H */ diff --git a/src/black_holes/SPIN_JET/black_holes_io.h b/src/black_holes/SPIN_JET/black_holes_io.h new file mode 100644 index 0000000000000000000000000000000000000000..5024392055afd4cdbab406860c25d462a0127410 --- /dev/null +++ b/src/black_holes/SPIN_JET/black_holes_io.h @@ -0,0 +1,521 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Copyright (c) 2020 Matthieu Schaller (schaller@strw.leidenuniv.nl) + * Copyright (c) 2022 Filip Husko (filip.husko@durham.ac.uk) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + ******************************************************************************/ +#ifndef SWIFT_SPIN_JET_BLACK_HOLES_IO_H +#define SWIFT_SPIN_JET_BLACK_HOLES_IO_H + +#include "adiabatic_index.h" +#include "black_holes_part.h" +#include "io_properties.h" + +/** + * @brief Specifies which b-particle fields to read from a dataset + * + * @param bparts The b-particle array. + * @param list The list of i/o properties to read. + * @param num_fields The number of i/o fields to read. + */ +INLINE static void black_holes_read_particles(struct bpart* bparts, + struct io_props* list, + int* num_fields) { + + /* Say how much we want to read */ + *num_fields = 9; + + /* List what we want to read */ + list[0] = io_make_input_field("Coordinates", DOUBLE, 3, COMPULSORY, + UNIT_CONV_LENGTH, bparts, x); + list[1] = io_make_input_field("Velocities", FLOAT, 3, COMPULSORY, + UNIT_CONV_SPEED, bparts, v); + list[2] = io_make_input_field("Masses", FLOAT, 1, COMPULSORY, UNIT_CONV_MASS, + bparts, mass); + list[3] = io_make_input_field("ParticleIDs", LONGLONG, 1, COMPULSORY, + UNIT_CONV_NO_UNITS, bparts, id); + list[4] = io_make_input_field("SmoothingLength", FLOAT, 1, OPTIONAL, + UNIT_CONV_LENGTH, bparts, h); + list[5] = io_make_input_field("EnergyReservoir", FLOAT, 1, OPTIONAL, + UNIT_CONV_ENERGY, bparts, energy_reservoir); + list[6] = io_make_input_field("SubgridMasses", FLOAT, 1, OPTIONAL, + UNIT_CONV_MASS, bparts, subgrid_mass); + list[7] = io_make_input_field("Spins", FLOAT, 1, COMPULSORY, + UNIT_CONV_NO_UNITS, bparts, spin); + list[8] = io_make_input_field("AngularMomentumDirections", FLOAT, 3, + COMPULSORY, UNIT_CONV_NO_UNITS, bparts, + angular_momentum_direction); +} + +INLINE static void convert_bpart_pos(const struct engine* e, + const struct bpart* bp, double* ret) { + + const struct space* s = e->s; + if (s->periodic) { + ret[0] = box_wrap(bp->x[0], 0.0, s->dim[0]); + ret[1] = box_wrap(bp->x[1], 0.0, s->dim[1]); + ret[2] = box_wrap(bp->x[2], 0.0, s->dim[2]); + } else { + ret[0] = bp->x[0]; + ret[1] = bp->x[1]; + ret[2] = bp->x[2]; + } +} + +INLINE static void convert_bpart_vel(const struct engine* e, + const struct bpart* bp, float* ret) { + + const int with_cosmology = (e->policy & engine_policy_cosmology); + const struct cosmology* cosmo = e->cosmology; + const integertime_t ti_current = e->ti_current; + const double time_base = e->time_base; + + const integertime_t ti_beg = get_integer_time_begin(ti_current, bp->time_bin); + const integertime_t ti_end = get_integer_time_end(ti_current, bp->time_bin); + + /* Get time-step since the last kick */ + float dt_kick_grav; + if (with_cosmology) { + dt_kick_grav = cosmology_get_grav_kick_factor(cosmo, ti_beg, ti_current); + dt_kick_grav -= + cosmology_get_grav_kick_factor(cosmo, ti_beg, (ti_beg + ti_end) / 2); + } else { + dt_kick_grav = (ti_current - ((ti_beg + ti_end) / 2)) * time_base; + } + + /* Extrapolate the velocites to the current time */ + const struct gpart* gp = bp->gpart; + ret[0] = gp->v_full[0] + gp->a_grav[0] * dt_kick_grav; + ret[1] = gp->v_full[1] + gp->a_grav[1] * dt_kick_grav; + ret[2] = gp->v_full[2] + gp->a_grav[2] * dt_kick_grav; + + /* Conversion from internal to physical units */ + ret[0] *= cosmo->a_inv; + ret[1] *= cosmo->a_inv; + ret[2] *= cosmo->a_inv; +} + +INLINE static void convert_bpart_potential(const struct engine* e, + const struct bpart* bp, float* ret) { + + if (bp->gpart != NULL) + ret[0] = gravity_get_comoving_potential(bp->gpart); + else + ret[0] = 0.f; +} + +INLINE static void convert_bpart_gas_vel(const struct engine* e, + const struct bpart* bp, float* ret) { + + const struct cosmology* cosmo = e->cosmology; + + /* Convert relative velocities to physical units */ + ret[0] = bp->velocity_gas[0] * cosmo->a_inv; + ret[1] = bp->velocity_gas[1] * cosmo->a_inv; + ret[2] = bp->velocity_gas[2] * cosmo->a_inv; +} + +INLINE static void convert_bpart_gas_circular_vel(const struct engine* e, + const struct bpart* bp, + float* ret) { + + const struct cosmology* cosmo = e->cosmology; + + /* Conversion from internal to physical units */ + ret[0] = bp->circular_velocity_gas[0] * cosmo->a_inv; + ret[1] = bp->circular_velocity_gas[1] * cosmo->a_inv; + ret[2] = bp->circular_velocity_gas[2] * cosmo->a_inv; +} + +INLINE static void convert_bpart_gas_velocity_dispersion(const struct engine* e, + const struct bpart* bp, + float* ret) { + + const struct cosmology* cosmo = e->cosmology; + + /* Conversion from internal to physical units */ + ret[0] = bp->velocity_dispersion_gas * cosmo->a_inv; +} + +INLINE static void convert_bpart_gas_velocity_curl(const struct engine* e, + const struct bpart* bp, + float* ret) { + + const struct cosmology* cosmo = e->cosmology; + + /* Conversion from internal to physical units */ + ret[0] = bp->curl_v_gas[0] * cosmo->a2_inv; + ret[1] = bp->curl_v_gas[1] * cosmo->a2_inv; + ret[2] = bp->curl_v_gas[2] * cosmo->a2_inv; +} + +/** + * @brief Specifies which b-particle fields to write to a dataset + * + * @param bparts The b-particle array. + * @param list The list of i/o properties to write. + * @param num_fields The number of i/o fields to write. + * @param with_cosmology Are we running a cosmological simulation? + */ +INLINE static void black_holes_write_particles(const struct bpart* bparts, + struct io_props* list, + int* num_fields, + int with_cosmology) { + + /* Say how much we want to write */ + *num_fields = 52; + + /* List what we want to write */ + list[0] = io_make_output_field_convert_bpart( + "Coordinates", DOUBLE, 3, UNIT_CONV_LENGTH, 1.f, bparts, + convert_bpart_pos, "Co-moving position of the particles"); + + list[1] = io_make_output_field_convert_bpart( + "Velocities", FLOAT, 3, UNIT_CONV_SPEED, 0.f, bparts, convert_bpart_vel, + "Peculiar velocities of the particles. This is a * dx/dt where x is the " + "co-moving position of the particles."); + + list[2] = + io_make_output_field("DynamicalMasses", FLOAT, 1, UNIT_CONV_MASS, 0.f, + bparts, mass, "Dynamical masses of the particles"); + + list[3] = + io_make_output_field("ParticleIDs", ULONGLONG, 1, UNIT_CONV_NO_UNITS, 0.f, + bparts, id, "Unique ID of the particles"); + + list[4] = io_make_output_field( + "SmoothingLengths", FLOAT, 1, UNIT_CONV_LENGTH, 1.f, bparts, h, + "Co-moving smoothing lengths (FWHM of the kernel) of the particles"); + + list[5] = io_make_output_field("SubgridMasses", FLOAT, 1, UNIT_CONV_MASS, 0.f, + bparts, subgrid_mass, + "Subgrid masses of the particles"); + + if (with_cosmology) { + list[6] = io_make_output_field( + "FormationScaleFactors", FLOAT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + formation_scale_factor, "Scale-factors at which the BHs were formed"); + } else { + list[6] = io_make_output_field("FormationTimes", FLOAT, 1, UNIT_CONV_TIME, + 0.f, bparts, formation_time, + "Times at which the BHs were formed"); + } + + list[7] = io_make_output_field( + "GasDensities", FLOAT, 1, UNIT_CONV_DENSITY, 0.f, bparts, rho_gas, + "Co-moving densities of the gas around the particles"); + + list[8] = io_make_output_field( + "GasSoundSpeeds", FLOAT, 1, UNIT_CONV_SPEED, + -1.5f * hydro_gamma_minus_one, bparts, sound_speed_gas, + "Co-moving sound-speeds of the gas around the particles"); + + list[9] = io_make_output_field( + "EnergyReservoirs", FLOAT, 1, UNIT_CONV_ENERGY, 0.f, bparts, + energy_reservoir, + "Physcial energy contained in the feedback reservoir of the particles"); + + list[10] = io_make_output_field( + "AccretionRates", FLOAT, 1, UNIT_CONV_MASS_PER_UNIT_TIME, 0.f, bparts, + accretion_rate, + "Physical instantaneous accretion rates of the particles"); + + list[11] = io_make_output_field( + "TotalAccretedMasses", FLOAT, 1, UNIT_CONV_MASS_PER_UNIT_TIME, 0.f, + bparts, total_accreted_mass, + "Total mass accreted onto the particles since its birth"); + + list[12] = io_make_output_field( + "CumulativeNumberOfSeeds", INT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + cumulative_number_seeds, + "Total number of BH seeds that have merged into this black hole"); + + list[13] = + io_make_output_field("NumberOfMergers", INT, 1, UNIT_CONV_NO_UNITS, 0.f, + bparts, number_of_mergers, + "Number of mergers the black holes went through. " + "This does not include the number of mergers " + "accumulated by any merged black hole."); + + if (with_cosmology) { + list[14] = io_make_output_field( + "LastHighEddingtonFractionScaleFactors", FLOAT, 1, UNIT_CONV_NO_UNITS, + 0.f, bparts, last_high_Eddington_fraction_scale_factor, + "Scale-factors at which the black holes last reached a large Eddington " + "ratio. -1 if never reached."); + } else { + list[14] = io_make_output_field( + "LastHighEddingtonFractionTimes", FLOAT, 1, UNIT_CONV_TIME, 0.f, bparts, + last_high_Eddington_fraction_time, + "Times at which the black holes last reached a large Eddington ratio. " + "-1 if never reached."); + } + + if (with_cosmology) { + list[15] = io_make_output_field( + "LastMinorMergerScaleFactors", FLOAT, 1, UNIT_CONV_NO_UNITS, 0.f, + bparts, last_minor_merger_scale_factor, + "Scale-factors at which the black holes last had a minor merger."); + } else { + list[15] = io_make_output_field( + "LastMinorMergerScaleTimes", FLOAT, 1, UNIT_CONV_TIME, 0.f, bparts, + last_minor_merger_time, + "Times at which the black holes last had a minor merger."); + } + + if (with_cosmology) { + list[16] = io_make_output_field( + "LastMajorMergerScaleFactors", FLOAT, 1, UNIT_CONV_NO_UNITS, 0.f, + bparts, last_major_merger_scale_factor, + "Scale-factors at which the black holes last had a major merger."); + } else { + list[16] = io_make_output_field( + "LastMajorMergerScaleTimes", FLOAT, 1, UNIT_CONV_TIME, 0.f, bparts, + last_major_merger_time, + "Times at which the black holes last had a major merger."); + } + + list[17] = io_make_output_field( + "SwallowedAngularMomenta", FLOAT, 3, UNIT_CONV_ANGULAR_MOMENTUM, 0.f, + bparts, swallowed_angular_momentum, + "Physical angular momenta that the black holes have accumulated by " + "swallowing gas particles."); + + list[18] = io_make_output_field_convert_bpart( + "GasRelativeVelocities", FLOAT, 3, UNIT_CONV_SPEED, 0.f, bparts, + convert_bpart_gas_vel, + "Peculiar relative velocities of the gas particles around the black " + "holes. This is a * dx/dt where x is the co-moving position of the " + "particles."); + + list[19] = io_make_output_field_convert_bpart( + "GasCircularVelocities", FLOAT, 3, UNIT_CONV_SPEED, 0.f, bparts, + convert_bpart_gas_circular_vel, + "Circular velocities of the gas around the black hole at the " + "smoothing radius. This is j / h_BH, where j is the smoothed, peculiar " + "specific angular momentum of gas around the black holes, and h_BH is " + "the smoothing length of each black hole."); + + list[20] = + io_make_output_field("TimeBins", CHAR, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + time_bin, "Time-bins of the particles"); + + list[21] = io_make_output_field( + "NumberOfSwallows", INT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + number_of_gas_swallows, + "Number of gas particles the black holes have swallowed. " + "This includes the particles swallowed by any of the black holes that " + "merged into this one."); + + list[22] = io_make_output_field( + "NumberOfDirectSwallows", INT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + number_of_direct_gas_swallows, + "Number of gas particles the black holes have swallowed. " + "This does not include any particles swallowed by any of the black holes " + "that merged into this one."); + + list[23] = io_make_output_field( + "NumberOfRepositions", INT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + number_of_repositions, + "Number of repositioning events the black holes went through. This does " + "not include the number of reposition events accumulated by any merged " + "black holes."); + + list[24] = io_make_output_field( + "NumberOfRepositionAttempts", INT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + number_of_reposition_attempts, + "Number of time steps in which the black holes had an eligible particle " + "to reposition to. They may or may not have ended up moving there, " + "depending on their subgrid mass and on whether these particles were at " + "a lower or higher potential than the black holes themselves. It does " + "not include attempted repositioning events accumulated by any merged " + "black holes."); + + list[25] = io_make_output_field( + "NumberOfTimeSteps", INT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + number_of_time_steps, + "Total number of time steps at which the black holes were active."); + + list[26] = io_make_output_field( + "ViscosityFactors", FLOAT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, f_visc, + "Multiplicative factors by which the Bondi-Hoyle-Lyttleton accretion " + "rates have been suppressed by the Rosas-Guevara et al. (2015) " + "accretion disc model."); + + list[27] = io_make_output_field_convert_bpart( + "GasVelocityDispersions", FLOAT, 1, UNIT_CONV_SPEED, 0.f, bparts, + convert_bpart_gas_velocity_dispersion, + "Velocity dispersion (3D) of the gas particles around the black " + "holes. This is a * sqrt(<|dx/dt|^2> - <|dx/dt|>^2) where x is the " + "co-moving position of the particles relative to the black holes."); + + list[28] = io_make_output_field_convert_bpart( + "GasCurlVelocities", FLOAT, 3, UNIT_CONV_SPEED, 0.f, bparts, + convert_bpart_gas_velocity_curl, + "Velocity curl (3D) of the gas particles around the black holes."); + + list[29] = io_make_output_field( + "AccretedAngularMomenta", FLOAT, 3, UNIT_CONV_ANGULAR_MOMENTUM, 0.f, + bparts, accreted_angular_momentum, + "Physical angular momenta that the black holes have accumulated through " + "subgrid accretion."); + + list[30] = io_make_output_field( + "NumberOfGasNeighbours", INT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + num_ngbs, + "Integer number of gas neighbour particles within the black hole " + "kernels."); + + list[31] = io_make_output_field( + "NumberOfHeatingEvents", INT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + AGN_number_of_energy_injections, + "Integer number of (thermal) energy injections the black hole has had " + "so far"); + + list[32] = io_make_output_field( + "NumberOfAGNEvents", INT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + AGN_number_of_AGN_events, + "Integer number of AGN events the black hole has had so far" + " (the number of times the BH did AGN feedback)"); + + if (with_cosmology) { + list[33] = io_make_output_field( + "LastAGNFeedbackScaleFactors", FLOAT, 1, UNIT_CONV_NO_UNITS, 0.f, + bparts, last_AGN_event_scale_factor, + "Scale-factors at which the black holes last had an AGN event."); + } else { + list[33] = io_make_output_field( + "LastAGNFeedbackTimes", FLOAT, 1, UNIT_CONV_TIME, 0.f, bparts, + last_AGN_event_time, + "Times at which the black holes last had an AGN event."); + } + + list[34] = io_make_output_field( + "AccretionLimitedTimeSteps", FLOAT, 1, UNIT_CONV_TIME, 0.f, bparts, + dt_heat, "Accretion-limited time-steps of black holes."); + + list[35] = io_make_output_field( + "AGNTotalInjectedEnergies", FLOAT, 1, UNIT_CONV_ENERGY, 0.f, bparts, + AGN_cumulative_energy, + "Total (cumulative) physical energies injected into gas particles " + "in AGN feedback."); + + list[36] = io_make_output_field_convert_bpart( + "Potentials", FLOAT, 1, UNIT_CONV_POTENTIAL, -1.f, bparts, + convert_bpart_potential, "Gravitational potentials of the particles"); + + list[37] = io_make_output_field( + "Spins", FLOAT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, spin, + "Dimensionless spins of the black holes. " + "Negative values indicate retrograde accretion."); + + list[38] = io_make_output_field( + "AngularMomentumDirections", FLOAT, 3, UNIT_CONV_NO_UNITS, 0.f, bparts, + angular_momentum_direction, + "Direction of the black hole spin vector, normalised to unity."); + + list[39] = io_make_output_field( + "AccretionDiscAspectRatios", FLOAT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + aspect_ratio, + "The aspect ratio, h/r, of the subgrid accretion disc " + "around the black hole."); + + list[40] = io_make_output_field( + "JetEfficiencies", FLOAT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + jet_efficiency, "Jet power divided by accretion rate."); + + list[41] = io_make_output_field( + "RadiativeEfficiencies", FLOAT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + radiative_efficiency, "AGN luminosity divided by accretion rate."); + + list[42] = io_make_output_field("CosAccretionDiskAngle", FLOAT, 1, + UNIT_CONV_NO_UNITS, 0.f, bparts, + accretion_disk_angle, + "Cosine of the angle between the spin vector " + "and the accreting gas angular momentum."); + + list[43] = io_make_output_field( + "AccretionModes", INT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, accretion_mode, + "Accretion flow regime. 0 - Thick disk, 1 - Thin disk, 2 - Slim disk"); + + list[44] = io_make_output_field( + "JetReservoir", FLOAT, 1, UNIT_CONV_ENERGY, 0.f, bparts, jet_reservoir, + "Total jet energy waiting to be released (once it " + "grows large enough to kick a single particle)."); + + list[45] = io_make_output_field( + "InjectedJetEnergies", FLOAT, 1, UNIT_CONV_ENERGY, 0.f, bparts, + total_jet_energy, "Total jet energy injected into AGN surroundings."); + + list[46] = io_make_output_field( + "JetTimeSteps", FLOAT, 1, UNIT_CONV_TIME, 0.f, bparts, dt_jet, + "Jet-launching-limited time-steps of black holes."); + + list[47] = io_make_output_field( + "NumberOfJetParticlesLaunched", INT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + AGN_number_of_jet_injections, + "Integer number of (kinetic) energy injections the black hole has had " + "so far"); + + list[48] = io_make_output_field( + "NumberOfAGNJetEvents", INT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + AGN_number_of_AGN_jet_events, + "Integer number of AGN jet launching events the black hole has had" + " (the number of times the BH did AGN jet feedback)"); + + if (with_cosmology) { + list[49] = io_make_output_field( + "LastAGNJetScaleFactors", FLOAT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + last_AGN_jet_event_scale_factor, + "Scale-factors at which the black holes last had an AGN jet event."); + } else { + list[49] = io_make_output_field( + "LastAGNJetTimes", FLOAT, 1, UNIT_CONV_TIME, 0.f, bparts, + last_AGN_jet_event_time, + "Times at which the black holes last had an AGN jet event."); + } + + list[50] = io_make_output_field( + "EddingtonFractions", FLOAT, 1, UNIT_CONV_NO_UNITS, 0.f, bparts, + eddington_fraction, + "Accretion rates of black holes in units of their Eddington rates. " + "This is based on the unlimited accretion rates, so these fractions " + "can be above the limiting fEdd."); + + list[51] = io_make_output_field( + "FOFGroupMasses", FLOAT, 1, UNIT_CONV_MASS, 0.f, bparts, group_mass, + "Parent halo masses of the black holes, as determined from the FOF " + "algorithm."); + +#ifdef DEBUG_INTERACTIONS_BLACK_HOLES + + list += *num_fields; + *num_fields += 4; + + list[0] = io_make_output_field("Num_ngb_density", INT, 1, UNIT_CONV_NO_UNITS, + bparts, num_ngb_density); + list[1] = io_make_output_field("Num_ngb_force", INT, 1, UNIT_CONV_NO_UNITS, + bparts, num_ngb_force); + list[2] = io_make_output_field("Ids_ngb_density", LONGLONG, + MAX_NUM_OF_NEIGHBOURS_BLACK_HOLES, + UNIT_CONV_NO_UNITS, bparts, ids_ngbs_density); + list[3] = io_make_output_field("Ids_ngb_force", LONGLONG, + MAX_NUM_OF_NEIGHBOURS_BLACK_HOLES, + UNIT_CONV_NO_UNITS, bparts, ids_ngbs_force); +#endif +} + +#endif /* SWIFT_SPIN_JET_BLACK_HOLES_IO_H */ diff --git a/src/black_holes/SPIN_JET/black_holes_parameters.h b/src/black_holes/SPIN_JET/black_holes_parameters.h new file mode 100644 index 0000000000000000000000000000000000000000..9bae913b333cd55eaacafb6c3d316948ba22a578 --- /dev/null +++ b/src/black_holes/SPIN_JET/black_holes_parameters.h @@ -0,0 +1,41 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Copyright (c) 2020 Matthieu Schaller (schaller@strw.leidenuniv.nl) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + ******************************************************************************/ +#ifndef SWIFT_SPIN_JET_BLACK_HOLES_PARAMETERS_H +#define SWIFT_SPIN_JET_BLACK_HOLES_PARAMETERS_H + +/* Configuration file */ +#include "config.h" + +/** + * @file EAGLE/black_holes_parameters.h + * @brief Parameters of the EAGLE black holes + * model that need to be defined at compile time. + * + * @note In this branch, these properties are not used anywhere! + */ + +/*! Maximal distance for merging particles in units of the (spline not Plummer) + * softening length. */ +#define const_max_merging_distance_ratio 3.f + +/*! Maximal distance for repositioning particles in units of the (spline not + * Plummer) softening length. */ +#define const_max_repositioning_distance_ratio 3.f + +#endif /* SWIFT_SPIN_JET_BLACK_HOLES_PARAMETERS_H */ diff --git a/src/black_holes/SPIN_JET/black_holes_part.h b/src/black_holes/SPIN_JET/black_holes_part.h new file mode 100644 index 0000000000000000000000000000000000000000..c97a8ea105f753a2544d689729a8e879cc23eb1f --- /dev/null +++ b/src/black_holes/SPIN_JET/black_holes_part.h @@ -0,0 +1,360 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Copyright (c) 2020 Matthieu Schaller (schaller@strw.leidenuniv.nl) + * Copyright (c) 2022 Filip Husko (filip.husko@durham.ac.uk) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + ******************************************************************************/ +#ifndef SWIFT_SPIN_JET_BLACK_HOLE_PART_H +#define SWIFT_SPIN_JET_BLACK_HOLE_PART_H + +/*! The total number of rays used in AGN feedback */ +#define spinjet_blackhole_number_of_rays 50 + +#include "black_holes_struct.h" +#include "chemistry_struct.h" +#include "particle_splitting_struct.h" +#include "rays_struct.h" +#include "timeline.h" + +/*! The possible accretion modes every black hole can take. */ +enum BH_accretion_modes { BH_thick_disc, BH_thin_disc, BH_slim_disc }; + +/** + * @brief Particle fields for the black hole particles. + * + * All quantities related to gravity are stored in the associate #gpart. + */ +struct bpart { + + /*! Particle ID. */ + long long id; + + /*! Pointer to corresponding gravity part. */ + struct gpart* gpart; + + /*! Particle position. */ + double x[3]; + + /* Offset between current position and position at last tree rebuild. */ + float x_diff[3]; + + /*! Particle velocity. */ + float v[3]; + + /*! Black hole mass */ + float mass; + + /*! Black hole mass at the start of each step, prior to any nibbling */ + float mass_at_start_of_step; + + /* Particle cutoff radius. */ + float h; + + /*! Particle time bin */ + timebin_t time_bin; + + struct { + + /* Number of neighbours. */ + float wcount; + + /* Number of neighbours spatial derivative. */ + float wcount_dh; + + } density; + + /*! Union for the formation time and formation scale factor */ + union { + + /*! Formation time */ + float formation_time; + + /*! Formation scale factor */ + float formation_scale_factor; + }; + + /*! Subgrid mass of the black hole */ + float subgrid_mass; + + /*! Total accreted mass of the black hole (not including mass merged in + * from other black holes) */ + float total_accreted_mass; + + /*! Energy reservoir for feedback */ + float energy_reservoir; + + /*! Instantaneous accretion rate */ + float accretion_rate; + + /*! Density of the gas surrounding the black hole. */ + float rho_gas; + + /*! Smoothed sound speed of the gas surrounding the black hole. */ + float sound_speed_gas; + + /*! Smoothed velocity of the gas surrounding the black hole, + * in the frame of the black hole (internal units) */ + float velocity_gas[3]; + + /*! Smoothed velocity dispersion (peculiar) of the gas around the + * black hole */ + float velocity_dispersion_gas; + + /*! Circular velocity of the gas around the black hole at the smoothing + * radius (calculated as j_gas / h_BH, where j is specific ang. mom.) */ + float circular_velocity_gas[3]; + + /*! Specific angular momentum of the gas around the black hole */ + float spec_angular_momentum_gas[3]; + + /*! Curl of the gas velocity around the black hole. */ + float curl_v_gas[3]; + + /*! Multiplicative factor for accretion rates, from Rosas-Guevara et al. + * (2015) angular momentum based accretion disc model */ + float f_visc; + + /*! Total mass of the gas neighbours. */ + float ngb_mass; + + /*! Integer number of neighbours */ + int num_ngbs; + + /*! Number of seeds in this BH (i.e. itself + the merged ones) */ + int cumulative_number_seeds; + + /*! Total number of BH merger events (i.e. not including all progenies) */ + int number_of_mergers; + + /*! Total number of gas particles swallowed (including particles swallowed + * by merged-in black holes) */ + int number_of_gas_swallows; + + /*! Total number of gas particles swallowed (excluding particles swallowed + * by merged-in black holes) */ + int number_of_direct_gas_swallows; + + /*! Total number of times the black hole has been repositioned (excluding + * repositionings of merged-in black holes) */ + int number_of_repositions; + + /*! Total number of times a black hole attempted repositioning (including + * cases where it was aborted because the black hole was already at a + * lower potential than all eligible neighbours) */ + int number_of_reposition_attempts; + + /*! Total number of time steps in which the black hole was active. */ + int number_of_time_steps; + + /*! Total (physical) angular momentum accumulated by swallowing particles */ + float swallowed_angular_momentum[3]; + + /*! Total (physical) angular momentum accumulated from subgrid accretion */ + float accreted_angular_momentum[3]; + + /*! Integer (cumulative) number of energy injections in AGN feedback. At a + * given time-step, an AGN-active BH may produce multiple energy injections. + * The number of energy injections is equal to or more than the number of + * particles heated by the BH during this time-step. */ + int AGN_number_of_energy_injections; + + /*! Integer (cumulative) number of AGN events. If a BH does feedback at a + * given time-step, the number of its AGN events is incremented by 1. Each + * AGN event may have multiple energy injections. */ + int AGN_number_of_AGN_events; + + /* Total energy injected into the gas in AGN feedback by this BH */ + float AGN_cumulative_energy; + + /*! Union for the last AGN event time and the last AGN event scale factor */ + union { + + /*! Last AGN event time */ + float last_AGN_event_time; + + /*! Last AGN event scale-factor */ + float last_AGN_event_scale_factor; + }; + + /*! BH accretion-limited time-step */ + float dt_heat; + + /*! Eddington fraction */ + float eddington_fraction; + + /*! BH dimensionless spin */ + float spin; + + /*! The normalized spin/angular momentum vector of the BH */ + float angular_momentum_direction[3]; + + /*! The jet efficiency */ + float jet_efficiency; + + /*! The radiative efficiency */ + float radiative_efficiency; + + /*! Cosine of the angle between the spin vector and the angular momentum + of the gas in the smoothing kernel */ + float accretion_disk_angle; + + /*! Aspect ratio of the subgrid accretion disk */ + float aspect_ratio; + + /*! Which type is the subgrid accretion disk (thick, thin or slim) */ + enum BH_accretion_modes accretion_mode; + + /*! The jet-limited time-step of the BH */ + float dt_jet; + + /*! The angular momentum evolution limited time-step of the BH */ + float dt_ang_mom; + + /*! The current jet kick velocity to be applied */ + float v_jet; + + /*! The energ in the jet reservoir */ + float jet_reservoir; + + /*! Total jet energy launched so far */ + float total_jet_energy; + + /*! Total number of jet kicks */ + int AGN_number_of_jet_injections; + + /*! Total number of jet kicking events */ + int AGN_number_of_AGN_jet_events; + + /*! Halo mass the black hole is assigned to */ + float group_mass; + + union { + + /*! Last time a jet event occurred */ + float last_AGN_jet_event_time; + + /*! Last scale factor a jet event occurred */ + float last_AGN_jet_event_scale_factor; + }; + + /*! Union for the last high Eddington ratio point in time */ + union { + + /*! Last time the BH had a a high Eddington fraction */ + float last_high_Eddington_fraction_time; + + /*! Last scale factor the BH had a a high Eddington fraction */ + float last_high_Eddington_fraction_scale_factor; + }; + + /*! Union for the last minor merger point in time */ + union { + + /*! Last time the BH had a a high Eddington fraction */ + float last_minor_merger_time; + + /*! Last scale factor the BH had a a high Eddington fraction */ + float last_minor_merger_scale_factor; + }; + + /*! Union for the last major merger point in time */ + union { + + /*! Last time the BH had a a high Eddington fraction */ + float last_major_merger_time; + + /*! Last scale factor the BH had a a high Eddington fraction */ + float last_major_merger_scale_factor; + }; + + /*! Properties used in the feedback loop to distribute to gas neighbours. */ + struct { + + /*! Energy per unit mass in a single AGN energy-injection event */ + float AGN_delta_u; + + /*! Number of energy injections per time-step */ + int AGN_number_of_energy_injections; + + /*! Number of energy injections per time-step */ + int AGN_number_of_jet_injections; + + /*! Change in energy from SNII feedback energy injection */ + float AGN_delta_u_jet; + + } to_distribute; + + struct { + + /*! Gravitational potential copied from the #gpart. */ + float potential; + + /*! Value of the minimum potential across all neighbours. */ + float min_potential; + + /*! Delta position to apply after the reposition procedure */ + double delta_x[3]; + + } reposition; + + /*! Splitting structure */ + struct particle_splitting_data split_data; + + /*! Chemistry information (e.g. metal content at birth, swallowed metal + * content, etc.) */ + struct chemistry_bpart_data chemistry_data; + + /*! Black holes merger information (e.g. merging ID) */ + struct black_holes_bpart_data merger_data; + + /*! Isotropic AGN feedback information */ + struct ray_data rays[spinjet_blackhole_number_of_rays]; + + /*! Jet AGN feedback information. This ray is used to kick particles along + the spin axis. */ + struct ray_data rays_jet[spinjet_blackhole_number_of_rays]; + + /*! Jet AGN feedback information. This ray is used to kick particles in the + oppposite direction from the spin axis. */ + struct ray_data rays_jet_pos[spinjet_blackhole_number_of_rays]; + +#ifdef SWIFT_DEBUG_CHECKS + + /* Time of the last drift */ + integertime_t ti_drift; + + /* Time of the last kick */ + integertime_t ti_kick; + +#endif + +#ifdef DEBUG_INTERACTIONS_BLACK_HOLES + /*! Number of interactions in the density SELF and PAIR */ + int num_ngb_density; + + /*! List of interacting particles in the density SELF and PAIR */ + long long ids_ngbs_density[MAX_NUM_OF_NEIGHBOURS_BLACK_HOLES]; + + /*! Number of interactions in the force SELF and PAIR */ + int num_ngb_force; + + /*! List of interacting particles in the force SELF and PAIR */ + long long ids_ngbs_force[MAX_NUM_OF_NEIGHBOURS_BLACK_HOLES]; +#endif + +} SWIFT_STRUCT_ALIGN; + +#endif /* SWIFT_SPIN_JET_BLACK_HOLE_PART_H */ diff --git a/src/black_holes/SPIN_JET/black_holes_properties.h b/src/black_holes/SPIN_JET/black_holes_properties.h new file mode 100644 index 0000000000000000000000000000000000000000..8efe455cc51b7121b1441fcd029373bbcbf16b1a --- /dev/null +++ b/src/black_holes/SPIN_JET/black_holes_properties.h @@ -0,0 +1,941 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Copyright (c) 2020 Matthieu Schaller (schaller@strw.leidenuniv.nl) + * Copyright (c) 2022 Filip Husko (filip.husko@durham.ac.uk) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + ******************************************************************************/ +#ifndef SWIFT_SPIN_JET_BLACK_HOLES_PROPERTIES_H +#define SWIFT_SPIN_JET_BLACK_HOLES_PROPERTIES_H + +#include "chemistry.h" +#include "hydro_properties.h" +#include "string.h" + +enum AGN_feedback_models { + AGN_isotropic_model, /*< Isotropic model of AGN feedback */ + AGN_minimum_distance_model /*< Minimum-distance model of AGN feedback */ +}; + +enum AGN_jet_feedback_models { + AGN_jet_minimum_distance_model, /*< Minimum-distance model of AGN feedback */ + AGN_jet_maximum_distance_model, /*< Maximum-distance model of AGN feedback */ + AGN_jet_spin_axis_model, /*< Kicking-along-spin + axis model of AGN feedback */ + AGN_jet_minimum_density_model /*< Minimum-density model of AGN feedback */ +}; + +enum AGN_jet_velocity_models { + AGN_jet_velocity_constant, /*< Use a constant jet velocity */ + AGN_jet_velocity_BH_mass, /*< Scale the jet velocity with BH mass */ + AGN_jet_velocity_halo_mass /*< Scale the jet velocity with halo mass + (NOT WORKING) */ +}; + +enum BH_merger_thresholds { + BH_mergers_circular_velocity, /*< v_circ at separation, as in EAGLE */ + BH_mergers_escape_velocity, /*< v_esc at separation */ + BH_mergers_dynamical_escape_velocity /*< combined v_esc_dyn at separation */ +}; + +enum thin_disc_regions { + TD_region_B, /*< Region B from Shakura & Sunyaev (1973) */ + TD_region_C /*< Region C from Shakura & Sunyaev (1973) */ +}; + +/** + * @brief Properties of black holes and AGN feedback in the EAGEL model. + */ +struct black_holes_props { + + /* ----- Basic neighbour search properties ------ */ + + /*! Resolution parameter */ + float eta_neighbours; + + /*! Target weightd number of neighbours (for info only)*/ + float target_neighbours; + + /*! Smoothing length tolerance */ + float h_tolerance; + + /*! Tolerance on neighbour number (for info only)*/ + float delta_neighbours; + + /*! Maximal number of iterations to converge h */ + int max_smoothing_iterations; + + /*! Maximal change of h over one time-step */ + float log_max_h_change; + + /* ----- Initialisation properties ------ */ + + /*! Mass of a BH seed at creation time */ + float subgrid_seed_mass; + + /*! Should we use the subgrid mass specified in ICs? */ + int use_subgrid_mass_from_ics; + + /*! Should we enforce positive subgrid masses initially? */ + int with_subgrid_mass_check; + + /* ----- Properties of the accretion model ------ */ + + /*! Calculate Bondi accretion rate based on subgrid properties? */ + int use_subgrid_gas_properties; + + /*! Calculate Bondi accretion rate for individual neighbours? */ + int use_multi_phase_bondi; + + /*! Switch between Bondi [0] or Krumholz [1] accretion rates */ + int use_krumholz; + + /*! In Krumholz mode, should we include the vorticity term? */ + int with_krumholz_vorticity; + + /*! Are we applying the angular-momentum-based multiplicative term from + * Rosas-Guevara et al. (2015)? */ + int with_angmom_limiter; + + /*! Normalisation of the viscuous angular momentum accretion reduction */ + float alpha_visc; + + /*! Maximal fraction of the Eddington rate allowed. */ + float f_Edd; + + /*! Eddington fraction threshold for recording */ + float f_Edd_recording; + + /*! Switch for the Booth, Schaye 2009 model */ + int with_boost_factor; + + /*! Lowest value of the boost of the Booth, Schaye 2009 model */ + float boost_alpha; + + /*! Power law slope for the boost of the Booth, Schaye 2009 model */ + float boost_beta; + + /*! Normalisation density (internal units) for the boost of the Booth, Schaye + * 2009 model */ + double boost_n_h_star; + + /*! Switch for nibbling mode */ + int use_nibbling; + + /*! Minimum gas particle mass in nibbling mode */ + float min_gas_mass_for_nibbling; + + /* ---- Properties of the feedback model ------- */ + + /*! AGN feedback model: isotropic or minimum distance */ + enum AGN_feedback_models feedback_model; + + /*! Is the AGN feedback model deterministic or stochastic? */ + int AGN_deterministic; + + /*! Feedback coupling efficiency of the black holes. */ + float epsilon_f; + + /*! Temperature increase induced by AGN feedback (Kelvin) */ + float AGN_delta_T_desired; + + /*! Number of gas neighbours to heat in a feedback event */ + float num_ngbs_to_heat; + + /* ---- Properties of the repositioning model --- */ + + /*! Maximal mass of BH to reposition */ + float max_reposition_mass; + + /*! Maximal distance to reposition, in units of softening length */ + float max_reposition_distance_ratio; + + /*! Switch to enable a relative velocity limit for particles to which the + * black holes can reposition */ + int with_reposition_velocity_threshold; + + /*! Maximal velocity offset of particles to which the black hole can + * reposition, in units of the ambient sound speed of the black hole */ + float max_reposition_velocity_ratio; + + /*! Minimum value of the velocity repositioning threshold */ + float min_reposition_velocity_threshold; + + /*! Switch to enable repositioning at fixed (maximum) speed */ + int set_reposition_speed; + + /*! Normalisation factor for repositioning velocity */ + float reposition_coefficient_upsilon; + + /*! Repositioning velocity scaling with black hole mass */ + float reposition_exponent_xi; + + /*! Correct potential of BH? */ + int correct_bh_potential_for_repositioning; + + /* ---- Properties of the merger model ---------- */ + + /*! Mass ratio above which a merger is considered 'minor' */ + float minor_merger_threshold; + + /*! Mass ratio above which a merger is considered 'major' */ + float major_merger_threshold; + + /*! Type of merger threshold */ + enum BH_merger_thresholds merger_threshold_type; + + /*! Maximal distance over which BHs merge, in units of softening length */ + float max_merging_distance_ratio; + + /* ---- Common conversion factors --------------- */ + + /*! Conversion factor from temperature to internal energy */ + float temp_to_u_factor; + + /* ---- Black hole time-step properties ---------- */ + + /*! -- Minimum allowed time-step of BH in internal units */ + float time_step_min; + + /* ---- Black hole accretion disk parameters ---------- */ + + /*! Viscous alpha of the accretion disk, and various factors and powers + involving it. Here alpha_factor_x refers to alpha raised to the power of + x, expressed as e.g. 0549 if x is 0.549 (these are the decimal + expressions for powers of alpha that appear in accretion disk theory). + alpha_factor_x_inv refers to the inverse of a similar number, or + equivalently alpha raised to the power of -x. alpha_factor_x_inv_10 is + alpha * 10 raised to the power of -x, a combination that also often + appears in the literature. */ + float alpha_acc; + float alpha_acc_2; + float alpha_acc_2_inv; + float alpha_factor_01; + float alpha_factor_02; + float alpha_factor_08; + float alpha_factor_08_inv; + float alpha_factor_08_inv_10; + float alpha_factor_0549; + float alpha_factor_06222; + + /*! Transition accretion rate between thick (ADAF) and thin disk. */ + float mdot_crit_ADAF; + + /*! Gas-to-total pressure ratio of the accretion disk */ + float beta_acc; + float beta_acc_inv; + + /*! Critical accretion rate that separates two different states in the + thick disk regime, related to radiation */ + float edd_crit_thick; + + /*! Effective adiabatic index of the accretion disk */ + float gamma_acc; + + /*! Epsilon parameter of the ADAF (thick disk), which appears in + Narayan & Yi (1994, 1995) model */ + float eps_ADAF; + + /*! Numerical coefficient relating sound speed in ADAF (thick disk) to the + Keplerian velocity, which appears in Narayan & Yi (1994, 1995) model */ + float cs_0_ADAF; + + /*! Numerical coefficient relating radial velocity in ADAF (thick disk) to + the Keplerian velocity, which appears in Narayan & Yi (1994, 1995) model */ + float v_0_ADAF; + + /*! Numerical coefficient relating angular velocity in ADAF (thick disk) to + the Keplerian angular velocity, which appears in Narayan & Yi + (1994, 1995) model */ + float omega_0_ADAF; + + /*! Aspect ratio of the ADAF (thick disk), which appears in Narayan & Yi + (1994, 1995) model */ + float h_0_ADAF; + float h_0_ADAF_2; + + /*! Electron heating parameter of the ADAF (thick disk), which appears in + Narayan & Yi (1994, 1995) model */ + float delta_ADAF; + + /*! The gamma parameter of the slim disk, which appears in the Wang & Zhou + (1999) model */ + float gamma_SD; + float gamma_SD_inv; + + /*! The ratio of vertical to horizontal kinematic viscosity of the thin disk. + Note that we use the definition xi = nu_2 / nu_1, whereas xi = + (nu_2 / nu_1) * 2 * alpha^2 is often used, e.g. Fiacconi et al. (2018) */ + float xi_TD; + + /*! Which region of the thin disc (Shakura & Sunyaev) we are assuming the + subgrid accretion disk is represented as: + B - region b; gas pressure dominates over radiation pressure, + electron scattering dominates the opacity + C - region c; gas pressure dominates over radiation pressure, + free-free absorption dominates the opacity */ + enum thin_disc_regions TD_region; + + /*! Parameter controlling when thin disk transitions into slim disk. This + occurs when the radiative efficiency of the slim disk falls below + TD_SD_eps_r_threshold times the radiative efficiency of the thin disk. */ + float TD_SD_eps_r_threshold; + + /* ---- Jet feedback - related parameters ---------- */ + + /*! Global switch for whether to include jets [1] or not [0]. */ + int include_jets; + + /*! Global switch for whether to turn off radiative feedback [1] or not [0]. + */ + int turn_off_radiative_feedback; + + /*! Global switch for whether to turn off radiation in the thick disk and + jets in the thin disk [1] or not [0] */ + int turn_off_secondary_feedback; + + /* Whether we want to include super-Eddington accretion, modeled as the slim + disk */ + int include_slim_disk; + + /* Whether to use GRMHD fits for the spindown rate due to jets */ + int include_GRMHD_spindown; + + /* Whether to include the expected suppression of the accretion rate due to + * ADIOS winds in the thick disk regime */ + int include_ADIOS_suppression; + + /* The inner radius in the accretion rate - R relation, if ADIOS suppression + * is included */ + float ADIOS_R_in; + + /* The slope of the accretion rate - R relation, if ADIOS suppression + * is included */ + float ADIOS_s; + + /*! Whether to fix the radiative efficiency to some value [1] or not [0]. */ + int fix_radiative_efficiency; + + /*! The radiative efficiency to use if fix_radiative_efficiency is 1. If + fix_radiative_efficiency is set to 0, this will still be used to + define the Eddington accretion rate. */ + float radiative_efficiency; + + /*! How many particles to aim to kick as part of jet feedback. */ + int N_jet; + + /*! The type of jet velocity scaling to use. */ + enum AGN_jet_velocity_models AGN_jet_velocity_model; + + /*! Jet velocity if use_var_v_jet is 0 */ + float v_jet; + + /*! Parameters of the scaling between AGN jet velocity and BH mass */ + float v_jet_BH_mass_scaling_reference_mass; + float v_jet_BH_mass_scaling_slope; + + /*! Sets the launching velocity of the jet to v_jet_cs_ratio times the + sound speed of the hot gas in the halo, assuming it is at virial + temperature. */ + float v_jet_cs_ratio; + + /*! The effective (half-)opening angle of the jet. */ + float opening_angle; + + /*! The slope of the dependence of jet efficiency on aspect ratio of the + subgrid accretion disk, H/R. Default value is 1, and another reasonable + value is 0 (same jet efficiency for all disks). */ + float jet_h_r_slope; + + /*! The coupling efficiency for jet feedback. */ + float eps_f_jet; + + /*! Whether to fix the jet efficiency to some value [1] or not [0]. If yes, + the jets will be pointed along the z-axis. */ + int fix_jet_efficiency; + + /*! The jet efficiency to use if fix_jet_efficiency is 1. */ + float jet_efficiency; + + /*! The jet launching scheme to use: minimum distance, + maximum distance, closest to spin axis or minimum density. */ + enum AGN_jet_feedback_models jet_feedback_model; +}; + +/** + * @brief Initialise the black hole properties from the parameter file. + * + * For the basic black holes neighbour finding properties we use the + * defaults from the hydro scheme if the users did not provide specific + * values. + * + * @param bp The #black_holes_props. + * @param phys_const The physical constants in the internal unit system. + * @param us The internal unit system. + * @param params The parsed parameters. + * @param hydro_props The already read-in properties of the hydro scheme. + * @param cosmo The cosmological model. + */ +INLINE static void black_holes_props_init(struct black_holes_props *bp, + const struct phys_const *phys_const, + const struct unit_system *us, + struct swift_params *params, + const struct hydro_props *hydro_props, + const struct cosmology *cosmo) { + + /* Read in the basic neighbour search properties or default to the hydro + ones if the user did not provide any different values */ + + /* Kernel properties */ + bp->eta_neighbours = parser_get_opt_param_float( + params, "BlackHoles:resolution_eta", hydro_props->eta_neighbours); + + /* Tolerance for the smoothing length Newton-Raphson scheme */ + bp->h_tolerance = parser_get_opt_param_float(params, "BlackHoles:h_tolerance", + hydro_props->h_tolerance); + + /* Get derived properties */ + bp->target_neighbours = pow_dimension(bp->eta_neighbours) * kernel_norm; + const float delta_eta = bp->eta_neighbours * (1.f + bp->h_tolerance); + bp->delta_neighbours = + (pow_dimension(delta_eta) - pow_dimension(bp->eta_neighbours)) * + kernel_norm; + + /* Number of iterations to converge h */ + bp->max_smoothing_iterations = + parser_get_opt_param_int(params, "BlackHoles:max_ghost_iterations", + hydro_props->max_smoothing_iterations); + + /* Time integration properties */ + const float max_volume_change = + parser_get_opt_param_float(params, "BlackHoles:max_volume_change", -1); + if (max_volume_change == -1) + bp->log_max_h_change = hydro_props->log_max_h_change; + else + bp->log_max_h_change = logf(powf(max_volume_change, hydro_dimension_inv)); + + /* Initialisation properties ---------------------------- */ + + bp->subgrid_seed_mass = + parser_get_param_float(params, "SPINJETAGN:subgrid_seed_mass_Msun"); + + /* Convert to internal units */ + bp->subgrid_seed_mass *= phys_const->const_solar_mass; + + bp->use_subgrid_mass_from_ics = parser_get_opt_param_int( + params, "SPINJETAGN:use_subgrid_mass_from_ics", 1); + if (bp->use_subgrid_mass_from_ics) + bp->with_subgrid_mass_check = parser_get_opt_param_int( + params, "SPINJETAGN:with_subgrid_mass_check", 1); + + /* Accretion parameters ---------------------------------- */ + + bp->use_subgrid_gas_properties = + parser_get_param_int(params, "SPINJETAGN:use_subgrid_gas_properties"); + bp->use_multi_phase_bondi = + parser_get_param_int(params, "SPINJETAGN:use_multi_phase_bondi"); + if (!bp->use_multi_phase_bondi) { + bp->use_krumholz = parser_get_param_int(params, "SPINJETAGN:use_krumholz"); + bp->with_krumholz_vorticity = + parser_get_param_int(params, "SPINJETAGN:with_krumholz_vorticity"); + } + + bp->with_angmom_limiter = + parser_get_param_int(params, "SPINJETAGN:with_angmom_limiter"); + if (bp->with_angmom_limiter) + bp->alpha_visc = parser_get_param_float(params, "SPINJETAGN:viscous_alpha"); + + bp->f_Edd = + parser_get_param_float(params, "SPINJETAGN:max_eddington_fraction"); + bp->f_Edd_recording = parser_get_param_float( + params, "SPINJETAGN:eddington_fraction_for_recording"); + + /* Booth Schaye (2009) Parameters */ + bp->with_boost_factor = + parser_get_param_int(params, "SPINJETAGN:with_boost_factor"); + + if (bp->with_boost_factor) { + bp->boost_alpha = parser_get_param_float(params, "SPINJETAGN:boost_alpha"); + + bp->boost_beta = parser_get_param_float(params, "SPINJETAGN:boost_beta"); + + /* Load the density in cgs and convert to internal units */ + bp->boost_n_h_star = + parser_get_param_float(params, "SPINJETAGN:boost_n_h_star_cm3") / + units_cgs_conversion_factor(us, UNIT_CONV_NUMBER_DENSITY); + } + + bp->use_nibbling = parser_get_param_int(params, "SPINJETAGN:use_nibbling"); + if (bp->use_nibbling) { + bp->min_gas_mass_for_nibbling = parser_get_param_float( + params, "SPINJETAGN:min_gas_mass_for_nibbling_Msun"); + bp->min_gas_mass_for_nibbling *= phys_const->const_solar_mass; + } + + if ((bp->min_gas_mass_for_nibbling < 1e-5 * bp->subgrid_seed_mass) || + (bp->min_gas_mass_for_nibbling > 1e5 * bp->subgrid_seed_mass)) { + error( + "The BH seeding mass and minimal gas mass for nibbling differ by more " + "than 10^5. That is probably indicating a typo in the parameter file."); + } + + /* Feedback parameters ---------------------------------- */ + + char temp[PARSER_MAX_LINE_SIZE]; + parser_get_param_string(params, "SPINJETAGN:AGN_feedback_model", temp); + if (strcmp(temp, "Isotropic") == 0) + bp->feedback_model = AGN_isotropic_model; + else if (strcmp(temp, "MinimumDistance") == 0) + bp->feedback_model = AGN_minimum_distance_model; + else + error( + "The AGN feedback model must be either MinimumDistance or Isotropic," + " not %s", + temp); + + bp->AGN_deterministic = parser_get_opt_param_int( + params, "SPINJETAGN:AGN_use_deterministic_feedback", 1); + bp->epsilon_f = + parser_get_param_float(params, "SPINJETAGN:coupling_efficiency"); + bp->AGN_delta_T_desired = + parser_get_param_float(params, "SPINJETAGN:AGN_delta_T_K"); + /* Check that it makes sense. */ + if (bp->AGN_delta_T_desired <= 0.f) + error("The AGN heating temperature delta T must be > 0 K, not %.5e K.", + bp->AGN_delta_T_desired); + + bp->AGN_delta_T_desired /= + units_cgs_conversion_factor(us, UNIT_CONV_TEMPERATURE); + + bp->num_ngbs_to_heat = + parser_get_param_float(params, "SPINJETAGN:AGN_num_ngb_to_heat"); + + /* Reposition parameters --------------------------------- */ + + bp->max_reposition_mass = + parser_get_param_float(params, "SPINJETAGN:max_reposition_mass_Msun"); + + /* Convert to internal units */ + bp->max_reposition_mass *= phys_const->const_solar_mass; + + bp->max_reposition_distance_ratio = parser_get_param_float( + params, "SPINJETAGN:max_reposition_distance_ratio"); + + bp->with_reposition_velocity_threshold = parser_get_param_int( + params, "SPINJETAGN:with_reposition_velocity_threshold"); + + if (bp->with_reposition_velocity_threshold) { + bp->max_reposition_velocity_ratio = parser_get_param_float( + params, "SPINJETAGN:max_reposition_velocity_ratio"); + + /* Prevent nonsensical input */ + if (bp->max_reposition_velocity_ratio <= 0) + error("max_reposition_velocity_ratio must be positive, not %f.", + bp->max_reposition_velocity_ratio); + + bp->min_reposition_velocity_threshold = parser_get_param_float( + params, "SPINJETAGN:min_reposition_velocity_threshold_km_p_s"); + /* Convert from km/s to internal units */ + bp->min_reposition_velocity_threshold *= + (1e5 / (us->UnitLength_in_cgs / us->UnitTime_in_cgs)); + } + + bp->set_reposition_speed = + parser_get_param_int(params, "SPINJETAGN:set_reposition_speed"); + + if (bp->set_reposition_speed) { + bp->reposition_coefficient_upsilon = parser_get_param_float( + params, "SPINJETAGN:reposition_coefficient_upsilon"); + + /* Prevent the user from making silly wishes */ + if (bp->reposition_coefficient_upsilon <= 0) + error( + "reposition_coefficient_upsilon must be positive, not %f " + "km/s/M_sun.", + bp->reposition_coefficient_upsilon); + + /* Convert from km/s to internal units */ + bp->reposition_coefficient_upsilon *= + (1e5 / (us->UnitLength_in_cgs / us->UnitTime_in_cgs)); + + bp->reposition_exponent_xi = parser_get_opt_param_float( + params, "SPINJETAGN:reposition_exponent_xi", 1.0); + } + + bp->correct_bh_potential_for_repositioning = + parser_get_param_int(params, "SPINJETAGN:with_potential_correction"); + + /* Merger parameters ------------------------------------- */ + + bp->minor_merger_threshold = + parser_get_param_float(params, "SPINJETAGN:threshold_minor_merger"); + + bp->major_merger_threshold = + parser_get_param_float(params, "SPINJETAGN:threshold_major_merger"); + + char temp2[PARSER_MAX_LINE_SIZE]; + parser_get_param_string(params, "SPINJETAGN:merger_threshold_type", temp2); + if (strcmp(temp2, "CircularVelocity") == 0) + bp->merger_threshold_type = BH_mergers_circular_velocity; + else if (strcmp(temp2, "EscapeVelocity") == 0) + bp->merger_threshold_type = BH_mergers_escape_velocity; + else if (strcmp(temp2, "DynamicalEscapeVelocity") == 0) + bp->merger_threshold_type = BH_mergers_dynamical_escape_velocity; + else + error( + "The BH merger model must be either CircularVelocity, EscapeVelocity, " + "or DynamicalEscapeVelocity, not %s", + temp2); + + bp->max_merging_distance_ratio = + parser_get_param_float(params, "SPINJETAGN:merger_max_distance_ratio"); + + /* Common conversion factors ----------------------------- */ + + /* Calculate temperature to internal energy conversion factor (all internal + * units) */ + const double k_B = phys_const->const_boltzmann_k; + const double m_p = phys_const->const_proton_mass; + const double mu = hydro_props->mu_ionised; + bp->temp_to_u_factor = k_B / (mu * hydro_gamma_minus_one * m_p); + + /* ---- Black hole time-step properties ------------------ */ + + const double yr_in_cgs = 365.25 * 24. * 3600.; + bp->time_step_min = + parser_get_param_float(params, "SPINJETAGN:minimum_timestep_yr") * + yr_in_cgs / units_cgs_conversion_factor(us, UNIT_CONV_TIME); + + /* ---- Black hole accretion disk physics ------------------ */ + + /* The viscosisty parameter of the subgrid accretion disks.*/ + bp->alpha_acc = parser_get_param_float(params, "SPINJETAGN:alpha_acc"); + + /* Various factors and powers of alpha, the subgrid accretion disc + viscosity, that appear in subgrid accretion disk equations. We + precompute them here. */ + bp->alpha_acc_2 = bp->alpha_acc * bp->alpha_acc; + bp->alpha_acc_2_inv = 1. / bp->alpha_acc_2; + bp->alpha_factor_01 = pow(bp->alpha_acc, 0.1); + bp->alpha_factor_02 = pow(bp->alpha_acc, 0.2); + bp->alpha_factor_08 = pow(bp->alpha_acc, 0.8); + bp->alpha_factor_08_inv = 1. / bp->alpha_factor_08; + bp->alpha_factor_08_inv_10 = pow(bp->alpha_acc * 10., -0.8); + bp->alpha_factor_0549 = pow(bp->alpha_acc, 0.549); + bp->alpha_factor_06222 = pow(bp->alpha_acc * 10., 0.6222); + + if ((bp->alpha_acc <= 0.) || (bp->alpha_acc > 1.)) { + error( + "The alpha viscosity parameter of accretion disks must be between 0. " + " and 1., not %f", + bp->alpha_acc); + } + + /* Calculate the critical transition accretion rate between the thick and + thin disk regimes. */ + float mdot_crit_LHAF = 0.2 * bp->alpha_acc_2; + float mdot_crit_thin = 0.07 * bp->alpha_acc; + bp->mdot_crit_ADAF = (mdot_crit_LHAF + mdot_crit_thin) * 0.5; + + /* Calculate the gas-to-total pressure ratio as based on simulations + (see Yuan & Narayan 2014) */ + bp->beta_acc = 1. / (1. + 2. * bp->alpha_acc); + bp->beta_acc_inv = 1. / bp->beta_acc; + + /* Calculate the critical accretion rate between two thick disk regimes as + in Mahadevan (1997). */ + bp->edd_crit_thick = 2. * bp->delta_ADAF * bp->alpha_acc_2 * + (1. - bp->beta_acc) * bp->beta_acc_inv; + + /* Calculate the adiabatic index based on how strong the magnetic fields are + (see Esin 1997) */ + bp->gamma_acc = (8. - 3. * bp->beta_acc) / (6. - 3. * bp->beta_acc); + + /* Calculate numerical factors of the ADAF (thick disk) as in + Narayan & Yi (1995) */ + bp->eps_ADAF = (1.6667 - bp->gamma_acc) / (bp->gamma_acc - 1.); + bp->cs_0_ADAF = sqrtf(2. / (5. + 2. * bp->eps_ADAF)); + bp->v_0_ADAF = 3. / (5. + 2. * bp->eps_ADAF); + bp->omega_0_ADAF = sqrtf(2. * bp->eps_ADAF / (5. + 2. * bp->eps_ADAF)); + + /* Instead of using the Narayan & Yi value, we set to 0.3 based on numerous + GRMHD simulations (see e.g. Narayan et al. 2021) */ + bp->h_0_ADAF = 0.3; + bp->h_0_ADAF_2 = 0.09; + + bp->delta_ADAF = parser_get_param_float(params, "SPINJETAGN:delta_ADAF"); + + if (bp->delta_ADAF <= 0.) { + error( + "The delta electron heating parameter of thick accretion disks " + " must be > 0. not %f", + bp->delta_ADAF); + } + + bp->gamma_SD = sqrtf(5.); + bp->gamma_SD_inv = 1. / bp->gamma_SD; + + /* Formula taken from Lodato et al. (2010) */ + bp->xi_TD = 2. * (1. + 7. * bp->alpha_acc_2) / (4. + bp->alpha_acc_2) / + bp->alpha_acc_2; + + char temp3[PARSER_MAX_LINE_SIZE]; + parser_get_param_string(params, "SPINJETAGN:TD_region", temp3); + if (strcmp(temp3, "B") == 0) + bp->TD_region = TD_region_B; + else if (strcmp(temp3, "C") == 0) + bp->TD_region = TD_region_C; + else + error("The choice of thin disc region must be B or C, not %s", temp3); + + /* ---- Jet feedback - related parameters ---------- */ + bp->include_jets = parser_get_param_int(params, "SPINJETAGN:include_jets"); + + if ((bp->include_jets != 0) && (bp->include_jets != 1)) { + error("The include_jets parameter must be either 0 or 1, not %d", + bp->include_jets); + } + + bp->turn_off_radiative_feedback = + parser_get_param_int(params, "SPINJETAGN:turn_off_radiative_feedback"); + + if ((bp->turn_off_radiative_feedback != 0) && + (bp->turn_off_radiative_feedback != 1)) { + error( + "The turn_off_radiative_feedback parameter must be either 0 or 1, " + " not %d", + bp->turn_off_radiative_feedback); + } + + if ((bp->turn_off_radiative_feedback) && (bp->include_jets == 0)) { + error( + "The turn_off_radiative_feedback parameter and include_jet parameters" + "cannot at the same time be 1 and 0, respectively. In other words, at" + "least one of the two feedback modes must be turned on."); + } + + bp->turn_off_secondary_feedback = + parser_get_param_int(params, "SPINJETAGN:turn_off_secondary_feedback"); + + if ((bp->turn_off_secondary_feedback != 0) && + (bp->turn_off_secondary_feedback != 1)) { + error( + "The turn_off_secondary_feedback parameter must be either 0 or 1, " + "not %d", + bp->turn_off_secondary_feedback); + } + + bp->include_slim_disk = + parser_get_param_int(params, "SPINJETAGN:include_slim_disk"); + + if ((bp->include_slim_disk != 0) && (bp->include_slim_disk != 1)) { + error( + "The include_slim_disk parameter must be either 0 or 1, " + "not %d", + bp->include_slim_disk); + } + + bp->include_GRMHD_spindown = + parser_get_param_int(params, "SPINJETAGN:include_GRMHD_spindown"); + + if ((bp->include_GRMHD_spindown != 0) && (bp->include_GRMHD_spindown != 1)) { + error( + "The include_GRMHD_spindown parameter must be either 0 or 1, " + "not %d", + bp->include_GRMHD_spindown); + } + + bp->include_ADIOS_suppression = + parser_get_param_int(params, "SPINJETAGN:include_ADIOS_suppression"); + + if ((bp->include_ADIOS_suppression != 0) && + (bp->include_ADIOS_suppression != 1)) { + error( + "The include_ADIOS_suppression parameter must be either 0 or 1, " + "not %d", + bp->include_ADIOS_suppression); + } + + bp->ADIOS_R_in = parser_get_param_float(params, "SPINJETAGN:ADIOS_R_in"); + + if (bp->ADIOS_R_in <= 1.) { + error( + "The ADIOS_R_in parameter must be > 1, " + "not %f", + bp->ADIOS_R_in); + } + + bp->ADIOS_s = parser_get_param_float(params, "SPINJETAGN:ADIOS_s"); + + if ((bp->ADIOS_s < 0.) || (bp->ADIOS_s > 1.)) { + error( + "The ADIOS_s parameter must be between 0 and 1, " + "not %f", + bp->ADIOS_s); + } + + bp->TD_SD_eps_r_threshold = + parser_get_param_float(params, "SPINJETAGN:TD_SD_eps_r_threshold"); + + if ((bp->TD_SD_eps_r_threshold <= 0.) || (bp->TD_SD_eps_r_threshold >= 1.)) { + error( + "The TD_SD_eps_r_threshold parameter governing the transition between" + "thin and slim disk must be between 0. and 1., not %f", + bp->TD_SD_eps_r_threshold); + } + + bp->N_jet = parser_get_param_float(params, "SPINJETAGN:N_jet"); + + if (bp->N_jet % 2 != 0) { + error("The N_jet parameter must be divisible by two, not %d", bp->N_jet); + } + + char temp4[PARSER_MAX_LINE_SIZE]; + parser_get_param_string(params, "SPINJETAGN:AGN_jet_velocity_model", temp4); + if (strcmp(temp4, "Constant") == 0) { + bp->AGN_jet_velocity_model = AGN_jet_velocity_constant; + + bp->v_jet = parser_get_param_float(params, "SPINJETAGN:v_jet_km_p_s"); + + /* Convert to internal units */ + bp->v_jet *= (1e5 / (us->UnitLength_in_cgs / us->UnitTime_in_cgs)); + + if (bp->v_jet <= 0.) + error("The v_jet parameter must be > 0., not %f", bp->v_jet); + + } else if (strcmp(temp4, "BlackHoleMass") == 0) { + bp->AGN_jet_velocity_model = AGN_jet_velocity_BH_mass; + + bp->v_jet_BH_mass_scaling_reference_mass = parser_get_param_float( + params, "SPINJETAGN:v_jet_BH_mass_scaling_reference_mass_Msun"); + bp->v_jet_BH_mass_scaling_reference_mass *= phys_const->const_solar_mass; + bp->v_jet_BH_mass_scaling_slope = parser_get_param_float( + params, "SPINJETAGN:v_jet_BH_mass_scaling_slope"); + + bp->v_jet_cs_ratio = + parser_get_param_float(params, "SPINJETAGN:v_jet_cs_ratio"); + + } else if (strcmp(temp4, "HaloMass") == 0) { + error( + "The scaling of jet velocities with halo mass is currently not " + "supported."); + } else { + error( + "The AGN jet velocity model must be Constant, BlackHoleMass or" + " HaloMass, not %s", + temp4); + } + + bp->opening_angle = + parser_get_param_float(params, "SPINJETAGN:opening_angle_in_degrees"); + bp->opening_angle = bp->opening_angle * M_PI / 180.; + + bp->jet_h_r_slope = + parser_get_param_float(params, "SPINJETAGN:jet_h_r_slope"); + + bp->eps_f_jet = parser_get_param_float(params, "SPINJETAGN:eps_f_jet"); + + if ((bp->eps_f_jet <= 0.) || (bp->eps_f_jet > 1.)) { + error( + "The eps_f_jet corresponding to the jet coupling efficiency " + "must be between 0. and 1., not %f", + bp->eps_f_jet); + } + + bp->fix_jet_efficiency = + parser_get_param_int(params, "SPINJETAGN:fix_jet_efficiency"); + + if ((bp->fix_jet_efficiency != 0) && (bp->fix_jet_efficiency != 1)) { + error( + "The fix_jet_efficiency parameter must be either 0 or 1, " + "not %d", + bp->fix_jet_efficiency); + } + + bp->jet_efficiency = + parser_get_param_float(params, "SPINJETAGN:jet_efficiency"); + + if (bp->jet_efficiency <= 0.) { + error( + "The jet_efficiency corresponding to the jet efficiency " + "must be larger than 0., not %f", + bp->jet_efficiency); + } + + bp->fix_radiative_efficiency = + parser_get_param_int(params, "SPINJETAGN:fix_radiative_efficiency"); + + if ((bp->fix_radiative_efficiency != 0) && + (bp->fix_radiative_efficiency != 1)) { + error( + "The fix_radiative_efficiency parameter must be either 0 or 1, " + "not %d", + bp->fix_radiative_efficiency); + } + + bp->radiative_efficiency = + parser_get_param_float(params, "SPINJETAGN:radiative_efficiency"); + + if ((bp->radiative_efficiency <= 0.) || (bp->radiative_efficiency > 1.)) { + error( + "The radiative_efficiency corresponding to the radiative efficiency " + "must be between 0. and 1., not %f", + bp->radiative_efficiency); + } + + char temp5[60]; + parser_get_param_string(params, "SPINJETAGN:AGN_jet_feedback_model", temp5); + if (strcmp(temp5, "MinimumDistance") == 0) + bp->jet_feedback_model = AGN_jet_minimum_distance_model; + else if (strcmp(temp5, "MaximumDistance") == 0) + bp->jet_feedback_model = AGN_jet_maximum_distance_model; + else if (strcmp(temp5, "SpinAxis") == 0) + bp->jet_feedback_model = AGN_jet_spin_axis_model; + else if (strcmp(temp5, "MinimumDensity") == 0) + bp->jet_feedback_model = AGN_jet_minimum_density_model; + else + error( + "The AGN feedback model must be MinimumDistance, MaximumDistance, " + "SpinAxis or MinimumDensity, not %s", + temp5); +} + +/** + * @brief Write a black_holes_props struct to the given FILE as a stream of + * bytes. + * + * @param props the black hole properties struct + * @param stream the file stream + */ +INLINE static void black_holes_struct_dump( + const struct black_holes_props *props, FILE *stream) { + restart_write_blocks((void *)props, sizeof(struct black_holes_props), 1, + stream, "black_holes props", "black holes props"); +} + +/** + * @brief Restore a black_holes_props struct from the given FILE as a stream of + * bytes. + * + * @param props the black hole properties struct + * @param stream the file stream + */ +INLINE static void black_holes_struct_restore( + const struct black_holes_props *props, FILE *stream) { + restart_read_blocks((void *)props, sizeof(struct black_holes_props), 1, + stream, NULL, "black holes props"); +} + +#endif /* SWIFT_SPIN_JET_BLACK_HOLES_PROPERTIES_H */ diff --git a/src/black_holes/SPIN_JET/black_holes_spin.h b/src/black_holes/SPIN_JET/black_holes_spin.h new file mode 100644 index 0000000000000000000000000000000000000000..81d8d8d914fcf95706a55ed56e5266df8aaf5711 --- /dev/null +++ b/src/black_holes/SPIN_JET/black_holes_spin.h @@ -0,0 +1,1045 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Copyright (c) 2022 Filip Husko (filip.husko@durham.ac.uk) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + ******************************************************************************/ + +#ifndef SWIFT_SPIN_JET_BLACK_HOLES_SPIN_H +#define SWIFT_SPIN_JET_BLACK_HOLES_SPIN_H + +/* Standard headers */ +#include <float.h> + +/* Local includes */ +#include "black_holes_properties.h" +#include "black_holes_struct.h" +#include "inline.h" +#include "physical_constants.h" + +/** + * @brief Compute the radius of the horizon of a BH particle in gravitational + * units. + * + * @param a Black hole spin, -1 < a < 1. + */ +__attribute__((always_inline)) INLINE static float r_hor(float a) { + return 1. + sqrtf((1. - a) * (1. + a)); +} + +/** + * @brief Compute the radius of the innermost stable circular orbit of a + * BH particle in gravitational units. + * + * The expression is given in Appendix B of Fiacconi et al. (2018) or eqn. 4 in + * Griffin et al. (2019). + * + * @param a Black hole spin, -1 < a < 1. + */ +__attribute__((always_inline)) INLINE static float r_isco(float a) { + const float Z1 = 1. + (cbrtf((1. + fabsf(a)) * (1. - a * a)) + + cbrtf((1. - fabsf(a)) * (1. - a * a))); + const float Z2 = sqrtf(3. * a * a + Z1 * Z1); + + const float R_ISCO = + 3. + Z2 - a / fabsf(a) * sqrtf((3. - Z1) * (3. + Z1 + 2. * Z2)); + +#ifdef SWIFT_DEBUG_CHECKS + if (Z1 > 3.) { + error( + "Something went wrong with calculation of Z1 factor for r_isco of" + " black holes. Z1 is %f instead of Z1 > 3.", + Z1); + } + + if ((3. + Z1 + 2. * Z2) < 0.) { + error( + "Something went wrong with calculation of (3. + Z1 + 2. * Z2 ) " + "factor for r_isco of black holes. (3. + Z1 + 2. * Z2 ) is %f instead " + "of" + " (3. + Z1 + 2. * Z2 ) > 0.", + 3. + Z1 + 2. * Z2); + } + + if (R_ISCO < 1.) { + error( + "Something went wrong with calculation of R_ISCO of black holes. " + "R_ISCO is %f instead >= 1.", + R_ISCO); + } +#endif + + return R_ISCO; +} + +/** + * @brief Compute the magnitude of the angular momentum of the black hole + * given its spin. + * + * @param a Black hole spin magnitude, 0 < a < 1. + * @param constants Physical constants (in internal units). + */ +__attribute__((always_inline)) INLINE static float j_BH( + struct bpart* bp, const struct phys_const* constants) { + + const float J_BH = + fabs(bp->subgrid_mass * bp->subgrid_mass * bp->spin * + constants->const_newton_G / constants->const_speed_light_c); + +#ifdef SWIFT_DEBUG_CHECKS + if (J_BH <= 0.) { + error( + "Something went wrong with calculation of j_BH of black holes. " + " J_BH is %f instead of J_BH > 0.", + J_BH); + } +#endif + + return J_BH; +} + +/** + * @brief Compute the gravitational radius of a black hole. + * + * @param a Black hole mass. + * @param constants Physical constants (in internal units). + */ +__attribute__((always_inline)) INLINE static float R_gravitational( + float mass, const struct phys_const* constants) { + + const float r_G = + mass * constants->const_newton_G / + (constants->const_speed_light_c * constants->const_speed_light_c); + +#ifdef SWIFT_DEBUG_CHECKS + if (r_G <= 0.) { + error( + "Something went wrong with calculation of R_G of black holes. " + " R_G is %f instead of R_G > 0.", + r_G); + } +#endif + + return r_G; +} + +/** + * @brief Compute the warp radius of a black hole particle. + * + * The result depends on bp->accretion_mode (thick disk, thin disk or + * slim disk). For the thick disk and slim disk, the radius is calculated + * from Lubow et al. (2002), eqn. 22 with x=1. The result will be different + * only due to different aspect ratios H/R=h_0. + * + * For the thin disk, the result depends on props->TD_region (B - region b from + * Shakura & Sunyaev 1973, C - region c from Shakura & Sunyaev 1973). The warp + * radii are taken as eqns. 11 from Griffin et al. (2019) and A8 from Fiacconi + * et al. (2018), respectively. + * + * For the thin disk we also have to include the possibility that the self- + * gravity radius is smaller than the warp radius. In this case r_warp=r_sg + * because the disk cannot be larger than the self-gravity radius, and the + * entire disk is warped. The sg radius is taken as eqns. 16 in Griffin et al. + * (2019) and A6 in Fiacconi et al. (2018), respectively. + * + * @param bp Pointer to the b-particle data. + * @param constants Physical constants (in internal units). + * @param props Properties of the black hole scheme. + */ +__attribute__((always_inline)) INLINE static float r_warp( + struct bpart* bp, const struct phys_const* constants, + const struct black_holes_props* props) { + + /* Define placeholder variable for the result */ + float Rw = -1.; + + /* Gravitational radius */ + const float R_G = R_gravitational(bp->subgrid_mass, constants); + + /* Start branching depending on which accretion mode the BH is in */ + if (bp->accretion_mode == BH_thick_disc) { + + /* Eqn. 22 from Lubow et al. (2002) with H/R=h_0_ADAF (thick disk) */ + const float base = 15.36 * fabsf(bp->spin) / props->h_0_ADAF_2; + Rw = R_G * powf(base, 0.4); + } else if (bp->accretion_mode == BH_slim_disc) { + + /* Eqn. 22 from Lubow et al. (2002) with H/R=1/gamma_SD (slim disk) */ + const float base = 15.36 * fabsf(bp->spin) * props->gamma_SD; + Rw = R_G * powf(base, 0.4); + } else if (bp->accretion_mode == BH_thin_disc) { + + /* Start branching depending on which region of the thin disk we wish to + base the model upon (TD_region=B: region b from Shakura & Sunyaev 1973, + or TD_region=C: region c) */ + if (props->TD_region == TD_region_B) { + + /* Calculate different factors in eqn. 11 (Griffin et al. 2019) for warp + radius of region b in Shakura & Sunyaev (1973) */ + float mass_factor = + powf(bp->subgrid_mass / (1e8 * constants->const_solar_mass), 0.2); + float edd_factor = powf(bp->eddington_fraction, 0.4); + + /* Gather the factors and finalize calculation */ + const float base = mass_factor * fabsf(bp->spin) / + (props->xi_TD * props->alpha_factor_08 * edd_factor); + const float rw = 3410. * 2. * R_G * powf(base, 0.625); + + /* Self-gravity radius in region b: eqn. 16 in Griffin et al. */ + mass_factor = + powf(bp->subgrid_mass / (1e8 * constants->const_solar_mass), -0.961); + edd_factor = powf(bp->eddington_fraction, -0.353); + + const float rs = 4790. * 2. * R_G * mass_factor * + props->alpha_factor_0549 * edd_factor; + + /* Take the minimum */ + Rw = min(rs, rw); + } + + if (props->TD_region == TD_region_C) { + + /* Calculate different factors in eqn. A8 (Fiacconi et al. 2018) */ + float mass_factor = + powf(bp->subgrid_mass / (1e6 * constants->const_solar_mass), 0.2); + float edd_factor = powf(bp->eddington_fraction, 0.3); + + /* Gather the factors and finalize calculation */ + const float base = mass_factor * fabsf(bp->spin) / + (props->xi_TD * props->alpha_factor_02 * edd_factor); + const float rw = 1553. * 2. * R_G * powf(base, 0.5714); + + /* Repeat the same for self-gravity radius - eqn. A6 in F2018 */ + mass_factor = + powf(bp->subgrid_mass / (1e6 * constants->const_solar_mass), -1.1556); + edd_factor = powf(bp->eddington_fraction, -0.48889); + + const float rs = 1.2 * 100000. * 2. * R_G * mass_factor * + props->alpha_factor_06222 * edd_factor; + + /* Take the minimum */ + Rw = min(rs, rw); + } + } + +#ifdef SWIFT_DEBUG_CHECKS + if (Rw < 0.) { + error( + "Something went wrong with calculation of Rw of black holes. " + " Rw is %f instead of Rw >= 0.", + Rw); + } +#endif + + return Rw; +} + +/** + * @brief Compute the warp mass of a black hole particle. + * + * Calculated as the integral of the surface density of the disk up to R_warp. + * The result again depends on type of accretion mode, both due to different + * R_warp and different surface densities. + * + * The surface densities for the thick and slim disk take the same form + * (eqn. 2.3 in Narayan & Yi 1995 for rho, and then sigma = rho * 2H = + * dot(M_BH) / (2pi * R * abs(v_r))). They differ due to different radial + * radial velocities in the disks: v_r = -alpha * v_0 * v_K (with v_K + * the Keplerian velocity). These differences are encoded in the numerical + * constant v_0, which depends on alpha in Narayan & Yi for the thick disk, + * and is roughly constant for the slim disk (Wang & Zhou 1999). + * + * For the thin disk the surface densities are more complex, and again depend + * on which region of the disk is chosen to be modelled (region b or c from + * Shakura & Sunyaev 1973). Sigma for region b is given by eqn. 7 in Griffin + * et al. (2019) and for region c, it is not given explicitly but can be + * calculated based on Appendix A in Fiacconi et al. (2018). + * + * @param bp Pointer to the b-particle data. + * @param constants Physical constants (in internal units). + * @param props Properties of the black hole scheme. + */ +__attribute__((always_inline)) INLINE static float m_warp( + struct bpart* bp, const struct phys_const* constants, + const struct black_holes_props* props) { + + /* Define placeholder variable for the result */ + float Mw = -1.; + + /* Gravitational radius */ + const float R_G = R_gravitational(bp->subgrid_mass, constants); + + /* Start branching depending on which accretion mode the BH is in */ + if ((bp->accretion_mode == BH_thick_disc) || + (bp->accretion_mode == BH_slim_disc)) { + + /* Define v_0, the only factor which differs between thick and slim + disc */ + float v_0; + if (bp->accretion_mode == BH_thick_disc) { + v_0 = props->v_0_ADAF; + } else { + v_0 = props->gamma_SD_inv; + } + + /* Final result based on eqn. 2.3 in Narayan & Yi 1995*/ + Mw = 2. * bp->accretion_rate / + (3. * props->alpha_acc * v_0 * + sqrtf(bp->subgrid_mass * constants->const_newton_G)) * + powf(r_warp(bp, constants, props), 1.5); + } else { + + /* Start branching depending on which region of the thin disk we wish to + base the model upon (TD_region=B: region b from Shakura & Sunyaev 1973, + or TD_region=C: region c) */ + if (props->TD_region == TD_region_B) { + + /* Calculate different factors that appear in result for M_warp */ + const float mass_factor = + powf(bp->subgrid_mass / (1e8 * constants->const_solar_mass), 2.2); + const float edd_factor = powf(bp->eddington_fraction, 0.6); + const float R_factor = + powf(r_warp(bp, constants, props) / (2. * R_G), 1.4); + + /* Gather factors and finalize calculation */ + Mw = constants->const_solar_mass * 1.35 * mass_factor * + props->alpha_factor_08_inv * edd_factor * R_factor; + } + if (props->TD_region == TD_region_C) { + + /* Same as above but for region c of disk */ + const float mass_factor = + powf(bp->subgrid_mass / (1e6 * constants->const_solar_mass), 2.2); + const float edd_factor = powf(bp->eddington_fraction, 0.7); + const float R_factor = + powf(r_warp(bp, constants, props) / (2. * R_G), 1.25); + + Mw = constants->const_solar_mass * 0.01 * mass_factor * + props->alpha_factor_08_inv_10 * edd_factor * R_factor; + } + } + +#ifdef SWIFT_DEBUG_CHECKS + if (Mw < 0.) { + error( + "Something went wrong with calculation of Mw of black holes. " + " Mw is %f instead of Mw >= 0.", + Mw); + } +#endif + + return Mw; +} + +/** + * @brief Compute the warp angular momentum of a black hole particle. + * + * Calculated as the integral of the surface density times the specific + * angular momentum of the disk up to R_warp. The result depends on type + * of accretion mode, due to different R_warp, surface densities and spec. + * ang. momenta of the disks. + * + * The surface densities are the same as for M_warp. For the thin disk, the + * spec. ang. mom. is L(R) = R * v_K(R), because orbits are perfectly circular. + * For the thick and slim disk, this is replaced by L(R) = Omega_0 * R * v_K(R) + * , with Omega_0 a numerical constant between 0 and 1 which encodes the fact + * that rotation is slower in the two disks. The values for Omega_0 are given + * in Narayan & Yi (1995) and Wang & Zhou (1999) for the thick and slim disk, + * respectively. + * + * @param bp Pointer to the b-particle data. + * @param constants Physical constants (in internal units). + * @param props Properties of the black hole scheme. + */ +__attribute__((always_inline)) INLINE static float j_warp( + struct bpart* bp, const struct phys_const* constants, + const struct black_holes_props* props) { + + /* Define placeholder variable for the result */ + float Jw = -1.; + + /* Start branching depending on which accretion mode the BH is in */ + if ((bp->accretion_mode == BH_thick_disc) || + (bp->accretion_mode == BH_slim_disc)) { + + /* Get numerical constants for radial and tangential velocities for the + thick and slim disk, which factor into the surface density and spec. + ang. mom., respectively */ + float v_0 = 0.; + float omega_0 = 0.; + if (bp->accretion_mode == BH_thick_disc) { + v_0 = props->v_0_ADAF; + omega_0 = props->omega_0_ADAF; + } else { + v_0 = props->gamma_SD_inv; + omega_0 = props->gamma_SD_inv; + } + + /* Gather factors for the final result */ + Jw = 2. * bp->accretion_rate * omega_0 / (2. * props->alpha_acc * v_0) * + r_warp(bp, constants, props) * r_warp(bp, constants, props); + } else { + + /* Start branching depending on which region of the thin disk we wish to + base the model upon (TD_region=B: region b from Shakura & Sunyaev 1973, + or TD_region=C: region c). The warp radius can generally be related to + the warp mass and radius, if one assumes Keplerian rotation, with the + following relation: J_warp = (c+2)/(c+5/2) * M_warp * sqrt(M_BH * G * + R_warp), where c is the slope of the surface density profile: sigma~R^c. + For region b, c=-3/5 (see Griffin et al. 2019), and for region c, c=-3/4 + (see Fiacconi et al. 2018). */ + if (props->TD_region == TD_region_B) { + Jw = 0.737 * m_warp(bp, constants, props) * + sqrtf(bp->subgrid_mass * constants->const_newton_G * + r_warp(bp, constants, props)); + } + if (props->TD_region == TD_region_C) { + Jw = 0.714 * m_warp(bp, constants, props) * + sqrtf(bp->subgrid_mass * constants->const_newton_G * + r_warp(bp, constants, props)); + } + } + +#ifdef SWIFT_DEBUG_CHECKS + if (Jw < 0.) { + error( + "Something went wrong with calculation of Jw of black holes. " + " Jw is %f instead of Jw >= 0.", + Jw); + } +#endif + + return Jw; +} + +/** + * @brief Compute the spin-dependant radiative efficiency of a BH particle in + * the radiatively efficient (thin disc) regime. + * + * This is eqn. 3 in Griffin et al. (2019), based on Novikov & Thorne (1973). + * + * @param a Black hole spin, -1 < a < 1. + */ +__attribute__((always_inline)) INLINE static float eps_NT(float a) { + +#ifdef SWIFT_DEBUG_CHECKS + if (r_isco(a) <= 0.6667) { + error( + "Something went wrong with calculation of eps_NT of black holes. " + " r_isco is %f instead of r_isco > 1.", + r_isco(a)); + } +#endif + + return 1. - sqrtf(1. - 2. / 3. / r_isco(a)); +} + +/** + * @brief Compute the spin- and accretion rate-dependant radiative efficiency + * of a BH particle in the super-Eddington (slim disk) regime. + * + * This is eqn. 3 in Madau et al. (2014), which is based on numerical GR + * results by Sadowski (2009). + * + * @param a Black hole spin, -1 < a < 1. + * @param m_dot Accretion rate normalized to the Eddington rate. + */ +__attribute__((always_inline)) INLINE static float eps_SD(float a, float mdot) { + const float B = powf(4.627 - 4.445 * a, -0.5524); + const float C = powf(827.3 - 718.1 * a, -0.706); + const float A = powf(0.9663 - 0.9292 * a, -0.5693); + +#ifdef SWIFT_DEBUG_CHECKS + if (mdot <= 0.) { + error( + "The calculation of eps_SD was called even though mdot is %f. " + " This function should not have been called if the accretion rate is " + " not > 0.", + mdot); + } +#endif + + return 0.1 / mdot * (0.985 / (B + 1.6 / mdot) + 0.015 / (C + 1.6 / mdot)) * A; +} + +/** + * @brief Decide which regime (mode) of accretion the BH particle is in. + * + * The possible modes are the thick disk, thin disk and slim disk, in + * order of increasing accretion rate. The transition from thick to thin disk + * is at 0.4*alpha^2, based on current theory (Yuan & Narayan 2014). The + * transition from thin to slim disk occurs when the slim disk efficiency + * becomes sufficiently weak compared to the thin disk one. We parametrize + * this transition as occuring at eps_SD = props->TD_SD_eps_r_threshold * + * eps_TD, with props->TD_SD_eps_r_threshold < 1 of order 0.5 + * + * @param bp Pointer to the b-particle data. + * @param constants Physical constants (in internal units). + * @param props Properties of the black hole scheme. + */ +__attribute__((always_inline)) INLINE static void decide_mode( + struct bpart* bp, const struct black_holes_props* props) { + if (bp->eddington_fraction < props->mdot_crit_ADAF) { + bp->accretion_mode = BH_thick_disc; + } else { + if ((eps_SD(bp->spin, bp->eddington_fraction) < + props->TD_SD_eps_r_threshold * eps_NT(bp->spin)) && + (props->include_slim_disk)) { + bp->accretion_mode = BH_slim_disc; + } else { + bp->accretion_mode = BH_thin_disc; + } + } + + /* If we do not include radiative feedback, then we force the disk to be in + the thick disk mode */ + if (props->turn_off_radiative_feedback) { + bp->accretion_mode = BH_thick_disc; + } + + /* similar for if we do not include jets - we force the disk to be thin */ + if (props->include_jets == 0) { + bp->accretion_mode = BH_thin_disc; + } +} + +/** + * @brief Compute the aspect ratio of the subgrid accretion disk. + * + * The result depends on bp->accretion_mode (thick disk, thin disk or + * slim disk). For the thick disk and slim disk, the aspect ratio is + * a constant, H/R = h_0. + * + * For the thin disk, the result depends on props->TD_region (B - region b from + * Shakura & Sunyaev 1973, C - region c from Shakura & Sunyaev 1973). In region + * b, we take H/R as eqn. 8 in Griffin et al. (2019), and in region c H/r is + * taken directly as eqn. 2.19 from Shakura & Sunyaev (1973). + * + * @param bp Pointer to the b-particle data. + * @param constants Physical constants (in internal units). + * @param props Properties of the black hole scheme. + */ +__attribute__((always_inline)) INLINE static float aspect_ratio( + struct bpart* bp, const struct phys_const* constants, + const struct black_holes_props* props) { + + /* Define placeholder variable for the result */ + float h_0 = -1.; + + /* Start branching depending on which accretion mode the BH is in */ + if ((bp->accretion_mode == BH_thick_disc) || + (bp->accretion_mode == BH_slim_disc)) { + if (bp->accretion_mode == BH_thick_disc) { + h_0 = props->h_0_ADAF; + } else { + h_0 = 0.5 * props->gamma_SD_inv; + } + } else { + + /* Start branching depending on which region of the thin disk we wish to + base the model upon (TD_region=B: region b from Shakura & Sunyaev 1973, + or TD_region=C: region c). */ + if (props->TD_region == TD_region_B) { + + /* Compute factors for eqn. 8 in Griffin et al. (2019). */ + const float mass_factor = + powf(bp->subgrid_mass / (1e8 * constants->const_solar_mass), -0.1); + const float edd_factor = powf(bp->eddington_fraction, 0.2); + const float R_G = R_gravitational(bp->subgrid_mass, constants); + const float R_factor = + powf(r_warp(bp, constants, props) / (2. * R_G), 0.05); + + /* Gather factors and finalize calculation. */ + h_0 = 1.25 * 0.001 * mass_factor * props->alpha_factor_01 * edd_factor * + R_factor; + } + if (props->TD_region == TD_region_C) { + + /* Compute factors for eqn. 2.19 in Shakura & Sunyaev (1973). */ + const float mass_factor = + powf(bp->subgrid_mass / (1e8 * constants->const_solar_mass), -0.1); + const float edd_factor = powf(bp->eddington_fraction, 0.15); + const float R_G = R_gravitational(bp->subgrid_mass, constants); + const float R_factor = + powf(r_warp(bp, constants, props) / (2. * R_G), 0.125); + + /* Gather factors and finalize calculation. */ + h_0 = 1.15 * 0.001 * mass_factor * props->alpha_factor_01 * edd_factor * + R_factor; + } + } + +#ifdef SWIFT_DEBUG_CHECKS + if (h_0 <= 0.) { + error( + "Something went wrong with calculation of h_0 of black holes. " + " h_0 is %f instead of h_0 > 0.", + h_0); + } +#endif + + return h_0; +} + +/** + * @brief Compute the jet efficiency of a BH particle. + * + * The result depends on bp->accretion_mode (thick disk, thin disk or + * slim disk), through the varying H/R aspect ratios. + * + * The equation implemented is eqn. 9 from Tchekhovskoy et al. (2010), with the + * dimensionless magnetic flux phi taken as eqn. 9 from Narayan et al. (2021). + * + * The dependence on the aspect ratio comes from results in Tchekhovskoy et al. + * (2014) and the dependence in classical Blandford & Znajek (1979) jet theory. + * + * @param bp Pointer to the b-particle data. + * @param constants Physical constants (in internal units). + * @param props Properties of the black hole scheme. + */ +__attribute__((always_inline)) INLINE static float jet_efficiency( + struct bpart* bp, const struct black_holes_props* props) { + + float jet_eff = -1.; + if (props->fix_jet_efficiency) { + jet_eff = props->jet_efficiency; + } else { + const float kappa = 0.05; + const float horizon_ang_vel = + bp->spin / (2. * (1. + sqrtf(1. - bp->spin * bp->spin))); + const float phi = -20.2 * bp->spin * bp->spin * bp->spin - + 14.9 * bp->spin * bp->spin + 34. * bp->spin + 52.6; + jet_eff = kappa * 0.25 * M_1_PI * phi * phi * + powf(bp->aspect_ratio * 3.333, props->jet_h_r_slope) * + horizon_ang_vel * horizon_ang_vel * + (1. + 1.38 * horizon_ang_vel * horizon_ang_vel - + 9.2 * horizon_ang_vel * horizon_ang_vel * horizon_ang_vel * + horizon_ang_vel); + } + + /* Turn off jet feedback if we want to do that */ + if (props->include_jets == 0) { + jet_eff = 0.; + } + + /* Turn off jets in thin disk mode if we want to do that */ + if ((props->turn_off_secondary_feedback) && + (bp->accretion_mode == BH_thin_disc)) { + jet_eff = 0.; + } + +#ifdef SWIFT_DEBUG_CHECKS + if (jet_eff < 0.) { + error( + "Something went wrong with calculation of jet efficiency of black " + "holes. jet_eff is %f instead of jet_eff >= 0.", + jet_eff); + } +#endif + + return jet_eff; +} + +/** + * @brief Compute the radiative efficiency of a BH particle. + * + * The result depends on bp->accretion_mode (thick disk, thin disk or + * slim disk), since all modes have different radiative physics. + * + * For the thin disk, we assume the Novikov-Thorne (1973) radiative efficiency + * based on general relativity. For the slim disk, we take the fit from Madau + * et al. (2014), which is based on numerical GR results by Sadowski (2009). + * For the thick disk, we assume radiative efficiencies from Mahadevan et al. + * (1997). + * + * @param bp Pointer to the b-particle data. + * @param constants Physical constants (in internal units). + * @param props Properties of the black hole scheme. + */ +__attribute__((always_inline)) INLINE static float rad_efficiency( + struct bpart* bp, const struct black_holes_props* props) { + + /* Calculate Novikov-Thorne efficiency, which will be needed twice. */ + const float eps_TD = eps_NT(bp->spin); + + /* Define placeholder variable for the result */ + float rad_eff = -1; + + if (props->fix_radiative_efficiency) { + rad_eff = props->radiative_efficiency; + } else { + + /* Start branching depending on which accretion mode the BH is in */ + if (bp->accretion_mode == BH_thin_disc) { + + /* Assign Novikov-Thorne efficiency to the thin disk. */ + rad_eff = eps_TD; + } else if (bp->accretion_mode == BH_slim_disc) { + + /* Assign Madau 2014 efficiency to the slim disk. */ + rad_eff = eps_SD(bp->spin, bp->eddington_fraction); + } else { + +#ifdef SWIFT_DEBUG_CHECKS + if (props->beta_acc > 1.) { + error( + "Something went wrong with calculation of radiative efficiency of " + " black holes. beta_acc is %f instead of beta_acc < 1.", + props->beta_acc); + } +#endif + + /* Assign Mahadevan 1997 efficiency to the thick disk. */ + if (bp->eddington_fraction < props->edd_crit_thick) { + rad_eff = 4.8 * eps_TD / r_isco(bp->spin) * (1. - props->beta_acc) * + props->delta_ADAF; + } else { + rad_eff = 2.4 * eps_TD / r_isco(bp->spin) * props->beta_acc * + bp->eddington_fraction * props->alpha_acc_2_inv; + } + } + } + + /* Turn off radiative feedback if we want to do that */ + if (props->turn_off_radiative_feedback) { + rad_eff = 0.; + } + + /* Turn off radiation in the thick disk mode if we want to do that */ + if ((props->turn_off_secondary_feedback) && + (bp->accretion_mode == BH_thick_disc)) { + rad_eff = 0.; + } + +#ifdef SWIFT_DEBUG_CHECKS + if (rad_eff < 0.) { + error( + "Something went wrong with calculation of radiative efficiency of " + " black holes. rad_eff is %f instead of rad_eff >= 0.", + rad_eff); + } +#endif + + return rad_eff; +} + +/** + * @brief Compute the spec. ang. mom. at the inner radius of a BH particle. + * + * The result depends on bp->accretion_mode (thick disk, thin disk or + * slim disk), since advection-dominated modes (thick and slim disk) + * have more radial orbits. + * + * For the thin disk, we assume that the spec. ang. mom. consumed matches that + * of the innermost stable circular orbit (ISCO). For the other two modes, we + * assume that the accreted ang. mom. at the event horizon is 45 per cent of + * that at the ISCO, based on the fit from Benson & Babul (2009). + * + * @param bp Pointer to the b-particle data. + * @param constants Physical constants (in internal units). + * @param props Properties of the black hole scheme. + */ +__attribute__((always_inline)) INLINE static float l_acc( + struct bpart* bp, const struct phys_const* constants, + const struct black_holes_props* props) { + + /* Define placeholder variable for the result */ + float L = -1.; + +#ifdef SWIFT_DEBUG_CHECKS + if (r_isco(bp->spin) <= 0.6667) { + error( + "Something went wrong with calculation of l_acc of black holes. " + " r_isco is %f instead of r_isco > 1.", + r_isco(bp->spin)); + } +#endif + + /* Spec. ang. mom. at ISCO */ + const float L_ISCO = 0.385 * (1. + 2. * sqrtf(3. * r_isco(bp->spin) - 2.)); + + /* Branch depending on which accretion mode the BH is in */ + if ((bp->accretion_mode == BH_thick_disc) || + (bp->accretion_mode == BH_slim_disc)) { + L = 0.45 * L_ISCO; + } else { + L = L_ISCO; + } + +#ifdef SWIFT_DEBUG_CHECKS + if (L <= 0.) { + error( + "Something went wrong with calculation of l_acc of black holes. " + " l_acc is %f instead of l_acc > 0.", + L); + } +#endif + + return L; +} + +/** + * @brief Compute the evolution of the spin of a BH particle. + * + * The result depends on bp->accretion_mode (thick disk, thin disk or + * slim disk), due to differing spec. ang. momenta as well as jet and + * radiative efficiencies. + * + * This equation corresponds to eqn. 2 in Benson & Babul (2009), including + * a jet spindown term. + * + * @param bp Pointer to the b-particle data. + * @param constants Physical constants (in internal units). + * @param props Properties of the black hole scheme. + */ +__attribute__((always_inline)) INLINE static float da_dln_mbh_0( + struct bpart* bp, const struct phys_const* constants, + const struct black_holes_props* props) { + const float a = bp->spin; + + if ((a == 0.) || (a < -0.998) || (a > 0.998)) { + error( + "The da_dln_mbh_0 function was called and spin is %f. Spin should " + " not be a = 0, a < -0.998 or a > 0.998.", + a); + } + + float spinup_rate = 0.; + + if (props->include_GRMHD_spindown) { + if (bp->accretion_mode == BH_thin_disc) { + spinup_rate = l_acc(bp, constants, props) - + 2. * a * (1. - rad_efficiency(bp, props)); + } else { + spinup_rate = 0.45 - 12.53 * a - 7.8 * a * a + 9.44 * a * a * a + + 5.71 * a * a * a * a - 4.03 * a * a * a * a * a; + } + } else { + spinup_rate = + l_acc(bp, constants, props) - + 2. * a * (1. - rad_efficiency(bp, props)) - + sqrtf(1. - a * a) / a * + (a * a + (1. + sqrtf(1. - a * a)) * (1. + sqrtf(1. - a * a))) * + jet_efficiency(bp, props); + } + + return spinup_rate; +} + +/** + * @brief Compute the jet kick velocity to be used for jet feedback. + * + * @param bp The #bpart doing feedback. + * @param props Properties of the BH scheme. + * @param cosmo The current cosmological model. + * @param constants The physical constants (in internal units). + */ +__attribute__((always_inline)) INLINE static float black_hole_feedback_dv_jet( + const struct bpart* bp, const struct black_holes_props* props, + const struct cosmology* cosmo, const struct phys_const* constants) { + + float v_jet = -1.; + if (props->AGN_jet_velocity_model == AGN_jet_velocity_BH_mass) { + /* Compute the virial overdensity factor (Delta_c). */ + const float omega_matter = cosmo->Omega_b + cosmo->Omega_cdm; + const float x = omega_matter * cosmo->a3_inv / + (cosmo->Omega_lambda + omega_matter * cosmo->a3_inv) - + 1.; + const float overdensity = 18. * M_PI * M_PI + 82. * x - 39. * x * x; + + /* Assign the halo mass according to an empirical relation given in the + parameter file */ + const float halo_mass = + powf(bp->subgrid_mass / props->v_jet_BH_mass_scaling_reference_mass, + props->v_jet_BH_mass_scaling_slope); + + /* Get the mean density at this redshift */ + const float mean_density = cosmo->mean_density; + + /* Gather the previous factors and compute the virial radius, virial + velocity and finally the sound speed in the hot gas */ + const float virial_radius = + cbrtf(3. * halo_mass / (4. * M_PI * overdensity * mean_density)); + const float virial_velocity = + sqrtf(bp->group_mass * constants->const_newton_G / virial_radius); + const float sound_speed = sqrtf(5. / 3. * 0.5) * virial_velocity; + + /* Return the jet velocity as some factor times the sound speed */ + v_jet = props->v_jet_cs_ratio * sound_speed; + } else if (props->AGN_jet_velocity_model == AGN_jet_velocity_constant) { + v_jet = props->v_jet; + } else { + error( + "The scaling of jet velocities with halo mass is currently not " + "supported."); + } + + if (v_jet <= 0.) { + error( + "The black_hole_feedback_dv_jet returned a value less than 0. which " + " is v_jet = %f.", + v_jet); + } + + return v_jet; +} + +/** + * @brief Compute the resultant spin of a black hole merger. + * + * This implements the fitting formula from Rezzolla et al. (2008). + * The effects of gravitational waves are ignored. + * + * @param bp Pointer to the b-particle data. + * @param constants Physical constants (in internal units). + * @param props Properties of the black hole scheme. + */ +__attribute__((always_inline)) INLINE static void merger_spin_evolve( + struct bpart* bpi, const struct bpart* bpj, + const struct phys_const* constants) { + + if ((bpj->subgrid_mass <= 0.) || (bpi->subgrid_mass <= 0.)) { + error( + "Something went wrong with calculation of spin of a black hole " + " merger remnant. The black hole masses are %f and %f, instead of > " + "0.", + bpj->subgrid_mass, bpi->subgrid_mass); + } + + const float m1 = bpi->subgrid_mass; + const float m2 = bpj->subgrid_mass; + const float mass_ratio = m2 / m1; + const float sym_mass_ratio = + mass_ratio / ((mass_ratio + 1.) * (mass_ratio + 1.)); + const float reduced_mass = m1 * m2 / (m1 + m2); + + const float spin1 = fabsf(bpi->spin); + const float spin2 = fabsf(bpj->spin); + + if ((spin1 == 0.) || (spin2 == 0.)) { + error( + "Something went wrong with calculation of spin of a black hole " + " merger remnant. The black hole spins are %f and %f, instead of > 0.", + spin1, spin2); + } + + const float spin_vec1[3] = {spin1 * bpi->angular_momentum_direction[0], + spin1 * bpi->angular_momentum_direction[1], + spin1 * bpi->angular_momentum_direction[2]}; + const float spin_vec2[3] = {spin2 * bpj->angular_momentum_direction[0], + spin2 * bpj->angular_momentum_direction[1], + spin2 * bpj->angular_momentum_direction[2]}; + + const float relative_coordinates[3] = { + bpj->x[0] - bpi->x[0], bpj->x[1] - bpi->x[1], bpj->x[2] - bpi->x[2]}; + const float relative_velocities[3] = { + bpj->v[0] - bpi->v[0], bpj->v[1] - bpi->v[1], bpj->v[2] - bpi->v[2]}; + + float orbital_angular_momentum[3] = { + reduced_mass * (relative_coordinates[1] * relative_velocities[2] - + relative_coordinates[2] * relative_velocities[1]), + reduced_mass * (relative_coordinates[2] * relative_velocities[0] - + relative_coordinates[0] * relative_velocities[2]), + reduced_mass * (relative_coordinates[0] * relative_velocities[1] - + relative_coordinates[1] * relative_velocities[0])}; + + const float orbital_angular_momentum_magnitude = + sqrtf(orbital_angular_momentum[0] * orbital_angular_momentum[0] + + orbital_angular_momentum[1] * orbital_angular_momentum[1] + + orbital_angular_momentum[2] * orbital_angular_momentum[2]); + + if (orbital_angular_momentum_magnitude > 0.) { + orbital_angular_momentum[0] = + orbital_angular_momentum[0] / orbital_angular_momentum_magnitude; + orbital_angular_momentum[1] = + orbital_angular_momentum[1] / orbital_angular_momentum_magnitude; + orbital_angular_momentum[2] = + orbital_angular_momentum[2] / orbital_angular_momentum_magnitude; + } else { + orbital_angular_momentum[0] = 0.; + orbital_angular_momentum[1] = 0.; + orbital_angular_momentum[2] = 0.; + } + + const float angle_0 = + (spin_vec1[0] * spin_vec2[0] + spin_vec1[1] * spin_vec2[1] + + spin_vec1[2] * spin_vec2[2]) / + (spin1 * spin2); + const float angle_1 = (spin_vec1[0] * orbital_angular_momentum[0] + + spin_vec1[1] * orbital_angular_momentum[1] + + spin_vec1[2] * orbital_angular_momentum[2]) / + spin1; + const float angle_2 = (spin_vec2[0] * orbital_angular_momentum[0] + + spin_vec2[1] * orbital_angular_momentum[1] + + spin_vec2[2] * orbital_angular_momentum[2]) / + spin2; + + const float l = + -0.129 / (1. + mass_ratio * mass_ratio) * 1. / + (1. + mass_ratio * mass_ratio) * + (spin1 * spin1 + + spin2 * spin2 * mass_ratio * mass_ratio * mass_ratio * mass_ratio + + 2. * spin1 * spin2 * mass_ratio * mass_ratio * angle_0) + + ((-0.384 * sym_mass_ratio - 0.686) / (1. + mass_ratio * mass_ratio)) * + (spin1 * angle_1 + spin2 * mass_ratio * mass_ratio * angle_2) + + 3.464 - 3.454 * sym_mass_ratio + 2.353 * sym_mass_ratio * sym_mass_ratio; + +#ifdef SWIFT_DEBUG_CHECKS + if (l < 0.) { + error( + "Something went wrong with calculation of spin of a black hole " + " merger remnant. The l factor is %f, instead of >= 0.", + l); + } +#endif + + float final_spin[3] = { + 1. / (1. + mass_ratio) / (1. + mass_ratio) * + (spin_vec1[0] + mass_ratio * mass_ratio * spin_vec2[0] + + mass_ratio * l * orbital_angular_momentum[0]), + 1. / (1. + mass_ratio) / (1. + mass_ratio) * + (spin_vec1[1] + mass_ratio * mass_ratio * spin_vec2[1] + + mass_ratio * l * orbital_angular_momentum[1]), + 1. / (1. + mass_ratio) / (1. + mass_ratio) * + (spin_vec1[2] + mass_ratio * mass_ratio * spin_vec2[2] + + mass_ratio * l * orbital_angular_momentum[2])}; + const float final_spin_magnitude = + sqrtf(final_spin[0] * final_spin[0] + final_spin[1] * final_spin[1] + + final_spin[2] * final_spin[2]); + +#ifdef SWIFT_DEBUG_CHECKS + if (final_spin_magnitude <= 0.) { + error( + "Something went wrong with calculation of spin of a black hole " + " merger remnant. The final spin magnitude is %f, instead of > 0.", + final_spin_magnitude); + } +#endif + + final_spin[0] = final_spin[0] / final_spin_magnitude; + final_spin[1] = final_spin[1] / final_spin_magnitude; + final_spin[2] = final_spin[2] / final_spin_magnitude; + + bpi->spin = min(final_spin_magnitude, 0.998); + if (fabsf(bpi->spin) < 0.001) { + bpi->spin = 0.001; + } + + bpi->angular_momentum_direction[0] = final_spin[0]; + bpi->angular_momentum_direction[1] = final_spin[1]; + bpi->angular_momentum_direction[2] = final_spin[2]; +} + +#endif /* SWIFT_SPIN_JET_BLACK_HOLES_SPIN_H */ diff --git a/src/black_holes/SPIN_JET/black_holes_struct.h b/src/black_holes/SPIN_JET/black_holes_struct.h new file mode 100644 index 0000000000000000000000000000000000000000..3ddd08fcc609daf5074ebc93312c1cb2e8859794 --- /dev/null +++ b/src/black_holes/SPIN_JET/black_holes_struct.h @@ -0,0 +1,134 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Copyright (c) 2020 Matthieu Schaller (schaller@strw.leidenuniv.nl) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + ******************************************************************************/ +#ifndef SWIFT_BLACK_HOLES_STRUCT_SPIN_JET_H +#define SWIFT_BLACK_HOLES_STRUCT_SPIN_JET_H + +/* Standard headers */ +#include <float.h> + +/* Local includes */ +#include "inline.h" + +/** + * @brief Black holes-related fields carried by each *gas* particle. + */ +struct black_holes_part_data { + + /*! ID of the black-hole that will swallow this #part. */ + long long swallow_id; + + /*! Gravitational potential of the particle (for repositioning) */ + float potential; +}; + +/** + * @brief Black holes-related fields carried by each *BH* particle. + */ +struct black_holes_bpart_data { + + /*! ID of the black-hole that will swallow this #bpart. */ + long long swallow_id; + + /*! Mass of the black-hole that will swallow this #bpart. */ + float swallow_mass; +}; + +/** + * @brief Update a given #part's BH data field to mark the particle has + * not yet been swallowed. + * + * @param p_data The #part's #black_holes_part_data structure. + */ +__attribute__((always_inline)) INLINE static void +black_holes_mark_part_as_not_swallowed(struct black_holes_part_data* p_data) { + + p_data->swallow_id = -1; +} + +/** + * @brief Reset the particle-carried potential at the start of a time-step. + * + * @param p_data The #part's black hole data. + */ +__attribute__((always_inline)) INLINE static void black_holes_init_potential( + struct black_holes_part_data* p_data) { + p_data->potential = FLT_MAX; +} + +/** + * @brief Update a given #part's BH data field to mark the particle has + * having been been swallowed. + * + * @param p_data The #part's #black_holes_part_data structure. + */ +__attribute__((always_inline)) INLINE static void +black_holes_mark_part_as_swallowed(struct black_holes_part_data* p_data) { + + p_data->swallow_id = -2; +} + +/** + * @brief Return the ID of the BH that should swallow this #part. + * + * @param p_data The #part's #black_holes_part_data structure. + */ +__attribute__((always_inline)) INLINE static long long +black_holes_get_part_swallow_id(struct black_holes_part_data* p_data) { + + return p_data->swallow_id; +} + +/** + * @brief Update a given #bpart's BH data field to mark the particle has + * not yet been swallowed. + * + * @param p_data The #bpart's #black_holes_bpart_data structure. + */ +__attribute__((always_inline)) INLINE static void +black_holes_mark_bpart_as_not_swallowed(struct black_holes_bpart_data* p_data) { + + p_data->swallow_id = -1; + p_data->swallow_mass = 0.f; +} + +/** + * @brief Update a given #bpart's BH data field to mark the particle has + * having been been swallowed. + * + * @param p_data The #bpart's #black_holes_bpart_data structure. + */ +__attribute__((always_inline)) INLINE static void +black_holes_mark_bpart_as_merged(struct black_holes_bpart_data* p_data) { + + p_data->swallow_id = -2; + p_data->swallow_mass = -1.f; +} + +/** + * @brief Return the ID of the BH that should swallow this #bpart. + * + * @param p_data The #bpart's #black_holes_bpart_data structure. + */ +__attribute__((always_inline)) INLINE static long long +black_holes_get_bpart_swallow_id(struct black_holes_bpart_data* p_data) { + + return p_data->swallow_id; +} + +#endif /* SWIFT_BLACK_HOLES_STRUCT_SPIN_JET_H */ diff --git a/src/black_holes_debug.h b/src/black_holes_debug.h index 03e3dcc5b182c91c44278f5bdd9c75c05dec2aca..2ac72c264a3777975bbf6dca8d82d6e4b8af1b86 100644 --- a/src/black_holes_debug.h +++ b/src/black_holes_debug.h @@ -27,6 +27,8 @@ #include "./black_holes/Default/black_holes_debug.h" #elif defined(BLACK_HOLES_EAGLE) #include "./black_holes/EAGLE/black_holes_debug.h" +#elif defined(BLACK_HOLES_SPIN_JET) +#include "./black_holes/SPIN_JET/black_holes_debug.h" #else #error "Invalid choice of BH model" #endif diff --git a/src/black_holes_io.h b/src/black_holes_io.h index 45208703b500313fffb8cffd070cae9cff70b4b8..b1ad668e2a87ee7e17de50a8d36238b28326eda3 100644 --- a/src/black_holes_io.h +++ b/src/black_holes_io.h @@ -29,6 +29,8 @@ #include "./black_holes/Default/black_holes_io.h" #elif defined(BLACK_HOLES_EAGLE) #include "./black_holes/EAGLE/black_holes_io.h" +#elif defined(BLACK_HOLES_SPIN_JET) +#include "./black_holes/SPIN_JET/black_holes_io.h" #else #error "Invalid choice of BH model" #endif diff --git a/src/black_holes_properties.h b/src/black_holes_properties.h index d8fd7189becb63f6e5e7c4fee826f7066e56dfe0..f8ec9116d1c9f261721dedc54c4eedfadc45d25f 100644 --- a/src/black_holes_properties.h +++ b/src/black_holes_properties.h @@ -27,6 +27,8 @@ #include "./black_holes/Default/black_holes_properties.h" #elif defined(BLACK_HOLES_EAGLE) #include "./black_holes/EAGLE/black_holes_properties.h" +#elif defined(BLACK_HOLES_SPIN_JET) +#include "./black_holes/SPIN_JET/black_holes_properties.h" #else #error "Invalid choice of black hole model" #endif diff --git a/src/black_holes_struct.h b/src/black_holes_struct.h index 73cc156420699923a71bd23d1c9d239d987bfd95..6ca85909ce9822bf8e35b2b45754bced09206a34 100644 --- a/src/black_holes_struct.h +++ b/src/black_holes_struct.h @@ -33,6 +33,8 @@ #include "./black_holes/Default/black_holes_struct.h" #elif defined(BLACK_HOLES_EAGLE) #include "./black_holes/EAGLE/black_holes_struct.h" +#elif defined(BLACK_HOLES_SPIN_JET) +#include "./black_holes/SPIN_JET/black_holes_struct.h" #else #error "Invalid choice of black hole model." #endif diff --git a/src/fof.c b/src/fof.c index d66d1bb25e4922b44e16a47b97a1138dc60b89a0..13a99441be8d3c61866d9f12de7e9fb073f4ee81 100644 --- a/src/fof.c +++ b/src/fof.c @@ -2213,7 +2213,8 @@ void fof_seed_black_holes(const struct fof_props *props, #endif /* Copy over all the gas properties that we want */ - black_holes_create_from_gas(bp, bh_props, constants, cosmo, p, xp); + black_holes_create_from_gas(bp, bh_props, constants, cosmo, p, xp, + s->e->ti_current); /* Move to the next BH slot */ k++; diff --git a/src/part.h b/src/part.h index ed1f914e730e62376d785a9432e4718a802a7a20..48efd229bd210e815534a34fd56db72fd104f4b0 100644 --- a/src/part.h +++ b/src/part.h @@ -122,6 +122,8 @@ struct threadpool; #include "./black_holes/Default/black_holes_part.h" #elif defined(BLACK_HOLES_EAGLE) #include "./black_holes/EAGLE/black_holes_part.h" +#elif defined(BLACK_HOLES_SPIN_JET) +#include "./black_holes/SPIN_JET/black_holes_part.h" #else #error "Invalid choice of black hole particle" #endif diff --git a/src/random.h b/src/random.h index d2015136aa3e88412517ec667df64edb46a38891..fb596aa4486410be278afa26add19eead4b80fc1 100644 --- a/src/random.h +++ b/src/random.h @@ -29,6 +29,9 @@ #include <string.h> #include <sys/types.h> +/* Local headers */ +#include "sincos.h" + /** * @brief The categories of random number generated. * @@ -40,10 +43,6 @@ * Only change when you know what you are doing, changing * the numbers to bad values will break the random number * generator. - * In case new numbers need to be added other possible - * numbers could be: - * 193877777 - * 303595777 */ enum random_number_type { random_number_star_formation = 0LL, @@ -61,6 +60,8 @@ enum random_number_type { random_number_BH_feedback = 1640531371LL, random_number_BH_swallow = 4947009007LL, random_number_BH_reposition = 59969537LL, + random_number_BH_spin = 193877777LL, + random_number_BH_kick = 303595777LL, random_number_snapshot_sampling = 6561001LL, random_number_stellar_winds = 5947309451LL, random_number_HII_regions = 8134165677LL, @@ -290,5 +291,112 @@ INLINE static int random_poisson(const int64_t id, const double lambda, return k - 1; } +/** + * @brief Generates a unit vector within a cone. + * + * We draw a random unit vector around the unit vector a = (a0, a1, a2), + * such that it is uniformly distributed in solid angle from 0 opening + * angle (perfectly aligned with the vector a) to a maximum of + * opening_angle radians. + * + * @param id_bh The ID of the (BH) particle which is doing the jet feedback. + * @param id_gas The ID of the gas particle being kicked by jet feedback. + * @param ti_current The time (on the time-line) for which to generate the + * random kick direction. + * @param type The #random_number_type to generate. + * @param opening_angle Opening angle of the cone. + * @param a Reference direction that defines the cone. + * @param rand_cone_direction Return value. + */ +INLINE static void random_direction_in_cone( + const int64_t id_bh, const int64_t id_gas, const integertime_t ti_current, + const enum random_number_type type, const float opening_angle, + const float a[3], float rand_cone_direction[3]) { + + /* We want to draw a random unit vector from a cone around the unit + * vector a = (a0, a1, a2). We do this in a frame x'y'z', where the z' + * axis is aligned with the a vector, i.e. the a vector is one of its + * basis vectors. The choice of the other two axes, x' and y', is + * arbitrary. We can use any two unit vectors that are orthogonal to the + * a vector. These two vectors can be obtained using cross products. + * However, we need to first start from an initial vector that is not + * perfectly aligned with a. The choice of this vector is also arbitrary; + * we choose a vector that is perfectly aligned with the smallest + * component of the spin vector a. */ + float init_unit[3] = {0.f, 0.f, 1.f}; + + /* Find which of the x, y or z is the smallest components of a. We also + * need to take into account the possibility that two of the components + * are equal. In this case it doesn't matter which of the two we + * choose. */ + const float a0_abs = fabsf(a[0]); + const float a1_abs = fabsf(a[1]); + const float a2_abs = fabsf(a[2]); + if (((a0_abs < a1_abs) && (a0_abs < a2_abs)) || + ((a0_abs == a1_abs) && (a0_abs < a2_abs))) { + init_unit[0] = 1.f; + } else if (((a1_abs < a2_abs) && (a1_abs < a0_abs)) || + ((a1_abs == a2_abs) && (a1_abs < a0_abs))) { + init_unit[1] = 1.f; + } else if (((a2_abs < a0_abs) && (a2_abs < a1_abs)) || + ((a2_abs == a0_abs) && (a2_abs < a1_abs))) { + init_unit[2] = 1.f; + } + + /* Using this vector and the a vector, we can find the first basis + * vector x (alongside a) that will also be orthogonal to a, by using a + * cross product, such that x = init_unit cross a. This vector needs to be + * normalized to get an actual unit vector. */ + float basis_vec_x[3]; + basis_vec_x[0] = init_unit[1] * a[2] - init_unit[2] * a[1]; + basis_vec_x[1] = init_unit[2] * a[0] - init_unit[0] * a[2]; + basis_vec_x[2] = init_unit[0] * a[1] - init_unit[1] * a[0]; + const float basis_vec_x_magn = + sqrtf(basis_vec_x[0] * basis_vec_x[0] + basis_vec_x[1] * basis_vec_x[1] + + basis_vec_x[2] * basis_vec_x[2]); + basis_vec_x[0] = basis_vec_x[0] / basis_vec_x_magn; + basis_vec_x[1] = basis_vec_x[1] / basis_vec_x_magn; + basis_vec_x[2] = basis_vec_x[2] / basis_vec_x_magn; + + /* The other basis vector, y, follows as x cross a. It is already + * normalized since x and a are orthogonal. */ + const float basis_vec_y[3] = {basis_vec_x[1] * a[2] - basis_vec_x[2] * a[1], + basis_vec_x[2] * a[0] - basis_vec_x[0] * a[2], + basis_vec_x[0] * a[1] - basis_vec_x[1] * a[0]}; + + /* Draw a random cosine confined to the range [cos(opening_angle), 1] */ + const float rand_cos_theta = + 1.f - (1.f - cosf(opening_angle)) * + random_unit_interval(id_bh + id_gas, ti_current, type); + + /* Get the corresponding sine */ + const float rand_sin_theta = + sqrtf(max(0.f, (1.f - rand_cos_theta) * (1.f + rand_cos_theta))); + + /* Get a random equitorial angle from [0, 180] deg */ + const float rand_phi = + ((float)(2. * M_PI)) * + random_unit_interval((id_bh + id_gas) * (id_bh + id_gas), ti_current, + type); + + float rand_cos_phi, rand_sin_phi; + sincosf(rand_phi, &rand_sin_phi, &rand_cos_phi); + + /* We now calculate the direction of the final vector by picking a random + * direction within a cone around a, with basis_vec_x and basis_vec_y + * playing the role of x and y unit vectors, and a playing the role of z + * unit vector. In other words, in vector notation rand_cone_direction = + * sin(theta)cos(phi) * basis_vec_x + sin(theta)sin(phi) * basis_vec_y + * + cos(theta) * a . */ + rand_cone_direction[0] = rand_sin_theta * rand_cos_phi * basis_vec_x[0] + + rand_sin_theta * rand_sin_phi * basis_vec_y[0] + + rand_cos_theta * a[0], + rand_cone_direction[1] = rand_sin_theta * rand_cos_phi * basis_vec_x[1] + + rand_sin_theta * rand_sin_phi * basis_vec_y[1] + + rand_cos_theta * a[1], + rand_cone_direction[2] = rand_sin_theta * rand_cos_phi * basis_vec_x[2] + + rand_sin_theta * rand_sin_phi * basis_vec_y[2] + + rand_cos_theta * a[2]; +} #endif /* SWIFT_RANDOM_H */ diff --git a/src/runner_black_holes.c b/src/runner_black_holes.c index cba52aff3fa924d0ef2782ba1e2a5eba13a481a7..3deacf79b97b06e8c4a0152bf5530597a889525f 100644 --- a/src/runner_black_holes.c +++ b/src/runner_black_holes.c @@ -385,7 +385,8 @@ void runner_do_bh_swallow(struct runner *r, struct cell *c, int timer) { /* Swallow the BH particle (i.e. update the swallowing BH * properties with the properties of cell_bp) */ black_holes_swallow_bpart(bp, cell_bp, e->cosmology, e->time, - with_cosmology, props); + with_cosmology, props, + e->physical_constants); /* Release the space as we are done updating the bpart */ if (lock_unlock(&s->lock) != 0) diff --git a/src/tracers/EAGLE/tracers.h b/src/tracers/EAGLE/tracers.h index cf58dfbe4bcdbeb08a1a8014b9e637655d4963d2..94684be086b6d3c0be932146e9222a71940f463f 100644 --- a/src/tracers/EAGLE/tracers.h +++ b/src/tracers/EAGLE/tracers.h @@ -210,6 +210,18 @@ static INLINE void tracers_after_black_holes_feedback( xp->tracers_data.AGN_feedback_energy += delta_energy; } +static INLINE void tracers_after_jet_feedback( + const struct part *p, struct xpart *xp, const int with_cosmology, + const float scale_factor, const double time, const double delta_energy) { + + if (with_cosmology) + xp->tracers_data.last_AGN_jet_feedback_scale_factor = scale_factor; + else + xp->tracers_data.last_AGN_jet_feedback_time = time; + xp->tracers_data.hit_by_jet_feedback++; + xp->tracers_data.jet_feedback_energy += delta_energy; +} + /** * @brief Split the tracer content of a particle into n pieces * diff --git a/src/tracers/EAGLE/tracers_struct.h b/src/tracers/EAGLE/tracers_struct.h index 05c39e356a3ca7672c88c5944a631249db94817d..71b1966a73c8515c725853a55dc2d87f12750a48 100644 --- a/src/tracers/EAGLE/tracers_struct.h +++ b/src/tracers/EAGLE/tracers_struct.h @@ -47,6 +47,15 @@ struct tracers_xpart_data { float last_AGN_injection_time; }; + union { + + /* Last scale factor this particle was kicked as part of jet feedback */ + float last_AGN_jet_feedback_scale_factor; + + /* Last time this particle was kicked as part of jet feedback */ + float last_AGN_jet_feedback_time; + }; + /*! Density of the gas before the last AGN feedback event * (physical internal units) */ float density_before_last_AGN_feedback_event; @@ -67,6 +76,13 @@ struct tracers_xpart_data { * (physical units) */ float AGN_feedback_energy; + /*! Total jet feedback energy received by this particle */ + float jet_feedback_energy; + + /*! Counts how many times this particle has been kicked as part of + jet feedback */ + char hit_by_jet_feedback; + /*! Has this particle been hit by SNII feedback? */ char hit_by_SNII_feedback; diff --git a/tests/Makefile.am b/tests/Makefile.am index e385bd81940ac913f236b63024a5614c8088558f..53fce13c93487429a517e960e958b08ff6921c77 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -32,7 +32,7 @@ TESTS = testGreetings testMaths testReading.sh testKernel testKernelLongGrav \ testVoronoi1D testVoronoi2D testVoronoi3D testGravityDerivatives \ testPeriodicBC.sh testPeriodicBCPerturbed.sh testPotentialSelf \ testPotentialPair testEOS testUtilities testSelectOutput.sh \ - testCbrt testCosmology testOutputList testFormat.sh \ + testCbrt testCosmology testRandomCone testOutputList testFormat.sh \ test27cellsStars.sh test27cellsStarsPerturbed.sh testHydroMPIrules \ testAtomic testGravitySpeed testNeutrinoCosmology.sh testNeutrinoFermiDirac \ testLog testDistance testTimeline @@ -42,7 +42,7 @@ check_PROGRAMS = testGreetings testReading testTimeIntegration testKernelLongGra testActivePair test27cells test27cells_subset test125cells testParser \ testKernel testFFT testInteractions testMaths testRandom testExp \ testSymmetry testDistance testThreadpool testRandomSpacing testErfc \ - testAdiabaticIndex testRiemannExact testRiemannTRRS testRandomPoisson \ + testAdiabaticIndex testRiemannExact testRiemannTRRS testRandomPoisson testRandomCone \ testRiemannHLLC testMatrixInversion testDump testCSDS \ testVoronoi1D testVoronoi2D testVoronoi3D testPeriodicBC \ testGravityDerivatives testPotentialSelf testPotentialPair testEOS testUtilities \ @@ -67,6 +67,8 @@ testRandomPoisson_SOURCES = testRandomPoisson.c testRandomSpacing_SOURCES = testRandomSpacing.c +testRandomCone_SOURCES = testRandomCone.c + testReading_SOURCES = testReading.c testSelectOutput_SOURCES = testSelectOutput.c diff --git a/tests/testRandomCone.c b/tests/testRandomCone.c new file mode 100644 index 0000000000000000000000000000000000000000..ff226465388cb43c64315eb53765c775c028e363 --- /dev/null +++ b/tests/testRandomCone.c @@ -0,0 +1,217 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Copyright (C) 2022 Filip Husko (filip.husko@durham.ac.uk). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + ******************************************************************************/ +#include "../config.h" + +/* Local headers. */ +#include "swift.h" + +/* Number of different maximal opening angles to test between 0 and pi/2. */ +const int N_cos = 20; + +/* Number of random cones to draw for each opening angle. */ +const int N_cos_cone = 30; + +/* Cubical grid size when checking the cone function along axes of the Cartesian + * grid. Should be at least 2. */ +const int N_cube = 5; + +/** + * @brief Test to check whether the function that generates random directions + * within a cone actually generates vectors only within that cone. It also tests + * whether they are uniformly distributed in solid angle. + * + * @param id_bh The ID of a black hole particle around whose spin vector a given + * cone is drawn. + * @param ti_current Current time of the simulation. + * @param type Random number type used. + * @param opening_angle The opening angle of the cone (in radians). + * @param unit_vector The vector that defines where the cone is pointing. + * @param N_test How many random directions to draw within the cone. + * @param N_bins How many bins to distribute these directions into when testing + * the uniformity of the distribution. + * @param tolerance The tolerance of each bin relative to the expected value. + */ +void test_cone(int64_t id_bh, const integertime_t ti_current, + const enum random_number_type type, double opening_angle, + float unit_vector[3], const int N_test, const int N_bins, + const double tolerance) { + + /* Compute cosine that corresponds to the maximum opening angle */ + const double cos_theta_max = cos(opening_angle); + + /* Initialize an array that will hold a random vector every step */ + float rand_vector[3]; + + /* Initialize an array that will hold the binned number of drawn cosines, + i.e. this is the probability density function that we wish to test. */ + double binned_cosines[N_bins]; + for (int j = 0; j < N_bins; ++j) { + binned_cosines[j] = 0.; + } + + for (int k = 0; k < N_test; ++k) { + + /* Generate random ids. */ + const long long id_p = rand() * (1LL << 31) + rand(); + + /* Generate a random unit vector within a cone around unit_vector */ + random_direction_in_cone(id_p, id_bh, ti_current, type, opening_angle, + unit_vector, rand_vector); + + /* Check that this vector is actually within the cone we want */ + const double cos_rand_unit = rand_vector[0] * unit_vector[0] + + rand_vector[1] * unit_vector[1] + + rand_vector[2] * unit_vector[2]; + if (cos_rand_unit < 0.99999 * cos_theta_max) { + printf("Cos_opening_angle is: %f, Random cos is: %f\n", cos_theta_max, + cos_rand_unit); + error("Generated random unit vector is outside cone."); + } + + /* Add the unit vector to the probability density function array. The solid + * angle subtended by some angle theta grows as (1-cos(theta)). Furthermore, + * we are limited to the spherical cap defined by the angles [0, theta_max]. + * Therefore the variable which we expect to be uniformly distributed is (1 + * - cos(theta)) / (1 - cos(theta_max)). */ + double uniform_variable = (1. - cos_rand_unit) / (1 - cos_theta_max); + for (int j = 0; j < N_bins; ++j) { + if ((uniform_variable > (double)j / (double)N_bins) && + (uniform_variable < (double)(j + 1) / (double)N_bins)) { + binned_cosines[j] = binned_cosines[j] + 1. / (double)N_test; + } + } + } + + /* Check whether the binned quantity is really uniformly distributed. If it + * is, the density (value) of each bin should be 1/N_bin. */ + for (int j = 0; j < N_bins; ++j) { + if ((binned_cosines[j] < (1. - tolerance) / (double)N_bins) || + (binned_cosines[j] > (1. + tolerance) / (double)N_bins)) { + error( + "Generated distribution of random unit vectors within a cone exceeds " + "the limit imposed by the tolerance."); + } + } +} + +int main(int argc, char *argv[]) { + + /* Test the random-vector-in-cone function, for different values of opening + * angle from 0 to pi/2 (in radians). For each of these opening angles we draw + * some number of cones, and test whether each of those has a uniform + * distribution of randomly drawn vectors within it.*/ + for (int i = 1; i < N_cos; ++i) { + + /* Opening angle to use */ + const double opening_angle = 0.5 * M_PI * (double)i / (double)N_cos; + + /* Do the test for N_cos_cone cones with this opening angle */ + for (int l = 0; l < N_cos_cone; ++l) { + + /* Generate an id for the bh and a time. We do this for every opening + * angle and every cone. */ + const long long id_bh = rand() * (1LL << 31) + rand(); + const integertime_t ti_current = rand() * (1LL << 31) + rand(); + + /* Generate a random unit vector that defines a cone, along with the + * opening angle. */ + float unit_vector[3]; + const double cos_unit = + random_unit_interval(id_bh, ti_current, random_number_BH_kick); + const double sin_unit = sqrtf(max(0., (1. - cos_unit) * (1. + cos_unit))); + const double phi_unit = random_unit_interval(id_bh * id_bh, ti_current, + random_number_BH_kick); + unit_vector[0] = sin_unit * cos(phi_unit); + unit_vector[1] = sin_unit * sin(phi_unit); + unit_vector[2] = cos_unit; + + /* Do the test. */ + test_cone(id_bh, ti_current, random_number_BH_kick, opening_angle, + unit_vector, 100000, 10, 0.1); + } + } + + /* Repeat the same test but with a larger number of random directions and + * bins, but for just one opening angle and one randomly generated cone */ + const double opening_angle_0 = 0.2; + + /* Generate an id for the bh and a time. We do this for every opening + * angle and every cone. */ + const long long id_bh_0 = rand() * (1LL << 31) + rand(); + const integertime_t ti_current_0 = rand() * (1LL << 31) + rand(); + + /* Generate a random unit vector that defines a cone, along with the + * opening angle. */ + float unit_vector_0[3]; + const double cos_unit = + random_unit_interval(id_bh_0, ti_current_0, random_number_BH_kick); + const double sin_unit = sqrtf(max(0., (1. - cos_unit) * (1. + cos_unit))); + const double phi_unit = random_unit_interval(id_bh_0 * id_bh_0, ti_current_0, + random_number_BH_kick); + unit_vector_0[0] = sin_unit * cos(phi_unit); + unit_vector_0[1] = sin_unit * sin(phi_unit); + unit_vector_0[2] = cos_unit; + + /* Do the test. */ + test_cone(id_bh_0, ti_current_0, random_number_BH_kick, opening_angle_0, + unit_vector_0, 100000000, 100, 0.01); + + /* We now repeat the same process, but we do not generate random unit vectors + * to define the cones. Instead, we sample unit vectors along the grid + * [-N_cube, -N_cube + 1, ..., N_cube -1, N_cube] ^ 3. This can be, e.g. [-2, + * -1, 0, 1, 2] ^ 3 (N_cube should be at least 2). This makes sure that the + * function that generates random unit vectors is well-defined if the unit + * vectors that define the cones point along any of the Cartesian axes, or if + * any of their components are equal. Here we use a fixed opening angle of + * 0.1, since we assume that the earlier test passing means that the function + * correctly does what it should for all opening angles. */ + const double opening_angle = 0.1; + for (int x = -N_cube; x < N_cube + 1; ++x) { + for (int y = -N_cube; y < N_cube + 1; ++y) { + for (int z = -N_cube; z < N_cube + 1; ++z) { + + /* Create our unit vector on this point of the grid */ + float unit_vector[3] = {(float)x, (float)y, (float)z}; + float unit_vector_norm = + sqrtf((float)(x * x) + (float)(y * y) + (float)(z * z)); + + /* Only do the test if the norm is >0, i.e. if we are not at the origin + * of the coordinate frame. */ + if (unit_vector_norm > 0) { + + /* Generate an id for the bh and a time. We do this for every opening + * angle and every cone. */ + const long long id_bh = rand() * (1LL << 31) + rand(); + const integertime_t ti_current = rand() * (1LL << 31) + rand(); + + /* Normalize the unit vector. */ + unit_vector[0] = unit_vector[0] / unit_vector_norm; + unit_vector[1] = unit_vector[1] / unit_vector_norm; + unit_vector[2] = unit_vector[2] / unit_vector_norm; + + /* Do the test. */ + test_cone(id_bh, ti_current, random_number_BH_kick, opening_angle, + unit_vector, 100000, 10, 0.1); + } + } + } + } + + return 0; +}