diff --git a/configure.ac b/configure.ac index fbf097976a7e67b8b35e20f1d66d231738fd80f6..50619f589b9377001538f3c62870c72249b3f102 100644 --- a/configure.ac +++ b/configure.ac @@ -60,6 +60,10 @@ if test "x$ax_enable_debug" != "xno"; then AC_DEFINE([SWIFT_DEVELOP_MODE],1,[Enable developer code options]) fi +# C++ in GCC 6 and above has an issue with undefined the min() and max() +# macros. This hack works around that. +AC_DEFINE([_GLIBCXX_INCLUDE_NEXT_C_HEADERS],1,[Hack for min() and max() using g++ 6+]) + # Enable POSIX and platform extension preprocessor macros. AC_USE_SYSTEM_EXTENSIONS @@ -361,6 +365,18 @@ fi # Check whether we have any of the ARM v8.1 tick timers AX_ASM_ARM_PMCCNTR AX_ASM_ARM_CNTVCT +# See if we want memuse reporting. +AC_ARG_ENABLE([memuse-reports], + [AS_HELP_STRING([--enable-memuse-reports], + [Output reports about significant memory allocations@<:@yes/no@:>@] + )], + [enable_memuse_reports="$enableval"], + [enable_memuse_reports="no"] +) +if test "$enable_memuse_reports" = "yes"; then + AC_DEFINE([SWIFT_MEMUSE_REPORTS],1,[Enable memory usage reports]) +fi + # Define HAVE_POSIX_MEMALIGN if it works. AX_FUNC_POSIX_MEMALIGN diff --git a/doc/RTD/source/AnalysisTools/index.rst b/doc/RTD/source/AnalysisTools/index.rst index f68fa77536e77df48cd1acc44e98a3408e48b037..9fa94e0baff5732092a704e20ecc12de57d8301f 100644 --- a/doc/RTD/source/AnalysisTools/index.rst +++ b/doc/RTD/source/AnalysisTools/index.rst @@ -1,5 +1,6 @@ .. AnalysisTools Loic Hausammann 20th March 2019 + Peter W. Draper 28th March 2019 .. _analysistools: @@ -33,3 +34,48 @@ or install ``npm`` and then run the following commands http-server . Now you can open the web page ``http://localhost:8080/cell_hierarchy.html``. + +Memory usage reports +-------------------- + +When SWIFT is configured using the ``--enable-memuse-reports`` flag it will +log any calls to allocate or free memory that make use of the +``swift_memalign()``, ``swift_malloc()``, ``swift_calloc()`` and +``swift_free()`` functions and will generate a report at the end of each +step. It will also attempt to dump the current memory use when SWIFT is +aborted by calling the ``error()`` function. Failed memory allocations will be +reported in these logs. + +These functions should be used by developers when allocating significant +amounts of memory -- so don't use these for high frequency small allocations. +Each call to the ``swift_`` functions differs to the standard calls by the +inclusion of a "label", this should match between allocations and frees and +ideally should be a short label that describes the use of the memory, i.e. +"parts", "gparts", "hydro.sort" etc. + +Calls to external libraries that make allocations you'd also like to log +can be made by calling the ``memuse_log_allocation()`` function directly. + +The output files are called ``memuse_report-step<n>.dat`` or +``memuse_report-rank<m>-step<n>.dat`` if running using MPI. These have a line +for each allocation or free that records the time, memory address, step, +whether an allocation or free, the label and when an allocation, the amount of +memory. The comments in this file also record the actual memory use of the +process (including threads) as reported by the operating system at the end of +the step. + +To post process these files into a memory used timeline and get a report of +the peak memory use, as well as the memory still in use at the end of the step +there is an basic analysis script ``analyse_memuse_logs.py`` and two wrappers +that process a directory of logs, these are ``./process_memuse_logs.sh`` and +``./process_memuse_logs_MPI.sh`` for non-MPI and MPI runs respectively. + +Note that the process scripts process each step individually and also process +all the logs as a single sequence. When interpreting these some care should be +taken as they are not all the memory allocated, just important allocations in +SWIFT and when looking at a single step the context of any previous steps is +not used, so you only see allocations made in that step and the effect of any +matching frees (so allocations made in previous steps that are freed in this +step will not be understood and will be ignored, you need the global analysis +to understand that). + diff --git a/doc/RTD/source/SubgridModels/EAGLE/EAGLE_SF_EOS.svg b/doc/RTD/source/SubgridModels/EAGLE/EAGLE_SF_EOS.svg new file mode 100644 index 0000000000000000000000000000000000000000..398c2bd88331cff072cd82590d4691f0c48bc148 --- /dev/null +++ b/doc/RTD/source/SubgridModels/EAGLE/EAGLE_SF_EOS.svg @@ -0,0 +1,2353 @@ +<?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 new file mode 100644 index 0000000000000000000000000000000000000000..5314e6c83b0e394cc1262eb59fbfaf763151923a --- /dev/null +++ b/doc/RTD/source/SubgridModels/EAGLE/EAGLE_SF_Z_dep.svg @@ -0,0 +1,2649 @@ +<?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 index 383b074fc947ed072dc50015152ba694b929c611..2b1061de9c001d4e48574b7ea7029ba1c280e37f 100644 --- a/doc/RTD/source/SubgridModels/EAGLE/EAGLE_entropy_floor.svg +++ b/doc/RTD/source/SubgridModels/EAGLE/EAGLE_entropy_floor.svg @@ -1,8 +1,8 @@ <?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"> +<!-- 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;} @@ -35,14 +35,14 @@ L 250.907152 -156.365649 L 250.907152 -156.365649 L 77.714425 -156.365649 z -" id="m8f9d87720a" style="stroke:#e6e6e6;"/> +" id="m5eebb27285" style="stroke:#e6e6e6;"/> </defs> - <g clip-path="url(#p107a2e5a22)"> - <use style="fill:#e6e6e6;stroke:#e6e6e6;" x="0" xlink:href="#m8f9d87720a" y="226.8"/> + <g clip-path="url(#pf19aa30d2c)"> + <use style="fill:#e6e6e6;stroke:#e6e6e6;" x="0" xlink:href="#m5eebb27285" y="226.8"/> </g> </g> <g id="PolyCollection_2"> - <path clip-path="url(#p107a2e5a22)" d="M 146.991516 49022.756825 + <path clip-path="url(#pf19aa30d2c)" d="M 146.991516 49022.756825 L 146.991516 85.113175 L 250.907152 -12.410825 L 250.907152 49022.756825 @@ -63,15 +63,15 @@ 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="me37d9803e9" style="stroke:#000000;"/> +" id="mbe6c555b8c" style="stroke:#000000;"/> </defs> - <g clip-path="url(#p107a2e5a22)"> - <use style="stroke:#000000;" x="77.714425" xlink:href="#me37d9803e9" y="70.434351"/> + <g clip-path="url(#pf19aa30d2c)"> + <use style="stroke:#000000;" x="77.714425" xlink:href="#mbe6c555b8c" y="70.434351"/> </g> </g> <g id="PathCollection_2"> - <g clip-path="url(#p107a2e5a22)"> - <use style="stroke:#000000;" x="146.991516" xlink:href="#me37d9803e9" y="85.113175"/> + <g clip-path="url(#pf19aa30d2c)"> + <use style="stroke:#000000;" x="146.991516" xlink:href="#mbe6c555b8c" y="85.113175"/> </g> </g> <g id="matplotlib.axis_1"> @@ -80,518 +80,1010 @@ z <defs> <path d="M 0 0 L 0 3.5 -" id="mddab006ef2" style="stroke:#000000;stroke-width:0.8;"/> +" id="m9a9665ec89" style="stroke:#000000;stroke-width:0.8;"/> </defs> <g> - <use style="stroke:#000000;stroke-width:0.8;" x="60.395152" xlink:href="#mddab006ef2" y="197.316"/> + <use style="stroke:#000000;stroke-width:0.8;" x="60.395152" xlink:href="#m9a9665ec89" y="197.316"/> </g> </g> <g id="text_1"> - <!-- $10^{-6}$ --> + <!-- $\mathdefault{10^{-6}}$ --> <defs> - <path d="M 29.09375 67.796875 -L 11.09375 58.703125 -L 11.09375 57.296875 -C 12.296875 57.796875 13.40625 58.203125 13.796875 58.40625 -C 15.59375 59.109375 17.296875 59.5 18.296875 59.5 -C 20.40625 59.5 21.296875 57.984375 21.296875 54.765625 -L 21.296875 9.25 -C 21.296875 5.921875 20.5 3.625 18.90625 2.703125 -C 17.40625 1.8125 16 1.5 11.796875 1.5 -L 11.796875 0 -L 39.40625 0 -L 39.40625 1.5 -C 31.5 1.5 29.90625 2.5 29.90625 7.34375 -L 29.90625 67.609375 -z -" id="Nimbus_Roman_No9_L_Regular-49"/> - <path d="M 25.40625 68 -C 19.90625 68 15.703125 66.3125 12 62.8125 -C 6.203125 57.203125 2.40625 45.703125 2.40625 34 -C 2.40625 23.109375 5.703125 11.40625 10.40625 5.8125 -C 14.09375 1.40625 19.203125 -1 25 -1 -C 30.09375 -1 34.40625 0.703125 38 4.203125 -C 43.796875 9.703125 47.59375 21.3125 47.59375 33.40625 -C 47.59375 53.90625 38.5 68 25.40625 68 -z -M 25.09375 65.40625 -C 33.5 65.40625 38 54.109375 38 33.203125 -C 38 12.3125 33.59375 1.609375 25 1.609375 -C 16.40625 1.609375 12 12.3125 12 33.109375 -C 12 54.3125 16.5 65.40625 25.09375 65.40625 -z -" id="Nimbus_Roman_No9_L_Regular-48"/> - <path d="M 65.90625 23 -C 67.59375 23 69.40625 23 69.40625 25 -C 69.40625 27 67.59375 27 65.90625 27 -L 11.796875 27 -C 10.09375 27 8.296875 27 8.296875 25 -C 8.296875 23 10.09375 23 11.796875 23 -z -" id="CMSY10-0"/> - <path d="M 44.59375 68.609375 -C 33.203125 67.609375 27.40625 65.703125 20.09375 60.609375 -C 9.296875 52.90625 3.40625 41.5 3.40625 28.15625 -C 3.40625 19.5 6.09375 10.75 10.40625 5.78125 -C 14.203125 1.390625 19.59375 -1 25.796875 -1 -C 38.203125 -1 46.796875 8.453125 46.796875 22.203125 -C 46.796875 34.9375 39.5 43 28 43 -C 23.59375 43 21.5 42.296875 15.203125 38.5 -C 17.90625 53.609375 29.09375 64.40625 44.796875 67 -z -M 24.203125 38.40625 -C 32.796875 38.40625 37.796875 31.25 37.796875 18.8125 -C 37.796875 7.875 33.90625 1.8125 26.90625 1.8125 -C 18.09375 1.8125 12.703125 11.15625 12.703125 26.5625 -C 12.703125 31.640625 13.5 34.421875 15.5 35.921875 -C 17.59375 37.5 20.703125 38.40625 24.203125 38.40625 -z -" id="Nimbus_Roman_No9_L_Regular-54"/> + <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(50.706631 211.234498)scale(0.1 -0.1)"> - <use transform="scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-49"/> - <use transform="translate(49.8132 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-48"/> - <use transform="translate(99.626401 36.163231)scale(0.737241)" xlink:href="#CMSY10-0"/> - <use transform="translate(156.909271 36.163231)scale(0.737241)" xlink:href="#Nimbus_Roman_No9_L_Regular-54"/> + <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="#mddab006ef2" y="197.316"/> + <use style="stroke:#000000;stroke-width:0.8;" x="95.033698" xlink:href="#m9a9665ec89" y="197.316"/> </g> </g> <g id="text_2"> - <!-- $10^{-4}$ --> + <!-- $\mathdefault{10^{-4}}$ --> <defs> - <path d="M 47.203125 23.390625 -L 37 23.390625 -L 37 68 -L 32.59375 68 -L 1.203125 23.390625 -L 1.203125 17 -L 29.296875 17 -L 29.296875 0.5 -L 37 0.5 -L 37 17 -L 47.203125 17 -z -M 29.203125 23.390625 -L 5.203125 23.390625 -L 29.203125 57.78125 -z -" id="Nimbus_Roman_No9_L_Regular-52"/> + <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(85.345176 211.234498)scale(0.1 -0.1)"> - <use transform="scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-49"/> - <use transform="translate(49.8132 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-48"/> - <use transform="translate(99.626401 36.163231)scale(0.737241)" xlink:href="#CMSY10-0"/> - <use transform="translate(156.909271 36.163231)scale(0.737241)" xlink:href="#Nimbus_Roman_No9_L_Regular-52"/> + <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="#mddab006ef2" y="197.316"/> + <use style="stroke:#000000;stroke-width:0.8;" x="129.672243" xlink:href="#m9a9665ec89" y="197.316"/> </g> </g> <g id="text_3"> - <!-- $10^{-2}$ --> + <!-- $\mathdefault{10^{-2}}$ --> <defs> - <path d="M 47.5 13.671875 -L 46.203125 14.171875 -C 42.5 8.5 41.203125 7.59375 36.703125 7.59375 -L 12.796875 7.59375 -L 29.59375 25.140625 -C 38.5 34.40625 42.40625 41.984375 42.40625 49.765625 -C 42.40625 59.734375 34.296875 67.390625 23.90625 67.390625 -C 18.40625 67.390625 13.203125 65.203125 9.5 61.21875 -C 6.296875 57.8125 4.796875 54.625 3.09375 47.546875 -L 5.203125 47.046875 -C 9.203125 56.8125 12.796875 60 19.703125 60 -C 28.09375 60 33.796875 54.3125 33.796875 45.9375 -C 33.796875 38.171875 29.203125 28.90625 20.796875 20.03125 -L 3 1.203125 -L 3 0 -L 42 0 -z -" id="Nimbus_Roman_No9_L_Regular-50"/> + <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(119.983722 211.234498)scale(0.1 -0.1)"> - <use transform="scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-49"/> - <use transform="translate(49.8132 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-48"/> - <use transform="translate(99.626401 36.163231)scale(0.737241)" xlink:href="#CMSY10-0"/> - <use transform="translate(156.909271 36.163231)scale(0.737241)" xlink:href="#Nimbus_Roman_No9_L_Regular-50"/> + <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="#mddab006ef2" y="197.316"/> + <use style="stroke:#000000;stroke-width:0.8;" x="164.310789" xlink:href="#m9a9665ec89" y="197.316"/> </g> </g> <g id="text_4"> - <!-- $10^{0}$ --> - <g transform="translate(157.486382 211.234498)scale(0.1 -0.1)"> - <use transform="scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-49"/> - <use transform="translate(49.8132 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-48"/> - <use transform="translate(99.626401 36.163231)scale(0.737241)" xlink:href="#Nimbus_Roman_No9_L_Regular-48"/> + <!-- $\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="#mddab006ef2" y="197.316"/> + <use style="stroke:#000000;stroke-width:0.8;" x="198.949334" xlink:href="#m9a9665ec89" y="197.316"/> </g> </g> <g id="text_5"> - <!-- $10^{2}$ --> - <g transform="translate(192.124927 211.234498)scale(0.1 -0.1)"> - <use transform="scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-49"/> - <use transform="translate(49.8132 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-48"/> - <use transform="translate(99.626401 36.163231)scale(0.737241)" xlink:href="#Nimbus_Roman_No9_L_Regular-50"/> + <!-- $\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"> - <!-- ${\rm Density}~n_{\rm H}~[{\rm cm^{-3}}]$ --> + <!-- Hydrogen number density $n_{\rm H}$ [cm$^{-3}$] --> <defs> - <path d="M 10.40625 10.609375 -C 10.40625 3.390625 9.203125 2.09375 1.59375 2.09375 -L 1.59375 0 -L 30 0 -C 41.59375 0 52.09375 3.28125 58.296875 8.875 -C 64.796875 14.75 68.5 23.625 68.5 33.296875 -C 68.5 42.28125 65.5 50.046875 60 55.53125 -C 53.203125 62.40625 42.296875 66 28.59375 66 -L 1.59375 66 -L 1.59375 64.09375 -C 9.5 63.390625 10.40625 62.5 10.40625 55.078125 -z -M 20.59375 58.40625 -C 20.59375 61.5 21.703125 62.296875 25.796875 62.296875 -C 34.40625 62.296875 40.90625 60.703125 45.703125 57.3125 -C 53.5 51.921875 57.59375 43.359375 57.59375 32.609375 -C 57.59375 20.84375 53.5 12.46875 45.40625 7.78125 -C 40.296875 4.90625 34.5 3.703125 25.796875 3.703125 -C 21.796875 3.703125 20.59375 4.59375 20.59375 7.78125 -z -" id="Nimbus_Roman_No9_L_Regular-68"/> - <path d="M 40.796875 16.453125 -C 36 8.8125 31.703125 5.90625 25.296875 5.90625 -C 19.59375 5.90625 15.296875 8.8125 12.40625 14.53125 -C 10.59375 18.34375 9.90625 21.65625 9.703125 27.796875 -L 40.5 27.796875 -C 39.703125 34.265625 38.703125 37.140625 36.203125 40.328125 -C 33.203125 43.921875 28.59375 46 23.40625 46 -C 18.40625 46 13.703125 44.203125 9.90625 40.796875 -C 5.203125 36.703125 2.5 29.59375 2.5 21.40625 -C 2.5 7.59375 9.703125 -1 21.203125 -1 -C 30.703125 -1 38.203125 4.921875 42.40625 15.75 -z -M 9.90625 31 -C 11 38.734375 14.40625 42.40625 20.5 42.40625 -C 26.59375 42.40625 29 39.609375 30.296875 31 -z -" id="Nimbus_Roman_No9_L_Regular-101"/> - <path d="M 1.59375 40.296875 -C 2.203125 40.59375 3.203125 40.703125 4.296875 40.703125 -C 7.09375 40.703125 8 39.203125 8 34.296875 -L 8 9.5 -C 8 3.796875 6.90625 2.40625 1.796875 2 -L 1.796875 0.5 -L 23 0.5 -L 23 2 -C 17.90625 2.40625 16.40625 3.59375 16.40625 7.203125 -L 16.40625 35.296875 -C 21.203125 39.796875 23.40625 41 26.703125 41 -C 31.59375 41 34 37.90625 34 31.296875 -L 34 10.40625 -C 34 4.09375 32.703125 2.40625 27.703125 2 -L 27.703125 0.5 -L 48.5 0.5 -L 48.5 2 -C 43.59375 2.5 42.40625 3.703125 42.40625 8.59375 -L 42.40625 31.5 -C 42.40625 40.90625 38 46.5 30.59375 46.5 -C 26 46.5 22.90625 44.796875 16.09375 38.40625 -L 16.09375 46.296875 -L 15.40625 46.5 -C 10.5 44.703125 7.09375 43.59375 1.59375 42 -z -" id="Nimbus_Roman_No9_L_Regular-110"/> - <path d="M 31.5 31.40625 -L 31.09375 45 -L 30 45 -L 29.796875 44.796875 -C 28.90625 44.09375 28.796875 44 28.40625 44 -C 27.796875 44 26.796875 44.203125 25.703125 44.703125 -C 23.5 45.546875 21.296875 46 18.703125 46 -C 10.796875 46 5.09375 40.875 5.09375 33.65625 -C 5.09375 28.0625 8.296875 24.046875 16.796875 19.234375 -L 22.59375 15.9375 -C 26.09375 13.9375 27.796875 11.515625 27.796875 8.421875 -C 27.796875 4 24.59375 1.203125 19.5 1.203125 -C 16.09375 1.203125 13 2.484375 11.09375 4.65625 -C 9 7.109375 8.09375 9.375 6.796875 15 -L 5.203125 15 -L 5.203125 -0.609375 -L 6.5 -0.609375 -C 7.203125 0.515625 7.59375 0.75 8.796875 0.75 -C 9.703125 0.75 11.09375 0.546875 13.40625 -0.03125 -C 16.203125 -0.609375 18.90625 -1 20.703125 -1 -C 28.40625 -1 34.796875 4.8125 34.796875 11.828125 -C 34.796875 16.828125 32.40625 20.140625 26.40625 23.75 -L 15.59375 30.15625 -C 12.796875 31.765625 11.296875 34.28125 11.296875 36.984375 -C 11.296875 41 14.40625 43.796875 19 43.796875 -C 24.703125 43.796875 27.703125 40.359375 30 31.40625 -z -" id="Nimbus_Roman_No9_L_Regular-115"/> - <path d="M 17.5 45.765625 -L 2 40.296875 -L 2 38.8125 -L 2.796875 38.90625 -C 4 39.09375 5.296875 39.203125 6.203125 39.203125 -C 8.59375 39.203125 9.5 37.59375 9.5 33.203125 -L 9.5 10 -C 9.5 2.796875 8.5 1.703125 1.59375 1.703125 -L 1.59375 0 -L 25.296875 0 -L 25.296875 1.5 -C 18.703125 2 17.90625 2.984375 17.90625 10.15625 -L 17.90625 45.46875 -z -M 12.796875 68 -C 10.09375 68 7.796875 65.703125 7.796875 62.90625 -C 7.796875 60.109375 10 57.796875 12.796875 57.796875 -C 15.703125 57.796875 18 60 18 62.90625 -C 18 65.703125 15.703125 68 12.796875 68 -z -" id="Nimbus_Roman_No9_L_Regular-105"/> - <path d="M 25.5 45 -L 15.40625 45 -L 15.40625 56.59375 -C 15.40625 57.59375 15.296875 57.90625 14.703125 57.90625 -C 14 57 13.40625 56.09375 12.703125 55.09375 -C 8.90625 49.59375 4.59375 44.796875 3 44.390625 -C 1.90625 43.65625 1.296875 42.9375 1.296875 42.421875 -C 1.296875 42.109375 1.40625 41.90625 1.703125 41.90625 -L 7 41.90625 -L 7 11.734375 -C 7 3.3125 10 -1 15.90625 -1 -C 20.796875 -1 24.59375 1.40625 27.90625 6.609375 -L 26.59375 7.703125 -C 24.5 5.203125 22.796875 4.203125 20.59375 4.203125 -C 16.90625 4.203125 15.40625 6.921875 15.40625 13.234375 -L 15.40625 41.90625 -L 25.5 41.90625 -z -" id="Nimbus_Roman_No9_L_Regular-116"/> - <path d="M 47.5 45 -L 34 45 -L 34 43.5 -C 37.203125 43.5 38.796875 42.59375 38.796875 40.984375 -C 38.796875 40.578125 38.703125 39.984375 38.40625 39.28125 -L 28.703125 11.59375 -L 17.203125 37.140625 -C 16.59375 38.5625 16.203125 39.875 16.203125 40.96875 -C 16.203125 42.796875 17.703125 43.5 22 43.5 -L 22 45 -L 1.40625 45 -L 1.40625 43.59375 -C 4 43.203125 5.703125 42.09375 6.5 40.390625 -L 17.90625 15.703125 -L 18.203125 14.890625 -L 19.703125 11.890625 -C 22.5 6.875 24.09375 3.265625 24.09375 1.75 -C 24.09375 0.25 21.796875 -6.078125 20.09375 -9.09375 -C 18.703125 -11.703125 16.5 -13.609375 15.09375 -13.609375 -C 14.5 -13.609375 13.59375 -13.40625 12.59375 -12.90625 -C 10.703125 -12.203125 9 -11.796875 7.296875 -11.796875 -C 5 -11.796875 3 -13.796875 3 -16.203125 -C 3 -19.5 6.203125 -22 10.40625 -22 -C 17.09375 -22 21.90625 -16.390625 27.296875 -1.9375 -L 42.703125 38.984375 -C 44 42.203125 45.09375 43.203125 47.5 43.5 -z -" id="Nimbus_Roman_No9_L_Regular-121"/> - <path d="M 46 11.546875 -L 43.90625 8.9375 -C 41 5.234375 39.203125 3.625 37.796875 3.625 -C 37 3.625 36.203125 4.421875 36.203125 5.21875 -C 36.203125 5.9375 36.203125 5.9375 37.59375 11.53125 -L 43.296875 32.1875 -C 43.796875 34.28125 44.203125 36.484375 44.203125 37.890625 -C 44.203125 41.5 41.5 44 37.59375 44 -C 31.203125 44 24.90625 38 14.59375 21.96875 -L 21.296875 43.796875 -L 21 43.984375 -C 15.59375 42.890625 13.5 42.5 4.796875 40.90625 -L 4.796875 39.21875 -C 9.90625 39.21875 11.203125 38.625 11.203125 36.609375 -C 11.203125 36 11.09375 35.40625 11 34.90625 -L 1.40625 -0.1875 -L 8.90625 -0.1875 -C 13.59375 15.65625 14.5 17.875 18.90625 24.6875 -C 24.90625 33.890625 30 38.921875 33.703125 38.921875 -C 35.203125 38.921875 36.09375 37.8125 36.09375 36 -C 36.09375 34.8125 35.5 31.5 34.703125 28.390625 -L 30.296875 11.84375 -C 29 6.734375 28.703125 5.328125 28.703125 4.328125 -C 28.703125 0.515625 30.09375 -1.078125 33.40625 -1.078125 -C 37.90625 -1.078125 40.5 1.03125 47.40625 10.25 -z -" id="Nimbus_Roman_No9_L_Regular_Italic-110"/> - <path d="M 20.90625 36 -L 20.90625 55.203125 -C 20.90625 62.34375 22 63.421875 29.703125 64.125 -L 29.703125 66 -L 1.90625 66 -L 1.90625 64.125 -C 9.59375 63.421875 10.703125 62.328125 10.703125 55.109375 -L 10.703125 11.703125 -C 10.703125 3.28125 9.703125 2.09375 1.90625 2.09375 -L 1.90625 0 -L 29.703125 0 -L 29.703125 1.890625 -C 22.203125 2.484375 20.90625 3.78125 20.90625 10.921875 -L 20.90625 31.59375 -L 51.203125 31.59375 -L 51.203125 11.828125 -C 51.203125 3.296875 50.203125 2.09375 42.40625 2.09375 -L 42.40625 0 -L 70.203125 0 -L 70.203125 1.890625 -C 62.703125 2.484375 61.40625 3.78125 61.40625 10.875 -L 61.40625 55.140625 -C 61.40625 62.328125 62.5 63.421875 70.203125 64.125 -L 70.203125 66 -L 42.40625 66 -L 42.40625 64.125 -C 50.09375 63.421875 51.203125 62.34375 51.203125 55.203125 -L 51.203125 36 -z -" id="Nimbus_Roman_No9_L_Regular-72"/> - <path d="M 25.5 -25 -L 25.5 -20.984375 -L 15.796875 -20.984375 -L 15.796875 71 -L 25.5 71 -L 25.5 75.015625 -L 11.796875 75.015625 -L 11.796875 -25 -z -" id="CMR10-91"/> - <path d="M 39.796875 15.59375 -C 35 8.59375 31.40625 6.203125 25.703125 6.203125 -C 16.59375 6.203125 10.203125 14.203125 10.203125 25.703125 -C 10.203125 36 15.703125 43.09375 23.796875 43.09375 -C 27.40625 43.09375 28.703125 42 29.703125 38.296875 -L 30.296875 36.09375 -C 31.09375 33.296875 32.90625 31.5 35 31.5 -C 37.59375 31.5 39.796875 33.40625 39.796875 35.703125 -C 39.796875 41.296875 32.796875 46 24.40625 46 -C 19.5 46 14.40625 44 10.296875 40.40625 -C 5.296875 36 2.5 29.203125 2.5 21.296875 -C 2.5 8.296875 10.40625 -1 21.5 -1 -C 26 -1 30 0.59375 33.59375 3.703125 -C 36.296875 6.09375 38.203125 8.796875 41.203125 14.703125 -z -" id="Nimbus_Roman_No9_L_Regular-99"/> - <path d="M 1.90625 39.796875 -C 3.203125 40.09375 4 40.203125 5.09375 40.203125 -C 7.703125 40.203125 8.59375 38.59375 8.59375 33.78125 -L 8.59375 8.421875 -C 8.59375 3 7.203125 1.5 1.59375 1.5 -L 1.59375 0 -L 23.796875 0 -L 23.796875 1.5 -C 18.5 1.5 17 2.59375 17 6.53125 -L 17 34.90625 -C 17 35.09375 17.796875 36.09375 18.5 36.796875 -C 21 39.09375 25.296875 40.796875 28.796875 40.796875 -C 33.203125 40.796875 35.40625 37.265625 35.40625 30.1875 -L 35.40625 8.25 -C 35.40625 2.609375 34.296875 1.5 28.59375 1.5 -L 28.59375 0 -L 51 0 -L 51 1.5 -C 45.296875 1.5 43.796875 3.203125 43.796875 9.421875 -L 43.796875 34.703125 -C 46.796875 39 50.09375 40.796875 54.703125 40.796875 -C 60.40625 40.796875 62.203125 38.09375 62.203125 29.796875 -L 62.203125 8.703125 -C 62.203125 3 61.40625 2.203125 55.59375 1.5 -L 55.59375 0 -L 77.5 0 -L 77.5 1.5 -L 74.90625 1.796875 -C 71.90625 1.796875 70.59375 3.59375 70.59375 7.5 -L 70.59375 28.15625 -C 70.59375 39.984375 66.703125 46 59 46 -C 53.203125 46 48.09375 43.40625 42.703125 37.609375 -C 40.90625 43.296875 37.5 46 32.09375 46 -C 27.703125 46 24.90625 44.59375 16.59375 38.296875 -L 16.59375 45.796875 -L 15.90625 46 -C 10.796875 44.09375 7.40625 43 1.90625 41.5 -z -" id="Nimbus_Roman_No9_L_Regular-109"/> - <path d="M 15.296875 33.40625 -C 21.203125 33.40625 23.5 33.203125 25.90625 32.3125 -C 32.09375 30.109375 36 24.40625 36 17.5 -C 36 9.109375 30.296875 2.609375 22.90625 2.609375 -C 20.203125 2.609375 18.203125 3.3125 14.5 5.703125 -C 11.5 7.5 9.796875 8.203125 8.09375 8.203125 -C 5.796875 8.203125 4.296875 6.8125 4.296875 4.703125 -C 4.296875 1.203125 8.59375 -1 15.59375 -1 -C 23.296875 -1 31.203125 1.609375 35.90625 5.703125 -C 40.59375 9.8125 43.203125 15.609375 43.203125 22.3125 -C 43.203125 27.40625 41.59375 32.109375 38.703125 35.203125 -C 36.703125 37.40625 34.796875 38.609375 30.40625 40.5 -C 37.296875 45.203125 39.796875 48.90625 39.796875 54.3125 -C 39.796875 62.40625 33.40625 68 24.203125 68 -C 19.203125 68 14.796875 66.3125 11.203125 63.109375 -C 8.203125 60.40625 6.703125 57.796875 4.5 51.796875 -L 6 51.40625 -C 10.09375 58.703125 14.59375 62 20.90625 62 -C 27.40625 62 31.90625 57.609375 31.90625 51.3125 -C 31.90625 47.703125 30.40625 44.109375 27.90625 41.609375 -C 24.90625 38.609375 22.09375 37.109375 15.296875 34.703125 -z -" id="Nimbus_Roman_No9_L_Regular-51"/> - <path d="M 15.90625 75.015625 -L 2.203125 75.015625 -L 2.203125 71 -L 11.90625 71 -L 11.90625 -20.984375 -L 2.203125 -20.984375 -L 2.203125 -25 -L 15.90625 -25 -z -" id="CMR10-93"/> + <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(91.250474 222.339856)scale(0.1 -0.1)"> - <use transform="translate(0 15.050129)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-68"/> - <use transform="translate(71.929985 15.050129)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-101"/> - <use transform="translate(116.163554 15.050129)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-110"/> - <use transform="translate(165.976754 15.050129)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-115"/> - <use transform="translate(204.73046 15.050129)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-105"/> - <use transform="translate(232.42563 15.050129)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-116"/> - <use transform="translate(260.120799 15.050129)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-121"/> - <use transform="translate(341.163113 15.050129)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular_Italic-110"/> - <use transform="translate(390.976313 0)scale(0.737241)" xlink:href="#Nimbus_Roman_No9_L_Regular-72"/> - <use transform="translate(475.932143 15.050129)scale(0.996264)" xlink:href="#CMR10-91"/> - <use transform="translate(503.52765 15.050129)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-99"/> - <use transform="translate(547.761218 15.050129)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-109"/> - <use transform="translate(625.269588 51.213361)scale(0.737241)" xlink:href="#CMSY10-0"/> - <use transform="translate(682.552458 51.213361)scale(0.737241)" xlink:href="#Nimbus_Roman_No9_L_Regular-51"/> - <use transform="translate(719.912632 15.050129)scale(0.996264)" xlink:href="#CMR10-93"/> + <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> @@ -601,88 +1093,151 @@ z <defs> <path d="M 0 0 L -3.5 0 -" id="mec8c027021" style="stroke:#000000;stroke-width:0.8;"/> +" id="me1123541e6" style="stroke:#000000;stroke-width:0.8;"/> </defs> <g> - <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#mec8c027021" y="163.232825"/> + <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#me1123541e6" y="163.232825"/> </g> </g> <g id="text_7"> - <!-- $10^{2}$ --> - <g transform="translate(13.371186 166.692074)scale(0.1 -0.1)"> - <use transform="scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-49"/> - <use transform="translate(49.8132 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-48"/> - <use transform="translate(99.626401 36.163231)scale(0.737241)" xlink:href="#Nimbus_Roman_No9_L_Regular-50"/> + <!-- $\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="#mec8c027021" y="114.470825"/> + <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#me1123541e6" y="114.470825"/> </g> </g> <g id="text_8"> - <!-- $10^{3}$ --> - <g transform="translate(13.371186 117.930074)scale(0.1 -0.1)"> - <use transform="scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-49"/> - <use transform="translate(49.8132 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-48"/> - <use transform="translate(99.626401 36.163231)scale(0.737241)" xlink:href="#Nimbus_Roman_No9_L_Regular-51"/> + <!-- $\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="#mec8c027021" y="65.708825"/> + <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#me1123541e6" y="65.708825"/> </g> </g> <g id="text_9"> - <!-- $10^{4}$ --> - <g transform="translate(13.371186 69.168074)scale(0.1 -0.1)"> - <use transform="scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-49"/> - <use transform="translate(49.8132 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-48"/> - <use transform="translate(99.626401 36.163231)scale(0.737241)" xlink:href="#Nimbus_Roman_No9_L_Regular-52"/> + <!-- $\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="#mec8c027021" y="16.946825"/> + <use style="stroke:#000000;stroke-width:0.8;" x="34.02" xlink:href="#me1123541e6" y="16.946825"/> </g> </g> <g id="text_10"> - <!-- $10^{5}$ --> + <!-- $\mathdefault{10^{5}}$ --> <defs> - <path d="M 18.09375 59 -L 37.703125 59 -C 39.296875 59 39.703125 59.203125 40 59.90625 -L 43.796875 68.796875 -L 42.90625 69.5 -C 41.40625 67.40625 40.40625 66.90625 38.296875 66.90625 -L 17.40625 66.90625 -L 6.5 43.109375 -C 6.40625 42.90625 6.40625 42.8125 6.40625 42.609375 -C 6.40625 42.109375 6.796875 41.8125 7.59375 41.8125 -C 10.796875 41.8125 14.796875 41.109375 18.90625 39.796875 -C 30.40625 36.078125 35.703125 29.84375 35.703125 19.90625 -C 35.703125 10.25 29.59375 2.703125 21.796875 2.703125 -C 19.796875 2.703125 18.09375 3.40625 15.09375 5.625 -C 11.90625 7.9375 9.59375 8.9375 7.5 8.9375 -C 4.59375 8.9375 3.203125 7.734375 3.203125 5.21875 -C 3.203125 1.40625 7.90625 -1 15.40625 -1 -C 23.796875 -1 31 1.71875 36 6.84375 -C 40.59375 11.375 42.703125 17.09375 42.703125 24.734375 -C 42.703125 31.96875 40.796875 36.59375 35.796875 41.609375 -C 31.40625 46.046875 25.703125 48.34375 13.90625 50.453125 -z -" id="Nimbus_Roman_No9_L_Regular-53"/> + <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.371186 20.406074)scale(0.1 -0.1)"> - <use transform="scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-49"/> - <use transform="translate(49.8132 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-48"/> - <use transform="translate(99.626401 36.163231)scale(0.737241)" xlink:href="#Nimbus_Roman_No9_L_Regular-53"/> + <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> @@ -691,470 +1246,516 @@ z <defs> <path d="M 0 0 L -2 0 -" id="mc0ad7d39b4" style="stroke:#000000;stroke-width:0.6;"/> +" id="m389a2448bd" style="stroke:#000000;stroke-width:0.6;"/> </defs> <g> - <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#mc0ad7d39b4" y="197.316"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="188.729438"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="182.637175"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="177.911649"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="174.050613"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="170.786154"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="167.958351"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="165.464051"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="148.554"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="139.967438"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="133.875175"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="129.149649"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="125.288613"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="122.024154"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="119.196351"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="116.702051"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="99.792"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="91.205438"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="85.113175"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="80.387649"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="76.526613"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="73.262154"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="70.434351"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="67.940051"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="51.03"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="42.443438"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="36.351175"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="31.625649"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="27.764613"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="24.500154"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="21.672351"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="19.178051"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" 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="#mc0ad7d39b4" y="2.268"/> + <use style="stroke:#000000;stroke-width:0.6;" x="34.02" xlink:href="#m389a2448bd" y="2.268"/> </g> </g> </g> <g id="text_11"> - <!-- ${\rm Temperature}~T~[{\rm K}]$ --> + <!-- Temperature $T$ [K] --> <defs> - <path d="M 25.40625 62 -L 25.40625 11.734375 -C 25.40625 3.1875 24.296875 2.09375 16 2.09375 -L 16 0 -L 45.203125 0 -L 45.203125 2.09375 -C 37 2.09375 35.59375 3.390625 35.59375 10.734375 -L 35.59375 62 -L 41 62 -C 52.40625 62 54.59375 60.203125 56.90625 49.203125 -L 59.296875 49.203125 -L 58.703125 66.203125 -L 2.296875 66.203125 -L 1.703125 49.203125 -L 4.09375 49.203125 -C 6.5 60.09375 8.796875 62 20 62 -z -" id="Nimbus_Roman_No9_L_Regular-84"/> - <path d="M 0.90625 39.3125 -C 1.796875 39.40625 2.5 39.40625 3.40625 39.40625 -C 6.796875 39.40625 7.5 38.40625 7.5 33.671875 -L 7.5 -13.359375 -C 7.5 -18.578125 6.40625 -19.703125 0.5 -20.296875 -L 0.5 -22 -L 24.703125 -22 -L 24.703125 -20.203125 -C 17.203125 -20.203125 15.90625 -19.09375 15.90625 -12.75 -L 15.90625 3.109375 -C 19.40625 -0.203125 21.796875 -1.203125 26 -1.203125 -C 37.796875 -1.203125 47 10.046875 47 24.609375 -C 47 37.0625 40 46 30.296875 46 -C 24.703125 46 20.296875 43.5 15.90625 38.09375 -L 15.90625 45.796875 -L 15.296875 46 -C 9.90625 43.90625 6.40625 42.59375 0.90625 40.90625 -z -M 15.90625 33.375 -C 15.90625 36.390625 21.5 40 26.09375 40 -C 33.5 40 38.40625 32.359375 38.40625 20.6875 -C 38.40625 9.546875 33.5 2 26.296875 2 -C 21.59375 2 15.90625 5.609375 15.90625 8.625 -z -" id="Nimbus_Roman_No9_L_Regular-112"/> - <path d="M 0.703125 39 -C 2.09375 39.296875 3 39.40625 4.203125 39.40625 -C 6.703125 39.40625 7.59375 37.796875 7.59375 33.40625 -L 7.59375 8.40625 -C 7.59375 3.40625 6.90625 2.703125 0.5 1.5 -L 0.5 0 -L 24.5 0 -L 24.5 1.59375 -C 17.703125 1.59375 16 3.109375 16 8.828125 -L 16 31.453125 -C 16 34.671875 20.296875 39.703125 23 39.703125 -C 23.59375 39.703125 24.5 39.203125 25.59375 38.203125 -C 27.203125 36.796875 28.296875 36.203125 29.59375 36.203125 -C 32 36.203125 33.5 37.90625 33.5 40.703125 -C 33.5 44 31.40625 46 28 46 -C 23.796875 46 20.90625 43.703125 16 36.609375 -L 16 45.796875 -L 15.5 46 -C 10.203125 43.796875 6.59375 42.515625 0.703125 40.609375 -z -" id="Nimbus_Roman_No9_L_Regular-114"/> - <path d="M 44.203125 6.609375 -C 42.5 5.203125 41.296875 4.703125 39.796875 4.703125 -C 37.5 4.703125 36.796875 6.09375 36.796875 10.5 -L 36.796875 30 -C 36.796875 35.203125 36.296875 38.09375 34.796875 40.5 -C 32.59375 44.09375 28.296875 46 22.40625 46 -C 13 46 5.59375 41.09375 5.59375 34.796875 -C 5.59375 32.5 7.59375 30.5 9.90625 30.5 -C 12.296875 30.5 14.40625 32.5 14.40625 34.703125 -C 14.40625 35.09375 14.296875 35.59375 14.203125 36.296875 -C 14 37.203125 13.90625 38 13.90625 38.703125 -C 13.90625 41.40625 17.09375 43.59375 21.09375 43.59375 -C 26 43.59375 28.703125 40.703125 28.703125 35.296875 -L 28.703125 29.203125 -C 13.296875 23 11.59375 22.203125 7.296875 18.40625 -C 5.09375 16.40625 3.703125 13 3.703125 9.703125 -C 3.703125 3.40625 8.09375 -1 14.203125 -1 -C 18.59375 -1 22.703125 1.09375 28.796875 6.296875 -C 29.296875 1.09375 31.09375 -1 35.203125 -1 -C 38.59375 -1 40.703125 0.203125 44.203125 4 -z -M 28.703125 12.234375 -C 28.703125 9.125 28.203125 8.21875 26.09375 7.015625 -C 23.703125 5.609375 20.90625 4.703125 18.796875 4.703125 -C 15.296875 4.703125 12.5 8.125 12.5 12.4375 -L 12.5 12.84375 -C 12.5 18.765625 16.59375 22.390625 28.703125 26.796875 -z -" id="Nimbus_Roman_No9_L_Regular-97"/> - <path d="M 47.90625 5 -L 47.40625 5 -C 42.796875 5 41.703125 6.09375 41.703125 10.703125 -L 41.703125 45 -L 25.90625 45 -L 25.90625 43.09375 -C 32.09375 43.09375 33.296875 42.09375 33.296875 37.109375 -L 33.296875 13.671875 -C 33.296875 10.890625 32.796875 9.484375 31.40625 8.390625 -C 28.703125 6.203125 25.59375 5 22.59375 5 -C 18.703125 5 15.5 8.390625 15.5 12.578125 -L 15.5 45 -L 0.90625 45 -L 0.90625 43.40625 -C 5.703125 43.40625 7.09375 41.90625 7.09375 37.296875 -L 7.09375 12.03125 -C 7.09375 4.109375 11.90625 -1 19.203125 -1 -C 22.90625 -1 26.796875 0.59375 29.5 3.296875 -L 33.796875 7.59375 -L 33.796875 -0.703125 -L 34.203125 -0.90625 -C 39.203125 1.09375 42.796875 2.203125 47.90625 3.59375 -z -" id="Nimbus_Roman_No9_L_Regular-117"/> - <path d="M 63.296875 65 -L 10.09375 65 -L 5.90625 49.671875 -L 7.703125 49.265625 -C 13 59.921875 16.203125 61.609375 31.5 61.609375 -L 17.09375 8.984375 -C 15.5 3.6875 13.09375 2.09375 6.5 1.59375 -L 6.5 0 -L 35.5 0 -L 35.5 1.59375 -C 33.796875 1.59375 32.296875 2 31.703125 2 -C 27.703125 2 26.5 2.890625 26.5 5.90625 -C 26.5 7.203125 26.796875 8.390625 27.703125 11.78125 -L 41.59375 61.609375 -L 47.09375 61.609375 -C 54.296875 61.609375 57.5 59.09375 57.5 53.46875 -C 57.5 52.171875 57.40625 50.6875 57.203125 48.96875 -L 58.90625 48.765625 -z -" id="Nimbus_Roman_No9_L_Regular_Italic-84"/> - <path d="M 41.296875 64.203125 -C 42.5 64 43.5 64 43.90625 64 -C 46.90625 64 48.09375 63.203125 48.09375 61.203125 -C 48.09375 58.984375 45.796875 55.984375 40.296875 50.890625 -L 22.59375 34.75 -L 22.59375 55.21875 -C 22.59375 62.5 23.703125 63.609375 31.796875 64.203125 -L 31.796875 66.109375 -L 3.40625 66.109375 -L 3.40625 64.203125 -C 11.203125 63.609375 12.40625 62.3125 12.40625 55.171875 -L 12.40625 11.71875 -C 12.40625 3.390625 11.296875 2.09375 3.40625 2.09375 -L 3.40625 0 -L 31.59375 0 -L 31.59375 2.09375 -C 23.796875 2.09375 22.59375 3.296875 22.59375 10.671875 -L 22.59375 29.546875 -L 25.203125 31.65625 -L 35.796875 21.171875 -C 43.40625 13.6875 48.796875 6.59375 48.796875 4.203125 -C 48.796875 2.796875 47.40625 2.09375 44.59375 2.09375 -C 44.09375 2.09375 43 2.09375 41.796875 1.890625 -L 41.796875 0 -L 72.296875 0 -L 72.296875 2.09375 -C 67.09375 2.09375 65.703125 3.09375 56.59375 12.75 -L 33.296875 37.640625 -L 52.296875 56.421875 -C 59.09375 62.90625 60.703125 63.703125 67.5 64.203125 -L 67.5 66.109375 -L 41.296875 66.109375 -z -" id="Nimbus_Roman_No9_L_Regular-75"/> + <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.880526 137.975632)rotate(-90)scale(0.1 -0.1)"> - <use transform="scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-84"/> - <use transform="translate(53.898284 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-101"/> - <use transform="translate(98.131853 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-109"/> - <use transform="translate(175.640223 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-112"/> - <use transform="translate(225.453424 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-101"/> - <use transform="translate(269.686992 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-114"/> - <use transform="translate(302.862222 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-97"/> - <use transform="translate(347.095791 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-116"/> - <use transform="translate(374.79096 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-117"/> - <use transform="translate(424.604161 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-114"/> - <use transform="translate(457.779391 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-101"/> - <use transform="translate(533.242072 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular_Italic-84"/> - <use transform="translate(632.514439 0)scale(0.996264)" xlink:href="#CMR10-91"/> - <use transform="translate(660.109945 0)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular-75"/> - <use transform="translate(732.03993 0)scale(0.996264)" xlink:href="#CMR10-93"/> + <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(#p107a2e5a22)" d="M 77.714425 70.434351 + <path clip-path="url(#pf19aa30d2c)" 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(#p107a2e5a22)" d="M 146.991516 85.113175 + <path clip-path="url(#pf19aa30d2c)" 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(#p107a2e5a22)" d="M -1 70.434351 + <path clip-path="url(#pf19aa30d2c)" 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(#p107a2e5a22)" d="M -1 85.113175 + <path clip-path="url(#pf19aa30d2c)" 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(#p107a2e5a22)" d="M 77.714425 197.316 + <path clip-path="url(#pf19aa30d2c)" 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(#p107a2e5a22)" d="M 146.991516 197.316 + <path clip-path="url(#pf19aa30d2c)" 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(#p107a2e5a22)" d="M 68.658545 43.904505 + <path clip-path="url(#pf19aa30d2c)" 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(#p107a2e5a22)" d="M 155.254909 57.122263 + <path clip-path="url(#pf19aa30d2c)" 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> @@ -1179,923 +1780,732 @@ 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}~\widehat{}~{\tt Cool\_gamma\_effective}$ --> + <!-- $n_{\rm H}$^Cool_gamma_effective --> <defs> - <path d="M 27.703125 68.5 -L 54.90625 56.203125 -L 56.09375 58.40625 -L 27.796875 74.40625 -L -0.5 58.40625 -L 0.59375 56.203125 -z -" id="CMEX10-98"/> - <path d="M 47.40625 58.296875 -C 47.40625 59.890625 47.40625 62.09375 44.59375 62.09375 -C 42.796875 62.09375 42.296875 61 41.90625 60.296875 -C 41.59375 59.5 40.796875 57.703125 40.5 57 -C 36.40625 60.59375 31.796875 62.09375 27.59375 62.09375 -C 14.703125 62.09375 4 48.390625 4 30.59375 -C 4 12.40625 15 -1 27.59375 -1 -C 39.296875 -1 47.40625 8.21875 47.40625 16.96875 -C 47.40625 20.03125 45.296875 20.03125 44.09375 20.03125 -C 42.703125 20.03125 41.09375 19.53125 40.90625 17.859375 -C 40.09375 5.109375 30 5.109375 28.296875 5.109375 -C 19 5.109375 10.5 15.859375 10.5 30.75 -C 10.5 45.65625 19.09375 56.296875 28.203125 56.296875 -C 33.59375 56.296875 39.5 52 40.90625 42.796875 -C 41.203125 40.59375 42.09375 40 44.09375 40 -C 47.40625 40 47.40625 41.796875 47.40625 43.796875 -z -" id="CMTT12-67"/> - <path d="M 45.59375 21.640625 -C 45.59375 34.109375 36.5 44 25.703125 44 -C 14.90625 44 5.796875 34.109375 5.796875 21.640625 -C 5.796875 9.078125 15 -0.5 25.703125 -0.5 -C 36.40625 -0.5 45.59375 9.078125 45.59375 21.640625 -z -M 25.703125 5.296875 -C 18.5 5.296875 12.296875 12.875 12.296875 22.34375 -C 12.296875 31.609375 18.703125 38.203125 25.703125 38.203125 -C 32.703125 38.203125 39.09375 31.609375 39.09375 22.34375 -C 39.09375 12.78125 32.90625 5.296875 25.703125 5.296875 -z -" id="CMTT12-111"/> - <path d="M 29 56.90625 -C 29 60 28.40625 61 25 61 -L 10.296875 61 -C 8.90625 61 6.296875 61 6.296875 58.109375 -C 6.296875 55.203125 8.90625 55.203125 10.296875 55.203125 -L 22.5 55.203125 -L 22.5 5.796875 -L 10.296875 5.796875 -C 8.90625 5.796875 6.296875 5.796875 6.296875 2.90625 -C 6.296875 0 8.90625 0 10.296875 0 -L 41.203125 0 -C 42.59375 0 45.203125 0 45.203125 2.90625 -C 45.203125 5.796875 42.59375 5.796875 41.203125 5.796875 -L 29 5.796875 -z -" id="CMTT12-108"/> - <path d="M 19 6.59375 -C 17.796875 6.59375 13.203125 6.59375 13.203125 12.015625 -C 13.203125 13.921875 13.5 14.3125 13.90625 15.109375 -C 15.90625 13.703125 19.203125 12.40625 22.796875 12.40625 -C 31.90625 12.40625 38.90625 19.703125 38.90625 28.28125 -C 38.90625 30.78125 38.296875 33.890625 36.203125 37.1875 -C 38.796875 38.421875 41.203125 38.703125 42.703125 38.703125 -C 43.296875 36 46.203125 36 46.296875 36 -C 47.5 36 50 36.796875 50 39.796875 -C 50 41.703125 48.5 45 42.90625 45 -C 41.09375 45 36.59375 44.5625 32.40625 40.90625 -C 29.09375 43.203125 25.703125 44 22.90625 44 -C 13.796875 44 6.796875 36.765625 6.796875 28.21875 -C 6.796875 26.03125 7.296875 22.265625 10.09375 18.703125 -C 8.203125 15.90625 7.90625 12.90625 7.90625 11.703125 -C 7.90625 8.203125 9.59375 5.40625 10.40625 4.5 -C 4.90625 1.484375 2.90625 -3.9375 2.90625 -7.84375 -C 2.90625 -16.171875 13 -22.5 25.703125 -22.5 -C 38.40625 -22.5 48.5 -16.28125 48.5 -7.84375 -C 48.5 6.59375 30.796875 6.59375 27.5 6.59375 -z -M 22.796875 18 -C 17.796875 18 13.296875 22.359375 13.296875 28.203125 -C 13.296875 34.046875 17.90625 38.390625 22.796875 38.390625 -C 28.09375 38.390625 32.40625 33.84375 32.40625 28.203125 -C 32.40625 22.546875 28.09375 18 22.796875 18 -z -M 25.703125 -16.890625 -C 15.90625 -16.890625 8.59375 -12.484375 8.59375 -7.84375 -C 8.59375 -6.328125 9.09375 -2.8125 12.796875 -0.515625 -C 15.09375 1 16.09375 1 23 1 -C 31.796875 1 42.796875 1 42.796875 -7.84375 -C 42.796875 -12.484375 35.5 -16.890625 25.703125 -16.890625 -z -" id="CMTT12-103"/> - <path d="M 41.40625 28.375 -C 41.40625 35.984375 35.703125 44 22.203125 44 -C 18 44 8.296875 44 8.296875 37.1875 -C 8.296875 34.53125 10.203125 33.046875 12.40625 33.046875 -C 13 33.046875 16.296875 33.046875 16.40625 37.3125 -C 16.40625 37.796875 16.5 37.90625 18.59375 38.09375 -C 19.796875 38.203125 21.09375 38.203125 22.296875 38.203125 -C 24.59375 38.203125 28 38.203125 31.296875 35.65625 -C 34.90625 32.8125 34.90625 29.9375 34.90625 27 -C 29 27 23.203125 27 17 24.984375 -C 12 23.265625 5.59375 19.625 5.59375 12.75 -C 5.59375 5.5625 11.90625 -0.5 21.203125 -0.5 -C 24.40625 -0.5 30.59375 0 35.796875 3.53125 -C 37.796875 0 42.796875 0 46.59375 0 -C 49 0 51.40625 0 51.40625 2.859375 -C 51.40625 5.703125 48.796875 5.703125 47.40625 5.703125 -C 44.796875 5.703125 42.796875 5.90625 41.40625 6.515625 -z -M 34.90625 13.296875 -C 34.90625 11 34.90625 8.890625 30.796875 7 -C 27.296875 5.296875 22.59375 5.296875 22.296875 5.296875 -C 16.40625 5.296875 12.09375 8.5 12.09375 12.59375 -C 12.09375 18.5 22.796875 21.890625 34.90625 21.890625 -z -" id="CMTT12-97"/> - <path d="M 45.296875 30.359375 -C 45.296875 32.5625 45.296875 43.796875 36.5 43.796875 -C 33 43.796875 29.59375 42.1875 26.90625 38.484375 -C 26.296875 39.984375 24.09375 43.796875 19.296875 43.796875 -C 14.796875 43.796875 11.703125 40.828125 10.90625 39.921875 -C 10.796875 43 8.703125 43 6.90625 43 -L 3.90625 43 -C 2.5 43 -0.09375 43 -0.09375 40.109375 -C -0.09375 37.203125 2.203125 37.203125 5.296875 37.203125 -L 5.296875 5.796875 -C 2.09375 5.796875 -0.09375 5.796875 -0.09375 2.90625 -C -0.09375 0 2.5 0 3.90625 0 -L 12.296875 0 -C 13.703125 0 16.296875 0 16.296875 2.90625 -C 16.296875 5.796875 14 5.796875 10.90625 5.796875 -L 10.90625 24.25 -C 10.90625 32.671875 14.5 38 18.90625 38 -C 21.703125 38 22.5 34.484375 22.5 29.765625 -L 22.5 5.796875 -C 20.796875 5.796875 18.09375 5.796875 18.09375 2.90625 -C 18.09375 0 20.796875 0 22.203125 0 -L 29.5 0 -C 30.90625 0 33.5 0 33.5 2.90625 -C 33.5 5.796875 31.203125 5.796875 28.09375 5.796875 -L 28.09375 24.25 -C 28.09375 32.671875 31.703125 38 36.09375 38 -C 38.90625 38 39.703125 34.484375 39.703125 29.765625 -L 39.703125 5.796875 -C 38 5.796875 35.296875 5.796875 35.296875 2.90625 -C 35.296875 0 38 0 39.40625 0 -L 46.703125 0 -C 48.09375 0 50.703125 0 50.703125 2.90625 -C 50.703125 5.796875 48.40625 5.796875 45.296875 5.796875 -z -" id="CMTT12-109"/> - <path d="M 41.59375 19.5 -C 43.703125 19.5 45.59375 19.5 45.59375 23.15625 -C 45.59375 34.703125 39 44 26.5 44 -C 14.90625 44 5.59375 34.015625 5.59375 21.84375 -C 5.59375 9.28125 15.703125 -0.5 28 -0.5 -C 40.90625 -0.5 45.59375 8.453125 45.59375 11.078125 -C 45.59375 11.6875 45.40625 13.921875 42.296875 13.921875 -C 40.40625 13.921875 39.796875 13.203125 39.203125 11.6875 -C 36.703125 5.796875 30.203125 5.296875 28.296875 5.296875 -C 20 5.296875 13.40625 11.6875 12.296875 19.5 -z -M 12.40625 25 -C 13.703125 33.3125 20.203125 38.203125 26.5 38.203125 -C 36.5 38.203125 38.59375 29.890625 39 25 -z -" id="CMTT12-101"/> - <path d="M 24.703125 37.203125 -L 36.796875 37.203125 -C 38.203125 37.203125 40.796875 37.203125 40.796875 40.109375 -C 40.796875 43 38.203125 43 36.796875 43 -L 24.703125 43 -L 24.703125 48.078125 -C 24.703125 56 31.703125 56 34.90625 56 -C 34.90625 55.796875 35.703125 52.03125 39 52.03125 -C 40.59375 52.03125 42.90625 53.234375 42.90625 56.0625 -C 42.90625 61.796875 35.296875 61.796875 33.796875 61.796875 -C 26.203125 61.796875 18.203125 57.453125 18.203125 48.453125 -L 18.203125 43 -L 8.296875 43 -C 6.90625 43 4.203125 43 4.203125 40.109375 -C 4.203125 37.203125 6.796875 37.203125 8.203125 37.203125 -L 18.203125 37.203125 -L 18.203125 5.796875 -L 8.703125 5.796875 -C 7.296875 5.796875 4.703125 5.796875 4.703125 2.90625 -C 4.703125 0 7.296875 0 8.703125 0 -L 34.203125 0 -C 35.59375 0 38.203125 0 38.203125 2.90625 -C 38.203125 5.796875 35.59375 5.796875 34.203125 5.796875 -L 24.703125 5.796875 -z -" id="CMTT12-102"/> - <path d="M 45.59375 10.96875 -C 45.59375 13.5625 43.09375 13.5625 42.296875 13.5625 -C 40 13.5625 39.59375 12.765625 39.09375 11.375 -C 36.90625 5.890625 32 5.296875 29.59375 5.296875 -C 21.09375 5.296875 13.90625 12.375 13.90625 21.640625 -C 13.90625 26.734375 16.796875 38.203125 29.90625 38.203125 -C 32.59375 38.203125 34.703125 38 35.59375 37.90625 -C 36.296875 37.703125 36.40625 37.578125 36.40625 37.078125 -C 36.703125 32.921875 39.796875 32.921875 40.40625 32.921875 -C 42.59375 32.921875 44.5 34.421875 44.5 37.109375 -C 44.5 44 34.40625 44 30 44 -C 12.90625 44 7.40625 30.03125 7.40625 21.640625 -C 7.40625 9.484375 16.703125 -0.5 28.703125 -0.5 -C 42.09375 -0.5 45.59375 9.375 45.59375 10.96875 -z -" id="CMTT12-99"/> - <path d="M 21.59375 37.203125 -L 37.796875 37.203125 -C 39.203125 37.203125 41.796875 37.203125 41.796875 40.109375 -C 41.796875 43 39.203125 43 37.796875 43 -L 21.59375 43 -L 21.59375 51.328125 -C 21.59375 53.15625 21.59375 55.5 18.40625 55.5 -C 15.09375 55.5 15.09375 53.15625 15.09375 51.328125 -L 15.09375 43 -L 6.59375 43 -C 5.203125 43 2.5 43 2.5 40.109375 -C 2.5 37.203125 5.09375 37.203125 6.5 37.203125 -L 15.09375 37.203125 -L 15.09375 12.125 -C 15.09375 2.875 21.5 -0.5 28.703125 -0.5 -C 34.09375 -0.5 44 2.171875 44 12.34375 -C 44 14.34375 44 16.53125 40.703125 16.53125 -C 37.5 16.53125 37.5 14.34375 37.5 12.265625 -C 37.40625 6.296875 31.703125 5.296875 29.40625 5.296875 -C 21.59375 5.296875 21.59375 10.265625 21.59375 12.640625 -z -" id="CMTT12-116"/> - <path d="M 30.203125 56.5 -C 30.203125 59 28.203125 61 25.703125 61 -C 23.203125 61 21.203125 59 21.203125 56.5 -C 21.203125 54 23.203125 52 25.703125 52 -C 28.203125 52 30.203125 54 30.203125 56.5 -z -M 13 43 -C 11.59375 43 9 43 9 40.109375 -C 9 37.203125 11.59375 37.203125 13 37.203125 -L 23.703125 37.203125 -L 23.703125 5.796875 -L 12.296875 5.796875 -C 10.90625 5.796875 8.203125 5.796875 8.203125 2.90625 -C 8.203125 0 10.90625 0 12.296875 0 -L 40.09375 0 -C 41.5 0 44.09375 0 44.09375 2.90625 -C 44.09375 5.796875 41.5 5.796875 40.09375 5.796875 -L 30.203125 5.796875 -L 30.203125 38.921875 -C 30.203125 42 29.59375 43 26.203125 43 -z -" id="CMTT12-105"/> - <path d="M 42.40625 37.203125 -L 45 37.203125 -C 46.40625 37.203125 49.09375 37.203125 49.09375 40.109375 -C 49.09375 43 46.40625 43 45 43 -L 34 43 -C 32.59375 43 29.90625 43 29.90625 40.109375 -C 29.90625 37.203125 32.59375 37.203125 34 37.203125 -L 36.5 37.203125 -L 25.703125 5.078125 -L 14.90625 37.203125 -L 17.40625 37.203125 -C 18.796875 37.203125 21.5 37.203125 21.5 40.109375 -C 21.5 43 18.796875 43 17.40625 43 -L 6.40625 43 -C 5 43 2.296875 43 2.296875 40.109375 -C 2.296875 37.203125 5 37.203125 6.40625 37.203125 -L 9 37.203125 -L 20.5 2.890625 -C 21.59375 -0.5 23.796875 -0.5 25.703125 -0.5 -C 27.59375 -0.5 29.796875 -0.5 30.90625 2.890625 -z -" id="CMTT12-118"/> + <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 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-67"/> + <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 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(68.658545 53.766087)scale(0.07 -0.07)"> - <use transform="translate(0 15.050129)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular_Italic-110"/> - <use transform="translate(49.8132 0)scale(0.737241)" xlink:href="#Nimbus_Roman_No9_L_Regular-72"/> - <use transform="translate(107.123069 15.050129)scale(0.996264)" xlink:href="#CMEX10-98"/> - <use transform="translate(165.998143 15.050129)scale(0.996264)" xlink:href="#CMTT12-67"/> - <use transform="translate(217.264254 15.050129)scale(0.996264)" xlink:href="#CMTT12-111"/> - <use transform="translate(268.530365 15.050129)scale(0.996264)" xlink:href="#CMTT12-111"/> - <use transform="translate(319.796475 15.050129)scale(0.996264)" xlink:href="#CMTT12-108"/> - <use transform="translate(404.790082 15.050129)scale(0.996264)" xlink:href="#CMTT12-103"/> - <use transform="translate(456.056192 15.050129)scale(0.996264)" xlink:href="#CMTT12-97"/> - <use transform="translate(507.322303 15.050129)scale(0.996264)" xlink:href="#CMTT12-109"/> - <use transform="translate(558.588414 15.050129)scale(0.996264)" xlink:href="#CMTT12-109"/> - <use transform="translate(609.854525 15.050129)scale(0.996264)" xlink:href="#CMTT12-97"/> - <use transform="translate(694.848131 15.050129)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(746.114242 15.050129)scale(0.996264)" xlink:href="#CMTT12-102"/> - <use transform="translate(797.380353 15.050129)scale(0.996264)" xlink:href="#CMTT12-102"/> - <use transform="translate(848.646464 15.050129)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(899.912575 15.050129)scale(0.996264)" xlink:href="#CMTT12-99"/> - <use transform="translate(951.178685 15.050129)scale(0.996264)" xlink:href="#CMTT12-116"/> - <use transform="translate(1002.444796 15.050129)scale(0.996264)" xlink:href="#CMTT12-105"/> - <use transform="translate(1053.710907 15.050129)scale(0.996264)" xlink:href="#CMTT12-118"/> - <use transform="translate(1104.977018 15.050129)scale(0.996264)" xlink:href="#CMTT12-101"/> - <path d="M 376.683597 15.050129 -L 404.790082 15.050129 -L 404.790082 15.448629 -L 376.683597 15.448629 -L 376.683597 15.050129 -z -"/> - <path d="M 666.741647 15.050129 -L 694.848131 15.050129 -L 694.848131 15.448629 -L 666.741647 15.448629 -L 666.741647 15.050129 -z -"/> + <g transform="translate(68.658545 53.155701)scale(0.06 -0.06)"> + <use transform="translate(0 0.484375)" xlink:href="#Cmmi10-110"/> + <use transform="translate(60.009766 -16.521875)scale(0.7)" xlink:href="#Cmr10-72"/> + <use transform="translate(118.887109 0.484375)" xlink:href="#DejaVuSansMono-94"/> + <use transform="translate(179.092187 0.484375)" xlink:href="#DejaVuSansMono-67"/> + <use transform="translate(239.297266 0.484375)" xlink:href="#DejaVuSansMono-111"/> + <use transform="translate(299.502344 0.484375)" xlink:href="#DejaVuSansMono-111"/> + <use transform="translate(359.707422 0.484375)" xlink:href="#DejaVuSansMono-108"/> + <use transform="translate(419.9125 0.484375)" xlink:href="#DejaVuSansMono-95"/> + <use transform="translate(480.117578 0.484375)" xlink:href="#DejaVuSansMono-103"/> + <use transform="translate(540.322656 0.484375)" xlink:href="#DejaVuSansMono-97"/> + <use transform="translate(600.527734 0.484375)" xlink:href="#DejaVuSansMono-109"/> + <use transform="translate(660.732813 0.484375)" xlink:href="#DejaVuSansMono-109"/> + <use transform="translate(720.937891 0.484375)" xlink:href="#DejaVuSansMono-97"/> + <use transform="translate(781.142969 0.484375)" xlink:href="#DejaVuSansMono-95"/> + <use transform="translate(841.348047 0.484375)" xlink:href="#DejaVuSansMono-101"/> + <use transform="translate(901.553125 0.484375)" xlink:href="#DejaVuSansMono-102"/> + <use transform="translate(961.758203 0.484375)" xlink:href="#DejaVuSansMono-102"/> + <use transform="translate(1021.963281 0.484375)" xlink:href="#DejaVuSansMono-101"/> + <use transform="translate(1082.168359 0.484375)" xlink:href="#DejaVuSansMono-99"/> + <use transform="translate(1142.373437 0.484375)" xlink:href="#DejaVuSansMono-116"/> + <use transform="translate(1202.578516 0.484375)" xlink:href="#DejaVuSansMono-105"/> + <use transform="translate(1262.783594 0.484375)" xlink:href="#DejaVuSansMono-118"/> + <use transform="translate(1322.988672 0.484375)" xlink:href="#DejaVuSansMono-101"/> </g> </g> <g id="text_13"> - <!-- $n_{\rm H}~\widehat{}~{\tt Jeans\_gamma\_effective}$ --> + <!-- $n_{\rm H}$^Jeans_gamma_effective --> <defs> - <path d="M 40 55.203125 -L 42.703125 55.203125 -C 44.09375 55.203125 46.796875 55.203125 46.796875 58.109375 -C 46.796875 61 44.09375 61 42.703125 61 -L 25.796875 61 -C 24.40625 61 21.796875 61 21.796875 58.109375 -C 21.796875 55.203125 24.40625 55.203125 25.796875 55.203125 -L 33.5 55.203125 -L 33.5 14.234375 -C 33.5 5.515625 25.40625 4.90625 23.703125 4.90625 -C 22.5 4.90625 17.5 4.90625 14.90625 7.984375 -C 15.40625 8.59375 15.703125 9.46875 15.703125 10.375 -C 15.703125 12.453125 14.09375 14.34375 11.703125 14.34375 -C 9.40625 14.34375 7.59375 12.84375 7.59375 10.0625 -C 7.59375 3.6875 14.40625 -1 23.59375 -1 -C 32 -1 40 4.265625 40 13.53125 -z -" id="CMTT12-74"/> - <path d="M 41.796875 29.359375 -C 41.796875 39.171875 37.203125 43.796875 29 43.796875 -C 22.203125 43.796875 17.796875 40 16.09375 38.09375 -C 16.09375 41.65625 16.09375 43 12.09375 43 -L 5.5 43 -C 4.09375 43 1.5 43 1.5 40.109375 -C 1.5 37.203125 4.09375 37.203125 5.5 37.203125 -L 9.59375 37.203125 -L 9.59375 5.796875 -L 5.5 5.796875 -C 4.09375 5.796875 1.5 5.796875 1.5 2.90625 -C 1.5 0 4.09375 0 5.5 0 -L 20.203125 0 -C 21.59375 0 24.203125 0 24.203125 2.90625 -C 24.203125 5.796875 21.59375 5.796875 20.203125 5.796875 -L 16.09375 5.796875 -L 16.09375 23.953125 -C 16.09375 33.671875 22.90625 38 28.296875 38 -C 34.09375 38 35.296875 34.671875 35.296875 28.96875 -L 35.296875 5.796875 -L 31.203125 5.796875 -C 29.796875 5.796875 27.203125 5.796875 27.203125 2.90625 -C 27.203125 0 29.796875 0 31.203125 0 -L 45.90625 0 -C 47.296875 0 49.90625 0 49.90625 2.90625 -C 49.90625 5.796875 47.296875 5.796875 45.90625 5.796875 -L 41.796875 5.796875 -z -" id="CMTT12-110"/> - <path d="M 42 40.203125 -C 42 41.796875 42 44 39.203125 44 -C 36.796875 44 36.203125 41.703125 36.203125 41.59375 -C 32.203125 44 27.59375 44 25.59375 44 -C 9.296875 44 7.09375 35.71875 7.09375 32.328125 -C 7.09375 28.234375 9.5 25.453125 12.90625 23.546875 -C 16.09375 21.75 19 21.265625 27.203125 19.96875 -C 31.09375 19.265625 39.09375 17.96875 39.09375 12.484375 -C 39.09375 8.78125 35.703125 5.296875 26.40625 5.296875 -C 20 5.296875 15.796875 7.796875 13.703125 15 -C 13.203125 16.390625 12.90625 17.5 10.40625 17.5 -C 7.09375 17.5 7.09375 15.59375 7.09375 13.59375 -L 7.09375 3.296875 -C 7.09375 1.6875 7.09375 -0.5 9.90625 -0.5 -C 11.09375 -0.5 12 -0.5 13.5 3.59375 -C 18.09375 -0.5 23.296875 -0.5 26.40625 -0.5 -C 44.90625 -0.5 44.90625 11.46875 44.90625 12.46875 -C 44.90625 22.828125 32.5 24.9375 27.703125 25.625 -C 18.90625 27.125 12.90625 28.125 12.90625 32.3125 -C 12.90625 35.015625 16 38.203125 25.40625 38.203125 -C 34.90625 38.203125 35.296875 33.703125 35.5 31.09375 -C 35.703125 29.09375 37.5 28.796875 38.703125 28.796875 -C 42 28.796875 42 30.59375 42 32.59375 -z -" id="CMTT12-115"/> + <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-74"/> + <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"/> </defs> - <g transform="translate(158.822024 66.279355)rotate(-43)scale(0.07 -0.07)"> - <use transform="translate(0 15.050129)scale(0.996264)" xlink:href="#Nimbus_Roman_No9_L_Regular_Italic-110"/> - <use transform="translate(49.8132 0)scale(0.737241)" xlink:href="#Nimbus_Roman_No9_L_Regular-72"/> - <use transform="translate(107.123069 15.050129)scale(0.996264)" xlink:href="#CMEX10-98"/> - <use transform="translate(165.998143 15.050129)scale(0.996264)" xlink:href="#CMTT12-74"/> - <use transform="translate(217.264254 15.050129)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(268.530365 15.050129)scale(0.996264)" xlink:href="#CMTT12-97"/> - <use transform="translate(319.796475 15.050129)scale(0.996264)" xlink:href="#CMTT12-110"/> - <use transform="translate(371.062586 15.050129)scale(0.996264)" xlink:href="#CMTT12-115"/> - <use transform="translate(456.056192 15.050129)scale(0.996264)" xlink:href="#CMTT12-103"/> - <use transform="translate(507.322303 15.050129)scale(0.996264)" xlink:href="#CMTT12-97"/> - <use transform="translate(558.588414 15.050129)scale(0.996264)" xlink:href="#CMTT12-109"/> - <use transform="translate(609.854525 15.050129)scale(0.996264)" xlink:href="#CMTT12-109"/> - <use transform="translate(661.120636 15.050129)scale(0.996264)" xlink:href="#CMTT12-97"/> - <use transform="translate(746.114242 15.050129)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(797.380353 15.050129)scale(0.996264)" xlink:href="#CMTT12-102"/> - <use transform="translate(848.646464 15.050129)scale(0.996264)" xlink:href="#CMTT12-102"/> - <use transform="translate(899.912575 15.050129)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(951.178685 15.050129)scale(0.996264)" xlink:href="#CMTT12-99"/> - <use transform="translate(1002.444796 15.050129)scale(0.996264)" xlink:href="#CMTT12-116"/> - <use transform="translate(1053.710907 15.050129)scale(0.996264)" xlink:href="#CMTT12-105"/> - <use transform="translate(1104.977018 15.050129)scale(0.996264)" xlink:href="#CMTT12-118"/> - <use transform="translate(1156.243129 15.050129)scale(0.996264)" xlink:href="#CMTT12-101"/> - <path d="M 427.949708 15.050129 -L 456.056192 15.050129 -L 456.056192 15.448629 -L 427.949708 15.448629 -L 427.949708 15.050129 -z -"/> - <path d="M 718.007758 15.050129 -L 746.114242 15.050129 -L 746.114242 15.448629 -L 718.007758 15.448629 -L 718.007758 15.050129 -z -"/> + <g transform="translate(158.364822 64.691311)rotate(-43)scale(0.06 -0.06)"> + <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-74"/> + <use transform="translate(239.297266 0.015625)" xlink:href="#DejaVuSansMono-101"/> + <use transform="translate(299.502344 0.015625)" xlink:href="#DejaVuSansMono-97"/> + <use transform="translate(359.707422 0.015625)" xlink:href="#DejaVuSansMono-110"/> + <use transform="translate(419.9125 0.015625)" xlink:href="#DejaVuSansMono-115"/> + <use transform="translate(480.117578 0.015625)" xlink:href="#DejaVuSansMono-95"/> + <use transform="translate(540.322656 0.015625)" xlink:href="#DejaVuSansMono-103"/> + <use transform="translate(600.527734 0.015625)" xlink:href="#DejaVuSansMono-97"/> + <use transform="translate(660.732813 0.015625)" xlink:href="#DejaVuSansMono-109"/> + <use transform="translate(720.937891 0.015625)" xlink:href="#DejaVuSansMono-109"/> + <use transform="translate(781.142969 0.015625)" xlink:href="#DejaVuSansMono-97"/> + <use transform="translate(841.348047 0.015625)" xlink:href="#DejaVuSansMono-95"/> + <use transform="translate(901.553125 0.015625)" xlink:href="#DejaVuSansMono-101"/> + <use transform="translate(961.758203 0.015625)" xlink:href="#DejaVuSansMono-102"/> + <use transform="translate(1021.963281 0.015625)" xlink:href="#DejaVuSansMono-102"/> + <use transform="translate(1082.168359 0.015625)" xlink:href="#DejaVuSansMono-101"/> + <use transform="translate(1142.373437 0.015625)" xlink:href="#DejaVuSansMono-99"/> + <use transform="translate(1202.578516 0.015625)" xlink:href="#DejaVuSansMono-116"/> + <use transform="translate(1262.783594 0.015625)" xlink:href="#DejaVuSansMono-105"/> + <use transform="translate(1322.988672 0.015625)" xlink:href="#DejaVuSansMono-118"/> + <use transform="translate(1383.19375 0.015625)" xlink:href="#DejaVuSansMono-101"/> </g> </g> <g id="text_14"> - <!-- ${\tt Cool\_density\_threshold\_H\_p\_cm3}$ --> + <!-- Cool_density_threshold_H_p_cm3 --> <defs> - <path d="M 41.796875 56.90625 -C 41.796875 60 41.203125 61 37.796875 61 -L 31.203125 61 -C 29.796875 61 27.203125 61 27.203125 58.109375 -C 27.203125 55.203125 29.796875 55.203125 31.203125 55.203125 -L 35.296875 55.203125 -L 35.296875 38.796875 -C 33.703125 40.390625 29.59375 43.796875 23.5 43.796875 -C 12.90625 43.796875 3.703125 34.1875 3.703125 21.59375 -C 3.703125 9.296875 12.296875 -0.5 22.59375 -0.5 -C 29.09375 -0.5 33.40625 3.359375 35.296875 5.546875 -C 35.296875 1.3125 35.296875 0 39.296875 0 -L 45.90625 0 -C 47.296875 0 49.90625 0 49.90625 2.90625 -C 49.90625 5.796875 47.296875 5.796875 45.90625 5.796875 -L 41.796875 5.796875 -z -M 35.296875 19.09375 -C 35.296875 13.5 30.703125 5.296875 23.203125 5.296875 -C 16 5.296875 10.203125 12.59375 10.203125 21.59375 -C 10.203125 31.1875 17 38 24.09375 38 -C 30.59375 38 35.296875 32.09375 35.296875 26.890625 -z -" id="CMTT12-100"/> - <path d="M 42.40625 37.203125 -L 45 37.203125 -C 46.40625 37.203125 49.09375 37.203125 49.09375 40.109375 -C 49.09375 43 46.40625 43 45 43 -L 34 43 -C 32.59375 43 29.90625 43 29.90625 40.109375 -C 29.90625 37.203125 32.59375 37.203125 34 37.203125 -L 36.5 37.203125 -C 33.703125 29.0625 28 12.515625 26.59375 6.859375 -L 26.5 6.859375 -C 26 9.046875 25.59375 10.125 24.59375 12.8125 -L 15.296875 37.203125 -L 17.59375 37.203125 -C 19 37.203125 21.703125 37.203125 21.703125 40.109375 -C 21.703125 43 19 43 17.59375 43 -L 6.59375 43 -C 5.203125 43 2.5 43 2.5 40.109375 -C 2.5 37.203125 5.203125 37.203125 6.59375 37.203125 -L 9.296875 37.203125 -L 23.296875 1.46875 -C 23.703125 0.46875 23.703125 0.265625 23.703125 0.171875 -C 23.703125 -0.03125 21.09375 -8.671875 19.59375 -11.4375 -C 19 -12.4375 16.5 -17.109375 11.703125 -16.609375 -C 11.796875 -16.296875 12.09375 -15.703125 12.09375 -14.609375 -C 12.09375 -12.296875 10.5 -10.703125 8.203125 -10.703125 -C 5.703125 -10.703125 4.203125 -12.40625 4.203125 -14.703125 -C 4.203125 -18.5 7.40625 -22.5 12.40625 -22.5 -C 22.09375 -22.5 26.40625 -9.6875 26.703125 -8.890625 -z -" id="CMTT12-121"/> - <path d="M 41.796875 29.359375 -C 41.796875 39.171875 37.203125 43.796875 29 43.796875 -C 22.203125 43.796875 17.796875 40 16.09375 38.09375 -L 16.09375 56.9375 -C 16.09375 60.015625 15.5 61 12.09375 61 -L 5.5 61 -C 4.09375 61 1.5 61 1.5 58.109375 -C 1.5 55.203125 4.09375 55.203125 5.5 55.203125 -L 9.59375 55.203125 -L 9.59375 5.796875 -L 5.5 5.796875 -C 4.09375 5.796875 1.5 5.796875 1.5 2.90625 -C 1.5 0 4.09375 0 5.5 0 -L 20.203125 0 -C 21.59375 0 24.203125 0 24.203125 2.90625 -C 24.203125 5.796875 21.59375 5.796875 20.203125 5.796875 -L 16.09375 5.796875 -L 16.09375 23.953125 -C 16.09375 33.671875 22.90625 38 28.296875 38 -C 34.09375 38 35.296875 34.671875 35.296875 28.96875 -L 35.296875 5.796875 -L 31.203125 5.796875 -C 29.796875 5.796875 27.203125 5.796875 27.203125 2.90625 -C 27.203125 0 29.796875 0 31.203125 0 -L 45.90625 0 -C 47.296875 0 49.90625 0 49.90625 2.90625 -C 49.90625 5.796875 47.296875 5.796875 45.90625 5.796875 -L 41.796875 5.796875 -z -" id="CMTT12-104"/> - <path d="M 21.59375 18.9375 -C 21.59375 30.875 30 38 38.5 38 -C 39 38 39.59375 38 40.09375 37.890625 -C 40.40625 34.140625 43.203125 33.828125 43.90625 33.828125 -C 46.203125 33.828125 47.796875 35.546875 47.796875 37.78125 -C 47.796875 42.15625 43.59375 43.796875 38.59375 43.796875 -C 31.90625 43.796875 26.203125 40.734375 21.59375 35.015625 -L 21.59375 38.921875 -C 21.59375 42 21 43 17.59375 43 -L 7.5 43 -C 6.09375 43 3.5 43 3.5 40.109375 -C 3.5 37.203125 6.09375 37.203125 7.5 37.203125 -L 15.09375 37.203125 -L 15.09375 5.796875 -L 7.5 5.796875 -C 6.09375 5.796875 3.5 5.796875 3.5 2.90625 -C 3.5 0 6.09375 0 7.5 0 -L 32.09375 0 -C 33.5 0 36.09375 0 36.09375 2.90625 -C 36.09375 5.796875 33.5 5.796875 32.09375 5.796875 -L 21.59375 5.796875 -z -" id="CMTT12-114"/> - <path d="M 42.796875 55.203125 -L 45 55.203125 -C 46.40625 55.203125 49 55.203125 49 58.109375 -C 49 61 46.5 61 45 61 -L 34.09375 61 -C 32.703125 61 30 61 30 58.109375 -C 30 55.203125 32.703125 55.203125 34.09375 55.203125 -L 36.296875 55.203125 -L 36.296875 34.796875 -L 15.09375 34.796875 -L 15.09375 55.203125 -L 17.296875 55.203125 -C 18.703125 55.203125 21.40625 55.203125 21.40625 58.109375 -C 21.40625 61 18.703125 61 17.296875 61 -L 6.40625 61 -C 4.90625 61 2.40625 61 2.40625 58.109375 -C 2.40625 55.203125 5 55.203125 6.40625 55.203125 -L 8.59375 55.203125 -L 8.59375 5.796875 -L 6.40625 5.796875 -C 5 5.796875 2.40625 5.796875 2.40625 2.90625 -C 2.40625 0 4.90625 0 6.40625 0 -L 17.296875 0 -C 18.703125 0 21.40625 0 21.40625 2.90625 -C 21.40625 5.796875 18.703125 5.796875 17.296875 5.796875 -L 15.09375 5.796875 -L 15.09375 29 -L 36.296875 29 -L 36.296875 5.796875 -L 34.09375 5.796875 -C 32.703125 5.796875 30 5.796875 30 2.90625 -C 30 0 32.703125 0 34.09375 0 -L 45 0 -C 46.5 0 49 0 49 2.90625 -C 49 5.796875 46.40625 5.796875 45 5.796875 -L 42.796875 5.796875 -z -" id="CMTT12-72"/> - <path d="M 20.203125 -22 -C 21.59375 -22 24.203125 -22 24.203125 -19.09375 -C 24.203125 -16.203125 21.59375 -16.203125 20.203125 -16.203125 -L 16.09375 -16.203125 -L 16.09375 5.09375 -C 18.5 2.390625 22.203125 -0.5 27.796875 -0.5 -C 38.40625 -0.5 47.703125 9.046875 47.703125 21.796875 -C 47.703125 34.15625 39.296875 44 28.90625 44 -C 21.59375 44 17 39.578125 16.09375 38.578125 -C 16.09375 41.625 16.09375 43 12.09375 43 -L 5.5 43 -C 4.09375 43 1.5 43 1.5 40.109375 -C 1.5 37.203125 4.09375 37.203125 5.5 37.203125 -L 9.59375 37.203125 -L 9.59375 -16.203125 -L 5.5 -16.203125 -C 4.09375 -16.203125 1.5 -16.203125 1.5 -19.09375 -C 1.5 -22 4.09375 -22 5.5 -22 -z -M 16.09375 26.828125 -C 16.09375 32.5625 21.703125 38.203125 28.203125 38.203125 -C 35.40625 38.203125 41.203125 30.84375 41.203125 21.796875 -C 41.203125 12.140625 34.40625 5.296875 27.296875 5.296875 -C 19.796875 5.296875 16.09375 13.84375 16.09375 18.875 -z -" id="CMTT12-112"/> - <path d="M 25.59375 30.59375 -C 36 30.59375 40.59375 23.21875 40.59375 17.765625 -C 40.59375 11.078125 34.796875 4.796875 26 4.796875 -C 16 4.796875 11.5 10.25 11.5 11.671875 -C 11.5 11.859375 11.59375 12.0625 11.703125 12.171875 -C 12.09375 12.875 12.40625 13.703125 12.40625 14.609375 -C 12.40625 16.734375 10.796875 18.65625 8.40625 18.65625 -C 6.296875 18.65625 4.296875 17.34375 4.296875 14.234375 -C 4.296875 5.453125 13.796875 -1 26 -1 -C 38.59375 -1 47.09375 8.078125 47.09375 17.65625 -C 47.09375 22.8125 44.296875 29.96875 35.5 33.796875 -C 41.59375 37.609375 44.296875 43.625 44.296875 48.84375 -C 44.296875 56.375 36.796875 62.890625 26 62.890625 -C 14.90625 62.890625 7.09375 58.078125 7.09375 50.65625 -C 7.09375 47.34375 9.59375 46.34375 11.203125 46.34375 -C 13 46.34375 15.203125 47.765625 15.203125 50.515625 -C 15.203125 52.125 14.40625 53.046875 14.40625 53.140625 -C 17.40625 57 24.296875 57 26 57 -C 32.796875 57 37.796875 53.3125 37.796875 48.484375 -C 37.796875 45.515625 35.90625 37 25.40625 37 -C 21.703125 37 20.09375 36.796875 19.703125 36.796875 -C 17.703125 36.578125 17.203125 35.203125 17.203125 33.703125 -C 17.203125 30.59375 19.296875 30.59375 21 30.59375 -z -" id="CMTT12-51"/> + <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 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 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 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(75.778884 192.590474)rotate(-90)scale(0.07 -0.07)"> - <use transform="scale(0.996264)" xlink:href="#CMTT12-67"/> - <use transform="translate(51.266111 0)scale(0.996264)" xlink:href="#CMTT12-111"/> - <use transform="translate(102.532222 0)scale(0.996264)" xlink:href="#CMTT12-111"/> - <use transform="translate(153.798333 0)scale(0.996264)" xlink:href="#CMTT12-108"/> - <use transform="translate(238.791939 0)scale(0.996264)" xlink:href="#CMTT12-100"/> - <use transform="translate(290.05805 0)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(341.32416 0)scale(0.996264)" xlink:href="#CMTT12-110"/> - <use transform="translate(392.590271 0)scale(0.996264)" xlink:href="#CMTT12-115"/> - <use transform="translate(443.856382 0)scale(0.996264)" xlink:href="#CMTT12-105"/> - <use transform="translate(495.122493 0)scale(0.996264)" xlink:href="#CMTT12-116"/> - <use transform="translate(546.388604 0)scale(0.996264)" xlink:href="#CMTT12-121"/> - <use transform="translate(631.38221 0)scale(0.996264)" xlink:href="#CMTT12-116"/> - <use transform="translate(682.648321 0)scale(0.996264)" xlink:href="#CMTT12-104"/> - <use transform="translate(733.914432 0)scale(0.996264)" xlink:href="#CMTT12-114"/> - <use transform="translate(785.180542 0)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(836.446653 0)scale(0.996264)" xlink:href="#CMTT12-115"/> - <use transform="translate(887.712764 0)scale(0.996264)" xlink:href="#CMTT12-104"/> - <use transform="translate(938.978875 0)scale(0.996264)" xlink:href="#CMTT12-111"/> - <use transform="translate(990.244986 0)scale(0.996264)" xlink:href="#CMTT12-108"/> - <use transform="translate(1041.511097 0)scale(0.996264)" xlink:href="#CMTT12-100"/> - <use transform="translate(1126.504703 0)scale(0.996264)" xlink:href="#CMTT12-72"/> - <use transform="translate(1211.498309 0)scale(0.996264)" xlink:href="#CMTT12-112"/> - <use transform="translate(1296.491915 0)scale(0.996264)" xlink:href="#CMTT12-99"/> - <use transform="translate(1347.758026 0)scale(0.996264)" xlink:href="#CMTT12-109"/> - <use transform="translate(1399.024137 0)scale(0.996264)" xlink:href="#CMTT12-51"/> - <path d="M 210.685454 0 -L 238.791939 0 -L 238.791939 0.3985 -L 210.685454 0.3985 -L 210.685454 0 -z -"/> - <path d="M 603.275726 0 -L 631.38221 0 -L 631.38221 0.3985 -L 603.275726 0.3985 -L 603.275726 0 -z -"/> - <path d="M 1098.398219 0 -L 1126.504703 0 -L 1126.504703 0.3985 -L 1098.398219 0.3985 -L 1098.398219 0 -z -"/> - <path d="M 1183.391825 0 -L 1211.498309 0 -L 1211.498309 0.3985 -L 1183.391825 0.3985 -L 1183.391825 0 -z -"/> - <path d="M 1268.385431 0 -L 1296.491915 0 -L 1296.491915 0.3985 -L 1268.385431 0.3985 -L 1268.385431 0 -z -"/> + <g transform="translate(75.913927 194.356252)rotate(-90)scale(0.06 -0.06)"> + <use xlink:href="#DejaVuSansMono-67"/> + <use x="60.205078" xlink:href="#DejaVuSansMono-111"/> + <use x="120.410156" xlink:href="#DejaVuSansMono-111"/> + <use x="180.615234" xlink:href="#DejaVuSansMono-108"/> + <use x="240.820312" xlink:href="#DejaVuSansMono-95"/> + <use x="301.025391" xlink:href="#DejaVuSansMono-100"/> + <use x="361.230469" xlink:href="#DejaVuSansMono-101"/> + <use x="421.435547" xlink:href="#DejaVuSansMono-110"/> + <use x="481.640625" xlink:href="#DejaVuSansMono-115"/> + <use x="541.845703" xlink:href="#DejaVuSansMono-105"/> + <use x="602.050781" xlink:href="#DejaVuSansMono-116"/> + <use x="662.255859" xlink:href="#DejaVuSansMono-121"/> + <use x="722.460938" xlink:href="#DejaVuSansMono-95"/> + <use x="782.666016" xlink:href="#DejaVuSansMono-116"/> + <use x="842.871094" xlink:href="#DejaVuSansMono-104"/> + <use x="903.076172" xlink:href="#DejaVuSansMono-114"/> + <use x="963.28125" xlink:href="#DejaVuSansMono-101"/> + <use x="1023.486328" xlink:href="#DejaVuSansMono-115"/> + <use x="1083.691406" xlink:href="#DejaVuSansMono-104"/> + <use x="1143.896484" xlink:href="#DejaVuSansMono-111"/> + <use x="1204.101562" xlink:href="#DejaVuSansMono-108"/> + <use x="1264.306641" xlink:href="#DejaVuSansMono-100"/> + <use x="1324.511719" xlink:href="#DejaVuSansMono-95"/> + <use x="1384.716797" xlink:href="#DejaVuSansMono-72"/> + <use x="1444.921875" xlink:href="#DejaVuSansMono-95"/> + <use x="1505.126953" xlink:href="#DejaVuSansMono-112"/> + <use x="1565.332031" xlink:href="#DejaVuSansMono-95"/> + <use x="1625.537109" xlink:href="#DejaVuSansMono-99"/> + <use x="1685.742188" xlink:href="#DejaVuSansMono-109"/> + <use x="1745.947266" xlink:href="#DejaVuSansMono-51"/> </g> </g> <g id="text_15"> - <!-- ${\tt Jeans\_density\_threshold\_H\_p\_cm3}$ --> - <g transform="translate(145.055974 192.590474)rotate(-90)scale(0.07 -0.07)"> - <use transform="scale(0.996264)" xlink:href="#CMTT12-74"/> - <use transform="translate(51.266111 0)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(102.532222 0)scale(0.996264)" xlink:href="#CMTT12-97"/> - <use transform="translate(153.798333 0)scale(0.996264)" xlink:href="#CMTT12-110"/> - <use transform="translate(205.064443 0)scale(0.996264)" xlink:href="#CMTT12-115"/> - <use transform="translate(290.05805 0)scale(0.996264)" xlink:href="#CMTT12-100"/> - <use transform="translate(341.32416 0)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(392.590271 0)scale(0.996264)" xlink:href="#CMTT12-110"/> - <use transform="translate(443.856382 0)scale(0.996264)" xlink:href="#CMTT12-115"/> - <use transform="translate(495.122493 0)scale(0.996264)" xlink:href="#CMTT12-105"/> - <use transform="translate(546.388604 0)scale(0.996264)" xlink:href="#CMTT12-116"/> - <use transform="translate(597.654715 0)scale(0.996264)" xlink:href="#CMTT12-121"/> - <use transform="translate(682.648321 0)scale(0.996264)" xlink:href="#CMTT12-116"/> - <use transform="translate(733.914432 0)scale(0.996264)" xlink:href="#CMTT12-104"/> - <use transform="translate(785.180542 0)scale(0.996264)" xlink:href="#CMTT12-114"/> - <use transform="translate(836.446653 0)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(887.712764 0)scale(0.996264)" xlink:href="#CMTT12-115"/> - <use transform="translate(938.978875 0)scale(0.996264)" xlink:href="#CMTT12-104"/> - <use transform="translate(990.244986 0)scale(0.996264)" xlink:href="#CMTT12-111"/> - <use transform="translate(1041.511097 0)scale(0.996264)" xlink:href="#CMTT12-108"/> - <use transform="translate(1092.777208 0)scale(0.996264)" xlink:href="#CMTT12-100"/> - <use transform="translate(1177.770814 0)scale(0.996264)" xlink:href="#CMTT12-72"/> - <use transform="translate(1262.76442 0)scale(0.996264)" xlink:href="#CMTT12-112"/> - <use transform="translate(1347.758026 0)scale(0.996264)" xlink:href="#CMTT12-99"/> - <use transform="translate(1399.024137 0)scale(0.996264)" xlink:href="#CMTT12-109"/> - <use transform="translate(1450.290248 0)scale(0.996264)" xlink:href="#CMTT12-51"/> - <path d="M 261.951565 0 -L 290.05805 0 -L 290.05805 0.3985 -L 261.951565 0.3985 -L 261.951565 0 -z -"/> - <path d="M 654.541837 0 -L 682.648321 0 -L 682.648321 0.3985 -L 654.541837 0.3985 -L 654.541837 0 -z -"/> - <path d="M 1149.664329 0 -L 1177.770814 0 -L 1177.770814 0.3985 -L 1149.664329 0.3985 -L 1149.664329 0 -z -"/> - <path d="M 1234.657936 0 -L 1262.76442 0 -L 1262.76442 0.3985 -L 1234.657936 0.3985 -L 1234.657936 0 -z -"/> - <path d="M 1319.651542 0 -L 1347.758026 0 -L 1347.758026 0.3985 -L 1319.651542 0.3985 -L 1319.651542 0 -z -"/> + <!-- Jeans_density_threshold_H_p_cm3 --> + <g transform="translate(145.308908 194.356252)rotate(-90)scale(0.055 -0.055)"> + <use xlink:href="#DejaVuSansMono-74"/> + <use x="60.205078" xlink:href="#DejaVuSansMono-101"/> + <use x="120.410156" xlink:href="#DejaVuSansMono-97"/> + <use x="180.615234" xlink:href="#DejaVuSansMono-110"/> + <use x="240.820312" xlink:href="#DejaVuSansMono-115"/> + <use x="301.025391" xlink:href="#DejaVuSansMono-95"/> + <use x="361.230469" xlink:href="#DejaVuSansMono-100"/> + <use x="421.435547" xlink:href="#DejaVuSansMono-101"/> + <use x="481.640625" xlink:href="#DejaVuSansMono-110"/> + <use x="541.845703" xlink:href="#DejaVuSansMono-115"/> + <use x="602.050781" xlink:href="#DejaVuSansMono-105"/> + <use x="662.255859" xlink:href="#DejaVuSansMono-116"/> + <use x="722.460938" xlink:href="#DejaVuSansMono-121"/> + <use x="782.666016" xlink:href="#DejaVuSansMono-95"/> + <use x="842.871094" xlink:href="#DejaVuSansMono-116"/> + <use x="903.076172" xlink:href="#DejaVuSansMono-104"/> + <use x="963.28125" xlink:href="#DejaVuSansMono-114"/> + <use x="1023.486328" xlink:href="#DejaVuSansMono-101"/> + <use x="1083.691406" xlink:href="#DejaVuSansMono-115"/> + <use x="1143.896484" xlink:href="#DejaVuSansMono-104"/> + <use x="1204.101562" xlink:href="#DejaVuSansMono-111"/> + <use x="1264.306641" xlink:href="#DejaVuSansMono-108"/> + <use x="1324.511719" xlink:href="#DejaVuSansMono-100"/> + <use x="1384.716797" xlink:href="#DejaVuSansMono-95"/> + <use x="1444.921875" xlink:href="#DejaVuSansMono-72"/> + <use x="1505.126953" xlink:href="#DejaVuSansMono-95"/> + <use x="1565.332031" xlink:href="#DejaVuSansMono-112"/> + <use x="1625.537109" xlink:href="#DejaVuSansMono-95"/> + <use x="1685.742188" xlink:href="#DejaVuSansMono-99"/> + <use x="1745.947266" xlink:href="#DejaVuSansMono-109"/> + <use x="1806.152344" xlink:href="#DejaVuSansMono-51"/> </g> </g> <g id="text_16"> - <!-- ${\tt Cool\_temperature\_norm\_K}$ --> + <!-- Cool_temperature_norm_K --> <defs> - <path d="M 41.796875 38.921875 -C 41.796875 42 41.203125 43 37.796875 43 -L 31.203125 43 -C 29.796875 43 27.203125 43 27.203125 40.109375 -C 27.203125 37.203125 29.796875 37.203125 31.203125 37.203125 -L 35.296875 37.203125 -L 35.296875 15.625 -C 35.296875 7.484375 28.5 5.296875 24 5.296875 -C 16.09375 5.296875 16.09375 8.875 16.09375 11.96875 -L 16.09375 38.921875 -C 16.09375 42 15.5 43 12.09375 43 -L 5.5 43 -C 4.09375 43 1.5 43 1.5 40.109375 -C 1.5 37.203125 4.09375 37.203125 5.5 37.203125 -L 9.59375 37.203125 -L 9.59375 11.4375 -C 9.59375 2.28125 15.59375 -0.5 23.296875 -0.5 -C 29.40625 -0.5 33.203125 1.984375 35.203125 3.671875 -C 35.203125 0 37.59375 0 39.296875 0 -L 45.90625 0 -C 47.296875 0 49.90625 0 49.90625 2.90625 -C 49.90625 5.796875 47.296875 5.796875 45.90625 5.796875 -L 41.796875 5.796875 -z -" id="CMTT12-117"/> - <path d="M 27.09375 35.734375 -L 42.40625 55.203125 -C 45.296875 55.203125 47.59375 55.203125 47.59375 58.109375 -C 47.59375 61 45 61 43.59375 61 -L 35.203125 61 -C 33.796875 61 31.203125 61 31.203125 58.109375 -C 31.203125 55.203125 33.796875 55.203125 35.203125 55.203125 -L 14.203125 28.453125 -L 14.203125 55.203125 -L 16.203125 55.203125 -C 17.59375 55.203125 20.203125 55.203125 20.203125 58.109375 -C 20.203125 61 17.59375 61 16.203125 61 -L 6.59375 61 -C 5.203125 61 2.59375 61 2.59375 58.109375 -C 2.59375 55.203125 5.203125 55.203125 6.59375 55.203125 -L 8.59375 55.203125 -L 8.59375 5.796875 -L 6.59375 5.796875 -C 5.203125 5.796875 2.59375 5.796875 2.59375 2.90625 -C 2.59375 0 5.203125 0 6.59375 0 -L 16.203125 0 -C 17.59375 0 20.203125 0 20.203125 2.90625 -C 20.203125 5.796875 17.59375 5.796875 16.203125 5.796875 -L 14.203125 5.796875 -L 14.203125 19.375 -L 23.296875 30.953125 -L 37.203125 5.796875 -C 35.90625 5.796875 33.296875 5.796875 33.296875 2.90625 -C 33.296875 0 35.90625 0 37.296875 0 -L 44.5 0 -C 45.90625 0 48.5 0 48.5 2.90625 -C 48.5 5.796875 46.09375 5.796875 43.59375 5.796875 -z -" id="CMTT12-75"/> + <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 66.86623)scale(0.07 -0.07)"> - <use transform="scale(0.996264)" xlink:href="#CMTT12-67"/> - <use transform="translate(51.266111 0)scale(0.996264)" xlink:href="#CMTT12-111"/> - <use transform="translate(102.532222 0)scale(0.996264)" xlink:href="#CMTT12-111"/> - <use transform="translate(153.798333 0)scale(0.996264)" xlink:href="#CMTT12-108"/> - <use transform="translate(238.791939 0)scale(0.996264)" xlink:href="#CMTT12-116"/> - <use transform="translate(290.05805 0)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(341.32416 0)scale(0.996264)" xlink:href="#CMTT12-109"/> - <use transform="translate(392.590271 0)scale(0.996264)" xlink:href="#CMTT12-112"/> - <use transform="translate(443.856382 0)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(495.122493 0)scale(0.996264)" xlink:href="#CMTT12-114"/> - <use transform="translate(546.388604 0)scale(0.996264)" xlink:href="#CMTT12-97"/> - <use transform="translate(597.654715 0)scale(0.996264)" xlink:href="#CMTT12-116"/> - <use transform="translate(648.920825 0)scale(0.996264)" xlink:href="#CMTT12-117"/> - <use transform="translate(700.186936 0)scale(0.996264)" xlink:href="#CMTT12-114"/> - <use transform="translate(751.453047 0)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(836.446653 0)scale(0.996264)" xlink:href="#CMTT12-110"/> - <use transform="translate(887.712764 0)scale(0.996264)" xlink:href="#CMTT12-111"/> - <use transform="translate(938.978875 0)scale(0.996264)" xlink:href="#CMTT12-114"/> - <use transform="translate(990.244986 0)scale(0.996264)" xlink:href="#CMTT12-109"/> - <use transform="translate(1075.238592 0)scale(0.996264)" xlink:href="#CMTT12-75"/> - <path d="M 210.685454 0 -L 238.791939 0 -L 238.791939 0.3985 -L 210.685454 0.3985 -L 210.685454 0 -z -"/> - <path d="M 808.340169 0 -L 836.446653 0 -L 836.446653 0.3985 -L 808.340169 0.3985 -L 808.340169 0 -z -"/> - <path d="M 1047.132108 0 -L 1075.238592 0 -L 1075.238592 0.3985 -L 1047.132108 0.3985 -L 1047.132108 0 -z -"/> + <g transform="translate(37.862259 67.001273)scale(0.06 -0.06)"> + <use xlink:href="#DejaVuSansMono-67"/> + <use x="60.205078" xlink:href="#DejaVuSansMono-111"/> + <use x="120.410156" xlink:href="#DejaVuSansMono-111"/> + <use x="180.615234" xlink:href="#DejaVuSansMono-108"/> + <use x="240.820312" xlink:href="#DejaVuSansMono-95"/> + <use x="301.025391" xlink:href="#DejaVuSansMono-116"/> + <use x="361.230469" xlink:href="#DejaVuSansMono-101"/> + <use x="421.435547" xlink:href="#DejaVuSansMono-109"/> + <use x="481.640625" xlink:href="#DejaVuSansMono-112"/> + <use x="541.845703" xlink:href="#DejaVuSansMono-101"/> + <use x="602.050781" xlink:href="#DejaVuSansMono-114"/> + <use x="662.255859" xlink:href="#DejaVuSansMono-97"/> + <use x="722.460938" xlink:href="#DejaVuSansMono-116"/> + <use x="782.666016" xlink:href="#DejaVuSansMono-117"/> + <use x="842.871094" xlink:href="#DejaVuSansMono-114"/> + <use x="903.076172" xlink:href="#DejaVuSansMono-101"/> + <use x="963.28125" xlink:href="#DejaVuSansMono-95"/> + <use x="1023.486328" xlink:href="#DejaVuSansMono-110"/> + <use x="1083.691406" xlink:href="#DejaVuSansMono-111"/> + <use x="1143.896484" xlink:href="#DejaVuSansMono-114"/> + <use x="1204.101562" xlink:href="#DejaVuSansMono-109"/> + <use x="1264.306641" xlink:href="#DejaVuSansMono-95"/> + <use x="1324.511719" xlink:href="#DejaVuSansMono-75"/> </g> </g> <g id="text_17"> - <!-- ${\tt Jeans\_temperature\_norm\_K}$ --> - <g transform="translate(37.862259 81.545055)scale(0.07 -0.07)"> - <use transform="scale(0.996264)" xlink:href="#CMTT12-74"/> - <use transform="translate(51.266111 0)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(102.532222 0)scale(0.996264)" xlink:href="#CMTT12-97"/> - <use transform="translate(153.798333 0)scale(0.996264)" xlink:href="#CMTT12-110"/> - <use transform="translate(205.064443 0)scale(0.996264)" xlink:href="#CMTT12-115"/> - <use transform="translate(290.05805 0)scale(0.996264)" xlink:href="#CMTT12-116"/> - <use transform="translate(341.32416 0)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(392.590271 0)scale(0.996264)" xlink:href="#CMTT12-109"/> - <use transform="translate(443.856382 0)scale(0.996264)" xlink:href="#CMTT12-112"/> - <use transform="translate(495.122493 0)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(546.388604 0)scale(0.996264)" xlink:href="#CMTT12-114"/> - <use transform="translate(597.654715 0)scale(0.996264)" xlink:href="#CMTT12-97"/> - <use transform="translate(648.920825 0)scale(0.996264)" xlink:href="#CMTT12-116"/> - <use transform="translate(700.186936 0)scale(0.996264)" xlink:href="#CMTT12-117"/> - <use transform="translate(751.453047 0)scale(0.996264)" xlink:href="#CMTT12-114"/> - <use transform="translate(802.719158 0)scale(0.996264)" xlink:href="#CMTT12-101"/> - <use transform="translate(887.712764 0)scale(0.996264)" xlink:href="#CMTT12-110"/> - <use transform="translate(938.978875 0)scale(0.996264)" xlink:href="#CMTT12-111"/> - <use transform="translate(990.244986 0)scale(0.996264)" xlink:href="#CMTT12-114"/> - <use transform="translate(1041.511097 0)scale(0.996264)" xlink:href="#CMTT12-109"/> - <use transform="translate(1126.504703 0)scale(0.996264)" xlink:href="#CMTT12-75"/> - <path d="M 261.951565 0 -L 290.05805 0 -L 290.05805 0.3985 -L 261.951565 0.3985 -L 261.951565 0 -z -"/> - <path d="M 859.60628 0 -L 887.712764 0 -L 887.712764 0.3985 -L 859.60628 0.3985 -L 859.60628 0 -z -"/> - <path d="M 1098.398219 0 -L 1126.504703 0 -L 1126.504703 0.3985 -L 1098.398219 0.3985 -L 1098.398219 0 -z -"/> + <!-- Jeans_temperature_norm_K --> + <g transform="translate(37.862259 81.680098)scale(0.06 -0.06)"> + <use xlink:href="#DejaVuSansMono-74"/> + <use x="60.205078" xlink:href="#DejaVuSansMono-101"/> + <use x="120.410156" xlink:href="#DejaVuSansMono-97"/> + <use x="180.615234" xlink:href="#DejaVuSansMono-110"/> + <use x="240.820312" xlink:href="#DejaVuSansMono-115"/> + <use x="301.025391" xlink:href="#DejaVuSansMono-95"/> + <use x="361.230469" xlink:href="#DejaVuSansMono-116"/> + <use x="421.435547" xlink:href="#DejaVuSansMono-101"/> + <use x="481.640625" xlink:href="#DejaVuSansMono-109"/> + <use x="541.845703" xlink:href="#DejaVuSansMono-112"/> + <use x="602.050781" xlink:href="#DejaVuSansMono-101"/> + <use x="662.255859" xlink:href="#DejaVuSansMono-114"/> + <use x="722.460938" xlink:href="#DejaVuSansMono-97"/> + <use x="782.666016" xlink:href="#DejaVuSansMono-116"/> + <use x="842.871094" xlink:href="#DejaVuSansMono-117"/> + <use x="903.076172" xlink:href="#DejaVuSansMono-114"/> + <use x="963.28125" xlink:href="#DejaVuSansMono-101"/> + <use x="1023.486328" xlink:href="#DejaVuSansMono-95"/> + <use x="1083.691406" xlink:href="#DejaVuSansMono-110"/> + <use x="1143.896484" xlink:href="#DejaVuSansMono-111"/> + <use x="1204.101562" xlink:href="#DejaVuSansMono-114"/> + <use x="1264.306641" xlink:href="#DejaVuSansMono-109"/> + <use x="1324.511719" xlink:href="#DejaVuSansMono-95"/> + <use x="1384.716797" xlink:href="#DejaVuSansMono-75"/> </g> </g> </g> </g> <defs> - <clipPath id="p107a2e5a22"> + <clipPath id="pf19aa30d2c"> <rect height="195.048" width="190.512" x="34.02" y="2.268"/> </clipPath> </defs> diff --git a/doc/RTD/source/SubgridModels/EAGLE/index.rst b/doc/RTD/source/SubgridModels/EAGLE/index.rst index 5ce3a8e4123ec0e459a6d793f45b5d99fae6023d..b9942628563f5ccc56bd44ee90270dd65cff2e44 100644 --- a/doc/RTD/source/SubgridModels/EAGLE/index.rst +++ b/doc/RTD/source/SubgridModels/EAGLE/index.rst @@ -17,9 +17,10 @@ Entropy floors The gas particles in the EAGLE model are prevented from cooling below a certain temperature. The temperature limit depends on the density of the particles. Two floors are used in conjonction. Both are implemented as -polytropic "equations of states" :math:`P = P_c -\left(\rho/\rho_c\right)^\gamma`, with the constants derived from the user -input given in terms of temperature and Hydrogen number density. +polytropic "equations of states":math:`P = P_c +\left(\rho/\rho_c\right)^\gamma` (all done in physical coordinates), with +the constants derived from the user input given in terms of temperature and +Hydrogen number density. The first limit, labelled as ``Cool``, is typically used to prevent low-density high-metallicity particles to cool below the warm phase because @@ -27,12 +28,7 @@ of over-cooling induced by the absence of metal diffusion. This limit plays only a small role in practice. The second limit, labelled as ``Jeans``, is used to prevent the fragmentation of high-density gas into clumps that cannot be resolved by the coupled hydro+gravity solver. The two limits are -sketched on the following figure. An additional over-density criterion is -applied to prevent gas not collapsed into structures from being -affected. This criterion demands that :math:`\rho > \Delta_{\rm floor} -\Omega_b \rho_{\rm crit}`, with :math:`\Delta_{\rm floor}` specified by the -user and :math:`\rho_{\rm crit}` the critical density at that redshift -[#f1]_. +sketched on the following figure. .. figure:: EAGLE_entropy_floor.svg :width: 400px @@ -51,6 +47,15 @@ user and :math:`\rho_{\rm crit}` the critical density at that redshift the figure for clarity reasons, typical values for EAGLE runs place both anchors at the same temperature. +An additional over-density criterion above the mean baryonic density is +applied to prevent gas not collapsed into structures from being +affected. To be precise, this criterion demands that the floor is applied +only if :math:`\rho_{\rm com} > \Delta_{\rm floor}\bar{\rho_b} = +\Delta_{\rm floor} \Omega_b \rho_{\rm crit,0}`, with :math:`\Delta_{\rm +floor}` specified by the user, :math:`\rho_{\rm crit,0} = 3H_0/8\pi G` the +critical density at redshift zero [#f1]_, and :math:`\rho_{\rm com}` the +gas co-moving density. Typical values for :math:`\Delta_{\rm floor}` are of +order 10. The model is governed by 4 parameters for each of the two limits. These are given in the ``EAGLEEntropyFloor`` section of the @@ -389,8 +394,61 @@ the snapshots for each gas and star particle: .. _EAGLE_star_formation: -Star formation: Schaye+2008 -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Star formation: Schaye+2008 modified for EAGLE +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. figure:: EAGLE_SF_Z_dep.svg + :width: 400px + :align: center + :figclass: align-center + :alt: Metal-dependance of the threshold for star formation in the + EAGLE model. + + The dependency of the SF threshold density on the metallicty of the gas + in the EAGLE model (black line). The function is described by the four + parameters indicated on the figure. These are the slope of the + dependency, its position on the metallicity-axis and normalisation + (black circle) as well as the maximal threshold density allowed. For + reference, the black arrow indicates the value typically assumed for + solar metallicity :math:`Z_\odot=0.014` (note, however, that this value + does *not* enter the model at all). The values used to produce this + figure are the ones assumed in the reference EAGLE model. + +.. figure:: EAGLE_SF_EOS.svg + :width: 400px + :align: center + :figclass: align-center + :alt: Equation-of-state assumed for the star-forming gas + + The equation-of-state assumed for the star-forming gas in the EAGLE + model (black line). The function is described by the three parameters + indicated on the figure. These are the slope of the relation, the + position of the normalisation point on the density axis and the + temperature expected at this density. Note that this is a normalisation + and *not* a threshold. Gas at densities lower than the normalisation + point will also be put on this equation of state when computing its + star formation rate. The values used to produce this figure are the + ones assumed in the reference EAGLE model. + +.. code:: YAML + + # EAGLE star formation parameters + EAGLEStarFormation: + EOS_density_norm_H_p_cm3: 0.1 # Physical density used for the normalisation of the EOS assumed for the star-forming gas in Hydrogen atoms per cm^3. + EOS_temperature_norm_K: 8000 # Temperature om the polytropic EOS assumed for star-forming gas at the density normalisation in Kelvin. + EOS_gamma_effective: 1.3333333 # Slope the of the polytropic EOS assumed for the star-forming gas. + KS_normalisation: 1.515e-4 # The normalization of the Kennicutt-Schmidt law in Msun / kpc^2 / yr. + KS_exponent: 1.4 # The exponent of the Kennicutt-Schmidt law. + KS_min_over_density: 57.7 # The over-density above which star-formation is allowed. + KS_high_density_threshold_H_p_cm3: 1e3 # Hydrogen number density above which the Kennicut-Schmidt law changes slope in Hydrogen atoms per cm^3. + KS_high_density_exponent: 2.0 # Slope of the Kennicut-Schmidt law above the high-density threshold. + KS_temperature_margin_dex: 0.5 # Logarithm base 10 of the maximal temperature difference above the EOS allowed to form stars. + KS_max_density_threshold_H_p_cm3: 1e5 # Hydrogen number density above which a particle gets automatically turned into a star in Hydrogen atoms per cm^3. + threshold_norm_H_p_cm3: 0.1 # Normalisation of the metal-dependant density threshold for star formation in Hydrogen atoms per cm^3. + threshold_Z0: 0.002 # Reference metallicity (metal mass fraction) for the metal-dependant threshold for star formation. + threshold_slope: -0.64 # Slope of the metal-dependant star formation threshold + threshold_max_density_H_p_cm3: 10.0 # Maximal density of the metal-dependant density threshold for star formation in Hydrogen atoms per cm^3. + gas_fraction: 0.1 # The gas fraction used internally by the model. .. _EAGLE_enrichment: diff --git a/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_SF_EOS.py b/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_SF_EOS.py new file mode 100644 index 0000000000000000000000000000000000000000..88ca56d750bf716fea8b4bf72b70c2b598953ac7 --- /dev/null +++ b/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_SF_EOS.py @@ -0,0 +1,78 @@ +import matplotlib + +matplotlib.use("Agg") +from pylab import * +from scipy import stats + +# Plot parameters +params = { + "axes.labelsize": 10, + "axes.titlesize": 10, + "font.size": 9, + "font.sans-serif": [ + "Computer Modern", + "Computer Modern Roman", + "CMU Serif", + "cmunrm", + "DejaVu Sans", + ], + "mathtext.fontset": "cm", + "legend.fontsize": 9, + "xtick.labelsize": 10, + "ytick.labelsize": 10, + "text.usetex": False, + "figure.figsize": (3.15, 3.15), + "lines.markersize": 6, + "figure.subplot.left": 0.15, + "figure.subplot.right": 0.99, + "figure.subplot.bottom": 0.13, + "figure.subplot.top": 0.99, + "figure.subplot.wspace": 0.15, + "figure.subplot.hspace": 0.12, + "lines.linewidth": 2.0, +} + +rcParams.update(params) + +# Equations of state +eos_SF_rho = np.logspace(-10, 5, 1000) +eos_SF_T = (eos_SF_rho / 10 ** (-1)) ** (1.0 / 3.0) * 8000.0 + +# Plot the phase space diagram +figure() +subplot(111, xscale="log", yscale="log") +plot(eos_SF_rho, eos_SF_T, "k-", lw=1.0) + +plot([1e-10, 1e-1], [8000, 8000], "k:", lw=0.6) +plot([1e-1, 1e-1], [20, 8000], "k:", lw=0.6) +plot([1e-1, 1e1], [20000.0, 20000.0 * 10.0 ** (2.0 / 3.0)], "k--", lw=0.6) +text( + 0.5e-1, + 200000, + "$n_{\\rm H}$^EOS_gamma_effective", + va="top", + rotation=43, + fontsize=6.5, + family="monospace", +) +text( + 0.95e-1, + 25, + "EOS_density_norm_H_p_cm3", + rotation=90, + va="bottom", + ha="right", + fontsize=7, + family="monospace", +) +text(5e-8, 8400, "EOS_temperature_norm_K", va="bottom", fontsize=7, family="monospace") + +scatter([1e-1], [8000], s=4, color="k") + +xlabel("Hydrogen number density $n_{\\rm H}$ [cm$^{-3}$]", labelpad=0) +ylabel("Temperature $T$ [K]", labelpad=2) +xlim(3e-8, 3e3) +ylim(20.0, 2e5) + + +savefig("EAGLE_SF_EOS.svg", dpi=200) 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 new file mode 100644 index 0000000000000000000000000000000000000000..26ae522947ecc9e75f6f287bafed0bb9acb9134a --- /dev/null +++ b/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_SF_Z_dep.py @@ -0,0 +1,99 @@ +import matplotlib + +matplotlib.use("Agg") +from pylab import * +from scipy import stats + +# Plot parameters +params = { + "axes.labelsize": 10, + "axes.titlesize": 10, + "font.size": 9, + "font.sans-serif": [ + "Computer Modern", + "Computer Modern Roman", + "CMU Serif", + "cmunrm", + "DejaVu Sans", + ], + "mathtext.fontset": "cm", + "legend.fontsize": 9, + "xtick.labelsize": 10, + "ytick.labelsize": 10, + "text.usetex": False, + "figure.figsize": (3.15, 3.15), + "lines.markersize": 6, + "figure.subplot.left": 0.15, + "figure.subplot.right": 0.99, + "figure.subplot.bottom": 0.13, + "figure.subplot.top": 0.99, + "figure.subplot.wspace": 0.15, + "figure.subplot.hspace": 0.12, + "lines.linewidth": 2.0, +} + +rcParams.update(params) + +# Metal dependance parameters +Z_0 = 0.002 +norm = 0.1 +slope = -0.64 +max_n = 10.0 + +# Function +Z = logspace(-8, 3, 1000) +n = norm * (Z / Z_0) ** slope +n = np.minimum(n, np.ones(np.size(n)) * (max_n)) + + +# Plot the phase space diagram +figure() +subplot(111, xscale="log", yscale="log") + +plot(Z, n, "k-", lw=1.0) + +plot([3e-4, 3e-2], [1.0, 1.0 * 100.0 ** (slope)], "k--", lw=0.6) +plot([1e-10, 1e10], [max_n, max_n], "k:", lw=0.6) +plot([Z_0, Z_0], [1e-10, norm], "k:", lw=0.6) +plot([1e-10, Z_0], [norm, norm], "k:", lw=0.6) +scatter([Z_0], [norm], s=4, color="k") + +annotate( + "", + xy=(0.014, 1e-3), + xytext=(0.014, 3e-4), + arrowprops=dict( + facecolor="black", shrink=0.0, width=0.1, headwidth=3.0, headlength=5.0 + ), +) +text(0.016, 3.5e-4, "${Z_\\odot}$", fontsize=9) + +text( + 3e-4, + 1.45, + "Z^threshold_slope", + va="top", + rotation=-40, + fontsize=7, + family="monospace", +) +text(3e-5, 12.0, "threshold_max_density_H_p_cm3", fontsize=7, family="monospace") +text(3e-7, 0.12, "threshold_norm_H_p_cm3", fontsize=7, family="monospace") +text( + 0.0018, + 0.0004, + "threshold_Z0", + rotation=90, + va="bottom", + ha="right", + fontsize=7, + family="monospace", +) + +xlabel("Metallicity (metal mass fraction) $Z$ [-]", labelpad=2) +ylabel("SF threshold number density $n_{\\rm H, thresh}$ [cm$^{-3}$]", labelpad=-1) + +xlim(1e-7, 1.0) +ylim(0.0002, 50) + +savefig("EAGLE_SF_Z_dep.svg", dpi=200) 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 5b02dd657fdb32e411961f04d0d758119344b809..1e7dad6c95211a8e43805a904fb8d9901305b692 100644 --- a/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_entropy_floor.py +++ b/doc/RTD/source/SubgridModels/EAGLE/plot_EAGLE_entropy_floor.py @@ -1,4 +1,5 @@ import matplotlib + matplotlib.use("Agg") from pylab import * from scipy import stats @@ -8,53 +9,97 @@ params = { "axes.labelsize": 10, "axes.titlesize": 10, "font.size": 9, + "font.sans-serif": [ + "Computer Modern", + "Computer Modern Roman", + "CMU Serif", + "cmunrm", + "DejaVu Sans", + ], + "mathtext.fontset": "cm", "legend.fontsize": 9, "xtick.labelsize": 10, "ytick.labelsize": 10, - "text.usetex": True, + "text.usetex": False, "figure.figsize": (3.15, 3.15), + "lines.markersize": 6, "figure.subplot.left": 0.15, "figure.subplot.right": 0.99, "figure.subplot.bottom": 0.13, "figure.subplot.top": 0.99, "figure.subplot.wspace": 0.15, "figure.subplot.hspace": 0.12, - "lines.markersize": 6, "lines.linewidth": 2.0, - "text.latex.unicode": True, } + rcParams.update(params) -rc("font", **{"family": "sans-serif", "sans-serif": ["Times"]}) # Equations of state eos_cool_rho = np.logspace(-5, 5, 1000) -eos_cool_T = eos_cool_rho**0. * 8000. +eos_cool_T = eos_cool_rho ** 0.0 * 8000.0 eos_Jeans_rho = np.logspace(-1, 5, 1000) -eos_Jeans_T = (eos_Jeans_rho/ 10**(-1))**(1./3.) * 4000. +eos_Jeans_T = (eos_Jeans_rho / 10 ** (-1)) ** (1.0 / 3.0) * 4000.0 # Plot the phase space diagram figure() subplot(111, xscale="log", yscale="log") -plot(eos_cool_rho, eos_cool_T, 'k-', lw=1.) -plot(eos_Jeans_rho, eos_Jeans_T, 'k-', lw=1.) -plot([1e-10, 1e-5], [8000, 8000], 'k:', lw=0.6) -plot([1e-10, 1e-1], [4000, 4000], 'k:', lw=0.6) -plot([1e-5, 1e-5], [20, 8000], 'k:', lw=0.6) -plot([1e-1, 1e-1], [20, 4000], 'k:', lw=0.6) -plot([3e-6, 3e-4], [28000, 28000], 'k--', lw=0.6) -text(3e-6, 22500, "$n_{\\rm H}~\\widehat{}~{\\tt Cool\\_gamma\\_effective}$", va="top", fontsize=7) -plot([3e-1, 3e1], [15000., 15000.*10.**(2./3.)], 'k--', lw=0.6) -text(3e-1, 200000, "$n_{\\rm H}~\\widehat{}~{\\tt Jeans\\_gamma\\_effective}$", va="top", rotation=43, fontsize=7) -text(0.95e-5, 25, "${\\tt Cool\\_density\\_threshold\\_H\\_p\\_cm3}$", rotation=90, va="bottom", ha="right", fontsize=7) -text(0.95e-1, 25, "${\\tt Jeans\\_density\\_threshold\\_H\\_p\\_cm3}$", rotation=90, va="bottom", ha="right", fontsize=7) -text(5e-8, 8800, "${\\tt Cool\\_temperature\\_norm\\_K}$", va="bottom", fontsize=7) -text(5e-8, 4400, "${\\tt Jeans\\_temperature\\_norm\\_K}$", va="bottom", fontsize=7) -fill_between([1e-5, 1e5], [10, 10], [8000, 8000], color='0.9') -fill_between([1e-1, 1e5], [4000, 400000], color='0.9') -scatter([1e-5], [8000], s=4, color='k') -scatter([1e-1], [4000], s=4, color='k') -xlabel("${\\rm Density}~n_{\\rm H}~[{\\rm cm^{-3}}]$", labelpad=0) -ylabel("${\\rm Temperature}~T~[{\\rm K}]$", labelpad=2) +plot(eos_cool_rho, eos_cool_T, "k-", lw=1.0) +plot(eos_Jeans_rho, eos_Jeans_T, "k-", lw=1.0) +plot([1e-10, 1e-5], [8000, 8000], "k:", lw=0.6) +plot([1e-10, 1e-1], [4000, 4000], "k:", lw=0.6) +plot([1e-5, 1e-5], [20, 8000], "k:", lw=0.6) +plot([1e-1, 1e-1], [20, 4000], "k:", lw=0.6) +plot([3e-6, 3e-4], [28000, 28000], "k--", lw=0.6) + +text( + 3e-6, + 22500, + "$n_{\\rm H}$^Cool_gamma_effective", + va="top", + fontsize=6, + family="monospace", +) +plot([3e-1, 3e1], [15000.0, 15000.0 * 10.0 ** (2.0 / 3.0)], "k--", lw=0.6) +text( + 3e-1, + 200000, + "$n_{\\rm H}$^Jeans_gamma_effective", + va="top", + rotation=43, + fontsize=6, + family="monospace", +) +text( + 0.95e-5, + 23, + "Cool_density_threshold_H_p_cm3", + rotation=90, + va="bottom", + ha="right", + fontsize=6, + family="monospace", +) +text( + 0.95e-1, + 23, + "Jeans_density_threshold_H_p_cm3", + rotation=90, + va="bottom", + ha="right", + fontsize=5.5, + family="monospace", +) +text(5e-8, 8800, "Cool_temperature_norm_K", va="bottom", fontsize=6, family="monospace") +text( + 5e-8, 4400, "Jeans_temperature_norm_K", va="bottom", fontsize=6, family="monospace" +) +fill_between([1e-5, 1e5], [10, 10], [8000, 8000], color="0.9") +fill_between([1e-1, 1e5], [4000, 400000], color="0.9") +scatter([1e-5], [8000], s=4, color="k") +scatter([1e-1], [4000], s=4, color="k") +xlabel("Hydrogen number density $n_{\\rm H}$ [cm$^{-3}$]", labelpad=0) +ylabel("Temperature $T$ [K]", labelpad=2) xlim(3e-8, 3e3) -ylim(20., 2e5) -savefig("EAGLE_entropy_floor.png", dpi=200) +ylim(20.0, 2e5) + +savefig("EAGLE_entropy_floor.svg", dpi=200) diff --git a/examples/EAGLE_ICs/EAGLE_25/README b/examples/EAGLE_ICs/EAGLE_25/README new file mode 100644 index 0000000000000000000000000000000000000000..abe441a5f2f1edb32dfa638f737b775c473524fe --- /dev/null +++ b/examples/EAGLE_ICs/EAGLE_25/README @@ -0,0 +1,3 @@ +Initial conditions corresponding to the 25 Mpc volume +of the EAGLE suite. The ICs only contain DM particles. The +gas particles will be generated in SWIFT. diff --git a/examples/EAGLE_ICs/EAGLE_25/eagle_25.yml b/examples/EAGLE_ICs/EAGLE_25/eagle_25.yml new file mode 100644 index 0000000000000000000000000000000000000000..ac8be3ecec4e56af2e910bb104038b033af59078 --- /dev/null +++ b/examples/EAGLE_ICs/EAGLE_25/eagle_25.yml @@ -0,0 +1,115 @@ +# Define the system of units to use internally. +InternalUnitSystem: + UnitMass_in_cgs: 1.98848e43 # 10^10 M_sun in grams + UnitLength_in_cgs: 3.08567758e24 # Mpc in centimeters + UnitVelocity_in_cgs: 1e5 # km/s in centimeters per second + UnitCurrent_in_cgs: 1 # Amperes + UnitTemp_in_cgs: 1 # Kelvin + +# Cosmological parameters +Cosmology: + h: 0.6777 # Reduced Hubble constant + a_begin: 0.0078125 # Initial scale-factor of the simulation + a_end: 1.0 # Final scale factor of the simulation + Omega_m: 0.307 # Matter density parameter + Omega_lambda: 0.693 # Dark-energy density parameter + Omega_b: 0.0455 # Baryon density parameter + +# Parameters governing the time integration +TimeIntegration: + dt_min: 1e-10 # The minimal time-step size of the simulation (in internal units). + dt_max: 1e-2 # The maximal time-step size of the simulation (in internal units). + +# Parameters governing the snapshots +Snapshots: + basename: eagle # Common part of the name of output files + scale_factor_first: 0.05 + delta_time: 1.02 + +# Parameters governing the conserved quantities statistics +Statistics: + delta_time: 1.02 + scale_factor_first: 0.05 + +# Parameters for the self-gravity scheme +Gravity: + eta: 0.025 # Constant dimensionless multiplier for time integration. + theta: 0.7 # Opening angle (Multipole acceptance criterion) + comoving_softening: 0.0026994 # Comoving softening length (in internal units). + max_physical_softening: 0.0007 # Physical softening length (in internal units). + mesh_side_length: 128 + +# Parameters for the hydrodynamics scheme +SPH: + resolution_eta: 1.2348 # Target smoothing length in units of the mean inter-particle separation (1.2348 == 48Ngbs with the cubic spline kernel). + h_min_ratio: 0.1 # Minimal smoothing in units of softening. + CFL_condition: 0.1 # Courant-Friedrich-Levy condition for time integration. + minimal_temperature: 100.0 # (internal units) + initial_temperature: 268.7 + +Scheduler: + max_top_level_cells: 16 + cell_split_size: 100 + tasks_per_cell: 5 + +Restarts: + delta_hours: 1.0 + +# Parameters related to the initial conditions +InitialConditions: + file_name: EAGLE_L0025N0376_ICs.hdf5 + periodic: 1 + cleanup_h_factors: 1 # Remove the h-factors inherited from Gadget + cleanup_velocity_factors: 1 # Remove the sqrt(a) factor in the velocities inherited from Gadget + generate_gas_in_ics: 1 # Generate gas particles from the DM-only ICs + cleanup_smoothing_lengths: 1 # Since we generate gas, make use of the (expensive) cleaning-up procedure. + +# Impose primoridal metallicity +EAGLEChemistry: + init_abundance_metal: 0. + init_abundance_Hydrogen: 0.752 + init_abundance_Helium: 0.248 + init_abundance_Carbon: 0.0 + init_abundance_Nitrogen: 0.0 + init_abundance_Oxygen: 0.0 + init_abundance_Neon: 0.0 + init_abundance_Magnesium: 0.0 + init_abundance_Silicon: 0.0 + init_abundance_Iron: 0.0 + +# EAGLE cooling parameters +EAGLECooling: + dir_name: ./coolingtables/ + H_reion_z: 11.5 + H_reion_eV_p_H: 2.0 + He_reion_z_centre: 3.5 + He_reion_z_sigma: 0.5 + He_reion_eV_p_H: 2.0 + +# EAGLE star formation parameters +EAGLEStarFormation: + EOS_density_norm_H_p_cm3: 0.1 # Physical density used for the normalisation of the EOS assumed for the star-forming gas in Hydrogen atoms per cm^3. + EOS_temperature_norm_K: 8000 # Temperature om the polytropic EOS assumed for star-forming gas at the density normalisation in Kelvin. + EOS_gamma_effective: 1.3333333 # Slope the of the polytropic EOS assumed for the star-forming gas. + KS_normalisation: 1.515e-4 # The normalization of the Kennicutt-Schmidt law in Msun / kpc^2 / yr. + KS_exponent: 1.4 # The exponent of the Kennicutt-Schmidt law. + KS_min_over_density: 57.7 # The over-density above which star-formation is allowed. + KS_high_density_threshold_H_p_cm3: 1e3 # Hydrogen number density above which the Kennicut-Schmidt law changes slope in Hydrogen atoms per cm^3. + KS_high_density_exponent: 2.0 # Slope of the Kennicut-Schmidt law above the high-density threshold. + KS_temperature_margin_dex: 0.5 # Logarithm base 10 of the maximal temperature difference above the EOS allowed to form stars. + threshold_norm_H_p_cm3: 0.1 # Normalisation of the metal-dependant density threshold for star formation in Hydrogen atoms per cm^3. + threshold_Z0: 0.002 # Reference metallicity (metal mass fraction) for the metal-dependant threshold for star formation. + threshold_slope: -0.64 # Slope of the metal-dependant star formation threshold + threshold_max_density_H_p_cm3: 10.0 # Maximal density of the metal-dependant density threshold for star formation in Hydrogen atoms per cm^3. + +# Parameters for the EAGLE "equation of state" +EAGLEEntropyFloor: + Jeans_density_threshold_H_p_cm3: 0.1 # Physical density above which the EAGLE Jeans limiter entropy floor kicks in expressed in Hydrogen atoms per cm^3. + Jeans_over_density_threshold: 10. # Overdensity above which the EAGLE Jeans limiter entropy floor can kick in. + Jeans_temperature_norm_K: 8000 # Temperature of the EAGLE Jeans limiter entropy floor at the density threshold expressed in Kelvin. + Jeans_gamma_effective: 1.3333333 # Slope the of the EAGLE Jeans limiter entropy floor + Cool_density_threshold_H_p_cm3: 1e-5 # Physical density above which the EAGLE Cool limiter entropy floor kicks in expressed in Hydrogen atoms per cm^3. + Cool_over_density_threshold: 10. # Overdensity above which the EAGLE Cool limiter entropy floor can kick in. + Cool_temperature_norm_K: 8000 # Temperature of the EAGLE Cool limiter entropy floor at the density threshold expressed in Kelvin. + Cool_gamma_effective: 1. # Slope the of the EAGLE Cool limiter entropy floor + diff --git a/examples/EAGLE_ICs/EAGLE_25/getIC.sh b/examples/EAGLE_ICs/EAGLE_25/getIC.sh new file mode 100755 index 0000000000000000000000000000000000000000..ad07fdb46633f86e8f7ffd63f5468f5203c6196c --- /dev/null +++ b/examples/EAGLE_ICs/EAGLE_25/getIC.sh @@ -0,0 +1,2 @@ +#!/bin/bash +wget http://virgodb.cosma.dur.ac.uk/swift-webstorage/ICs/EAGLE_ICs/EAGLE_L0025N0376_ICs.hdf5 diff --git a/examples/EAGLE_ICs/EAGLE_25/run.sh b/examples/EAGLE_ICs/EAGLE_25/run.sh new file mode 100755 index 0000000000000000000000000000000000000000..8b317183d850d5048253fedb8db7e24edd9c02da --- /dev/null +++ b/examples/EAGLE_ICs/EAGLE_25/run.sh @@ -0,0 +1,11 @@ +#!/bin/bash + + # Generate the initial conditions if they are not present. +if [ ! -e EAGLE_L0025N0376_ICs.hdf5 ] +then + echo "Fetching initial conditions for the EAGLE 25Mpc example..." + ./getIC.sh +fi + +../../swift --cosmology --hydro --self-gravity --stars --threads=16 eagle_25.yml 2>&1 | tee output.log + diff --git a/examples/EAGLE_ICs/EAGLE_50/README b/examples/EAGLE_ICs/EAGLE_50/README new file mode 100644 index 0000000000000000000000000000000000000000..0d2032b73069aa903bbcc2fae1d0fa0d3f7c6090 --- /dev/null +++ b/examples/EAGLE_ICs/EAGLE_50/README @@ -0,0 +1,3 @@ +Initial conditions corresponding to the 50 Mpc volume +of the EAGLE suite. The ICs only contain DM particles. The +gas particles will be generated in SWIFT. diff --git a/examples/EAGLE_ICs/EAGLE_50/eagle_50.yml b/examples/EAGLE_ICs/EAGLE_50/eagle_50.yml new file mode 100644 index 0000000000000000000000000000000000000000..528f11f763274b8d793a525201712f1fb6603e4a --- /dev/null +++ b/examples/EAGLE_ICs/EAGLE_50/eagle_50.yml @@ -0,0 +1,115 @@ +# Define the system of units to use internally. +InternalUnitSystem: + UnitMass_in_cgs: 1.98848e43 # 10^10 M_sun in grams + UnitLength_in_cgs: 3.08567758e24 # Mpc in centimeters + UnitVelocity_in_cgs: 1e5 # km/s in centimeters per second + UnitCurrent_in_cgs: 1 # Amperes + UnitTemp_in_cgs: 1 # Kelvin + +# Cosmological parameters +Cosmology: + h: 0.6777 # Reduced Hubble constant + a_begin: 0.0078125 # Initial scale-factor of the simulation + a_end: 1.0 # Final scale factor of the simulation + Omega_m: 0.307 # Matter density parameter + Omega_lambda: 0.693 # Dark-energy density parameter + Omega_b: 0.0455 # Baryon density parameter + +# Parameters governing the time integration +TimeIntegration: + dt_min: 1e-10 # The minimal time-step size of the simulation (in internal units). + dt_max: 1e-2 # The maximal time-step size of the simulation (in internal units). + +# Parameters governing the snapshots +Snapshots: + basename: eagle # Common part of the name of output files + scale_factor_first: 0.05 + delta_time: 1.02 + +# Parameters governing the conserved quantities statistics +Statistics: + delta_time: 1.02 + scale_factor_first: 0.05 + +# Parameters for the self-gravity scheme +Gravity: + eta: 0.025 # Constant dimensionless multiplier for time integration. + theta: 0.7 # Opening angle (Multipole acceptance criterion) + comoving_softening: 0.0026994 # Comoving softening length (in internal units). + max_physical_softening: 0.0007 # Physical softening length (in internal units). + mesh_side_length: 256 + +# Parameters for the hydrodynamics scheme +SPH: + resolution_eta: 1.2348 # Target smoothing length in units of the mean inter-particle separation (1.2348 == 48Ngbs with the cubic spline kernel). + h_min_ratio: 0.1 # Minimal smoothing in units of softening. + CFL_condition: 0.1 # Courant-Friedrich-Levy condition for time integration. + minimal_temperature: 100.0 # (internal units) + initial_temperature: 268.7 + +Scheduler: + max_top_level_cells: 32 + cell_split_size: 100 + tasks_per_cell: 5 + +Restarts: + delta_hours: 1.0 + +# Parameters related to the initial conditions +InitialConditions: + file_name: EAGLE_L0050N0752_ICs.hdf5 + periodic: 1 + cleanup_h_factors: 1 # Remove the h-factors inherited from Gadget + cleanup_velocity_factors: 1 # Remove the sqrt(a) factor in the velocities inherited from Gadget + generate_gas_in_ics: 1 # Generate gas particles from the DM-only ICs + cleanup_smoothing_lengths: 1 # Since we generate gas, make use of the (expensive) cleaning-up procedure. + +# Impose primoridal metallicity +EAGLEChemistry: + init_abundance_metal: 0. + init_abundance_Hydrogen: 0.752 + init_abundance_Helium: 0.248 + init_abundance_Carbon: 0.0 + init_abundance_Nitrogen: 0.0 + init_abundance_Oxygen: 0.0 + init_abundance_Neon: 0.0 + init_abundance_Magnesium: 0.0 + init_abundance_Silicon: 0.0 + init_abundance_Iron: 0.0 + +# EAGLE cooling parameters +EAGLECooling: + dir_name: ./coolingtables/ + H_reion_z: 11.5 + H_reion_eV_p_H: 2.0 + He_reion_z_centre: 3.5 + He_reion_z_sigma: 0.5 + He_reion_eV_p_H: 2.0 + +# EAGLE star formation parameters +EAGLEStarFormation: + EOS_density_norm_H_p_cm3: 0.1 # Physical density used for the normalisation of the EOS assumed for the star-forming gas in Hydrogen atoms per cm^3. + EOS_temperature_norm_K: 8000 # Temperature om the polytropic EOS assumed for star-forming gas at the density normalisation in Kelvin. + EOS_gamma_effective: 1.3333333 # Slope the of the polytropic EOS assumed for the star-forming gas. + KS_normalisation: 1.515e-4 # The normalization of the Kennicutt-Schmidt law in Msun / kpc^2 / yr. + KS_exponent: 1.4 # The exponent of the Kennicutt-Schmidt law. + KS_min_over_density: 57.7 # The over-density above which star-formation is allowed. + KS_high_density_threshold_H_p_cm3: 1e3 # Hydrogen number density above which the Kennicut-Schmidt law changes slope in Hydrogen atoms per cm^3. + KS_high_density_exponent: 2.0 # Slope of the Kennicut-Schmidt law above the high-density threshold. + KS_temperature_margin_dex: 0.5 # Logarithm base 10 of the maximal temperature difference above the EOS allowed to form stars. + threshold_norm_H_p_cm3: 0.1 # Normalisation of the metal-dependant density threshold for star formation in Hydrogen atoms per cm^3. + threshold_Z0: 0.002 # Reference metallicity (metal mass fraction) for the metal-dependant threshold for star formation. + threshold_slope: -0.64 # Slope of the metal-dependant star formation threshold + threshold_max_density_H_p_cm3: 10.0 # Maximal density of the metal-dependant density threshold for star formation in Hydrogen atoms per cm^3. + +# Parameters for the EAGLE "equation of state" +EAGLEEntropyFloor: + Jeans_density_threshold_H_p_cm3: 0.1 # Physical density above which the EAGLE Jeans limiter entropy floor kicks in expressed in Hydrogen atoms per cm^3. + Jeans_over_density_threshold: 10. # Overdensity above which the EAGLE Jeans limiter entropy floor can kick in. + Jeans_temperature_norm_K: 8000 # Temperature of the EAGLE Jeans limiter entropy floor at the density threshold expressed in Kelvin. + Jeans_gamma_effective: 1.3333333 # Slope the of the EAGLE Jeans limiter entropy floor + Cool_density_threshold_H_p_cm3: 1e-5 # Physical density above which the EAGLE Cool limiter entropy floor kicks in expressed in Hydrogen atoms per cm^3. + Cool_over_density_threshold: 10. # Overdensity above which the EAGLE Cool limiter entropy floor can kick in. + Cool_temperature_norm_K: 8000 # Temperature of the EAGLE Cool limiter entropy floor at the density threshold expressed in Kelvin. + Cool_gamma_effective: 1. # Slope the of the EAGLE Cool limiter entropy floor + diff --git a/examples/EAGLE_ICs/EAGLE_50/getIC.sh b/examples/EAGLE_ICs/EAGLE_50/getIC.sh new file mode 100755 index 0000000000000000000000000000000000000000..9c16c69eb7979e66d291134642e4fe3d39314774 --- /dev/null +++ b/examples/EAGLE_ICs/EAGLE_50/getIC.sh @@ -0,0 +1,2 @@ +#!/bin/bash +wget http://virgodb.cosma.dur.ac.uk/swift-webstorage/ICs/EAGLE_ICs/EAGLE_L0050N0752_ICs.hdf5 diff --git a/examples/EAGLE_ICs/EAGLE_50/run.sh b/examples/EAGLE_ICs/EAGLE_50/run.sh new file mode 100755 index 0000000000000000000000000000000000000000..3ef38da33fe1cc820e3ee5e7afb620e7e9109196 --- /dev/null +++ b/examples/EAGLE_ICs/EAGLE_50/run.sh @@ -0,0 +1,11 @@ +#!/bin/bash + + # Generate the initial conditions if they are not present. +if [ ! -e EAGLE_L0050N0752_ICs.hdf5 ] +then + echo "Fetching initial conditions for the EAGLE 50Mpc example..." + ./getIC.sh +fi + +../../swift --cosmology --hydro --self-gravity --stars --threads=16 eagle_50.yml 2>&1 | tee output.log + diff --git a/examples/EAGLE_low_z/EAGLE_12/README b/examples/EAGLE_low_z/EAGLE_12/README index 856e2d9cf2c54e61ae172036e5be7ae9dd450f60..9fb2930f625fd2e85293b9ebcc91f46e59f02745 100644 --- a/examples/EAGLE_low_z/EAGLE_12/README +++ b/examples/EAGLE_low_z/EAGLE_12/README @@ -13,4 +13,4 @@ The particle load of the main EAGLE simulation can be reproduced by running these ICs on 8 cores. MD5 checksum of the ICs: -88877f5bb0ee21488c20b8f065fc74db EAGLE_ICs_12.hdf5 +d1ebf1c7ffb0488c3628e08ed6d2dbf4 EAGLE_ICs_12.hdf5 diff --git a/examples/EAGLE_low_z/EAGLE_12/eagle_12.yml b/examples/EAGLE_low_z/EAGLE_12/eagle_12.yml index ada36234d6a9691a8d78a33a047088920e2c6a11..cc9a3019cc235948c4d8ecc3a6ea7d71da537129 100644 --- a/examples/EAGLE_low_z/EAGLE_12/eagle_12.yml +++ b/examples/EAGLE_low_z/EAGLE_12/eagle_12.yml @@ -83,7 +83,6 @@ EAGLEStarFormation: EOS_density_norm_H_p_cm3: 0.1 # Physical density used for the normalisation of the EOS assumed for the star-forming gas in Hydrogen atoms per cm^3. EOS_temperature_norm_K: 8000 # Temperature om the polytropic EOS assumed for star-forming gas at the density normalisation in Kelvin. EOS_gamma_effective: 1.3333333 # Slope the of the polytropic EOS assumed for the star-forming gas. - gas_fraction: 0.3 # The gas fraction used internally by the model. KS_normalisation: 1.515e-4 # The normalization of the Kennicutt-Schmidt law in Msun / kpc^2 / yr. KS_exponent: 1.4 # The exponent of the Kennicutt-Schmidt law. KS_min_over_density: 57.7 # The over-density above which star-formation is allowed. diff --git a/examples/EAGLE_low_z/EAGLE_25/README b/examples/EAGLE_low_z/EAGLE_25/README index 88fc1ea3eede1e254907dd5ba1dbf2eaa81fb694..0fe37964d3734b63acd10195822e11094219586a 100644 --- a/examples/EAGLE_low_z/EAGLE_25/README +++ b/examples/EAGLE_low_z/EAGLE_25/README @@ -13,4 +13,4 @@ The particle load of the main EAGLE simulation can be reproduced by running these ICs on 64 cores. MD5 checksum of the ICs: -02cd1c353b86230af047b5d4ab22afcf EAGLE_ICs_25.hdf5 +592faecfc51239a00396f5a4acc2fa4d EAGLE_ICs_25.hdf5 diff --git a/examples/EAGLE_low_z/EAGLE_25/eagle_25.yml b/examples/EAGLE_low_z/EAGLE_25/eagle_25.yml index b1d897ec390ca0488229c460a4308c1ee793dbf7..02927925bf9e80a180baa1096b2db40aba2ea0f6 100644 --- a/examples/EAGLE_low_z/EAGLE_25/eagle_25.yml +++ b/examples/EAGLE_low_z/EAGLE_25/eagle_25.yml @@ -90,7 +90,6 @@ EAGLEStarFormation: EOS_density_norm_H_p_cm3: 0.1 # Physical density used for the normalisation of the EOS assumed for the star-forming gas in Hydrogen atoms per cm^3. EOS_temperature_norm_K: 8000 # Temperature om the polytropic EOS assumed for star-forming gas at the density normalisation in Kelvin. EOS_gamma_effective: 1.3333333 # Slope the of the polytropic EOS assumed for the star-forming gas. - gas_fraction: 0.3 # The gas fraction used internally by the model. KS_normalisation: 1.515e-4 # The normalization of the Kennicutt-Schmidt law in Msun / kpc^2 / yr. KS_exponent: 1.4 # The exponent of the Kennicutt-Schmidt law. KS_min_over_density: 57.7 # The over-density above which star-formation is allowed. diff --git a/examples/EAGLE_low_z/EAGLE_50/README b/examples/EAGLE_low_z/EAGLE_50/README index f6ae9cd9537ad224ba63eaff2daba25dfd19718c..211360be35f83423160ceb9912f7f0ce9ee444c8 100644 --- a/examples/EAGLE_low_z/EAGLE_50/README +++ b/examples/EAGLE_low_z/EAGLE_50/README @@ -13,4 +13,4 @@ The particle load of the main EAGLE simulation can be reproduced by running these ICs on 512 cores. MD5 checksum of the ICs: -3591b579bd108ddf0e555092bdfbf97f EAGLE_ICs_50.hdf5 +203985136c665e8677a4faa77f94110a EAGLE_ICs_50.hdf5 diff --git a/examples/EAGLE_low_z/EAGLE_50/eagle_50.yml b/examples/EAGLE_low_z/EAGLE_50/eagle_50.yml index c837c88d870f21907b9fe7fc1408c5df8db5dd0c..7b7ae35bfa2f72686c7479b8f19ef6c2950c0c22 100644 --- a/examples/EAGLE_low_z/EAGLE_50/eagle_50.yml +++ b/examples/EAGLE_low_z/EAGLE_50/eagle_50.yml @@ -85,7 +85,6 @@ EAGLEStarFormation: EOS_density_norm_H_p_cm3: 0.1 # Physical density used for the normalisation of the EOS assumed for the star-forming gas in Hydrogen atoms per cm^3. EOS_temperature_norm_K: 8000 # Temperature om the polytropic EOS assumed for star-forming gas at the density normalisation in Kelvin. EOS_gamma_effective: 1.3333333 # Slope the of the polytropic EOS assumed for the star-forming gas. - gas_fraction: 0.3 # The gas fraction used internally by the model. KS_normalisation: 1.515e-4 # The normalization of the Kennicutt-Schmidt law in Msun / kpc^2 / yr. KS_exponent: 1.4 # The exponent of the Kennicutt-Schmidt law. KS_min_over_density: 57.7 # The over-density above which star-formation is allowed. diff --git a/examples/EAGLE_low_z/EAGLE_6/README b/examples/EAGLE_low_z/EAGLE_6/README index 9fe951252f1abf4e27264c6497ec14451080b01e..844c779e222b1cd7ebefaa61d637092a5a8c1e79 100644 --- a/examples/EAGLE_low_z/EAGLE_6/README +++ b/examples/EAGLE_low_z/EAGLE_6/README @@ -10,4 +10,4 @@ been removed. Everything is ready to be run without cosmological integration. MD5 checksum of the ICs: -a4efccd3646a60ad8600ac3a2895ea82 EAGLE_ICs_6.hdf5 +1923db3cf59b2e80b23e4e1aee13e012 EAGLE_ICs_6.hdf5 diff --git a/examples/EAGLE_low_z/EAGLE_6/eagle_6.yml b/examples/EAGLE_low_z/EAGLE_6/eagle_6.yml index 4f68413fa4c69b8e2b9ff28e66f4f269d21a1a7b..e4b175b622610bfb4edcd0ad168cf23d1df2b2ba 100644 --- a/examples/EAGLE_low_z/EAGLE_6/eagle_6.yml +++ b/examples/EAGLE_low_z/EAGLE_6/eagle_6.yml @@ -94,7 +94,6 @@ EAGLEStarFormation: EOS_density_norm_H_p_cm3: 0.1 # Physical density used for the normalisation of the EOS assumed for the star-forming gas in Hydrogen atoms per cm^3. EOS_temperature_norm_K: 8000 # Temperature om the polytropic EOS assumed for star-forming gas at the density normalisation in Kelvin. EOS_gamma_effective: 1.3333333 # Slope the of the polytropic EOS assumed for the star-forming gas. - gas_fraction: 0.3 # The gas fraction used internally by the model. KS_normalisation: 1.515e-4 # The normalization of the Kennicutt-Schmidt law in Msun / kpc^2 / yr. KS_exponent: 1.4 # The exponent of the Kennicutt-Schmidt law. KS_min_over_density: 57.7 # The over-density above which star-formation is allowed. diff --git a/examples/IsolatedGalaxy/IsolatedGalaxy_starformation/isolated_galaxy.yml b/examples/IsolatedGalaxy/IsolatedGalaxy_starformation/isolated_galaxy.yml index 7dac0a8a6c3b8d4c583ae6138513f0c5259227b1..341cae8a3fe87e01aecd6c77bf8f86a9cc940bf1 100644 --- a/examples/IsolatedGalaxy/IsolatedGalaxy_starformation/isolated_galaxy.yml +++ b/examples/IsolatedGalaxy/IsolatedGalaxy_starformation/isolated_galaxy.yml @@ -35,7 +35,7 @@ Statistics: # Parameters related to the initial conditions InitialConditions: - file_name: fid.hdf5 # The file to read + file_name: lowres8.hdf5 # The file to read periodic: 0 # Are we running with periodic ICs? stars_smoothing_length: 0.5 diff --git a/examples/IsolatedGalaxy/IsolatedGalaxy_starformation/run.sh b/examples/IsolatedGalaxy/IsolatedGalaxy_starformation/run.sh index f2aa93fd0e11cd9b07be991187cf0780a82ebec8..dc0b49478cdabefbe4dbf3544e097f18593cfb16 100755 --- a/examples/IsolatedGalaxy/IsolatedGalaxy_starformation/run.sh +++ b/examples/IsolatedGalaxy/IsolatedGalaxy_starformation/run.sh @@ -6,7 +6,7 @@ then ./getIC.sh fi -../../swift --threads=32 --external-gravity --self-gravity --stars --star-formation --cooling --temperature --hydro isolated_galaxy.yml 2>&1 | tee output.log +../../swift --threads=16 --external-gravity --self-gravity --stars --star-formation --cooling --hydro isolated_galaxy.yml -v 1 2>&1 | tee output.log # Kennicutt-Schmidt law plot python3 plotSolution.py diff --git a/examples/main.c b/examples/main.c index 6fc5b433719822558d531f4ed2691e7127139a79..52eed321a5cd80f581eeea11f315bc766457b4ab 100644 --- a/examples/main.c +++ b/examples/main.c @@ -120,8 +120,9 @@ int main(int argc, char *argv[]) { if ((res = MPI_Comm_rank(MPI_COMM_WORLD, &myrank)) != MPI_SUCCESS) error("Call to MPI_Comm_rank failed with error %i.", res); - /* Make sure messages are stamped with the correct rank. */ + /* Make sure messages are stamped with the correct rank and step. */ engine_rank = myrank; + engine_current_step = 0; if ((res = MPI_Comm_set_errhandler(MPI_COMM_WORLD, MPI_ERRORS_RETURN)) != MPI_SUCCESS) @@ -343,6 +344,16 @@ int main(int argc, char *argv[]) { return 1; } + if (!with_stars && with_star_formation) { + if (myrank == 0) { + argparse_usage(&argparse); + printf( + "\nError: Cannot process star formation without stars, --stars must " + "be chosen.\n"); + } + return 1; + } + if (!with_stars && with_feedback) { if (myrank == 0) { argparse_usage(&argparse); @@ -470,8 +481,8 @@ int main(int argc, char *argv[]) { #ifdef WITH_MPI if (with_mpole_reconstruction && nr_nodes > 1) error("Cannot reconstruct m-poles every step over MPI (yet)."); - if (with_star_formation) - error("Can't run with star formation over MPI (yet)"); + if (with_star_formation && with_feedback) + error("Can't run with star formation and feedback over MPI (yet)"); if (with_limiter) error("Can't run with time-step limiter over MPI (yet)"); #endif @@ -724,6 +735,39 @@ int main(int argc, char *argv[]) { else bzero(&gravity_properties, sizeof(struct gravity_props)); + /* Initialise the external potential properties */ + bzero(&potential, sizeof(struct external_potential)); + if (with_external_gravity) + potential_init(params, &prog_const, &us, &s, &potential); + if (myrank == 0) potential_print(&potential); + + /* Initialise the cooling function properties */ + bzero(&cooling_func, sizeof(struct cooling_function_data)); + if (with_cooling || with_temperature) { +#ifdef COOLING_NONE + if (with_cooling) + error("ERROR: Running with cooling but compiled without it."); +#endif + cooling_init(params, &us, &prog_const, &cooling_func); + } + if (myrank == 0) cooling_print(&cooling_func); + + /* Initialise the star formation law and its properties */ + bzero(&starform, sizeof(struct star_formation)); + if (with_star_formation) { +#ifdef STAR_FORMATION_NONE + error("ERROR: Running with star formation but compiled without it!"); +#endif + starformation_init(params, &prog_const, &us, &hydro_properties, + &starform); + } + if (with_star_formation && myrank == 0) starformation_print(&starform); + + /* Initialise the chemistry */ + bzero(&chemistry, sizeof(struct chemistry_global_data)); + chemistry_init(params, &us, &prog_const, &chemistry); + if (myrank == 0) chemistry_print(&chemistry); + /* Be verbose about what happens next */ if (myrank == 0) message("Reading ICs from file '%s'", ICfileName); if (myrank == 0 && cleanup_h) @@ -889,30 +933,6 @@ int main(int argc, char *argv[]) { message("nr of cells at depth %i is %i.", data[0], data[1]); } - /* Initialise the external potential properties */ - bzero(&potential, sizeof(struct external_potential)); - if (with_external_gravity) - potential_init(params, &prog_const, &us, &s, &potential); - if (myrank == 0) potential_print(&potential); - - /* Initialise the cooling function properties */ - bzero(&cooling_func, sizeof(struct cooling_function_data)); - if (with_cooling || with_temperature) - cooling_init(params, &us, &prog_const, &cooling_func); - if (myrank == 0) cooling_print(&cooling_func); - - /* Initialise the star formation law and its properties */ - bzero(&starform, sizeof(struct star_formation)); - if (with_star_formation) - starformation_init(params, &prog_const, &us, &hydro_properties, - &starform); - if (with_star_formation && myrank == 0) starformation_print(&starform); - - /* Initialise the chemistry */ - bzero(&chemistry, sizeof(struct chemistry_global_data)); - chemistry_init(params, &us, &prog_const, &chemistry); - if (myrank == 0) chemistry_print(&chemistry); - /* Construct the engine policy */ int engine_policies = ENGINE_POLICY | engine_policy_steal; if (with_drift_all) engine_policies |= engine_policy_drift_all; @@ -1035,6 +1055,19 @@ int main(int argc, char *argv[]) { /* unused parameters */ parser_write_params_to_file(params, "unused_parameters.yml", 0); + /* Dump memory use report if collected for the 0 step. */ +#ifdef SWIFT_MEMUSE_REPORTS + { + char dumpfile[40]; +#ifdef WITH_MPI + snprintf(dumpfile, 40, "memuse_report-rank%d-step%d.dat", engine_rank, 0); +#else + snprintf(dumpfile, 40, "memuse_report-step%d.dat", 0); +#endif // WITH_MPI + memuse_log_dump(dumpfile); + } +#endif + /* Main simulation loop */ /* ==================== */ int force_stop = 0, resubmit = 0; @@ -1082,6 +1115,20 @@ int main(int argc, char *argv[]) { task_dump_stats(dumpfile, &e, /* header = */ 0, /* allranks = */ 1); } + /* Dump memory use report if collected. */ +#ifdef SWIFT_MEMUSE_REPORTS + { + char dumpfile[40]; +#ifdef WITH_MPI + snprintf(dumpfile, 40, "memuse_report-rank%d-step%d.dat", engine_rank, + j + 1); +#else + snprintf(dumpfile, 40, "memuse_report-step%d.dat", j + 1); +#endif // WITH_MPI + memuse_log_dump(dumpfile); + } +#endif + #ifdef SWIFT_DEBUG_THREADPOOL /* Dump the task data using the given frequency. */ if (dump_threadpool && (dump_threadpool == 1 || j % dump_threadpool == 1)) { diff --git a/src/Makefile.am b/src/Makefile.am index fd18996f61242db0ec37f4df1da9e617b622a729..d7e4249a7ff67132505e3a7df8a134d4cd8b266c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -51,7 +51,7 @@ include_HEADERS = space.h runner.h queue.h task.h lock.h cell.h part.h const.h \ mesh_gravity.h cbrt.h exp10.h velociraptor_interface.h swift_velociraptor_part.h outputlist.h \ logger_io.h tracers_io.h tracers.h tracers_struct.h star_formation_io.h \ star_formation_struct.h star_formation.h star_formation_iact.h \ - velociraptor_struct.h velociraptor_io.h random.h + velociraptor_struct.h velociraptor_io.h random.h memuse.h # source files for EAGLE cooling EAGLE_COOLING_SOURCES = @@ -70,7 +70,8 @@ AM_SOURCES = space.c runner.c queue.c task.c cell.c engine.c engine_maketasks.c part_type.c xmf.c gravity_properties.c gravity.c \ collectgroup.c hydro_space.c equation_of_state.c \ chemistry.c cosmology.c restart.c mesh_gravity.c velociraptor_interface.c \ - outputlist.c velociraptor_dummy.c logger_io.c $(EAGLE_COOLING_SOURCES) + outputlist.c velociraptor_dummy.c logger_io.c memuse.c \ + $(EAGLE_COOLING_SOURCES) # Include files for distribution, not installation. nobase_noinst_HEADERS = align.h approx_math.h atomic.h barrier.h cycle.h error.h inline.h kernel_hydro.h kernel_gravity.h \ diff --git a/src/cell.c b/src/cell.c index c7c10bcf666f576b0689660edcf7af7552a5eb15..c4b738e112cbe2a11c2de0189aa04152476eacc0 100644 --- a/src/cell.c +++ b/src/cell.c @@ -614,26 +614,21 @@ int cell_unpack_tags(const int *tags, struct cell *restrict c) { * * @return The number of packed cells. */ -int cell_pack_end_step(struct cell *restrict c, - struct pcell_step *restrict pcells) { +int cell_pack_end_step_hydro(struct cell *restrict c, + struct pcell_step_hydro *restrict pcells) { #ifdef WITH_MPI /* Pack this cell's data. */ - pcells[0].hydro.ti_end_min = c->hydro.ti_end_min; - pcells[0].hydro.ti_end_max = c->hydro.ti_end_max; - pcells[0].grav.ti_end_min = c->grav.ti_end_min; - pcells[0].grav.ti_end_max = c->grav.ti_end_max; - pcells[0].stars.ti_end_min = c->stars.ti_end_min; - pcells[0].stars.ti_end_max = c->stars.ti_end_max; - pcells[0].hydro.dx_max_part = c->hydro.dx_max_part; - pcells[0].stars.dx_max_part = c->stars.dx_max_part; + pcells[0].ti_end_min = c->hydro.ti_end_min; + pcells[0].ti_end_max = c->hydro.ti_end_max; + pcells[0].dx_max_part = c->hydro.dx_max_part; /* Fill in the progeny, depth-first recursion. */ int count = 1; for (int k = 0; k < 8; k++) if (c->progeny[k] != NULL) { - count += cell_pack_end_step(c->progeny[k], &pcells[count]); + count += cell_pack_end_step_hydro(c->progeny[k], &pcells[count]); } /* Return the number of packed values. */ @@ -653,26 +648,155 @@ int cell_pack_end_step(struct cell *restrict c, * * @return The number of cells created. */ -int cell_unpack_end_step(struct cell *restrict c, - struct pcell_step *restrict pcells) { +int cell_unpack_end_step_hydro(struct cell *restrict c, + struct pcell_step_hydro *restrict pcells) { #ifdef WITH_MPI /* Unpack this cell's data. */ - c->hydro.ti_end_min = pcells[0].hydro.ti_end_min; - c->hydro.ti_end_max = pcells[0].hydro.ti_end_max; - c->grav.ti_end_min = pcells[0].grav.ti_end_min; - c->grav.ti_end_max = pcells[0].grav.ti_end_max; - c->stars.ti_end_min = pcells[0].stars.ti_end_min; - c->stars.ti_end_max = pcells[0].stars.ti_end_max; - c->hydro.dx_max_part = pcells[0].hydro.dx_max_part; - c->stars.dx_max_part = pcells[0].stars.dx_max_part; + c->hydro.ti_end_min = pcells[0].ti_end_min; + c->hydro.ti_end_max = pcells[0].ti_end_max; + c->hydro.dx_max_part = pcells[0].dx_max_part; /* Fill in the progeny, depth-first recursion. */ int count = 1; for (int k = 0; k < 8; k++) if (c->progeny[k] != NULL) { - count += cell_unpack_end_step(c->progeny[k], &pcells[count]); + count += cell_unpack_end_step_hydro(c->progeny[k], &pcells[count]); + } + + /* Return the number of packed values. */ + return count; + +#else + error("SWIFT was not compiled with MPI support."); + return 0; +#endif +} + +/** + * @brief Pack the time information of the given cell and all it's sub-cells. + * + * @param c The #cell. + * @param pcells (output) The end-of-timestep information we pack into + * + * @return The number of packed cells. + */ +int cell_pack_end_step_grav(struct cell *restrict c, + struct pcell_step_grav *restrict pcells) { + +#ifdef WITH_MPI + + /* Pack this cell's data. */ + pcells[0].ti_end_min = c->grav.ti_end_min; + pcells[0].ti_end_max = c->grav.ti_end_max; + + /* Fill in the progeny, depth-first recursion. */ + int count = 1; + for (int k = 0; k < 8; k++) + if (c->progeny[k] != NULL) { + count += cell_pack_end_step_grav(c->progeny[k], &pcells[count]); + } + + /* Return the number of packed values. */ + return count; + +#else + error("SWIFT was not compiled with MPI support."); + return 0; +#endif +} + +/** + * @brief Unpack the time information of a given cell and its sub-cells. + * + * @param c The #cell + * @param pcells The end-of-timestep information to unpack + * + * @return The number of cells created. + */ +int cell_unpack_end_step_grav(struct cell *restrict c, + struct pcell_step_grav *restrict pcells) { + +#ifdef WITH_MPI + + /* Unpack this cell's data. */ + c->grav.ti_end_min = pcells[0].ti_end_min; + c->grav.ti_end_max = pcells[0].ti_end_max; + + /* Fill in the progeny, depth-first recursion. */ + int count = 1; + for (int k = 0; k < 8; k++) + if (c->progeny[k] != NULL) { + count += cell_unpack_end_step_grav(c->progeny[k], &pcells[count]); + } + + /* Return the number of packed values. */ + return count; + +#else + error("SWIFT was not compiled with MPI support."); + return 0; +#endif +} + +/** + * @brief Pack the time information of the given cell and all it's sub-cells. + * + * @param c The #cell. + * @param pcells (output) The end-of-timestep information we pack into + * + * @return The number of packed cells. + */ +int cell_pack_end_step_stars(struct cell *restrict c, + struct pcell_step_stars *restrict pcells) { + +#ifdef WITH_MPI + + /* Pack this cell's data. */ + pcells[0].ti_end_min = c->stars.ti_end_min; + pcells[0].ti_end_max = c->stars.ti_end_max; + pcells[0].dx_max_part = c->stars.dx_max_part; + + /* Fill in the progeny, depth-first recursion. */ + int count = 1; + for (int k = 0; k < 8; k++) + if (c->progeny[k] != NULL) { + count += cell_pack_end_step_stars(c->progeny[k], &pcells[count]); + } + + /* Return the number of packed values. */ + return count; + +#else + error("SWIFT was not compiled with MPI support."); + return 0; +#endif +} + +/** + * @brief Unpack the time information of a given cell and its sub-cells. + * + * @param c The #cell + * @param pcells The end-of-timestep information to unpack + * + * @return The number of cells created. + */ +int cell_unpack_end_step_stars(struct cell *restrict c, + struct pcell_step_stars *restrict pcells) { + +#ifdef WITH_MPI + + /* Unpack this cell's data. */ + c->stars.ti_end_min = pcells[0].ti_end_min; + c->stars.ti_end_max = pcells[0].ti_end_max; + c->stars.dx_max_part = pcells[0].dx_max_part; + + /* Fill in the progeny, depth-first recursion. */ + int count = 1; + for (int k = 0; k < 8; k++) + if (c->progeny[k] != NULL) { + count += cell_unpack_end_step_stars(c->progeny[k], &pcells[count]); } /* Return the number of packed values. */ @@ -1600,6 +1724,8 @@ void cell_reset_task_counters(struct cell *c) { #ifdef SWIFT_DEBUG_CHECKS for (int t = 0; t < task_type_count; ++t) c->tasks_executed[t] = 0; for (int t = 0; t < task_subtype_count; ++t) c->subtasks_executed[t] = 0; + for (int k = 0; k < 8; ++k) + if (c->progeny[k] != NULL) cell_reset_task_counters(c->progeny[k]); #else error("Calling debugging code without debugging flag activated."); #endif @@ -1813,18 +1939,10 @@ void cell_check_multipole(struct cell *c) { void cell_clean(struct cell *c) { /* Hydro */ - for (int i = 0; i < 13; i++) - if (c->hydro.sort[i] != NULL) { - free(c->hydro.sort[i]); - c->hydro.sort[i] = NULL; - } + cell_free_hydro_sorts(c); /* Stars */ - for (int i = 0; i < 13; i++) - if (c->stars.sort[i] != NULL) { - free(c->stars.sort[i]); - c->stars.sort[i] = NULL; - } + cell_free_stars_sorts(c); /* Recurse */ for (int k = 0; k < 8; k++) @@ -1851,6 +1969,32 @@ void cell_clear_limiter_flags(struct cell *c, void *data) { c->hydro.do_sub_limiter = 0; } +/** + * @brief Recurse down in a cell hierarchy until the hydro.super level is + * reached and activate the spart drift at that level. + * + * @param c The #cell to recurse into. + * @param s The #scheduler. + */ +void cell_activate_super_spart_drifts(struct cell *c, struct scheduler *s) { + + if (c == c->hydro.super) { + cell_activate_drift_spart(c, s); + } else { + if (c->split) { + for (int k = 0; k < 8; ++k) { + if (c->progeny[k] != NULL) { + cell_activate_super_spart_drifts(c->progeny[k], s); + } + } + } else { +#ifdef SWIFT_DEBUG_CHECKS + error("Reached a leaf cell without finding a hydro.super!!"); +#endif + } + } +} + /** * @brief Activate the #part drifts on the given cell. */ @@ -3126,7 +3270,8 @@ int cell_unskip_hydro_tasks(struct cell *c, struct scheduler *s) { } /* If the foreign cell is active, we want its ti_end values. */ - if (ci_active || with_limiter) scheduler_activate(s, ci->mpi.recv_ti); + if (ci_active || with_limiter) + scheduler_activate(s, ci->mpi.hydro.recv_ti); if (with_limiter) scheduler_activate(s, ci->mpi.limiter.recv); if (with_limiter) @@ -3154,7 +3299,7 @@ int cell_unskip_hydro_tasks(struct cell *c, struct scheduler *s) { /* If the local cell is active, send its ti_end values. */ if (cj_active || with_limiter) - scheduler_activate_send(s, cj->mpi.send_ti, ci_nodeID); + scheduler_activate_send(s, cj->mpi.hydro.send_ti, ci_nodeID); } else if (cj_nodeID != nodeID) { @@ -3171,7 +3316,8 @@ int cell_unskip_hydro_tasks(struct cell *c, struct scheduler *s) { } /* If the foreign cell is active, we want its ti_end values. */ - if (cj_active || with_limiter) scheduler_activate(s, cj->mpi.recv_ti); + if (cj_active || with_limiter) + scheduler_activate(s, cj->mpi.hydro.recv_ti); if (with_limiter) scheduler_activate(s, cj->mpi.limiter.recv); if (with_limiter) @@ -3200,7 +3346,7 @@ int cell_unskip_hydro_tasks(struct cell *c, struct scheduler *s) { /* If the local cell is active, send its ti_end values. */ if (ci_active || with_limiter) - scheduler_activate_send(s, ci->mpi.send_ti, cj_nodeID); + scheduler_activate_send(s, ci->mpi.hydro.send_ti, cj_nodeID); } #endif } @@ -3228,8 +3374,8 @@ int cell_unskip_hydro_tasks(struct cell *c, struct scheduler *s) { if (c->hydro.cooling != NULL) scheduler_activate(s, c->hydro.cooling); if (c->logger != NULL) scheduler_activate(s, c->logger); - if (c->hydro.star_formation != NULL) { - scheduler_activate(s, c->hydro.star_formation); + if (c->top->hydro.star_formation != NULL) { + scheduler_activate(s, c->top->hydro.star_formation); cell_activate_drift_spart(c, s); } } @@ -3298,7 +3444,7 @@ int cell_unskip_gravity_tasks(struct cell *c, struct scheduler *s) { if (cj_active) scheduler_activate(s, ci->mpi.grav.recv); /* If the foreign cell is active, we want its ti_end values. */ - if (ci_active) scheduler_activate(s, ci->mpi.recv_ti); + if (ci_active) scheduler_activate(s, ci->mpi.grav.recv_ti); /* Is the foreign cell active and will need stuff from us? */ if (ci_active) { @@ -3312,7 +3458,8 @@ int cell_unskip_gravity_tasks(struct cell *c, struct scheduler *s) { } /* If the local cell is active, send its ti_end values. */ - if (cj_active) scheduler_activate_send(s, cj->mpi.send_ti, ci_nodeID); + if (cj_active) + scheduler_activate_send(s, cj->mpi.grav.send_ti, ci_nodeID); } else if (cj_nodeID != nodeID) { @@ -3320,7 +3467,7 @@ int cell_unskip_gravity_tasks(struct cell *c, struct scheduler *s) { if (ci_active) scheduler_activate(s, cj->mpi.grav.recv); /* If the foreign cell is active, we want its ti_end values. */ - if (cj_active) scheduler_activate(s, cj->mpi.recv_ti); + if (cj_active) scheduler_activate(s, cj->mpi.grav.recv_ti); /* Is the foreign cell active and will need stuff from us? */ if (cj_active) { @@ -3334,7 +3481,8 @@ int cell_unskip_gravity_tasks(struct cell *c, struct scheduler *s) { } /* If the local cell is active, send its ti_end values. */ - if (ci_active) scheduler_activate_send(s, ci->mpi.send_ti, cj_nodeID); + if (ci_active) + scheduler_activate_send(s, ci->mpi.grav.send_ti, cj_nodeID); } #endif } @@ -3507,14 +3655,14 @@ int cell_unskip_stars_tasks(struct cell *c, struct scheduler *s) { cell_activate_drift_spart(cj, s); /* If the local cell is active, send its ti_end values. */ - scheduler_activate_send(s, cj->mpi.send_ti, ci_nodeID); + scheduler_activate_send(s, cj->mpi.stars.send_ti, ci_nodeID); } if (ci_active) { scheduler_activate(s, ci->mpi.stars.recv); /* If the foreign cell is active, we want its ti_end values. */ - scheduler_activate(s, ci->mpi.recv_ti); + scheduler_activate(s, ci->mpi.stars.recv_ti); /* Is the foreign cell active and will need stuff from us? */ scheduler_activate_send(s, cj->mpi.hydro.send_xv, ci_nodeID); @@ -3537,14 +3685,14 @@ int cell_unskip_stars_tasks(struct cell *c, struct scheduler *s) { cell_activate_drift_spart(ci, s); /* If the local cell is active, send its ti_end values. */ - scheduler_activate_send(s, ci->mpi.send_ti, cj_nodeID); + scheduler_activate_send(s, ci->mpi.stars.send_ti, cj_nodeID); } if (cj_active) { scheduler_activate(s, cj->mpi.stars.recv); /* If the foreign cell is active, we want its ti_end values. */ - scheduler_activate(s, cj->mpi.recv_ti); + scheduler_activate(s, cj->mpi.stars.recv_ti); /* Is the foreign cell active and will need stuff from us? */ scheduler_activate_send(s, ci->mpi.hydro.send_xv, cj_nodeID); @@ -3574,12 +3722,34 @@ int cell_unskip_stars_tasks(struct cell *c, struct scheduler *s) { const int cj_nodeID = nodeID; #endif - if ((ci_active && cj_nodeID == nodeID) || - (cj_active && ci_nodeID == nodeID)) { + if (t->type == task_type_self && ci_active) { + scheduler_activate(s, t); + } + + else if (t->type == task_type_sub_self && ci_active) { scheduler_activate(s, t); + } + + else if (t->type == task_type_pair || t->type == task_type_sub_pair) { - /* Nothing more to do here, all drifts and sorts activated above */ + /* We only want to activate the task if the cell is active and is + going to update some gas on the *local* node */ + if ((ci_nodeID == nodeID && cj_nodeID == nodeID) && + (ci_active || cj_active)) { + + scheduler_activate(s, t); + + } else if ((ci_nodeID == nodeID && cj_nodeID != nodeID) && (cj_active)) { + + scheduler_activate(s, t); + + } else if ((ci_nodeID != nodeID && cj_nodeID == nodeID) && (ci_active)) { + + scheduler_activate(s, t); + } } + + /* Nothing more to do here, all drifts and sorts activated above */ } /* Unskip all the other task types. */ @@ -3588,6 +3758,9 @@ int cell_unskip_stars_tasks(struct cell *c, struct scheduler *s) { if (c->stars.ghost != NULL) scheduler_activate(s, c->stars.ghost); if (c->stars.stars_in != NULL) scheduler_activate(s, c->stars.stars_in); if (c->stars.stars_out != NULL) scheduler_activate(s, c->stars.stars_out); + if (c->kick1 != NULL) scheduler_activate(s, c->kick1); + if (c->kick2 != NULL) scheduler_activate(s, c->kick2); + if (c->timestep != NULL) scheduler_activate(s, c->timestep); if (c->logger != NULL) scheduler_activate(s, c->logger); } @@ -3630,8 +3803,7 @@ void cell_set_super(struct cell *c, struct cell *super, const int with_hydro, void cell_set_super_hydro(struct cell *c, struct cell *super_hydro) { /* Are we in a cell with some kind of self/pair task ? */ - if (super_hydro == NULL && (c->hydro.density != NULL || c->stars.count > 0)) - super_hydro = c; + if (super_hydro == NULL && c->hydro.density != NULL) super_hydro = c; /* Set the super-cell */ c->hydro.super = super_hydro; @@ -3711,7 +3883,9 @@ void cell_set_super_mapper(void *map_data, int num_elements, void *extra_data) { int cell_has_tasks(struct cell *c) { #ifdef WITH_MPI - if (c->timestep != NULL || c->mpi.recv_ti != NULL) return 1; + if (c->timestep != NULL || c->mpi.hydro.recv_ti != NULL || + c->mpi.grav.recv_ti != NULL || c->mpi.stars.recv_ti != NULL) + return 1; #else if (c->timestep != NULL) return 1; #endif @@ -4284,35 +4458,19 @@ void cell_drift_multipole(struct cell *c, const struct engine *e) { * hierarchy. * * @param c The #cell to clean. - * @param is_super Is this a super-cell? */ -void cell_clear_stars_sort_flags(struct cell *c, const int is_super) { +void cell_clear_stars_sort_flags(struct cell *c) { /* Recurse if possible */ if (c->split) { for (int k = 0; k < 8; k++) - if (c->progeny[k] != NULL) - cell_clear_stars_sort_flags(c->progeny[k], /*is_super=*/0); - } - - /* Free the sorted array at the level where it was allocated */ - if (is_super) { - -#ifdef SWIFT_DEBUG_CHECKS - if (c != c->hydro.super) error("Cell is not a super-cell!!!"); -#endif - - for (int i = 0; i < 13; i++) { - free(c->stars.sort[i]); - } + if (c->progeny[k] != NULL) cell_clear_stars_sort_flags(c->progeny[k]); } /* Indicate that the cell is not sorted and cancel the pointer sorting arrays. */ c->stars.sorted = 0; - for (int i = 0; i < 13; i++) { - c->stars.sort[i] = NULL; - } + cell_free_stars_sorts(c); } /** @@ -4448,16 +4606,36 @@ struct spart *cell_add_spart(struct engine *e, struct cell *const c) { each level */ struct cell *top = c; while (top->parent != NULL) { + + /* What is the progeny index of the cell? */ for (int k = 0; k < 8; ++k) { if (top->parent->progeny[k] == top) { progeny[(int)top->parent->depth] = k; } } + + /* Check that the cell was indeed drifted to this point to avoid future + * issues */ +#ifdef SWIFT_DEBUG_CHECKS + if (top->hydro.super != NULL && top->stars.count > 0 && + top->stars.ti_old_part != e->ti_current) { + error("Cell had not been correctly drifted before star formation"); + } +#endif + + /* Climb up */ top = top->parent; } + /* Lock the top-level cell as we are going to operate on it */ + lock_lock(&top->stars.star_formation_lock); + /* Are there any extra particles left? */ if (top->stars.count == top->stars.count_total - 1) { + + /* Release the local lock before exiting. */ + if (lock_unlock(&top->stars.star_formation_lock) != 0) + error("Failed to unlock the top-level cell."); message("We ran out of star particles!"); atomic_inc(&e->forcerebuild); return NULL; @@ -4493,6 +4671,19 @@ struct spart *cell_add_spart(struct engine *e, struct cell *const c) { * current cell*/ cell_recursively_shift_sparts(top, progeny, /* main_branch=*/1); + /* Make sure the gravity will be recomputed for this particle in the next step + */ + struct cell *top2 = c; + while (top2->parent != NULL) { + top2->stars.ti_old_part = e->ti_current; + top2 = top2->parent; + } + top2->stars.ti_old_part = e->ti_current; + + /* Release the lock */ + if (lock_unlock(&top->stars.star_formation_lock) != 0) + error("Failed to unlock the top-level cell."); + /* We now have an empty spart as the first particle in that cell */ struct spart *sp = &c->stars.parts[0]; bzero(sp, sizeof(struct spart)); @@ -4505,13 +4696,6 @@ struct spart *cell_add_spart(struct engine *e, struct cell *const c) { /* Set it to the current time-bin */ sp->time_bin = e->min_active_bin; - top = c; - while (top->parent != NULL) { - top->grav.ti_end_min = e->ti_current; - top = top->parent; - } - top->grav.ti_end_min = e->ti_current; - #ifdef SWIFT_DEBUG_CHECKS /* Specify it was drifted to this point */ sp->ti_drift = e->ti_current; @@ -4808,6 +4992,17 @@ void cell_reorder_extra_parts(struct cell *c, const ptrdiff_t parts_offset) { parts[i].gpart->id_or_neg_offset = -(i + parts_offset); } } + +#ifdef SWIFT_DEBUG_CHECKS + for (int i = 0; i < c->hydro.count_total; ++i) { + if (parts[i].time_bin == time_bin_not_created && i < c->hydro.count) { + error("Extra particle before the end of the regular array"); + } + if (parts[i].time_bin != time_bin_not_created && i >= c->hydro.count) { + error("Regular particle after the end of the regular array"); + } + } +#endif } /** @@ -4854,6 +5049,17 @@ void cell_reorder_extra_sparts(struct cell *c, const ptrdiff_t sparts_offset) { #endif } } + +#ifdef SWIFT_DEBUG_CHECKS + for (int i = 0; i < c->stars.count_total; ++i) { + if (sparts[i].time_bin == time_bin_not_created && i < c->stars.count) { + error("Extra particle before the end of the regular array"); + } + if (sparts[i].time_bin != time_bin_not_created && i >= c->stars.count) { + error("Regular particle after the end of the regular array"); + } + } +#endif } /** @@ -4899,6 +5105,17 @@ void cell_reorder_extra_gparts(struct cell *c, struct part *parts, } } } + +#ifdef SWIFT_DEBUG_CHECKS + for (int i = 0; i < c->grav.count_total; ++i) { + if (gparts[i].time_bin == time_bin_not_created && i < c->grav.count) { + error("Extra particle before the end of the regular array"); + } + if (gparts[i].time_bin != time_bin_not_created && i >= c->grav.count) { + error("Regular particle after the end of the regular array"); + } + } +#endif } /** diff --git a/src/cell.h b/src/cell.h index e76657349eaf32e795054036e9c451edb03f8c8b..b9b77a002060e73c2fd384bf82471a5a73a61874 100644 --- a/src/cell.h +++ b/src/cell.h @@ -35,6 +35,7 @@ #include "lock.h" #include "multipole.h" #include "part.h" +#include "sort_part.h" #include "space.h" #include "task.h" #include "timeline.h" @@ -174,46 +175,37 @@ struct pcell { /** * @brief Cell information at the end of a time-step. */ -struct pcell_step { +struct pcell_step_hydro { - /*! Hydro variables */ - struct { - - /*! Minimal integer end-of-timestep in this cell (hydro) */ - integertime_t ti_end_min; - - /*! Minimal integer end-of-timestep in this cell (hydro) */ - integertime_t ti_end_max; - - /*! Maximal distance any #part has travelled since last rebuild */ - float dx_max_part; - - } hydro; + /*! Minimal integer end-of-timestep in this cell (hydro) */ + integertime_t ti_end_min; - /*! Grav variables */ - struct { + /*! Minimal integer end-of-timestep in this cell (hydro) */ + integertime_t ti_end_max; - /*! Minimal integer end-of-timestep in this cell (gravity) */ - integertime_t ti_end_min; + /*! Maximal distance any #part has travelled since last rebuild */ + float dx_max_part; +}; - /*! Minimal integer end-of-timestep in this cell (gravity) */ - integertime_t ti_end_max; +struct pcell_step_grav { - } grav; + /*! Minimal integer end-of-timestep in this cell (gravity) */ + integertime_t ti_end_min; - /*! Stars variables */ - struct { + /*! Minimal integer end-of-timestep in this cell (gravity) */ + integertime_t ti_end_max; +}; - /*! Minimal integer end-of-timestep in this cell (stars) */ - integertime_t ti_end_min; +struct pcell_step_stars { - /*! Maximal integer end-of-timestep in this cell (stars) */ - integertime_t ti_end_max; + /*! Minimal integer end-of-timestep in this cell (stars) */ + integertime_t ti_end_min; - /*! Maximal distance any #part has travelled since last rebuild */ - float dx_max_part; + /*! Maximal integer end-of-timestep in this cell (stars) */ + integertime_t ti_end_max; - } stars; + /*! Maximal distance any #part has travelled since last rebuild */ + float dx_max_part; }; /** @@ -238,6 +230,9 @@ struct cell { /*! Parent cell. */ struct cell *parent; + /*! Pointer to the top-level cell in a hierarchy */ + struct cell *top; + /*! Super cell, i.e. the highest-level parent cell with *any* task */ struct cell *super; @@ -252,6 +247,7 @@ struct cell { /*! Pointer for the sorted indices. */ struct entry *sort[13]; + struct entry *sortptr; /*! Super cell, i.e. the highest-level parent cell that has a hydro * pair/self tasks */ @@ -512,6 +508,9 @@ struct cell { /*! Spin lock for various uses (#spart case). */ swift_lock_type lock; + /*! Spin lock for star formation use. */ + swift_lock_type star_formation_lock; + /*! Nr of #spart in this cell. */ int count; @@ -538,6 +537,7 @@ struct cell { /*! Pointer for the sorted indices. */ struct entry *sort[13]; + struct entry *sortptr; /*! Bit-mask indicating the sorted directions */ unsigned int sorted; @@ -594,6 +594,9 @@ struct cell { /* Task receiving hydro data (gradient). */ struct task *recv_gradient; + /* Task receiving data (time-step). */ + struct task *recv_ti; + /* Linked list for sending hydro data (positions). */ struct link *send_xv; @@ -603,6 +606,9 @@ struct cell { /* Linked list for sending hydro data (gradient). */ struct link *send_gradient; + /* Linked list for sending data (time-step). */ + struct link *send_ti; + } hydro; struct { @@ -610,16 +616,30 @@ struct cell { /* Task receiving gpart data. */ struct task *recv; + /* Task receiving data (time-step). */ + struct task *recv_ti; + /* Linked list for sending gpart data. */ struct link *send; + + /* Linked list for sending data (time-step). */ + struct link *send_ti; + } grav; struct { /* Task receiving spart data. */ struct task *recv; + /* Task receiving data (time-step). */ + struct task *recv_ti; + /* Linked list for sending spart data. */ struct link *send; + + /* Linked list for sending data (time-step). */ + struct link *send_ti; + } stars; struct { @@ -630,12 +650,6 @@ struct cell { struct link *send; } limiter; - /* Task receiving data (time-step). */ - struct task *recv_ti; - - /* Linked list for sending data (time-step). */ - struct link *send_ti; - /*! Bit mask of the proxies this cell is registered with. */ unsigned long long int sendto; @@ -725,8 +739,12 @@ int cell_unpack(struct pcell *pc, struct cell *c, struct space *s, const int with_gravity); int cell_pack_tags(const struct cell *c, int *tags); int cell_unpack_tags(const int *tags, struct cell *c); -int cell_pack_end_step(struct cell *c, struct pcell_step *pcell); -int cell_unpack_end_step(struct cell *c, struct pcell_step *pcell); +int cell_pack_end_step_hydro(struct cell *c, struct pcell_step_hydro *pcell); +int cell_unpack_end_step_hydro(struct cell *c, struct pcell_step_hydro *pcell); +int cell_pack_end_step_grav(struct cell *c, struct pcell_step_grav *pcell); +int cell_unpack_end_step_grav(struct cell *c, struct pcell_step_grav *pcell); +int cell_pack_end_step_stars(struct cell *c, struct pcell_step_stars *pcell); +int cell_unpack_end_step_stars(struct cell *c, struct pcell_step_stars *pcell); int cell_pack_multipoles(struct cell *c, struct gravity_tensors *m); int cell_unpack_multipoles(struct cell *c, struct gravity_tensors *m); int cell_getsize(struct cell *c); @@ -765,6 +783,7 @@ void cell_activate_subcell_stars_tasks(struct cell *ci, struct cell *cj, struct scheduler *s); void cell_activate_subcell_external_grav_tasks(struct cell *ci, struct scheduler *s); +void cell_activate_super_spart_drifts(struct cell *c, struct scheduler *s); void cell_activate_drift_part(struct cell *c, struct scheduler *s); void cell_activate_drift_gpart(struct cell *c, struct scheduler *s); void cell_activate_drift_spart(struct cell *c, struct scheduler *s); @@ -776,7 +795,7 @@ void cell_clear_limiter_flags(struct cell *c, void *data); void cell_set_super_mapper(void *map_data, int num_elements, void *extra_data); void cell_check_spart_pos(const struct cell *c, const struct spart *global_sparts); -void cell_clear_stars_sort_flags(struct cell *c, const int is_super); +void cell_clear_stars_sort_flags(struct cell *c); int cell_has_tasks(struct cell *c); void cell_remove_part(const struct engine *e, struct cell *c, struct part *p, struct xpart *xp); @@ -1059,5 +1078,102 @@ __attribute__((always_inline)) INLINE static void cell_ensure_tagged( #endif // WITH_MPI } +/** + * @brief Allocate hydro sort memory for cell. + * + * @param c The #cell that will require sorting. + * @param flags Cell flags. + */ +__attribute__((always_inline)) INLINE static void cell_malloc_hydro_sorts( + struct cell *c, int flags) { + + /* Count the memory needed for all active dimensions. */ + int count = 0; + for (int j = 0; j < 13; j++) { + if ((flags & (1 << j)) && c->hydro.sort[j] == NULL) + count += (c->hydro.count + 1); + } + + /* Allocate as a single chunk. */ + struct entry *memptr = NULL; + if ((memptr = (struct entry *)swift_malloc( + "hydro.sort", sizeof(struct entry) * count)) == NULL) + error("Failed to allocate sort memory."); + + c->hydro.sortptr = memptr; + + /* And attach spans as needed. */ + for (int j = 0; j < 13; j++) { + if ((flags & (1 << j)) && c->hydro.sort[j] == NULL) { + c->hydro.sort[j] = memptr; + memptr += (c->hydro.count + 1); + } + } +} + +/** + * @brief Free hydro sort memory for cell. + * + * @param c The #cell. + */ +__attribute__((always_inline)) INLINE static void cell_free_hydro_sorts( + struct cell *c) { + + /* Note only one allocation for the dimensions. */ + if (c->hydro.sortptr != NULL) { + swift_free("hydro.sort", c->hydro.sortptr); + c->hydro.sortptr = NULL; + for (int i = 0; i < 13; i++) c->hydro.sort[i] = NULL; + } +} + +/** + * @brief Allocate stars sort memory for cell. + * + * @param c The #cell that will require sorting. + * @param flags Cell flags. + */ +__attribute__((always_inline)) INLINE static void cell_malloc_stars_sorts( + struct cell *c, int flags) { + + /* Count the memory needed for all active dimensions. */ + int count = 0; + for (int j = 0; j < 13; j++) { + if ((flags & (1 << j)) && c->stars.sort[j] == NULL) + count += (c->stars.count + 1); + } + + /* Allocate as a single chunk. */ + struct entry *memptr = NULL; + if ((memptr = (struct entry *)swift_malloc( + "stars.sort", sizeof(struct entry) * count)) == NULL) + error("Failed to allocate sort memory."); + + c->stars.sortptr = memptr; + + /* And attach spans as needed. */ + for (int j = 0; j < 13; j++) { + if ((flags & (1 << j)) && c->stars.sort[j] == NULL) { + c->stars.sort[j] = memptr; + memptr += (c->stars.count + 1); + } + } +} + +/** + * @brief Free stars sort memory for cell. + * + * @param c The #cell. + */ +__attribute__((always_inline)) INLINE static void cell_free_stars_sorts( + struct cell *c) { + + /* Note only one allocation for the dimensions. */ + if (c->stars.sortptr != NULL) { + swift_free("stars.sort", c->stars.sortptr); + c->stars.sortptr = NULL; + for (int i = 0; i < 13; i++) c->stars.sort[i] = NULL; + } +} #endif /* SWIFT_CELL_H */ diff --git a/src/clocks.c b/src/clocks.c index 49297f5db1cc10a3d9f4537c5900610dded7ffba..16af01938d8f4e6cb21490af3288fd64e1a93876 100644 --- a/src/clocks.c +++ b/src/clocks.c @@ -42,8 +42,9 @@ /* The CPU frequency used to convert ticks to seconds. */ static unsigned long long clocks_cpufreq = 0; -/* Ticks when the CPU frequency was initialised. Used in elapsed. */ -static ticks clocks_start = 0; +/* Ticks when the CPU frequency was initialised, this marks the start of + * time. */ +ticks clocks_start_ticks = 0; /* The units of any returned times. */ static const char *clocks_units[] = {"ms", "~ms"}; @@ -106,7 +107,7 @@ void clocks_set_cpufreq(unsigned long long freq) { } else { clocks_estimate_cpufreq(); } - clocks_start = getticks(); + clocks_start_ticks = getticks(); } /** @@ -258,7 +259,7 @@ const char *clocks_get_timesincestart(void) { static char buffer[40]; sprintf(buffer, "[%07.1f]", - clocks_diff_ticks(getticks(), clocks_start) / 1000.0); + clocks_diff_ticks(getticks(), clocks_start_ticks) / 1000.0); return buffer; } @@ -271,7 +272,7 @@ const char *clocks_get_timesincestart(void) { * @result the time since the start of the execution */ double clocks_get_hours_since_start(void) { - return clocks_diff_ticks(getticks(), clocks_start) / (3600. * 1000.0); + return clocks_diff_ticks(getticks(), clocks_start_ticks) / (3600. * 1000.0); } /** diff --git a/src/clocks.h b/src/clocks.h index ce08167bd504d47a76542870791057881c6d2f17..d306268674fc85c722e71a6bf8c0095341ba4e1a 100644 --- a/src/clocks.h +++ b/src/clocks.h @@ -37,6 +37,9 @@ struct clocks_time { #endif }; +/* Ticks used as the start of time. */ +extern ticks clocks_start_ticks; + void clocks_gettime(struct clocks_time *time); double clocks_diff(struct clocks_time *start, struct clocks_time *end); const char *clocks_getunit(void); diff --git a/src/collectgroup.c b/src/collectgroup.c index ddf3e35d945fd8b07cc927d8ba383963c7558cd2..5242d0d93bbca2315a91d2abc099670afb2789ed 100644 --- a/src/collectgroup.c +++ b/src/collectgroup.c @@ -40,6 +40,13 @@ struct mpicollectgroup1 { long long inhibited, g_inhibited, s_inhibited; integertime_t ti_hydro_end_min; integertime_t ti_gravity_end_min; + integertime_t ti_stars_end_min; + integertime_t ti_hydro_end_max; + integertime_t ti_gravity_end_max; + integertime_t ti_stars_end_max; + integertime_t ti_hydro_beg_max; + integertime_t ti_gravity_beg_max; + integertime_t ti_stars_beg_max; int forcerebuild; long long total_nr_cells; long long total_nr_tasks; @@ -86,9 +93,15 @@ void collectgroup1_apply(struct collectgroup1 *grp1, struct engine *e) { e->ti_gravity_end_min = grp1->ti_gravity_end_min; e->ti_gravity_end_max = grp1->ti_gravity_end_max; e->ti_gravity_beg_max = grp1->ti_gravity_beg_max; - e->ti_end_min = min(e->ti_hydro_end_min, e->ti_gravity_end_min); - e->ti_end_max = max(e->ti_hydro_end_max, e->ti_gravity_end_max); - e->ti_beg_max = max(e->ti_hydro_beg_max, e->ti_gravity_beg_max); + e->ti_stars_end_min = grp1->ti_stars_end_min; + e->ti_stars_end_max = grp1->ti_stars_end_max; + e->ti_stars_beg_max = grp1->ti_stars_beg_max; + e->ti_end_min = + min3(e->ti_hydro_end_min, e->ti_gravity_end_min, e->ti_stars_end_min); + e->ti_end_max = + max3(e->ti_hydro_end_max, e->ti_gravity_end_max, e->ti_stars_end_max); + e->ti_beg_max = + max3(e->ti_hydro_beg_max, e->ti_gravity_beg_max, e->ti_stars_beg_max); e->updates = grp1->updated; e->g_updates = grp1->g_updated; e->s_updates = grp1->s_updated; @@ -127,6 +140,12 @@ void collectgroup1_apply(struct collectgroup1 *grp1, struct engine *e) { * after this step. * @param ti_gravity_beg_max the maximum begin time for next gravity time step * after this step. + * @param ti_stars_end_min the minimum end time for next stars time step + * after this step. + * @param ti_stars_end_max the maximum end time for next stars time step + * after this step. + * @param ti_stars_beg_max the maximum begin time for next stars time step + * after this step. * @param forcerebuild whether a rebuild is required after this step. * @param total_nr_cells total number of all cells on rank. * @param total_nr_tasks total number of tasks on rank. @@ -138,8 +157,9 @@ void collectgroup1_init( integertime_t ti_hydro_end_min, integertime_t ti_hydro_end_max, integertime_t ti_hydro_beg_max, integertime_t ti_gravity_end_min, integertime_t ti_gravity_end_max, integertime_t ti_gravity_beg_max, - int forcerebuild, long long total_nr_cells, long long total_nr_tasks, - float tasks_per_cell) { + integertime_t ti_stars_end_min, integertime_t ti_stars_end_max, + integertime_t ti_stars_beg_max, int forcerebuild, long long total_nr_cells, + long long total_nr_tasks, float tasks_per_cell) { grp1->updated = updated; grp1->g_updated = g_updated; @@ -153,6 +173,9 @@ void collectgroup1_init( grp1->ti_gravity_end_min = ti_gravity_end_min; grp1->ti_gravity_end_max = ti_gravity_end_max; grp1->ti_gravity_beg_max = ti_gravity_beg_max; + grp1->ti_stars_end_min = ti_stars_end_min; + grp1->ti_stars_end_max = ti_stars_end_max; + grp1->ti_stars_beg_max = ti_stars_beg_max; grp1->forcerebuild = forcerebuild; grp1->total_nr_cells = total_nr_cells; grp1->total_nr_tasks = total_nr_tasks; @@ -181,6 +204,13 @@ void collectgroup1_reduce(struct collectgroup1 *grp1) { mpigrp11.s_inhibited = grp1->s_inhibited; mpigrp11.ti_hydro_end_min = grp1->ti_hydro_end_min; mpigrp11.ti_gravity_end_min = grp1->ti_gravity_end_min; + mpigrp11.ti_stars_end_min = grp1->ti_stars_end_min; + mpigrp11.ti_hydro_end_max = grp1->ti_hydro_end_max; + mpigrp11.ti_gravity_end_max = grp1->ti_gravity_end_max; + mpigrp11.ti_stars_end_max = grp1->ti_stars_end_max; + mpigrp11.ti_hydro_beg_max = grp1->ti_hydro_beg_max; + mpigrp11.ti_gravity_beg_max = grp1->ti_gravity_beg_max; + mpigrp11.ti_stars_beg_max = grp1->ti_stars_beg_max; mpigrp11.forcerebuild = grp1->forcerebuild; mpigrp11.total_nr_cells = grp1->total_nr_cells; mpigrp11.total_nr_tasks = grp1->total_nr_tasks; @@ -200,6 +230,13 @@ void collectgroup1_reduce(struct collectgroup1 *grp1) { grp1->s_inhibited = mpigrp12.s_inhibited; grp1->ti_hydro_end_min = mpigrp12.ti_hydro_end_min; grp1->ti_gravity_end_min = mpigrp12.ti_gravity_end_min; + grp1->ti_stars_end_min = mpigrp12.ti_stars_end_min; + grp1->ti_hydro_end_max = mpigrp12.ti_hydro_end_max; + grp1->ti_gravity_end_max = mpigrp12.ti_gravity_end_max; + grp1->ti_stars_end_max = mpigrp12.ti_stars_end_max; + grp1->ti_hydro_beg_max = mpigrp12.ti_hydro_beg_max; + grp1->ti_gravity_beg_max = mpigrp12.ti_gravity_beg_max; + grp1->ti_stars_beg_max = mpigrp12.ti_stars_beg_max; grp1->forcerebuild = mpigrp12.forcerebuild; grp1->total_nr_cells = mpigrp12.total_nr_cells; grp1->total_nr_tasks = mpigrp12.total_nr_tasks; @@ -234,6 +271,24 @@ static void doreduce1(struct mpicollectgroup1 *mpigrp11, min(mpigrp11->ti_hydro_end_min, mpigrp12->ti_hydro_end_min); mpigrp11->ti_gravity_end_min = min(mpigrp11->ti_gravity_end_min, mpigrp12->ti_gravity_end_min); + mpigrp11->ti_stars_end_min = + min(mpigrp11->ti_stars_end_min, mpigrp12->ti_stars_end_min); + + /* Maximum end time. */ + mpigrp11->ti_hydro_end_max = + max(mpigrp11->ti_hydro_end_max, mpigrp12->ti_hydro_end_max); + mpigrp11->ti_gravity_end_max = + max(mpigrp11->ti_gravity_end_max, mpigrp12->ti_gravity_end_max); + mpigrp11->ti_stars_end_max = + max(mpigrp11->ti_stars_end_max, mpigrp12->ti_stars_end_max); + + /* Maximum beg time. */ + mpigrp11->ti_hydro_beg_max = + max(mpigrp11->ti_hydro_beg_max, mpigrp12->ti_hydro_beg_max); + mpigrp11->ti_gravity_beg_max = + max(mpigrp11->ti_gravity_beg_max, mpigrp12->ti_gravity_beg_max); + mpigrp11->ti_stars_beg_max = + max(mpigrp11->ti_stars_beg_max, mpigrp12->ti_stars_beg_max); /* Everyone must agree to not rebuild. */ if (mpigrp11->forcerebuild || mpigrp12->forcerebuild) diff --git a/src/collectgroup.h b/src/collectgroup.h index 3e430b58db05b563f96149d1ae21039444a03640..0c0e0898f64deb0081cdab5c6cfbcad1dc760b1c 100644 --- a/src/collectgroup.h +++ b/src/collectgroup.h @@ -43,6 +43,7 @@ struct collectgroup1 { /* Times for the time-step */ integertime_t ti_hydro_end_min, ti_hydro_end_max, ti_hydro_beg_max; integertime_t ti_gravity_end_min, ti_gravity_end_max, ti_gravity_beg_max; + integertime_t ti_stars_end_min, ti_stars_end_max, ti_stars_beg_max; /* Force the engine to rebuild? */ int forcerebuild; @@ -63,8 +64,9 @@ void collectgroup1_init( integertime_t ti_hydro_end_min, integertime_t ti_hydro_end_max, integertime_t ti_hydro_beg_max, integertime_t ti_gravity_end_min, integertime_t ti_gravity_end_max, integertime_t ti_gravity_beg_max, - int forcerebuild, long long total_nr_cells, long long total_nr_tasks, - float tasks_per_cell); + integertime_t ti_stars_end_min, integertime_t ti_stars_end_max, + integertime_t ti_stars_beg_max, int forcerebuild, long long total_nr_cells, + long long total_nr_tasks, float tasks_per_cell); void collectgroup1_reduce(struct collectgroup1 *grp1); #endif /* SWIFT_COLLECTGROUP_H */ diff --git a/src/cooling/EAGLE/cooling.c b/src/cooling/EAGLE/cooling.c index d1c2e7c065cc2332b464396f4b746f13c5cf62f8..2e5da9576afecd63b7ecf12e1636f0c7892bdbf6 100644 --- a/src/cooling/EAGLE/cooling.c +++ b/src/cooling/EAGLE/cooling.c @@ -58,8 +58,8 @@ static const float explicit_tolerance = 0.05; static const float newton_tolerance = 1.0e-4; static const float bisection_tolerance = 1.0e-6; static const float rounding_tolerance = 1.0e-4; -static const double bracket_factor = 1.5; /* sqrt(1.1) */ -static const double newton_log_u_guess_cgs = 12.30103; /* log10(2e12) */ +static const double bracket_factor = 1.5; +static const double newton_log_u_guess_cgs = 12; /** * @brief Find the index of the current redshift along the redshift dimension @@ -142,17 +142,21 @@ void cooling_update(const struct cosmology *cosmo, get_redshift_index(redshift, &z_index, &dz, cooling); cooling->dz = dz; - /* Does this timestep straddle Hydrogen reionization? If so, we need to input - * extra heat */ - if (!cooling->H_reion_done && (redshift < cooling->H_reion_z)) { + /* Extra energy for reionization? */ + if (!cooling->H_reion_done) { - if (s == NULL) error("Trying to do H reionization on an empty space!"); + /* Does this timestep straddle Hydrogen reionization? If so, we need to + * input extra heat */ + if (cosmo->z <= cooling->H_reion_z && cosmo->z_old > cooling->H_reion_z) { - /* Inject energy to all particles */ - cooling_Hydrogen_reionization(cooling, cosmo, s); + if (s == NULL) error("Trying to do H reionization on an empty space!"); - /* Flag that reionization happened */ - cooling->H_reion_done = 1; + /* Inject energy to all particles */ + cooling_Hydrogen_reionization(cooling, cosmo, s); + + /* Flag that reionization happened */ + cooling->H_reion_done = 1; + } } /* Do we already have the correct tables loaded? */ @@ -803,6 +807,8 @@ void cooling_Hydrogen_reionization(const struct cooling_function_data *cooling, const float extra_heat = cooling->H_reion_heat_cgs * cooling->internal_energy_from_cgs; + message("Applying extra energy for H reionization!"); + /* Loop through particles and set new heat */ for (size_t i = 0; i < s->nr_parts; i++) { @@ -982,20 +988,20 @@ void cooling_print_backend(const struct cooling_function_data *cooling) { void cooling_clean(struct cooling_function_data *cooling) { /* Free the side arrays */ - free(cooling->Redshifts); - free(cooling->nH); - free(cooling->Temp); - free(cooling->HeFrac); - free(cooling->Therm); - free(cooling->SolarAbundances); - free(cooling->SolarAbundances_inv); + swift_free("cooling", cooling->Redshifts); + swift_free("cooling", cooling->nH); + swift_free("cooling", cooling->Temp); + swift_free("cooling", cooling->HeFrac); + swift_free("cooling", cooling->Therm); + swift_free("cooling", cooling->SolarAbundances); + swift_free("cooling", cooling->SolarAbundances_inv); /* Free the tables */ - free(cooling->table.metal_heating); - free(cooling->table.electron_abundance); - free(cooling->table.temperature); - free(cooling->table.H_plus_He_heating); - free(cooling->table.H_plus_He_electron_abundance); + swift_free("cooling-tables", cooling->table.metal_heating); + swift_free("cooling-tables", cooling->table.electron_abundance); + swift_free("cooling-tables", cooling->table.temperature); + swift_free("cooling-tables", cooling->table.H_plus_He_heating); + swift_free("cooling-tables", cooling->table.H_plus_He_electron_abundance); } /** diff --git a/src/cooling/EAGLE/cooling_tables.c b/src/cooling/EAGLE/cooling_tables.c index c66b7ebb8f8bea4aac557fe3b7f24f944014deda..cd6678c70614aa62c8145afbecc2c8f673dbf0de 100644 --- a/src/cooling/EAGLE/cooling_tables.c +++ b/src/cooling/EAGLE/cooling_tables.c @@ -107,10 +107,11 @@ void get_cooling_redshifts(struct cooling_function_data *cooling) { /* Check value */ if (N_Redshifts != eagle_cooling_N_redshifts) - error("Invalid redshift lenght array."); + error("Invalid redshift length array."); /* Allocate the list of redshifts */ - if (posix_memalign((void **)&cooling->Redshifts, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("cooling", (void **)&cooling->Redshifts, + SWIFT_STRUCT_ALIGNMENT, eagle_cooling_N_redshifts * sizeof(float)) != 0) error("Failed to allocate redshift table"); @@ -227,22 +228,23 @@ void read_cooling_header(const char *fname, if (N_Elements != eagle_cooling_N_metal) error("Invalid metal array length."); /* allocate arrays of values for each of the above quantities */ - if (posix_memalign((void **)&cooling->Temp, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("cooling", (void **)&cooling->Temp, SWIFT_STRUCT_ALIGNMENT, N_Temp * sizeof(float)) != 0) error("Failed to allocate temperature table"); - if (posix_memalign((void **)&cooling->Therm, SWIFT_STRUCT_ALIGNMENT, - N_Temp * sizeof(float)) != 0) + if (swift_memalign("cooling", (void **)&cooling->Therm, + SWIFT_STRUCT_ALIGNMENT, N_Temp * sizeof(float)) != 0) error("Failed to allocate internal energy table"); - if (posix_memalign((void **)&cooling->nH, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("cooling", (void **)&cooling->nH, SWIFT_STRUCT_ALIGNMENT, N_nH * sizeof(float)) != 0) error("Failed to allocate nH table"); - if (posix_memalign((void **)&cooling->HeFrac, SWIFT_STRUCT_ALIGNMENT, - N_He * sizeof(float)) != 0) + if (swift_memalign("cooling", (void **)&cooling->HeFrac, + SWIFT_STRUCT_ALIGNMENT, N_He * sizeof(float)) != 0) error("Failed to allocate HeFrac table"); - if (posix_memalign((void **)&cooling->SolarAbundances, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("cooling", (void **)&cooling->SolarAbundances, + SWIFT_STRUCT_ALIGNMENT, N_SolarAbundances * sizeof(float)) != 0) error("Failed to allocate Solar abundances table"); - if (posix_memalign((void **)&cooling->SolarAbundances_inv, + if (swift_memalign("cooling", (void **)&cooling->SolarAbundances_inv, SWIFT_STRUCT_ALIGNMENT, N_SolarAbundances * sizeof(float)) != 0) error("Failed to allocate Solar abundances inverses table"); @@ -315,31 +317,34 @@ void allocate_cooling_tables(struct cooling_function_data *restrict cooling) { * cooling rates with one table being for the redshift above current redshift * and one below. */ - if (posix_memalign((void **)&cooling->table.metal_heating, + if (swift_memalign("cooling-tables", (void **)&cooling->table.metal_heating, SWIFT_STRUCT_ALIGNMENT, eagle_cooling_N_loaded_redshifts * num_elements_metal_heating * sizeof(float)) != 0) error("Failed to allocate metal_heating array"); - if (posix_memalign((void **)&cooling->table.electron_abundance, + if (swift_memalign("cooling-tables", + (void **)&cooling->table.electron_abundance, SWIFT_STRUCT_ALIGNMENT, eagle_cooling_N_loaded_redshifts * num_elements_electron_abundance * sizeof(float)) != 0) error("Failed to allocate electron_abundance array"); - if (posix_memalign((void **)&cooling->table.temperature, + if (swift_memalign("cooling-tables", (void **)&cooling->table.temperature, SWIFT_STRUCT_ALIGNMENT, eagle_cooling_N_loaded_redshifts * num_elements_temperature * sizeof(float)) != 0) error("Failed to allocate temperature array"); - if (posix_memalign((void **)&cooling->table.H_plus_He_heating, + if (swift_memalign("cooling-tables", + (void **)&cooling->table.H_plus_He_heating, SWIFT_STRUCT_ALIGNMENT, eagle_cooling_N_loaded_redshifts * num_elements_HpHe_heating * sizeof(float)) != 0) error("Failed to allocate H_plus_He_heating array"); - if (posix_memalign((void **)&cooling->table.H_plus_He_electron_abundance, + if (swift_memalign("cooling-tables", + (void **)&cooling->table.H_plus_He_electron_abundance, SWIFT_STRUCT_ALIGNMENT, eagle_cooling_N_loaded_redshifts * num_elements_HpHe_electron_abundance * @@ -373,19 +378,24 @@ void get_redshift_invariant_table( float *he_electron_abundance = NULL; /* Allocate arrays for reading in cooling tables. */ - if (posix_memalign((void **)&net_cooling_rate, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("cooling-temp", (void **)&net_cooling_rate, + SWIFT_STRUCT_ALIGNMENT, num_elements_cooling_rate * sizeof(float)) != 0) error("Failed to allocate net_cooling_rate array"); - if (posix_memalign((void **)&electron_abundance, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("cooling-temp", (void **)&electron_abundance, + SWIFT_STRUCT_ALIGNMENT, num_elements_electron_abundance * sizeof(float)) != 0) error("Failed to allocate electron_abundance array"); - if (posix_memalign((void **)&temperature, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("cooling-temp", (void **)&temperature, + SWIFT_STRUCT_ALIGNMENT, num_elements_temperature * sizeof(float)) != 0) error("Failed to allocate temperature array"); - if (posix_memalign((void **)&he_net_cooling_rate, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("cooling-temp", (void **)&he_net_cooling_rate, + SWIFT_STRUCT_ALIGNMENT, num_elements_HpHe_heating * sizeof(float)) != 0) error("Failed to allocate he_net_cooling_rate array"); - if (posix_memalign((void **)&he_electron_abundance, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("cooling-temp", (void **)&he_electron_abundance, + SWIFT_STRUCT_ALIGNMENT, num_elements_HpHe_electron_abundance * sizeof(float)) != 0) error("Failed to allocate he_electron_abundance array"); @@ -530,11 +540,11 @@ void get_redshift_invariant_table( status = H5Fclose(file_id); if (status < 0) error("error closing file"); - free(net_cooling_rate); - free(electron_abundance); - free(temperature); - free(he_net_cooling_rate); - free(he_electron_abundance); + swift_free("cooling-temp", net_cooling_rate); + swift_free("cooling-temp", electron_abundance); + swift_free("cooling-temp", temperature); + swift_free("cooling-temp", he_net_cooling_rate); + swift_free("cooling-temp", he_electron_abundance); #ifdef SWIFT_DEBUG_CHECKS message("done reading in redshift invariant table"); @@ -573,19 +583,24 @@ void get_cooling_table(struct cooling_function_data *restrict cooling, float *he_electron_abundance = NULL; /* Allocate arrays for reading in cooling tables. */ - if (posix_memalign((void **)&net_cooling_rate, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("cooling-temp", (void **)&net_cooling_rate, + SWIFT_STRUCT_ALIGNMENT, num_elements_cooling_rate * sizeof(float)) != 0) error("Failed to allocate net_cooling_rate array"); - if (posix_memalign((void **)&electron_abundance, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("cooling-temp", (void **)&electron_abundance, + SWIFT_STRUCT_ALIGNMENT, num_elements_electron_abundance * sizeof(float)) != 0) error("Failed to allocate electron_abundance array"); - if (posix_memalign((void **)&temperature, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("cooling-temp", (void **)&temperature, + SWIFT_STRUCT_ALIGNMENT, num_elements_temperature * sizeof(float)) != 0) error("Failed to allocate temperature array"); - if (posix_memalign((void **)&he_net_cooling_rate, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("cooling-temp", (void **)&he_net_cooling_rate, + SWIFT_STRUCT_ALIGNMENT, num_elements_HpHe_heating * sizeof(float)) != 0) error("Failed to allocate he_net_cooling_rate array"); - if (posix_memalign((void **)&he_electron_abundance, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("cooling-temp", (void **)&he_electron_abundance, + SWIFT_STRUCT_ALIGNMENT, num_elements_HpHe_electron_abundance * sizeof(float)) != 0) error("Failed to allocate he_electron_abundance array"); @@ -741,11 +756,11 @@ void get_cooling_table(struct cooling_function_data *restrict cooling, if (status < 0) error("error closing file"); } - free(net_cooling_rate); - free(electron_abundance); - free(temperature); - free(he_net_cooling_rate); - free(he_electron_abundance); + swift_free("cooling-temp", net_cooling_rate); + swift_free("cooling-temp", electron_abundance); + swift_free("cooling-temp", temperature); + swift_free("cooling-temp", he_net_cooling_rate); + swift_free("cooling-temp", he_electron_abundance); #ifdef SWIFT_DEBUG_CHECKS message("Done reading in general cooling table"); diff --git a/src/cosmology.c b/src/cosmology.c index be23343d0d62584cd3a811e547b327120db744ef..a18f52b84da330238caaa0a16bb69de025e92046 100644 --- a/src/cosmology.c +++ b/src/cosmology.c @@ -140,6 +140,10 @@ double cosmology_get_time_since_big_bang(const struct cosmology *c, double a) { void cosmology_update(struct cosmology *c, const struct phys_const *phys_const, integertime_t ti_current) { + /* Save the previous state */ + c->z_old = c->z; + c->a_old = c->a; + /* Get scale factor and powers of it */ const double a = c->a_begin * exp(ti_current * c->time_base); const double a_inv = 1. / a; @@ -527,6 +531,10 @@ void cosmology_init(struct swift_params *params, const struct unit_system *us, /* Update the times */ c->time_begin = cosmology_get_time_since_big_bang(c, c->a_begin); c->time_end = cosmology_get_time_since_big_bang(c, c->a_end); + + /* Initialise the old values to a valid state */ + c->a_old = c->a_begin; + c->z_old = 1. / c->a_old - 1.; } /** @@ -568,6 +576,9 @@ void cosmology_init_no_cosmo(struct cosmology *c) { c->a_factor_hydro_accel = 1.; c->a_factor_grav_accel = 1.; + c->a_old = 1.; + c->z_old = 0.; + c->critical_density = 0.; c->critical_density_0 = 0.; diff --git a/src/cosmology.h b/src/cosmology.h index d6b7dfbdc854a66f89c5511a5076c4fb4a7a5d3f..f2abdb6c62e7509c593b5edfbdb9dd8fe0c99e72 100644 --- a/src/cosmology.h +++ b/src/cosmology.h @@ -93,6 +93,12 @@ struct cosmology { /*! Dark-energy equation of state at the current time */ double w; + /*! Scale-factor at the previous time-step */ + double a_old; + + /*! Redshit at the previous time-step */ + double z_old; + /*------------------------------------------------------------------ */ /*! Starting expansion factor */ diff --git a/src/debug.c b/src/debug.c index d2aff378a174ade46b62a3931f78394a0f41ca41..6257f7cf4e62c3db9027c820bb658eb678c0ecf1 100644 --- a/src/debug.c +++ b/src/debug.c @@ -680,69 +680,3 @@ void dumpCellRanks(const char *prefix, struct cell *cells_top, int nr_cells) { } #endif /* HAVE_MPI */ - -/** - * @brief parse the process /proc/self/statm file to get the process - * memory use (in KB). Top field in (). - * - * @param size total virtual memory (VIRT) - * @param resident resident non-swapped memory (RES) - * @param share shared (mmap'd) memory (SHR) - * @param trs text (exe) resident set (CODE) - * @param lrs library resident set - * @param drs data+stack resident set (DATA) - * @param dt dirty pages (nDRT) - */ -void getProcMemUse(long *size, long *resident, long *share, long *trs, - long *lrs, long *drs, long *dt) { - - /* Open the file. */ - FILE *file = fopen("/proc/self/statm", "r"); - if (file != NULL) { - int nscan = fscanf(file, "%ld %ld %ld %ld %ld %ld %ld", size, resident, - share, trs, lrs, drs, dt); - - if (nscan == 7) { - /* Convert pages into bytes. Usually 4096, but could be 512 on some - * systems so take care in conversion to KB. */ - long sz = sysconf(_SC_PAGESIZE); - *size *= sz; - *resident *= sz; - *share *= sz; - *trs *= sz; - *lrs *= sz; - *drs *= sz; - *dt *= sz; - - *size /= 1024; - *resident /= 1024; - *share /= 1024; - *trs /= 1024; - *lrs /= 1024; - *drs /= 1024; - *dt /= 1024; - } else { - error("Failed to read sufficient fields from /proc/self/statm"); - } - fclose(file); - } else { - error("Failed to open /proc/self/statm"); - } -} - -/** - * @brief Print the current memory use of the process. A la "top". - */ -void printProcMemUse(void) { - long size; - long resident; - long share; - long trs; - long lrs; - long drs; - long dt; - getProcMemUse(&size, &resident, &share, &trs, &lrs, &drs, &dt); - printf("## VIRT = %ld , RES = %ld , SHR = %ld , CODE = %ld, DATA = %ld\n", - size, resident, share, trs, drs); - fflush(stdout); -} diff --git a/src/debug.h b/src/debug.h index ec3807c3ba911c6a553aa42d3f8a017662217001..3cafd17b835a1a816e049f3a714bedcaf34d183a 100644 --- a/src/debug.h +++ b/src/debug.h @@ -49,7 +49,4 @@ void dumpMETISGraph(const char *prefix, idx_t nvtxs, idx_t ncon, idx_t *xadj, void dumpCellRanks(const char *prefix, struct cell *cells_top, int nr_cells); #endif -void getProcMemUse(long *size, long *resident, long *share, long *trs, - long *lrs, long *drs, long *dt); -void printProcMemUse(void); #endif /* SWIFT_DEBUG_H */ diff --git a/src/engine.c b/src/engine.c index ee184e8ef317013145414a3d11b4f3d85d745a58..406bd3df511f24537ac08a7499d4c706e8e0f223 100644 --- a/src/engine.c +++ b/src/engine.c @@ -72,6 +72,7 @@ #include "logger_io.h" #include "map.h" #include "memswap.h" +#include "memuse.h" #include "minmax.h" #include "outputlist.h" #include "parallel_io.h" @@ -121,6 +122,9 @@ const char *engine_policy_names[] = {"none", /** The rank of the engine as a global variable (for messages). */ int engine_rank; +/** The current step of the engine as a global variable (for messages). */ +int engine_current_step; + /** * @brief Data collected from the cells at the end of a time-step */ @@ -130,7 +134,7 @@ struct end_of_step_data { size_t inhibited, g_inhibited, s_inhibited; integertime_t ti_hydro_end_min, ti_hydro_end_max, ti_hydro_beg_max; integertime_t ti_gravity_end_min, ti_gravity_end_max, ti_gravity_beg_max; - integertime_t ti_stars_end_min; + integertime_t ti_stars_end_min, ti_stars_end_max, ti_stars_beg_max; struct engine *e; }; @@ -163,6 +167,7 @@ void engine_addlink(struct engine *e, struct link **l, struct task *t) { /** * Do the exchange of one type of particles with all the other nodes. * + * @param label a label for the memory allocations of this particle type. * @param counts 2D array with the counts of particles to exchange with * each other node. * @param parts the particle data to exchange @@ -177,15 +182,15 @@ void engine_addlink(struct engine *e, struct link **l, struct task *t) { * @result new particle data constructed from all the exchanges with the * given alignment. */ -static void *engine_do_redistribute(int *counts, char *parts, +static void *engine_do_redistribute(const char *label, int *counts, char *parts, size_t new_nr_parts, size_t sizeofparts, size_t alignsize, MPI_Datatype mpi_type, int nr_nodes, int nodeID) { /* Allocate a new particle array with some extra margin */ char *parts_new = NULL; - if (posix_memalign( - (void **)&parts_new, alignsize, + if (swift_memalign( + label, (void **)&parts_new, alignsize, sizeofparts * new_nr_parts * engine_redistribute_alloc_margin) != 0) error("Failed to allocate new particle data."); @@ -551,7 +556,8 @@ void engine_redistribute(struct engine *e) { /* Start by moving inhibited particles to the end of the arrays */ for (size_t k = 0; k < nr_parts; /* void */) { - if (parts[k].time_bin == time_bin_inhibited) { + if (parts[k].time_bin == time_bin_inhibited || + parts[k].time_bin == time_bin_not_created) { nr_parts -= 1; /* Swap the particle */ @@ -574,7 +580,8 @@ void engine_redistribute(struct engine *e) { /* Now move inhibited star particles to the end of the arrays */ for (size_t k = 0; k < nr_sparts; /* void */) { - if (sparts[k].time_bin == time_bin_inhibited) { + if (sparts[k].time_bin == time_bin_inhibited || + sparts[k].time_bin == time_bin_not_created) { nr_sparts -= 1; /* Swap the particle */ @@ -594,7 +601,8 @@ void engine_redistribute(struct engine *e) { /* Finally do the same with the gravity particles */ for (size_t k = 0; k < nr_gparts; /* void */) { - if (gparts[k].time_bin == time_bin_inhibited) { + if (gparts[k].time_bin == time_bin_inhibited || + gparts[k].time_bin == time_bin_not_created) { nr_gparts -= 1; /* Swap the particle */ @@ -627,7 +635,7 @@ void engine_redistribute(struct engine *e) { error("Failed to allocate counts temporary buffer."); int *dest; - if ((dest = (int *)malloc(sizeof(int) * nr_parts)) == NULL) + if ((dest = (int *)swift_malloc("dest", sizeof(int) * nr_parts)) == NULL) error("Failed to allocate dest temporary buffer."); /* Simple index of node IDs, used for mappers over nodes. */ @@ -659,6 +667,12 @@ void engine_redistribute(struct engine *e) { for (size_t k = 0; k < nr_parts; k++) { const struct part *p = &s->parts[k]; + if (p->time_bin == time_bin_inhibited) + error("Inhibited particle found after sorting!"); + + if (p->time_bin == time_bin_not_created) + error("Inhibited particle found after sorting!"); + /* New cell index */ const int new_cid = cell_getid(s->cdim, p->x[0] * s->iwidth[0], p->x[1] * s->iwidth[1], @@ -690,7 +704,7 @@ void engine_redistribute(struct engine *e) { threadpool_map(&e->threadpool, engine_redistribute_savelink_mapper_part, nodes, nr_nodes, sizeof(int), 0, &savelink_data); } - free(dest); + swift_free("dest", dest); /* Get destination of each s-particle */ int *s_counts; @@ -698,7 +712,7 @@ void engine_redistribute(struct engine *e) { error("Failed to allocate s_counts temporary buffer."); int *s_dest; - if ((s_dest = (int *)malloc(sizeof(int) * nr_sparts)) == NULL) + if ((s_dest = (int *)swift_malloc("s_dest", sizeof(int) * nr_sparts)) == NULL) error("Failed to allocate s_dest temporary buffer."); redist_data.counts = s_counts; @@ -718,6 +732,12 @@ void engine_redistribute(struct engine *e) { for (size_t k = 0; k < nr_sparts; k++) { const struct spart *sp = &s->sparts[k]; + if (sp->time_bin == time_bin_inhibited) + error("Inhibited particle found after sorting!"); + + if (sp->time_bin == time_bin_not_created) + error("Inhibited particle found after sorting!"); + /* New cell index */ const int new_cid = cell_getid(s->cdim, sp->x[0] * s->iwidth[0], sp->x[1] * s->iwidth[1], @@ -748,7 +768,7 @@ void engine_redistribute(struct engine *e) { threadpool_map(&e->threadpool, engine_redistribute_savelink_mapper_spart, nodes, nr_nodes, sizeof(int), 0, &savelink_data); } - free(s_dest); + swift_free("s_dest", s_dest); /* Get destination of each g-particle */ int *g_counts; @@ -756,7 +776,7 @@ void engine_redistribute(struct engine *e) { error("Failed to allocate g_gcount temporary buffer."); int *g_dest; - if ((g_dest = (int *)malloc(sizeof(int) * nr_gparts)) == NULL) + if ((g_dest = (int *)swift_malloc("g_dest", sizeof(int) * nr_gparts)) == NULL) error("Failed to allocate g_dest temporary buffer."); redist_data.counts = g_counts; @@ -776,6 +796,12 @@ void engine_redistribute(struct engine *e) { for (size_t k = 0; k < nr_gparts; k++) { const struct gpart *gp = &s->gparts[k]; + if (gp->time_bin == time_bin_inhibited) + error("Inhibited particle found after sorting!"); + + if (gp->time_bin == time_bin_not_created) + error("Inhibited particle found after sorting!"); + /* New cell index */ const int new_cid = cell_getid(s->cdim, gp->x[0] * s->iwidth[0], gp->x[1] * s->iwidth[1], @@ -796,7 +822,7 @@ void engine_redistribute(struct engine *e) { } #endif - free(g_dest); + swift_free("g_dest", g_dest); /* Get all the counts from all the nodes. */ if (MPI_Allreduce(MPI_IN_PLACE, counts, nr_nodes * nr_nodes, MPI_INT, MPI_SUM, @@ -861,34 +887,34 @@ void engine_redistribute(struct engine *e) { /* SPH particles. */ void *new_parts = engine_do_redistribute( - counts, (char *)s->parts, nr_parts_new, sizeof(struct part), part_align, - part_mpi_type, nr_nodes, nodeID); - free(s->parts); + "parts", counts, (char *)s->parts, nr_parts_new, sizeof(struct part), + part_align, part_mpi_type, nr_nodes, nodeID); + swift_free("parts", s->parts); s->parts = (struct part *)new_parts; s->nr_parts = nr_parts_new; s->size_parts = engine_redistribute_alloc_margin * nr_parts_new; /* Extra SPH particle properties. */ - new_parts = engine_do_redistribute(counts, (char *)s->xparts, nr_parts_new, - sizeof(struct xpart), xpart_align, - xpart_mpi_type, nr_nodes, nodeID); - free(s->xparts); + new_parts = engine_do_redistribute( + "xparts", counts, (char *)s->xparts, nr_parts_new, sizeof(struct xpart), + xpart_align, xpart_mpi_type, nr_nodes, nodeID); + swift_free("xparts", s->xparts); s->xparts = (struct xpart *)new_parts; /* Gravity particles. */ - new_parts = engine_do_redistribute(g_counts, (char *)s->gparts, nr_gparts_new, - sizeof(struct gpart), gpart_align, - gpart_mpi_type, nr_nodes, nodeID); - free(s->gparts); + new_parts = engine_do_redistribute( + "gparts", g_counts, (char *)s->gparts, nr_gparts_new, + sizeof(struct gpart), gpart_align, gpart_mpi_type, nr_nodes, nodeID); + swift_free("gparts", s->gparts); s->gparts = (struct gpart *)new_parts; s->nr_gparts = nr_gparts_new; s->size_gparts = engine_redistribute_alloc_margin * nr_gparts_new; /* Star particles. */ - new_parts = engine_do_redistribute(s_counts, (char *)s->sparts, nr_sparts_new, - sizeof(struct spart), spart_align, - spart_mpi_type, nr_nodes, nodeID); - free(s->sparts); + new_parts = engine_do_redistribute( + "sparts", s_counts, (char *)s->sparts, nr_sparts_new, + sizeof(struct spart), spart_align, spart_mpi_type, nr_nodes, nodeID); + swift_free("sparts", s->sparts); s->sparts = (struct spart *)new_parts; s->nr_sparts = nr_sparts_new; s->size_sparts = engine_redistribute_alloc_margin * nr_sparts_new; @@ -946,6 +972,7 @@ void engine_redistribute(struct engine *e) { /* Verify that the links are correct */ part_verify_links(s->parts, s->gparts, s->sparts, nr_parts_new, nr_gparts_new, nr_sparts_new, e->verbose); + #endif /* Be verbose about what just happened. */ @@ -957,6 +984,11 @@ void engine_redistribute(struct engine *e) { nodeID, nr_parts_new, nr_sparts_new, nr_gparts_new, my_cells); } + /* Flag that we do not have any extra particles any more */ + s->nr_extra_parts = 0; + s->nr_extra_gparts = 0; + s->nr_extra_sparts = 0; + /* Flag that a redistribute has taken place */ e->step_props |= engine_step_prop_redistribute; @@ -1007,7 +1039,8 @@ void engine_repartition(struct engine *e) { /* Partitioning requires copies of the particles, so we need to reduce the * memory in use to the minimum, we can free the sorting indices and the - * tasks as these will be regenerated at the next rebuild. */ + * tasks as these will be regenerated at the next rebuild. Also the foreign + * particle arrays can go as these will be regenerated in proxy exchange. */ /* Sorting indices. */ if (e->s->cells_top != NULL) space_free_cells(e->s); @@ -1015,6 +1048,9 @@ void engine_repartition(struct engine *e) { /* Task arrays. */ scheduler_free_tasks(&e->sched); + /* Foreign parts. */ + space_free_foreign_parts(e->s); + /* Now comes the tricky part: Exchange particles between all nodes. This is done in two steps, first allreducing a matrix of how many particles go from where to where, then re-allocating @@ -1356,15 +1392,15 @@ void engine_exchange_strays(struct engine *e, const size_t offset_parts, s->size_parts = (offset_parts + count_parts_in) * engine_parts_size_grow; struct part *parts_new = NULL; struct xpart *xparts_new = NULL; - if (posix_memalign((void **)&parts_new, part_align, + if (swift_memalign("parts", (void **)&parts_new, part_align, sizeof(struct part) * s->size_parts) != 0 || - posix_memalign((void **)&xparts_new, xpart_align, + swift_memalign("xparts", (void **)&xparts_new, xpart_align, sizeof(struct xpart) * s->size_parts) != 0) error("Failed to allocate new part data."); memcpy(parts_new, s->parts, sizeof(struct part) * offset_parts); memcpy(xparts_new, s->xparts, sizeof(struct xpart) * offset_parts); - free(s->parts); - free(s->xparts); + swift_free("parts", s->parts); + swift_free("xparts", s->xparts); s->parts = parts_new; s->xparts = xparts_new; @@ -1375,15 +1411,16 @@ void engine_exchange_strays(struct engine *e, const size_t offset_parts, } } } + if (offset_sparts + count_sparts_in > s->size_sparts) { message("re-allocating sparts array."); s->size_sparts = (offset_sparts + count_sparts_in) * engine_parts_size_grow; struct spart *sparts_new = NULL; - if (posix_memalign((void **)&sparts_new, spart_align, + if (swift_memalign("sparts", (void **)&sparts_new, spart_align, sizeof(struct spart) * s->size_sparts) != 0) error("Failed to allocate new spart data."); memcpy(sparts_new, s->sparts, sizeof(struct spart) * offset_sparts); - free(s->sparts); + swift_free("sparts", s->sparts); s->sparts = sparts_new; /* Reset the links */ @@ -1393,15 +1430,16 @@ void engine_exchange_strays(struct engine *e, const size_t offset_parts, } } } + if (offset_gparts + count_gparts_in > s->size_gparts) { message("re-allocating gparts array."); s->size_gparts = (offset_gparts + count_gparts_in) * engine_parts_size_grow; struct gpart *gparts_new = NULL; - if (posix_memalign((void **)&gparts_new, gpart_align, + if (swift_memalign("gparts", (void **)&gparts_new, gpart_align, sizeof(struct gpart) * s->size_gparts) != 0) error("Failed to allocate new gpart data."); memcpy(gparts_new, s->gparts, sizeof(struct gpart) * offset_gparts); - free(s->gparts); + swift_free("gparts", s->gparts); s->gparts = gparts_new; /* Reset the links */ @@ -1654,12 +1692,14 @@ void engine_exchange_proxy_multipoles(struct engine *e) { /* Allocate the buffers for the packed data */ struct gravity_tensors *buffer_send = NULL; - if (posix_memalign((void **)&buffer_send, SWIFT_CACHE_ALIGNMENT, + if (swift_memalign("send_gravity_tensors", (void **)&buffer_send, + SWIFT_CACHE_ALIGNMENT, count_send_cells * sizeof(struct gravity_tensors)) != 0) error("Unable to allocate memory for multipole transactions"); struct gravity_tensors *buffer_recv = NULL; - if (posix_memalign((void **)&buffer_recv, SWIFT_CACHE_ALIGNMENT, + if (swift_memalign("recv_gravity_tensors", (void **)&buffer_recv, + SWIFT_CACHE_ALIGNMENT, count_recv_cells * sizeof(struct gravity_tensors)) != 0) error("Unable to allocate memory for multipole transactions"); @@ -1820,25 +1860,32 @@ void engine_allocate_foreign_particles(struct engine *e) { /* Allocate space for the foreign particles we will receive */ if (count_parts_in > s->size_parts_foreign) { - if (s->parts_foreign != NULL) free(s->parts_foreign); + if (s->parts_foreign != NULL) + swift_free("sparts_foreign", s->parts_foreign); s->size_parts_foreign = engine_foreign_alloc_margin * count_parts_in; - if (posix_memalign((void **)&s->parts_foreign, part_align, + if (swift_memalign("parts_foreign", (void **)&s->parts_foreign, part_align, sizeof(struct part) * s->size_parts_foreign) != 0) error("Failed to allocate foreign part data."); } + /* Allocate space for the foreign particles we will receive */ if (count_gparts_in > s->size_gparts_foreign) { - if (s->gparts_foreign != NULL) free(s->gparts_foreign); + if (s->gparts_foreign != NULL) + swift_free("gparts_foreign", s->gparts_foreign); s->size_gparts_foreign = engine_foreign_alloc_margin * count_gparts_in; - if (posix_memalign((void **)&s->gparts_foreign, gpart_align, + if (swift_memalign("gparts_foreign", (void **)&s->gparts_foreign, + gpart_align, sizeof(struct gpart) * s->size_gparts_foreign) != 0) error("Failed to allocate foreign gpart data."); } + /* Allocate space for the foreign particles we will receive */ if (count_sparts_in > s->size_sparts_foreign) { - if (s->sparts_foreign != NULL) free(s->sparts_foreign); + if (s->sparts_foreign != NULL) + swift_free("sparts_foreign", s->sparts_foreign); s->size_sparts_foreign = engine_foreign_alloc_margin * count_sparts_in; - if (posix_memalign((void **)&s->sparts_foreign, spart_align, + if (swift_memalign("sparts_foreign", (void **)&s->sparts_foreign, + spart_align, sizeof(struct spart) * s->size_sparts_foreign) != 0) error("Failed to allocate foreign spart data."); } @@ -2335,57 +2382,45 @@ void engine_barrier(struct engine *e) { * @param c The #cell to recurse into. * @param e The #engine. */ -void engine_collect_end_of_step_recurse(struct cell *c, - const struct engine *e) { +void engine_collect_end_of_step_recurse_hydro(struct cell *c, + const struct engine *e) { /* Skip super-cells (Their values are already set) */ #ifdef WITH_MPI - if (c->timestep != NULL || c->mpi.recv_ti != NULL) return; + if (c->timestep != NULL || c->mpi.hydro.recv_ti != NULL) return; #else if (c->timestep != NULL) return; #endif /* WITH_MPI */ +#ifdef SWIFT_DEBUG_CHECKS + /* if (!c->split) error("Reached a leaf without finding a time-step task! + * c->depth=%d c->maxdepth=%d c->count=%d c->node=%d", */ + /* c->depth, c->maxdepth, c->hydro.count, c->nodeID); */ +#endif + /* Counters for the different quantities. */ - size_t updated = 0, g_updated = 0, s_updated = 0; - size_t inhibited = 0, g_inhibited = 0, s_inhibited = 0; + size_t updated = 0, inhibited = 0; integertime_t ti_hydro_end_min = max_nr_timesteps, ti_hydro_end_max = 0, ti_hydro_beg_max = 0; - integertime_t ti_gravity_end_min = max_nr_timesteps, ti_gravity_end_max = 0, - ti_gravity_beg_max = 0; - integertime_t ti_stars_end_min = max_nr_timesteps; /* Collect the values from the progeny. */ for (int k = 0; k < 8; k++) { struct cell *cp = c->progeny[k]; - if (cp != NULL && - (cp->hydro.count > 0 || cp->grav.count > 0 || cp->stars.count > 0)) { + if (cp != NULL && cp->hydro.count > 0) { /* Recurse */ - engine_collect_end_of_step_recurse(cp, e); + engine_collect_end_of_step_recurse_hydro(cp, e); /* And update */ ti_hydro_end_min = min(ti_hydro_end_min, cp->hydro.ti_end_min); ti_hydro_end_max = max(ti_hydro_end_max, cp->hydro.ti_end_max); ti_hydro_beg_max = max(ti_hydro_beg_max, cp->hydro.ti_beg_max); - ti_gravity_end_min = min(ti_gravity_end_min, cp->grav.ti_end_min); - ti_gravity_end_max = max(ti_gravity_end_max, cp->grav.ti_end_max); - ti_gravity_beg_max = max(ti_gravity_beg_max, cp->grav.ti_beg_max); - - ti_stars_end_min = min(ti_stars_end_min, cp->stars.ti_end_min); - updated += cp->hydro.updated; - g_updated += cp->grav.updated; - s_updated += cp->stars.updated; - inhibited += cp->hydro.inhibited; - g_inhibited += cp->grav.inhibited; - s_inhibited += cp->stars.inhibited; /* Collected, so clear for next time. */ cp->hydro.updated = 0; - cp->grav.updated = 0; - cp->stars.updated = 0; } } @@ -2393,16 +2428,125 @@ void engine_collect_end_of_step_recurse(struct cell *c, c->hydro.ti_end_min = ti_hydro_end_min; c->hydro.ti_end_max = ti_hydro_end_max; c->hydro.ti_beg_max = ti_hydro_beg_max; - c->grav.ti_end_min = ti_gravity_end_min; - c->grav.ti_end_max = ti_gravity_end_max; - c->grav.ti_beg_max = ti_gravity_beg_max; - c->stars.ti_end_min = ti_stars_end_min; c->hydro.updated = updated; - c->grav.updated = g_updated; - c->stars.updated = s_updated; c->hydro.inhibited = inhibited; - c->grav.inhibited = g_inhibited; - c->stars.inhibited = s_inhibited; +} + +/** + * @brief Recursive function gathering end-of-step data. + * + * We recurse until we encounter a timestep or time-step MPI recv task + * as the values will have been set at that level. We then bring these + * values upwards. + * + * @param c The #cell to recurse into. + * @param e The #engine. + */ +void engine_collect_end_of_step_recurse_grav(struct cell *c, + const struct engine *e) { + +/* Skip super-cells (Their values are already set) */ +#ifdef WITH_MPI + if (c->timestep != NULL || c->mpi.grav.recv_ti != NULL) return; +#else + if (c->timestep != NULL) return; +#endif /* WITH_MPI */ + +#ifdef SWIFT_DEBUG_CHECKS + // if (!c->split) error("Reached a leaf without finding a time-step + // task!"); +#endif + + /* Counters for the different quantities. */ + size_t updated = 0, inhibited = 0; + integertime_t ti_grav_end_min = max_nr_timesteps, ti_grav_end_max = 0, + ti_grav_beg_max = 0; + + /* Collect the values from the progeny. */ + for (int k = 0; k < 8; k++) { + struct cell *cp = c->progeny[k]; + if (cp != NULL && cp->grav.count > 0) { + + /* Recurse */ + engine_collect_end_of_step_recurse_grav(cp, e); + + /* And update */ + ti_grav_end_min = min(ti_grav_end_min, cp->grav.ti_end_min); + ti_grav_end_max = max(ti_grav_end_max, cp->grav.ti_end_max); + ti_grav_beg_max = max(ti_grav_beg_max, cp->grav.ti_beg_max); + + updated += cp->grav.updated; + inhibited += cp->grav.inhibited; + + /* Collected, so clear for next time. */ + cp->grav.updated = 0; + } + } + + /* Store the collected values in the cell. */ + c->grav.ti_end_min = ti_grav_end_min; + c->grav.ti_end_max = ti_grav_end_max; + c->grav.ti_beg_max = ti_grav_beg_max; + c->grav.updated = updated; + c->grav.inhibited = inhibited; +} + +/** + * @brief Recursive function gathering end-of-step data. + * + * We recurse until we encounter a timestep or time-step MPI recv task + * as the values will have been set at that level. We then bring these + * values upwards. + * + * @param c The #cell to recurse into. + * @param e The #engine. + */ +void engine_collect_end_of_step_recurse_stars(struct cell *c, + const struct engine *e) { + +/* Skip super-cells (Their values are already set) */ +#ifdef WITH_MPI + if (c->timestep != NULL || c->mpi.stars.recv_ti != NULL) return; +#else + if (c->timestep != NULL) return; +#endif /* WITH_MPI */ + +#ifdef SWIFT_DEBUG_CHECKS + // if (!c->split) error("Reached a leaf without finding a time-step task!"); +#endif + + /* Counters for the different quantities. */ + size_t updated = 0, inhibited = 0; + integertime_t ti_stars_end_min = max_nr_timesteps, ti_stars_end_max = 0, + ti_stars_beg_max = 0; + + /* Collect the values from the progeny. */ + for (int k = 0; k < 8; k++) { + struct cell *cp = c->progeny[k]; + if (cp != NULL && cp->stars.count > 0) { + + /* Recurse */ + engine_collect_end_of_step_recurse_stars(cp, e); + + /* And update */ + ti_stars_end_min = min(ti_stars_end_min, cp->stars.ti_end_min); + ti_stars_end_max = max(ti_stars_end_max, cp->stars.ti_end_max); + ti_stars_beg_max = max(ti_stars_beg_max, cp->stars.ti_beg_max); + + updated += cp->stars.updated; + inhibited += cp->stars.inhibited; + + /* Collected, so clear for next time. */ + cp->stars.updated = 0; + } + } + + /* Store the collected values in the cell. */ + c->stars.ti_end_min = ti_stars_end_min; + c->stars.ti_end_max = ti_stars_end_max; + c->stars.ti_beg_max = ti_stars_beg_max; + c->stars.updated = updated; + c->stars.inhibited = inhibited; } /** @@ -2421,6 +2565,9 @@ void engine_collect_end_of_step_mapper(void *map_data, int num_elements, struct end_of_step_data *data = (struct end_of_step_data *)extra_data; const struct engine *e = data->e; + const int with_hydro = (e->policy & engine_policy_hydro); + const int with_self_grav = (e->policy & engine_policy_self_gravity); + const int with_stars = (e->policy & engine_policy_stars); struct space *s = e->s; int *local_cells = (int *)map_data; @@ -2431,7 +2578,8 @@ void engine_collect_end_of_step_mapper(void *map_data, int num_elements, ti_hydro_beg_max = 0; integertime_t ti_gravity_end_min = max_nr_timesteps, ti_gravity_end_max = 0, ti_gravity_beg_max = 0; - integertime_t ti_stars_end_min = max_nr_timesteps; + integertime_t ti_stars_end_min = max_nr_timesteps, ti_stars_end_max = 0, + ti_stars_beg_max = 0; for (int ind = 0; ind < num_elements; ind++) { struct cell *c = &s->cells_top[local_cells[ind]]; @@ -2439,7 +2587,15 @@ void engine_collect_end_of_step_mapper(void *map_data, int num_elements, if (c->hydro.count > 0 || c->grav.count > 0 || c->stars.count > 0) { /* Make the top-cells recurse */ - engine_collect_end_of_step_recurse(c, e); + if (with_hydro) { + engine_collect_end_of_step_recurse_hydro(c, e); + } + if (with_self_grav) { + engine_collect_end_of_step_recurse_grav(c, e); + } + if (with_stars) { + engine_collect_end_of_step_recurse_stars(c, e); + } /* And aggregate */ if (c->hydro.ti_end_min > e->ti_current) @@ -2454,6 +2610,8 @@ void engine_collect_end_of_step_mapper(void *map_data, int num_elements, if (c->stars.ti_end_min > e->ti_current) ti_stars_end_min = min(ti_stars_end_min, c->stars.ti_end_min); + ti_stars_end_max = max(ti_stars_end_max, c->stars.ti_end_max); + ti_stars_beg_max = max(ti_stars_beg_max, c->stars.ti_beg_max); updated += c->hydro.updated; g_updated += c->grav.updated; @@ -2496,6 +2654,8 @@ void engine_collect_end_of_step_mapper(void *map_data, int num_elements, if (ti_stars_end_min > e->ti_current) data->ti_stars_end_min = min(ti_stars_end_min, data->ti_stars_end_min); + data->ti_stars_end_max = max(ti_stars_end_max, data->ti_stars_end_max); + data->ti_stars_beg_max = max(ti_stars_beg_max, data->ti_stars_beg_max); } if (lock_unlock(&s->lock) != 0) error("Failed to unlock the space"); @@ -2529,6 +2689,8 @@ void engine_collect_end_of_step(struct engine *e, int apply) { data.ti_hydro_beg_max = 0; data.ti_gravity_end_min = max_nr_timesteps, data.ti_gravity_end_max = 0, data.ti_gravity_beg_max = 0; + data.ti_stars_end_min = max_nr_timesteps, data.ti_stars_end_max = 0, + data.ti_stars_beg_max = 0; data.e = e; /* Collect information from the local top-level cells */ @@ -2546,7 +2708,8 @@ void engine_collect_end_of_step(struct engine *e, int apply) { &e->collect_group1, data.updated, data.g_updated, data.s_updated, data.inhibited, data.g_inhibited, data.s_inhibited, data.ti_hydro_end_min, data.ti_hydro_end_max, data.ti_hydro_beg_max, data.ti_gravity_end_min, - data.ti_gravity_end_max, data.ti_gravity_beg_max, e->forcerebuild, + data.ti_gravity_end_max, data.ti_gravity_beg_max, data.ti_stars_end_min, + data.ti_stars_end_max, data.ti_stars_beg_max, e->forcerebuild, e->s->tot_cells, e->sched.nr_tasks, (float)e->sched.nr_tasks / (float)e->s->tot_cells); @@ -2724,7 +2887,11 @@ void engine_skip_force_and_kick(struct engine *e) { t->type == task_type_star_formation || t->type == task_type_extra_ghost || t->subtype == task_subtype_gradient || - t->subtype == task_subtype_stars_feedback) + t->subtype == task_subtype_stars_feedback || + t->subtype == task_subtype_tend_part || + t->subtype == task_subtype_tend_gpart || + t->subtype == task_subtype_tend_spart || + t->subtype == task_subtype_rho || t->subtype == task_subtype_gpart) t->skip = 1; } @@ -3107,6 +3274,7 @@ void engine_step(struct engine *e) { e->max_active_bin = get_max_active_bin(e->ti_end_min); e->min_active_bin = get_min_active_bin(e->ti_current, e->ti_old); e->step += 1; + engine_current_step = e->step; e->step_props = engine_step_prop_none; /* When restarting, move everyone to the current time. */ @@ -3352,7 +3520,7 @@ void engine_check_for_dumps(struct engine *e) { /* Free the memory allocated for VELOCIraptor i/o. */ if (with_stf && e->snapshot_invoke_stf) { #ifdef HAVE_VELOCIRAPTOR - free(e->s->gpart_group_data); + swift_free("gpart_group_data", e->s->gpart_group_data); e->s->gpart_group_data = NULL; #endif } @@ -3494,6 +3662,14 @@ void engine_unskip(struct engine *e) { const ticks tic = getticks(); struct space *s = e->s; + const int nodeID = e->nodeID; + + const int with_hydro = e->policy & engine_policy_hydro; + const int with_self_grav = e->policy & engine_policy_self_gravity; + const int with_ext_grav = e->policy & engine_policy_external_gravity; + const int with_grav = (with_self_grav || with_ext_grav); + const int with_stars = e->policy & engine_policy_stars; + const int with_feedback = e->policy & engine_policy_feedback; #ifdef WITH_PROFILER static int count = 0; @@ -3508,11 +3684,10 @@ void engine_unskip(struct engine *e) { for (int k = 0; k < s->nr_local_cells_with_tasks; k++) { struct cell *c = &s->cells_top[local_cells[k]]; - if ((e->policy & engine_policy_hydro && cell_is_active_hydro(c, e)) || - (e->policy & engine_policy_self_gravity && - cell_is_active_gravity(c, e)) || - (e->policy & engine_policy_external_gravity && - cell_is_active_gravity(c, e))) { + if ((with_hydro && cell_is_active_hydro(c, e)) || + (with_grav && cell_is_active_gravity(c, e)) || + (with_feedback && cell_is_active_stars(c, e)) || + (with_stars && c->nodeID == nodeID && cell_is_active_stars(c, e))) { if (num_active_cells != k) memswap(&local_cells[k], &local_cells[num_active_cells], sizeof(int)); @@ -3881,17 +4056,18 @@ void engine_split(struct engine *e, struct partition *initial_partition) { s->size_parts = s->nr_parts * engine_redistribute_alloc_margin; struct part *parts_new = NULL; struct xpart *xparts_new = NULL; - if (posix_memalign((void **)&parts_new, part_align, + if (swift_memalign("parts", (void **)&parts_new, part_align, sizeof(struct part) * s->size_parts) != 0 || - posix_memalign((void **)&xparts_new, xpart_align, + swift_memalign("xparts", (void **)&xparts_new, xpart_align, sizeof(struct xpart) * s->size_parts) != 0) error("Failed to allocate new part data."); + if (s->nr_parts > 0) { memcpy(parts_new, s->parts, sizeof(struct part) * s->nr_parts); memcpy(xparts_new, s->xparts, sizeof(struct xpart) * s->nr_parts); } - free(s->parts); - free(s->xparts); + swift_free("parts", s->parts); + swift_free("xparts", s->xparts); s->parts = parts_new; s->xparts = xparts_new; @@ -3905,12 +4081,13 @@ void engine_split(struct engine *e, struct partition *initial_partition) { (size_t)(s->nr_sparts * engine_redistribute_alloc_margin)); s->size_sparts = s->nr_sparts * engine_redistribute_alloc_margin; struct spart *sparts_new = NULL; - if (posix_memalign((void **)&sparts_new, spart_align, + if (swift_memalign("sparts", (void **)&sparts_new, spart_align, sizeof(struct spart) * s->size_sparts) != 0) error("Failed to allocate new spart data."); + if (s->nr_sparts > 0) memcpy(sparts_new, s->sparts, sizeof(struct spart) * s->nr_sparts); - free(s->sparts); + swift_free("sparts", s->sparts); s->sparts = sparts_new; /* Re-link the gparts to their sparts. */ @@ -3923,12 +4100,13 @@ void engine_split(struct engine *e, struct partition *initial_partition) { (size_t)(s->nr_gparts * engine_redistribute_alloc_margin)); s->size_gparts = s->nr_gparts * engine_redistribute_alloc_margin; struct gpart *gparts_new = NULL; - if (posix_memalign((void **)&gparts_new, gpart_align, + if (swift_memalign("gparts", (void **)&gparts_new, gpart_align, sizeof(struct gpart) * s->size_gparts) != 0) error("Failed to allocate new gpart data."); + if (s->nr_gparts > 0) memcpy(gparts_new, s->gparts, sizeof(struct gpart) * s->nr_gparts); - free(s->gparts); + swift_free("gparts", s->gparts); s->gparts = gparts_new; /* Re-link the parts. */ @@ -3986,7 +4164,8 @@ void engine_collect_stars_counter(struct engine *e) { } /* Get all sparticles */ - struct spart *sparts = (struct spart *)malloc(total * sizeof(struct spart)); + struct spart *sparts = + (struct spart *)swift_malloc("sparts", total * sizeof(struct spart)); err = MPI_Allgatherv(e->s->sparts_foreign, e->s->nr_sparts_foreign, spart_mpi_type, sparts, n_sparts_int, displs, spart_mpi_type, MPI_COMM_WORLD); @@ -4020,8 +4199,8 @@ void engine_collect_stars_counter(struct engine *e) { } free(n_sparts); - free(n_sparts_in); - free(sparts); + free(n_sparts_int); + swift_free("sparts", sparts); #endif } @@ -4858,9 +5037,10 @@ void engine_config(int restart, struct engine *e, struct swift_params *params, parser_get_opt_param_int(params, "Scheduler:mpi_message_limit", 4) * 1024; /* Allocate and init the threads. */ - if (posix_memalign((void **)&e->runners, SWIFT_CACHE_ALIGNMENT, + if (swift_memalign("runners", (void **)&e->runners, SWIFT_CACHE_ALIGNMENT, e->nr_threads * sizeof(struct runner)) != 0) error("Failed to allocate threads array."); + for (int k = 0; k < e->nr_threads; k++) { e->runners[k].id = k; e->runners[k].e = e; @@ -5365,14 +5545,14 @@ void engine_clean(struct engine *e) { gravity_cache_clean(&e->runners[i].ci_gravity_cache); gravity_cache_clean(&e->runners[i].cj_gravity_cache); } - free(e->runners); + swift_free("runners", e->runners); free(e->snapshot_units); output_list_clean(&e->output_list_snapshots); output_list_clean(&e->output_list_stats); output_list_clean(&e->output_list_stf); - free(e->links); + swift_free("links", e->links); #if defined(WITH_LOGGER) logger_clean(e->logger); free(e->logger); diff --git a/src/engine.h b/src/engine.h index 0e0e9895a8b0d1928e48c52ad760d2303447c24d..e0c52dafadeb2996600e3e3b01349ae718c985dc 100644 --- a/src/engine.h +++ b/src/engine.h @@ -114,6 +114,11 @@ enum engine_step_properties { */ extern int engine_rank; +/** + * @brief The current step as a global variable (for messages). + */ +extern int engine_current_step; + /* Data structure for the engine. */ struct engine { @@ -189,6 +194,15 @@ struct engine { /* Maximal gravity ti_beg for the next time-step */ integertime_t ti_gravity_beg_max; + /* Minimal stars ti_end for the next time-step */ + integertime_t ti_stars_end_min; + + /* Maximal stars ti_end for the next time-step */ + integertime_t ti_stars_end_max; + + /* Maximal stars ti_beg for the next time-step */ + integertime_t ti_stars_beg_max; + /* Minimal overall ti_end for the next time-step */ integertime_t ti_end_min; diff --git a/src/engine_maketasks.c b/src/engine_maketasks.c index d1858f87ff0bfdfee878f2e53b81e100812fd0a5..aaf8bc677b3cd6de21cdbf8d74393263a816f82f 100644 --- a/src/engine_maketasks.c +++ b/src/engine_maketasks.c @@ -61,7 +61,8 @@ * @param t_grav The send_grav #task, if it has already been created. */ void engine_addtasks_send_gravity(struct engine *e, struct cell *ci, - struct cell *cj, struct task *t_grav) { + struct cell *cj, struct task *t_grav, + struct task *t_ti) { #ifdef WITH_MPI struct link *l = NULL; @@ -86,22 +87,28 @@ void engine_addtasks_send_gravity(struct engine *e, struct cell *ci, t_grav = scheduler_addtask(s, task_type_send, task_subtype_gpart, ci->mpi.tag, 0, ci, cj); + t_ti = scheduler_addtask(s, task_type_send, task_subtype_tend_gpart, + ci->mpi.tag, 0, ci, cj); + /* The sends should unlock the down pass. */ scheduler_addunlock(s, t_grav, ci->grav.super->grav.down); /* Drift before you send */ scheduler_addunlock(s, ci->grav.super->grav.drift, t_grav); + + scheduler_addunlock(s, ci->super->timestep, t_ti); } /* Add them to the local cell. */ engine_addlink(e, &ci->mpi.grav.send, t_grav); + engine_addlink(e, &ci->mpi.grav.send_ti, t_ti); } /* Recurse? */ if (ci->split) for (int k = 0; k < 8; k++) if (ci->progeny[k] != NULL) - engine_addtasks_send_gravity(e, ci->progeny[k], cj, t_grav); + engine_addtasks_send_gravity(e, ci->progeny[k], cj, t_grav, t_ti); #else error("SWIFT was not compiled with MPI support."); @@ -120,7 +127,8 @@ void engine_addtasks_send_gravity(struct engine *e, struct cell *ci, */ void engine_addtasks_send_hydro(struct engine *e, struct cell *ci, struct cell *cj, struct task *t_xv, - struct task *t_rho, struct task *t_gradient) { + struct task *t_rho, struct task *t_gradient, + struct task *t_ti) { #ifdef WITH_MPI struct link *l = NULL; @@ -152,6 +160,9 @@ void engine_addtasks_send_hydro(struct engine *e, struct cell *ci, ci->mpi.tag, 0, ci, cj); #endif + t_ti = scheduler_addtask(s, task_type_send, task_subtype_tend_part, + ci->mpi.tag, 0, ci, cj); + #ifdef EXTRA_HYDRO_LOOP scheduler_addunlock(s, t_gradient, ci->hydro.super->hydro.end_force); @@ -184,6 +195,8 @@ void engine_addtasks_send_hydro(struct engine *e, struct cell *ci, /* Drift before you send */ scheduler_addunlock(s, ci->hydro.super->hydro.drift, t_xv); + + scheduler_addunlock(s, ci->super->timestep, t_ti); } /* Add them to the local cell. */ @@ -192,6 +205,7 @@ void engine_addtasks_send_hydro(struct engine *e, struct cell *ci, #ifdef EXTRA_HYDRO_LOOP engine_addlink(e, &ci->mpi.hydro.send_gradient, t_gradient); #endif + engine_addlink(e, &ci->mpi.hydro.send_ti, t_ti); } /* Recurse? */ @@ -199,7 +213,7 @@ void engine_addtasks_send_hydro(struct engine *e, struct cell *ci, for (int k = 0; k < 8; k++) if (ci->progeny[k] != NULL) engine_addtasks_send_hydro(e, ci->progeny[k], cj, t_xv, t_rho, - t_gradient); + t_gradient, t_ti); #else error("SWIFT was not compiled with MPI support."); @@ -215,7 +229,8 @@ void engine_addtasks_send_hydro(struct engine *e, struct cell *ci, * @param t_feedback The send_feed #task, if it has already been created. */ void engine_addtasks_send_stars(struct engine *e, struct cell *ci, - struct cell *cj, struct task *t_feedback) { + struct cell *cj, struct task *t_feedback, + struct task *t_ti) { #ifdef WITH_MPI @@ -241,6 +256,9 @@ void engine_addtasks_send_stars(struct engine *e, struct cell *ci, t_feedback = scheduler_addtask(s, task_type_send, task_subtype_spart, ci->mpi.tag, 0, ci, cj); + t_ti = scheduler_addtask(s, task_type_send, task_subtype_tend_spart, + ci->mpi.tag, 0, ci, cj); + /* The send_stars task should unlock the super_cell's kick task. */ scheduler_addunlock(s, t_feedback, ci->hydro.super->stars.stars_out); @@ -249,98 +267,19 @@ void engine_addtasks_send_stars(struct engine *e, struct cell *ci, /* Drift before you send */ scheduler_addunlock(s, ci->hydro.super->stars.drift, t_feedback); - } - - engine_addlink(e, &ci->mpi.stars.send, t_feedback); - } - - /* Recurse? */ - if (ci->split) - for (int k = 0; k < 8; k++) - if (ci->progeny[k] != NULL) - engine_addtasks_send_stars(e, ci->progeny[k], cj, t_feedback); - -#else - error("SWIFT was not compiled with MPI support."); -#endif -} - -/** - * @brief Add send tasks for the time-step to a hierarchy of cells. - * - * @param e The #engine. - * @param ci The sending #cell. - * @param cj Dummy cell containing the nodeID of the receiving node. - * @param t_ti The send_ti #task, if it has already been created. - * @param t_limiter The send_limiter #task, if already created. - * @param with_limiter Are we running with the time-step limiter? - */ -void engine_addtasks_send_timestep(struct engine *e, struct cell *ci, - struct cell *cj, struct task *t_ti, - struct task *t_limiter, - const int with_limiter) { -#ifdef WITH_MPI - struct link *l = NULL; - struct scheduler *s = &e->sched; - const int nodeID = cj->nodeID; - - /* Check if any of the gravity tasks are for the target node. */ - for (l = ci->grav.grav; l != NULL; l = l->next) - if (l->t->ci->nodeID == nodeID || - (l->t->cj != NULL && l->t->cj->nodeID == nodeID)) - break; - - /* Check whether instead any of the hydro tasks are for the target node. */ - if (l == NULL) - for (l = ci->hydro.density; l != NULL; l = l->next) - if (l->t->ci->nodeID == nodeID || - (l->t->cj != NULL && l->t->cj->nodeID == nodeID)) - break; - - if (l == NULL) - for (l = ci->stars.density; l != NULL; l = l->next) - if (l->t->ci->nodeID == nodeID || - (l->t->cj != NULL && l->t->cj->nodeID == nodeID)) - break; - - /* If found anything, attach send tasks. */ - if (l != NULL) { - - /* Create the tasks and their dependencies? */ - if (t_ti == NULL) { - - /* Make sure this cell is tagged. */ - cell_ensure_tagged(ci); - - t_ti = scheduler_addtask(s, task_type_send, task_subtype_tend, - ci->mpi.tag, 0, ci, cj); - - if (with_limiter) - t_limiter = scheduler_addtask(s, task_type_send, task_subtype_limiter, - ci->mpi.tag, 0, ci, cj); - - /* The super-cell's timestep task should unlock the send_ti task. */ scheduler_addunlock(s, ci->super->timestep, t_ti); - if (with_limiter) scheduler_addunlock(s, t_limiter, ci->super->timestep); - if (with_limiter) - scheduler_addunlock(s, t_limiter, ci->super->timestep_limiter); - if (with_limiter) scheduler_addunlock(s, ci->super->kick2, t_limiter); - if (with_limiter) - scheduler_addunlock(s, ci->super->timestep_limiter, t_ti); } - /* Add them to the local cell. */ - engine_addlink(e, &ci->mpi.send_ti, t_ti); - if (with_limiter) engine_addlink(e, &ci->mpi.limiter.send, t_limiter); + engine_addlink(e, &ci->mpi.stars.send, t_feedback); + engine_addlink(e, &ci->mpi.stars.send_ti, t_ti); } /* Recurse? */ if (ci->split) for (int k = 0; k < 8; k++) if (ci->progeny[k] != NULL) - engine_addtasks_send_timestep(e, ci->progeny[k], cj, t_ti, t_limiter, - with_limiter); + engine_addtasks_send_stars(e, ci->progeny[k], cj, t_feedback, t_ti); #else error("SWIFT was not compiled with MPI support."); @@ -355,10 +294,11 @@ void engine_addtasks_send_timestep(struct engine *e, struct cell *ci, * @param t_xv The recv_xv #task, if it has already been created. * @param t_rho The recv_rho #task, if it has already been created. * @param t_gradient The recv_gradient #task, if it has already been created. + * @param t_ti The recv_ti_end #task, if it has already been created. */ void engine_addtasks_recv_hydro(struct engine *e, struct cell *c, struct task *t_xv, struct task *t_rho, - struct task *t_gradient) { + struct task *t_gradient, struct task *t_ti) { #ifdef WITH_MPI struct scheduler *s = &e->sched; @@ -380,11 +320,15 @@ void engine_addtasks_recv_hydro(struct engine *e, struct cell *c, t_gradient = scheduler_addtask(s, task_type_recv, task_subtype_gradient, c->mpi.tag, 0, c, NULL); #endif + + t_ti = scheduler_addtask(s, task_type_recv, task_subtype_tend_part, + c->mpi.tag, 0, c, NULL); } c->mpi.hydro.recv_xv = t_xv; c->mpi.hydro.recv_rho = t_rho; c->mpi.hydro.recv_gradient = t_gradient; + c->mpi.hydro.recv_ti = t_ti; /* Add dependencies. */ if (c->hydro.sorts != NULL) { @@ -403,10 +347,12 @@ void engine_addtasks_recv_hydro(struct engine *e, struct cell *c, } for (struct link *l = c->hydro.force; l != NULL; l = l->next) { scheduler_addunlock(s, t_gradient, l->t); + scheduler_addunlock(s, l->t, t_ti); } #else for (struct link *l = c->hydro.force; l != NULL; l = l->next) { scheduler_addunlock(s, t_rho, l->t); + scheduler_addunlock(s, l->t, t_ti); } #endif @@ -419,7 +365,8 @@ void engine_addtasks_recv_hydro(struct engine *e, struct cell *c, if (c->split) for (int k = 0; k < 8; k++) if (c->progeny[k] != NULL) - engine_addtasks_recv_hydro(e, c->progeny[k], t_xv, t_rho, t_gradient); + engine_addtasks_recv_hydro(e, c->progeny[k], t_xv, t_rho, t_gradient, + t_ti); #else error("SWIFT was not compiled with MPI support."); @@ -434,7 +381,7 @@ void engine_addtasks_recv_hydro(struct engine *e, struct cell *c, * @param t_feedback The recv_feed #task, if it has already been created. */ void engine_addtasks_recv_stars(struct engine *e, struct cell *c, - struct task *t_feedback) { + struct task *t_feedback, struct task *t_ti) { #ifdef WITH_MPI struct scheduler *s = &e->sched; @@ -450,9 +397,13 @@ void engine_addtasks_recv_stars(struct engine *e, struct cell *c, /* Create the tasks. */ t_feedback = scheduler_addtask(s, task_type_recv, task_subtype_spart, c->mpi.tag, 0, c, NULL); + + t_ti = scheduler_addtask(s, task_type_recv, task_subtype_tend_spart, + c->mpi.tag, 0, c, NULL); } c->mpi.stars.recv = t_feedback; + c->mpi.stars.recv_ti = t_ti; #ifdef SWIFT_DEBUG_CHECKS if (c->nodeID == e->nodeID) error("Local cell!"); @@ -466,13 +417,14 @@ void engine_addtasks_recv_stars(struct engine *e, struct cell *c, for (struct link *l = c->stars.feedback; l != NULL; l = l->next) { scheduler_addunlock(s, t_feedback, l->t); + scheduler_addunlock(s, l->t, t_ti); } /* Recurse? */ if (c->split) for (int k = 0; k < 8; k++) if (c->progeny[k] != NULL) - engine_addtasks_recv_stars(e, c->progeny[k], t_feedback); + engine_addtasks_recv_stars(e, c->progeny[k], t_feedback, t_ti); #else error("SWIFT was not compiled with MPI support."); @@ -487,7 +439,7 @@ void engine_addtasks_recv_stars(struct engine *e, struct cell *c, * @param t_grav The recv_gpart #task, if it has already been created. */ void engine_addtasks_recv_gravity(struct engine *e, struct cell *c, - struct task *t_grav) { + struct task *t_grav, struct task *t_ti) { #ifdef WITH_MPI struct scheduler *s = &e->sched; @@ -503,89 +455,24 @@ void engine_addtasks_recv_gravity(struct engine *e, struct cell *c, /* Create the tasks. */ t_grav = scheduler_addtask(s, task_type_recv, task_subtype_gpart, c->mpi.tag, 0, c, NULL); - } - c->mpi.grav.recv = t_grav; - - for (struct link *l = c->grav.grav; l != NULL; l = l->next) - scheduler_addunlock(s, t_grav, l->t); - - /* Recurse? */ - if (c->split) - for (int k = 0; k < 8; k++) - if (c->progeny[k] != NULL) - engine_addtasks_recv_gravity(e, c->progeny[k], t_grav); - -#else - error("SWIFT was not compiled with MPI support."); -#endif -} - -/** - * @brief Add recv tasks for gravity pairs to a hierarchy of cells. - * - * @param e The #engine. - * @param c The foreign #cell. - * @param t_ti The recv_ti #task, if already been created. - * @param t_limiter The recv_limiter #task, if already created. - * @param with_limiter Are we running with the time-step limiter? - */ -void engine_addtasks_recv_timestep(struct engine *e, struct cell *c, - struct task *t_ti, struct task *t_limiter, - const int with_limiter) { - -#ifdef WITH_MPI - struct scheduler *s = &e->sched; - - /* Have we reached a level where there are any self/pair tasks ? */ - if (t_ti == NULL && (c->grav.grav != NULL || c->hydro.density != NULL)) { - -#ifdef SWIFT_DEBUG_CHECKS - /* Make sure this cell has a valid tag. */ - if (c->mpi.tag < 0) error("Trying to receive from untagged cell."); -#endif // SWIFT_DEBUG_CHECKS - - t_ti = scheduler_addtask(s, task_type_recv, task_subtype_tend, c->mpi.tag, - 0, c, NULL); - - if (with_limiter) - t_limiter = scheduler_addtask(s, task_type_recv, task_subtype_limiter, - c->mpi.tag, 0, c, NULL); + t_ti = scheduler_addtask(s, task_type_recv, task_subtype_tend_gpart, + c->mpi.tag, 0, c, NULL); } - c->mpi.recv_ti = t_ti; + c->mpi.grav.recv = t_grav; + c->mpi.grav.recv_ti = t_ti; for (struct link *l = c->grav.grav; l != NULL; l = l->next) { + scheduler_addunlock(s, t_grav, l->t); scheduler_addunlock(s, l->t, t_ti); } - if (with_limiter) { - - for (struct link *l = c->hydro.force; l != NULL; l = l->next) { - scheduler_addunlock(s, l->t, t_limiter); - } - - for (struct link *l = c->hydro.limiter; l != NULL; l = l->next) { - scheduler_addunlock(s, t_limiter, l->t); - scheduler_addunlock(s, l->t, t_ti); - } - - } else { - - for (struct link *l = c->hydro.force; l != NULL; l = l->next) { - scheduler_addunlock(s, l->t, t_ti); - } - } - - for (struct link *l = c->stars.feedback; l != NULL; l = l->next) - scheduler_addunlock(s, l->t, t_ti); - /* Recurse? */ if (c->split) for (int k = 0; k < 8; k++) if (c->progeny[k] != NULL) - engine_addtasks_recv_timestep(e, c->progeny[k], t_ti, t_limiter, - with_limiter); + engine_addtasks_recv_gravity(e, c->progeny[k], t_grav, t_ti); #else error("SWIFT was not compiled with MPI support."); @@ -608,6 +495,16 @@ void engine_make_hierarchical_tasks_common(struct engine *e, struct cell *c) { struct scheduler *s = &e->sched; const int with_limiter = (e->policy & engine_policy_limiter); + const int with_star_formation = (e->policy & engine_policy_star_formation); + + /* Are we at the top-level? */ + if (c->top == c && c->nodeID == e->nodeID) { + + if (with_star_formation && c->hydro.count > 0) { + c->hydro.star_formation = scheduler_addtask( + s, task_type_star_formation, task_subtype_none, 0, 0, c, NULL); + } + } /* Are we in a super-cell ? */ if (c->super == c) { @@ -634,6 +531,12 @@ void engine_make_hierarchical_tasks_common(struct engine *e, struct cell *c) { scheduler_addunlock(s, c->kick2, c->timestep); scheduler_addunlock(s, c->timestep, c->kick1); + /* Subgrid tasks: star formation */ + if (with_star_formation && c->hydro.count > 0) { + scheduler_addunlock(s, c->kick2, c->top->hydro.star_formation); + scheduler_addunlock(s, c->top->hydro.star_formation, c->timestep); + } + /* Time-step limiting */ if (with_limiter) { c->timestep_limiter = scheduler_addtask( @@ -868,16 +771,6 @@ void engine_make_hierarchical_tasks_hydro(struct engine *e, struct cell *c) { scheduler_addunlock(s, c->hydro.end_force, c->super->kick2); } - /* Subgrid tasks: star formation */ - if (with_star_formation) { - - c->hydro.star_formation = scheduler_addtask( - s, task_type_star_formation, task_subtype_none, 0, 0, c, NULL); - - scheduler_addunlock(s, c->super->kick2, c->hydro.star_formation); - scheduler_addunlock(s, c->hydro.star_formation, c->super->timestep); - } - /* Subgrid tasks: feedback */ if (with_feedback) { @@ -895,8 +788,9 @@ void engine_make_hierarchical_tasks_hydro(struct engine *e, struct cell *c) { scheduler_addunlock(s, c->super->kick2, c->stars.stars_in); scheduler_addunlock(s, c->stars.stars_out, c->super->timestep); - if (with_star_formation) { - scheduler_addunlock(s, c->hydro.star_formation, c->stars.stars_in); + if (with_star_formation && c->hydro.count > 0) { + scheduler_addunlock(s, c->top->hydro.star_formation, + c->stars.stars_in); } } } @@ -2044,6 +1938,7 @@ void engine_make_hydroloop_tasks_mapper(void *map_data, int num_elements, struct engine *e = (struct engine *)extra_data; const int periodic = e->s->periodic; const int with_feedback = (e->policy & engine_policy_feedback); + const int with_stars = (e->policy & engine_policy_stars); struct space *s = e->s; struct scheduler *sched = &e->sched; @@ -2066,7 +1961,7 @@ void engine_make_hydroloop_tasks_mapper(void *map_data, int num_elements, struct cell *ci = &cells[cid]; /* Skip cells without hydro or star particles */ - if ((ci->hydro.count == 0) && (!with_feedback || ci->stars.count == 0)) + if ((ci->hydro.count == 0) && (!with_stars || ci->stars.count == 0)) continue; /* If the cell is local build a self-interaction */ @@ -2163,7 +2058,7 @@ void engine_addtasks_send_mapper(void *map_data, int num_elements, void *extra_data) { struct engine *e = (struct engine *)extra_data; - const int with_limiter = (e->policy & engine_policy_limiter); + // const int with_limiter = (e->policy & engine_policy_limiter); struct cell_type_pair *cell_type_pairs = (struct cell_type_pair *)map_data; for (int k = 0; k < num_elements; k++) { @@ -2172,24 +2067,25 @@ void engine_addtasks_send_mapper(void *map_data, int num_elements, const int type = cell_type_pairs[k].type; /* Add the send task for the particle timesteps. */ - engine_addtasks_send_timestep(e, ci, cj, NULL, NULL, with_limiter); + // engine_addtasks_send_timestep(e, ci, cj, NULL, NULL, with_limiter); /* Add the send tasks for the cells in the proxy that have a hydro * connection. */ if ((e->policy & engine_policy_hydro) && (type & proxy_cell_type_hydro)) engine_addtasks_send_hydro(e, ci, cj, /*t_xv=*/NULL, - /*t_rho=*/NULL, /*t_gradient=*/NULL); + /*t_rho=*/NULL, /*t_gradient=*/NULL, + /*t_ti=*/NULL); /* Add the send tasks for the cells in the proxy that have a stars * connection. */ if ((e->policy & engine_policy_feedback) && (type & proxy_cell_type_hydro)) - engine_addtasks_send_stars(e, ci, cj, /*t_feedback=*/NULL); + engine_addtasks_send_stars(e, ci, cj, /*t_feedback=*/NULL, /*t_ti=*/NULL); /* Add the send tasks for the cells in the proxy that have a gravity * connection. */ if ((e->policy & engine_policy_self_gravity) && (type & proxy_cell_type_gravity)) - engine_addtasks_send_gravity(e, ci, cj, NULL); + engine_addtasks_send_gravity(e, ci, cj, NULL, NULL); } } @@ -2197,7 +2093,7 @@ void engine_addtasks_recv_mapper(void *map_data, int num_elements, void *extra_data) { struct engine *e = (struct engine *)extra_data; - const int with_limiter = (e->policy & engine_policy_limiter); + // const int with_limiter = (e->policy & engine_policy_limiter); struct cell_type_pair *cell_type_pairs = (struct cell_type_pair *)map_data; for (int k = 0; k < num_elements; k++) { @@ -2205,23 +2101,23 @@ void engine_addtasks_recv_mapper(void *map_data, int num_elements, const int type = cell_type_pairs[k].type; /* Add the recv task for the particle timesteps. */ - engine_addtasks_recv_timestep(e, ci, NULL, NULL, with_limiter); + // engine_addtasks_recv_timestep(e, ci, NULL, NULL, with_limiter); /* Add the recv tasks for the cells in the proxy that have a hydro * connection. */ if ((e->policy & engine_policy_hydro) && (type & proxy_cell_type_hydro)) - engine_addtasks_recv_hydro(e, ci, NULL, NULL, NULL); + engine_addtasks_recv_hydro(e, ci, NULL, NULL, NULL, NULL); /* Add the recv tasks for the cells in the proxy that have a stars * connection. */ if ((e->policy & engine_policy_feedback) && (type & proxy_cell_type_hydro)) - engine_addtasks_recv_stars(e, ci, NULL); + engine_addtasks_recv_stars(e, ci, NULL, NULL); /* Add the recv tasks for the cells in the proxy that have a gravity * connection. */ if ((e->policy & engine_policy_self_gravity) && (type & proxy_cell_type_gravity)) - engine_addtasks_recv_gravity(e, ci, NULL); + engine_addtasks_recv_gravity(e, ci, NULL, NULL); } } @@ -2289,7 +2185,7 @@ void engine_maketasks(struct engine *e) { #endif /* Free the old list of cell-task links. */ - if (e->links != NULL) free(e->links); + if (e->links != NULL) swift_free("links", e->links); e->size_links = e->sched.nr_tasks * e->links_per_tasks; /* Make sure that we have space for more links than last time. */ @@ -2297,8 +2193,8 @@ void engine_maketasks(struct engine *e) { e->size_links = e->nr_links * engine_rebuild_link_alloc_margin; /* Allocate the new link list */ - if ((e->links = (struct link *)malloc(sizeof(struct link) * e->size_links)) == - NULL) + if ((e->links = (struct link *)swift_malloc( + "links", sizeof(struct link) * e->size_links)) == NULL) error("Failed to allocate cell-task links."); e->nr_links = 0; diff --git a/src/engine_marktasks.c b/src/engine_marktasks.c index 9b34b3ea95a9ae8bc848a90113647b3e68b121b1..114841b015c680973b5c3007cf4c03048cd861dc 100644 --- a/src/engine_marktasks.c +++ b/src/engine_marktasks.c @@ -309,11 +309,25 @@ void engine_marktasks_mapper(void *map_data, int num_elements, } /* Stars feedback */ - else if ((t_subtype == task_subtype_stars_feedback) && - ((ci_active_stars && ci_nodeID == nodeID) || - (cj_active_stars && cj_nodeID == nodeID))) { + else if (t_subtype == task_subtype_stars_feedback) { - scheduler_activate(s, t); + /* We only want to activate the task if the cell is active and is + going to update some gas on the *local* node */ + if ((ci_nodeID == nodeID && cj_nodeID == nodeID) && + (ci_active_stars || cj_active_stars)) { + + scheduler_activate(s, t); + + } else if ((ci_nodeID == nodeID && cj_nodeID != nodeID) && + (cj_active_stars)) { + + scheduler_activate(s, t); + + } else if ((ci_nodeID != nodeID && cj_nodeID == nodeID) && + (ci_active_stars)) { + + scheduler_activate(s, t); + } } /* Gravity */ @@ -358,7 +372,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, } /* If the foreign cell is active, we want its ti_end values. */ - if (ci_active_hydro) scheduler_activate(s, ci->mpi.recv_ti); + if (ci_active_hydro) scheduler_activate(s, ci->mpi.hydro.recv_ti); /* Is the foreign cell active and will need stuff from us? */ if (ci_active_hydro) { @@ -383,7 +397,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, /* If the local cell is active, send its ti_end values. */ if (cj_active_hydro) - scheduler_activate_send(s, cj->mpi.send_ti, ci_nodeID); + scheduler_activate_send(s, cj->mpi.hydro.send_ti, ci_nodeID); } else if (cj_nodeID != nodeID) { @@ -400,7 +414,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, } /* If the foreign cell is active, we want its ti_end values. */ - if (cj_active_hydro) scheduler_activate(s, cj->mpi.recv_ti); + if (cj_active_hydro) scheduler_activate(s, cj->mpi.hydro.recv_ti); /* Is the foreign cell active and will need stuff from us? */ if (cj_active_hydro) { @@ -427,7 +441,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, /* If the local cell is active, send its ti_end values. */ if (ci_active_hydro) - scheduler_activate_send(s, ci->mpi.send_ti, cj_nodeID); + scheduler_activate_send(s, ci->mpi.hydro.send_ti, cj_nodeID); } #endif } @@ -452,14 +466,14 @@ void engine_marktasks_mapper(void *map_data, int num_elements, cell_activate_drift_spart(cj, s); /* If the local cell is active, send its ti_end values. */ - scheduler_activate_send(s, cj->mpi.send_ti, ci_nodeID); + scheduler_activate_send(s, cj->mpi.stars.send_ti, ci_nodeID); } if (ci_active_stars) { scheduler_activate(s, ci->mpi.stars.recv); /* If the foreign cell is active, we want its ti_end values. */ - scheduler_activate(s, ci->mpi.recv_ti); + scheduler_activate(s, ci->mpi.stars.recv_ti); /* Is the foreign cell active and will need stuff from us? */ scheduler_activate_send(s, cj->mpi.hydro.send_xv, ci_nodeID); @@ -482,14 +496,14 @@ void engine_marktasks_mapper(void *map_data, int num_elements, cell_activate_drift_spart(ci, s); /* If the local cell is active, send its ti_end values. */ - scheduler_activate_send(s, ci->mpi.send_ti, cj_nodeID); + scheduler_activate_send(s, ci->mpi.stars.send_ti, cj_nodeID); } if (cj_active_stars) { scheduler_activate(s, cj->mpi.stars.recv); /* If the foreign cell is active, we want its ti_end values. */ - scheduler_activate(s, cj->mpi.recv_ti); + scheduler_activate(s, cj->mpi.stars.recv_ti); /* Is the foreign cell active and will need stuff from us? */ scheduler_activate_send(s, ci->mpi.hydro.send_xv, cj_nodeID); @@ -514,7 +528,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, if (cj_active_gravity) scheduler_activate(s, ci->mpi.grav.recv); /* If the foreign cell is active, we want its ti_end values. */ - if (ci_active_gravity) scheduler_activate(s, ci->mpi.recv_ti); + if (ci_active_gravity) scheduler_activate(s, ci->mpi.grav.recv_ti); /* Is the foreign cell active and will need stuff from us? */ if (ci_active_gravity) { @@ -530,7 +544,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, /* If the local cell is active, send its ti_end values. */ if (cj_active_gravity) - scheduler_activate_send(s, cj->mpi.send_ti, ci_nodeID); + scheduler_activate_send(s, cj->mpi.grav.send_ti, ci_nodeID); } else if (cj_nodeID != nodeID) { @@ -538,7 +552,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, if (ci_active_gravity) scheduler_activate(s, cj->mpi.grav.recv); /* If the foreign cell is active, we want its ti_end values. */ - if (cj_active_gravity) scheduler_activate(s, cj->mpi.recv_ti); + if (cj_active_gravity) scheduler_activate(s, cj->mpi.grav.recv_ti); /* Is the foreign cell active and will need stuff from us? */ if (cj_active_gravity) { @@ -554,7 +568,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, /* If the local cell is active, send its ti_end values. */ if (ci_active_gravity) - scheduler_activate_send(s, ci->mpi.send_ti, cj_nodeID); + scheduler_activate_send(s, ci->mpi.grav.send_ti, cj_nodeID); } #endif } @@ -651,7 +665,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, else if (t_type == task_type_star_formation) { if (cell_is_active_hydro(t->ci, e)) { scheduler_activate(s, t); - cell_activate_drift_spart(t->ci, s); + cell_activate_super_spart_drifts(t->ci, s); } } } diff --git a/src/entropy_floor/EAGLE/entropy_floor.h b/src/entropy_floor/EAGLE/entropy_floor.h index cc90e0ad3dd0cf6f16af6e95cbe93be17af3c847..5a53b3b39c9df3aa624b3fd93e82bed9d221204c 100644 --- a/src/entropy_floor/EAGLE/entropy_floor.h +++ b/src/entropy_floor/EAGLE/entropy_floor.h @@ -98,42 +98,48 @@ static INLINE float entropy_floor( const struct part *p, const struct cosmology *cosmo, const struct entropy_floor_properties *props) { + /* Comoving density in internal units */ + const float rho_com = hydro_get_comoving_density(p); + /* Physical density in internal units */ - const float rho = hydro_get_physical_density(p, cosmo); + const float rho_phys = hydro_get_physical_density(p, cosmo); - /* Critical density at this redshift. - * Recall that this is 0 in a non-cosmological run */ - const float rho_crit = cosmo->critical_density; - const float rho_crit_baryon = cosmo->Omega_b * rho_crit; + /* Mean baryon density in co-moving internal units for over-density condition + * (Recall cosmo->critical_density_0 is 0 in a non-cosmological run, + * making the over-density condition a no-op) */ + const float rho_crit_0 = cosmo->critical_density_0; + const float rho_crit_baryon = cosmo->Omega_b * rho_crit_0; /* Physical pressure */ float pressure = 0.f; /* Are we in the regime of the Jeans equation of state? */ - if ((rho >= rho_crit_baryon * props->Jeans_over_density_threshold) && - (rho >= props->Jeans_density_threshold)) { + if ((rho_com >= rho_crit_baryon * props->Jeans_over_density_threshold) && + (rho_phys >= props->Jeans_density_threshold)) { - const float pressure_Jeans = props->Jeans_pressure_norm * - powf(rho * props->Jeans_density_threshold_inv, - props->Jeans_gamma_effective); + const float pressure_Jeans = + props->Jeans_pressure_norm * + powf(rho_phys * props->Jeans_density_threshold_inv, + props->Jeans_gamma_effective); pressure = max(pressure, pressure_Jeans); } /* Are we in the regime of the Cool equation of state? */ - if ((rho >= rho_crit_baryon * props->Cool_over_density_threshold) && - (rho >= props->Cool_density_threshold)) { + if ((rho_com >= rho_crit_baryon * props->Cool_over_density_threshold) && + (rho_phys >= props->Cool_density_threshold)) { - const float pressure_Cool = props->Cool_pressure_norm * - powf(rho * props->Cool_density_threshold_inv, - props->Cool_gamma_effective); + const float pressure_Cool = + props->Cool_pressure_norm * + powf(rho_phys * props->Cool_density_threshold_inv, + props->Cool_gamma_effective); pressure = max(pressure, pressure_Cool); } /* Convert to an entropy. * (Recall that the entropy is the same in co-moving and phycial frames) */ - return gas_entropy_from_pressure(rho, pressure); + return gas_entropy_from_pressure(rho_phys, pressure); } /** @@ -152,39 +158,43 @@ static INLINE float entropy_floor_temperature( const struct part *p, const struct cosmology *cosmo, const struct entropy_floor_properties *props) { + /* Comoving density in internal units */ + const float rho_com = hydro_get_comoving_density(p); + /* Physical density in internal units */ - const float rho = hydro_get_physical_density(p, cosmo); + const float rho_phys = hydro_get_physical_density(p, cosmo); - /* Critical density at this redshift. - * Recall that this is 0 in a non-cosmological run */ - const float rho_crit = cosmo->critical_density; - const float rho_crit_baryon = cosmo->Omega_b * rho_crit; + /* Mean baryon density in co-moving internal units for over-density condition + * (Recall cosmo->critical_density_0 is 0 in a non-cosmological run, + * making the over-density condition a no-op) */ + const float rho_crit_0 = cosmo->critical_density_0; + const float rho_crit_baryon = cosmo->Omega_b * rho_crit_0; /* Physical */ float temperature = 0.f; /* Are we in the regime of the Jeans equation of state? */ - if ((rho >= rho_crit_baryon * props->Jeans_over_density_threshold) && - (rho >= props->Jeans_density_threshold)) { + if ((rho_com >= rho_crit_baryon * props->Jeans_over_density_threshold) && + (rho_phys >= props->Jeans_density_threshold)) { const float jeans_slope = props->Jeans_gamma_effective - 1.f; const float temperature_Jeans = props->Jeans_temperature_norm * - pow(rho * props->Jeans_density_threshold_inv, jeans_slope); + pow(rho_phys * props->Jeans_density_threshold_inv, jeans_slope); temperature = max(temperature, temperature_Jeans); } /* Are we in the regime of the Cool equation of state? */ - if ((rho >= rho_crit_baryon * props->Cool_over_density_threshold) && - (rho >= props->Cool_density_threshold)) { + if ((rho_com >= rho_crit_baryon * props->Cool_over_density_threshold) && + (rho_phys >= props->Cool_density_threshold)) { const float cool_slope = props->Cool_gamma_effective - 1.f; const float temperature_Cool = props->Cool_temperature_norm * - pow(rho * props->Cool_density_threshold_inv, cool_slope); + pow(rho_phys * props->Cool_density_threshold_inv, cool_slope); temperature = max(temperature, temperature_Cool); } diff --git a/src/error.h b/src/error.h index d384ec56ba0dc3562160d94911e3e3d3bb786211..de4e9fa44c73d91524dfd307a3ad19b6cad3421f 100644 --- a/src/error.h +++ b/src/error.h @@ -35,13 +35,22 @@ /* Local headers. */ #include "clocks.h" +#include "memuse.h" +/* Use exit when not developing, avoids core dumps. */ #ifdef SWIFT_DEVELOP_MODE #define swift_abort(errcode) abort() #else #define swift_abort(errcode) exit(errcode) #endif +/* If reporting memory usage, try to dump that when exiting in error. */ +#ifdef SWIFT_MEMUSE_REPORTS +#define memdump(rank) memuse_log_dump_error(rank); +#else +#define memdump(rank) +#endif + /** * @brief Error macro. Prints the message given in argument and aborts. * @@ -54,19 +63,23 @@ extern int engine_rank; fprintf(stderr, "[%04i] %s %s:%s():%i: " s "\n", engine_rank, \ clocks_get_timesincestart(), __FILE__, __FUNCTION__, __LINE__, \ ##__VA_ARGS__); \ + memdump(engine_rank); \ MPI_Abort(MPI_COMM_WORLD, -1); \ }) #else +extern int engine_rank; #define error(s, ...) \ ({ \ fflush(stdout); \ fprintf(stderr, "%s %s:%s():%i: " s "\n", clocks_get_timesincestart(), \ __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__); \ + memdump(engine_rank); \ swift_abort(1); \ }) #endif #ifdef WITH_MPI +extern int engine_rank; /** * @brief MPI error macro. Prints the message given in argument, * followed by the MPI error string and aborts. @@ -82,6 +95,7 @@ extern int engine_rank; char buf[len]; \ MPI_Error_string(res, buf, &len); \ fprintf(stderr, "%s\n\n", buf); \ + memdump(engine_rank); \ MPI_Abort(MPI_COMM_WORLD, -1); \ }) diff --git a/src/memuse.c b/src/memuse.c new file mode 100644 index 0000000000000000000000000000000000000000..10fd349c0cc4de26b94878b45fd78da19e140f12 --- /dev/null +++ b/src/memuse.c @@ -0,0 +1,280 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Copyright (c) 2018 Peter W. Draper (p.w.draper@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/>. + * + ******************************************************************************/ + +/** + * @file memuse.c + * @brief file of routines to report about memory use in SWIFT. + * Note reports are in KB. + */ + +/* Config parameters. */ +#include "../config.h" + +/* Standard includes. */ +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <unistd.h> + +/* Local defines. */ +#include "memuse.h" + +/* Local includes. */ +#include "atomic.h" +#include "clocks.h" +#include "engine.h" + +#ifdef SWIFT_MEMUSE_REPORTS + +/* Also recorded in logger. */ +extern int engine_rank; +extern int engine_current_step; + +/* Entry for logger of memory allocations and deallocations in a step. */ +#define MEMUSE_MAXLAB 64 +struct memuse_log_entry { + + /* Rank in action. */ + int rank; + + /* Step of action. */ + int step; + + /* Whether allocated or deallocated. */ + int allocated; + + /* Memory allocated in bytes. */ + size_t size; + + /* Address of memory. */ + void *ptr; + + /* Relative time of this action. */ + ticks dtic; + + /* Label associated with the memory. */ + char label[MEMUSE_MAXLAB + 1]; +}; + +/* The log of allocations and frees. */ +static struct memuse_log_entry *memuse_log = NULL; +static volatile size_t memuse_log_size = 0; +static volatile size_t memuse_log_count = 0; +static volatile size_t memuse_log_done = 0; + +#define MEMUSE_INITLOG 1000000 +static void memuse_log_reallocate(size_t ind) { + + if (ind == 0) { + + /* Need to perform initialization. Be generous. */ + if ((memuse_log = (struct memuse_log_entry *)malloc( + sizeof(struct memuse_log_entry) * MEMUSE_INITLOG)) == NULL) + error("Failed to allocate memuse log."); + + /* Last action. */ + memuse_log_size = MEMUSE_INITLOG; + + } else { + struct memuse_log_entry *new_log; + if ((new_log = (struct memuse_log_entry *)malloc( + sizeof(struct memuse_log_entry) * memuse_log_size * 2)) == NULL) + error("Failed to re-allocate memuse log."); + + /* Wait for all writes to the old buffer to complete. */ + while (memuse_log_done < memuse_log_size) + ; + + /* Copy to new buffer. */ + memcpy(new_log, memuse_log, + sizeof(struct memuse_log_entry) * memuse_log_count); + free(memuse_log); + memuse_log = new_log; + + /* Last action. */ + memuse_log_size *= 2; + } +} + +/** + * @brief Log an allocation or deallocation of memory. + * + * @param label the label associated with the memory. + * @param ptr the memory pointer. + * @param allocated whether this is an allocation or deallocation. + * @param size the size in byte of memory allocated, set to 0 when + * deallocating. + */ +void memuse_log_allocation(const char *label, void *ptr, int allocated, + size_t size) { + size_t ind = atomic_inc(&memuse_log_count); + + /* If we are at the current size we need more space. */ + if (ind == memuse_log_size) memuse_log_reallocate(ind); + + /* Other threads wait for space. */ + while (ind > memuse_log_size) + ; + + /* Record the log. */ + memuse_log[ind].rank = engine_rank; + memuse_log[ind].step = engine_current_step; + memuse_log[ind].allocated = allocated; + memuse_log[ind].size = size; + memuse_log[ind].ptr = ptr; + strncpy(memuse_log[ind].label, label, MEMUSE_MAXLAB); + memuse_log[ind].label[MEMUSE_MAXLAB] = '\0'; + memuse_log[ind].dtic = getticks() - clocks_start_ticks; + atomic_inc(&memuse_log_done); +} + +/** + * @brief dump the log to a file and reset, if anything to dump. + * + * @param filename name of file for log dump. + */ +void memuse_log_dump(const char *filename) { + + /* Skip if nothing allocated this step. */ + if (memuse_log_count == 0) return; + + /* Open the output file. */ + FILE *fd; + if ((fd = fopen(filename, "w")) == NULL) + error("Failed to create memuse log file '%s'.", filename); + + /* Write a header. */ + fprintf(fd, "# Current use: %s\n", memuse_process(1)); + fprintf(fd, "# cpufreq: %lld\n", clocks_get_cpufreq()); + fprintf(fd, "# dtic adr rank step allocated label size\n"); + + for (size_t k = 0; k < memuse_log_count; k++) { + fprintf(fd, "%lld %p %d %d %d %s %zd\n", memuse_log[k].dtic, + memuse_log[k].ptr, memuse_log[k].rank, memuse_log[k].step, + memuse_log[k].allocated, memuse_log[k].label, memuse_log[k].size); + } + + /* Clear the log. */ + memuse_log_count = 0; + + /* Close the file. */ + fflush(fd); + fclose(fd); +} + +/** + * @brief dump the log for using the given rank to generate a standard + * name for the output. Used when exiting in error. + * + * @param rank the rank exiting in error. + */ +void memuse_log_dump_error(int rank) { + char filename[60]; + sprintf(filename, "memuse-error-report-rank%d.txt", rank); + memuse_log_dump(filename); +} + +#endif /* SWIFT_MEMUSE_REPORTS */ + +/** + * @brief parse the process /proc/self/statm file to get the process + * memory use (in KB). Top field in (). + * + * @param size total virtual memory (VIRT/VmSize) + * @param resident resident non-swapped memory (RES/VmRSS) + * @param shared shared (mmap'd) memory (SHR, RssFile+RssShmem) + * @param text text (exe) resident set (CODE, note also includes data + * segment, so is considered broken for Linux) + * @param data data+stack resident set (DATA, note also includes library, + * so is considered broken for Linux) + * @param library library resident set (0 for Linux) + * @param dirty dirty pages (nDRT = 0 for Linux) + */ +void memuse_use(long *size, long *resident, long *shared, long *text, + long *data, long *library, long *dirty) { + + /* Open the file. */ + FILE *file = fopen("/proc/self/statm", "r"); + if (file != NULL) { + int nscan = fscanf(file, "%ld %ld %ld %ld %ld %ld %ld", size, resident, + shared, text, library, data, dirty); + + if (nscan == 7) { + /* Convert pages into bytes. Usually 4096, but could be 512 on some + * systems so take care in conversion to KB. */ + long sz = sysconf(_SC_PAGESIZE); + *size *= sz; + *resident *= sz; + *shared *= sz; + *text *= sz; + *library *= sz; + *data *= sz; + *dirty *= sz; + + *size /= 1024; + *resident /= 1024; + *shared /= 1024; + *text /= 1024; + *library /= 1024; + *data /= 1024; + *dirty /= 1024; + } else { + error("Failed to read sufficient fields from /proc/self/statm"); + } + fclose(file); + } else { + error("Failed to open /proc/self/statm"); + } +} + +/** + * @brief Return a string with the current memory use of the process described. + * + * Not thread safe. + * + * @param inmb if true then report in MB, not KB. + * + * @result the memory use of the process, note make a copy if not used + * immediately. + */ +const char *memuse_process(int inmb) { + static char buffer[256]; + long size; + long resident; + long shared; + long text; + long library; + long data; + long dirty; + memuse_use(&size, &resident, &shared, &text, &data, &library, &dirty); + + if (inmb) { + snprintf(buffer, 256, + "VIRT = %.3f SHR = %.3f CODE = %.3f DATA = %.3f " + "RES = %.3f (MB)", + size / 1024.0, shared / 1024.0, text / 1024.0, data / 1024.0, + resident / 1024.0); + } else { + snprintf(buffer, 256, + "VIRT = %ld SHR = %ld CODE = %ld DATA = %ld " + "RES = %ld (KB)", + size, shared, text, data, resident); + } + return buffer; +} diff --git a/src/memuse.h b/src/memuse.h new file mode 100644 index 0000000000000000000000000000000000000000..751b7195aa8ad705d03b2490876993331e495c15 --- /dev/null +++ b/src/memuse.h @@ -0,0 +1,140 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Copyright (c) 2018 Peter W. Draper (p.w.draper@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_MEMUSE_H +#define SWIFT_MEMUSE_H + +/* Config parameters. */ +#include "../config.h" + +/* Includes. */ +#include <stdlib.h> + +/* API. */ +void memuse_use(long *size, long *resident, long *shared, long *text, + long *data, long *library, long *dirty); +const char *memuse_process(int inmb); + +#ifdef SWIFT_MEMUSE_REPORTS +void memuse_log_dump(const char *filename); +void memuse_log_dump_error(int rank); +void memuse_log_allocation(const char *label, void *ptr, int allocated, + size_t size); +#else + +/* No-op when not reporting. */ +#define memuse_log_allocation(label, ptr, allocated, size) +#endif + +/** + * @brief allocate aligned memory. The use and results are the same as the + * posix_memalign function. This function should be used for any + * significant allocations and consistently labelled. + * + * @param label a symbolic label for the memory, i.e. "parts". + * @param memptr pointer to the allocated memory. + * @param alignment alignment boundary. + * @param size the quantity of bytes to allocate. + * @result zero on success, otherwise an error code. + */ +__attribute__((always_inline)) inline int swift_memalign(const char *label, + void **memptr, + size_t alignment, + size_t size) { + int result = posix_memalign(memptr, alignment, size); +#ifdef SWIFT_MEMUSE_REPORTS + if (result == 0) { + memuse_log_allocation(label, *memptr, 1, size); + } else { + /* Failed allocations are interesting as well. */ + memuse_log_allocation(label, NULL, -1, size); + } +#endif + return result; +} + +/** + * @brief allocate memory. The use and results are the same as the + * malloc function. This function should be used for any + * _significant_ allocations and consistently labelled. + * Do not use this function for small or high frequency + * allocations in production code. + * + * @param label a symbolic label for the memory, i.e. "parts". + * @param size the quantity of bytes to allocate. + * @result pointer to the allocated memory or NULL on failure. + */ +__attribute__((always_inline)) inline void *swift_malloc(const char *label, + size_t size) { + void *memptr = malloc(size); +#ifdef SWIFT_MEMUSE_REPORTS + if (memptr != NULL) { + memuse_log_allocation(label, memptr, 1, size); + } else { + /* Failed allocations are interesting as well. */ + memuse_log_allocation(label, NULL, -1, size); + } +#endif + return memptr; +} + +/** + * @brief allocate zeroed memory. The use and results are the same as the + * calloc function. This function should be used for any + * _significant_ allocations and consistently labelled. + * Do not use this function for small or high frequency + * allocations in production code. + * + * @param label a symbolic label for the memory, i.e. "parts". + * @param nmemb number of element to allocate. + * @param size the size of each element in bytes. + * @result pointer to the allocated memory or NULL on failure. + */ +__attribute__((always_inline)) inline void *swift_calloc(const char *label, + size_t nmemb, + size_t size) { + void *memptr = calloc(nmemb, size); +#ifdef SWIFT_MEMUSE_REPORTS + if (memptr != NULL) { + memuse_log_allocation(label, memptr, 1, size * nmemb); + } else { + /* Failed allocations are interesting as well. */ + memuse_log_allocation(label, NULL, -1, size * nmemb); + } +#endif + return memptr; +} + +/** + * @brief free aligned memory. The use and results are the same as the + * free function. The label should match a prior call to swift_memalign + * or swift_malloc. + * + * @param label a symbolic label for the memory, i.e. "parts". + * @param ptr pointer to the allocated memory. + */ +__attribute__((always_inline)) inline void swift_free(const char *label, + void *ptr) { + free(ptr); +#ifdef SWIFT_MEMUSE_REPORTS + memuse_log_allocation(label, ptr, 0, 0); +#endif + return; +} + +#endif /* SWIFT_MEMUSE_H */ diff --git a/src/mesh_gravity.c b/src/mesh_gravity.c index e7005b083c94e20f5218923e443f71464ab383e1..bf0519842eb620e0ff4d8cd0cda05a9395c9722f 100644 --- a/src/mesh_gravity.c +++ b/src/mesh_gravity.c @@ -389,6 +389,8 @@ void pm_mesh_compute_potential(struct pm_mesh* mesh, const struct space* s, (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N * N * (N_half + 1)); if (frho == NULL) error("Error allocating memory for transform of density mesh"); + memuse_log_allocation("fftw_frho", frho, 1, + sizeof(fftw_complex) * N * N * (N_half + 1)); /* Prepare the FFT library */ fftw_plan forward_plan = fftw_plan_dft_r2c_3d( @@ -537,6 +539,7 @@ void pm_mesh_compute_potential(struct pm_mesh* mesh, const struct space* s, /* Clean-up the mess */ fftw_destroy_plan(forward_plan); fftw_destroy_plan(inverse_plan); + memuse_log_allocation("fftw_frho", frho, 0, 0); fftw_free(frho); #else @@ -636,6 +639,9 @@ void pm_mesh_init(struct pm_mesh* mesh, const struct gravity_props* props, mesh->potential = (double*)fftw_malloc(sizeof(double) * N * N * N); if (mesh->potential == NULL) error("Error allocating memory for the long-range gravity mesh."); + memuse_log_allocation("fftw_mesh.potential", mesh->potential, 1, + sizeof(double) * N * N * N); + #else error("No FFTW library found. Cannot compute periodic long-range forces."); #endif @@ -674,7 +680,10 @@ void pm_mesh_clean(struct pm_mesh* mesh) { fftw_cleanup_threads(); #endif - if (mesh->potential) free(mesh->potential); + if (mesh->potential) { + memuse_log_allocation("fftw_mesh.potential", mesh->potential, 0, 0); + free(mesh->potential); + } mesh->potential = 0; } @@ -718,6 +727,8 @@ void pm_mesh_struct_restore(struct pm_mesh* mesh, FILE* stream) { mesh->potential = (double*)fftw_malloc(sizeof(double) * N * N * N); if (mesh->potential == NULL) error("Error allocating memory for the long-range gravity mesh."); + memuse_log_allocation("fftw_mesh.potential", mesh->potential, 1, + sizeof(double) * N * N * N); #else error("No FFTW library found. Cannot compute periodic long-range forces."); #endif diff --git a/src/parallel_io.c b/src/parallel_io.c index b598d944dfe7c90510b036e7f9d85619ea103c59..0160a53c110c8913e42e0d7cd7c8720a9ed3d331 100644 --- a/src/parallel_io.c +++ b/src/parallel_io.c @@ -50,6 +50,7 @@ #include "hydro_properties.h" #include "io_properties.h" #include "kernel_hydro.h" +#include "memuse.h" #include "part.h" #include "part_type.h" #include "star_formation_io.h" @@ -472,7 +473,7 @@ void writeArray_chunk(struct engine* e, hid_t h_data, /* Allocate temporary buffer */ void* temp = NULL; - if (posix_memalign((void**)&temp, IO_BUFFER_ALIGNMENT, + if (swift_memalign("writebuff", (void**)&temp, IO_BUFFER_ALIGNMENT, num_elements * typeSize) != 0) error("Unable to allocate temporary i/o buffer"); @@ -556,7 +557,7 @@ void writeArray_chunk(struct engine* e, hid_t h_data, #endif /* Free and close everything */ - free(temp); + swift_free("writebuff", temp); H5Sclose(h_memspace); H5Sclose(h_filespace); } @@ -815,7 +816,7 @@ void read_ic_parallel(char* fileName, const struct unit_system* internal_units, /* Allocate memory to store SPH particles */ if (with_hydro) { *Ngas = N[0]; - if (posix_memalign((void**)parts, part_align, + if (swift_memalign("parts", (void**)parts, part_align, (*Ngas) * sizeof(struct part)) != 0) error("Error while allocating memory for particles"); bzero(*parts, *Ngas * sizeof(struct part)); @@ -824,7 +825,7 @@ void read_ic_parallel(char* fileName, const struct unit_system* internal_units, /* Allocate memory to store stars particles */ if (with_stars) { *Nstars = N[swift_type_stars]; - if (posix_memalign((void**)sparts, spart_align, + if (swift_memalign("sparts", (void**)sparts, spart_align, *Nstars * sizeof(struct spart)) != 0) error("Error while allocating memory for stars particles"); bzero(*sparts, *Nstars * sizeof(struct spart)); @@ -836,7 +837,7 @@ void read_ic_parallel(char* fileName, const struct unit_system* internal_units, *Ngparts = (with_hydro ? N[swift_type_gas] : 0) + N[swift_type_dark_matter] + (with_stars ? N[swift_type_stars] : 0); - if (posix_memalign((void**)gparts, gpart_align, + if (swift_memalign("gparts", (void**)gparts, gpart_align, *Ngparts * sizeof(struct gpart)) != 0) error("Error while allocating memory for gravity particles"); bzero(*gparts, *Ngparts * sizeof(struct gpart)); @@ -1487,10 +1488,12 @@ void write_output_parallel(struct engine* e, const char* baseName, Nparticles = Ngas_written; /* Allocate temporary arrays */ - if (posix_memalign((void**)&parts_written, part_align, + if (swift_memalign("parts_written", (void**)&parts_written, + part_align, Ngas_written * sizeof(struct part)) != 0) error("Error while allocating temporart memory for parts"); - if (posix_memalign((void**)&xparts_written, xpart_align, + if (swift_memalign("xparts_written", (void**)&xparts_written, + xpart_align, Ngas_written * sizeof(struct xpart)) != 0) error("Error while allocating temporart memory for xparts"); @@ -1535,13 +1538,15 @@ void write_output_parallel(struct engine* e, const char* baseName, Nparticles = Ndm_written; /* Allocate temporary array */ - if (posix_memalign((void**)&gparts_written, gpart_align, + if (swift_memalign("gparts_written", (void**)&gparts_written, + gpart_align, Ndm_written * sizeof(struct gpart)) != 0) error("Error while allocating temporart memory for gparts"); if (with_stf) { - if (posix_memalign( - (void**)&gpart_group_data_written, gpart_align, + if (swift_memalign( + "gpart_group_written", (void**)&gpart_group_data_written, + gpart_align, Ndm_written * sizeof(struct velociraptor_gpart_data)) != 0) error( "Error while allocating temporart memory for gparts STF " @@ -1582,7 +1587,8 @@ void write_output_parallel(struct engine* e, const char* baseName, Nparticles = Nstars_written; /* Allocate temporary arrays */ - if (posix_memalign((void**)&sparts_written, spart_align, + if (swift_memalign("sparts_written", (void**)&sparts_written, + spart_align, Nstars_written * sizeof(struct spart)) != 0) error("Error while allocating temporart memory for sparts"); @@ -1622,11 +1628,12 @@ void write_output_parallel(struct engine* e, const char* baseName, } /* Free temporary array */ - if (parts_written) free(parts_written); - if (xparts_written) free(xparts_written); - if (gparts_written) free(gparts_written); - if (gpart_group_data_written) free(gpart_group_data_written); - if (sparts_written) free(sparts_written); + if (parts_written) swift_free("parts_written", parts_written); + if (xparts_written) swift_free("xparts_written", xparts_written); + if (gparts_written) swift_free("gparts_written", gparts_written); + if (gpart_group_data_written) + swift_free("gpart_group_written", gpart_group_data_written); + if (sparts_written) swift_free("sparts_written", sparts_written); #ifdef IO_SPEED_MEASUREMENT MPI_Barrier(MPI_COMM_WORLD); diff --git a/src/partition.c b/src/partition.c index 606f64e4c2f1c057520ed7ff893db10905f5aa8e..e4cfd9dd142739d9508af133617439db7ab6eef9 100644 --- a/src/partition.c +++ b/src/partition.c @@ -389,7 +389,8 @@ static void split_metis(struct space *s, int nregions, int *celllist) { for (int i = 0; i < s->nr_cells; i++) s->cells_top[i].nodeID = celllist[i]; /* To check or visualise the partition dump all the cells. */ - /*dumpCellRanks("metis_partition", s->cells_top, s->nr_cells);*/ + /*if (engine_rank == 0) dumpCellRanks("metis_partition", s->cells_top, + * s->nr_cells);*/ } #endif diff --git a/src/proxy.c b/src/proxy.c index 4a67b4b3584c43b2df63f17303eba9ec5e742cb0..d9f27ad63cc4c888c14048de83a1576000aacac6 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -41,6 +41,7 @@ #include "cell.h" #include "engine.h" #include "error.h" +#include "memuse.h" #include "space.h" #ifdef WITH_MPI @@ -89,9 +90,9 @@ void proxy_tags_exchange(struct proxy *proxies, int num_proxies, /* Allocate the tags. */ int *tags_in = NULL; int *tags_out = NULL; - if (posix_memalign((void **)&tags_in, SWIFT_CACHE_ALIGNMENT, + if (swift_memalign("tags_in", (void **)&tags_in, SWIFT_CACHE_ALIGNMENT, sizeof(int) * count_in) != 0 || - posix_memalign((void **)&tags_out, SWIFT_CACHE_ALIGNMENT, + swift_memalign("tags_out", (void **)&tags_out, SWIFT_CACHE_ALIGNMENT, sizeof(int) * count_out) != 0) error("Failed to allocate tags buffers."); @@ -167,8 +168,8 @@ void proxy_tags_exchange(struct proxy *proxies, int num_proxies, error("MPI_Waitall on sends failed."); /* Clean up. */ - free(tags_in); - free(tags_out); + swift_free("tags_in", tags_in); + swift_free("tags_out", tags_out); free(reqs_in); free(cids_in); @@ -204,10 +205,12 @@ void proxy_cells_exchange_first(struct proxy *p) { // p->size_pcells_out , p->mynodeID , p->nodeID ); fflush(stdout); /* Allocate and fill the pcell buffer. */ - if (p->pcells_out != NULL) free(p->pcells_out); - if (posix_memalign((void **)&p->pcells_out, SWIFT_STRUCT_ALIGNMENT, + if (p->pcells_out != NULL) swift_free("pcells_out", p->pcells_out); + if (swift_memalign("pcells_out", (void **)&p->pcells_out, + SWIFT_STRUCT_ALIGNMENT, sizeof(struct pcell) * p->size_pcells_out) != 0) error("Failed to allocate pcell_out buffer."); + for (int ind = 0, k = 0; k < p->nr_cells_out; k++) { memcpy(&p->pcells_out[ind], p->cells_out[k]->mpi.pcell, sizeof(struct pcell) * p->cells_out[k]->mpi.pcell_size); @@ -250,8 +253,9 @@ void proxy_cells_exchange_second(struct proxy *p) { #ifdef WITH_MPI /* Re-allocate the pcell_in buffer. */ - if (p->pcells_in != NULL) free(p->pcells_in); - if (posix_memalign((void **)&p->pcells_in, SWIFT_STRUCT_ALIGNMENT, + if (p->pcells_in != NULL) swift_free("pcells_in", p->pcells_in); + if (swift_memalign("pcells_in", (void **)&p->pcells_in, + SWIFT_STRUCT_ALIGNMENT, sizeof(struct pcell) * p->size_pcells_in) != 0) error("Failed to allocate pcell_in buffer."); @@ -397,7 +401,7 @@ void proxy_cells_exchange(struct proxy *proxies, int num_proxies, /* Allocate the pcells. */ struct pcell *pcells = NULL; - if (posix_memalign((void **)&pcells, SWIFT_CACHE_ALIGNMENT, + if (swift_memalign("pcells", (void **)&pcells, SWIFT_CACHE_ALIGNMENT, sizeof(struct pcell) * count_out) != 0) error("Failed to allocate pcell buffer."); @@ -467,7 +471,7 @@ void proxy_cells_exchange(struct proxy *proxies, int num_proxies, /* Clean up. */ free(reqs); - free(pcells); + swift_free("pcells", pcells); #else error("SWIFT was not compiled with MPI support."); @@ -646,30 +650,30 @@ void proxy_parts_exchange_second(struct proxy *p) { do { p->size_parts_in *= proxy_buffgrow; } while (p->nr_parts_in > p->size_parts_in); - free(p->parts_in); - free(p->xparts_in); - if ((p->parts_in = (struct part *)malloc(sizeof(struct part) * - p->size_parts_in)) == NULL || - (p->xparts_in = (struct xpart *)malloc(sizeof(struct xpart) * - p->size_parts_in)) == NULL) + swift_free("parts_in", p->parts_in); + swift_free("xparts_in", p->xparts_in); + if ((p->parts_in = (struct part *)swift_malloc( + "parts_in", sizeof(struct part) * p->size_parts_in)) == NULL || + (p->xparts_in = (struct xpart *)swift_malloc( + "xparts_in", sizeof(struct xpart) * p->size_parts_in)) == NULL) error("Failed to re-allocate parts_in buffers."); } if (p->nr_gparts_in > p->size_gparts_in) { do { p->size_gparts_in *= proxy_buffgrow; } while (p->nr_gparts_in > p->size_gparts_in); - free(p->gparts_in); - if ((p->gparts_in = (struct gpart *)malloc(sizeof(struct gpart) * - p->size_gparts_in)) == NULL) + swift_free("gparts_in", p->gparts_in); + if ((p->gparts_in = (struct gpart *)swift_malloc( + "gparts_in", sizeof(struct gpart) * p->size_gparts_in)) == NULL) error("Failed to re-allocate gparts_in buffers."); } if (p->nr_sparts_in > p->size_sparts_in) { do { p->size_sparts_in *= proxy_buffgrow; } while (p->nr_sparts_in > p->size_sparts_in); - free(p->sparts_in); - if ((p->sparts_in = (struct spart *)malloc(sizeof(struct spart) * - p->size_sparts_in)) == NULL) + swift_free("sparts_in", p->sparts_in); + if ((p->sparts_in = (struct spart *)swift_malloc( + "sparts_in", sizeof(struct spart) * p->size_sparts_in)) == NULL) error("Failed to re-allocate sparts_in buffers."); } @@ -725,15 +729,15 @@ void proxy_parts_load(struct proxy *p, const struct part *parts, } while (p->nr_parts_out + N > p->size_parts_out); struct part *tp = NULL; struct xpart *txp = NULL; - if ((tp = (struct part *)malloc(sizeof(struct part) * p->size_parts_out)) == - NULL || - (txp = (struct xpart *)malloc(sizeof(struct xpart) * - p->size_parts_out)) == NULL) + if ((tp = (struct part *)swift_malloc( + "parts_out", sizeof(struct part) * p->size_parts_out)) == NULL || + (txp = (struct xpart *)swift_malloc( + "xparts_out", sizeof(struct xpart) * p->size_parts_out)) == NULL) error("Failed to re-allocate parts_out buffers."); memcpy(tp, p->parts_out, sizeof(struct part) * p->nr_parts_out); memcpy(txp, p->xparts_out, sizeof(struct xpart) * p->nr_parts_out); - free(p->parts_out); - free(p->xparts_out); + swift_free("parts_out", p->parts_out); + swift_free("xparts_out", p->xparts_out); p->parts_out = tp; p->xparts_out = txp; } @@ -761,11 +765,11 @@ void proxy_gparts_load(struct proxy *p, const struct gpart *gparts, int N) { p->size_gparts_out *= proxy_buffgrow; } while (p->nr_gparts_out + N > p->size_gparts_out); struct gpart *tp; - if ((tp = (struct gpart *)malloc(sizeof(struct gpart) * - p->size_gparts_out)) == NULL) + if ((tp = (struct gpart *)swift_malloc( + "gparts_out", sizeof(struct gpart) * p->size_gparts_out)) == NULL) error("Failed to re-allocate gparts_out buffers."); memcpy(tp, p->gparts_out, sizeof(struct gpart) * p->nr_gparts_out); - free(p->gparts_out); + swift_free("gparts_out", p->gparts_out); p->gparts_out = tp; } @@ -791,11 +795,11 @@ void proxy_sparts_load(struct proxy *p, const struct spart *sparts, int N) { p->size_sparts_out *= proxy_buffgrow; } while (p->nr_sparts_out + N > p->size_sparts_out); struct spart *tp; - if ((tp = (struct spart *)malloc(sizeof(struct spart) * - p->size_sparts_out)) == NULL) + if ((tp = (struct spart *)swift_malloc( + "sparts_out", sizeof(struct spart) * p->size_sparts_out)) == NULL) error("Failed to re-allocate sparts_out buffers."); memcpy(tp, p->sparts_out, sizeof(struct spart) * p->nr_sparts_out); - free(p->sparts_out); + swift_free("sparts_out", p->sparts_out); p->sparts_out = tp; } @@ -844,19 +848,19 @@ void proxy_init(struct proxy *p, int mynodeID, int nodeID) { /* Allocate the part send and receive buffers, if needed. */ if (p->parts_in == NULL) { p->size_parts_in = proxy_buffinit; - if ((p->parts_in = (struct part *)malloc(sizeof(struct part) * - p->size_parts_in)) == NULL || - (p->xparts_in = (struct xpart *)malloc(sizeof(struct xpart) * - p->size_parts_in)) == NULL) + if ((p->parts_in = (struct part *)swift_malloc( + "parts_in", sizeof(struct part) * p->size_parts_in)) == NULL || + (p->xparts_in = (struct xpart *)swift_malloc( + "xparts_in", sizeof(struct xpart) * p->size_parts_in)) == NULL) error("Failed to allocate parts_in buffers."); } p->nr_parts_in = 0; if (p->parts_out == NULL) { p->size_parts_out = proxy_buffinit; - if ((p->parts_out = (struct part *)malloc(sizeof(struct part) * - p->size_parts_out)) == NULL || - (p->xparts_out = (struct xpart *)malloc(sizeof(struct xpart) * - p->size_parts_out)) == NULL) + if ((p->parts_out = (struct part *)swift_malloc( + "parts_out", sizeof(struct part) * p->size_parts_out)) == NULL || + (p->xparts_out = (struct xpart *)swift_malloc( + "xparts_out", sizeof(struct xpart) * p->size_parts_out)) == NULL) error("Failed to allocate parts_out buffers."); } p->nr_parts_out = 0; @@ -864,15 +868,15 @@ void proxy_init(struct proxy *p, int mynodeID, int nodeID) { /* Allocate the gpart send and receive buffers, if needed. */ if (p->gparts_in == NULL) { p->size_gparts_in = proxy_buffinit; - if ((p->gparts_in = (struct gpart *)malloc(sizeof(struct gpart) * - p->size_gparts_in)) == NULL) + if ((p->gparts_in = (struct gpart *)swift_malloc( + "gparts_in", sizeof(struct gpart) * p->size_gparts_in)) == NULL) error("Failed to allocate gparts_in buffers."); } p->nr_gparts_in = 0; if (p->gparts_out == NULL) { p->size_gparts_out = proxy_buffinit; - if ((p->gparts_out = (struct gpart *)malloc(sizeof(struct gpart) * - p->size_gparts_out)) == NULL) + if ((p->gparts_out = (struct gpart *)swift_malloc( + "gparts_out", sizeof(struct gpart) * p->size_gparts_out)) == NULL) error("Failed to allocate gparts_out buffers."); } p->nr_gparts_out = 0; @@ -880,15 +884,15 @@ void proxy_init(struct proxy *p, int mynodeID, int nodeID) { /* Allocate the spart send and receive buffers, if needed. */ if (p->sparts_in == NULL) { p->size_sparts_in = proxy_buffinit; - if ((p->sparts_in = (struct spart *)malloc(sizeof(struct spart) * - p->size_sparts_in)) == NULL) + if ((p->sparts_in = (struct spart *)swift_malloc( + "sparts_in", sizeof(struct spart) * p->size_sparts_in)) == NULL) error("Failed to allocate sparts_in buffers."); } p->nr_sparts_in = 0; if (p->sparts_out == NULL) { p->size_sparts_out = proxy_buffinit; - if ((p->sparts_out = (struct spart *)malloc(sizeof(struct spart) * - p->size_sparts_out)) == NULL) + if ((p->sparts_out = (struct spart *)swift_malloc( + "sparts_out", sizeof(struct spart) * p->size_sparts_out)) == NULL) error("Failed to allocate sparts_out buffers."); } p->nr_sparts_out = 0; diff --git a/src/runner.c b/src/runner.c index d12605aef2ec90edae1a6c06e175b598d54a1eb1..104a2cfbaad108dec9f5194bae9bcf5fd4d85dff 100644 --- a/src/runner.c +++ b/src/runner.c @@ -55,6 +55,7 @@ #include "hydro_properties.h" #include "kick.h" #include "logger.h" +#include "memuse.h" #include "minmax.h" #include "runner_doiact_vec.h" #include "scheduler.h" @@ -149,6 +150,7 @@ void runner_do_stars_ghost(struct runner *r, struct cell *c, int timer) { TIMER_TIC; /* Anything to do here? */ + if (c->stars.count == 0) return; if (!cell_is_active_stars(c, e)) return; /* Recurse? */ @@ -614,7 +616,13 @@ void runner_do_star_formation(struct runner *r, struct cell *c, int timer) { TIMER_TIC; +#ifdef SWIFT_DEBUG_CHECKS + if (c->nodeID != e->nodeID) + error("Running star formation task on a foreign node!"); +#endif + /* Anything to do here? */ + if (c->hydro.count == 0) return; if (!cell_is_active_hydro(c, e)) return; /* Recurse? */ @@ -663,9 +671,13 @@ void runner_do_star_formation(struct runner *r, struct cell *c, int timer) { /* Convert the gas particle to a star particle */ struct spart *sp = cell_convert_part_to_spart(e, c, p, xp); - /* Copy the properties of the gas particle to the star particle */ - star_formation_copy_properties(p, xp, sp, e, sf_props, cosmo, - with_cosmology); + /* Did we get a star? (Or did we run out of spare ones?) */ + if (sp != NULL) { + + /* Copy the properties of the gas particle to the star particle */ + star_formation_copy_properties(p, xp, sp, e, sf_props, cosmo, + with_cosmology); + } } } else { /* Are we not star-forming? */ @@ -681,10 +693,11 @@ void runner_do_star_formation(struct runner *r, struct cell *c, int timer) { /* If we formed any stars, the star sorts are now invalid. We need to * re-compute them. */ - if (with_feedback && (c == c->hydro.super) && + if (with_feedback && (c == c->top) && (current_stars_count != c->stars.count)) { - cell_clear_stars_sort_flags(c, /*is_super=*/1); - runner_do_stars_sort(r, c, 0x1FFF, /*cleanup=*/0, /*timer=*/0); + + cell_clear_stars_sort_flags(c); + runner_do_all_stars_sort(r, c); } if (timer) TIMER_TOC(timer_do_star_formation); @@ -815,6 +828,10 @@ void runner_do_hydro_sort(struct runner *r, struct cell *c, int flags, TIMER_TIC; +#ifdef SWIFT_DEBUG_CHECKS + if (c->hydro.super == NULL) error("Task called above the super level!!!"); +#endif + /* We need to do the local sorts plus whatever was requested further up. */ flags |= c->hydro.do_sort; if (cleanup) { @@ -844,14 +861,8 @@ void runner_do_hydro_sort(struct runner *r, struct cell *c, int flags, if (c->hydro.sorted == 0) c->hydro.ti_sort = r->e->ti_current; #endif - /* start by allocating the entry arrays in the requested dimensions. */ - for (int j = 0; j < 13; j++) { - if ((flags & (1 << j)) && c->hydro.sort[j] == NULL) { - if ((c->hydro.sort[j] = (struct entry *)malloc(sizeof(struct entry) * - (count + 1))) == NULL) - error("Failed to allocate sort memory."); - } - } + /* Allocate memory for sorting. */ + cell_malloc_hydro_sorts(c, flags); /* Does this cell have any progeny? */ if (c->split) { @@ -1039,6 +1050,10 @@ void runner_do_stars_sort(struct runner *r, struct cell *c, int flags, TIMER_TIC; +#ifdef SWIFT_DEBUG_CHECKS + if (c->hydro.super == NULL) error("Task called above the super level!!!"); +#endif + /* We need to do the local sorts plus whatever was requested further up. */ flags |= c->stars.do_sort; if (cleanup) { @@ -1070,13 +1085,7 @@ void runner_do_stars_sort(struct runner *r, struct cell *c, int flags, #endif /* start by allocating the entry arrays in the requested dimensions. */ - for (int j = 0; j < 13; j++) { - if ((flags & (1 << j)) && c->stars.sort[j] == NULL) { - if ((c->stars.sort[j] = (struct entry *)malloc(sizeof(struct entry) * - (count + 1))) == NULL) - error("Failed to allocate sort memory."); - } - } + cell_malloc_stars_sorts(c, flags); /* Does this cell have any progeny? */ if (c->split) { @@ -1236,6 +1245,90 @@ void runner_do_stars_sort(struct runner *r, struct cell *c, int flags, if (clock) TIMER_TOC(timer_do_stars_sort); } +/** + * @brief Recurse into a cell until reaching the super level and call + * the hydro sorting function there. + * + * This function must be called at or above the super level! + * + * This function will sort the particles in all 13 directions. + * + * @param r the #runner. + * @param c the #cell. + */ +void runner_do_all_hydro_sort(struct runner *r, struct cell *c) { + +#ifdef SWIFT_DEBUG_CHECKS + if (c->nodeID != engine_rank) error("Function called on a foreign cell!"); +#endif + + /* Shall we sort at this level? */ + if (c->hydro.super == c) { + + /* Sort everything */ + runner_do_hydro_sort(r, c, 0x1FFF, /*cleanup=*/0, /*timer=*/0); + + } else { + +#ifdef SWIFT_DEBUG_CHECKS + if (c->hydro.super != NULL) error("Function called below the super level!"); +#endif + + /* Ok, then, let's try lower */ + if (c->split) { + for (int k = 0; k < 8; ++k) { + if (c->progeny[k] != NULL) runner_do_all_hydro_sort(r, c->progeny[k]); + } + } else { +#ifdef SWIFT_DEBUG_CHECKS + error("Reached a leaf without encountering a hydro super cell!"); +#endif + } + } +} + +/** + * @brief Recurse into a cell until reaching the super level and call + * the star sorting function there. + * + * This function must be called at or above the super level! + * + * This function will sort the particles in all 13 directions. + * + * @param r the #runner. + * @param c the #cell. + */ +void runner_do_all_stars_sort(struct runner *r, struct cell *c) { + +#ifdef SWIFT_DEBUG_CHECKS + if (c->nodeID != engine_rank) error("Function called on a foreign cell!"); +#endif + + /* Shall we sort at this level? */ + if (c->hydro.super == c) { + + /* Sort everything */ + runner_do_stars_sort(r, c, 0x1FFF, /*cleanup=*/0, /*timer=*/0); + + } else { + +#ifdef SWIFT_DEBUG_CHECKS + if (c->hydro.super != NULL) error("Function called below the super level!"); +#endif + + /* Ok, then, let's try lower */ + if (c->split) { + for (int k = 0; k < 8; ++k) { + if (c->progeny[k] != NULL) runner_do_all_stars_sort(r, c->progeny[k]); + } + } else { +#ifdef SWIFT_DEBUG_CHECKS + error("Reached a leaf without encountering a hydro super cell!"); +#endif + } + } +} + /** * @brief Initialize the multipoles before the gravity calculation. * @@ -1932,6 +2025,7 @@ void runner_do_drift_spart(struct runner *r, struct cell *c, int timer) { if (timer) TIMER_TOC(timer_drift_spart); } + /** * @brief Perform the first half-kick on all the active particles in a cell. * @@ -3374,13 +3468,25 @@ void *runner_main(void *data) { break; #ifdef WITH_MPI case task_type_send: - if (t->subtype == task_subtype_tend) { + if (t->subtype == task_subtype_tend_part) { + free(t->buff); + } + if (t->subtype == task_subtype_tend_gpart) { + free(t->buff); + } + if (t->subtype == task_subtype_tend_spart) { free(t->buff); } break; case task_type_recv: - if (t->subtype == task_subtype_tend) { - cell_unpack_end_step(ci, (struct pcell_step *)t->buff); + if (t->subtype == task_subtype_tend_part) { + cell_unpack_end_step_hydro(ci, (struct pcell_step_hydro *)t->buff); + free(t->buff); + } else if (t->subtype == task_subtype_tend_gpart) { + cell_unpack_end_step_grav(ci, (struct pcell_step_grav *)t->buff); + free(t->buff); + } else if (t->subtype == task_subtype_tend_spart) { + cell_unpack_end_step_stars(ci, (struct pcell_step_stars *)t->buff); free(t->buff); } else if (t->subtype == task_subtype_xv) { runner_do_recv_part(r, ci, 1, 1); diff --git a/src/runner.h b/src/runner.h index b15dd001d928121ed5a60f0e9a601adb706b2191..fa32befc4f01fd5e39e21d5e907ed8f71ccb55e2 100644 --- a/src/runner.h +++ b/src/runner.h @@ -73,6 +73,8 @@ void runner_do_hydro_sort(struct runner *r, struct cell *c, int flag, int cleanup, int clock); void runner_do_stars_sort(struct runner *r, struct cell *c, int flag, int cleanup, int clock); +void runner_do_all_hydro_sort(struct runner *r, struct cell *c); +void runner_do_all_stars_sort(struct runner *r, struct cell *c); void runner_do_drift_part(struct runner *r, struct cell *c, int timer); void runner_do_drift_gpart(struct runner *r, struct cell *c, int timer); void runner_do_drift_spart(struct runner *r, struct cell *c, int timer); diff --git a/src/runner_doiact_stars.h b/src/runner_doiact_stars.h index 1ce0c370f31d860dd36e5af54020c8feb0da6c4f..6b8b12ad966d6ee1271ae8e5d48a0e2b5d9166c4 100644 --- a/src/runner_doiact_stars.h +++ b/src/runner_doiact_stars.h @@ -300,7 +300,7 @@ void DO_SYM_PAIR1_STARS(struct runner *r, struct cell *ci, struct cell *cj, pid >= 0 && sort_i[pid].d + hi_max + dx_max > dj_min; pid--) { /* Get a hold of the ith part in ci. */ - struct spart *restrict spi = &sparts_i[pid]; + struct spart *restrict spi = &sparts_i[sort_i[pid].i]; const float hi = spi->h; /* Skip inactive particles */ @@ -416,7 +416,7 @@ void DO_SYM_PAIR1_STARS(struct runner *r, struct cell *ci, struct cell *cj, pjd++) { /* Get a hold of the jth part in cj. */ - struct spart *spj = &sparts_j[pjd]; + struct spart *spj = &sparts_j[sort_j[pjd].i]; const float hj = spj->h; /* Skip inactive particles */ @@ -1444,7 +1444,7 @@ void DOSUB_SUBSET_STARS(struct runner *r, struct cell *ci, struct spart *sparts, } /* Otherwise, compute the pair directly. */ - else if (cell_is_active_stars(ci, e)) { + else if (cell_is_active_stars(ci, e) && cj->hydro.count > 0) { /* Do any of the cells need to be drifted first? */ if (cell_is_active_stars(ci, e)) { diff --git a/src/scheduler.c b/src/scheduler.c index 729b566e3be7d20bc5a73fc1692b0911885b0efe..80ce572002b06991e1720db36e4f1b2fe90daa62 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -46,6 +46,7 @@ #include "error.h" #include "intrinsics.h" #include "kernel_hydro.h" +#include "memuse.h" #include "queue.h" #include "sort_part.h" #include "space.h" @@ -67,9 +68,10 @@ static void scheduler_extend_unlocks(struct scheduler *s) { /* Allocate the new buffer. */ const int size_unlocks_new = s->size_unlocks * 2; - struct task **unlocks_new = - (struct task **)malloc(sizeof(struct task *) * size_unlocks_new); - int *unlock_ind_new = (int *)malloc(sizeof(int) * size_unlocks_new); + struct task **unlocks_new = (struct task **)swift_malloc( + "unlocks", sizeof(struct task *) * size_unlocks_new); + int *unlock_ind_new = + (int *)swift_malloc("unlock_ind", sizeof(int) * size_unlocks_new); if (unlocks_new == NULL || unlock_ind_new == NULL) error("Failed to re-allocate unlocks."); @@ -80,8 +82,8 @@ static void scheduler_extend_unlocks(struct scheduler *s) { /* Copy the buffers. */ memcpy(unlocks_new, s->unlocks, sizeof(struct task *) * s->size_unlocks); memcpy(unlock_ind_new, s->unlock_ind, sizeof(int) * s->size_unlocks); - free(s->unlocks); - free(s->unlock_ind); + swift_free("unlocks", s->unlocks); + swift_free("unlock_ind", s->unlock_ind); s->unlocks = unlocks_new; s->unlock_ind = unlock_ind_new; @@ -545,6 +547,7 @@ static void scheduler_splittask_hydro(struct task *t, struct scheduler *s) { /* Note this is not very clean as the scheduler should not really access the engine... */ const int with_feedback = (s->space->e->policy & engine_policy_feedback); + const int with_stars = (s->space->e->policy & engine_policy_stars); /* Iterate on this task until we're done with it. */ int redo = 1; @@ -556,7 +559,7 @@ static void scheduler_splittask_hydro(struct task *t, struct scheduler *s) { /* Is this a non-empty self-task? */ const int is_self = (t->type == task_type_self) && (t->ci != NULL) && - ((t->ci->hydro.count > 0) || (with_feedback && t->ci->stars.count > 0)); + ((t->ci->hydro.count > 0) || (with_stars && t->ci->stars.count > 0)); /* Is this a non-empty pair-task? */ const int is_pair = @@ -1321,7 +1324,8 @@ void scheduler_set_unlocks(struct scheduler *s) { /* Store the counts for each task. */ short int *counts; - if ((counts = (short int *)malloc(sizeof(short int) * s->nr_tasks)) == NULL) + if ((counts = (short int *)swift_malloc( + "counts", sizeof(short int) * s->nr_tasks)) == NULL) error("Failed to allocate temporary counts array."); bzero(counts, sizeof(short int) * s->nr_tasks); for (int k = 0; k < s->nr_unlocks; k++) { @@ -1339,7 +1343,8 @@ void scheduler_set_unlocks(struct scheduler *s) { /* Compute the offset for each unlock block. */ int *offsets; - if ((offsets = (int *)malloc(sizeof(int) * (s->nr_tasks + 1))) == NULL) + if ((offsets = (int *)swift_malloc("offsets", + sizeof(int) * (s->nr_tasks + 1))) == NULL) error("Failed to allocate temporary offsets array."); offsets[0] = 0; for (int k = 0; k < s->nr_tasks; k++) { @@ -1353,8 +1358,8 @@ void scheduler_set_unlocks(struct scheduler *s) { /* Create and fill a temporary array with the sorted unlocks. */ struct task **unlocks; - if ((unlocks = (struct task **)malloc(sizeof(struct task *) * - s->size_unlocks)) == NULL) + if ((unlocks = (struct task **)swift_malloc( + "unlocks", sizeof(struct task *) * s->size_unlocks)) == NULL) error("Failed to allocate temporary unlocks array."); for (int k = 0; k < s->nr_unlocks; k++) { const int ind = s->unlock_ind[k]; @@ -1363,7 +1368,7 @@ void scheduler_set_unlocks(struct scheduler *s) { } /* Swap the unlocks. */ - free(s->unlocks); + swift_free("unlocks", s->unlocks); s->unlocks = unlocks; /* Re-set the offsets. */ @@ -1395,8 +1400,8 @@ void scheduler_set_unlocks(struct scheduler *s) { #endif /* Clean up. */ - free(counts); - free(offsets); + swift_free("counts", counts); + swift_free("offsets", offsets); } /** @@ -1478,14 +1483,16 @@ void scheduler_reset(struct scheduler *s, int size) { scheduler_free_tasks(s); /* Allocate the new lists. */ - if (posix_memalign((void **)&s->tasks, task_align, + if (swift_memalign("tasks", (void **)&s->tasks, task_align, size * sizeof(struct task)) != 0) error("Failed to allocate task array."); - if ((s->tasks_ind = (int *)malloc(sizeof(int) * size)) == NULL) + if ((s->tasks_ind = (int *)swift_malloc("tasks_ind", sizeof(int) * size)) == + NULL) error("Failed to allocate task lists."); - if ((s->tid_active = (int *)malloc(sizeof(int) * size)) == NULL) + if ((s->tid_active = + (int *)swift_malloc("tid_active", sizeof(int) * size)) == NULL) error("Failed to allocate aactive task lists."); } @@ -1623,6 +1630,9 @@ void scheduler_reweight(struct scheduler *s, int verbose) { case task_type_drift_gpart: cost = wscale * gcount_i; break; + case task_type_drift_spart: + cost = wscale * scount_i; + break; case task_type_init_grav: cost = wscale * gcount_i; break; @@ -1641,6 +1651,12 @@ void scheduler_reweight(struct scheduler *s, int verbose) { case task_type_end_grav_force: cost = wscale * gcount_i; break; + case task_type_cooling: + cost = wscale * count_i; + break; + case task_type_star_formation: + cost = wscale * (count_i + scount_i); + break; case task_type_kick1: cost = wscale * count_i + wscale * gcount_i; break; @@ -1840,13 +1856,27 @@ void scheduler_enqueue(struct scheduler *s, struct task *t) { break; case task_type_recv: #ifdef WITH_MPI - if (t->subtype == task_subtype_tend) { - t->buff = (struct pcell_step *)malloc(sizeof(struct pcell_step) * - t->ci->mpi.pcell_size); - err = MPI_Irecv(t->buff, - t->ci->mpi.pcell_size * sizeof(struct pcell_step), - MPI_BYTE, t->ci->nodeID, t->flags, - subtaskMPI_comms[t->subtype], &t->req); + if (t->subtype == task_subtype_tend_part) { + t->buff = (struct pcell_step_hydro *)malloc( + sizeof(struct pcell_step_hydro) * t->ci->mpi.pcell_size); + err = MPI_Irecv( + t->buff, t->ci->mpi.pcell_size * sizeof(struct pcell_step_hydro), + MPI_BYTE, t->ci->nodeID, t->flags, subtaskMPI_comms[t->subtype], + &t->req); + } else if (t->subtype == task_subtype_tend_gpart) { + t->buff = (struct pcell_step_grav *)malloc( + sizeof(struct pcell_step_grav) * t->ci->mpi.pcell_size); + err = MPI_Irecv( + t->buff, t->ci->mpi.pcell_size * sizeof(struct pcell_step_grav), + MPI_BYTE, t->ci->nodeID, t->flags, subtaskMPI_comms[t->subtype], + &t->req); + } else if (t->subtype == task_subtype_tend_spart) { + t->buff = (struct pcell_step_stars *)malloc( + sizeof(struct pcell_step_stars) * t->ci->mpi.pcell_size); + err = MPI_Irecv( + t->buff, t->ci->mpi.pcell_size * sizeof(struct pcell_step_stars), + MPI_BYTE, t->ci->nodeID, t->flags, subtaskMPI_comms[t->subtype], + &t->req); } else if (t->subtype == task_subtype_xv || t->subtype == task_subtype_rho || t->subtype == task_subtype_gradient) { @@ -1880,21 +1910,61 @@ void scheduler_enqueue(struct scheduler *s, struct task *t) { break; case task_type_send: #ifdef WITH_MPI - if (t->subtype == task_subtype_tend) { - t->buff = (struct pcell_step *)malloc(sizeof(struct pcell_step) * - t->ci->mpi.pcell_size); - cell_pack_end_step(t->ci, (struct pcell_step *)t->buff); - if ((t->ci->mpi.pcell_size * sizeof(struct pcell_step)) > - s->mpi_message_limit) - err = MPI_Isend(t->buff, - t->ci->mpi.pcell_size * sizeof(struct pcell_step), - MPI_BYTE, t->cj->nodeID, t->flags, - subtaskMPI_comms[t->subtype], &t->req); - else - err = MPI_Issend(t->buff, - t->ci->mpi.pcell_size * sizeof(struct pcell_step), - MPI_BYTE, t->cj->nodeID, t->flags, - subtaskMPI_comms[t->subtype], &t->req); + if (t->subtype == task_subtype_tend_part) { + t->buff = (struct pcell_step_hydro *)malloc( + sizeof(struct pcell_step_hydro) * t->ci->mpi.pcell_size); + cell_pack_end_step_hydro(t->ci, (struct pcell_step_hydro *)t->buff); + + if ((t->ci->mpi.pcell_size * sizeof(struct pcell_step_hydro)) > + s->mpi_message_limit) { + err = MPI_Isend( + t->buff, + t->ci->mpi.pcell_size * sizeof(struct pcell_step_hydro), + MPI_BYTE, t->cj->nodeID, t->flags, subtaskMPI_comms[t->subtype], + &t->req); + } else { + err = MPI_Issend( + t->buff, + t->ci->mpi.pcell_size * sizeof(struct pcell_step_hydro), + MPI_BYTE, t->cj->nodeID, t->flags, subtaskMPI_comms[t->subtype], + &t->req); + } + } else if (t->subtype == task_subtype_tend_gpart) { + t->buff = (struct pcell_step_grav *)malloc( + sizeof(struct pcell_step_grav) * t->ci->mpi.pcell_size); + cell_pack_end_step_grav(t->ci, (struct pcell_step_grav *)t->buff); + + if ((t->ci->mpi.pcell_size * sizeof(struct pcell_step_grav)) > + s->mpi_message_limit) { + err = MPI_Isend( + t->buff, t->ci->mpi.pcell_size * sizeof(struct pcell_step_grav), + MPI_BYTE, t->cj->nodeID, t->flags, subtaskMPI_comms[t->subtype], + &t->req); + } else { + err = MPI_Issend( + t->buff, t->ci->mpi.pcell_size * sizeof(struct pcell_step_grav), + MPI_BYTE, t->cj->nodeID, t->flags, subtaskMPI_comms[t->subtype], + &t->req); + } + } else if (t->subtype == task_subtype_tend_spart) { + t->buff = (struct pcell_step_stars *)malloc( + sizeof(struct pcell_step_stars) * t->ci->mpi.pcell_size); + cell_pack_end_step_stars(t->ci, (struct pcell_step_stars *)t->buff); + + if ((t->ci->mpi.pcell_size * sizeof(struct pcell_step_stars)) > + s->mpi_message_limit) { + err = MPI_Isend( + t->buff, + t->ci->mpi.pcell_size * sizeof(struct pcell_step_stars), + MPI_BYTE, t->cj->nodeID, t->flags, subtaskMPI_comms[t->subtype], + &t->req); + } else { + err = MPI_Issend( + t->buff, + t->ci->mpi.pcell_size * sizeof(struct pcell_step_stars), + MPI_BYTE, t->cj->nodeID, t->flags, subtaskMPI_comms[t->subtype], + &t->req); + } } else if (t->subtype == task_subtype_xv || t->subtype == task_subtype_rho || t->subtype == task_subtype_gradient) { @@ -2147,7 +2217,7 @@ void scheduler_init(struct scheduler *s, struct space *space, int nr_tasks, lock_init(&s->lock); /* Allocate the queues. */ - if (posix_memalign((void **)&s->queues, queue_struct_align, + if (swift_memalign("queues", (void **)&s->queues, queue_struct_align, sizeof(struct queue) * nr_queues) != 0) error("Failed to allocate queues."); @@ -2160,10 +2230,11 @@ void scheduler_init(struct scheduler *s, struct space *space, int nr_tasks, error("Failed to initialize sleep barrier."); /* Init the unlocks. */ - if ((s->unlocks = (struct task **)malloc( - sizeof(struct task *) * scheduler_init_nr_unlocks)) == NULL || - (s->unlock_ind = - (int *)malloc(sizeof(int) * scheduler_init_nr_unlocks)) == NULL) + if ((s->unlocks = (struct task **)swift_malloc( + "unlocks", sizeof(struct task *) * scheduler_init_nr_unlocks)) == + NULL || + (s->unlock_ind = (int *)swift_malloc( + "unlock_ind", sizeof(int) * scheduler_init_nr_unlocks)) == NULL) error("Failed to allocate unlocks."); s->nr_unlocks = 0; s->size_unlocks = scheduler_init_nr_unlocks; @@ -2214,10 +2285,10 @@ void scheduler_print_tasks(const struct scheduler *s, const char *fileName) { void scheduler_clean(struct scheduler *s) { scheduler_free_tasks(s); - free(s->unlocks); - free(s->unlock_ind); + swift_free("unlocks", s->unlocks); + swift_free("unlock_ind", s->unlock_ind); for (int i = 0; i < s->nr_queues; ++i) queue_clean(&s->queues[i]); - free(s->queues); + swift_free("queues", s->queues); } /** @@ -2226,15 +2297,15 @@ void scheduler_clean(struct scheduler *s) { void scheduler_free_tasks(struct scheduler *s) { if (s->tasks != NULL) { - free(s->tasks); + swift_free("tasks", s->tasks); s->tasks = NULL; } if (s->tasks_ind != NULL) { - free(s->tasks_ind); + swift_free("tasks_ind", s->tasks_ind); s->tasks_ind = NULL; } if (s->tid_active != NULL) { - free(s->tid_active); + swift_free("tid_active", s->tid_active); s->tid_active = NULL; } s->size = 0; diff --git a/src/serial_io.c b/src/serial_io.c index b55f4780814fe45544a5680e95e67f55194fc5e8..55a468411b7b9f84d4e05b8f388a5de7873f7f59 100644 --- a/src/serial_io.c +++ b/src/serial_io.c @@ -50,6 +50,7 @@ #include "hydro_properties.h" #include "io_properties.h" #include "kernel_hydro.h" +#include "memuse.h" #include "part.h" #include "part_type.h" #include "star_formation_io.h" @@ -364,7 +365,7 @@ void writeArray(const struct engine* e, hid_t grp, char* fileName, /* Allocate temporary buffer */ void* temp = NULL; - if (posix_memalign((void**)&temp, IO_BUFFER_ALIGNMENT, + if (swift_memalign("writebuff", (void**)&temp, IO_BUFFER_ALIGNMENT, num_elements * typeSize) != 0) error("Unable to allocate temporary i/o buffer"); @@ -415,7 +416,7 @@ void writeArray(const struct engine* e, hid_t grp, char* fileName, if (h_err < 0) error("Error while writing data array '%s'.", props.name); /* Free and close everything */ - free(temp); + swift_free("writebuff", temp); H5Dclose(h_data); H5Sclose(h_memspace); H5Sclose(h_filespace); @@ -614,7 +615,7 @@ void read_ic_serial(char* fileName, const struct unit_system* internal_units, /* Allocate memory to store SPH particles */ if (with_hydro) { *Ngas = N[0]; - if (posix_memalign((void**)parts, part_align, + if (swift_memalign("parts", (void**)parts, part_align, *Ngas * sizeof(struct part)) != 0) error("Error while allocating memory for SPH particles"); bzero(*parts, *Ngas * sizeof(struct part)); @@ -623,7 +624,7 @@ void read_ic_serial(char* fileName, const struct unit_system* internal_units, /* Allocate memory to store stars particles */ if (with_stars) { *Nstars = N[swift_type_stars]; - if (posix_memalign((void**)sparts, spart_align, + if (swift_memalign("sparts", (void**)sparts, spart_align, *Nstars * sizeof(struct spart)) != 0) error("Error while allocating memory for stars particles"); bzero(*sparts, *Nstars * sizeof(struct spart)); @@ -635,7 +636,7 @@ void read_ic_serial(char* fileName, const struct unit_system* internal_units, *Ngparts = (with_hydro ? N[swift_type_gas] : 0) + N[swift_type_dark_matter] + (with_stars ? N[swift_type_stars] : 0); - if (posix_memalign((void**)gparts, gpart_align, + if (swift_memalign("gparts", (void**)gparts, gpart_align, *Ngparts * sizeof(struct gpart)) != 0) error("Error while allocating memory for gravity particles"); bzero(*gparts, *Ngparts * sizeof(struct gpart)); @@ -1132,10 +1133,12 @@ void write_output_serial(struct engine* e, const char* baseName, Nparticles = Ngas_written; /* Allocate temporary arrays */ - if (posix_memalign((void**)&parts_written, part_align, + if (swift_memalign("parts_written", (void**)&parts_written, + part_align, Ngas_written * sizeof(struct part)) != 0) error("Error while allocating temporart memory for parts"); - if (posix_memalign((void**)&xparts_written, xpart_align, + if (swift_memalign("xparts_written", (void**)&xparts_written, + xpart_align, Ngas_written * sizeof(struct xpart)) != 0) error("Error while allocating temporart memory for xparts"); @@ -1181,12 +1184,14 @@ void write_output_serial(struct engine* e, const char* baseName, Nparticles = Ndm_written; /* Allocate temporary array */ - if (posix_memalign((void**)&gparts_written, gpart_align, + if (swift_memalign("gparts_written", (void**)&gparts_written, + gpart_align, Ndm_written * sizeof(struct gpart)) != 0) error("Error while allocating temporart memory for gparts"); if (with_stf) { - if (posix_memalign( + if (swift_memalign( + "gpart_group_written", (void**)&gpart_group_data_written, gpart_align, Ndm_written * sizeof(struct velociraptor_gpart_data)) != 0) @@ -1229,7 +1234,8 @@ void write_output_serial(struct engine* e, const char* baseName, Nparticles = Nstars_written; /* Allocate temporary arrays */ - if (posix_memalign((void**)&sparts_written, spart_align, + if (swift_memalign("sparts_written", (void**)&sparts_written, + spart_align, Nstars_written * sizeof(struct spart)) != 0) error("Error while allocating temporart memory for sparts"); @@ -1270,11 +1276,12 @@ void write_output_serial(struct engine* e, const char* baseName, } /* Free temporary array */ - if (parts_written) free(parts_written); - if (xparts_written) free(xparts_written); - if (gparts_written) free(gparts_written); - if (gpart_group_data_written) free(gpart_group_data_written); - if (sparts_written) free(sparts_written); + if (parts_written) swift_free("parts_written", parts_written); + if (xparts_written) swift_free("xparts_written", xparts_written); + if (gparts_written) swift_free("gparts_written", gparts_written); + if (gpart_group_data_written) + swift_free("gpart_group_written", gpart_group_data_written); + if (sparts_written) swift_free("sparts_written", sparts_written); /* Close particle group */ H5Gclose(h_grp); diff --git a/src/single_io.c b/src/single_io.c index 4b23310ee02f3b485eff1a0358de850f497a3478..917dd880495300cea8f5d16df85513c6386b53f2 100644 --- a/src/single_io.c +++ b/src/single_io.c @@ -49,6 +49,7 @@ #include "hydro_properties.h" #include "io_properties.h" #include "kernel_hydro.h" +#include "memuse.h" #include "part.h" #include "part_type.h" #include "star_formation_io.h" @@ -240,7 +241,7 @@ void writeArray(const struct engine* e, hid_t grp, char* fileName, /* Allocate temporary buffer */ void* temp = NULL; - if (posix_memalign((void**)&temp, IO_BUFFER_ALIGNMENT, + if (swift_memalign("writebuff", (void**)&temp, IO_BUFFER_ALIGNMENT, num_elements * typeSize) != 0) error("Unable to allocate temporary i/o buffer"); @@ -332,7 +333,7 @@ void writeArray(const struct engine* e, hid_t grp, char* fileName, io_write_attribute_s(h_data, "Conversion factor", buffer); /* Free and close everything */ - free(temp); + swift_free("writebuff", temp); H5Pclose(h_prop); H5Dclose(h_data); H5Sclose(h_space); @@ -502,7 +503,7 @@ void read_ic_single(const char* fileName, /* Allocate memory to store SPH particles */ if (with_hydro) { *Ngas = N[swift_type_gas]; - if (posix_memalign((void**)parts, part_align, + if (swift_memalign("parts", (void**)parts, part_align, *Ngas * sizeof(struct part)) != 0) error("Error while allocating memory for SPH particles"); bzero(*parts, *Ngas * sizeof(struct part)); @@ -511,7 +512,7 @@ void read_ic_single(const char* fileName, /* Allocate memory to store star particles */ if (with_stars) { *Nstars = N[swift_type_stars]; - if (posix_memalign((void**)sparts, spart_align, + if (swift_memalign("sparts", (void**)sparts, spart_align, *Nstars * sizeof(struct spart)) != 0) error("Error while allocating memory for stars particles"); bzero(*sparts, *Nstars * sizeof(struct spart)); @@ -523,7 +524,7 @@ void read_ic_single(const char* fileName, *Ngparts = (with_hydro ? N[swift_type_gas] : 0) + N[swift_type_dark_matter] + (with_stars ? N[swift_type_stars] : 0); - if (posix_memalign((void**)gparts, gpart_align, + if (swift_memalign("gparts", (void**)gparts, gpart_align, *Ngparts * sizeof(struct gpart)) != 0) error("Error while allocating memory for gravity particles"); bzero(*gparts, *Ngparts * sizeof(struct gpart)); @@ -935,10 +936,12 @@ void write_output_single(struct engine* e, const char* baseName, N = Ngas_written; /* Allocate temporary arrays */ - if (posix_memalign((void**)&parts_written, part_align, + if (swift_memalign("parts_written", (void**)&parts_written, + part_align, Ngas_written * sizeof(struct part)) != 0) error("Error while allocating temporart memory for parts"); - if (posix_memalign((void**)&xparts_written, xpart_align, + if (swift_memalign("xparts_written", (void**)&xparts_written, + xpart_align, Ngas_written * sizeof(struct xpart)) != 0) error("Error while allocating temporart memory for xparts"); @@ -983,13 +986,15 @@ void write_output_single(struct engine* e, const char* baseName, N = Ndm_written; /* Allocate temporary array */ - if (posix_memalign((void**)&gparts_written, gpart_align, + if (swift_memalign("gparts_written", (void**)&gparts_written, + gpart_align, Ndm_written * sizeof(struct gpart)) != 0) error("Error while allocating temporart memory for gparts"); if (with_stf) { - if (posix_memalign( - (void**)&gpart_group_data_written, gpart_align, + if (swift_memalign( + "gpart_group_written", (void**)&gpart_group_data_written, + gpart_align, Ndm_written * sizeof(struct velociraptor_gpart_data)) != 0) error( "Error while allocating temporart memory for gparts STF " @@ -1028,7 +1033,8 @@ void write_output_single(struct engine* e, const char* baseName, N = Nstars_written; /* Allocate temporary arrays */ - if (posix_memalign((void**)&sparts_written, spart_align, + if (swift_memalign("sparts_written", (void**)&sparts_written, + spart_align, Nstars_written * sizeof(struct spart)) != 0) error("Error while allocating temporart memory for sparts"); @@ -1068,11 +1074,12 @@ void write_output_single(struct engine* e, const char* baseName, } /* Free temporary arrays */ - if (parts_written) free(parts_written); - if (xparts_written) free(xparts_written); - if (gparts_written) free(gparts_written); - if (gpart_group_data_written) free(gpart_group_data_written); - if (sparts_written) free(sparts_written); + if (parts_written) swift_free("parts_written", parts_written); + if (xparts_written) swift_free("xparts_written", xparts_written); + if (gparts_written) swift_free("gparts_written", gparts_written); + if (gpart_group_data_written) + swift_free("gpart_group_written", gpart_group_data_written); + if (sparts_written) swift_free("sparts_written", sparts_written); /* Close particle group */ H5Gclose(h_grp); diff --git a/src/space.c b/src/space.c index 9161e578d0afca018caf28e4d5118ccbce08cd01..a2a08be232bb8b8a439e23efb6d143d0c069771b 100644 --- a/src/space.c +++ b/src/space.c @@ -52,6 +52,7 @@ #include "kernel_hydro.h" #include "lock.h" #include "memswap.h" +#include "memuse.h" #include "minmax.h" #include "multipole.h" #include "restart.h" @@ -235,6 +236,7 @@ void space_rebuild_recycle_mapper(void *map_data, int num_elements, c->grav.down = NULL; c->grav.mesh = NULL; c->grav.end_force = NULL; + c->top = c; c->super = c; c->hydro.super = c; c->grav.super = c; @@ -260,33 +262,30 @@ void space_rebuild_recycle_mapper(void *map_data, int num_elements, #endif if (s->with_self_gravity) bzero(c->grav.multipole, sizeof(struct gravity_tensors)); - for (int i = 0; i < 13; i++) { - if (c->hydro.sort[i] != NULL) { - free(c->hydro.sort[i]); - c->hydro.sort[i] = NULL; - } - if (c->stars.sort[i] != NULL) { - free(c->stars.sort[i]); - c->stars.sort[i] = NULL; - } - } + + cell_free_hydro_sorts(c); + cell_free_stars_sorts(c); #if WITH_MPI c->mpi.tag = -1; c->mpi.hydro.recv_xv = NULL; c->mpi.hydro.recv_rho = NULL; c->mpi.hydro.recv_gradient = NULL; + c->mpi.hydro.recv_ti = NULL; c->mpi.grav.recv = NULL; + c->mpi.grav.recv_ti = NULL; c->mpi.stars.recv = NULL; - c->mpi.recv_ti = NULL; + c->mpi.stars.recv_ti = NULL; c->mpi.limiter.recv = NULL; c->mpi.hydro.send_xv = NULL; c->mpi.hydro.send_rho = NULL; c->mpi.hydro.send_gradient = NULL; + c->mpi.hydro.send_ti = NULL; c->mpi.grav.send = NULL; + c->mpi.grav.send_ti = NULL; c->mpi.stars.send = NULL; - c->mpi.send_ti = NULL; + c->mpi.stars.send_ti = NULL; c->mpi.limiter.send = NULL; #endif } @@ -294,6 +293,8 @@ void space_rebuild_recycle_mapper(void *map_data, int num_elements, /** * @brief Free up any allocated cells. + * + * @param s The #space. */ void space_free_cells(struct space *s) { @@ -308,6 +309,32 @@ void space_free_cells(struct space *s) { clocks_getunit()); } +/** + * @brief Free any memory in use for foreign particles. + * + * @param s The #space. + */ +void space_free_foreign_parts(struct space *s) { + +#ifdef WITH_MPI + if (s->parts_foreign != NULL) { + swift_free("parts_foreign", s->parts_foreign); + s->size_parts_foreign = 0; + s->parts_foreign = NULL; + } + if (s->gparts_foreign != NULL) { + swift_free("gparts_foreign", s->gparts_foreign); + s->size_gparts_foreign = 0; + s->gparts_foreign = NULL; + } + if (s->sparts_foreign != NULL) { + swift_free("sparts_foreign", s->sparts_foreign); + s->size_sparts_foreign = 0; + s->sparts_foreign = NULL; + } +#endif +} + /** * @brief Re-build the top-level cell grid. * @@ -415,7 +442,8 @@ void space_regrid(struct space *s, int verbose) { oldwidth[1] = s->width[1]; oldwidth[2] = s->width[2]; - if ((oldnodeIDs = (int *)malloc(sizeof(int) * s->nr_cells)) == NULL) + if ((oldnodeIDs = + (int *)swift_malloc("nodeIDs", sizeof(int) * s->nr_cells)) == NULL) error("Failed to allocate temporary nodeIDs."); int cid = 0; @@ -448,12 +476,13 @@ void space_regrid(struct space *s, int verbose) { /* Free the old cells, if they were allocated. */ if (s->cells_top != NULL) { space_free_cells(s); - free(s->local_cells_with_tasks_top); - free(s->local_cells_top); - free(s->cells_with_particles_top); - free(s->local_cells_with_particles_top); - free(s->cells_top); - free(s->multipoles_top); + swift_free("local_cells_with_tasks_top", s->local_cells_with_tasks_top); + swift_free("local_cells_top", s->local_cells_top); + swift_free("cells_with_particles_top", s->cells_with_particles_top); + swift_free("local_cells_with_particles_top", + s->local_cells_with_particles_top); + swift_free("cells_top", s->cells_top); + swift_free("multipoles_top", s->multipoles_top); } /* Also free the task arrays, these will be regenerated and we can use the @@ -470,39 +499,44 @@ void space_regrid(struct space *s, int verbose) { /* Allocate the highest level of cells. */ s->tot_cells = s->nr_cells = cdim[0] * cdim[1] * cdim[2]; - if (posix_memalign((void **)&s->cells_top, cell_align, + + if (swift_memalign("cells_top", (void **)&s->cells_top, cell_align, s->nr_cells * sizeof(struct cell)) != 0) error("Failed to allocate top-level cells."); bzero(s->cells_top, s->nr_cells * sizeof(struct cell)); /* Allocate the multipoles for the top-level cells. */ if (s->with_self_gravity) { - if (posix_memalign((void **)&s->multipoles_top, multipole_align, + if (swift_memalign("multipoles_top", (void **)&s->multipoles_top, + multipole_align, s->nr_cells * sizeof(struct gravity_tensors)) != 0) error("Failed to allocate top-level multipoles."); bzero(s->multipoles_top, s->nr_cells * sizeof(struct gravity_tensors)); } /* Allocate the indices of local cells */ - if (posix_memalign((void **)&s->local_cells_top, SWIFT_STRUCT_ALIGNMENT, - s->nr_cells * sizeof(int)) != 0) + if (swift_memalign("local_cells_top", (void **)&s->local_cells_top, + SWIFT_STRUCT_ALIGNMENT, s->nr_cells * sizeof(int)) != 0) error("Failed to allocate indices of local top-level cells."); bzero(s->local_cells_top, s->nr_cells * sizeof(int)); /* Allocate the indices of local cells with tasks */ - if (posix_memalign((void **)&s->local_cells_with_tasks_top, + if (swift_memalign("local_cells_with_tasks_top", + (void **)&s->local_cells_with_tasks_top, SWIFT_STRUCT_ALIGNMENT, s->nr_cells * sizeof(int)) != 0) error("Failed to allocate indices of local top-level cells with tasks."); bzero(s->local_cells_with_tasks_top, s->nr_cells * sizeof(int)); /* Allocate the indices of cells with particles */ - if (posix_memalign((void **)&s->cells_with_particles_top, + if (swift_memalign("cells_with_particles_top", + (void **)&s->cells_with_particles_top, SWIFT_STRUCT_ALIGNMENT, s->nr_cells * sizeof(int)) != 0) error("Failed to allocate indices of top-level cells with particles."); bzero(s->cells_with_particles_top, s->nr_cells * sizeof(int)); /* Allocate the indices of local cells with particles */ - if (posix_memalign((void **)&s->local_cells_with_particles_top, + if (swift_memalign("local_cells_with_particles_top", + (void **)&s->local_cells_with_particles_top, SWIFT_STRUCT_ALIGNMENT, s->nr_cells * sizeof(int)) != 0) error( "Failed to allocate indices of local top-level cells with " @@ -519,6 +553,8 @@ void space_regrid(struct space *s, int verbose) { error("Failed to init spinlock for multipoles."); if (lock_init(&s->cells_top[k].stars.lock) != 0) error("Failed to init spinlock for stars."); + if (lock_init(&s->cells_top[k].stars.star_formation_lock) != 0) + error("Failed to init spinlock for star formation."); } /* Set the cell location and sizes. */ @@ -539,6 +575,7 @@ void space_regrid(struct space *s, int verbose) { c->hydro.count = 0; c->grav.count = 0; c->stars.count = 0; + c->top = c; c->super = c; c->hydro.super = c; c->grav.super = c; @@ -602,7 +639,7 @@ void space_regrid(struct space *s, int verbose) { engine_makeproxies(s->e); /* Finished with these. */ - free(oldnodeIDs); + swift_free("nodeIDs", oldnodeIDs); } else if (no_regrid && s->e != NULL) { /* If we have created the top-levels cells and not done an initial @@ -678,14 +715,23 @@ void space_allocate_extras(struct space *s, int verbose) { size_t size_gparts = s->size_gparts; size_t size_sparts = s->size_sparts; - int local_cells = 0; - for (int i = 0; i < s->nr_cells; ++i) - if (s->cells_top[i].nodeID == local_nodeID) local_cells++; + int *local_cells = (int *)malloc(sizeof(int) * s->nr_cells); + if (local_cells == NULL) + error("Failed to allocate list of local top-level cells"); + + /* List the local cells */ + int nr_local_cells = 0; + for (int i = 0; i < s->nr_cells; ++i) { + if (s->cells_top[i].nodeID == local_nodeID) { + local_cells[nr_local_cells] = i; + ++nr_local_cells; + } + } /* Number of extra particles we want for each type */ - const size_t expected_num_extra_parts = local_cells * space_extra_parts; - const size_t expected_num_extra_gparts = local_cells * space_extra_gparts; - const size_t expected_num_extra_sparts = local_cells * space_extra_sparts; + const size_t expected_num_extra_parts = nr_local_cells * space_extra_parts; + const size_t expected_num_extra_gparts = nr_local_cells * space_extra_gparts; + const size_t expected_num_extra_sparts = nr_local_cells * space_extra_sparts; if (verbose) { message("Currently have %zd/%zd/%zd real particles.", nr_actual_parts, @@ -722,12 +768,12 @@ void space_allocate_extras(struct space *s, int verbose) { /* Create more space for parts */ struct gpart *gparts_new = NULL; - if (posix_memalign((void **)&gparts_new, gpart_align, + if (swift_memalign("gparts", (void **)&gparts_new, gpart_align, sizeof(struct gpart) * size_gparts) != 0) error("Failed to allocate new gpart data"); const ptrdiff_t delta = gparts_new - s->gparts; memcpy(gparts_new, s->gparts, sizeof(struct gpart) * s->size_gparts); - free(s->gparts); + swift_free("gparts", s->gparts); s->gparts = gparts_new; /* Update the counter */ @@ -753,11 +799,10 @@ void space_allocate_extras(struct space *s, int verbose) { s->gparts[i].id_or_neg_offset = -1; } - /* Put the spare particles in their correct cell */ -#ifdef WITH_MPI - error("Need to do this correctly over MPI for only the local cells."); -#endif - int count_in_cell = 0, current_cell = 0; + /* Put the spare particles in their correct cell */ + int local_cell_id = 0; + int current_cell = local_cells[local_cell_id]; + int count_in_cell = 0; size_t count_extra_gparts = 0; for (size_t i = 0; i < nr_actual_gparts + expected_num_extra_gparts; ++i) { @@ -779,7 +824,11 @@ void space_allocate_extras(struct space *s, int verbose) { /* Once we have reached the number of extra gpart per cell, we move to the * next */ if (count_in_cell == space_extra_gparts) { - ++current_cell; + ++local_cell_id; + + if (local_cell_id == nr_local_cells) break; + + current_cell = local_cells[local_cell_id]; count_in_cell = 0; } } @@ -813,20 +862,20 @@ void space_allocate_extras(struct space *s, int verbose) { /* Create more space for parts */ struct part *parts_new = NULL; - if (posix_memalign((void **)&parts_new, part_align, + if (swift_memalign("parts", (void **)&parts_new, part_align, sizeof(struct part) * size_parts) != 0) error("Failed to allocate new part data"); memcpy(parts_new, s->parts, sizeof(struct part) * s->size_parts); - free(s->parts); + swift_free("parts", s->parts); s->parts = parts_new; /* Same for xparts */ struct xpart *xparts_new = NULL; - if (posix_memalign((void **)&xparts_new, xpart_align, + if (swift_memalign("xparts", (void **)&xparts_new, xpart_align, sizeof(struct xpart) * size_parts) != 0) error("Failed to allocate new xpart data"); memcpy(xparts_new, s->xparts, sizeof(struct xpart) * s->size_parts); - free(s->xparts); + swift_free("xparts", s->xparts); s->xparts = xparts_new; /* Update the counter */ @@ -842,11 +891,10 @@ void space_allocate_extras(struct space *s, int verbose) { s->parts[i].id = -1; } - /* Put the spare particles in their correct cell */ -#ifdef WITH_MPI - error("Need to do this correctly over MPI for only the local cells."); -#endif - int count_in_cell = 0, current_cell = 0; + /* Put the spare particles in their correct cell */ + int local_cell_id = 0; + int current_cell = local_cells[local_cell_id]; + int count_in_cell = 0; size_t count_extra_parts = 0; for (size_t i = 0; i < nr_actual_parts + expected_num_extra_parts; ++i) { @@ -868,7 +916,11 @@ void space_allocate_extras(struct space *s, int verbose) { /* Once we have reached the number of extra part per cell, we move to the * next */ if (count_in_cell == space_extra_parts) { - ++current_cell; + ++local_cell_id; + + if (local_cell_id == nr_local_cells) break; + + current_cell = local_cells[local_cell_id]; count_in_cell = 0; } } @@ -902,11 +954,11 @@ void space_allocate_extras(struct space *s, int verbose) { /* Create more space for parts */ struct spart *sparts_new = NULL; - if (posix_memalign((void **)&sparts_new, spart_align, + if (swift_memalign("sparts", (void **)&sparts_new, spart_align, sizeof(struct spart) * size_sparts) != 0) error("Failed to allocate new spart data"); memcpy(sparts_new, s->sparts, sizeof(struct spart) * s->size_sparts); - free(s->sparts); + swift_free("sparts", s->sparts); s->sparts = sparts_new; /* Update the counter */ @@ -921,11 +973,10 @@ void space_allocate_extras(struct space *s, int verbose) { s->sparts[i].id = -42; } - /* Put the spare particles in their correct cell */ -#ifdef WITH_MPI - error("Need to do this correctly over MPI for only the local cells."); -#endif - int count_in_cell = 0, current_cell = 0; + /* Put the spare particles in their correct cell */ + int local_cell_id = 0; + int current_cell = local_cells[local_cell_id]; + int count_in_cell = 0; size_t count_extra_sparts = 0; for (size_t i = 0; i < nr_actual_sparts + expected_num_extra_sparts; ++i) { @@ -947,7 +998,11 @@ void space_allocate_extras(struct space *s, int verbose) { /* Once we have reached the number of extra spart per cell, we move to the * next */ if (count_in_cell == space_extra_sparts) { - ++current_cell; + ++local_cell_id; + + if (local_cell_id == nr_local_cells) break; + + current_cell = local_cells[local_cell_id]; count_in_cell = 0; } } @@ -969,6 +1024,9 @@ void space_allocate_extras(struct space *s, int verbose) { part_verify_links(s->parts, s->gparts, s->sparts, nr_parts, nr_gparts, nr_sparts, verbose); #endif + + /* Free the list of local cells */ + free(local_cells); } /** @@ -986,6 +1044,9 @@ void space_rebuild(struct space *s, int repartitioned, int verbose) { #ifdef SWIFT_DEBUG_CHECKS if (s->e->nodeID == 0 || verbose) message("(re)building space"); fflush(stdout); + + /* Reset the cell counter */ + last_cell_id = 1; #endif /* Re-grid if necessary, or just re-set the cell data. */ @@ -1026,16 +1087,19 @@ void space_rebuild(struct space *s, int repartitioned, int verbose) { /* Allocate arrays to store the indices of the cells where particles belong. We allocate extra space to allow for particles we may receive from other nodes */ - int *h_index = (int *)malloc(sizeof(int) * h_index_size); - int *g_index = (int *)malloc(sizeof(int) * g_index_size); - int *s_index = (int *)malloc(sizeof(int) * s_index_size); + int *h_index = (int *)swift_malloc("h_index", sizeof(int) * h_index_size); + int *g_index = (int *)swift_malloc("g_index", sizeof(int) * g_index_size); + int *s_index = (int *)swift_malloc("s_index", sizeof(int) * s_index_size); if (h_index == NULL || g_index == NULL || s_index == NULL) error("Failed to allocate temporary particle indices."); /* Allocate counters of particles that will land in each cell */ - int *cell_part_counts = (int *)malloc(sizeof(int) * s->nr_cells); - int *cell_gpart_counts = (int *)malloc(sizeof(int) * s->nr_cells); - int *cell_spart_counts = (int *)malloc(sizeof(int) * s->nr_cells); + int *cell_part_counts = + (int *)swift_malloc("cell_part_counts", sizeof(int) * s->nr_cells); + int *cell_gpart_counts = + (int *)swift_malloc("cell_gpart_counts", sizeof(int) * s->nr_cells); + int *cell_spart_counts = + (int *)swift_malloc("cell_spart_counts", sizeof(int) * s->nr_cells); if (cell_part_counts == NULL || cell_gpart_counts == NULL || cell_spart_counts == NULL) error("Failed to allocate cell particle count buffer."); @@ -1281,20 +1345,22 @@ void space_rebuild(struct space *s, int repartitioned, int verbose) { /* Re-allocate the index array for the parts if needed.. */ if (s->nr_parts + 1 > h_index_size) { int *ind_new; - if ((ind_new = (int *)malloc(sizeof(int) * (s->nr_parts + 1))) == NULL) + if ((ind_new = (int *)swift_malloc( + "h_index", sizeof(int) * (s->nr_parts + 1))) == NULL) error("Failed to allocate temporary particle indices."); memcpy(ind_new, h_index, sizeof(int) * nr_parts); - free(h_index); + swift_free("h_index", h_index); h_index = ind_new; } /* Re-allocate the index array for the sparts if needed.. */ if (s->nr_sparts + 1 > s_index_size) { int *sind_new; - if ((sind_new = (int *)malloc(sizeof(int) * (s->nr_sparts + 1))) == NULL) + if ((sind_new = (int *)swift_malloc( + "s_index", sizeof(int) * (s->nr_sparts + 1))) == NULL) error("Failed to allocate temporary s-particle indices."); memcpy(sind_new, s_index, sizeof(int) * nr_sparts); - free(s_index); + swift_free("s_index", s_index); s_index = sind_new; } @@ -1423,20 +1489,21 @@ void space_rebuild(struct space *s, int repartitioned, int verbose) { } /* We no longer need the indices as of here. */ - free(h_index); - free(cell_part_counts); - free(s_index); - free(cell_spart_counts); + swift_free("h_index", h_index); + swift_free("cell_part_counts", cell_part_counts); + swift_free("s_index", s_index); + swift_free("cell_spart_counts", cell_spart_counts); #ifdef WITH_MPI /* Re-allocate the index array for the gparts if needed.. */ if (s->nr_gparts + 1 > g_index_size) { int *gind_new; - if ((gind_new = (int *)malloc(sizeof(int) * (s->nr_gparts + 1))) == NULL) + if ((gind_new = (int *)swift_malloc( + "g_index", sizeof(int) * (s->nr_gparts + 1))) == NULL) error("Failed to allocate temporary g-particle indices."); memcpy(gind_new, g_index, sizeof(int) * nr_gparts); - free(g_index); + swift_free("g_index", g_index); g_index = gind_new; } @@ -1510,8 +1577,8 @@ void space_rebuild(struct space *s, int repartitioned, int verbose) { } /* We no longer need the indices as of here. */ - free(g_index); - free(cell_gpart_counts); + swift_free("g_index", g_index); + swift_free("cell_gpart_counts", cell_gpart_counts); #ifdef SWIFT_DEBUG_CHECKS /* Verify that the links are correct */ @@ -1628,12 +1695,12 @@ void space_split(struct space *s, int verbose) { void space_reorder_extra_parts_mapper(void *map_data, int num_cells, void *extra_data) { - - struct cell *cells_top = (struct cell *)map_data; + int *local_cells = (int *)map_data; struct space *s = (struct space *)extra_data; + struct cell *cells_top = s->cells_top; for (int ind = 0; ind < num_cells; ind++) { - struct cell *c = &cells_top[ind]; + struct cell *c = &cells_top[local_cells[ind]]; cell_reorder_extra_parts(c, c->hydro.parts - s->parts); } } @@ -1641,11 +1708,12 @@ void space_reorder_extra_parts_mapper(void *map_data, int num_cells, void space_reorder_extra_gparts_mapper(void *map_data, int num_cells, void *extra_data) { - struct cell *cells_top = (struct cell *)map_data; + int *local_cells = (int *)map_data; struct space *s = (struct space *)extra_data; + struct cell *cells_top = s->cells_top; for (int ind = 0; ind < num_cells; ind++) { - struct cell *c = &cells_top[ind]; + struct cell *c = &cells_top[local_cells[ind]]; cell_reorder_extra_gparts(c, s->parts, s->sparts); } } @@ -1653,11 +1721,12 @@ void space_reorder_extra_gparts_mapper(void *map_data, int num_cells, void space_reorder_extra_sparts_mapper(void *map_data, int num_cells, void *extra_data) { - struct cell *cells_top = (struct cell *)map_data; + int *local_cells = (int *)map_data; struct space *s = (struct space *)extra_data; + struct cell *cells_top = s->cells_top; for (int ind = 0; ind < num_cells; ind++) { - struct cell *c = &cells_top[ind]; + struct cell *c = &cells_top[local_cells[ind]]; cell_reorder_extra_sparts(c, c->stars.parts - s->sparts); } } @@ -1674,25 +1743,20 @@ void space_reorder_extra_sparts_mapper(void *map_data, int num_cells, */ void space_reorder_extras(struct space *s, int verbose) { -#ifdef WITH_MPI - if (space_extra_parts || space_extra_gparts || space_extra_sparts) - error("Need an MPI-proof version of this."); -#endif - /* Re-order the gas particles */ if (space_extra_parts) threadpool_map(&s->e->threadpool, space_reorder_extra_parts_mapper, - s->cells_top, s->nr_cells, sizeof(struct cell), 0, s); + s->local_cells_top, s->nr_local_cells, sizeof(int), 0, s); /* Re-order the gravity particles */ if (space_extra_gparts) threadpool_map(&s->e->threadpool, space_reorder_extra_gparts_mapper, - s->cells_top, s->nr_cells, sizeof(struct cell), 0, s); + s->local_cells_top, s->nr_local_cells, sizeof(int), 0, s); /* Re-order the star particles */ if (space_extra_sparts) threadpool_map(&s->e->threadpool, space_reorder_extra_sparts_mapper, - s->cells_top, s->nr_cells, sizeof(struct cell), 0, s); + s->local_cells_top, s->nr_local_cells, sizeof(int), 0, s); } /** @@ -2242,7 +2306,7 @@ void space_parts_sort(struct part *parts, struct xpart *xparts, ptrdiff_t parts_offset) { /* Create the offsets array. */ size_t *offsets = NULL; - if (posix_memalign((void **)&offsets, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("parts_offsets", (void **)&offsets, SWIFT_STRUCT_ALIGNMENT, sizeof(size_t) * (num_bins + 1)) != 0) error("Failed to allocate temporary cell offsets array."); @@ -2287,7 +2351,7 @@ void space_parts_sort(struct part *parts, struct xpart *xparts, error("Bad offsets after shuffle."); #endif /* SWIFT_DEBUG_CHECKS */ - free(offsets); + swift_free("parts_offsets", offsets); } /** @@ -2305,7 +2369,8 @@ void space_sparts_sort(struct spart *sparts, int *restrict ind, ptrdiff_t sparts_offset) { /* Create the offsets array. */ size_t *offsets = NULL; - if (posix_memalign((void **)&offsets, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("sparts_offsets", (void **)&offsets, + SWIFT_STRUCT_ALIGNMENT, sizeof(size_t) * (num_bins + 1)) != 0) error("Failed to allocate temporary cell offsets array."); @@ -2347,7 +2412,7 @@ void space_sparts_sort(struct spart *sparts, int *restrict ind, error("Bad offsets after shuffle."); #endif /* SWIFT_DEBUG_CHECKS */ - free(offsets); + swift_free("sparts_offsets", offsets); } /** @@ -2365,7 +2430,8 @@ void space_gparts_sort(struct gpart *gparts, struct part *parts, int *restrict counts, int num_bins) { /* Create the offsets array. */ size_t *offsets = NULL; - if (posix_memalign((void **)&offsets, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("gparts_offsets", (void **)&offsets, + SWIFT_STRUCT_ALIGNMENT, sizeof(size_t) * (num_bins + 1)) != 0) error("Failed to allocate temporary cell offsets array."); @@ -2413,7 +2479,7 @@ void space_gparts_sort(struct gpart *gparts, struct part *parts, error("Bad offsets after shuffle."); #endif /* SWIFT_DEBUG_CHECKS */ - free(offsets); + swift_free("gparts_offsets", offsets); } /** @@ -2421,16 +2487,8 @@ void space_gparts_sort(struct gpart *gparts, struct part *parts, */ void space_map_clearsort(struct cell *c, void *data) { - for (int i = 0; i < 13; i++) { - if (c->hydro.sort[i] != NULL) { - free(c->hydro.sort[i]); - c->hydro.sort[i] = NULL; - } - if (c->stars.sort[i] != NULL) { - free(c->stars.sort[i]); - c->stars.sort[i] = NULL; - } - } + cell_free_hydro_sorts(c); + cell_free_stars_sorts(c); } /** @@ -2614,7 +2672,7 @@ void space_split_recursive(struct space *s, struct cell *c, const int allocate_buffer = (buff == NULL && gbuff == NULL && sbuff == NULL); if (allocate_buffer) { if (count > 0) { - if (posix_memalign((void **)&buff, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("tempbuff", (void **)&buff, SWIFT_STRUCT_ALIGNMENT, sizeof(struct cell_buff) * count) != 0) error("Failed to allocate temporary indices."); for (int k = 0; k < count; k++) { @@ -2630,7 +2688,7 @@ void space_split_recursive(struct space *s, struct cell *c, } } if (gcount > 0) { - if (posix_memalign((void **)&gbuff, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("tempgbuff", (void **)&gbuff, SWIFT_STRUCT_ALIGNMENT, sizeof(struct cell_buff) * gcount) != 0) error("Failed to allocate temporary indices."); for (int k = 0; k < gcount; k++) { @@ -2646,7 +2704,7 @@ void space_split_recursive(struct space *s, struct cell *c, } } if (scount > 0) { - if (posix_memalign((void **)&sbuff, SWIFT_STRUCT_ALIGNMENT, + if (swift_memalign("tempsbuff", (void **)&sbuff, SWIFT_STRUCT_ALIGNMENT, sizeof(struct cell_buff) * scount) != 0) error("Failed to allocate temporary indices."); for (int k = 0; k < scount; k++) { @@ -2716,6 +2774,7 @@ void space_split_recursive(struct space *s, struct cell *c, cp->stars.dx_max_sort = 0.f; cp->nodeID = c->nodeID; cp->parent = c; + cp->top = c->top; cp->super = NULL; cp->hydro.super = NULL; cp->grav.super = NULL; @@ -3024,9 +3083,9 @@ void space_split_recursive(struct space *s, struct cell *c, /* Clean up. */ if (allocate_buffer) { - if (buff != NULL) free(buff); - if (gbuff != NULL) free(gbuff); - if (sbuff != NULL) free(sbuff); + if (buff != NULL) swift_free("tempbuff", buff); + if (gbuff != NULL) swift_free("tempgbuff", gbuff); + if (sbuff != NULL) swift_free("tempsbuff", sbuff); } } @@ -3071,7 +3130,8 @@ void space_recycle(struct space *s, struct cell *c) { /* Clear the cell. */ if (lock_destroy(&c->lock) != 0 || lock_destroy(&c->grav.plock) != 0 || - lock_destroy(&c->mlock) != 0 || lock_destroy(&c->stars.lock) != 0) + lock_destroy(&c->mlock) != 0 || lock_destroy(&c->stars.lock) != 0 || + lock_destroy(&c->stars.star_formation_lock)) error("Failed to destroy spinlocks."); /* Lock the space. */ @@ -3120,7 +3180,8 @@ void space_recycle_list(struct space *s, struct cell *cell_list_begin, for (struct cell *c = cell_list_begin; c != NULL; c = c->next) { /* Clear the cell. */ if (lock_destroy(&c->lock) != 0 || lock_destroy(&c->grav.plock) != 0 || - lock_destroy(&c->mlock) != 0 || lock_destroy(&c->stars.lock) != 0) + lock_destroy(&c->mlock) != 0 || lock_destroy(&c->stars.lock) != 0 || + lock_destroy(&c->stars.star_formation_lock)) error("Failed to destroy spinlocks."); /* Count this cell. */ @@ -3166,7 +3227,7 @@ void space_getcells(struct space *s, int nr_cells, struct cell **cells) { /* Is the cell buffer empty? */ if (s->cells_sub == NULL) { - if (posix_memalign((void **)&s->cells_sub, cell_align, + if (swift_memalign("cells_sub", (void **)&s->cells_sub, cell_align, space_cellallocchunk * sizeof(struct cell)) != 0) error("Failed to allocate more cells."); @@ -3181,8 +3242,8 @@ void space_getcells(struct space *s, int nr_cells, struct cell **cells) { /* Is the multipole buffer empty? */ if (s->with_self_gravity && s->multipoles_sub == NULL) { - if (posix_memalign( - (void **)&s->multipoles_sub, multipole_align, + if (swift_memalign( + "multipoles_sub", (void **)&s->multipoles_sub, multipole_align, space_cellallocchunk * sizeof(struct gravity_tensors)) != 0) error("Failed to allocate more multipoles."); @@ -3209,10 +3270,9 @@ void space_getcells(struct space *s, int nr_cells, struct cell **cells) { /* Init some things in the cell we just got. */ for (int j = 0; j < nr_cells; j++) { - for (int k = 0; k < 13; k++) { - if (cells[j]->hydro.sort[k] != NULL) free(cells[j]->hydro.sort[k]); - if (cells[j]->stars.sort[k] != NULL) free(cells[j]->stars.sort[k]); - } + cell_free_hydro_sorts(cells[j]); + cell_free_stars_sorts(cells[j]); + struct gravity_tensors *temp = cells[j]->grav.multipole; bzero(cells[j], sizeof(struct cell)); cells[j]->grav.multipole = temp; @@ -3220,7 +3280,8 @@ void space_getcells(struct space *s, int nr_cells, struct cell **cells) { if (lock_init(&cells[j]->hydro.lock) != 0 || lock_init(&cells[j]->grav.plock) != 0 || lock_init(&cells[j]->grav.mlock) != 0 || - lock_init(&cells[j]->stars.lock) != 0) + lock_init(&cells[j]->stars.lock) != 0 || + lock_init(&cells[j]->stars.star_formation_lock) != 0) error("Failed to initialize cell spinlocks."); } } @@ -3233,16 +3294,8 @@ void space_getcells(struct space *s, int nr_cells, struct cell **cells) { void space_free_buff_sort_indices(struct space *s) { for (struct cell *finger = s->cells_sub; finger != NULL; finger = finger->next) { - for (int k = 0; k < 13; k++) { - if (finger->hydro.sort[k] != NULL) { - free(finger->hydro.sort[k]); - finger->hydro.sort[k] = NULL; - } - if (finger->stars.sort[k] != NULL) { - free(finger->stars.sort[k]); - finger->stars.sort[k] = NULL; - } - } + cell_free_hydro_sorts(finger); + cell_free_stars_sorts(finger); } } @@ -3951,7 +4004,7 @@ void space_init(struct space *s, struct swift_params *params, /* Allocate the extra parts array for the gas particles. */ if (Npart > 0) { - if (posix_memalign((void **)&s->xparts, xpart_align, + if (swift_memalign("xparts", (void **)&s->xparts, xpart_align, Npart * sizeof(struct xpart)) != 0) error("Failed to allocate xparts."); bzero(s->xparts, Npart * sizeof(struct xpart)); @@ -4006,15 +4059,15 @@ void space_replicate(struct space *s, int replicate, int verbose) { struct gpart *gparts = NULL; struct spart *sparts = NULL; - if (posix_memalign((void **)&parts, part_align, + if (swift_memalign("parts", (void **)&parts, part_align, s->nr_parts * sizeof(struct part)) != 0) error("Failed to allocate new part array."); - if (posix_memalign((void **)&gparts, gpart_align, + if (swift_memalign("gparts", (void **)&gparts, gpart_align, s->nr_gparts * sizeof(struct gpart)) != 0) error("Failed to allocate new gpart array."); - if (posix_memalign((void **)&sparts, spart_align, + if (swift_memalign("sparts", (void **)&sparts, spart_align, s->nr_sparts * sizeof(struct spart)) != 0) error("Failed to allocate new spart array."); @@ -4076,9 +4129,9 @@ void space_replicate(struct space *s, int replicate, int verbose) { } /* Replace the content of the space */ - free(s->parts); - free(s->gparts); - free(s->sparts); + swift_free("parts", s->parts); + swift_free("gparts", s->gparts); + swift_free("sparts", s->sparts); s->parts = parts; s->gparts = gparts; s->sparts = sparts; @@ -4136,11 +4189,11 @@ void space_generate_gas(struct space *s, const struct cosmology *cosmo, struct part *parts = NULL; struct gpart *gparts = NULL; - if (posix_memalign((void **)&parts, part_align, + if (swift_memalign("parts", (void **)&parts, part_align, s->nr_parts * sizeof(struct part)) != 0) error("Failed to allocate new part array."); - if (posix_memalign((void **)&gparts, gpart_align, + if (swift_memalign("gparts", (void **)&gparts, gpart_align, s->nr_gparts * sizeof(struct gpart)) != 0) error("Failed to allocate new gpart array."); @@ -4226,7 +4279,7 @@ void space_generate_gas(struct space *s, const struct cosmology *cosmo, } /* Replace the content of the space */ - free(s->gparts); + swift_free("gparts", s->gparts); s->parts = parts; s->gparts = gparts; } @@ -4412,16 +4465,17 @@ void space_reset_task_counters(struct space *s) { void space_clean(struct space *s) { for (int i = 0; i < s->nr_cells; ++i) cell_clean(&s->cells_top[i]); - free(s->cells_top); - free(s->multipoles_top); - free(s->local_cells_top); - free(s->local_cells_with_tasks_top); - free(s->cells_with_particles_top); - free(s->local_cells_with_particles_top); - free(s->parts); - free(s->xparts); - free(s->gparts); - free(s->sparts); + swift_free("cells_top", s->cells_top); + swift_free("multipoles_top", s->multipoles_top); + swift_free("local_cells_top", s->local_cells_top); + swift_free("local_cells_with_tasks_top", s->local_cells_with_tasks_top); + swift_free("cells_with_particles_top", s->cells_with_particles_top); + swift_free("local_cells_with_particles_top", + s->local_cells_with_particles_top); + swift_free("parts", s->parts); + swift_free("xparts", s->xparts); + swift_free("gparts", s->gparts); + swift_free("sparts", s->sparts); } /** @@ -4489,10 +4543,11 @@ void space_struct_restore(struct space *s, FILE *stream) { if (s->nr_parts > 0) { /* Need the memory for these. */ - if (posix_memalign((void **)&s->parts, part_align, + if (swift_memalign("parts", (void **)&s->parts, part_align, s->size_parts * sizeof(struct part)) != 0) error("Failed to allocate restore part array."); - if (posix_memalign((void **)&s->xparts, xpart_align, + + if (swift_memalign("xparts", (void **)&s->xparts, xpart_align, s->size_parts * sizeof(struct xpart)) != 0) error("Failed to allocate restore xpart array."); @@ -4503,7 +4558,7 @@ void space_struct_restore(struct space *s, FILE *stream) { } s->gparts = NULL; if (s->nr_gparts > 0) { - if (posix_memalign((void **)&s->gparts, gpart_align, + if (swift_memalign("gparts", (void **)&s->gparts, gpart_align, s->size_gparts * sizeof(struct gpart)) != 0) error("Failed to allocate restore gpart array."); @@ -4513,7 +4568,7 @@ void space_struct_restore(struct space *s, FILE *stream) { s->sparts = NULL; if (s->nr_sparts > 0) { - if (posix_memalign((void **)&s->sparts, spart_align, + if (swift_memalign("sparts", (void **)&s->sparts, spart_align, s->size_sparts * sizeof(struct spart)) != 0) error("Failed to allocate restore spart array."); diff --git a/src/space.h b/src/space.h index 924c3efaf81f88cb82a8c23707d42883832aa071..272ee41c3569cf3580678c0de885a41075f0e1b4 100644 --- a/src/space.h +++ b/src/space.h @@ -329,6 +329,8 @@ void space_reset_task_counters(struct space *s); void space_clean(struct space *s); void space_free_cells(struct space *s); +void space_free_foreign_parts(struct space *s); + void space_struct_dump(struct space *s, FILE *stream); void space_struct_restore(struct space *s, FILE *stream); void space_write_cell_hierarchy(const struct space *s); diff --git a/src/star_formation/EAGLE/star_formation.h b/src/star_formation/EAGLE/star_formation.h index 93bbd062eea0ac02023342adb85cca6d488ad0bb..43cc820189a117669aba30c36323a2aab840eadf 100644 --- a/src/star_formation/EAGLE/star_formation.h +++ b/src/star_formation/EAGLE/star_formation.h @@ -201,7 +201,7 @@ INLINE static double EOS_pressure(const double n_H, * @param hydro_props The properties of the hydro scheme. * @param us The internal system of units. * @param cooling The cooling data struct. - * + * @param entropy_floor The entropy floor assumed in this run. */ INLINE static int star_formation_is_star_forming( const struct part* restrict p, const struct xpart* restrict xp, diff --git a/src/stars/Default/stars.h b/src/stars/Default/stars.h index 586a87f75600a08acfd84b0f7ecc57fc4573281f..1ff4936284c4d8913417c502db69a372fc83bc06 100644 --- a/src/stars/Default/stars.h +++ b/src/stars/Default/stars.h @@ -72,18 +72,7 @@ __attribute__((always_inline)) INLINE static void stars_init_spart( * @param dt_drift The drift time-step for positions. */ __attribute__((always_inline)) INLINE static void stars_predict_extra( - struct spart* restrict sp, float dt_drift) { - - // MATTHIEU - /* const float h_inv = 1.f / sp->h; */ - - /* /\* Predict smoothing length *\/ */ - /* const float w1 = sp->feedback.h_dt * h_inv * dt_drift; */ - /* if (fabsf(w1) < 0.2f) */ - /* sp->h *= approx_expf(w1); /\* 4th order expansion of exp(w) *\/ */ - /* else */ - /* sp->h *= expf(w1); */ -} + struct spart* restrict sp, float dt_drift) {} /** * @brief Sets the values to be predicted in the drifts to their values at a diff --git a/src/swift.h b/src/swift.h index e166dde5dd3baed07fb5c081c64ce941d6c6ce6d..0b5eda65e73cd6600eb69c25bc6a3f0a2e6e675f 100644 --- a/src/swift.h +++ b/src/swift.h @@ -49,6 +49,7 @@ #include "logger.h" #include "logger_io.h" #include "map.h" +#include "memuse.h" #include "mesh_gravity.h" #include "multipole.h" #include "outputlist.h" diff --git a/src/task.c b/src/task.c index 34c636b48ed6ff3fefdf1e7847a67ca56ea79c89..a123809bca797b812d6acd94bce3fd8b7a05c1f5 100644 --- a/src/task.c +++ b/src/task.c @@ -79,6 +79,8 @@ const char *taskID_names[task_type_count] = {"none", "grav_end_force", "cooling", "star_formation", + "star_formation_in", + "star_formation_out", "logger", "stars_in", "stars_out", @@ -88,11 +90,23 @@ const char *taskID_names[task_type_count] = {"none", "stars_sort"}; /* Sub-task type names. */ -const char *subtaskID_names[task_subtype_count] = { - "none", "density", "gradient", "force", - "limiter", "grav", "external_grav", "tend", - "xv", "rho", "gpart", "multipole", - "spart", "stars_density", "stars_feedback"}; +const char *subtaskID_names[task_subtype_count] = {"none", + "density", + "gradient", + "force", + "limiter", + "grav", + "external_grav", + "tend_part", + "tend_gpart", + "tend_spart", + "xv", + "rho", + "gpart", + "multipole", + "spart", + "stars_density", + "stars_feedback"}; #ifdef WITH_MPI /* MPI communicators for the subtypes. */ diff --git a/src/task.h b/src/task.h index 704d1a5ef80f1208bce69d0acf7625fb36fa19e1..7bfd49a79904b73a87f3f5a6f0b0176e596d3707 100644 --- a/src/task.h +++ b/src/task.h @@ -70,6 +70,8 @@ enum task_types { task_type_end_grav_force, task_type_cooling, task_type_star_formation, + task_type_star_formation_in, /* Implicit */ + task_type_star_formation_out, /* Implicit */ task_type_logger, task_type_stars_in, /* Implicit */ task_type_stars_out, /* Implicit */ @@ -91,7 +93,9 @@ enum task_subtypes { task_subtype_limiter, task_subtype_grav, task_subtype_external_grav, - task_subtype_tend, + task_subtype_tend_part, + task_subtype_tend_gpart, + task_subtype_tend_spart, task_subtype_xv, task_subtype_rho, task_subtype_gpart, diff --git a/src/tools.c b/src/tools.c index 43ac0177daef171850ea325f9fa23770fb82ae13..a29408449600ad4b46bd73ba17e20adefdbcb613 100644 --- a/src/tools.c +++ b/src/tools.c @@ -442,6 +442,9 @@ void pairs_all_stars_density(struct runner *r, struct cell *ci, struct part *pj = &cj->hydro.parts[j]; + /* Early abort? */ + if (part_is_inhibited(pj, e)) continue; + /* Pairwise distance */ r2 = 0.0f; for (int k = 0; k < 3; k++) { @@ -472,6 +475,9 @@ void pairs_all_stars_density(struct runner *r, struct cell *ci, struct part *pi = &ci->hydro.parts[i]; + /* Early abort? */ + if (part_is_inhibited(pi, e)) continue; + /* Pairwise distance */ r2 = 0.0f; for (int k = 0; k < 3; k++) { @@ -660,6 +666,9 @@ void self_all_stars_density(struct runner *r, struct cell *ci) { pj = &ci->hydro.parts[j]; hj = pj->h; + /* Early abort? */ + if (part_is_inhibited(pj, e)) continue; + /* Pairwise distance */ r2 = 0.0f; for (int k = 0; k < 3; k++) { @@ -668,7 +677,7 @@ void self_all_stars_density(struct runner *r, struct cell *ci) { } /* Hit or miss? */ - if (r2 > 0.f && r2 < hig2) { + if (r2 < hig2) { /* Interact */ runner_iact_nonsym_stars_density(r2, dxi, hi, hj, spi, pj, a, H); } diff --git a/tests/test27cellsStars.c b/tests/test27cellsStars.c index e7e1b64b1cc99d8a51cf380fde1560bdd634ae20..e97aee278e4b34d7cb1904826aba7a5ff3ed5d67 100644 --- a/tests/test27cellsStars.c +++ b/tests/test27cellsStars.c @@ -70,6 +70,7 @@ struct cell *make_cell(size_t n, size_t n_stars, double *offset, double size, const size_t count = n * n * n; const size_t scount = n_stars * n_stars * n_stars; float h_max = 0.f; + float stars_h_max = 0.f; struct cell *cell = (struct cell *)malloc(sizeof(struct cell)); bzero(cell, sizeof(struct cell)); @@ -143,7 +144,7 @@ struct cell *make_cell(size_t n, size_t n_stars, double *offset, double size, spart->h = size * h * random_uniform(1.f, h_pert) / (float)n_stars; else spart->h = size * h / (float)n_stars; - h_max = fmaxf(h_max, spart->h); + stars_h_max = fmaxf(stars_h_max, spart->h); spart->id = ++(*spartId); spart->time_bin = 1; @@ -161,6 +162,7 @@ struct cell *make_cell(size_t n, size_t n_stars, double *offset, double size, cell->split = 0; cell->hydro.h_max = h_max; cell->hydro.count = count; + cell->stars.h_max = stars_h_max; cell->stars.count = scount; cell->hydro.dx_max_part = 0.; cell->hydro.dx_max_sort = 0.; diff --git a/tests/testActivePair.c b/tests/testActivePair.c index 54a3189b89d9de757bf340bf759db5b40f947174..cbafd325f22b4e47c9c3ffcfaa5086c18196f39a 100644 --- a/tests/testActivePair.c +++ b/tests/testActivePair.c @@ -162,9 +162,7 @@ struct cell *make_cell(size_t n, double *offset, double size, double h, } void clean_up(struct cell *ci) { - free(ci->hydro.parts); - for (int k = 0; k < 13; k++) - if (ci->hydro.sort[k] != NULL) free(ci->hydro.sort[k]); + cell_free_hydro_sorts(ci); free(ci); } diff --git a/tools/analyse_memuse_logs.py b/tools/analyse_memuse_logs.py new file mode 100755 index 0000000000000000000000000000000000000000..4026c73d1e13a4484975fe3902e508493dc838cb --- /dev/null +++ b/tools/analyse_memuse_logs.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python +""" +Usage: + process_memuse.py [options] memuse_report1.dat [memuse_report2.dat] ... + +Parse the output of a run of SWIFT to convert the memuse output dumps into a +timeseries of memory use. Also outputs use in memory per labelled type. + +This file is part of SWIFT. +Copyright (c) 2019 Peter W. Draper (p.w.draper@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/>. +""" + +from collections import OrderedDict +import argparse +import sys + +# Command-line arguments. +parser = argparse.ArgumentParser(description="Analyse memory usage reports") + +parser.add_argument("memuse_report", nargs='+', + help="Memory usage reports (order by step if using more than one)") +parser.add_argument( + "-b", + "--blacklist", + dest="blacklist", + help="substring of allocations to ignore (maybe be repeated)", + default=None, + action='append' +) +args = parser.parse_args() + +memuse = OrderedDict() +labels = {} +totalmem = 0 +process_use = "" +peak = 0.0 + +for filename in args.memuse_report: + sys.stderr.write("## Processing: " + filename + "\n") + with open(filename) as infile: + print '# {:<18s} {:>30s} {:>9s} {:>9s} {:s}'.format("tic", "label", "allocated", "step", "MB") + for line in infile: + if line[0] == "#": + if "# Current use:" in line: + process_use = line[14:-1] + else: + tic, adr, rank, step, allocated, label, size = line.split() + + # Skip blacklisted allocations, these can swamp the signal... + if args.blacklist != None: + skip = False + for item in args.blacklist: + if item in label: + skip = True + break + if skip: + continue + + rank = int(rank) + step = int(step) + allocated = int(allocated) + size = int(size) + + doprint = True + if allocated == 1: + # Allocation. + totalmem = totalmem + size + if not adr in memuse: + memuse[adr] = [size] + labels[adr] = label + else: + memuse[adr].append(size) + else: + # Free, locate allocation. + if adr in memuse: + allocs = memuse[adr] + totalmem = totalmem - allocs[0] + if len(allocs) > 1: + memuse[adr] = allocs[1:] + else: + del memuse[adr] + else: + # Unmatched free, complain and skip. + #print "### unmatched free: ", label, adr + doprint = False + if doprint: + if totalmem > peak: + peak = totalmem + print '{:<20s} {:>30s} {:9d} {:9d} {:.3f}'.format(tic, label, allocated, step, totalmem/(1048576.0)) + sys.stderr.write("## Finished ingestion of: " + filename + "\n") + +totals = {} +numactive = {} +for adr in labels: + # If any remaining allocations. + if adr in memuse: + if labels[adr] in totals: + totals[labels[adr]] = totals[labels[adr]] + memuse[adr][0] + numactive[labels[adr]] = numactive[labels[adr]] + 1 + else: + totals[labels[adr]] = memuse[adr][0] + numactive[labels[adr]] = 1 + +print "# Memory use by label:" +print "## ", '{:<30s} {:>16s} {:>16s}'.format("label", "MB", "numactive") +print "## " +total = 0.0 +for label in sorted(totals): + mem = totals[label]/(1048576.0) + total = total + mem + print "## ", '{:<30s} {:16.3f} {:16d}'.format(label, mem, numactive[label]) +print "## " +print "# Total memory still in use : ", '{:.3f}'.format(total), " (MB)" +print "# Peak memory usage : ", '{:.3f}'.format(peak/1048576.0), " (MB)" +if process_use != "": + print "#" + print "# Memory use by process (all/system):", process_use +sys.exit(0) diff --git a/tools/combine_ics.py b/tools/combine_ics.py index 64f255a61934bc3667fdb5934f74a206013e4872..d864c67d7d44fb6550e3cd858c50bb660d6126ca 100755 --- a/tools/combine_ics.py +++ b/tools/combine_ics.py @@ -41,7 +41,7 @@ import numpy as np # Store the compression level gzip_level = 4 if len(sys.argv) > 3: - gzip_level = sys.argv[3] + gzip_level = int(sys.argv[3]) # First, we need to collect some information from the master file main_file_name = str(sys.argv[1])[:-7] diff --git a/tools/process_memuse_logs.sh b/tools/process_memuse_logs.sh new file mode 100755 index 0000000000000000000000000000000000000000..c86efe9ceca388afcb8d7236c0a2a4e403a66083 --- /dev/null +++ b/tools/process_memuse_logs.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# +# Usage: +# process_memuse_logs nprocess +# +# Description: +# Process all the memuse report files in the current directory. +# Creating an analysis for step step and one for all the steps. +# +# The input files are created by a run configured for memuse reporting +# (--enable-memuse-reports) should be named "memuse_report-step<n>.dat" +# in the current directory. +# +# All located files will be processed using "nprocess" concurrent +# processes. The output for each step will be named memuse_report_step<n>.log +# and the overall analysis will be called memuse_report_all.log. +# +# This file is part of SWIFT: +# +# Copyright (C) 2019 Peter W. Draper (p.w.draper@durham.ac.uk) +# All Rights Reserved. +# +# 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/>. + +# Handle command-line +if test "$1" == ""; then + echo "Usage: $0 nprocess" + exit 1 +fi +NPROCS=$1 + +# Locate script. +SCRIPTHOME=$(dirname "$0") + +# Find all report files. Use version sort to get into correct order. +files=$(ls -v memuse_report-step*.dat) +if test $? != 0; then + echo "Failed to find any memuse report files" + exit 1 +fi + +# Construct list of input and output names. +list="" +for f in $files; do + output=$(echo $f| sed 's,.dat,.log,') + list="$list $f $output" +done + +# And process them. +echo "Processing memuse report files..." +echo $list | xargs -P $NPROCS -n 2 /bin/bash -c "${SCRIPTHOME}/analyse_memuse_logs.py \$0 > \$1" + +# Now process the overall file, if more than one file given. +n=$(echo $list| wc -w) +if test $n -gt 2; then + echo "Processing _all_ memuse report files..." + ${SCRIPTHOME}/analyse_memuse_logs.py $files > memuse_report-all.log +fi + +echo "Finished" + +exit diff --git a/tools/process_memuse_logs_MPI.sh b/tools/process_memuse_logs_MPI.sh new file mode 100755 index 0000000000000000000000000000000000000000..77a949d18432690fcb93f883eca5edff2ea19d92 --- /dev/null +++ b/tools/process_memuse_logs_MPI.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# +# Usage: +# process_memuse_logs_MPI rank nprocess +# +# Description: +# Process all the memuse report files in the current directory that +# are output from the given rank. +# Creating an analysis for each step and one for all the steps. +# +# The input files are created by a run configured for memuse reporting +# (--enable-memuse-reports) should be named "memuse_report-rank<n>-step<m>.dat" +# in the current directory. +# +# All located files will be processed using "nprocess" concurrent +# processes. The output for each step will be named memuse_report-rank<n>-step<m>.log +# and the overall analysis will be called memuse_report-all-rank<n>.log. +# +# This file is part of SWIFT: +# +# Copyright (C) 2019 Peter W. Draper (p.w.draper@durham.ac.uk) +# All Rights Reserved. +# +# 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/>. + +# Handle command-line +if test "$2" == ""; then + echo "Usage: $0 rank nprocess" + exit 1 +fi +RANK=$1 +NPROCS=$2 + +# Locate script. +SCRIPTHOME=$(dirname "$0") + +# Find all report files. Use version sort to get into correct order. +files=$(ls -v memuse_report-rank${RANK}-step*.dat) +if test $? != 0; then + echo "Failed to find any memuse report files" + exit 1 +fi + +# Construct list of input and output names. +list="" +for f in $files; do + output=$(echo $f| sed 's,.dat,.log,') + list="$list $f $output" +done + +# And process them. +echo "Processing memuse report files..." +echo $list | xargs -P $NPROCS -n 2 /bin/bash -c "${SCRIPTHOME}/analyse_memuse_logs.py \$0 > \$1" + +# Now process the overall file, if more than one file given. +n=$(echo $list| wc -w) +if test $n -gt 2; then + echo "Processing _all_ memuse report files..." + ${SCRIPTHOME}/analyse_memuse_logs.py $files > memuse_report-all-rank${RANK}.log +fi + +echo "Finished" + +exit diff --git a/tools/task_plots/analyse_tasks.py b/tools/task_plots/analyse_tasks.py index fc9df0e4797cfb16e883df551af30dc0d3244edc..e938d0610ab878efbd6463909bbf75fe2ec60bc2 100755 --- a/tools/task_plots/analyse_tasks.py +++ b/tools/task_plots/analyse_tasks.py @@ -94,6 +94,8 @@ TASKTYPES = [ "grav_end_force", "cooling", "star_formation", + "star_formation_in", + "star_formation_out", "logger", "stars_in", "stars_out", @@ -112,7 +114,9 @@ SUBTYPES = [ "limiter", "grav", "external_grav", - "tend", + "tend_part", + "tend_gpart", + "tend_spart", "xv", "rho", "gpart", diff --git a/tools/task_plots/plot_tasks.py b/tools/task_plots/plot_tasks.py index 54f34b2f828895d894b84253e366173827c03158..b692ee963784b9487f5e19ca7274c0ecaa9b7a89 100755 --- a/tools/task_plots/plot_tasks.py +++ b/tools/task_plots/plot_tasks.py @@ -179,6 +179,8 @@ TASKTYPES = [ "grav_end_force", "cooling", "star_formation", + "star_formation_in", + "star_formation_out", "logger", "stars_in", "stars_out", @@ -197,7 +199,9 @@ SUBTYPES = [ "limiter", "grav", "external_grav", - "tend", + "tend_part", + "tend_gpart", + "tend_spart", "xv", "rho", "gpart", @@ -232,8 +236,12 @@ FULLTYPES = [ "send/xv", "recv/rho", "send/rho", - "recv/tend", - "send/tend", + "recv/tend_part", + "send/tend_part", + "recv/tend_gpart", + "send/tend_gpart", + "recv/tend_spart", + "send/tend_spart", "recv/gpart", "send/gpart", "recv/spart",