diff --git a/docs/Makefile b/docs/Makefile index df35e01697db9389c44e32fd672a7608c15c1f7f..e51d09f09c2d051cdb9af816ca03ba43ddd0498e 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -26,6 +26,7 @@ help: cp ../examples/notebook_extra_features.ipynb source/ cp ../examples/notebook_api_functionality.ipynb source/ cp ../examples/notebook_luminosity_function_single.ipynb source/ + cp ../examples/notebook_luminosity_function_binaries.ipynb source/ # Copy the badges cp -r ../badges/ source/ diff --git a/docs/build/doctrees/binary_c_parameters.doctree b/docs/build/doctrees/binary_c_parameters.doctree index f6338cfabfc2f18737da714694c03fafe5132542..95b8f7090e04fa0459582c8d43f09c730a2d45a3 100644 Binary files a/docs/build/doctrees/binary_c_parameters.doctree and b/docs/build/doctrees/binary_c_parameters.doctree differ diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle index e0ed39a409e8733fee869823a5a3c54d0b789365..af5a6f51c95647effc527f4d0f76aa7db02ad132 100644 Binary files a/docs/build/doctrees/environment.pickle and b/docs/build/doctrees/environment.pickle differ diff --git a/docs/build/doctrees/example_notebooks.doctree b/docs/build/doctrees/example_notebooks.doctree index b9bef3c20dc63831463b0ae0c0e0c9848b042660..48df9e4b38f0fc2c76ecb9eae315ac298d9746cd 100644 Binary files a/docs/build/doctrees/example_notebooks.doctree and b/docs/build/doctrees/example_notebooks.doctree differ diff --git a/docs/build/doctrees/functions.doctree b/docs/build/doctrees/functions.doctree index 404ea6de34f4477f068902d88dfe218f3316327e..cd805d6b1cd93d5e9d46d6ef07f6497939a92505 100644 Binary files a/docs/build/doctrees/functions.doctree and b/docs/build/doctrees/functions.doctree differ diff --git a/docs/build/doctrees/grid.doctree b/docs/build/doctrees/grid.doctree index 36082ca3d96c82d3c7cd14d66b743fc2703a1cc2..e45c1acb9e1a01e68fe24b85a89f17f67c85a0c8 100644 Binary files a/docs/build/doctrees/grid.doctree and b/docs/build/doctrees/grid.doctree differ diff --git a/docs/build/doctrees/grid_options_descriptions.doctree b/docs/build/doctrees/grid_options_descriptions.doctree index ef9f5f153be768b3795647b853039c46c3f89296..1e8841878b5416327ae4627ab83e4c39cc365b98 100644 Binary files a/docs/build/doctrees/grid_options_descriptions.doctree and b/docs/build/doctrees/grid_options_descriptions.doctree differ diff --git a/docs/build/doctrees/index.doctree b/docs/build/doctrees/index.doctree index d7befe589c22002c2d96c3f547c3035fdae1fab4..05f3ff5a58b6c27b26dbd1fa53daec18af13fac6 100644 Binary files a/docs/build/doctrees/index.doctree and b/docs/build/doctrees/index.doctree differ diff --git a/docs/build/doctrees/nbsphinx/notebook_api_functionality.ipynb b/docs/build/doctrees/nbsphinx/notebook_api_functionality.ipynb index d81c31711bfc5d6de3159fd8958df96dd145ded0..8d454880c82dba172d33a95532c47bc95f24ff6a 100644 --- a/docs/build/doctrees/nbsphinx/notebook_api_functionality.ipynb +++ b/docs/build/doctrees/nbsphinx/notebook_api_functionality.ipynb @@ -15,7 +15,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "ded7eaf6-e1ba-46c2-9f6f-9ebcb14a264d", "metadata": {}, "outputs": [ @@ -30,37 +30,69 @@ "\n", "FUNCTIONS\n", " free_persistent_data_memaddr_and_return_json_output(...)\n", - " Frees the persistent_data memory and returns the json output\n", + " Frees the persistent_data memory and returns the json output.\n", + " \n", + " Arguments:\n", + " store capsule: capsule containing the memory adress of the persistent data object (contains the ensemble)\n", " \n", " free_store_memaddr(...)\n", - " Frees the store memaddr\n", + " Frees the store memaddr.\n", + " \n", + " Arguments:\n", + " store capsule: capsule containing the memory adress of the store object\n", " \n", " return_arglines(...)\n", " Return the default args for a binary_c system\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_help(...)\n", " Return the help info for a given parameter\n", + " \n", + " Arguments:\n", + " parameter: parameter name.\n", " \n", " return_help_all(...)\n", " Return an overview of all the parameters, their description, categorized in sections\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_maximum_mass_ratio_for_RLOF(...)\n", - " Returns a string containing the maximum mass ratio for which a binary system does not RLOF at zams. Optionally accepts a store_capsule. Please use the wrapper functions in utils for this except when you know what you're doing\n", + " Returns a string containing the maximum mass ratio for which a binary system does not RLOF at ZAMS. Please use the wrapper functions in utils for this except when you know what you're doing.\n", + " \n", + " Arguments:\n", + " argstring: argument string for binary_c\n", + " (opt) store_capsule: capsule containing memory adress for the store object.unction. Default = Null\n", " \n", " return_minimum_orbit_for_RLOF(...)\n", - " Returns a string containing the minimum orbit and separation for which a binary system does not RLOF at zams. Please use the wrapper functions in utils for this except when you know what you're doing\n", + " Returns a string containing the minimum orbit and separation for which a binary system does not RLOF at ZAMS. Please use the wrapper functions in utils for this except when you know what you're doing.\n", + " \n", + " Arguments:\n", + " argstring: argument string for binary_c\n", + " (opt) store_capsule: capsule containing memory adress for the store object.unction. Default = Null\n", " \n", " return_persistent_data_memaddr(...)\n", " Return the store memory adress that will be passed to run_population\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_store_memaddr(...)\n", " Return the store memory adress that will be passed to run_population\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_version_info(...)\n", " Return the version information of the used binary_c build\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " run_system(...)\n", - " Function to run a system. This is a general function that will be able to handle different kinds of situations: single system run with different settings, population run with different settings, etc. To avoid having too many functions doing slightly different things. \n", + " Function to run a system. This is a general function that will be able to handle different kinds of situations: single system run with different settings, population run with different settings, etc. To avoid having too many functions doing slightly different things.\n", " \n", " Arguments:\n", " argstring: argument string for binary_c\n", @@ -126,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 2, "id": "10a74d5a-a3d5-4543-a5bc-20d1fe885bb4", "metadata": {}, "outputs": [ @@ -134,8 +166,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "<capsule object \"STORE\" at 0x7f163859d0c0>\n", - "SINGLE_STAR_LIFETIME 10 27.7358\n", + "<capsule object \"STORE\" at 0x7fa6a45ed180>\n", + "SINGLE_STAR_LIFETIME 10 28.4838\n", "\n" ] } @@ -183,7 +215,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 3, "id": "318874f6-7acf-49bb-9786-299d4dffc0b3", "metadata": {}, "outputs": [ @@ -217,7 +249,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 4, "id": "d7e757ae-579c-42a2-a310-f0401b7800e8", "metadata": { "scrolled": true, @@ -291,6 +323,9 @@ "opacity_algorithm : Set the opacity algorithm. 0 = Paczynski, 1 = Ferguson/Opal. : (null)\n", "wind_mass_loss : Defines the algorithm used for stellar winds. 0 = none, 1 = Hurley et al. (2002), 2 = Schneider (2018). : 0\n", "gbwind : Wind prescription for first red giant branch stars. 0=Reimers (Hurley et al 2000/2002; choose gb_reimers_eta=0.5 for their mass loss rate), 1=Schroeder+Cuntz 2005 (set gb_reimers_eta=1.0 for their mass loss rate). : (null)\n", + "postagbwind : Apply special post-(A)GB prescription. Default is POSTAGB_WIND_USE_GIANT which means we just use whatever is prescribed on the giant branch. Other options include: POSTAGB_WIND_NONE = 1 (no wind on the post (A)GB), POSTAGB_WIND_KRTICKA2020 = 2 which uses Krticka, Kubát and Krticková (2020, A&A 635, A173). : (null)\n", + "Teff_postAGB_min : The minimum temperature for which we apply post-(A)GB winds. See also Teff_postAGB_max. (6000 K) : (null)\n", + "Teff_postAGB_max : The maximum temperature for which we apply post-(A)GB winds. See also Teff_postAGB_min. (120000 K) : (null)\n", "mattsson_Orich_tpagbwind : Experimental : turns on Mattsson's TPAGB wind when the star is oxygen rich. Requires MATTSSON_MASS_LOSS. : (null)\n", "magnetic_braking_factor : Multiplier for the magnetic braking angular momentum loss rate. : (null)\n", "magnetic_braking_gamma : gamma factor in Rappaport style magnetic braking expression. : (null)\n", @@ -310,7 +345,9 @@ "vw93_mira_shift : In the Vassiliadis and Wood (1993) AGB wind prescription, the wind loss rate depends on the Mira period plus this offset. Requires VW93_MIRA_SHIFT. : (null)\n", "vw93_multiplier : In the Vassiliadis and Wood (1993) AGB wind prescription, the wind loss rate is multiplied by this factor. Requires VW93_MULTIPLIER. : (null)\n", "tpagb_reimers_eta : TPAGB Reimers wind multiplication factor, cf. eta in Reimers' mass loss formula. (This multiplies the 4e-13 in Reimers' formula, or the 8e-14 in Schroeder and Cuntz.) Note that Reimers is not the default TPAGB wind prescription. See also tpagbwind. : (null)\n", + "Tout_Pringle_1992_multiplier : Multiplier for the Tout & Pringle (1992) magnetic wind. (0.0) : (null)\n", "artificial_mass_accretion_rate%d : Constant mass accretion rate for star <n>. : (null)\n", + "artificial_mass_accretion_rate_by_stellar_type%d : Constant mass accretion rate for stellar type <n>. : (null)\n", "artificial_angular_momentum_accretion_rate%d : Constant angular momentum accretion for star <n>. : (null)\n", "artificial_orbital_angular_momentum_accretion_rate : Constant angular momentum accretion rate on the orbit. : (null)\n", "artificial_accretion_start_time : Time at which artificial accretion stars. Ignored if <0 (default is -1). : (null)\n", @@ -318,8 +355,7 @@ "wr_wind : Massive-star (WR) wind prescription. 0 = Hurley et al 2000/2002, 1=Maeder and Meynet, 2=Nugis and Lamers, 3=John Eldridge's version of Vink's early-2000s wind (See Lynnette Dray's thesis, or John Eldridge's thesis) : (null)\n", "wr_wind_fac : Massive-star (WR) wind multiplication factor. : (null)\n", "wrwindfac : Massive-star (WR) wind multiplication factor. Synonymous with wr_wind_fac (which you should use instead). : (null)\n", - "BH_prescription : Black hole mass prescrition: relates the mass of a newly formed black hole to its progenitor's (CO) core mass. 0=Hurley et al 2000/2002, 1=Belczynski (early 2000s). : (null)\n", - "PPISN_prescription : (Pulsational) Pair-Instability Supernova prescription: Relates initial helium core mass of star to whether the star undergoes PPISN or PISN. Requires PPISN flag to be True (see binary_c_parameters.h). 0=no ppisn, 1=Farmer et al 2019. : Ignore\n", + "BH_prescription : Black hole mass prescrition: relates the mass of a newly formed black hole to its progenitor's (CO) core mass. BH_HURLEY2002 = 0 = Hurley et al 2000/2002, BH_BELCZYNSKI = 1 = Belczynski (early 2000s), BH_SPERA2015 = Spera+ 2015, BH_FRYER12_DELAYED = 3 = Fryer et al. (2012) delayed prescription, BH_FRYER12_RAPID = 4 = Fryer et al. (2012) rapid prescription, BH_FRYER12_STARTRACK = 5 = Fryer et al. (2012) startrack prescription. : (null)\n", "sn_kick_distribution_II : Set the distribution of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_ECAP : Set the distribution of speeds applied to the remnants of electron-capture supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_NS_NS : Set the distribution of speeds applied to kick neutron stars and black holes that survive a NS-NS merger. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", @@ -331,9 +367,6 @@ "sn_kick_distribution_BH_NS : Set the distribution of speeds applied to black holes formed by the merger of a neutron star and a black holes. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_IA_Hybrid_HeCOWD : Set the distribution of speeds applied to any survivor of a hybrid He-COWD SNIa explosion. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_IA_Hybrid_HeCOWD_subluminous : Set the distribution of speeds applied to any survivor of a subluminous hybrid He-COWD SNIa explosion. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_distribution_PPISN : Set the distribution of speeds applied to PPISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_distribution_PISN : Set the distribution of speeds applied to PISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_distribution_PHDIS : Set the distribution of speeds applied to PHDIS supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_II : Set the dispersion of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_ECAP : Set the dispersion of speeds applied to the remnants of electron-capture supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_NS_NS : Set the dispersion of speeds applied to kick neutron stars and black holes that survive a NS-NS merger. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", @@ -345,9 +378,6 @@ "sn_kick_dispersion_BH_NS : Set the dispersion of speeds applied to black holes formed by the merger of a neutron star and a black holes. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_IA_Hybrid_HeCOWD : Set the dispersion of speeds applied to the survivor of a SNIa explosion of a hybrid He-COWD. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_IA_Hybrid_HeCOWD_subluminous : Set the dispersion of speeds applied to the survivor of a subluminous SNIa explosion of a hybrid He-COWD. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_dispersion_PPISN : Set the dispersion of speeds applied to the survivor of a PPISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_dispersion_PISN : Set the dispersion of speeds applied to the survivor of a PISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_dispersion_PHDIS : Set the dispersion of speeds applied to the survivor of a PHDIS supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_companion_IA_He : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia He supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_ELD : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia ELD (sub-Mch) supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_CHAND : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia Mch supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", @@ -368,9 +398,6 @@ "sn_kick_companion_BH_NS : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a black hole merges with a neutron star. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_Hybrid_HeCOWD : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a hybrid He-COWD type Ia explosion. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_Hybrid_HeCOWD_subluminous : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a subluminous hybrid He-COWD type Ia explosion. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", - "sn_kick_companion_PPISN : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PPISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", - "sn_kick_companion_PISN : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", - "sn_kick_companion_PHDIS : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PHDIS supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "wd_sigma : Set the speed at which white dwarfs are kicked when they form, in km/s. Default is zero (i.e. no kick). Requires WD_KICKS. : (null)\n", "wd_kick_direction : Set the direction of white dwarf kicks. 0 = random, 1 = up, 2 = forward, 3 = backward, 4 = inward, 5 = outward. Requires WD_KICKS. : (null)\n", "wd_kick_when : Decide when to kick a white dwarf. 0=at birth, 1=at first RLOF, 2=at given pulse number (see wd_kick_pulse_number), 3 at every pulse Requires WD_KICKS. : (null)\n", @@ -443,6 +470,11 @@ "HeWD_HeWD_ignition_mass : HeWD-HeWD mergers above this mass reignite helium. (0.3) : (null)\n", "wind_Nieuwenhuijzen_luminosity_lower_limit : Above this luminosity we activate the Nieuwenhuijzen and de Jager wind (4e3 Lsun). : (null)\n", "wind_LBV_luminosity_lower_limit : Above this luminosity we activate the LBV wind (6e5 Lsun). : (null)\n", + "colour%d : Sets colour %d (0 to NUM_ANSI_COLOURS-1) to the extended ANSI set colour you choose (1-255, 0 means ignore). The colour numbers are defined in src/logging/ansi_colours.h : (null)\n", + "apply_Darwin_Radau_correction : Apply Darwin-Radau correction to the moment of inertia to take rotation into account? : (null)\n", + "degenerate_core_merger_nucsyn : If TRUE, assume that in a degnerate core merger, energy is generated from nucleosynthesis of the whole core, and that this can disrupt the core. The BSE algorithm (Hurley et al. 2002) assumes this to be TRUE, but binary_c assumes FALSE by default. (FALSE) : (null)\n", + "degenerate_core_helium_merger_ignition : If TRUE, assume that when there is a degenerate helium core merger, the star reignites helium. This is required to make R-type carbon stars. (TRUE) : (null)\n", + "degenerate_core_merger_dredgeup_fraction : If non-zero, mix this fraction of the degenerate core during a merger.(0.0). : (null)\n", "\n", "############################################################\n", "##### Section Binary\n", @@ -709,7 +741,6 @@ "############################################################\n", "##### Section Output\n", "############################################################\n", - "david_logging_function : Function to choose which kind of information gets logged Requires DAVID. Choices are: 0= None, >0 for custom logging functions : Ignore\n", "cf_amanda_log : Enable logging to compare to Amanda's models. : (null)\n", "float_overflow_checks : Turn on to enable floating-point overflow checks at the end of each timestep, if they are available. 0=off, 1=warn (stderr) on failure, 2=exit on failure (0) : (null)\n", "save_pre_events_stardata : Enable this to save a copy of stardata to stardata->pre_events_stardata just before an event. : (null)\n", @@ -739,6 +770,7 @@ "escape_fraction : A parameter used in constructing galactic chemical evolution (GCE) models. If the stellar wind velocity exceeds this value, any chemical yield from the wind is ignored, i.e. assumed lost. (km/s) Requires NUCSYN_GCE_OUTFLOW_CHECKS. Default 0.0. See also escape_velocity. : (null)\n", "colour_log : If set to True, thelog is coloured with ANSI colour formatting. Requires FILE_LOG to be defined. : \n", "log_filename : Location of the output logging filename. If set to \"/dev/null\" then there is no logging. : \n", + "log_arrows : Add arrows to the output log to show whether values are increasing or decreasing. : \n", "stopfile : File which, when it exists, will stop the current binary_c repeat run. : \n", "stardata_dump_filename : Location of the stardata dump file. : \n", "stardata_load_filename : Location of the stardata file to load. : \n", @@ -763,8 +795,12 @@ "MINT_MS_rejuvenation : Turn on or off (hydrogen) main-sequence rejuvenation. : \n", "MINT_remesh : Turn on or off MINT's remeshing. : \n", "MINT_use_ZAMS_profiles : Use chemical profiles at the ZAMS if MINT_use_ZAMS_profiles is TRUE, otherwise set homogeneous abundances. (Default is TRUE, so we use the profiles if they are available.) : \n", + "MINT_fallback_to_test_data : If TRUE, use the MINT test_data directory as a fallback when data is unavailable. (FALSE) : \n", "MINT_disable_grid_load_warnings : Use this to explicitly disable MINT's warnings when loading a grid with, e.g., missing or too much data. : \n", "MINT_Kippenhahn : Turn on or off MINT's Kippenhahn diagrams. If 0, off, if 1, output star 1 (index 0), if 2 output star 2 (index 1). Default 0. : \n", + "MINT_nshells : Set the initial number of shells MINT uses in each star when doing nuclear burning. Note: remeshing can change this. If MINT_nshells is 0, shellular burning and other routines that require shells will not be available. (200) : \n", + "MINT_maximum_nshells : Set the maximum number of shells MINT uses in each star when doing nuclear burning. Note that this will be limited to MINT_HARD_MAX_NSHELLS. (1000) : \n", + "MINT_minimum_nshells : Set the minimum number of shells MINT uses in each star when doing nuclear burning. Note that this will be greater than or equal to MINT_HARD_MIN_NSHELLS, which is 0 by default. (0) : \n", "MINT_Kippenhahn_stellar_type : Stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for which Kippenhahn plot data should be output. : \n", "MINT_Kippenhahn_companion_stellar_type : Companion stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for the companion for which Kippenhahn plot data should be output. : \n", "MINT_nuclear_burning : Turn on or off MINT's nuclear burning algorithm. : \n", @@ -825,7 +861,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 5, "id": "3d29ca9d-ac66-4f9e-81cf-2edd14a98b79", "metadata": {}, "outputs": [ @@ -854,7 +890,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "e517f561-09c6-419d-ba89-d9cb61e6ebab", "metadata": {}, "outputs": [ @@ -887,7 +923,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 7, "id": "7da75a95-8831-4346-a584-e042ced75249", "metadata": {}, "outputs": [ diff --git a/docs/build/doctrees/nbsphinx/notebook_custom_logging.ipynb b/docs/build/doctrees/nbsphinx/notebook_custom_logging.ipynb index 05ffbccfc23f0b08e85abed0d467233385520a4b..84e41e6bcee06490f5b4dc61fb616cc213024aba 100644 --- a/docs/build/doctrees/nbsphinx/notebook_custom_logging.ipynb +++ b/docs/build/doctrees/nbsphinx/notebook_custom_logging.ipynb @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 1, "id": "696ecbb9-1efd-48f4-a57e-2cf6dfe416f1", "metadata": {}, "outputs": [], @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 2, "id": "236cf821-09ac-4237-9b8f-6e36d2edf446", "metadata": {}, "outputs": [ @@ -90,7 +90,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 3, "id": "feb423d5-5cc3-433c-9801-f8017abbc03a", "metadata": {}, "outputs": [ @@ -110,7 +110,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 4, "id": "2f5defbf-c623-49ed-a238-fba52a563a58", "metadata": {}, "outputs": [ @@ -155,7 +155,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 5, "id": "dcd74bbc-478b-43e4-b495-8c456e8d1d88", "metadata": {}, "outputs": [ @@ -195,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 6, "id": "77bd09b0-1a94-499d-97db-a1f991c67c12", "metadata": {}, "outputs": [ @@ -203,10 +203,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "EXAMPLE_ABOVE_MS 1.041660877905e+02 4.99198 4.99198 6.1357 6.1357 2 1\n", - "EXAMPLE_ABOVE_MS 1.041662558619e+02 4.99198 4.99198 6.14057 6.1357 2 2\n", - "EXAMPLE_ABOVE_MS 1.041662560111e+02 4.99198 4.99198 6.14057 6.14057 2 2\n", - "EXAMPLE_ABOVE_MS 1.041662564579e+02 4.99198 4.99198 6.14059 6.14057 2 2\n" + "EXAMPLE_ABOVE_MS 1.044142002936e+02 4.99194 4.99194 6.13567 6.13567 2 1\n", + "EXAMPLE_ABOVE_MS 1.044572277695e+02 4.99192 4.99194 7.51803 6.13567 2 2\n", + "EXAMPLE_ABOVE_MS 1.044654032097e+02 4.99192 4.99192 7.81395 7.51803 2 2\n", + "EXAMPLE_ABOVE_MS 1.045084306856e+02 4.99191 4.99192 9.57443 7.81395 2 2\n" ] } ], @@ -260,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 7, "id": "30142286-34ce-433e-82c8-565e2160ff5b", "metadata": {}, "outputs": [ @@ -336,7 +336,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 8, "id": "6f0edc65-a788-4706-a0c5-2ace030765ec", "metadata": {}, "outputs": [ @@ -344,8 +344,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "SINGLE_STAR_LIFETIME 10 27.7358\n", - "EXAMPLE_LOG_CO 2.773581245005e+01 1.33524 9.19314 1.72498e-05 730.446 13 5\n" + "SINGLE_STAR_LIFETIME 10 28.4838\n", + "EXAMPLE_LOG_CO 2.848380621869e+01 1.33469 9.1865 1.72498e-05 724.338 13 5\n" ] } ], @@ -395,7 +395,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 10, "id": "8f58fdf9-3e76-4c18-a1c5-eed0980d4133", "metadata": {}, "outputs": [ @@ -403,8 +403,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "EXAMPLE_MASSLOSS 9.878236827680e+00 1.61349 8.38063 20 13 1\n", - "EXAMPLE_SN 9.878236827680e+00 1.61349 8.38063 20 12 13 5 1 6.74037 4.92267 6.74037 0 0\n" + "EXAMPLE_MASSLOSS 1.050651207308e+01 1.59452 9.34213 20 13 1\n", + "EXAMPLE_SN 1.050651207308e+01 1.59452 9.34213 20 12 13 5 1 6.55458 4.71662 6.55458\n" ] } ], @@ -424,58 +424,27 @@ "{\n", " if (stardata->model.time < stardata->model.max_evolution_time)\n", " {\n", - " if(stardata->pre_events_stardata != NULL)\n", - " {\n", - " Printf(\"EXAMPLE_SN %30.12e \" // 1\n", - " \"%g %g %g %d \" // 2-5\n", - " \"%d %d %g %g \" // 6-9\n", - " \"%g %g %g %g\\\\n\", // 10-13\n", - "\n", - " // \n", - " stardata->model.time, // 1\n", - "\n", - " stardata->star[0].mass, //2\n", - " stardata->pre_events_stardata->star[0].mass, //3\n", - " stardata->common.zero_age.mass[0], //4\n", - " stardata->star[0].SN_type, //5\n", + " Printf(\"EXAMPLE_SN %30.12e \" // 1\n", + " \"%g %g %g %d \" // 2-5\n", + " \"%d %d %g %g \" // 6-9\n", + " \"%g %g\\\\n\", // 10-13\n", "\n", - " stardata->star[0].stellar_type, //6\n", - " stardata->pre_events_stardata->star[0].stellar_type, //7\n", - " stardata->model.probability, //8\n", - " stardata->pre_events_stardata->star[0].core_mass[ID_core(stardata->pre_events_stardata->star[0].stellar_type)], // 9\n", - "\n", - " stardata->pre_events_stardata->star[0].core_mass[CORE_CO], // 10\n", - " stardata->pre_events_stardata->star[0].core_mass[CORE_He], // 11\n", - " stardata->star[0].fallback, // 12\n", - " stardata->star[0].fallback_mass // 13\n", - " );\n", - " }\n", - " else\n", - " {\n", - " Printf(\"EXAMPLE_SN %30.12e \" // 1\n", - " \"%g %g %g %d \" // 2-5\n", - " \"%d %d %g %g \" // 6-9\n", - " \"%g %g %g %g\\\\n\", // 10-13\n", - "\n", - " // \n", - " stardata->model.time, // 1\n", + " // \n", + " stardata->model.time, // 1\n", "\n", - " stardata->star[0].mass, //2\n", - " stardata->previous_stardata->star[0].mass, //3\n", - " stardata->common.zero_age.mass[0], //4\n", - " stardata->star[0].SN_type, //5\n", + " stardata->star[0].mass, //2\n", + " stardata->previous_stardata->star[0].mass, //3\n", + " stardata->common.zero_age.mass[0], //4\n", + " stardata->star[0].SN_type, //5\n", "\n", - " stardata->star[0].stellar_type, //6\n", - " stardata->previous_stardata->star[0].stellar_type, //7\n", - " stardata->model.probability, //8\n", - " stardata->previous_stardata->star[0].core_mass[ID_core(stardata->previous_stardata->star[0].stellar_type)], // 9\n", + " stardata->star[0].stellar_type, //6\n", + " stardata->previous_stardata->star[0].stellar_type, //7\n", + " stardata->model.probability, //8\n", + " stardata->previous_stardata->star[0].core_mass[ID_core(stardata->previous_stardata->star[0].stellar_type)], // 9\n", "\n", - " stardata->previous_stardata->star[0].core_mass[CORE_CO], // 10\n", - " stardata->previous_stardata->star[0].core_mass[CORE_He], // 11\n", - " stardata->star[0].fallback, // 12\n", - " stardata->star[0].fallback_mass // 13\n", - " );\n", - " }\n", + " stardata->previous_stardata->star[0].core_mass[CORE_CO], // 10\n", + " stardata->previous_stardata->star[0].core_mass[CORE_He] // 11\n", + " );\n", " };\n", " /* Kill the simulation to save time */\n", " stardata->model.max_evolution_time = stardata->model.time - stardata->model.dtm;\n", @@ -491,6 +460,14 @@ "# print (abridged) output\n", "print(\"\\n\".join(output.splitlines()[-2:]))" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "484297c0-accb-4efc-a9c8-dbd2f32b89a6", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/docs/build/doctrees/nbsphinx/notebook_luminosity_function_binaries.ipynb b/docs/build/doctrees/nbsphinx/notebook_luminosity_function_binaries.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..fb64dbcc9754aa9dc823a41ae3c52223cb2a8d9a --- /dev/null +++ b/docs/build/doctrees/nbsphinx/notebook_luminosity_function_binaries.ipynb @@ -0,0 +1,839 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bbbaafbb-fd7d-4b73-a970-93506ba35d71", + "metadata": {}, + "source": [ + "# Zero-age stellar luminosity function in binaries\n", + "\n", + "In this notebook we compute the luminosity function of the zero-age main-sequence by running a population of binary stars using binary_c. \n", + "\n", + "Before you go through this notebook, you should look at notebook_luminosity_function.ipynb which is for the - conceptually more simple - single stars.\n", + "\n", + "We start by loading in some standard Python modules and the binary_c module.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bf6b8673-a2b5-4b50-ad1b-e90671f57470", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import math\n", + "from binarycpython.utils.grid import Population\n", + "\n", + "# help(Population) # Uncomment this line to see the public functions of this object" + ] + }, + { + "cell_type": "markdown", + "id": "f268eff3-4e08-4f6b-8b59-f22dba4d2074", + "metadata": {}, + "source": [ + "## Setting up the Population object\n", + "To set up and configure the population object we need to make a new instance of the `Population` object and configure it with the `.set()` function.\n", + "\n", + "In our case, we only need to set the maximum evolution time to something short, because we care only about zero-age main sequence stars which have, by definition, age zero." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "79ab50b7-591f-4883-af09-116d1835a751", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "adding: max_evolution_time=0.1 to BSE_options\n", + "verbosity is 1\n" + ] + } + ], + "source": [ + "# Create population object\n", + "population = Population()\n", + "\n", + "# If you want verbosity, set this before other things\n", + "population.set(verbosity=1)\n", + "\n", + "# Setting values can be done via .set(<parameter_name>=<value>)\n", + "# Values that are known to be binary_c_parameters are loaded into bse_options.\n", + "# Those that are present in the default grid_options are set in grid_options\n", + "# All other values that you set are put in a custom_options dict\n", + "population.set(\n", + " # binary_c physics options\n", + " max_evolution_time=0.1, # maximum stellar evolution time in Myr\n", + " )\n", + "\n", + "# We can access the options through \n", + "print(\"verbosity is\", population.grid_options['verbosity'])" + ] + }, + { + "cell_type": "markdown", + "id": "f9a65554-36ab-4a04-96ca-9f1422c307fd", + "metadata": {}, + "source": [ + "## Adding grid variables\n", + "The main purpose of the Population object is to handle the population synthesis side of running a set of stars. The main method to do this with binarycpython, as is the case with Perl binarygrid, is to use grid variables. These are loops over a predefined range of values, where a probability will be assigned to the systems based on the chosen probability distributions.\n", + "\n", + "Usually we use either 1 mass grid variable, or a trio of mass, mass ratio and period (other notebooks cover these examples). We can, however, also add grid sampling for e.g. eccentricity, metallicity or other parameters. \n", + "\n", + "To add a grid variable to the population object we use `population.add_grid_variable`" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "68c84521-9ae8-4020-af7a-5334173db969", + "metadata": {}, + "outputs": [], + "source": [ + "# help(population.add_grid_variable)" + ] + }, + { + "cell_type": "markdown", + "id": "bd75cebe-2152-4025-b680-dc020b80889b", + "metadata": {}, + "source": [ + "All the distribution functions that we can use are stored in the `binarycpython.utils.distribution_functions` or `binarycpython/utils/distribution_functions.py` on git. If you uncomment the help statement below you can see which functions are available now:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "048db541-3e92-4c5d-a25c-9c5a34b9c857", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "import binarycpython.utils.distribution_functions\n", + "# help(binarycpython.utils.distribution_functions)" + ] + }, + { + "cell_type": "markdown", + "id": "2a9104fc-4136-4e53-8604-f24ad52fbe56", + "metadata": {}, + "source": [ + "First let us set up some global variables that will be useful throughout. \n", + "* The resolution is the number of stars we simulate in our model population.\n", + "* The massrange is a list of the min and max masses\n", + "* The total_probability is the theoretical integral of a probability density function, i.e. 1.0.\n", + "* The binwidth sets the resolution of the final distribution. If set to 0.5, the bins in log*L* are 0.5dex wide." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "aba3fe4e-18f2-4bb9-8e5c-4c6007ab038b", + "metadata": {}, + "outputs": [], + "source": [ + "# Set resolution and mass range that we simulate\n", + "resolution = {\"M_1\": 40} # start with resolution = 10, and increase later if you want \"more accurate\" data\n", + "massrange = (0.07, 100.0) # we work with stars of mass 0.07 to 100 Msun\n", + "total_probability = 1.0 # theoretical integral of the mass probability density function over all masses \n", + "# distribution binwidths : \n", + "# (log10) luminosity distribution\n", + "binwidth = { 'luminosity' : 1.0 }" + ] + }, + { + "cell_type": "markdown", + "id": "1b3a007b-5c17-42a7-a981-7e268e6f545c", + "metadata": {}, + "source": [ + "The next cell contains an example of adding the mass grid variable, sampling the phase space in linear mass *M*_1." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "47979841-2c26-4b26-8945-603d013dc93a", + "metadata": {}, + "outputs": [], + "source": [ + "# Set up the binary grid in \"cubic\" M1 - M2=q*M1 - log10 period space\n", + "\n", + "population = Population()\n", + "\n", + "# resolution on each side of the cube, with more stars for the primary mass\n", + "nres = 10\n", + "resolution = {\"M_1\": 2*nres,\n", + " \"q\": nres,\n", + " \"per\": nres}\n", + "\n", + "massrange = [0.07,100]\n", + "logperrange = [0.15, 5.5]\n", + "\n", + "population.add_grid_variable(\n", + " name=\"lnm1\",\n", + " longname=\"Primary mass\",\n", + " valuerange=massrange,\n", + " resolution=\"{}\".format(resolution[\"M_1\"]),\n", + " spacingfunc=\"const(math.log({min}), math.log({max}), {res})\".format(min=massrange[0],max=massrange[1],res=resolution[\"M_1\"]),\n", + " precode=\"M_1=math.exp(lnm1)\",\n", + " probdist=\"three_part_powerlaw(M_1, 0.1, 0.5, 1.0, 150, -1.3, -2.3, -2.3)*M_1\",\n", + " dphasevol=\"dlnm1\",\n", + " parameter_name=\"M_1\",\n", + " condition=\"\", # Impose a condition on this grid variable. Mostly for a check for yourself\n", + ")\n", + "\n", + "# Mass ratio\n", + "population.add_grid_variable(\n", + " name=\"q\",\n", + " longname=\"Mass ratio\",\n", + " valuerange=[\"0.1/M_1\", 1],\n", + " resolution=\"{}\".format(resolution['q']),\n", + " spacingfunc=\"const({}/M_1, 1, {})\".format(massrange[0],resolution['q']),\n", + " probdist=\"flatsections(q, [{{'min': {}/M_1, 'max': 1.0, 'height': 1}}])\".format(massrange[0]),\n", + " dphasevol=\"dq\",\n", + " precode=\"M_2 = q * M_1\",\n", + " parameter_name=\"M_2\",\n", + " condition=\"\", # Impose a condition on this grid variable. Mostly for a check for yourself\n", + " )\n", + "\n", + "# Orbital period\n", + "population.add_grid_variable(\n", + " name=\"log10per\", # in days\n", + " longname=\"log10(Orbital_Period)\",\n", + " valuerange=[0.15, 5.5],\n", + " resolution=\"{}\".format(resolution[\"per\"]),\n", + " spacingfunc=\"const({}, {}, {})\".format(logperrange[0],logperrange[1],resolution[\"per\"]),\n", + " precode=\"\"\"orbital_period = 10.0 ** log10per\n", + "sep = calc_sep_from_period(M_1, M_2, orbital_period)\n", + "sep_min = calc_sep_from_period(M_1, M_2, 10**{})\n", + "sep_max = calc_sep_from_period(M_1, M_2, 10**{})\"\"\".format(logperrange[0],logperrange[1]),\n", + " probdist=\"sana12(M_1, M_2, sep, orbital_period, sep_min, sep_max, math.log10(10**{}), math.log10(10**{}), {})\".format(logperrange[0],logperrange[1],-0.55),\n", + " parameter_name=\"orbital_period\",\n", + " dphasevol=\"dlog10per\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "163f13ae-fec1-4ee8-b9d4-c1b75c19ff39", + "metadata": {}, + "source": [ + "## Setting logging and handling the output\n", + "By default, binary_c will not output anything (except for 'SINGLE STAR LIFETIME'). It is up to us to determine what will be printed. We can either do that by hardcoding the print statements into `binary_c` (see documentation binary_c) or we can use the custom logging functionality of binarycpython (see notebook `notebook_custom_logging.ipynb`), which is faster to set up and requires no recompilation of binary_c, but is somewhat more limited in its functionality. For our current purposes, it works perfectly well.\n", + "\n", + "After configuring what will be printed, we need to make a function to parse the output. This can be done by setting the parse_function parameter in the population object (see also notebook `notebook_individual_systems.ipynb`). \n", + "\n", + "In the code below we will set up both the custom logging and a parse function to handle that output." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0c986215-93b1-4e30-ad79-f7c397e9ff7d", + "metadata": {}, + "outputs": [], + "source": [ + "# Create custom logging statement\n", + "#\n", + "# we check that the model number is zero, i.e. we're on the first timestep (stars are born on the ZAMS)\n", + "# we make sure that the stellar type is <= MAIN_SEQUENCE, i.e. the star is a main-sequence star\n", + "# we also check that the time is 0.0 (this is not strictly required, but good to show how it is done)\n", + "#\n", + "# The \n", + "#\n", + "# The Printf statement does the outputting: note that the header string is ZERO_AGE_MAIN_SEQUENCE_STARn\n", + "#\n", + "# where:\n", + "#\n", + "# n = PRIMARY = 0 is star 0 (primary star)\n", + "# n = SECONDARY = 1 is star 1 (secondary star)\n", + "# n = UNRESOLVED = 2 is the unresolved system (both stars added)\n", + "\n", + "PRIMARY = 0\n", + "SECONDARY = 1\n", + "UNRESOLVED = 2\n", + "\n", + "custom_logging_statement = \"\"\"\n", + "// select ZAMS\n", + "if(stardata->model.model_number == 0 &&\n", + " stardata->model.time == 0)\n", + "{\n", + " // loop over the stars individually (equivalent to a resolved binary) \n", + " Foreach_star(star)\n", + " {\n", + " // select main-sequence stars\n", + " if(star->stellar_type <= MAIN_SEQUENCE)\n", + " {\n", + " /* Note that we use Printf - with a capital P! */\n", + " Printf(\"ZERO_AGE_MAIN_SEQUENCE_STAR%d %30.12e %g %g %g %g\\\\n\",\n", + " star->starnum,\n", + " stardata->model.time, // 1\n", + " stardata->common.zero_age.mass[0], // 2\n", + " star->mass, // 3\n", + " star->luminosity, // 4\n", + " stardata->model.probability // 5\n", + " );\n", + " }\n", + " }\n", + " \n", + " // unresolved MS-MS binary\n", + " if(stardata->star[0].stellar_type <= MAIN_SEQUENCE &&\n", + " stardata->star[1].stellar_type <= MAIN_SEQUENCE) \n", + " {\n", + " Printf(\"ZERO_AGE_MAIN_SEQUENCE_STAR%d %30.12e %g %g %g %g\\\\n\",\n", + " 2,\n", + " stardata->model.time, // 1\n", + " stardata->common.zero_age.mass[0] + stardata->common.zero_age.mass[1], // 2\n", + " stardata->star[0].mass + stardata->star[1].mass, // 3\n", + " stardata->star[0].luminosity + stardata->star[1].luminosity, // 4\n", + " stardata->model.probability // 5\n", + " );\n", + " }\n", + "}\n", + "\"\"\"\n", + "\n", + "population.set(\n", + " C_logging_code=custom_logging_statement\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "ae1f1f0c-1f8b-42d8-b051-cbf8c6b51514", + "metadata": {}, + "source": [ + "The parse function must now catch lines that start with \"ZERO_AGE_MAIN_SEQUENCE_STAR\" and process the associated data." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "fd197154-a8ce-4865-8929-008d3483101a", + "metadata": {}, + "outputs": [], + "source": [ + "# import the bin_data function so we can construct finite-resolution probability distributions\n", + "# import the datalinedict to make a dictionary from each line of data from binary_c\n", + "from binarycpython.utils.functions import bin_data,datalinedict\n", + "import re\n", + "\n", + "def parse_function(self, output):\n", + " \"\"\"\n", + " Example parse function\n", + " \"\"\"\n", + " \n", + " # list of the data items\n", + " parameters = [\"header\", \"time\", \"zams_mass\", \"mass\", \"luminosity\", \"probability\"]\n", + " \n", + " # Loop over the output.\n", + " for line in output.splitlines():\n", + " \n", + " # check if we match a ZERO_AGE_MAIN_SEQUENCE_STAR\n", + " match = re.search('ZERO_AGE_MAIN_SEQUENCE_STAR(\\d)',line) \n", + " if match:\n", + " nstar = match.group(1) \n", + " #print(\"matched star\",nstar)\n", + "\n", + " # obtain the line of data in dictionary form \n", + " linedata = datalinedict(line,parameters)\n", + "\n", + " # bin the log10(luminosity) to the nearest 0.1dex\n", + " binned_log_luminosity = bin_data(math.log10(linedata['luminosity']),\n", + " binwidth['luminosity'])\n", + " \n", + " # append the data to the results_dictionary \n", + " self.grid_results['luminosity distribution'][int(nstar)][binned_log_luminosity] += linedata['probability'] \n", + " \n", + " #print (self.grid_results)\n", + " \n", + " # verbose reporting\n", + " #print(\"parse out results_dictionary=\",self.grid_results)\n", + " \n", + "# Add the parsing function\n", + "population.set(\n", + " parse_function=parse_function,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "91509ce5-ffe7-4937-aa87-6d7baac9ac04", + "metadata": {}, + "source": [ + "## Evolving the grid\n", + "Now that we configured all the main parts of the population object, we can actually run the population! Doing this is straightforward: `population.evolve()`\n", + "\n", + "This will start up the processing of all the systems. We can control how many cores are used by settings `amt_cores`. By setting the `verbosity` of the population object to a higher value we can get a lot of verbose information about the run, but for now we will set it to 0.\n", + "\n", + "There are many grid_options that can lead to different behaviour of the evolution of the grid. Please do have a look at those: [grid options docs](https://ri0005.pages.surrey.ac.uk/binary_c-python/grid_options_descriptions.html), and try " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8ea376c1-1e92-45af-8cab-9d7fdca564eb", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "adding: amt_cores=4 to grid_options\n", + "Running the population now, this may take a little while...\n", + "Creating and loading custom logging functionality\n", + "Generating grid code\n", + "Generating grid code\n", + "Constructing/adding: lnm1\n", + "Constructing/adding: q\n", + "Constructing/adding: log10per\n", + "Saving grid code to grid_options\n", + "Writing grid code to /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Loading grid code function from /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Grid code loaded\n", + "Grid has handled 2000 stars\n", + "with a total probability of 0.6495098935846658\n", + "Total starcount for this run will be: 2000\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:14:08,077 DEBUG Process-2] --- Setting up processor: process-0[2021-09-10 15:14:08,080 DEBUG Process-3] --- Setting up processor: process-1[2021-09-10 15:14:08,086 DEBUG MainProcess] --- setting up the system_queue_filler now\n", + "\n", + "[2021-09-10 15:14:08,084 DEBUG Process-4] --- Setting up processor: process-2\n", + "\n", + "[2021-09-10 15:14:08,117 DEBUG Process-5] --- Setting up processor: process-3" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 1 started at 2021-09-10T15:14:08.119437.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff53810>Process 0 started at 2021-09-10T15:14:08.126435.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff539f0>\n", + "Process 2 started at 2021-09-10T15:14:08.138353.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff539f0>" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "Process 3 started at 2021-09-10T15:14:08.186492.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff53810>\n", + "Generating grid code\n", + "Generating grid code\n", + "Constructing/adding: lnm1\n", + "Constructing/adding: q\n", + "Constructing/adding: log10per\n", + "Saving grid code to grid_options\n", + "Writing grid code to /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Loading grid code function from /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Grid code loaded\n", + "624/2000 31.2% complete 15:14:12 ETA= 11.1s tpr=8.05e-03 ETF=15:14:23 mem:800.5MB625/2000 31.2% complete 15:14:12 ETA= 11.1s tpr=8.04e-03 ETF=15:14:23 mem:800.5MB\n", + "626/2000 31.3% complete 15:14:12 ETA= 11.1s tpr=8.05e-03 ETF=15:14:23 mem:800.5MB\n", + "\n", + "713/2000 35.6% complete 15:14:17 ETA= 1.3m tpr=6.00e-02 ETF=15:15:34 mem:547.8MB\n", + "728/2000 36.4% complete 15:14:22 ETA= 7.1m tpr=3.37e-01 ETF=15:21:30 mem:548.1MB\n", + "743/2000 37.1% complete 15:14:27 ETA= 7.0m tpr=3.34e-01 ETF=15:21:26 mem:549.5MB\n", + "759/2000 38.0% complete 15:14:33 ETA= 7.7m tpr=3.73e-01 ETF=15:22:16 mem:550.5MB\n", + "774/2000 38.7% complete 15:14:38 ETA= 6.9m tpr=3.35e-01 ETF=15:21:29 mem:551.1MB\n", + "787/2000 39.4% complete 15:14:43 ETA= 7.8m tpr=3.88e-01 ETF=15:22:33 mem:551.1MB\n", + "799/2000 40.0% complete 15:14:48 ETA= 8.5m tpr=4.24e-01 ETF=15:23:17 mem:552.5MB\n", + "812/2000 40.6% complete 15:14:54 ETA= 8.4m tpr=4.23e-01 ETF=15:23:16 mem:554.8MB\n", + "830/2000 41.5% complete 15:14:59 ETA= 5.5m tpr=2.80e-01 ETF=15:20:26 mem:555.2MB\n", + "847/2000 42.4% complete 15:15:05 ETA= 6.8m tpr=3.52e-01 ETF=15:21:50 mem:555.2MB\n", + "864/2000 43.2% complete 15:15:10 ETA= 6.2m tpr=3.28e-01 ETF=15:21:23 mem:557.0MB\n", + "876/2000 43.8% complete 15:15:15 ETA= 8.2m tpr=4.38e-01 ETF=15:23:27 mem:559.7MB\n", + "887/2000 44.4% complete 15:15:21 ETA= 9.2m tpr=4.95e-01 ETF=15:24:32 mem:560.5MB\n", + "898/2000 44.9% complete 15:15:26 ETA= 9.2m tpr=4.99e-01 ETF=15:24:37 mem:560.5MB\n", + "908/2000 45.4% complete 15:15:32 ETA= 9.5m tpr=5.23e-01 ETF=15:25:03 mem:560.5MB\n", + "919/2000 46.0% complete 15:15:37 ETA= 8.3m tpr=4.60e-01 ETF=15:23:54 mem:560.9MB\n", + "934/2000 46.7% complete 15:15:42 ETA= 6.4m tpr=3.60e-01 ETF=15:22:06 mem:561.7MB\n", + "947/2000 47.4% complete 15:15:47 ETA= 7.2m tpr=4.08e-01 ETF=15:22:57 mem:561.7MB\n", + "956/2000 47.8% complete 15:15:53 ETA= 11.1m tpr=6.39e-01 ETF=15:27:01 mem:561.7MB\n", + "963/2000 48.1% complete 15:15:58 ETA= 12.6m tpr=7.30e-01 ETF=15:28:35 mem:561.7MB\n", + "969/2000 48.5% complete 15:16:04 ETA= 15.2m tpr=8.85e-01 ETF=15:31:16 mem:561.9MB\n", + "979/2000 49.0% complete 15:16:11 ETA= 11.9m tpr=7.01e-01 ETF=15:28:06 mem:562.0MB\n", + "988/2000 49.4% complete 15:16:16 ETA= 9.7m tpr=5.76e-01 ETF=15:25:59 mem:562.0MB\n", + "995/2000 49.8% complete 15:16:21 ETA= 12.3m tpr=7.37e-01 ETF=15:28:42 mem:562.2MB\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:16:25,175 DEBUG MainProcess] --- Signaling stop to processes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1003/2000 50.1% complete 15:16:26 ETA= 11.2m tpr=6.76e-01 ETF=15:27:40 mem:563.0MB\n", + "1015/2000 50.8% complete 15:16:32 ETA= 7.6m tpr=4.65e-01 ETF=15:24:10 mem:563.0MB\n", + "1025/2000 51.2% complete 15:16:37 ETA= 8.1m tpr=5.01e-01 ETF=15:24:45 mem:563.0MB\n", + "1033/2000 51.6% complete 15:16:42 ETA= 10.7m tpr=6.65e-01 ETF=15:27:26 mem:563.0MB\n", + "1040/2000 52.0% complete 15:16:47 ETA= 12.1m tpr=7.55e-01 ETF=15:28:52 mem:563.5MB\n", + "1048/2000 52.4% complete 15:16:53 ETA= 11.8m tpr=7.45e-01 ETF=15:28:42 mem:563.5MB\n", + "1057/2000 52.9% complete 15:16:59 ETA= 9.1m tpr=5.78e-01 ETF=15:26:03 mem:563.6MB\n", + "1062/2000 53.1% complete 15:17:04 ETA= 15.7m tpr=1.01e+00 ETF=15:32:47 mem:564.4MB\n", + "1069/2000 53.5% complete 15:17:09 ETA= 12.4m tpr=7.97e-01 ETF=15:29:31 mem:564.9MB\n", + "1077/2000 53.9% complete 15:17:15 ETA= 11.5m tpr=7.46e-01 ETF=15:28:44 mem:565.0MB\n", + "1085/2000 54.2% complete 15:17:20 ETA= 10.0m tpr=6.55e-01 ETF=15:27:20 mem:565.0MB\n", + "1091/2000 54.5% complete 15:17:26 ETA= 13.8m tpr=9.10e-01 ETF=15:31:13 mem:565.9MB\n", + "1099/2000 55.0% complete 15:17:32 ETA= 12.1m tpr=8.05e-01 ETF=15:29:37 mem:566.5MB\n", + "1114/2000 55.7% complete 15:17:37 ETA= 5.0m tpr=3.35e-01 ETF=15:22:34 mem:566.5MB\n", + "1126/2000 56.3% complete 15:17:43 ETA= 6.8m tpr=4.64e-01 ETF=15:24:29 mem:566.5MB\n", + "1134/2000 56.7% complete 15:17:48 ETA= 9.2m tpr=6.37e-01 ETF=15:27:00 mem:566.6MB\n", + "1139/2000 57.0% complete 15:17:54 ETA= 16.3m tpr=1.14e+00 ETF=15:34:13 mem:567.4MB\n", + "1148/2000 57.4% complete 15:17:59 ETA= 8.8m tpr=6.20e-01 ETF=15:26:47 mem:567.4MB\n", + "1156/2000 57.8% complete 15:18:05 ETA= 9.3m tpr=6.60e-01 ETF=15:27:22 mem:567.5MB\n", + "1162/2000 58.1% complete 15:18:11 ETA= 14.3m tpr=1.02e+00 ETF=15:32:28 mem:567.6MB\n", + "1168/2000 58.4% complete 15:18:17 ETA= 15.2m tpr=1.09e+00 ETF=15:33:27 mem:568.6MB\n", + "1177/2000 58.9% complete 15:18:23 ETA= 8.8m tpr=6.45e-01 ETF=15:27:14 mem:568.6MB\n", + "1181/2000 59.0% complete 15:18:28 ETA= 17.8m tpr=1.30e+00 ETF=15:36:16 mem:568.7MB\n", + "1187/2000 59.4% complete 15:18:34 ETA= 12.1m tpr=8.93e-01 ETF=15:30:40 mem:568.7MB\n", + "1194/2000 59.7% complete 15:18:39 ETA= 9.8m tpr=7.29e-01 ETF=15:28:26 mem:568.8MB\n", + "1202/2000 60.1% complete 15:18:44 ETA= 9.5m tpr=7.12e-01 ETF=15:28:12 mem:568.8MB\n", + "1219/2000 61.0% complete 15:18:51 ETA= 5.3m tpr=4.07e-01 ETF=15:24:09 mem:569.7MB\n", + "1228/2000 61.4% complete 15:18:57 ETA= 7.4m tpr=5.76e-01 ETF=15:26:21 mem:569.7MB\n", + "1234/2000 61.7% complete 15:19:02 ETA= 11.8m tpr=9.22e-01 ETF=15:30:48 mem:571.7MB1235/2000 61.8% complete 15:19:02 ETA= 10.1m tpr=7.92e-01 ETF=15:29:08 mem:571.7MB\n", + "\n", + "1243/2000 62.1% complete 15:19:07 ETA= 7.3m tpr=5.79e-01 ETF=15:26:26 mem:573.4MB\n", + "1251/2000 62.5% complete 15:19:13 ETA= 8.3m tpr=6.68e-01 ETF=15:27:33 mem:575.4MB\n", + "1260/2000 63.0% complete 15:19:19 ETA= 8.2m tpr=6.65e-01 ETF=15:27:31 mem:575.4MB\n", + "1268/2000 63.4% complete 15:19:24 ETA= 7.8m tpr=6.41e-01 ETF=15:27:13 mem:576.8MB\n", + "1276/2000 63.8% complete 15:19:29 ETA= 7.6m tpr=6.30e-01 ETF=15:27:05 mem:577.0MB\n", + "1282/2000 64.1% complete 15:19:34 ETA= 10.1m tpr=8.44e-01 ETF=15:29:40 mem:578.0MB\n", + "1289/2000 64.5% complete 15:19:40 ETA= 10.8m tpr=9.08e-01 ETF=15:30:26 mem:578.0MB\n", + "1295/2000 64.8% complete 15:19:46 ETA= 10.5m tpr=8.95e-01 ETF=15:30:16 mem:578.1MB\n", + "1309/2000 65.5% complete 15:19:51 ETA= 4.3m tpr=3.70e-01 ETF=15:24:06 mem:578.1MB\n", + "1323/2000 66.2% complete 15:19:58 ETA= 6.1m tpr=5.45e-01 ETF=15:26:07 mem:579.2MB\n", + "1332/2000 66.6% complete 15:20:03 ETA= 6.2m tpr=5.58e-01 ETF=15:26:16 mem:579.3MB\n", + "1338/2000 66.9% complete 15:20:09 ETA= 10.1m tpr=9.11e-01 ETF=15:30:12 mem:579.3MB\n", + "1346/2000 67.3% complete 15:20:18 ETA= 12.5m tpr=1.14e+00 ETF=15:32:46 mem:581.5MB\n", + "1355/2000 67.8% complete 15:20:25 ETA= 8.5m tpr=7.90e-01 ETF=15:28:54 mem:581.6MB\n", + "1359/2000 68.0% complete 15:20:30 ETA= 13.9m tpr=1.30e+00 ETF=15:34:26 mem:581.6MB\n", + "1366/2000 68.3% complete 15:20:38 ETA= 11.7m tpr=1.10e+00 ETF=15:32:18 mem:581.7MB\n", + "1376/2000 68.8% complete 15:20:44 ETA= 6.1m tpr=5.89e-01 ETF=15:26:51 mem:581.7MB\n", + "1384/2000 69.2% complete 15:20:49 ETA= 6.9m tpr=6.76e-01 ETF=15:27:46 mem:581.7MB\n", + "1393/2000 69.7% complete 15:20:55 ETA= 6.2m tpr=6.13e-01 ETF=15:27:07 mem:581.8MB1394/2000 69.7% complete 15:20:55 ETA= 5.6m tpr=5.52e-01 ETF=15:26:29 mem:581.8MB\n", + "\n", + "1423/2000 71.2% complete 15:21:00 ETA= 1.6m tpr=1.69e-01 ETF=15:22:37 mem:581.9MB\n", + "1435/2000 71.8% complete 15:21:07 ETA= 5.6m tpr=5.92e-01 ETF=15:26:42 mem:582.3MB\n", + "1443/2000 72.2% complete 15:21:12 ETA= 6.1m tpr=6.54e-01 ETF=15:27:17 mem:582.5MB\n", + "1445/2000 72.2% complete 15:21:18 ETA= 28.2m tpr=3.05e+00 ETF=15:49:28 mem:582.6MB\n", + "1448/2000 72.4% complete 15:21:25 ETA= 20.0m tpr=2.18e+00 ETF=15:41:27 mem:582.6MB\n", + "1454/2000 72.7% complete 15:21:31 ETA= 8.6m tpr=9.49e-01 ETF=15:30:09 mem:583.0MB\n", + "1455/2000 72.8% complete 15:21:37 ETA= 54.9m tpr=6.05e+00 ETF=16:16:32 mem:583.0MB\n", + "1459/2000 73.0% complete 15:21:43 ETA= 13.5m tpr=1.50e+00 ETF=15:35:12 mem:583.0MB\n", + "1465/2000 73.2% complete 15:21:48 ETA= 8.6m tpr=9.65e-01 ETF=15:30:25 mem:583.0MB\n", + "1474/2000 73.7% complete 15:21:54 ETA= 5.6m tpr=6.38e-01 ETF=15:27:30 mem:583.0MB\n", + "1482/2000 74.1% complete 15:21:59 ETA= 5.4m tpr=6.30e-01 ETF=15:27:26 mem:583.0MB\n", + "1485/2000 74.2% complete 15:22:04 ETA= 14.8m tpr=1.73e+00 ETF=15:36:54 mem:583.5MB\n", + "1487/2000 74.3% complete 15:22:10 ETA= 24.9m tpr=2.91e+00 ETF=15:47:02 mem:583.5MB\n", + "1496/2000 74.8% complete 15:22:16 ETA= 5.0m tpr=5.91e-01 ETF=15:27:13 mem:583.7MB\n", + "1509/2000 75.5% complete 15:22:21 ETA= 3.6m tpr=4.40e-01 ETF=15:25:57 mem:583.9MB\n", + "1523/2000 76.2% complete 15:22:27 ETA= 3.0m tpr=3.80e-01 ETF=15:25:28 mem:583.9MB\n", + "1531/2000 76.5% complete 15:22:33 ETA= 5.9m tpr=7.60e-01 ETF=15:28:29 mem:583.9MB\n", + "1537/2000 76.8% complete 15:22:38 ETA= 6.7m tpr=8.71e-01 ETF=15:29:21 mem:583.9MB\n", + "1545/2000 77.2% complete 15:22:44 ETA= 5.4m tpr=7.14e-01 ETF=15:28:08 mem:584.0MB\n", + "1555/2000 77.8% complete 15:22:49 ETA= 4.1m tpr=5.52e-01 ETF=15:26:55 mem:584.2MB\n", + "1564/2000 78.2% complete 15:22:54 ETA= 4.2m tpr=5.78e-01 ETF=15:27:06 mem:584.2MB\n", + "1574/2000 78.7% complete 15:23:00 ETA= 4.4m tpr=6.16e-01 ETF=15:27:23 mem:584.4MB\n", + "1584/2000 79.2% complete 15:23:07 ETA= 4.4m tpr=6.28e-01 ETF=15:27:28 mem:584.8MB\n", + "1594/2000 79.7% complete 15:23:12 ETA= 3.8m tpr=5.66e-01 ETF=15:27:02 mem:584.9MB\n", + "1607/2000 80.3% complete 15:23:17 ETA= 2.5m tpr=3.86e-01 ETF=15:25:49 mem:585.0MB\n", + "1618/2000 80.9% complete 15:23:24 ETA= 3.8m tpr=5.97e-01 ETF=15:27:12 mem:585.4MB\n", + "1628/2000 81.4% complete 15:23:29 ETA= 3.3m tpr=5.28e-01 ETF=15:26:46 mem:585.5MB\n", + "1635/2000 81.8% complete 15:23:34 ETA= 4.4m tpr=7.30e-01 ETF=15:28:01 mem:585.9MB\n", + "1645/2000 82.2% complete 15:23:40 ETA= 3.4m tpr=5.81e-01 ETF=15:27:06 mem:585.9MB\n", + "1655/2000 82.8% complete 15:23:47 ETA= 4.0m tpr=7.02e-01 ETF=15:27:49 mem:586.0MB1656/2000 82.8% complete 15:23:47 ETA= 3.7m tpr=6.39e-01 ETF=15:27:27 mem:586.0MB\n", + "\n", + "1664/2000 83.2% complete 15:23:54 ETA= 4.5m tpr=8.01e-01 ETF=15:28:23 mem:586.1MB\n", + "1674/2000 83.7% complete 15:24:02 ETA= 4.5m tpr=8.27e-01 ETF=15:28:31 mem:586.2MB\n", + "1684/2000 84.2% complete 15:24:07 ETA= 2.9m tpr=5.55e-01 ETF=15:27:03 mem:586.2MB\n", + "1691/2000 84.5% complete 15:24:13 ETA= 4.2m tpr=8.21e-01 ETF=15:28:27 mem:586.5MB\n", + "1699/2000 85.0% complete 15:24:19 ETA= 3.4m tpr=6.75e-01 ETF=15:27:42 mem:586.5MB\n", + "1713/2000 85.7% complete 15:24:24 ETA= 1.9m tpr=4.07e-01 ETF=15:26:21 mem:586.6MB\n", + "1725/2000 86.2% complete 15:24:31 ETA= 2.6m tpr=5.57e-01 ETF=15:27:04 mem:586.7MB\n", + "1735/2000 86.8% complete 15:24:38 ETA= 3.0m tpr=6.76e-01 ETF=15:27:37 mem:586.7MB\n", + "1745/2000 87.2% complete 15:24:44 ETA= 2.7m tpr=6.40e-01 ETF=15:27:27 mem:586.9MB\n", + "1755/2000 87.8% complete 15:24:51 ETA= 2.8m tpr=6.88e-01 ETF=15:27:40 mem:586.9MB\n", + "1763/2000 88.2% complete 15:24:56 ETA= 2.6m tpr=6.59e-01 ETF=15:27:32 mem:586.9MB\n", + "1767/2000 88.3% complete 15:25:02 ETA= 5.3m tpr=1.36e+00 ETF=15:30:18 mem:586.9MB\n", + "1776/2000 88.8% complete 15:25:09 ETA= 2.9m tpr=7.71e-01 ETF=15:28:01 mem:586.9MB\n", + "1785/2000 89.2% complete 15:25:14 ETA= 2.1m tpr=5.90e-01 ETF=15:27:21 mem:586.9MB\n", + "1793/2000 89.7% complete 15:25:19 ETA= 2.2m tpr=6.29e-01 ETF=15:27:29 mem:587.1MB\n", + "1801/2000 90.0% complete 15:25:24 ETA= 2.2m tpr=6.59e-01 ETF=15:27:35 mem:587.1MB\n", + "1812/2000 90.6% complete 15:25:29 ETA= 1.5m tpr=4.68e-01 ETF=15:26:57 mem:587.1MB\n", + "1822/2000 91.1% complete 15:25:35 ETA= 1.6m tpr=5.54e-01 ETF=15:27:14 mem:587.4MB\n", + "1830/2000 91.5% complete 15:25:41 ETA= 2.1m tpr=7.49e-01 ETF=15:27:48 mem:587.4MB\n", + "1839/2000 92.0% complete 15:25:47 ETA= 1.7m tpr=6.21e-01 ETF=15:27:27 mem:587.4MB\n", + "1847/2000 92.3% complete 15:25:52 ETA= 1.8m tpr=7.10e-01 ETF=15:27:41 mem:587.4MB\n", + "1855/2000 92.8% complete 15:25:59 ETA= 2.0m tpr=8.17e-01 ETF=15:27:57 mem:587.6MB\n", + "1864/2000 93.2% complete 15:26:05 ETA= 1.5m tpr=6.79e-01 ETF=15:27:37 mem:587.8MB\n", + "1873/2000 93.7% complete 15:26:10 ETA= 1.3m tpr=6.07e-01 ETF=15:27:27 mem:588.0MB\n", + "1884/2000 94.2% complete 15:26:16 ETA= 57.0s tpr=4.91e-01 ETF=15:27:13 mem:588.1MB\n", + "1895/2000 94.8% complete 15:26:21 ETA= 48.7s tpr=4.63e-01 ETF=15:27:09 mem:588.8MB\n", + "1907/2000 95.3% complete 15:26:27 ETA= 45.6s tpr=4.91e-01 ETF=15:27:12 mem:588.9MB\n", + "1916/2000 95.8% complete 15:26:33 ETA= 57.5s tpr=6.84e-01 ETF=15:27:30 mem:589.1MB\n", + "1926/2000 96.3% complete 15:26:39 ETA= 46.5s tpr=6.28e-01 ETF=15:27:26 mem:589.1MB\n", + "1936/2000 96.8% complete 15:26:46 ETA= 42.0s tpr=6.57e-01 ETF=15:27:28 mem:589.1MB\n", + "1946/2000 97.3% complete 15:26:53 ETA= 40.1s tpr=7.42e-01 ETF=15:27:33 mem:589.2MB\n", + "1956/2000 97.8% complete 15:26:59 ETA= 25.1s tpr=5.70e-01 ETF=15:27:24 mem:589.2MB\n", + "1966/2000 98.3% complete 15:27:04 ETA= 19.1s tpr=5.62e-01 ETF=15:27:24 mem:589.5MB\n", + "1976/2000 98.8% complete 15:27:10 ETA= 14.4s tpr=6.01e-01 ETF=15:27:25 mem:589.5MB\n", + "1987/2000 99.3% complete 15:27:16 ETA= 6.4s tpr=4.92e-01 ETF=15:27:22 mem:589.5MB\n", + "1998/2000 99.9% complete 15:27:21 ETA= 1.0s tpr=4.85e-01 ETF=15:27:22 mem:589.6MB\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,382 DEBUG Process-5] --- Process-3 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 3 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.117391, done at 2021-09-10T15:27:22.400722 (total: 794.283331s of which 792.6935975551605s interfacing with binary_c).\n", + "\tRan 499 systems with a total probability of 0.17005450973840136.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,435 DEBUG Process-5] --- Process-3 is finished.\n", + "[2021-09-10 15:27:22,480 DEBUG Process-3] --- Process-1 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 1 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.080367, done at 2021-09-10T15:27:22.505288 (total: 794.424921s of which 793.1943278312683s interfacing with binary_c).\n", + "\tRan 474 systems with a total probability of 0.15740832333567983.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,531 DEBUG Process-3] --- Process-1 is finished.\n", + "[2021-09-10 15:27:22,846 DEBUG Process-2] --- Process-0 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 0 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.077117, done at 2021-09-10T15:27:22.851971 (total: 794.774854s of which 793.4976091384888s interfacing with binary_c).\n", + "\tRan 507 systems with a total probability of 0.16018641159091498.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,872 DEBUG Process-2] --- Process-0 is finished.\n", + "[2021-09-10 15:27:22,976 DEBUG Process-4] --- Process-2 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 2 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.084369, done at 2021-09-10T15:27:22.981706 (total: 794.897337s of which 793.4600214958191s interfacing with binary_c).\n", + "\tRan 520 systems with a total probability of 0.1618606489196724.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,986 DEBUG Process-4] --- Process-2 is finished.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Population-0fa295ee5c76444bace8fd0ee17a3e11 finished! The total probability was: 0.6495098935846686. It took a total of 795.1383104324341s to run 2000 systems on 4 cores\n", + "There were no errors found in this run.\n", + "Done population run!\n" + ] + } + ], + "source": [ + "# set number of threads\n", + "population.set(\n", + " # verbose output is not required \n", + " verbosity=1,\n", + " # set number of threads (i.e. number of CPU cores we use)\n", + " amt_cores=4,\n", + " )\n", + "\n", + "# Evolve the population - this is the slow, number-crunching step\n", + "print(\"Running the population now, this may take a little while...\")\n", + "analytics = population.evolve() \n", + "print(\"Done population run!\")\n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "markdown", + "id": "91ab45c7-7d31-4543-aee4-127ab58e891f", + "metadata": {}, + "source": [ + "After the run is complete, some technical report on the run is returned. I stored that in `analytics`. As we can see below, this dictionary is like a status report of the evolution. Useful for e.g. debugging." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e1f0464b-0424-4022-b34b-5b744bc2c59d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'population_name': '0fa295ee5c76444bace8fd0ee17a3e11', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 0.6495098935846686, 'total_count': 2000, 'start_timestamp': 1631283248.057525, 'end_timestamp': 1631284043.1958354, 'total_mass_run': 41112.220964392276, 'total_probability_weighted_mass_run': 0.6452116023479681, 'zero_prob_stars_skipped': 0}\n" + ] + } + ], + "source": [ + "print(analytics)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "05c6d132-abee-423e-b1a8-2039c8996fbc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[None]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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p9///vdq2bKlJKlFixbavn274VSIBLNnz1aPHj1Uq1YtJSQkaMiQIZoyZYrpWIggWVlZuuWWW+TxeOR2u9WkSRNt27bNdCxEmIKCAj3xxBO66qqrTEdBBPrkk080fPhw1a5dW263W0888YQ6dOhgOhYiSDAYVCgUUllZmQKBgAKBgLxer+lYMYMB0//YvHmz6tatqwceeEBnnXWWbrjhBrndbtOxEGFmzJih8vJyDR061HQURCCPx6Ozzz5bkhQKhTR+/HgNHDjQcCpEgl27dikrK6vycnZ2tnbu3GkwESJNs2bN1LFjR0nShg0b9NFHH6l///5mQyHi3HnnnbrxxhuVkpJiOgoi0MaNGxUMBnX55ZfrrLPO0muvvabU1FTTsRBBkpKS9Pvf/17Dhg1Tv379lJubq86dO5uOFTNcpgOY8vHHH+vBBx884rqGDRtq+fLluv7663X77bfrrbfe0i233KJXXnnFUErY2U89hxo3bqzi4mK99NJLZkIhohztOfTSSy/J5/PplltuUSAQ0JVXXmkoISJJOBz+0XWWZRlIgki3Zs0aXXnllbr55pvVqFEj03EQQd566y3VqVNHPXv21Lvvvms6DiJQMBjU/Pnz9corryghIUHXXHONJk6cqHPPPdd0NESIlStX6p133tGnn36q5ORk/elPf9K//vUv/fa3vzUdLSZY4Z/6jTRGbdq0Seecc44WLFgg6UB/s0ePHlq8eLHhZIgUb731lv75z38qMTFR0oEfcC1bttSrr76qpKQkw+kQKUpKSnT11VerVq1aeuyxx+TxeExHQgSYOHGi5s+fr/vvv1+S9I9//EPhcFjXXXed4WSIJAsWLNANN9yg2267TWeccYbpOIgwv/nNb7R79245nU7t379fpaWlGjlypG677TbT0RAh/va3v6m4uFjjxo2TJL366qtas2aN7r77brPBEDFeeOEF7d27VzfffLMk6bPPPtNrr72m5557znCy2EBF7n80aNBAOTk5lRvJffrpp2rTpo3hVIgk5513nqZPn65JkyZp0qRJkg6cYsBwCSfiz3/+sxo2bKgnn3yS4RKOW69evTRnzhzl5+errKxM06ZNU79+/UzHQgTZvn27rr32Wj322GMMl/CLvPjii/rggw80adIk3XDDDTrttNMYLuGEnHrqqZo1a5YKCwsVDAb15Zdf8noMJ6Rly5aaPXu2SktLFQ6HNXPmTLVr1850rJgRsxW5oxk/frzuuusuPfroo0pKStJDDz1kOhKAGLJ8+XLNmDFDTZs21ciRIyUd2Evn+eefNxsMtpeTk6Mbb7xRF198sfx+v0aPHq327dubjoUI8q9//UsVFRVH/O4zduxYnX/++QZTAYglHTp00G9/+1tdcMEF8vv96t27t0aNGmU6FiJInz59tHz5cp177rlyu91q166drrjiCtOxYgYVOQAAAAAAAJwUKnIAAAAAAAA4KQyYAAAAAAAAcFIYMAEAAAAAAOCkMGACAAAAAADASWHABAAAAAAAgJPCgAkAAAAAAAAnhQETAAAAAAAATgoDJgAAEPFOO+00zZ4923QMAACAmMWACQAAoIrl5+erRYsW2rlzp+koAAAANYIBEwAAQBV47LHH9OWXX0qSVq5cqfT0dOXk5BhOdcANN9yg1atXV17esmWLOnXq9Ivuq6SkRL/97W9VXl5eVfEAAEAUYMAEAACiyrp163TRRRepa9euOuOMMzRjxozKzy1btkwjR45Up06ddMMNN+gPf/iDnnjiiZN+zEWLFmnt2rXq27evJGnFihVq2bLlSd9vVfD5fNq4caOaN29eJfeXmJioM888U08++WSV3B8AAIgODJgAAEDU8Pv9uuqqq9S7d2/Nnj1b48aN05/+9CetX79ePp9P1113nc455xzNmzdPZ555pqZPn14lj/vUU09pzJgxlZftNGCaPXu2evbsWaX3OWzYME2ePFl79uyp0vsFAACRiwETAACIGosXL1ZpaamuuOIKeTwe9ezZU6eeeqo+/PBDLV68WIFAQBdffLHcbrcGDx6sdu3aVX5tUVGRRo8erU6dOh1RJ3v00Ud1wQUX6M9//rP8fv+PHrOwsFALFixQ7969K69buXKlWrVq9aPbvvHGG7rooosq/7Rv315Lliyp/PzYsWM1fvx4SQdqbC1atNDXX38t6cBKpG7dumnChAmSpOLiYl111VW66KKLNGbMGH3++ec/+T2ZMWOGBg4ceCLfxmPyer3q3LnzUR8TAADEHpfpAAAAAFVl165dql27thyOw++h1a1bVzt37tSuXbuUk5Mjy7IqP1enTp3Kj+Pi4vTcc8/pkUceqbxu5cqV2rlzp1577TU988wzmjp1qs4888wjHnPjxo3KysqSx+ORJFVUVOj7779X69atf5RvzJgxlSudZs6cqYkTJ6p9+/aSpO3btysnJ0fz5s2rvH3btm31ySefqEePHpozZ44aNmxY+blJkyapb9++uvDCCxUOh1VUVPSjxwuFQlq0aJHuvvvu4/r+HbJz5069/PLLCgQCCofDatWqlc4555wjbtOgQQN9//33J3S/AAAgerGCCQAARI3s7Gzt2LFDoVCo8rpDg5usrCzt3LlT4XD4iM8d4na7lZ6efsT9LVy4UH369JEk9e3bVwsXLvzRYzocDgWDwcrLq1evlsvlUl5e3lFz5ufn68knn9Q999xTed3UqVM1YsQINW7cWOvWrZMk5ebmatu2bQqHw/rkk080ePDgytt7vV4tWrRIe/bskWVZSklJ+dHjLF68WG3btpXT6Txqlh8KhUJ6//33deONN+rWW2/VbbfdpiZNmuizzz474nbBYPCE7hcAAEQ3BkwAACBqtG/fXnFxcXrhhRfk9/s1d+5czZw5U8OHD1fHjh3ldDo1YcIEBQIBTZ8+Xd99993P3l9hYaGSkpIkScnJydq/f/+PblO/fn3l5+eroqJC0oFVT02aNFEgEFBFRYUqKirk8/mO+Jq7775bv//9748YaM2aNUv9+vXTmWeeqSlTplRe36lTJ33zzTfKz89XZmZm5fVnn3228vLydPnll2vMmDFav379j7JNnz5dp59++nF85w5bsmSJRo4cKZfLpY8//lhbt25V+/btVVZWdsTttmzZ8rNDNAAAEFsYMAEAgKjh8Xj07LPP6osvvlCPHj10zz336JFHHlGTJk3k8Xj01FNP6e2331a3bt30/vvva8CAAZXVtp+SnJys4uJiSQf2aEpNTf3RbVJSUtSlS5fKvZJWrFihZcuWqX379pV/hg8fXnn79957T8nJyTrttNMqr9uxY4fWrFmjq6++Ws8888wRexsNHjxYDz74oE455ZQjHtftduuaa67RpEmTdMMNN+ipp576UbbZs2dXrsD6odLSUnXq1OmIP6tWrZLT6axcAfbss89q/vz5knTEaiWfz6dvv/32iH8HAAAQ29iDCQAARLyZM2dWftysWbPKjbB/qF27dpo0aVLl5fPOO0+nnnrqUe+3c+fOevHFFzVy5EjNmjVLnTt3/snbXXvttXr22WfVv39/3Xnnnbrzzjt/8nbbt2/XSy+99KN8U6ZM0a233qqhQ4dKOrDC6dCqp0aNGqlLly4aOnSoZs+eXfk1W7durdz7KSMj44jq3yETJ078yRz16tXTqlWrfvJzfr9fL7/8si655JLK79V33313xIDpgw8+0IgRI36ylgcAAGITAyYAABAz5s2bp7y8PKWlpWny5MlatWqV+vbtW/n53/3ud1qxYoW+//57jRkzRueee64yMjJ0wQUXqE6dOrrssst+8n47d+6svLw8ffHFF+rXr99RH/+f//ynCgsLdfXVV1ded80112jatGn6xz/+UXld9+7d9fHHH1deHjdu3I/ua/Xq1brxxhvl9XoVDoePOtQ6UW63W8OGDdPjjz9euZKpWbNmGj16tKQDp9d98MEHlafdAQAASJIV/qm3uwAAAKLQG2+8oSeffFJlZWWqV6+e/vjHP2rAgAGmYwEAAEQ8BkwAAAAAAAA4KWzyDQAAAAAAgJPCgAkAAAAAAAAnhQETAAAAAAAATgoDJgAAAAAAAJwUBkwAAAAAAAA4KQyYAAAAAAAAcFIYMAEAAAAAAOCkMGACAAAAAADASfl/6hNZaplFmREAAAAASUVORK5CYII=\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# make a plot of the luminosity distribution using Seaborn and Pandas\n", + "import seaborn as sns\n", + "import pandas as pd\n", + "from binarycpython.utils.functions import pad_output_distribution\n", + "\n", + "# set the figure size (for a Jupyter notebook in a web browser) \n", + "sns.set( rc = {'figure.figsize':(20,10)} )\n", + "\n", + "titles = { 0 : \"Primary\",\n", + " 1 : \"Secondary\",\n", + " 2 : \"Unresolved\" }\n", + "\n", + "# choose to plot the \n", + "# PRIMARY, SECONDARY or UNRESOLVED\n", + "nstar = UNRESOLVED\n", + "\n", + "plots = {}\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "for n in range(0,3):\n", + " pad_output_distribution(population.grid_results['luminosity distribution'][n],\n", + " binwidth['luminosity'])\n", + " plots[titles[n] + ' ZAMS luminosity distribution'] = population.grid_results['luminosity distribution'][n]\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict(plots)\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e7541ebf-fe9a-4fb0-a88e-bb318d06f9eb", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/build/doctrees/nbsphinx/notebook_luminosity_function_binaries_20_1.png b/docs/build/doctrees/nbsphinx/notebook_luminosity_function_binaries_20_1.png new file mode 100644 index 0000000000000000000000000000000000000000..fd1782b3a11abd6e0f188902b49f69eb32319f1b Binary files /dev/null and b/docs/build/doctrees/nbsphinx/notebook_luminosity_function_binaries_20_1.png differ diff --git a/docs/build/doctrees/nbsphinx/notebook_luminosity_function_single.ipynb b/docs/build/doctrees/nbsphinx/notebook_luminosity_function_single.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..fb971b34a58887a38066f2dbb3d056ff4c5dc5b6 --- /dev/null +++ b/docs/build/doctrees/nbsphinx/notebook_luminosity_function_single.ipynb @@ -0,0 +1,716 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bbbaafbb-fd7d-4b73-a970-93506ba35d71", + "metadata": { + "tags": [] + }, + "source": [ + "# Example use case: Zero-age stellar luminosity function\n", + "\n", + "In this notebook we compute the luminosity function of the zero-age main-sequence by running a population of single stars using binary_c. \n", + "\n", + "We start by loading in some standard Python modules and the binary_c module.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bf6b8673-a2b5-4b50-ad1b-e90671f57470", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import math\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from binarycpython.utils.functions import temp_dir\n", + "from binarycpython.utils.grid import Population\n", + "\n", + "TMP_DIR = temp_dir(\"notebooks\", \"notebook_luminosity\")\n", + "\n", + "# help(Population) # Uncomment this line to see the public functions of this object" + ] + }, + { + "cell_type": "markdown", + "id": "f268eff3-4e08-4f6b-8b59-f22dba4d2074", + "metadata": {}, + "source": [ + "## Setting up the Population object\n", + "To set up and configure the population object we need to make a new instance of the `Population` object and configure it with the `.set()` function.\n", + "\n", + "In our case, we only need to set the maximum evolution time to something short, because we care only about zero-age main sequence stars which have, by definition, age zero." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "79ab50b7-591f-4883-af09-116d1835a751", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "adding: tmp_dir=/tmp/binary_c_python/notebooks/notebook_luminosity to grid_options\n", + "adding: max_evolution_time=0.1 to BSE_options\n", + "verbosity is 1\n" + ] + } + ], + "source": [ + "# Create population object\n", + "population = Population()\n", + "\n", + "# If you want verbosity, set this before other things\n", + "population.set(verbosity=1)\n", + "\n", + "# Setting values can be done via .set(<parameter_name>=<value>)\n", + "# Values that are known to be binary_c_parameters are loaded into bse_options.\n", + "# Those that are present in the default grid_options are set in grid_options\n", + "# All other values that you set are put in a custom_options dict\n", + "population.set(\n", + " # binary_c physics options\n", + " max_evolution_time=0.1, # maximum stellar evolution time in Myr\n", + " tmp_dir=TMP_DIR,\n", + ")\n", + "\n", + "# We can access the options through \n", + "print(\"verbosity is\", population.grid_options['verbosity'])" + ] + }, + { + "cell_type": "markdown", + "id": "f9a65554-36ab-4a04-96ca-9f1422c307fd", + "metadata": {}, + "source": [ + "## Adding grid variables\n", + "The main purpose of the Population object is to handle the population synthesis side of running a set of stars. The main method to do this with binarycpython, as is the case with Perl binarygrid, is to use grid variables. These are loops over a predefined range of values, where a probability will be assigned to the systems based on the chosen probability distributions.\n", + "\n", + "Usually we use either 1 mass grid variable, or a trio of mass, mass ratio and period (other notebooks cover these examples). We can, however, also add grid sampling for e.g. eccentricity, metallicity or other parameters. \n", + "\n", + "To add a grid variable to the population object we use `population.add_grid_variable`" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "68c84521-9ae8-4020-af7a-5334173db969", + "metadata": {}, + "outputs": [], + "source": [ + "# help(population.add_grid_variable)" + ] + }, + { + "cell_type": "markdown", + "id": "bd75cebe-2152-4025-b680-dc020b80889b", + "metadata": {}, + "source": [ + "All the distribution functions that we can use are stored in the `binarycpython.utils.distribution_functions` or `binarycpython/utils/distribution_functions.py` on git. If you uncomment the help statement below you can see which functions are available now:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "048db541-3e92-4c5d-a25c-9c5a34b9c857", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "import binarycpython.utils.distribution_functions\n", + "# help(binarycpython.utils.distribution_functions)" + ] + }, + { + "cell_type": "markdown", + "id": "2a9104fc-4136-4e53-8604-f24ad52fbe56", + "metadata": {}, + "source": [ + "First let us set up some global variables that will be useful throughout. \n", + "* The resolution is the number of stars we simulate in our model population.\n", + "* The massrange is a list of the min and max masses\n", + "* The total_probability is the theoretical integral of a probability density function, i.e. 1.0.\n", + "* The binwidth sets the resolution of the final distribution. If set to 0.5, the bins in log*L* are 0.5dex wide." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aba3fe4e-18f2-4bb9-8e5c-4c6007ab038b", + "metadata": {}, + "outputs": [], + "source": [ + "# Set resolution and mass range that we simulate\n", + "resolution = {\"M_1\": 40} # start with resolution = 10, and increase later if you want \"more accurate\" data\n", + "massrange = (0.07, 100.0) # we work with stars of mass 0.07 to 100 Msun\n", + "total_probability = 1.0 # theoretical integral of the mass probability density function over all masses \n", + "# distribution binwidths : \n", + "# (log10) luminosity distribution\n", + "binwidth = { 'luminosity' : 0.5 }" + ] + }, + { + "cell_type": "markdown", + "id": "1b3a007b-5c17-42a7-a981-7e268e6f545c", + "metadata": {}, + "source": [ + "The next cell contains an example of adding the mass grid variable, sampling the phase space in linear mass *M*_1." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "47979841-2c26-4b26-8945-603d013dc93a", + "metadata": {}, + "outputs": [], + "source": [ + "# Mass\n", + "population = Population()\n", + "population.set(\n", + " tmp_dir=TMP_DIR,\n", + ")\n", + "population.add_grid_variable(\n", + " name=\"M_1\",\n", + " longname=\"Primary mass\",\n", + " valuerange=massrange,\n", + " resolution=\"{res}\".format(res = resolution[\"M_1\"]),\n", + " spacingfunc=\"const({min}, {max}, {res})\".format(min = massrange[0], max = massrange[1], res = resolution[\"M_1\"]),\n", + " probdist=\"{probtot}/({max} - {min})\".format(probtot = total_probability, min = massrange[0], max = massrange[1]), # dprob/dm1 : all stars are equally likely so this is 1.0 / (Mmax - Mmin)\n", + " dphasevol=\"dM_1\",\n", + " parameter_name=\"M_1\",\n", + " condition=\"\", # Impose a condition on this grid variable. Mostly for a check for yourself\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "163f13ae-fec1-4ee8-b9d4-c1b75c19ff39", + "metadata": {}, + "source": [ + "## Setting logging and handling the output\n", + "By default, binary_c will not output anything (except for 'SINGLE STAR LIFETIME'). It is up to us to determine what will be printed. We can either do that by hardcoding the print statements into `binary_c` (see documentation binary_c) or we can use the custom logging functionality of binarycpython (see notebook `notebook_custom_logging.ipynb`), which is faster to set up and requires no recompilation of binary_c, but is somewhat more limited in its functionality. For our current purposes, it works perfectly well.\n", + "\n", + "After configuring what will be printed, we need to make a function to parse the output. This can be done by setting the parse_function parameter in the population object (see also notebook `notebook_individual_systems.ipynb`). \n", + "\n", + "In the code below we will set up both the custom logging and a parse function to handle that output." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "0c986215-93b1-4e30-ad79-f7c397e9ff7d", + "metadata": {}, + "outputs": [], + "source": [ + "# Create custom logging statement\n", + "#\n", + "# we check that the model number is zero, i.e. we're on the first timestep (stars are born on the ZAMS)\n", + "# we make sure that the stellar type is <= MAIN_SEQUENCE, i.e. the star is a main-sequence star\n", + "# we also check that the time is 0.0 (this is not strictly required, but good to show how it is done)\n", + "#\n", + "# The Printf statement does the outputting: note that the header string is ZERO_AGE_MAIN_SEQUENCE_STAR\n", + "\n", + "custom_logging_statement = \"\"\"\n", + "if(stardata->model.model_number == 0 &&\n", + " stardata->star[0].stellar_type <= MAIN_SEQUENCE &&\n", + " stardata->model.time == 0)\n", + "{\n", + " /* Note that we use Printf - with a capital P! */\n", + " Printf(\"ZERO_AGE_MAIN_SEQUENCE_STAR %30.12e %g %g %g %g\\\\n\",\n", + " stardata->model.time, // 1\n", + " stardata->common.zero_age.mass[0], // 2\n", + " stardata->star[0].mass, // 3\n", + " stardata->star[0].luminosity, // 4\n", + " stardata->model.probability // 5\n", + " );\n", + "};\n", + "\"\"\"\n", + "\n", + "population.set(\n", + " C_logging_code=custom_logging_statement\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "ae1f1f0c-1f8b-42d8-b051-cbf8c6b51514", + "metadata": {}, + "source": [ + "The parse function must now catch lines that start with \"ZERO_AGE_MAIN_SEQUENCE_STAR\" and process the associated data." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "fd197154-a8ce-4865-8929-008d3483101a", + "metadata": {}, + "outputs": [], + "source": [ + "# import the bin_data function so we can construct finite-resolution probability distributions\n", + "# import the datalinedict to make a dictionary from each line of data from binary_c\n", + "from binarycpython.utils.functions import bin_data,datalinedict\n", + "\n", + "def parse_function(self, output):\n", + " \"\"\"\n", + " Example parse function\n", + " \"\"\"\n", + " \n", + " # list of the data items\n", + " parameters = [\"header\", \"time\", \"zams_mass\", \"mass\", \"luminosity\", \"probability\"]\n", + " \n", + " # Loop over the output.\n", + " for line in output.splitlines():\n", + " # obtain the line of data in dictionary form \n", + " linedata = datalinedict(line,parameters)\n", + " \n", + " # Check the header and act accordingly\n", + " if linedata['header'] == \"ZERO_AGE_MAIN_SEQUENCE_STAR\":\n", + " \n", + " # bin the log10(luminosity) to the nearest 0.1dex\n", + " binned_log_luminosity = bin_data(math.log10(linedata['luminosity']),\n", + " binwidth['luminosity'])\n", + " \n", + " # append the data to the results_dictionary \n", + " self.grid_results['luminosity distribution'][binned_log_luminosity] += linedata['probability'] \n", + " \n", + " #print (self.grid_results)\n", + " \n", + " # verbose reporting\n", + " #print(\"parse out results_dictionary=\",self.grid_results)\n", + " \n", + "# Add the parsing function\n", + "population.set(\n", + " parse_function=parse_function,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "91509ce5-ffe7-4937-aa87-6d7baac9ac04", + "metadata": {}, + "source": [ + "## Evolving the grid\n", + "Now that we configured all the main parts of the population object, we can actually run the population! Doing this is straightforward: `population.evolve()`\n", + "\n", + "This will start up the processing of all the systems. We can control how many cores are used by settings `amt_cores`. By setting the `verbosity` of the population object to a higher value we can get a lot of verbose information about the run, but for now we will set it to 0.\n", + "\n", + "There are many grid_options that can lead to different behaviour of the evolution of the grid. Please do have a look at those: [grid options docs](https://ri0005.pages.surrey.ac.uk/binary_c-python/grid_options_descriptions.html), and try " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8ea376c1-1e92-45af-8cab-9d7fdca564eb", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Grid has handled 40 stars\n", + "with a total probability of 1.0000000000000004\n", + "Total starcount for this run will be: 40\n", + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Population-08f8230453084e4ca6a2391d45ce658b finished! The total probability was: 1.0000000000000002. It took a total of 1.5262682437896729s to run 40 systems on 2 cores\n", + "There were no errors found in this run.\n", + "OrderedDict([('luminosity distribution', OrderedDict([(2.25, 0.025), (3.75, 0.05), (4.25, 0.05), (0.25, 0.025), (3.25, 0.025), (5.25, 0.2), (4.75, 0.1), (5.75, 0.39999999999999997), (6.25, 0.125)]))])\n" + ] + } + ], + "source": [ + "# set number of threads\n", + "population.set(\n", + " # verbose output is not required \n", + " verbosity=0,\n", + " # set number of threads (i.e. number of CPU cores we use)\n", + " amt_cores=2,\n", + " )\n", + "\n", + "# Evolve the population - this is the slow, number-crunching step\n", + "analytics = population.evolve() \n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "markdown", + "id": "91ab45c7-7d31-4543-aee4-127ab58e891f", + "metadata": {}, + "source": [ + "After the run is complete, some technical report on the run is returned. I stored that in `analytics`. As we can see below, this dictionary is like a status report of the evolution. Useful for e.g. debugging." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e1f0464b-0424-4022-b34b-5b744bc2c59d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'population_name': '08f8230453084e4ca6a2391d45ce658b', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 1.0000000000000002, 'total_count': 40, 'start_timestamp': 1631124829.303065, 'end_timestamp': 1631124830.8293333, 'total_mass_run': 2001.4, 'total_probability_weighted_mass_run': 50.035000000000004, 'zero_prob_stars_skipped': 0}\n" + ] + } + ], + "source": [ + "print(analytics)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "05c6d132-abee-423e-b1a8-2039c8996fbc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[None]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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n9eyZcs0atQovf3225o8eXLr4WwXExkZqZqaGkmfnZOpW7duF9wmKipKI0aMaD030sGDB7V//34NHjy49a+ZM2e23v7NN99UZGSkpk6d2nrZmTNnlJeXpwceeEC/+93vzjuX0YwZM/Tzn/9co0ePPu9xAwMD9c1vflNvvfWWHn74YT3//PMXtG3cuLH1lVf/qq6uTsOGDTvvr8OHD8vhcLS+8uuFF17Q9u3bJem8Vyk1NTVp165d5/0ZAACAf+OcSwAAwKutXr269e/T09NbT3r9r6699lq99dZbrR/feeedmjJlyiXvd/jw4XrxxRd16623av369Ro+fPhFb/fggw/qhRde0KRJk/TDH/5QP/zhDy96u9OnT+uvf/3rBX0ffPCBvv/97+uGG26Q9Nkrmz5/tVO/fv00YsQI3XDDDdq4cWPr55w8ebL1XE+xsbHnHe73ueXLl1+0IykpSYcPH77odc3Nzfrb3/6mL33pS61fq3379p03Lr3zzju6+eabL3ooHgAA8E+MSwAAwC9s3bpVycnJio6O1ooVK3T48GFNmDCh9fqvf/3rOnjwoI4ePaq5c+fq9ttvV2xsrBYsWKAePXroq1/96kXvd/jw4UpOTta6des0ceLESz7+73//e1VVVemBBx5oveyb3/ymPvroI/3P//xP62VZWVl6//33Wz9etGjRBfeVm5urRx55RMHBwbIs65KD1pUKDAzUjTfeqF/96letr2BKT0/XnDlzJH32LnXvvPNO67vaAQAASJLNutj/6gIAAPAxr776qp599lnV19crKSlJjz76qCZPnmw6CwAAwOsxLgEAAAAAAKDdOKE3AAAAAAAA2o1xCQAAAAAAAO3GuAQAAAAAAIB2Y1wCAAAAAABAuzEuAQAAAAAAoN0YlwAAAAAAANBujEsAAAAAAABoN8YlAAAAAAAAtNv/D2ltZ660RybEAAAAAElFTkSuQmCC\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# make a plot of the luminosity distribution using Seaborn and Pandas\n", + "import seaborn as sns\n", + "import pandas as pd\n", + "from binarycpython.utils.functions import pad_output_distribution\n", + "\n", + "# set the figure size (for a Jupyter notebook in a web browser) \n", + "sns.set( rc = {'figure.figsize':(20,10)} )\n", + "\n", + "# this saves a lot of typing! \n", + "ldist = population.grid_results['luminosity distribution']\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "pad_output_distribution(ldist,\n", + " binwidth['luminosity'])\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict({'ZAMS luminosity distribution' : ldist})\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")" + ] + }, + { + "cell_type": "markdown", + "id": "7d7b275e-be92-4d59-b44d-ef6f24023cc3", + "metadata": {}, + "source": [ + "Does this look like a reasonable stellar luminosity function to you? The implication is that the most likely stellar luminosity is 10<sup>5.8</sup> L<sub>☉</sub>! Clearly, this is not very realistic... let's see what went wrong." + ] + }, + { + "cell_type": "markdown", + "id": "44586e42-b7cb-4a55-be0a-330b98b20de4", + "metadata": {}, + "source": [ + "## " + ] + }, + { + "cell_type": "markdown", + "id": "e32c3bbf-390f-45da-ad9c-cc3e7c9449dc", + "metadata": {}, + "source": [ + "## ZAMS Luminosity distribution with the initial mass function\n", + "\n", + "In the previous example, all the stars in our grid had an equal weighting. This is very unlikely to be true in reality: indeed, we know that low mass stars are far more likely than high mass stars. So we now include an initial mass function as a three-part power law based on Kroupa (2001). Kroupa's distribution is a three-part power law: we have a function that does this for us (it's very common to use power laws in astrophysics).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "1f37d2c0-1108-4ab9-a309-20b1e6b6e3fd", + "metadata": {}, + "outputs": [], + "source": [ + "# Update the probability distribution to use the three-part power law IMF \n", + "population.update_grid_variable(\n", + " name=\"M_1\",\n", + " probdist=\"three_part_powerlaw(M_1, 0.1, 0.5, 1.0, 150, -1.3, -2.3, -2.3)\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "6f4463e8-1935-45f2-8c5f-e7b215f8dc47", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Grid has handled 40 stars\n", + "with a total probability of 0.2182216189410787\n", + "Total starcount for this run will be: 40\n", + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Population-92de7c9221c54206ab4dd10e58e09a34 finished! The total probability was: 0.21822161894107872. It took a total of 1.5900418758392334s to run 40 systems on 2 cores\n", + "There were no errors found in this run.\n", + "OrderedDict([('luminosity distribution', OrderedDict([(2.25, 0.0164166), (3.25, 0.00515685), (0.25, 0.189097), (3.75, 0.0037453900000000004), (4.25, 0.0014346559999999999), (5.25, 0.0007493004), (4.75, 0.001171479), (5.75, 0.00039801020000000003), (6.25, 5.2369339999999996e-05)]))])\n" + ] + } + ], + "source": [ + "# Clean and re-evolve the population \n", + "population.clean()\n", + "analytics = population.evolve() \n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cfe45a9e-1121-43b6-b6b6-4de6f8946a18", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[None]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJgAAAJWCAYAAAAUZj1OAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABcnUlEQVR4nO3dd3SUZf7+8Wtm0gvpjQRIo0PovSNNiiDiBnXBsrqCsq6sK66CirroWlZ/lu/ay6oooIIIItIEhID03ksCBJIACYTQ0ub3R3TcCBjIk+SZSd6vczgn82QycyW5HTPX3M9nLHa73S4AAAAAAACgnKxmBwAAAAAAAIBro2ACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIZQMAEAAAAAAMAQCiYAAAAAAAAYQsEEAAAAAAAAQ9zMDlCZcnLOqrjYbnaMaickxE8nT+aZHQMuivUDo1hDMIo1BKNYQzCKNQSjWEMwqrxryGq1KCjI97Kfq9YFU3GxnYKpkvBzhRGsHxjFGoJRrCEYxRqCUawhGMUaglEVvYY4RQ4AAAAAAACGUDABAAAAAADAkGp9ihwAAAAAAFWpqKhQOTnHVViYX2n3kZVlVXFxcaXdPqq/staQm5uHgoLCZLNdfW1EwQQAAAAAQAXJyTkuLy8f+fpGymKxVMp9uLlZVVhIwYTy+701ZLfbdfZsrnJyjis0NOqqb5NT5AAAAAAAqCCFhfny9a1VaeUSUNksFot8fWtd8y48CiYAAAAAACoQ5RJcXXnWMAUTAAAAAAAADKFgAgAAAACgGtq8eaPuuOPWUv+6d2+v77+f57jOV19NV8+eHXXy5IlSX9u1a1v97W/jSh07deqUevTooPfff1uSlJGRoQkTxuv220dq1Kg/6PHH/6GcnOxLcrz//tuOrzHivffe0ooVywzfzi++/vpLff31l5KkZ599ShkZx8p1O+PG/VkbNqzTrl079K9/PXPF6x09mq7nnnu6zCxdu7a9pvtfsWK5pk379JLbqWoM+QYAAAAAoBpq0aKVPvroM8fl6dOnav78b9Wz53WOY99+O0ddu/bQ3Lmzdfvtfyr19YcPH1Zubq5q1aolSVq6dLH8/Ws5Pv/ii89qwICB6tt3gCTpk08+1IsvPqdnn32xUr6fu+8eU6G3N2zYCMfHGzas05133mPo9ho1aqJ//KPJFT+fkXFM6elHysxyrXbv3lkht2MUBRMAAAAAANXc5s0b9fHHH+idd/4rT09PSdK+fXuVm3taEyZM1KRJEzRq1J2yWn890alr1+768celGjToBkklBVP37j0dn8/OPqGLFy84Lt900x+0c+eO383RtWtbrVixTpI0b94cbdy4XhMnTtaIEUPUu3dfpaSskM1m07333q9p0z7VkSOHdf/9D+q66/pqypTJatWqjVq1aqPHHvu74uMTtGfPbgUHh+iZZ/6lWrUCtHLlj3r33Tdltxerdu1oPfzwYwoODtEbb/w/rV37k2w2q7p27aG77vqzY1eVh4enTpw4rocf/qvuvnuMpk2bqrfe+kCS9N13c7V9+1b9/e+POr6H/Px8Pf/8M9q1a6ciI2vr9OlTkkpKqg8+eEdvvPGOpk37VN99962sVosaN26qCRMm6tVXX9LRo+n697+fV69e1+nNN19TUVGx4uMTFBVVW5L0pz/dK0l6/vkp2rlzuwICAvXoo08oMjJS48b9WXfd9We1bt1Wx44d1V/+cq9efPFVzZ49U5IUGRnl2IX1pz/de8WfxYgRQ3T99YO0enWKzp+/oEmTnlKjRo2vei1dCQUTAAAAAACVYOXWY1qxpXynXf0ei0Xq0jxKXZpf3VvI5+Rka/LkiXrkkccVHR3jOD5v3jfq3buPGjVqLJvNpp9+SlGnTl0dn+/du48+/vgDDRp0g06ePCG7XQoJCXV8/t57x+nppx/X+++/ozZt2qljx87q3btvub+v0NAwffrpDD377FP69NOP9Nprb2nr1s167bV/67rrSt/uvn179eijT6hBg0aaOPFhLVjwna67rp9efPFZvfnm+4qKqq3PPvtYL7/8gsaNe1CrV6fo009n6OLFi3r++X/q4sWLjtsaNeoOzZ79lV588VVFRkbp//7vNaWnH1F0dIy++26u7r239KmCX345XZI0deqXOnz4kG6//ZZSny8sLNSnn36kr7+eL6vVqpdffl7Hj2fpr3/9uz744B099NAj2rBhnQ4fPqQvv5wrPz+/S04hbNWqtR55ZKJmzvxCr776kp577qXL/szi4uI1dOhwSdKgQTc4bicnJ/uyP4t//vN5SVJAQIDeffdjffnlNH3yyQeaMsX4rjNmMAEAAAAAUE0VFxdr8uRJ6tOnf6ndR4WFhVqwYL769OkvSerdu69jJ8wvmjVL0qFDacrLy9PSpYvVq1fvUp/v2LGzZs2ap0cemaTAwCD95z+vaeLEh8udtWPHzpKkiIhItWzZWm5uboqMjNKZM2cuuW5QULAaNGgkSYqPT1Rubq527Niuxo2bOnYD3XDDcK1fv1ahoWHy9PTU2LF3acaMz3TPPWMdu7h+y2Kx6PrrB+n77+cpIyND2dnZatq0WanrbNq0Xr16lRRederUVfPmSaU+7+bmpmbNknT33aP14YfvavjwmxUWFn7JfdWpU09+fn6XHPf09FS/ftdLkvr3v14bN67/3Z/b5VzpZ/GLX37Wv/zsKgI7mAAAAAAAqATXssvoWri5WVVYWHxV1/3ww3dVWFige++9v9TxlSt/1JkzuXrssZJCqLCwUDk52crKylR4eISkkrKlS5duWrFimZYt+0FPPfWcZs6cIUnKzT2tjz56Tw888JA6duysjh0764477tbQof2Vk5OjoKCgK2ay2+2yWCwqLCwsddzd3d3xsc1m+93vy8PD45LbtNuLLzlWVFQkNzc3vfPOR9q0aYNWrVqpMWPu1Ouvv3PF2x44cIgeeugv8vDw0IABAy9zDUup+7pc1uee+7e2b9+q1atT9NBDD+iJJy4d/n2lkstq/fX27PaSwkoq+X384rc/u9+60s/iFx4enqU+VxHYwQQAAAAAQDW0du1qzZnztZ566jlHSfGLefO+0T33jNWXX87Rl1/O0ddff6fmzVtozpyvS12vd+++mjnzC7m5uZcqjXx9/bRixXJ9991cx7H09CMKDg5xDAW/nMDAQB08uF92u10rViyvmG/0Z02aNNOOHVt17NhRSdI338xU69ZttGfPLo0b92e1aNFK48Y9qNjYeB06lFbqa202m6OAiYyMUlhYuL7++isNGDDokvtp27a9Fi78XsXFxcrIOKatW7eU+nxOTo5uu22E4uMTdffdY9SuXQft379XNptbqZLnSs6fP+d4t7xvv52ttm3bS5ICAkp+dpL0449LL5u9rJ9FZWIHEwAAAAAA1dAnn3ykoqIi/f3vD5Q63r17T23YsE6PPvpkqeMjR/5R//73v3THHXc7jjVt2lwnT57QDTcMK3Vdm82ml156Va+//oree+8teXl5KTQ0TM8///Lv7j4aM2acJkwYr+DgECUltXQMyK4IwcEhevjhiXrssb+roKBQkZGR+sc/nlBoaKiaNUvS6NHJ8vLyUv36DdWxY+dS777WuXM3/f3vf9XLL7+u2rWj1adPPy1dukShoWGX3M/w4Tfr4MH9uu22EYqMjFJ8fEKpzwcFBWno0OG6557R8vT0UkREpAYOHKKCggLl5Z3RM888rkGDhl7x+/Dz89fy5Uv17rtvKSwsTI89VvJ7uu220ZoyZbK+/fYbdevW03H9li1ba8qUyQoODi7zZ1GZLPaK2gvlhE6ezFNxcbX99kwTFuav48cvPQcWuBqsHxjFGoJRrCEYxRqCUayh6i0jI02RkfUq9T6u5RQ5XLvCwkI988wT6t27j3r06F32F7igq1lDl1vLVqtFISGXzo2SOEUOAAAAAABAUsk8omHDrpfVai21Swhl4xQ5AAAAAAAAlQzSnjt3odkxXBI7mAAAAAAAAGAIBRMAAAAAABWoGo86Rg1RnjVMwQSXln7irM5fLDQ7BgAAAABIktzcPHT2bC4lE1yW3W7X2bO5cnPzuKavYwYTXNrj7/2kuKhaevz2tmZHAQAAAAAFBYUpJ+e48vJOVdp9WK1WFRfzLnIov7LWkJubh4KCwq7pNimY4PIOHss1OwIAAAAASJJsNjeFhkZV6n2Ehfnr+PEzlXofqN4qYw1xihwAAAAAAAAMoWACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIZQMAEAAAAAAMAQCiYAAAAAAAAYQsEEAAAAAAAAQyiYAAAAAAAAYAgFEwAAAAAAAAyhYAIAAAAAAIAhFEwAAAAAAAAwhIIJAAAAAAAAhlAwAQAAAAAAwBAKJgAAAAAAABhCwQQAAAAAAABDKJgAAAAAAABgCAUTAAAAAAAADKFgAgAAAAAAgCEUTAAAAAAAADCEggkAAAAAAACGUDABAAAAAADAEAomAAAAAAAAGELBBAAAAAAAAEMomAAAAAAAAGAIBRMAAAAAAAAMoWACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIZQMAEAAAAAAMAQCiYAAAAAAAAYQsEEAAAAAAAAQ5y+YDp8+LCGDx9udgwAAAAAAABcgVMXTLm5uZo2bZp8fX3NjgIAAAAAAIArcDM7wP+aPn265s6d67j88ssv6+GHH9a9995rYioAAAAAAAD8HqcqmJKTk5WcnGx2DAAAAAAAAFwDpz5FDgAAAAAAAM6vSgqmvLw8DR48WEeOHHEcmzNnjgYOHKi+fftq6tSpv/v1b7/9dmVHBAAAAAAAQDlV+ilymzdv1qRJk5Samuo4lpmZqVdeeUUzZ86Uh4eHRo4cqQ4dOigxMbFC7zskxK9Cbw+/CgvzNztCKc6WB7+P3xeMYg3BKNYQjGINwSjWEIxiDcGoil5DlV4wzZgxQ08++aQmTJjgOJaSkqKOHTsqMDBQktS/f3/Nnz9f48aNq9D7PnkyT8XF9gq9TZQswuPHz5gdoxRny4Mrc8b1A9fCGoJRrCEYxRqCUawhGMUaglHlXUNWq+WKm3kqvWCaMmXKJceysrIUFhbmuBweHq4tW7ZUdhQAAAAAAABUAlOGfNvtl+4qslgsJiQBAAAAAACAUaYUTBERETpx4oTjclZWlsLDw82IAgAAAAAAAINMKZg6d+6sVatWKTs7W+fPn9eCBQvUvXt3M6LAhV1uJxwAAAAAAKh6lT6D6XIiIiI0fvx4jR49WgUFBRoxYoSSkpLMiAIAAAAAAACDqqxgWrJkSanLQ4YM0ZAhQ6rq7gEAAAAAAFBJTDlFDgAAAAAAANUHBRMAAAAAAAAMoWACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIZQMMFl2c0OAAAAAAAAJFEwAQAAAAAAwCAKJgAAAAAAABhCwQQAAAAAAABDKJgAAAAAAABgCAUTAAAAAAAADKFgAgAAAAAAgCEUTHBddrMDAAAAAAAAiYIJAAAAAAAABlEwAQAAAAAAwBAKJgAAAAAAABhCwQQAAAAAAABDKJgAAAAAAABgCAUTAAAAAAAADKFgAgAAAAAAgCEUTHBZdtnNjgAAAAAAAETBBAAAAAAAAIMomAAAAAAAAGAIBRMAAAAAAAAMoWACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIZQMMFl2e1mJwAAAAAAABIFEwAAAAAAAAyiYAIAAAAAAIAhFEwAAAAAAAAwhIIJAAAAAAAAhlAwAQAAAAAAwBAKJgAAAAAAABhCwQQAAAAAAABDKJgAAAAAAABgCAUTAAAAAAAADKFgAgAAAAAAgCEUTAAAAAAAADCEggkAAAAAAACGUDABAAAAAADAEAomAAAAAAAAGELBBJdlt5udAAAAAAAASBRMAAAAAAAAMIiCCQAAAAAAAIZQMAEAAAAAAMAQCiYAAAAAAAAYQsEEAAAAAAAAQyiYAAAAAAAAYAgFE1yY3ewAAAAAAABAFEwAAAAAAAAwiIIJAAAAAAAAhlAwAQAAAAAAwBAKJgAAAAAAABhCwQQAAAAAAABDKJgAAAAAAABgCAUTAAAAAAAADKFggsuy281OAAAAAAAAJAomAAAAAAAAGETBBAAAAAAAAEMomAAAAAAAAGAIBRMAAAAAAAAMoWACAAAAAACAIRRMAAAAAAAAMISCCS7LbnYAAAAAAAAgiYIJAAAAAAAABlEwAQAAAAAAwBAKJgAAAAAAABhCwQQAAAAAAABDKJgAAAAAAABgCAUTAAAAAAAADKFgguuymx0AAAAAAABIFEwAAAAAAAAwiIIJAAAAAAAAhlAwAQAAAAAAwBAKJgAAAAAAABhCwQQAAAAAAABDKJgAAAAAAABgCAUTAAAAAAAADKFggsuyy252BAAAAAAAIAomAAAAAAAAGETBBAAAAAAAAEMomAAAAAAAAGAIBRMAAAAAAAAMoWACAAAAAACAIRRMAAAAAAAAMISCCS7Lbjc7AQAAAAAAkCiYAAAAAAAAYBAFEwAAAAAAAAyhYAIAAAAAAIAhFEwAAAAAAAAwhIIJAAAAAAAAhlAwAQAAAAAAwBAKJgAAAAAAABhCwQQAAAAAAABDKJgAAAAAAABgCAUTAAAAAAAADKFgAgAAAAAAgCEUTAAAAAAAADCEggkAAAAAAACGUDABAFBOF/ILNf6NFdqZlmN2FAAAAMBUFExwWXa72QkA1HRHjp/V6bx8zVy23+woAAAAgKkomAAAAAAAAGAIBRMAAAAAAAAMoWACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIZQMAEAAAAAAMAQCia4MLvZAQAAAAAAgCiYAAAAAAAAYBAFEwAAAAAAAAyhYAIAAAAAAIAhFEwAAAAAAAAwhIIJAAAAAAAAhlAwAQAAAAAAwBAKJgAAAAAAABhCwQSXZTc7AAAAAAAAkETBBAAAAAAAAIMomAAAAAAAAGAIBRMAAAAAAAAMoWACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIZQMMFl2e1mJwAAAAAAABIFEwAAAAAAAAxyMzvAlezdu1fvvPOO/P39FRoaqvvuu8/sSAAAAAAAALgMpy2YcnJy9Mgjjyg0NFT33HOP2XEAAAAAAABwBU5TME2fPl1z5851XH755ZcVGhqqd955R4MGDTIxGQAAAAAAAH6P0xRMycnJSk5Odly+ePGiJk+erOuuu07dunUzMRkAAAAAAAB+j9MO+X7jjTe0fft2zZ49WxMnTjQ7DgAAAAAAAK6g0ncw5eXlaeTIkXrrrbcUExMjSZozZ47efPNNFRQU6I477tBtt912ydc99NBDlR0NAIAKYTc7AAAAAGCySi2YNm/erEmTJik1NdVxLDMzU6+88opmzpwpDw8PjRw5Uh06dFBiYmKF339IiF+F3yZKhIX5mx1BnmfzHR87Qx5cPX5fMMpZ1tDJswWSJHc3m9NkwtXh9wWjWEMwijUEo1hDMKqi11ClFkwzZszQk08+qQkTJjiOpaSkqGPHjgoMDJQk9e/fX/Pnz9e4ceMq/P5PnsxTcTGvK1e0sDB/HT9+xuwYyjtf4PjYGfLg6jjL+oHrcqY1lHPqnCSpsLDIaTKhbM60huCaWEMwijUEo1hDMKq8a8hqtVxxM0+lFkxTpky55FhWVpbCwsIcl8PDw7Vly5bKjAEAAAAAAIBKVOVDvu32S3cUWSyWqo4BAAAAAACAClLlBVNERIROnDjhuJyVlaXw8PCqjgEAAAAAAIAKUuUFU+fOnbVq1SplZ2fr/PnzWrBggbp3717VMQAAAAAAAFBBKnUG0+VERERo/PjxGj16tAoKCjRixAglJSVVdQwAACoMbycBAACAmq5KCqYlS5aUujxkyBANGTKkKu4a1djl5nkBAAAAAICqV+WnyAEAUN3wVhUAAACo6SiYAAAAAAAAYAgFEwAAAAAAAAyhYAIAAAAAAIAhFEwAAAAAAAAwhIIJAAAAAAAAhlAwAQBgkN3sAAAAAIDJKJjgsnhCBwAAAACAc6BgAgDAIIvZAQAAAACTUTABAAAAAADAEAomAAAAAAAAGELBBAAAAAAAAEMomAAAAAAAAGAIBRMAAAbxrpYAAACo6SiY4Lp4RgcAAAAAgFOgYAIAwCCL2QEAAAAAk1EwAQAAAAAAwBAKJgAAAAAAABhCwQQAAAAAAABDKJgAAAAAAABgyDUXTAUFBZWRAwAAAAAAAC6qzIJp3bp1+s9//qP8/HzdeOONatu2rebNm1cV2YDfZTc7AAD8jMcjAAAA1HRlFkwvvviiWrZsqUWLFik0NFTffvutPvjgg6rIBgAAAAAAABdQZsFUVFSkzp07KyUlRX369FFMTIyKi4urIhsAAC7BYnYAAAAAwGRlFkzFxcXasmWLli5dqi5dumjPnj3MYQIAAAAAAICDW1lXGDt2rB566CGNGDFCMTEx6t27tyZOnFgV2QAAAAAAAOACyiyYsrKytHDhQsflhQsXymazVWooAAAAAAAAuI4yT5H7/PPPS12mXAIAAAAAAMD/KnMHU1xcnCZNmqS2bdvKx8fHcbxfv36VGgwAAFdhNzsAAAAAYLIyC6ZTp07p1KlTSktLcxyzWCwUTDCfnad0AMzFu8cBAAAAJcosmD755JOqyAEAgMuh5kZFsNvtslioKwEAgGsrs2BKTU3Vp59+qnPnzslut6u4uFhpaWmaNm1aVeQDAMDpUQ2gvHLP5evRt1cp2N9LTWKD1SQ2SA3qBMrbs8w/0QAAAJxKmX+9PPTQQ2rWrJk2btyoQYMG6YcfflDTpk2rIhsAAEC1lpuXr/MXi1Tka9fSTelauO6wbFaL4mvXchROcVG15GYr831ZAAAATFVmwXT27Fk99dRTmjJlirp3767Ro0frzjvvrIpsAAAANcLw7vFqkRiifUdOa0dajnakZuubFQc1e8VBeXnY1KhukBrHBqlJbLBqh/hwSh0AAHA6ZRZMgYGBkqR69epp7969SkpKUnFxcWXnAgAAqFHc3WxqHBusxrHBuqlHgvLOF2j3oRztSM3R9tRsbdp3QpIU4OehJvVKdjc1iQ1WkL+nyckBAACuomCqV6+epkyZohtvvFETJ07UuXPnlJ+fXxXZAAAAaiw/b3e1aRiuNg3DJUknTp137G7aeuCkVm3PkCTVDvVVk3olZVPDusxvAgAA5ijzL5DJkydr+fLlatKkiW6++WatXLlSzzzzTFVkA34X794EwFnweISqEBrore6B3ureoraK7XYdycrTjtSSwmn55qNatP6IrJZf5jeVFE7xtZnfBAAAqkaZBdPbb7+tBx98UJJ066236tZbb9U///lPtW7durKzAQAA4DKsFovqRvirboS/BnSoq4LCYu1PP60dadnakZqjOSmp+mZlqjw9bGpYJ9AxMDw61Jf5TQAAoFJcsWB67bXXlJubq3nz5ikvL89xvKCgQEuWLNGkSZOqJCAAAM6Op+swm7ubVY3qBalRvSAN7y6du1CgnWmnHIXTlv17JUkBvh6O3U2N6wUpuJaXyckBAEB1ccWCqUWLFtq6dausVqtj0Lck2Ww2vf7661WRDQAAoFqrrNMrfbzc1aZhmNo0DJMknTx9QTvSsrUzNUfbD2Zr1fZMSVJUiI9jYHjDukHy8WJ+EwAAKJ8r/hXRo0cP9ejRQ927d1dSUpLjeEFBgdzd3askHAAAAIwLCfBSt6Ta6pZUW3a7XUeOn9WO1JLdTT9uParFG0rmN8VF+TtOp0uIDmB+EwAAuGplvkyVn5+v//znP7r77ruVnJysAwcO6LnnntPAgQOrIh8AAEC1V5VjkSwWi+qE+6lOuJ/6t6+rwqKf5zf9PDB87qpUzUlJlYe7VQ3rBDlOqYsJY34TAAC4sjILphdffFF//etftWjRIoWGhur111/Xgw8+SMEEAABQDbjZrGpYt+QUuRu7x+vchULtPpRTUjilZWv6kpOSpFo+7iWzm2KD1DQ2mPlNAACglDILpqKiInXu3FmTJk1Snz59FBMTo+Li4qrIBgCAS6isOTqAGXy83NSqQZhaNSiZ35Sde0E703K0/edT6lbvKJnfFBHsoyY/l02N6gbKx4sRCgAA1GRlFkzFxcXasmWLli5dqjFjxmjPnj0qKCioimzA77LzjA6AyThZCDVBcC0vdWkepS7No2S325V+4qzjdLqUrRn6YUO6LBYpLqpWyel09YKVEB0gdzfmNwEAUJOUWTCNGTNGDz30kEaMGKGYmBj17t1bEydOrIpsAAA4NXpu1DQWi0UxYX6KCfNTv3Z1VFhUrANHcx0Dw+etOqS5KWnycLOqQZ1Ax8DwmHA/WZnfBABAtVZmwdSvXz/169fPcXnhwoWy2WyVGgoAAFfC02aUl93Ft+O62UqKpAZ1AjWsm3T+YqF2HzqlHanZ2p6arRk/7JMk+fu4q3G9IEfhFBrgbXJyAABQ0cosmH6LcgkAAACX4+3pppb1Q9WyfqgkKefMRcfuph1p2VqzM0uSFB7kraY/l02N6gXJl/lNAAC4vGsumAAAAFDRquc+uCB/z1Lzm46ePKcdqdnamZqjlO0Z+mFjyfym2Ej/n3c3BSsxupbc3XhBEwAAV3PFgmnhwoXq27ev8vPz5eHhUZWZAAAAUM1YLBZFh/oqOtRXfduWzG86eCzXMTB8/k+H9O2qkvlN9esEOgaG14lgfhMAAK7gigXTa6+9pr59+yo5OVmzZs2qykwAALgU156iA5jDzWZV/ZhA1Y8J1NCucTp/sVB7Dp/S9p93OH3xw35J++Xn7a7OzSJ1U48E3pkOAAAndsWCydfXV/3791dmZqaGDBlyyefnzJlTqcEAAHB27KkAKo63p5taJIaqRWLJ/KZTeRe1MzVHm/ef0IK1h7U//bTuu7G5gvw9TU4KAAAu54oF03vvvaedO3dq4sSJevzxx6syEwAALoGdS0DlCfTzVKdmkerULFJtG2bp/W936umP1ur+G5srMSbA7HgAAOA3rrjP2M/PT+3atdPbb7+tpk2bSpIKCwvVpEkTtW/fvsoCAgDg7NjJBFSuto3CNWl0G3l62PT8Zxu0dGO67HYqXgAAnEmZ7yJ35swZjRo1SqGhoSoqKlJmZqbeeusttW7duiryAQAAAIoO89Pjt7fVO9/s0Mff71ZqRq5u69uQuUwAADiJMgum559/Xi+99JI6duwoSVq1apX+9a9/acaMGZUeDgAAoCbgTdKujq+Xu/46IklfrziguSlpOnL8rO5nLhMAAE6hzJd88vLyHOWSJHXq1Ennz5+v1FAAAADA5VitFg3vnqD7b2ym9ONn9dRHa7Xn8CmzYwEAUOOVWTBZrValp6c7Lh85ckQ2m61SQwEAAAC/p03DkrlM3h42vfj5Rv2w4QhzmQAAMFGZp8jdf//9Sk5OVqdOnSRJK1eu1JNPPlnpwYCy8EckAGfBoxFgDsdcpjk79MmCPTqYcUaj+jWQuxsvhgIAUNXKLJj69Omj+Ph4rV69Wna7XWPGjFFCQkJVZAMAwKkxNgcwn4+Xux4YkaTZPx7UnJRUpR8/q/tvbKbgWl5mRwMAoEYps2CSpPj4eMXHx1d2FgAAXAo7lwDnYLVYdGP3eNWN8Nd73+7Q0x+t1X03NleDOoFmRwMAoMbgfV0BADCInUwoL872rlhtGoZp0ui28vZy14ufb9Ti9cxlAgCgqlAwAQAAmIySsuJEh/rq8dFt1SwuWFMX7tGH83apoLDI7FgAAFR7ZRZMEyZMqIocAAAAQIXw8XLTX0Yk6YYusVqx9Zj+NXWDsnMvmB0LAIBqrcyCadeuXWwtBgAAgEuxWiwa1i1e44Y317GT5/T0R2u1+1CO2bEAAKi2yhzyHRYWpkGDBqlFixby9fV1HJ80aVKlBgMAwFXwMgzgvFo3KJnL9MbMrXpp2iaNvK6+ereOlsXCiYkAAFSkMgumVq1aqVWrVlWRBQAAl8LTU8A11A711aTRbfXe3B2aunCPUjNyNbp/Q7m72cyOBgBAtVFmwTRu3DhduHBBaWlpql+/vvLz8+Xl5VUV2QAAcGrsXAJch4+Xm8bd1FzfrDiob1amKv34WY0b3lzBtfi7FgCAilDmDKbNmzerT58+uvfee5WVlaUePXpow4YNVZENAACXwE4mwDX8MpfpLzc1V0b2OT3FXCYAACpMmQXT888/r48++kiBgYGKjIzUCy+8oClTplRFNgAAAKDCtaofpsdvbytfL3e9+PkmLVx3mDe1AQDAoDILpgsXLigxMdFxuUePHioqKqrUUAAAADUK2+CqXFSIrx6/va2SEkL0+aK9ev/bncov4G9cAADKq8yCyc3NTadPn3a808aBAwcqPRQAAABQ2bw9S+YyDesap5RtGXpu6gadPH3B7FgAALikMgumsWPH6o9//KOOHTumv/3tb7rllls0duzYqsgGAAAAVCqrxaIbusbpgZuSlJVTMpdpVxpzmQAAuFZlvotcr169FB8fr5UrV6q4uFj33XdfqVPmALMwKgGAs+DhCHB9LeuHatLotnpj5la9NG2Tknsnqk/bGMcufgAA8PvK3MEkSYWFhSouLpabm5vc3d0rOxMAAC6Bp51A9RIV4qtJo9uqRWKIPl+8V+/NZS4TAABXq8yC6auvvtKoUaO0detWrV+/Xrfddpu+//77qsgGAIBTY+cSjLKzipyOt6eb7h/eXMO6xWn19gw9++l6nTh93uxYAAA4vTJPkfvoo4/09ddfKzw8XJJ09OhR3Xvvverfv3+lhwMAwBWwkwmoXqwWi27oEqe6Ef56d852Pf3ROo0d1kyN6wWZHQ0AAKdV5g4md3d3R7kkSbVr1+Y0OQAAgApkoaZ0Si0TQ/X47e3k7+Ouf0/bpAVrDsnOEEgAAC7rigXT9u3btX37djVs2FBPP/20du/erX379umFF15Q69atqzIjAAAAYIrIYB9NGt1WLeuHatqSfXp37g5dyC80OxYAAE7niqfI/eUvfyl1eenSpY6PLRaLJk2aVGmhAAAAAGfh7emm+25spm9Xpenr5Qf0yBsrNGZIE4UGepsdDQAAp3HFgmnJkiVVmQMAAJfFCTNA9We1WDSkc6zqhvvpvbk79PR/12ns0KZqHBtsdjQAAJxCmUO+jx8/rlmzZunUqVOljk+YMKGyMgFXhXfeAWA2puYANU+LxFC9/GAPPfXear00fZP+0CtR/drVkcXCIwIAoGYrc8j32LFjtWXLFtnt9lL/AAAAgJqodpifJo5qo9b1wzR9yT69O2eHLhYUmR0LAABTlbmDqaCgQG+88UZVZAEAwKXwcguM4jU71/W/c5lmLT+goyfO6v7hzRXGXCYAQA1V5g6mpk2bas+ePVWRBQAAl8SJMTCMReSSLBaLBneO1V9vbqETpy/o6Y/WantqttmxAAAwRZk7mFq3bq1hw4YpLCxMbm6/Xn3x4sWVGgwAAABwBUkJIXr8jrZ646utenn6Jt3cM1H92zOXCQBQs5RZML3xxht66aWXVLdu3arIAwAAALiciCAfTRzdRh98u1MzftintMwzuuP6RvJ0t5kdDQCAKlFmwRQQEKCBAwdWRRYAAADAZXl5uGnssGaatzpNM5eVzGUax1wmAEANUeYMpp49e+r555/Xxo0btX37dsc/wHQMRgXgJHg4AvALi8WiQZ1i9eAfWujkL3OZDjKXCQBQ/ZW5g2nOnDmSpO+//95xzGKxMIMJAFDjMV0FwJU0j/95LtPMrXp5xiaN6JmgAe3rMpcJAFBtlVkwLVmypCpyAADgcti5BOD3RAT5aOKoNvpg3i598cN+pWWc0Z3XN5anB3OZAADVT5kF04cffnjZ43feeWeFhwEAwBWxHwHAlXh5uGns0Kb6LtJfXy3dXzKX6aYkhTOXCQBQzZRZMO3Zs8fxcX5+vtavX68OHTpUaigAAICahJKyerNYLBrYsZ7qhvvp7W+265mP1ureoU3VLC7E7GgAAFSYMgum5557rtTl7OxsTZgwodICAQAAANVRs/gQPX57yVymV2Zs1ogeCRrQgblMAIDqocx3kfut4OBgpaenV0YWAAAAoFoLD/LRxFFt1bZhuL5Yul9vzd6ui/lFZscCAMCwa5rBZLfbtW3bNoWEsJ0X5mO4LgBnweMRgGvh6WHTmKFNFRvpry+X7dexk2c1bnhzhQf5mB0NAIByu6YZTJIUFRXFKXIAAIi5OQDKz2Kx6PqO9VQnwk9vz96uZ/67Tvfe0FTN4nkhFwDgmq55BhMAAAAqhp3tbzVes7gQPX5HO73xVclcpuE94jWwYz3mMgEAXM4VC6ZHH330il9ksVj07LPPVkogAABcBd0AgIoQHuitiaPa6MPvduqrZQeUlnFGdw1qLC+PMl8LBgDAaVzx/1r169e/5FhOTo7++9//Kjo6ulJDAQDgSthnAKPYrAJPD5vuvaGpYiNr6Yul+3Qs+5zGDW+uCOYyAQBcxBULprvuuqvU5ZSUFD3yyCMaMmSIJk2aVOnBAAAAgJrEYrFoQIe6qhPup7dmb9MzH63Tn29oqqQE5jIBAJyftawrFBYW6vnnn9ff/vY3TZw4UVOmTJG3t3dVZAMAAABqnKZxwXrijnYKCfDSq19s1tyUVNkZ2AUAcHK/e2J3Wlqaxo8fLx8fH82aNUtRUVFVlQsAAJfB0z4AFS0s0FuPjWqjj77bpZnLDygt84zuGthY3p7MZQIAOKcr7mD68ssvdfPNN6tv37769NNPKZfgdHhCB8BsjM0BUJk83W3685AmSu6dqA17jmvKJ+uVmX3O7FgAAFzWFV8CmTRpkqxWq9555x29++67juN2u10Wi0UbNmyokoAAAABATWWxWNS//S9zmbbr6f+u0703NFFSQqjZ0QAAKOWKBdPixYurMgcAAC6HnZQwys4qwlVqEhusJ25vqzdmbtWrX2zRsO7xGtypniy8BSEAwElcsWCKjo6uyhwAALgsnt7BOFYRyhYa6K1HR7XRf7/bpVnLD+hQxhndNYi5TAAA51Dmu8gBAAAAcA6e7jbdM6SJRvZO1Ma9J5jLBABwGrzcAQAAALgQi8Wifj/PZXpz9nZN/mitGsQEKjrUV9Fhvqod6qvaIb7y9LCZHRUAUINQMAEAAAAuqHFssJ64o61m/3hQh7LytDMtR4VFxZJKTroMCfD6uXTyU3RoSfEUFeIjD3eKJwBAxaNgguuyMxgVgHPg0QiAWUIDvPWnwU0kSUXFxTp+6oLSj+cp/cRZHT1xVuknzmrbwWwVFZc8UlksUligd6ndTtGhfooM9pG7G9MzAADlR8EEAEA5MZYZgDOxWa2KDPZRZLCP2jT89XhhUbEyc86XFE7H8xzF0+Z9J1X88wt2VotF4UG/LZ58FRHsIzcbxRMAoGwUTAAAAGZh+xuqgJvNWlIchfqqXaNwx/GCwmJlZp9T+s+F09ETZ3XkxFlt2HvcsVHcZrUoItjH8fW1fy6gwoO8ZbNSPAEAfkXBBABAOdENAHBl7m5WxYT7KSbcr9TxgsIiHTt57tfT7I6fVWpGrtbtynI87rnZLIoM9lF0mJ9jt1N0qK/CAr1ltbK/EwBqIgomAAAM4qkUjLKwiOBE3N1sqhvhr7oR/qWOXywo0rGTJYXTL6fZ7TtyWj/tyPyfr7UqKsTn191OoX6qHear0AAvWVnoAFCtUTABAAAAKJOnu02xkbUUG1mr1PHzFwt/3vGU5yifdh06pVXbfy2ePNytqh3y82l2Yb+ebhdSy0sWiicAqBYomAAAAACUm7enm+Jr11J87dLF07kLhTp68ufZTj8PF9+Wmq2V2zIc1/HysKl2qG+p0+xqh/oqyN+T4gkAXAwFEwAABjGLCQAu5ePlpsToACVGB5Q6nne+wHGK3dHjZ5V+Ik9b9p3Qii3HHNfx9nT7n9Psft31FODrQfEEAE6Kggkuiyd0AMzGUxwAuHZ+3u5qUCdQDeoEljqeey7/58Lp1xlPG/Yc1/LNRx3X8fX6uXgK8yv1rna1fDyq+LsAAPwWBRMAAIBJeLEE+FUtHw/VquehRvWCHMfsdrtyz+Yr/UTp4umnHZk6f7HQcT1/H/dSO55+eXc7P293M74VAKiRKJgAACgnygEAqFwWi0UBfp4K8PNUk9hgx3G73a5TeflKP5Hn2PWUfuKsUrZl6EJ+keN6Ab4eqh3qq4Z1AtWpWaTCAr3N+DYAoEagYAIAwCBOlYNRrCHg2lgsFgX5eyrI31PN4kIcx+12u7JzL/7Pbqc8HTl+VrNXHNTXKw6qQZ1AdWkWqbaNwuXtyVMhAKhIPKoCAAAAqBYsFotCArwUEuClpIRfi6eTpy9o1fYMrdx6TB9+t0tTF+1RmwZh6tw8So3rBslqpeYFAKMomAAAAABUayEBXhrcOVaDOtXT/qO5Stl6TD/tzNKq7ZkK8vdU52aR6tI8SpHBPmZHBQCXRcEEAAAAoEawWCxKjA5QYnSAbulTXxv3ntDKrRmatzpN365KU0LtWurcPErtG4fL14sB4QBwLZy2YNq1a5feffddeXt76/rrr1eXLl3MjgRnw3RdAE6ChyMAcD3ubja1bxyh9o0jdCrvolZvz9TKrcf0yfe79fmivWpVP1RdmkeqaVywbFar2XEBwOk5bcF07tw5PfLII3Jzc9OLL75IwQQAcDpM7ACA6iHQz1MDOtRV//Z1lJZ5Riu3ZuinHZlauytLAb4e6tQ0Up2bRyomzM/sqADgtJymYJo+fbrmzp3ruPzyyy8rLy9Pjz76qEaPHm1iMgAAgErC9jfAqVgsFsVG1lJsZC0l907U5n0nlbLtmBauO6z5aw6pXoS/OjePVMcmEfL38TA7LgA4FacpmJKTk5WcnOy4vHXrVsXHx2vatGm66667NHDgQBPTAQBwKboBVBi2wwFOx81mVZuGYWrTMEy55/L1045MpWzN0OeL9mrGkn1KSghRl+ZRSkoIkZuNU+gAwGkKpt+6cOGCJk6cqODgYPXo0cPsOAAAXBHdAABUb7V8PNS3bR31bVtHR7LytHLbMa3anqmNe0/Iz9tdHZpEqGvzKNWN8JPFwv8VANRMlV4w5eXlaeTIkXrrrbcUExMjSZozZ47efPNNFRQU6I477tBtt912yde1a9dO7dq1q+x4AAAAAHDVYsL9lNy7vkb0TND2g9lasTVDyzala/H6I4oO81WXZlHq2DRCgX6eZkcFgCpVqQXT5s2bNWnSJKWmpjqOZWZm6pVXXtHMmTPl4eGhkSNHqkOHDkpMTKzw+w8JYQhfZQkL8zc7ggr+Z8+AM+TB1eP3BaOcZQ2dPFsgSXJztzlNJlwdZ/l9ncgrWUMBAT5OkwlXh98XJCkyIkDXdYxT3rl8/bgpXYvXHdaMH/bpy6X71LpRhHq3raMOTSPl4W675GtZQzCKNQSjKnoNVWrBNGPGDD355JOaMGGC41hKSoo6duyowMBASVL//v01f/58jRs3rsLv/+TJPBUXMyGjooWF+ev48TNmx9DJ7HOOj50hD66Os6wfuC5nWkM5p0oehwoKipwmE8rmTGvo1M9r6PTpc06TCWVzpjUE59G2fqja1g/VsZNnlbItQynbMrRuZ6Z8PN3UvnG4ujSPUnztWrJYLKwhGMYaglHlXUNWq+WKm3kqtWCaMmXKJceysrIUFhbmuBweHq4tW7ZUZgwAACoFUzYAAL8VFeKrm3ok6MZu8dp5KEcrtx5TyrYMLd10VBHBPurSLFKDu1f82RsAYLYqH/Jtt1+6o4hBeAAAoCay816EQLVltVrUNDZYTWODdb5fodbtytLKbRmaufyAZv14QI3qBqlr8yi1bhAmT49LT6EDAFdT5QVTRESE1q1b57iclZWl8PDwqo4BAAAAAFXC29NN3VrUVrcWtZV16rw2H8jWwp/S9O7cHfL0sKldw3B1aR6p+nUCZeXFdwAuqsoLps6dO+v1119Xdna2vL29tWDBAj3zzDNVHQMAAMPYe4KKYuGES6DGCA/01q39G+m6VrW19/AprdyWobW7srRi6zGFBnipc7NIdW4epfBAb7OjAsA1MWUH0/jx4zV69GgVFBRoxIgRSkpKquoYAABUGKoBAMC1slosalg3SA3rBum2Pg20Yc9xrdx2THNWpuqblalqEBOgLs2j1LZRuLw9q/xpGwBcsyp5pFqyZEmpy0OGDNGQIUOq4q4BAAAAwKl5etjUqVmkOjWLVHbuBaVsy9DKbRn68Ltdmrpwj1o3DFOXZlFqXC9IVisvawBwTlThAAAAAOAkgmt5aXDnWA3qVE8HjuZq5bYMrdmRqdXbMxXk71lyCl2zSEWF+JodFQBKoWCCy7rcOxICgBl4NAIAVDSLxaKE6AAlRAfolusStXHvCaVsy9C81Wn6dlWa4mvXUpdmkWrfJEK+Xu5mxwUACiYAAMqLkxRgFK+VALga7m42tW8cofaNI3Qq76JWb8/Uym3H9MmCPfp88V61rB+mLs0i1Sw+WDar1ey4AGooCiYAAAAAcBGBfp4a0KGu+revo0OZeVq59ZhW78jUul1ZquXroU5NI9SlWZRiwv3MjgqghqFgAgCgnNh8ggrDdjgA18hisahepL/qRfrrD70TtWX/Sa3cekyL1h3R92sOq26En7o0i1KHphGq5eNhdlwANQAFEwAABtENAADM5GazqnWDMLVuEKYz5/L1045Mrdyaoc8X79WMH/YpKSFEnZtFqUViiNxsnEIHoHJQMAEAAABANeHv46E+beuoT9s6OnI8TylbM7Rqe4Y27j0hP293dWgcoS5JkaoX4S+LhZdIAFQcCiYAAAAAqIZiwvz0h96JuqlnvLYfzNbKrRlatvmoFm84ouhQX3VuHqlOTSMV6OdpdlQA1QAFEwAABjGLCQDgzGxWq5ISQpWUEKqzFwq0dmeWVm49pi9+2K8vl+5X8/gQDe4Uq8SYALOjAnBhFEwAAJQTJxYAAFyNr5e7eraKVs9W0Tp28qxStmXox81H9eyn69UiIUTDeySoDu9AB6AcmPAGAAAAADVQVIivbuqRoOfHdNbw7vHac+S0Jn+wRu98s11ZOefMjgfAxbCDCQAAwGTshgNgJk8PmwZ3jlWv1tH6bvUhLVp3WGt3ZalbUpSGdIlTkD8zmgCUjYIJAIByYvYSAKA68fVy14ieCerTNkZzUlK1fNNRrdyWoevaxGhgx3ry83Y3OyIAJ0bBBACAQew+AQBUJ4F+nhrVr6H6t6+r2T8e1Pc/HdKyTeka0L6u+rarIy8PnkYCuBSPDAAAAACAS4QHeuueIU10fce6mrX8gGb9eFCL1x/RoM6x6tkyWu5ujPQF8CsKJgAADOJUOQBAdRYT5qe/3JSk/emn9dWy/fp80V4tWHNIN3SNU+dmkbJZKZoA8C5ycGF2ntEBMBmnxgEAapKE6AA9fEsrPTSypfx9PPThvF164v01WrcrS3b+OAdqPHYwAQAAmIQnZABcjcViUdPYYDW5PUgb9hzXzOUH9J+vt6lepL9u6hGvprHBslh4CQaoiSiYAAAAAADXxGKxqE3DcLWqH6aUbRmaveKAXp6+WY3qBuqmHglKiA4wOyKAKkbBBABAObH3BBWF1/oBuCqr1aKuSVHq0CRCyzala25KqqZ8sl4tE0M1vHu8YsL9zI4IoIpQMAEAYBDlAACgpnN3s6pP2zrqmhSlheuOaP5PaXrygzXq0DRCw7rFKzzQ2+yIACoZBRMAAAAAoEJ4ebhpSOdY9WoVre9+StPidUe0dmeWureorSFdYhXo52l2RACVhIIJAAAAAFCh/LzddXPPRPVpU0dzU1K1fPNRrdx6TNe1jdH1HerJz9vd7IgAKhgFE1wWs08AOAsejwAAuLwgf0+N6t9Q/dvX0dcrDmr+6kNauvGoBnSoq75tY+TlwVNSoLrgv2YAAMqJ2UsAAFyd8CAf/XlIUw3sUE8zlx/QrOUHtHjdYQ3uHKseLaPl7mY1OyIAgyiYAAAAAABVIibcTw+MSNK+9NOauWy/Plu0V9+vOaxh3eLUqWmkrFZevgFcFTUxAACA2Sw8oQJQsyRGB+jhW1rpb8kt5Ofjrve/3anH3/9J63dnyW7n5HPAFbGDCQCAcuLPXwAAys9isahZXIiaxgZr/e7jmrn8gP5v1jbFRflreI8ENY0NNjsigGtAwQQAgEHsPQEAoPwsFovaNgpXqwahStmWoW9WHNS/p21S43pBGt4jXgm1A8yOCOAqUDABAAAAAExns1rVLam2OjaJ1NKN6Zq7KlVTPl6vVvVDNbx7vKLD/MyOCOB3UDABAGAQp8oBAFBx3N2s6tuujromRWnRusOav+aQnnh/jTo2jdSwbnEKC/Q2OyKAy6Bgguti+B8Ak3FqHAAAlcfb001DusSpV+sYzVudpsXrj2jNzkz1aFlbQzrHKsDP0+yIAP4HBRMAAIBJeK0EAMrm5+2uP/RKVN+2dTRn5UEt23RUK7YcU5+2dXR9x7ry9XI3OyIAUTABAACYjt1wAFC2IH9PjR7QSP071NXsHw/qu9VpWroxXdd3rKs+berI08NmdkSgRrOaHQAAAFfF5hMAAKpeRJCP/nxDU02+q73qxwToq2UH9Mjbq7R4/REVFhWbHQ+osdjBBACAQew+AQCg6tUJ99Nfb26hvUdO6atlBzR14R59v+aQhnaNU6emkbJa+T80UJXYwQQAAAAAcFn1YwL1yK2tNP4PLeTj5ab3v92pJz9Yow17jsvOsDugyrCDCQAAAADg0iwWi5rHh6hpXLDW7z6umcsP6I2ZWxVfu5Zu6h6vxrHBZkcEqj0KJrgsXosA4Cx4PAIAwDlYLRa1axSu1g1CtXJrhmavOKgXp21Sk9gg3dQjQXFRtcyOCFRbFEwAAAAmoZwEgMphs1rVvUVtdWoaoR82pGvuqjQ98991at0gTDd2j1d0qK/ZEYFqh4IJAAAAAFAtubvZ1K99XXVrUVsL1x7W/DWHtHHvcXVuGqmhXeMUGuhtdkSg2qBgAgAAMJmFNzoCgErl7emmG7rGqVfraM1bnabF69O1ekemeraK1uDOsQrw9TA7IuDyKJgAACgvzm8CAMCl+Pt4KLl3ffVtW0dzUlL1w4Z0/bjlqPq2raPrO9SVj5e72REBl0XBBACAQWw+AQDAtQTX8tLtAxppQPu6mvXjAX27Kk1LN6br+o71dF2bGHm628yOCLgcCiYAAAAAQI0UEeyjMUObaWDHM5q5/IC+XLpfC9cd1g2dY9WtRW252axmRwRcBgUTXBenpgBwEjwcAQDg2upG+OvBm1toz+FTmrlsvz5ZsEfz1xzSsK7x6tAkQlYr+5WBslDHAgAAAAAgqUGdQD1yW2s9eHMLeXu46d25O/Tkh2u0L/202dEAp0fBBAAAYBY7+98AwNlYLBYlJYToiTvbaczQprpwsVD/mbVVF/ILzY4GODUKJgAAAAAAfsNqsah94wiNGdZMp/LyNScl1exIgFOjYAIAAAAA4AoSageoa/MoLVhzWMdOnjU7DuC0KJgAACgnO+O9AQCoEW7qmSAPd5s+X7RXdk5vBi6LggkAAIN4XxkAAKq3AF8PDesap20Hs7Vp7wmz4wBOiYIJAACDeB0TAIDqr3ebaEWH+erzxXuVX1BkdhzA6VAwwWXxhA4AAABAVbFZrbqtTwOdOH1B8386ZHYcwOlQMAEAAJiEF0sAwLU0qhek9o3D9e3qNJ04dd7sOIBToWACAAAwmcXCJC8AcBV/6JUoi0WavmSf2VEAp0LBBAAAAADAVQqu5aUhnWO1fs9xbTt40uw4gNOgYAIAoJx4l2IAAGqmfu3qKjzIW58t3KvComKz4wBOgYIJAACDOLkJAICaxd3Nqlv7NFBG9jktWnfE7DiAU6BgAgAAAADgGiUlhKhlYqhmrzyonDMXzY4DmI6CCS7LzrkpAJwEj0YAANRMI69LVFGRXV8sZeA3QMEEAABgEspJAHBt4UE+GtChrlZvz9Sew6fMjgOYioIJAAAAAIByGtSpnkJqeWrqwj0qLualA9RcFEwAAAAAAJSTp7tNyb3r63BWnpZuSjc7DmAaCiYAAAAAAAxo0zBMjesFaeayA8o9l292HMAUFEwAAAAAABhgsVh0a98GulhQpJnLDpgdBzAFBRMAAAZZzA4AAABMFx3qq+vaxOjHzUd18Fiu2XGAKkfBBACAQYzzBAAAkjS0a5z8fT1KBn7b+QsBNQsFEwAAAAAAFcDb001/6JWgA0dztXLrMbPjAFWKggkAAMAsvLgNANVOp6aRSowO0FdL9+vchQKz4wBVhoIJAADAZBYGeQFAtWGxWHRb3wY6c65AX684aHYcoMpQMAEAAAAAUIHqRfqrZ6toLVmfriPH88yOA1QJCiYAAMrJzvBOAABwBTd2j5e3p02fLdzD3wyoESiYAAAwiLObAADAb/l5u+umHgnadeiU1u7KMjsOUOkomAAAAAAAqATdW9RWvQh/TV+yTxfyC82OA1QqCia4LHaZAnAWPBwBAIDLsVpLBn7nnLmob1elmR0HqFQUTAAAACaxU08CQLWXGBOgLs0iNf+nQ8rMPmd2HKDSUDABAACYzMIkLwCo1kb0TJC7m1WfLdrLwG9UWxRMAAAAAABUogA/Tw3rGqetB05q876TZscBKgUFEwAAAAAAlax3mxjVDvXV54v3qKCwyOw4QIWjYAIAAAAAoJK52ay6rU99HT91QfN/OmR2HKDCUTABAGAQ03MAAMDVaBwbrLaNwvXtqjSdOH3e7DhAhaJgAgDAIEZ1AgCAq5XcK1GSNGPJPpOTABWLggkAAMAstJMAUOOEBHhpUOdYrdt9XNtTs82OA1QYCiYAAAAAAKrQgPZ1FB7orc8W7lFhUbHZcYAKQcEEAABgNgZ5AUCN4u5m08g+9XXs5DktXn/E7DhAhaBgAgAAAACgirVMDFVSQohmrzioU3kXzY4DGEbBBABAOdmZnwMAAAy4pU99FRYV64sf9psdBTCMggkAAIM4uwkAAJRHRJCP+revq1XbM7T3yCmz4wCGUDABAAAAAGCSwZ1iFeTvqakL9qi4mO3RcF0UTHBZdt7bGYCT4NEIAACUl6eHTcm9E3UoK0/LNh81Ow5QbhRMAAAAJqGcBABIUrtG4WpUN1Azl+1X3vkCs+MA5ULBBAAAYDLmeAFAzWaxWHRb3wY6f7FIM5cx8BuuiYIJAAAAAACTRYf56bo2MVq26ajSMs6YHQe4ZhRMAAAAAAA4gaFd4+Tv465PF+5WsZ0TqeFaKJgAACgn/uwDAAAVycfLTSN6Jmp/eq5WbcswOw5wTSiYAAAwiPk5AACgonRuHqmE2rX0xdL9Oneh0Ow4wFWjYILLYscoAGfBwxEAAKgoVotFt/VroDNn8/XNyoNmxwGuGgUTAACASXixBABwObGRtdS9ZW0tWndE6cfzzI4DXBUKJgAAALNxniUA4DeGd4+Xt6dNny3aKzuvSMAFUDABAAAAAOBk/H08NLx7vHam5Wjd7uNmxwHKRMEEAAAAAIAT6tEyWnXD/TR9yV5dzC8yOw7wuyiYAAAAAABwQlZrycDv7NyL+nZ1qtlxgN9FwQQAQHkxDwEAAFSy+jGB6tQ0QvN/OqTMnHNmxwGuiIIJAAAAAAAndnOvRNlsVk1btNfsKMAVUTABAACYhl1wAICyBfp5amiXOG3ef1Kb9p0wOw5wWRRMAAAAAAA4uT5tYxQV4qNpi/Yqv4CB33A+FEwAAAAms8hidgQAgJNzs1l1a58Gyjp1Xl8v2292HOASFEwAAAAAALiApnHBatMwTDMW71F27gWz4wClUDABAAAAAOAiknsnym6Xpi/ZZ3YUoBQKJgAAyonxzAAAoKqFBnjr5uvqa+2uLO1MzTY7DuBAwQQAgEFMzwEAAFVpeM9EhQZ4aeqivSosKjY7DiCJggkuzM7WAQBOgocjAABQlTzcbbqlT30dPXFWSzakmx0HkETBBAAAYBpeLAEAlFfLxFA1jw/R7BUHdDrvotlxAAomAAAAs1k4zxIAcI0sFotu6VNf+QXF+nLpfrPjABRMAAAAAAC4oshgH/VvX1crt2VoX/pps+OghqNgAgAAAADARQ3uXE9B/p6aumCPios59xrmoWACAAAAAMBFeXm46Q+9EpWWeUbLtxw1Ow5qMAomAADKidcIAQCAM2jfOFwN6wTqq6X7lXe+wOw4qKEomOCy7Dy1AwAAAABZLBbd1reBzl8s0qzlB8yOgxqKggkAAMAkvFQCAKgoMeF+6t06Wks3pSst44zZcVADUTABAAAAAFANDOsWJz9vd01duEd2Oy9joGpRMAEAAAAAUA34eLlrRI8E7Us/rVXbM8yOgxqGggkAAAAAgGqiS1KU4qJq6Ysf9uv8xUKz46AGoWACAAAAAKCasFos+mO/Bso9m69vVh40Ow5qEKcumAoLC/XHP/5RW7duNTsKAACXYrQBAABwQnFRtdStRZQWrTuioyfOmh0HNYRTF0xvvPGGIiMjzY4BAMDvspgdAAAA4DeG90iQp7tNny1i4DeqhpvZAX4xffp0zZ0713H5pptuUsuWLWWz2UxMBafGYyQAJ8HDEcqNxQMAqCS1fDx0Y/d4TV24R+t3H1fbRuFmR0I15zQFU3JyspKTkx2Xx44dq7CwMG3btk2pqan697//bWI6AAAAAABcS89WtbVs01FNX7JXzRNC5OnOBg5UHqc9Re7NN9/U008/rV69eumOO+4wOw4AAEClsXCeJQCgEtisVv2xXwOdzL2oeavSzI6Daq7SC6a8vDwNHjxYR44ccRybM2eOBg4cqL59+2rq1Km/+/V/+ctf1Lx588qOCQAAAABAtdOgTqA6NonQdz8dUtap82bHQTVWqafIbd68WZMmTVJqaqrjWGZmpl555RXNnDlTHh4eGjlypDp06KDExMQKv/+QEL8Kv02UCAvzNzuCTp4rcHzsDHlw9fh9wShnWUMB2SV/pLm72ZwmE66Os/y+ArJK3tknKNDXaTLh6vD7glGsIRh1LWtozIgWGvv8Ys368aAm3dWhElPBlVT041ClFkwzZszQk08+qQkTJjiOpaSkqGPHjgoMDJQk9e/fX/Pnz9e4ceMq/P5PnsxTcTHTMytaWJi/jh8/Y3YMnco55/jYGfLg6jjL+oHrcqY1dPp0ScFUUFjkNJlQNmdcQzmnzuq4F3MxXIUzrSG4JtYQjCrPGhrcKVZfLN2vxatTlZQQUknJ4CrK+zhktVquuJmnUk+RmzJlitq2bVvqWFZWlsLCwhyXw8PDlZmZWZkxAACoFHbeAgwAALiIvu3qKCLYR58v2qOCwmKz46AaqvIh33b7pX+MW5hsiXLgaR0AAAAAXB03m1W39a2vzJzzWrD2kNlxUA1VecEUERGhEydOOC5nZWUpPDy8qmMAAACYjl1wAICq1CwuRK3qh2pOSqqycy+YHQfVTJUXTJ07d9aqVauUnZ2t8+fPa8GCBerevXtVxwAAAHAaFrGbGwBQNUZeV192uzTjh31mR0E1U6lDvi8nIiJC48eP1+jRo1VQUKARI0YoKSmpqmMAAAAAAFDjhAV66/oOdfXNylT1bJmjRvWCzI6EaqJKCqYlS5aUujxkyBANGTKkKu4aAAAAAAD8j4Ed6yllW4amLtqjyXe2k81a5Sc3oRpiFQEAAAAAUIN4uNs08rr6Sj9+Vks2pJsdB9UEBRMAAOXFfGYAAOCiWtUPVdO4YH394wGdPptvdhxUAxRMAAAYxHhmAADgaiwWi27tU1/5BcX6aul+s+OgGqBgguti5wAAJ8HDEcqNxQMAMFFUiK/6taujFVuPaf/R02bHgYujYAIAAAAAoIYa3DlWAX4emrpgj4rtvPKB8qNgAgAAAACghvL2dFNyr0SlZpzRii3HzI4DF0bBBAAAAABADdahSYQaxAToy6X7lXe+wOw4cFEUTAAAAAAA1GAWi0W39m2gsxcK9PWPB8yOAxdFwQQAAAAAQA1XN8JfvVvF6IeN6TqUecbsOHBBFEwAAJQTYzABAEB1Mqx7nHy93DV14R7ZGfiNa0TBBJdl56kdAMDF8X8yAIAz8fVy14ieCdp75LRW78g0Ow5cDAUTAAAAAACQJHVNilJclL9m/LBP5y8Wmh0HLoSCCQAAwGQWi9kJAAAoYf154PfpvHzNSUk1Ow5cCAUTAAAAAABwSKgdoK5JUVq49rCOnTxrdhy4CAomAAAAAABQyogeCfJwt+kzBn7jKlEwAQAAAACAUmr5emhYtzhtT83Rhj0nzI4DF0DBBAAAAAAALtG7dbSiw3w1bfFe5RcUmR0HTo6CCS6LXZoAzMbjEAAAqM5sVqv+2LeBTuZe0LzVaWbHgZOjYAIAADAJJSUAwNk1rBuk9o3DNW/1IR0/dd7sOHBiFEwAAAAAAOCK/tArUVarNG3xXrOjwIlRMAEAAAAAgCsKruWlIZ1jtXHvCW07cNLsOHBSFEwAAAAAAOB39WtXVxFB3pq6aK8Ki4rNjgMnRMEEAAAAAAB+l7ubVbf0aaDM7HNauPaw2XHghCiYAAAAAABAmZISQtQyMVTfrExVzpmLZseBk6FgAgCg3HgLMAAAULOM7FNfRcV2ffHDPrOjwMlQMAEAAJiGkhIA4FrCA711fYe6Wr0jU7sP5ZgdB06EggkAAMBkFovF7AgAAFy1gZ3qKaSWp6Yu3KOiYgZ+owQFEwAAAAAAuGqe7jYl966vI8fPaunGo2bHgZOgYAIAAAAAANekTcMwNYkN0qzlB5R7Lt/sOHACFEwAAAAAAOCaWCwW3dqngS4WFGnmsv1mx4EToGACAAAAAADXrHaor3q3jtGPm48p9yy7mGo6CiYAAAAAAFAudSP8ZJd0oaDI7CgwGQUTXJbdzls7AzAXD0MwijUEAACqCwomAAAAAAAAGELBBAAAYDKL2QEAAAAMomACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIZQMAEAAAAAAGN4a9Qaj4IJAIBy4s8oAABQ01l4pwr8jIIJAAAAAAAAhlAwAQAAmI1XfwEAgIujYAIAAAAAAIAhFEwAAAAAAAAwhIIJAAAAAAAAhlAwAQAAAAAAwBAKJgAAAAAAYIjd7AAwHQUTXJadRzAAZuNxCAaxhAAArs7CW6HiZxRMAAAAJuNPcwAA4OoomAAAAAAAAGAIBRMAAAAAAAAMoWACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIa4mR2gMlmtvCdLZXGGn62nh03hQd6SnCMPrh6/LxjlLGvIy9NN4UHeCvL3cppMuDrO8vvy/nkNebjbnCYTrg6/LxjFGoJRzrKGvL1K/l/mbrM6TSZcnfL8vn7vayx2u91uJBAAAAAAAABqNk6RAwAAAAAAgCEUTAAAAAAAADCEggkAAAAAAACGUDABAAAAAADAEAomAAAAAAAAGELBBAAAAAAAAEMomAAAAAAAAGAIBRMAAAAAAAAMoWACAAAAAACAIRRMuGpz5szRwIED1bdvX02dOtXsOHBReXl5Gjx4sI4cOWJ2FLigN954Q4MGDdKgQYP0wgsvmB0HLujVV1/VwIEDNWjQIH344Ydmx4GLev755/WPf/zD7BhwUaNHj9agQYM0dOhQDR06VJs3bzY7ElzIkiVLNHz4cA0YMED//Oc/zY4DF/TFF184Hn+GDh2qNm3a6Omnn66Q23arkFtBtZeZmalXXnlFM2fOlIeHh0aOHKkOHTooMTHR7GhwIZs3b9akSZOUmppqdhS4oJSUFK1YsUKzZs2SxWLR3XffrYULF6pv375mR4OLWLNmjVavXq1vvvlGhYWFGjhwoHr06KH4+Hizo8GFrFq1SrNmzVLPnj3NjgIXZLfbdeDAAS1dulRubjwVw7U5fPiwnnzySX3xxRcKCQnR7bffrmXLlqlHjx5mR4MLufnmm3XzzTdLkvbu3av7779f48aNq5DbZgcTrkpKSoo6duyowMBA+fj4qH///po/f77ZseBiZsyYoSeffFLh4eFmR4ELCgsL0z/+8Q95eHjI3d1dCQkJOnr0qNmx4ELat2+vjz/+WG5ubjp58qSKiork4+Njdiy4kFOnTumVV17RmDFjzI4CF3XgwAFZLBbdc889uuGGG/Tpp5+aHQkuZOHChRo4cKAiIyPl7u6uV155RS1atDA7FlzY5MmTNX78eAUHB1fI7VGb46pkZWUpLCzMcTk8PFxbtmwxMRFc0ZQpU8yOABdWv359x8epqamaN2+epk2bZmIiuCJ3d3e99tpr+uCDDzRgwABFRESYHQku5IknntD48eN17Ngxs6PAReXm5qpTp06aPHmyLly4oNGjRysuLk5dunQxOxpcQFpamtzd3fWnP/1Jx48fV69evfTggw+aHQsuKiUlRRcuXND1119fYbfJDiZcFbvdfskxi8ViQhIANd3evXt111136ZFHHlFsbKzZceCCHnjgAa1atUrHjh3TjBkzzI4DF/HFF18oKipKnTp1MjsKXFirVq30wgsvyMfHR8HBwRoxYoSWLVtmdiy4iKKiIq1atUovvviiZsyYoa1bt2rWrFlmx4KLmjZtmu68884KvU0KJlyViIgInThxwnE5KyuL05wAVLn169frjjvu0EMPPaQbb7zR7DhwMfv379fOnTslSd7e3urXr592795tciq4innz5mnlypUaOnSoXnvtNS1ZskTPPvus2bHgYtatW6dVq1Y5LtvtdmYx4aqFhoaqU6dOCg4OlpeXl6677jrOKkG55Ofna+3aterdu3eF3i4FE65K586dtWrVKmVnZ+v8+fNasGCBunfvbnYsADXIsWPHdP/99+ull17SoEGDzI4DF3TkyBFNmjRJ+fn5ys/P1+LFi9WmTRuzY8FFfPjhh5o7d65mz56tBx54QL1799Zjjz1mdiy4mDNnzuiFF17QxYsXlZeXp1mzZvFmFbhqvXr10ooVK5Sbm6uioiL9+OOPatq0qdmx4IJ2796t2NjYCp9FSV2OqxIREaHx48dr9OjRKigo0IgRI5SUlGR2LAA1yPvvv6+LFy/qX//6l+PYyJEjdcstt5iYCq6kR48e2rx5s4YNGyabzaZ+/fpRVgKoUr169XI8DhUXF+vWW29Vq1atzI4FF9GiRQvdfffduvXWW1VQUKAuXbropptuMjsWXNDhw4cVGRlZ4bdrsV9uuA4AAAAAAABwlThFDgAAAAAAAIZQMAEAAAAAAMAQCiYAAAAAAAAYQsEEAAAAAAAAQyiYAAAAAAAAYAgFEwAAAAAAAAyhYAIAAAAAAIAhFEwAAMDl9e7dWykpKWbHAAAAqLEomAAAACpYdna2GjZsqMzMTLOjAAAAVAkKJgAAgArw0ksv6ccff5Qk7dq1S8HBwYqIiDA5VYkHHnhAe/bscVw+cuSIWrVqVa7bOnv2rO6++25duHChouIBAIBqgIIJAABUK/v379eoUaPUtm1bDRo0SIsXL3Z8bvv27Ro2bJhatWqlBx54QA8++KBeeeUVw/e5adMm7du3T926dZMk7dy5U40aNTJ8uxUhPz9faWlpatCgQYXcnq+vrwYPHqxXX321Qm4PAABUDxRMAACg2igoKNCYMWPUpUsXpaSkaNKkSfr73/+uAwcOKD8/X+PGjdONN96oNWvWaPDgwVq0aFGF3O/rr7+u5ORkx2VnKphSUlLUqVOnCr3N66+/XnPmzNGJEycq9HYBAIDromACAADVxubNm3Xu3Dn9+c9/loeHhzp16qRevXrp22+/1ebNm1VYWKjRo0fL3d1d/fr1U/PmzR1fe+bMGY0YMUKtWrUqdTrZiy++qFtvvVUPP/ywCgoKLrnP3NxcrV+/Xl26dHEc27Vrlxo3bnzJdadPn65Ro0Y5/iUlJWnLli2Oz48cOVJvvPGGpJLT2Bo2bKjVq1dLKtmJ1K5dO3366aeSpLy8PI0ZM0ajRo1ScnKyli1bdtmfyeLFi9WnT59r+TGWydPTU61bt77ifQIAgJrHzewAAAAAFSUrK0uRkZGyWn99Da127drKzMxUVlaWIiIiZLFYHJ+LiopyfOzl5aV33nlHL7zwguPYrl27lJmZqc8++0xvvvmmvv/+ew0ePLjUfaalpSksLEweHh6SpIsXL+rgwYNq0qTJJfmSk5MdO52WLFmiWbNmKSkpSZJ07NgxRUREaM2aNY7rN2vWTAsXLlTHjh21atUq1atXz/G52bNnq1u3brrttttkt9t15syZS+6vuLhYmzZt0uTJk6/q5/eLzMxMffzxxyosLJTdblfjxo114403lrpO3bp1dfDgwWu6XQAAUH2xgwkAAFQb4eHhysjIUHFxsePYL8VNWFiYMjMzZbfbS33uF+7u7goODi51exs2bFDXrl0lSd26ddOGDRsuuU+r1aqioiLH5T179sjNzU1xcXFXzJmdna1XX31VTz31lOPY999/ryFDhig+Pl779++XJEVHR+vo0aOy2+1auHCh+vXr57i+p6enNm3apBMnTshisahWrVqX3M/mzZvVrFkz2Wy2K2b5reLiYn3zzTcaP368Hn30UT322GNKSEjQ0qVLS12vqKjomm4XAABUbxRMAACg2khKSpKXl5fee+89FRQU6KefftKSJUs0cOBAtWzZUjabTZ9++qkKCwu1aNEibd269XdvLzc3V35+fpIkf39/nT59+pLr1KlTR9nZ2bp48aKkkl1PCQkJKiws1MWLF3Xx4kXl5+eX+prJkyfrr3/9a6lCa8WKFerevbsGDx6s+fPnO463atVKa9euVXZ2tkJDQx3Hhw4dqri4OP3pT39ScnKyDhw4cEm2RYsW6brrrruKn9yvtmzZomHDhsnNzU3fffed0tPTlZSUpPPnz5e63pEjR363RAMAADULBRMAAKg2PDw89NZbb2n58uXq2LGjnnrqKb3wwgtKSEiQh4eHXn/9dX355Zdq166dvvnmG/Xs2dNxatvl+Pv7Ky8vT1LJjKaAgIBLrlOrVi21adPGMStp586d2r59u5KSkhz/Bg4c6Lj+119/LX9/f/Xu3dtxLCMjQ3v37tXYsWP15ptvlppt1K9fPz333HNq3759qft1d3fXfffdp9mzZ+uBBx7Q66+/fkm2lJQUxw6s3zp37pxatWpV6t/u3btls9kcO8DeeustrVu3TpJK7VbKz8/Xxo0bS30PAACgZmMGEwAAcHlLlixxfFy/fn3HIOzfat68uWbPnu24fPPNN6tXr15XvN3WrVvrww8/1LBhw7RixQq1bt36ste7//779dZbb6lHjx564okn9MQTT1z2eseOHdNHH310Sb758+fr0Ucf1YABAySV7HD6ZddTbGys2rRpowEDBiglJcXxNenp6Y7ZTyEhIaVO/fvFrFmzLpsjJiZGu3fvvuznCgoK9PHHH+v22293/Ky2bt1aqmCaO3euhgwZctnT8gAAQM1EwQQAAGqMNWvWKC4uTkFBQZozZ452796tbt26OT5/zz33aOfOnTp48KCSk5M1fPhwhYSE6NZbb1VUVJTuuuuuy95u69atFRcXp+XLl6t79+5XvP+3335bubm5Gjt2rOPYfffdpwULFuj//u//HMc6dOig7777znF50qRJl9zWnj17NH78eHl6esput1+x1LpW7u7uuv766/Xvf//bsZOpfv36GjFihKSSd6+bO3eu493uAAAAJMliv9zLXQAAANXQ9OnT9eqrr+r8+fOKiYnRQw89pJ49e5odCwAAwOVRMAEAAAAAAMAQhnwDAAAAAADAEAomAAAAAAAAGELBBAAAAAAAAEMomAAAAAAAAGAIBRMAAAAAAAAMoWACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIb8fxzqA03KlXkqAAAAAElFTkSuQmCC\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot luminosity distribution\n", + "ldist = population.grid_results['luminosity distribution']\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "pad_output_distribution(ldist,\n", + " binwidth['luminosity'])\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict({'ZAMS luminosity distribution' : ldist})\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")" + ] + }, + { + "cell_type": "markdown", + "id": "0546f2f3-4732-4841-8ef3-565fbf6b9961", + "metadata": {}, + "source": [ + "This distribution is peaked at low luminosity, as one expects from observations, but the resolution is clearly not great because it's not smooth - it's spiky! \n", + "\n", + "If you noticed above, the total probability of the grid was about 0.2. Given that the total probability of a probability distribution function should be 1.0, this shows that our sampling is (very) poor. \n", + "\n", + "We could simply increase the resolution to compensate, but this is very CPU intensive and a complete waste of time and resources. Instead, let's try sampling the masses of the stars in a smarter way." + ] + }, + { + "cell_type": "markdown", + "id": "673031c9-7d80-45d4-b209-301c127d3edf", + "metadata": {}, + "source": [ + "# A better-sampled grid\n", + "\n", + "The IMF has many more low-mass stars than high-mass stars. So, instead of sampling M1 linearly, we can sample it in log space. \n", + "\n", + "To do this we first rename the mass grid variable so that it is clear we are working in (natural) logarithmic phase space." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "5956f746-e3b9-4912-b75f-8eb0af66d3f6", + "metadata": {}, + "outputs": [], + "source": [ + "# Rename the old variable (M_1) because we want it to be called lnM_1 now\n", + "population.rename_grid_variable(\"M_1\",\"lnM_1\")" + ] + }, + { + "cell_type": "markdown", + "id": "532f691c-c1f6-46cc-84f2-970ec1216e40", + "metadata": {}, + "source": [ + "Next, we change the spacing function so that it works in the log space. We also adapt the probability calculation so that it calculates dprob/dlnM = M * dprob/dM. Finally, we set the precode to compute M_1 because binary_c requires the actual mass, not the logarithm of the mass." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "108d470a-bb21-40b0-8387-2caa7ab0f923", + "metadata": {}, + "outputs": [], + "source": [ + "# update the sampling, note that the IMF is dprob/dM1, and the phase \n", + "# space is now sampled in lnM1, so we multiply by M_1 to \n", + "# because M * dprob/dM = dprob/dlnM\n", + "population.update_grid_variable(\n", + " name=\"lnM_1\",\n", + " spacingfunc=\"const(math.log({min}), math.log({max}), {res})\".format(min = massrange[0], max = massrange[1], res = resolution[\"M_1\"]),\n", + " probdist=\"three_part_powerlaw(M_1, 0.1, 0.5, 1.0, 150, -1.3, -2.3, -2.3)*M_1\",\n", + " dphasevol=\"dlnM_1\",\n", + " parameter_name=\"M_1\",\n", + " precode=\"M_1=math.exp(lnM_1)\",\n", + ")\n", + "# print(population.grid_options[\"_grid_variables\"]) # debugging" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "fb8db646-f3d0-4ccd-81ba-7fde23f29c79", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating grid code\n", + "Constructing/adding: lnM_1\n", + "Grid has handled 40 stars\n", + "with a total probability of 0.9956307907476224\n", + "Total starcount for this run will be: 40\n", + "Generating grid code\n", + "Constructing/adding: lnM_1\n", + "Population-83f80d829dbd418aa2bc745c99b71991 finished! The total probability was: 0.9956307907476224. It took a total of 0.9961590766906738s to run 40 systems on 2 cores\n", + "There were no errors found in this run.\n", + "OrderedDict([('luminosity distribution', OrderedDict([(0.25, 0.0212294), (2.75, 0.00321118), (-0.25, 0.0268827), (1.25, 0.0104553), (3.75, 0.00283037), (6.25, 7.34708e-05), (-0.75, 0.0771478), (0.75, 0.030004499999999996), (2.25, 0.00921541), (3.25, 0.0045385), (1.75, 0.014776889999999999), (4.25, 0.002380189), (4.75, 0.000869303), (5.25, 0.0007310379999999999), (5.75, 0.00036002859999999996), (-2.75, 0.1961345), (-1.75, 0.2181597), (-3.25, 0.0), (-2.25, 0.2568974), (-1.25, 0.11973310000000001)]))])\n" + ] + } + ], + "source": [ + "# Clean and re-evolve the population \n", + "population.clean()\n", + "analytics = population.evolve() \n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "markdown", + "id": "182b1094-5057-4ccf-bac6-9b0e560ad4f6", + "metadata": {}, + "source": [ + "You should see that the total probability is very close to 1.0, as you would expect for a well-sampled grid. The total will never be exactly 1.0, but that is because we are running a simulation, not a perfect copy of reality." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "68ee1e56-21e5-48f4-b74c-50e48685ae94", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJgAAAJWCAYAAAAUZj1OAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAB37ElEQVR4nOzdd3iV9f3/8dcZ2XtPstkhrLD3ElkyREGtA+vA0eHXqq1SRa221rb+2lpx1C3WVYaAKEtUlpAwE0YgJJCQkAGEEFbW+f2BpqUKAZJz7pOc5+O6uC7PneTcrxy8Q/LK5/O+TTabzSYAAAAAAADgCpmNDgAAAAAAAICWjYIJAAAAAAAATULBBAAAAAAAgCahYAIAAAAAAECTUDABAAAAAACgSSiYAAAAAAAA0CQUTAAAAAAAAGgSq9EB7OnYsZOqr7fZ9RwhIb46cqTKrucAnBnXAMB1AHANwNVxDcDVcQ24DrPZpKAgnx99W6sumOrrbXYvmL4/D+DKuAYArgOAawCujmsAro5rAGyRAwAAAAAAQJNQMAEAAAAAAKBJWvUWOQAAAAAAHKmurlbHjpWptrba6CgOU1pqVn19vdEx0IysVncFBYXJYrn02oiCCQAAAACAZnLsWJk8Pb3l4xMpk8lkdByHsFrNqq2lYGotbDabTp6s1LFjZQoNjbrkj2OLHAAAAAAAzaS2tlo+Pv4uUy6h9TGZTPLx8b/sVXgUTAAAAAAANCPKJbR0V/L/MAUTAAAAAAAAmoSCCQAAAACAVmjbti267bYbz/szeHBvffHFZw3v8+9/f6ihQ/vqyJHy8z524MB0/d//3X/esYqKCg0Z0kevv/6KJOnw4cN6+OEHdNNN1+vmm6/Xb3/7ax07dvQHOV5//ZWGj2mKf/7zZa1Z81WTn+d7CxZ8ogULPpEkPfvskzp8uPiKnuf+++/S5s0Z2r17p/7wh6cv+H5FRYf0+98/1WiWgQPTL+v8a9Z8rQ8+eO8Hz+NoDPkGAAAAAKAV6tq1u9566/2Gxx9+OFeff75EQ4eOaDi2ZMkiDRw4RIsXL9Stt/70vI8vKChQZWWl/P39JUmrV6+Un59/w9uff/5ZXX31WI0ZM1a1tfV699039fzzv9ezzz5vl8/njjtmNuvzTZo0teG/N2/O0IwZdzbp+Tp06KRf/7rTBd9++HCxDh0qbDTL5dqzZ1ezPE9TUTABAAAAANDKbdu2Re+884ZeffVteXh4SJL27durysrjevjhxzRr1sO6+eYZMpv/s9Fp4MDB+uab1Ro37hpJ5wqmwYOHNrz96NFynT17puHxtdder127dl40x8CB6VqzJkOS9Nlni7RlS6Yee2y2pk6doOHDR2ndujWyWCy6++779MEH76mwsED33fdLjRgxSs88M1vdu/dU9+499eijv1JSUrJycvYoODhETz/9B/n7B2jt2m/02mtzZLPVKzo6Rg899KiCg0P04ov/T5s2fSuLxayBA4fo9tvvalhV5e7uofLyMj300C90xx0z9cEHc/Xyy29IkpYuXazs7B361a9+0/A5VFdX67nnntbu3bsUGRmt48crJJ0rqd5441W9+OKr+uCD97R06RKZzSZ17NhZDz/8mP761z+pqOiQ/vzn5zRs2AjNmfM31dXVKykpWVFR0ZKkn/70bknSc889o127shUQEKjf/OZxRUZG6v7779Ltt9+lHj3SVVxcpJ/97G49//xftXDhPElSZGRUwyqsn/707gu+FlOnTtDo0WO1ceN6nT59RrNmPakOHTpe8v9LF0LBBAAAAACAHazdUaw1269s21VjBqZFaUCXS7uF/LFjRzV79mN65JHfKiYmtuH4Z599quHDR6pDh46yWCz69tt16tdvYMPbhw8fqXfeeUPjxl2jI0fKZbNJISGhDW+/++779dRTv9Xrr7+qnj17qW/f/ho+fNQVf06hoWF6772P9OyzT+q9997S3/72snbs2Ka//e3PGjHi/Ofdt2+vfvObx9WuXQc99thDWrZsqUaMuErPP/+s5sx5XVFR0Xr//Xf0l7/8Ufff/0tt2LBO7733kc6ePavnnvudzp492/BcN998mxYu/Leef/6vioyM0j/+8TcdOlSomJhYLV26WHffff5WwU8++VCSNHfuJyooOKhbb73hvLfX1tbqvffe0oIFn8tsNusvf3lOZWWl+sUvfqU33nhVDz74iDZvzlBBwUF98sli+fr6/mALYffuPfTII49p3ryP9de//km///2ffvQ1S0xM0sSJUyRJ48Zd0/A8x44d/dHX4ne/e06SFBAQoNdee0effPKB3n33DT3zTNNXnTGDCQAAAACAVqq+vl6zZ8/SyJGjz1t9VFtbq2XLPtfIkaMlScOHj2pYCfO91NQ0HTx4QFVVVVq9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hQsXasKECfzDApdQUlKiF154Qe+//74WLlyoDz/8UPv27TM6FuAw69at05o1azR//nwtWLBA2dnZWr58udGxAIdbv3695s+fb3QMwBAFBQV64okn9NJLL2nRokXauXOnvvrqK6NjwSAUTM3gD3/4g2677TajYwCGqK6u1i9+8Qt16NBBktS+fXsVFxcbnAqwv3Xr1qlv374KDAyUt7e3Ro8erc8//9zoWIDDhIWF6de//rXc3d3l5uam5ORkFRUVGR0LcKiKigq98MILmjlzptFRAEMsX75cY8eOVWRkpNzc3PTCCy+oa9euRseCQSiYmmjlypU6c+aMrr76aqOjAIZwd3fXxIkTJUn19fV68cUXNXLkSINTAfZXWlqqsLCwhsfh4eEqKSkxMBHgWG3btlW3bt0kSfn5+frss880ZMgQY0MBDvb444/rgQcekL+/v9FRAEMcOHBAdXV1+ulPf6prrrlG77//vgICAoyOBYNYjQ7QUixdulS///3vzzuWlJSkqqoqvfXWW8aEAhzsQtfBW2+9perqav36179WbW2t7r77boMSAo5js9l+cMxkMhmQBDDW3r17dffdd+uRRx5RQkKC0XEAh/n4448VFRWlfv36ad68eUbHAQxRV1enjIwMvfvuu/L29ta9996r+fPna8qUKUZHgwEomC7RmDFjNGbMmPOOffzxx3rllVd00003NRybOHGi5s6dK19fX0dHBOzux64DSTp58qTuueceBQYGas6cOXJzczMgHeBYERERysjIaHhcWlqq8PBwAxMBjpeZmamf//znevTRRzVu3Dij4wAO9dlnn6msrEwTJ07U8ePHderUKT377LN69NFHjY4GOExoaKj69eun4OBgSdKIESO0fft2CiYXZbL92K9gcUXat2+vPXv2GB0DcLh7771XISEheuqpp1jBAZdRUlKiG264QZ988om8vLw0ffp0Pf3000pLSzM6GuAQxcXFmjx5sl544QX169fP6DiAoebNm6eNGzfqD3/4g9FRAIfatm2bHnnkEX300Ufy8fHRfffdpxEjRui6664zOhoMwAomAE2yc+dOrVy5UikpKZo0aZKkc7NoXnvtNWODAXYWERGhBx54QLfccotqamo0depUyiW4lNdff11nz5497wfq6dOn64YbbjAwFQDAkbp27ao77rhDN954o2pqajRgwABde+21RseCQVjBBAAAAAAAgCbhLnIAAAAAAABoEgomAAAAAAAANAkFEwAAAAAAAJqEggkAAAAAAABNQsEEAAAAAACAJqFgAgAAAAAAQJNQMAEAAAAAAKBJKJgAAECLN3z4cK1bt87oGAAAAC6LggkAAKCZHT16VO3bt1dJSYnRUQAAAByCggkAAKAZ/OlPf9I333wjSdq9e7eCg4MVERFhcKpzfv7znysnJ6fhcWFhobp3735Fz3Xy5EndcccdOnPmTHPFAwAArQAFEwAAaFVyc3N18803Kz09XePGjdPKlSsb3padna1Jkyape/fu+vnPf65f/vKXeuGFF5p8zq1bt2rfvn0aNGiQJGnXrl3q0KFDk5+3OVRXV+vAgQNq165dszyfj4+Pxo8fr7/+9a/N8nwAAKB1oGACAACtRk1NjWbOnKkBAwZo3bp1mjVrln71q19p//79qq6u1v3336/Jkydr48aNGj9+vFasWNEs5/373/+uadOmNTx2poJp3bp16tevX7M+55gxY7Ro0SKVl5c36/MCAICWi4IJAAC0Gtu2bdOpU6d01113yd3dXf369dOwYcO0ZMkSbdu2TbW1tbrlllvk5uamq666Sl26dGn42BMnTmjq1Knq3r37edvJnn/+ed1444166KGHVFNT84NzVlZWKjMzUwMGDGg4tnv3bnXs2PEH7/vhhx/q5ptvbviTlpam7du3N7x9+vTpevHFFyWd28bWvn17bdiwQdK5lUi9evXSe++9J0mqqqrSzJkzdfPNN2vatGn66quvfvQ1WblypUaOHHk5L2OjPDw81KNHjwueEwAAuB6r0QEAAACaS2lpqSIjI2U2/+d3aNHR0SopKVFpaakiIiJkMpka3hYVFdXw356ennr11Vf1xz/+seHY7t27VVJSovfff19z5szRF198ofHjx593zgMHDigsLEzu7u6SpLNnzyovL0+dOnX6Qb5p06Y1rHRatWqV5s+fr7S0NElScXGxIiIitHHjxob3T01N1fLly9W3b1+tX79e8fHxDW9buHChBg0apJtuukk2m00nTpz4wfnq6+u1detWzZ49+5Jev++VlJTonXfeUW1trWw2mzp27KjJkyef9z5xcXHKy8u7rOcFAACtFyuYAABAqxEeHq7Dhw+rvr6+4dj3xU1YWJhKSkpks9nOe9v33NzcFBwcfN7zbd68WQMHDpQkDRo0SJs3b/7BOc1ms+rq6hoe5+TkyGq1KjEx8YI5jx49qr/+9a968sknG4598cUXmjBhgpKSkpSbmytJiomJUVFRkWw2m5YvX67/3979hTT1xnEc/8icduEWsm4EhcbYXY02Mb1xLgMxMRpSDLoRjC5cUIhXioy6EgQvRKQJQRHeCEFtDiYxhgwZ9Af6IyIrqJtGXYSQRGN/yt+FdH6szfjFLn6k7xcc2HnO9zznOefys+c8p6+vz6hvbGzUy5cv9fnzZ9XV1clqtVZc59WrVzpx4oRMJtO+Y/nVjx8/FI1GNTY2pomJCU1OTsrhcGhtba2s7vv373/ULwAAONgImAAAwIHhcrl05MgR3blzR8ViUU+ePFEymdTAwIBOnTolk8mkpaUllUolJRIJbWxs/La/nZ0dNTU1SZIsFou+fPlSUdPW1qbt7W3l83lJe7OeHA6HSqWS8vm88vm8CoVC2Tk3b97UjRs3ygKt9fV1eb1eDQ4OanV11Wh3u9169uyZtre3dezYMaP9woULstvtunLligKBgN69e1cxtkQiobNnz/6HJ/ev169fy+/3q76+XvF4XNlsVi6XS7lcrqzuw4cPvw3RAADA4ULABAAADoyGhgaFw2GlUil1dXXp1q1bmpmZkcPhUENDg+bn5/XgwQN1dHQoGo3K5/MZr7ZVY7FY9PXrV0l7azQdPXq0osZqtaq9vd1YK2lra0ubm5tyuVzGNjAwYNQ/evRIFotFvb29RtunT5/09u1bjY6O6vbt22VrG/X19Wl6elqnT58uu67ZbFYwGFQkEtH169c1Pz9fMbZ0Om3MwPrVt2/f5Ha7y7ZMJiOTyWTMAAuHw3r+/Lkklc1WKhQKevHiRdk9AACAw401mAAAwF8vmUwav51Op7EQ9q9OnjypSCRi7F+6dElnzpzZt1+Px6O7d+/K7/drfX1dHo+nat21a9cUDofV09OjUCikUChUte7jx4+6d+9exfhWV1c1MTGh/v5+SXsznH7Oejp+/Lja29vV39+vdDptnJPNZo21n2w2W9mrfz89fPiw6jhaW1uVyWSqHisWi7p//76Gh4eNZ7WxsVEWMMViMZ0/f77qa3kAAOBwImACAACHxtOnT2W329Xc3KyVlRVlMhl1d3cbx69evaqtrS29f/9egUBAQ0NDstlsunz5slpaWjQyMlK1X4/HI7vdrlQqJa/Xu+/1FxcXtbOzo9HRUaMtGAzq8ePHWlhYMNo6OzsVj8eN/ampqYq+3rx5o7GxMTU2Nmp3d3ffUOtPmc1mnTt3TrOzs8ZMJqfTqYsXL0ra+3pdLBYzvnYHAAAgSXW71f7uAgAAOICWl5c1NzenXC6n1tZWjY+Py+fz/d/DAgAA+OsRMAEAAAAAAKAmLPINAAAAAACAmhAwAQAAAAAAoCYETAAAAAAAAKgJARMAAAAAAABqQsAEAAAAAACAmhAwAQAAAAAAoCYETAAAAAAAAKgJARMAAAAAAABq8g/wlbD9p3152QAAAABJRU5ErkJggg==\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot luminosity distribution\n", + "ldist = population.grid_results['luminosity distribution']\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "pad_output_distribution(ldist,\n", + " binwidth['luminosity'])\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict({'ZAMS luminosity distribution' : ldist})\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "31fe91bb-177d-4e4e-90cf-298a3f8a8b61", + "metadata": {}, + "source": [ + "Most stars are low mass red dwarfs, with small luminosities. Without the IMF weighting, our model population would have got this completely wrong! \n", + "\n", + "As you increase the resolution, you will see this curve becomes even smoother. The wiggles in the curve are (usually) sampling artefacts because the curve should monotonically brighten above about log(*L*/L<sub>☉</sub>)=-2. \n", + " \n", + "Remember you can play with the binwidth too. If you want a very accurate distribution you need a narrow binwidth, but then you'll also need high resolution (lots of stars) so lots of CPU time, hence cost, CO<sub>2</sub>, etc." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/build/doctrees/nbsphinx/notebook_luminosity_function_single_20_1.png b/docs/build/doctrees/nbsphinx/notebook_luminosity_function_single_20_1.png new file mode 100644 index 0000000000000000000000000000000000000000..8895750e8fce660f5b0b948fe506a414af7a4517 Binary files /dev/null and b/docs/build/doctrees/nbsphinx/notebook_luminosity_function_single_20_1.png differ diff --git a/docs/build/doctrees/nbsphinx/notebook_luminosity_function_single_26_1.png b/docs/build/doctrees/nbsphinx/notebook_luminosity_function_single_26_1.png new file mode 100644 index 0000000000000000000000000000000000000000..fc990e6c4cb03cb8f70d8d5355c9f765558752b2 Binary files /dev/null and b/docs/build/doctrees/nbsphinx/notebook_luminosity_function_single_26_1.png differ diff --git a/docs/build/doctrees/nbsphinx/notebook_luminosity_function_single_34_0.png b/docs/build/doctrees/nbsphinx/notebook_luminosity_function_single_34_0.png new file mode 100644 index 0000000000000000000000000000000000000000..980e3e44d1aa73fd9907fbe0a6cf485ba5ef811c Binary files /dev/null and b/docs/build/doctrees/nbsphinx/notebook_luminosity_function_single_34_0.png differ diff --git a/docs/build/doctrees/nbsphinx/notebook_population.ipynb b/docs/build/doctrees/nbsphinx/notebook_population.ipynb index b6a37baa8d90a2f36c0fd19311548ed49e77f173..f6f27ee4329b90d22651068ea0aca8d8756c5eb9 100644 --- a/docs/build/doctrees/nbsphinx/notebook_population.ipynb +++ b/docs/build/doctrees/nbsphinx/notebook_population.ipynb @@ -23,9 +23,12 @@ "outputs": [], "source": [ "import os\n", + "\n", "from binarycpython.utils.custom_logging_functions import temp_dir\n", "from binarycpython.utils.grid import Population\n", "\n", + "TMP_DIR = temp_dir(\"notebooks\", \"notebook_population\")\n", + "\n", "# help(Population) # Uncomment to see the public functions of this object" ] }, @@ -60,7 +63,8 @@ "adding: max_evolution_time=15000 to BSE_options\n", "adding: eccentricity=0.02 to BSE_options\n", "adding: amt_cores=2 to grid_options\n", - "<<<< Warning: Key does not match previously known parameter: adding: data_dir=/tmp/binary_c_python/example_python_population_result to custom_options >>>>\n", + "adding: tmp_dir=/tmp/binary_c_python/notebooks/notebook_population to grid_options\n", + "<<<< Warning: Key does not match previously known parameter: adding: data_dir=/tmp/binary_c_python/notebooks/notebook_population/example_python_population_result to custom_options >>>>\n", "<<<< Warning: Key does not match previously known parameter: adding: base_filename=example_pop.dat to custom_options >>>>\n", "1\n", "example_pop.dat\n", @@ -88,11 +92,12 @@ "\n", "\n", " # grid_options\n", - " amt_cores=2, # grid_options\n", + " amt_cores=2,\n", + " tmp_dir=TMP_DIR,\n", " \n", " # Custom options # TODO: need to be set in grid_options probably\n", " data_dir=os.path.join(\n", - " temp_dir(), \"example_python_population_result\"\n", + " TMP_DIR, \"example_python_population_result\"\n", " ), # custom_options\n", " base_filename=\"example_pop.dat\", # custom_options\n", ")\n", @@ -133,13 +138,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "Writing settings to /tmp/binary_c_python/example_python_population_result/example_pop_settings.json\n" + "Writing settings to /tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/example_pop_settings.json\n" ] }, { "data": { "text/plain": [ - "'/tmp/binary_c_python/example_python_population_result/example_pop_settings.json'" + "'/tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/example_pop_settings.json'" ] }, "execution_count": 3, @@ -181,7 +186,7 @@ "text": [ "Help on method add_grid_variable in module binarycpython.utils.grid:\n", "\n", - "add_grid_variable(name:str, longname:str, valuerange:Union[list, str], resolution:str, spacingfunc:str, probdist:str, dphasevol:Union[str, int], parameter_name:str, gridtype:str='edge', branchpoint:int=0, precode:Union[str, NoneType]=None, condition:Union[str, NoneType]=None) -> None method of binarycpython.utils.grid.Population instance\n", + "add_grid_variable(name:str, longname:str, valuerange:Union[list, str], resolution:str, spacingfunc:str, probdist:str, dphasevol:Union[str, int], parameter_name:str, gridtype:str='centred', branchpoint:int=0, precode:Union[str, NoneType]=None, condition:Union[str, NoneType]=None) -> None method of binarycpython.utils.grid.Population instance\n", " Function to add grid variables to the grid_options.\n", " \n", " The execution of the grid generation will be through a nested for loop.\n", @@ -199,25 +204,25 @@ " name:\n", " name of parameter. This is evaluated as a parameter and you can use it throughout\n", " the rest of the function\n", - " \n", + " \n", " Examples:\n", " name = 'lnm1'\n", " longname:\n", " Long name of parameter\n", - " \n", + " \n", " Examples:\n", " longname = 'Primary mass'\n", " range:\n", " Range of values to take. Does not get used really, the spacingfunction is used to\n", " get the values from\n", - " \n", + " \n", " Examples:\n", " range = [math.log(m_min), math.log(m_max)]\n", " resolution:\n", " Resolution of the sampled range (amount of samples).\n", " TODO: check if this is used anywhere\n", " \n", - " Examples: \n", + " Examples:\n", " resolution = resolution[\"M_1\"]\n", " spacingfunction:\n", " Function determining how the range is sampled. You can either use a real function,\n", @@ -230,12 +235,12 @@ " precode:\n", " Extra room for some code. This code will be evaluated within the loop of the\n", " sampling function (i.e. a value for lnm1 is chosen already)\n", - " \n", + " \n", " Examples:\n", " precode = 'M_1=math.exp(lnm1);'\n", " probdist:\n", " Function determining the probability that gets assigned to the sampled parameter\n", - " \n", + " \n", " Examples:\n", " probdist = 'Kroupa2001(M_1)*M_1'\n", " dphasevol:\n", @@ -249,7 +254,7 @@ " condition = 'self.grid_options['binary']==1'\n", " gridtype:\n", " Method on how the value range is sampled. Can be either 'edge' (steps starting at\n", - " the lower edge of the value range) or 'center'\n", + " the lower edge of the value range) or 'centred'\n", " (steps starting at lower edge + 0.5 * stepsize).\n", "\n" ] @@ -313,7 +318,7 @@ " \"dphasevol\": \"dlnm1\",\n", " \"parameter_name\": \"M_1\",\n", " \"condition\": \"\",\n", - " \"gridtype\": \"edge\",\n", + " \"gridtype\": \"centred\",\n", " \"branchpoint\": 0,\n", " \"grid_variable_number\": 0\n", "}\n" @@ -457,7 +462,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "adding: parse_function=<function parse_function at 0x7ff3bdf79620> to grid_options\n" + "adding: parse_function=<function parse_function at 0x7f531bc3b6a8> to grid_options\n" ] } ], @@ -536,25 +541,25 @@ "Generating grid code\n", "Constructing/adding: lnm1\n", "Grid has handled 20 stars\n", - "with a total probability of 0.05150046619238192\n", + "with a total probability of 0.044402888438054094\n", "Total starcount for this run will be: 20\n", - "EXAMPLE_COMPACT_OBJECT 2.867655467480e+01 1.33079 9.81391 0.00167028 13\n", "Generating grid code\n", "Constructing/adding: lnm1\n", - "EXAMPLE_COMPACT_OBJECT 1.931266944719e+01 1.3933 12.3177 0.00124307 13\n", - "EXAMPLE_COMPACT_OBJECT 4.439623364590e+01 1.38004 7.81906 0.00224431 13\n", - "EXAMPLE_COMPACT_OBJECT 1.364277535630e+01 1.47961 15.4603 0.000925128 13\n", - "EXAMPLE_COMPACT_OBJECT 1.017435498578e+01 1.59052 19.4046 0.000688507 13\n", - "EXAMPLE_COMPACT_OBJECT 8.294870923827e+00 1.7197 24.3552 0.000512406 13\n", - "EXAMPLE_COMPACT_OBJECT 6.802132608769e+00 1.84162 30.5689 0.000381347 13\n", - "EXAMPLE_COMPACT_OBJECT 5.723570798020e+00 1.99471 38.3678 0.00028381 13\n", - "EXAMPLE_COMPACT_OBJECT 4.933751523833e+00 2.15875 48.1564 0.000211219 13\n", - "EXAMPLE_COMPACT_OBJECT 4.337250536639e+00 2.35209 60.4424 0.000157195 14\n", - "EXAMPLE_COMPACT_OBJECT 3.862081089332e+00 2.56776 75.8628 0.000116989 14\n", - "EXAMPLE_COMPACT_OBJECT 3.449960890183e+00 2.80457 95.2174 8.70668e-05 14\n", - "EXAMPLE_COMPACT_OBJECT 3.172196856333e+00 3.05193 119.51 6.47976e-05 14\n", - "EXAMPLE_COMPACT_OBJECT 3.069627290216e+00 3.27563 150 4.82242e-05 14\n", - "Population-2a7732d03e594ef4b5dfe9051b41d9c0 finished! The total probability was: 0.05150046619238191. It took a total of 0.7797017097473145s to run 20 systems on 2 cores\n", + "EXAMPLE_COMPACT_OBJECT 4.139293101586e+01 1.29427 8.13626 0.00202467 13\n", + "EXAMPLE_COMPACT_OBJECT 2.802986496151e+01 1.33699 10.0967 0.00152924 13\n", + "EXAMPLE_COMPACT_OBJECT 1.963621764679e+01 1.39754 12.5294 0.00115504 13\n", + "EXAMPLE_COMPACT_OBJECT 1.427601421985e+01 1.47745 15.5483 0.000872405 13\n", + "EXAMPLE_COMPACT_OBJECT 1.094409257247e+01 1.57571 19.2947 0.00065893 13\n", + "EXAMPLE_COMPACT_OBJECT 9.181971798545e+00 1.68748 23.9436 0.000497691 13\n", + "EXAMPLE_COMPACT_OBJECT 7.905335716621e+00 1.77287 29.7128 0.000375908 13\n", + "EXAMPLE_COMPACT_OBJECT 7.451192744924e+00 1.81495 36.872 0.000283924 13\n", + "EXAMPLE_COMPACT_OBJECT 7.396133472739e+00 1.82088 45.7561 0.000214449 13\n", + "EXAMPLE_COMPACT_OBJECT 7.396675941641e+00 1.82123 56.7809 0.000161974 13\n", + "EXAMPLE_COMPACT_OBJECT 7.404641347602e+00 1.82074 70.4621 0.000122339 13\n", + "EXAMPLE_COMPACT_OBJECT 7.444217227690e+00 1.81636 87.4397 9.2403e-05 13\n", + "EXAMPLE_COMPACT_OBJECT 7.453317880232e+00 1.81536 108.508 6.97923e-05 13\n", + "EXAMPLE_COMPACT_OBJECT 7.450828476484e+00 1.81563 134.653 5.27143e-05 13\n", + "Population-f28b5f98d7ef40dcb17fc2481a6d3ced finished! The total probability was: 0.04440288843805411. It took a total of 2.785212755203247s to run 20 systems on 2 cores\n", "There were no errors found in this run.\n" ] } @@ -586,7 +591,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'population_name': '2a7732d03e594ef4b5dfe9051b41d9c0', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 0.05150046619238191, 'total_count': 20, 'start_timestamp': 1628444120.234709, 'end_timestamp': 1628444121.0144107, 'total_mass_run': 730.1048014407228, 'total_probability_weighted_mass_run': 0.2983275843337705, 'zero_prob_stars_skipped': 0}\n" + "{'population_name': 'f28b5f98d7ef40dcb17fc2481a6d3ced', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 0.04440288843805411, 'total_count': 20, 'start_timestamp': 1629459533.935186, 'end_timestamp': 1629459536.7203987, 'total_mass_run': 684.2544031669779, 'total_probability_weighted_mass_run': 0.28134439269236855, 'zero_prob_stars_skipped': 0}\n" ] } ], @@ -660,42 +665,22 @@ "Generating grid code\n", "Constructing/adding: lnm1\n", "Saving grid code to grid_options\n", - "Writing grid code to /tmp/binary_c_python/binary_c_grid_2a7732d03e594ef4b5dfe9051b41d9c0.py\n", - "Loading grid code function from /tmp/binary_c_python/binary_c_grid_2a7732d03e594ef4b5dfe9051b41d9c0.py\n", + "Writing grid code to /tmp/binary_c_python/notebooks/notebook_population/binary_c_grid_f28b5f98d7ef40dcb17fc2481a6d3ced.py\n", + "Loading grid code function from /tmp/binary_c_python/notebooks/notebook_population/binary_c_grid_f28b5f98d7ef40dcb17fc2481a6d3ced.py\n", "Grid code loaded\n", - "Writing binary_c calls to /tmp/binary_c_python/example_python_population_result/binary_c_calls.txt\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", + "Writing binary_c calls to /tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/binary_c_calls.txt\n", "Grid has handled 20 stars\n", - "with a total probability of 0.05150046619238192\n", - "/tmp/binary_c_python/example_python_population_result/binary_c_calls.txt\n", - "binary_c M_1 2.0 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.013208238029791246\n", - "binary_c M_1 2.5102526289471614 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.009829948023831718\n", - "binary_c M_1 3.1506841305680684 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.0073157281034221516\n", - "binary_c M_1 3.9545065608702976 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.005444573822104362\n" + "with a total probability of 0.044402888438054094\n", + "/tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/binary_c_calls.txt\n", + "binary_c M_1 2.227955577093495 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.010905083645619543\n", + "binary_c M_1 2.7647737053496777 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.008236638755149857\n", + "binary_c M_1 3.4309362899259503 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.006221155214163634\n", + "binary_c M_1 4.257608426597089 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.004698855121516278\n" ] } ], "source": [ - "example_pop.set(verbosity=10)\n", + "example_pop.set(verbosity=1)\n", "calls_filename = example_pop.write_binary_c_calls_to_file()\n", "print(calls_filename)\n", "\n", @@ -725,39 +710,34 @@ "Generating grid code\n", "Constructing/adding: lnm1\n", "Grid has handled 20 stars\n", - "with a total probability of 0.05150046619238192\n", + "with a total probability of 0.044402888438054094\n", "Total starcount for this run will be: 20\n", "Generating grid code\n", "Constructing/adding: lnm1\n", - "Population-3680f3882c0a449c944462abffea2447 finished! The total probability was: 0.05150046619238191. It took a total of 0.6246354579925537s to run 20 systems on 2 cores\n", + "Population-e45c25448b32440cb7e220f4a3562907 finished! The total probability was: 0.04440288843805411. It took a total of 1.9539172649383545s to run 20 systems on 2 cores\n", "There were no errors found in this run.\n", "\n", "\n", "time mass zams_mass probability radius stellar_type\n", - "2.867655467480e+01 1.33079 9.81391 0.00167028 1.72498e-05 13\n", - "1.931266944719e+01 1.3933 12.3177 0.00124307 1.72498e-05 13\n", - "4.439623364590e+01 1.38004 7.81906 0.00224431 1.72498e-05 13\n", - "1.364277535630e+01 1.47961 15.4603 0.000925128 1.72498e-05 13\n", - "1.017435498578e+01 1.59052 19.4046 0.000688507 1.72498e-05 13\n", - "8.294870923827e+00 1.7197 24.3552 0.000512406 1.72498e-05 13\n", - "6.802132608769e+00 1.84162 30.5689 0.000381347 1.72498e-05 13\n", - "5.723570798020e+00 1.99471 38.3678 0.00028381 1.72498e-05 13\n", - "4.933751523833e+00 2.15875 48.1564 0.000211219 1.72498e-05 13\n", - "4.337250536639e+00 2.35209 60.4424 0.000157195 9.97286e-06 14\n", - "3.862081089332e+00 2.56776 75.8628 0.000116989 1.08873e-05 14\n", - "3.449960890183e+00 2.80457 95.2174 8.70668e-05 1.18914e-05 14\n", - "3.172196856333e+00 3.05193 119.51 6.47976e-05 1.29402e-05 14\n", - "3.069627290216e+00 3.27563 150 4.82242e-05 1.38887e-05 14\n", + "4.139293101586e+01 1.29427 8.13626 0.00202467 1.72498e-05 13\n", + "2.802986496151e+01 1.33699 10.0967 0.00152924 1.72498e-05 13\n", + "1.963621764679e+01 1.39754 12.5294 0.00115504 1.72498e-05 13\n", + "1.427601421985e+01 1.47745 15.5483 0.000872405 1.72498e-05 13\n", + "1.094409257247e+01 1.57571 19.2947 0.00065893 1.72498e-05 13\n", + "9.181971798545e+00 1.68748 23.9436 0.000497691 1.72498e-05 13\n", + "7.905335716621e+00 1.77287 29.7128 0.000375908 1.72498e-05 13\n", + "7.451192744924e+00 1.81495 36.872 0.000283924 1.72498e-05 13\n", + "7.396133472739e+00 1.82088 45.7561 0.000214449 1.72498e-05 13\n", + "7.396675941641e+00 1.82123 56.7809 0.000161974 1.72498e-05 13\n", + "7.404641347602e+00 1.82074 70.4621 0.000122339 1.72498e-05 13\n", + "7.444217227690e+00 1.81636 87.4397 9.2403e-05 1.72498e-05 13\n", + "7.453317880232e+00 1.81536 108.508 6.97923e-05 1.72498e-05 13\n", + "7.450828476484e+00 1.81563 134.653 5.27143e-05 1.72498e-05 13\n", "\n" ] } ], "source": [ - "import os\n", - "\n", - "from binarycpython.utils.grid import Population\n", - "from binarycpython.utils.custom_logging_functions import temp_dir\n", - "\n", "def parse_function(self, output):\n", " \"\"\"\n", " Example parsing function\n", @@ -817,11 +797,12 @@ " eccentricity=0.02, # bse_options\n", " \n", " # grid_options\n", - " amt_cores=2, # grid_options\n", + " amt_cores=2,\n", + " tmp_dir=TMP_DIR,\n", "\n", " # Custom options: the data directory and the output filename\n", " data_dir=os.path.join(\n", - " temp_dir(), \"example_python_population_result\"\n", + " TMP_DIR, \"example_python_population_result\"\n", " ), # custom_options\n", " base_filename=\"example_pop.dat\", # custom_options\n", ")\n", @@ -876,15 +857,15 @@ "example_pop.export_all_info()\n", "\n", "# remove the result file if it exists\n", - "if os.path.isfile(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\")):\n", - " os.remove(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"))\n", + "if os.path.isfile(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\")):\n", + " os.remove(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"))\n", "\n", "\n", "# Evolve the population\n", "example_pop.evolve()\n", "\n", "# \n", - "with open(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", + "with open(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", " output = f.read()\n", "print(\"\\n\")\n", "print(output)" @@ -912,96 +893,39 @@ "Constructing/adding: lnm1\n", "Constructing/adding: q\n", "Constructing/adding: log10per\n", - "Grid has handled 125 stars\n", - "with a total probability of 0.0862478164626921\n", - "Total starcount for this run will be: 125\n", + "Grid has handled 27 stars\n", + "with a total probability of 0.024868380796643753\n", + "Total starcount for this run will be: 27\n", "Generating grid code\n", "Constructing/adding: lnm1\n", "Constructing/adding: q\n", "Constructing/adding: log10per\n", - "Population-d20a4c74d20a43b881c0c9e5def5f76c finished! The total probability was: 0.08624781646269201. It took a total of 8.561265707015991s to run 125 systems on 2 cores\n", + "Population-05128ef4c5fe4274a0356c3e99e2f2d2 finished! The total probability was: 0.024868380796643757. It took a total of 9.792905807495117s to run 27 systems on 2 cores\n", "There were no errors found in this run.\n", "\n", "\n", "time mass_1 zams_mass_1 mass_2 zams_mass_2 stellar_type_1 prev_stellar_type_1 stellar_type_2 prev_stellar_type_2 metallicity probability\n", - "8.863377990313e+01 1.29444 5.88566 0 2.99283 13 5 15 15 0.02 0.000627913\n", - "1.146421815741e+02 0 5.88566 1.33062 4.43925 15 15 13 5 0.02 0.000627913\n", - "7.222715508467e+01 1.34922 5.88566 0 5.88566 13 5 15 15 0.02 0.000627913\n", - "1.350021848285e+01 1.48488 17.3205 0 0.1 13 5 15 15 0.02 0.000154349\n", - "1.171108213270e+01 1.53113 17.3205 0 0.1 13 5 15 15 0.02 0.000154349\n", - "1.171086983243e+01 1.53177 17.3205 0 0.1 13 9 15 15 0.02 0.000154349\n", - "1.170770599495e+01 1.53176 17.3205 0 4.40513 13 5 15 15 0.02 0.000172877\n", - "1.230407246199e+01 1.59499 17.3205 0 4.40513 13 5 15 15 0.02 0.000610573\n", - "1.108751340926e+01 1.70319 17.3205 0 8.71025 13 4 15 15 0.02 0.000610573\n", - "1.941017702765e+01 1.34903 17.3205 1.65097 8.71025 13 13 13 5 0.02 0.000172877\n", - "1.980988739731e+01 1.36979 17.3205 1.60808 8.71025 13 13 13 5 0.02 0.000121486\n", - "3.571858031651e+01 1.53174 17.3205 1.30504 8.71025 13 13 13 5 0.02 8.42148e-05\n", - "3.459153942631e+01 1.53176 17.3205 1.31004 8.71025 13 13 13 5 0.02 9.8162e-05\n", - "1.687368550125e+01 1.34937 17.3205 1.73856 13.0154 13 13 13 8 0.02 0.000172877\n", - "1.194842917007e+01 1.78096 17.3205 0 13.0154 13 8 15 15 0.02 0.000610573\n", - "1.733614170983e+01 1.53184 17.3205 1.42375 13.0154 13 13 13 5 0.02 9.8162e-05\n", - "1.723547465714e+01 1.38403 17.3205 1.71288 13.0154 13 13 13 8 0.02 0.000121486\n", - "1.764340254985e+01 1.53174 17.3205 1.41264 13.0154 13 13 13 5 0.02 8.42148e-05\n", - "1.170425790780e+01 1.52963 17.3205 0 17.3205 13 5 15 15 0.02 0.000172877\n", - "8.922967341481e+00 1.85486 17.3205 0 17.3205 13 8 15 15 0.02 0.000610573\n", - "1.232906623449e+01 1.41074 17.3205 1.34281 17.3205 13 13 13 8 0.02 0.000121486\n", - "1.170775828562e+01 1.53183 17.3205 1.53183 17.3205 13 5 13 5 0.02 9.8162e-05\n", - "1.170770422321e+01 1.53175 17.3205 1.53175 17.3205 13 5 13 5 0.02 8.42148e-05\n", - "5.075844624794e+00 2.12303 50.9713 0 0.1 13 8 15 15 0.02 3.79411e-05\n", - "4.766606588165e+00 2.20484 50.9713 0 0.1 14 8 15 15 0.02 3.79411e-05\n", - "4.768305081494e+00 2.18838 50.9713 0 0.1 13 8 15 15 0.02 3.79411e-05\n", - "4.458869865939e+00 2.29864 50.9713 0 12.8178 14 8 15 15 0.02 0.000150087\n", - "1.806014211040e+01 2.10446 50.9713 1.40749 12.8178 13 13 13 5 0.02 2.9863e-05\n", - "4.797342083485e+00 2.10328 50.9713 0 12.8178 13 13 15 1 0.02 4.24954e-05\n", - "1.721374713429e+01 2.21673 50.9713 1.42212 12.8178 14 14 13 5 0.02 2.41295e-05\n", - "4.055645404546e+00 2.47276 50.9713 0 25.5357 14 7 15 15 0.02 0.000150087\n", - "1.806123543037e+01 2.21893 50.9713 1.40745 12.8178 14 14 13 5 0.02 2.07011e-05\n", - "8.117519147635e+00 2.10433 50.9713 2.21473 25.5357 13 13 14 8 0.02 4.24954e-05\n", - "8.315554923168e+00 2.15343 50.9713 2.08519 25.5357 13 13 13 8 0.02 2.9863e-05\n", - "7.917420996633e+00 2.21892 50.9713 1.7431 25.5357 14 14 13 8 0.02 2.07011e-05\n", - "7.693213405973e+00 2.21805 50.9713 1.78384 25.5357 14 14 13 8 0.02 2.41295e-05\n", - "3.753837732894e+00 2.62517 50.9713 0 38.2535 14 7 15 15 0.02 0.000150087\n", - "7.087296558990e+00 2.10417 50.9713 2.40935 38.2535 13 13 14 8 0.02 4.24954e-05\n", - "7.007109286263e+00 2.15854 50.9713 2.28672 38.2535 13 13 14 8 0.02 2.9863e-05\n", - "5.653200958306e+00 2.21878 50.9713 2.0587 38.2535 14 14 13 8 0.02 2.41295e-05\n", - "5.733794947644e+00 2.21892 50.9713 1.99255 38.2535 14 14 13 8 0.02 2.07011e-05\n", - "3.513216011269e+00 2.76647 50.9713 0 50.9713 14 7 15 15 0.02 0.000150087\n", - "4.750574783854e+00 2.27442 50.9713 0 50.9713 14 8 15 15 0.02 4.24954e-05\n", - "7.278384712062e+00 1.29678 50.9713 2.09216 50.9713 13 8 13 13 0.02 2.9863e-05\n", - "4.765996194699e+00 2.20787 50.9713 2.20787 50.9713 14 8 14 8 0.02 2.07011e-05\n", - "4.765535914728e+00 2.21331 50.9713 2.21331 50.9713 14 8 14 8 0.02 2.41295e-05\n", - "3.104706358826e+00 3.17639 150 0 0.1 14 7 15 15 0.02 9.32641e-06\n", - "3.069363482023e+00 3.27572 150 0 0.1 14 7 15 15 0.02 9.32641e-06\n", - "3.047074050271e+00 3.3836 150 0 37.575 14 7 15 15 0.02 3.68933e-05\n", - "5.974759306305e+00 3.23604 150 2.53922 37.575 14 14 14 7 0.02 1.04459e-05\n", - "6.074084349384e+00 3.30145 150 2.13876 37.575 14 14 13 8 0.02 7.34071e-06\n", - "5.733865371895e+00 3.29994 150 2.00498 37.575 14 14 13 8 0.02 5.93135e-06\n", - "3.027099358410e+00 3.53631 150 0 75.05 14 7 15 15 0.02 3.68933e-05\n", - "5.807147339697e+00 3.30197 150 1.9791 37.575 14 14 13 8 0.02 5.08861e-06\n", - "4.862942347290e+00 3.25294 150 2.97823 75.05 14 14 14 7 0.02 1.04459e-05\n", - "4.556479830908e+00 3.29942 150 2.73221 75.05 14 14 14 7 0.02 7.34071e-06\n", - "3.853070305680e+00 3.29977 150 2.62486 75.05 14 14 14 7 0.02 5.93135e-06\n", - "3.881529045940e+00 3.30149 150 2.55924 75.05 14 14 14 7 0.02 5.08861e-06\n", - "3.015033359333e+00 3.64419 150 0 112.525 14 7 15 15 0.02 3.68933e-05\n", - "4.126828648362e+00 3.32047 150 0 112.525 14 14 15 3 0.02 1.04459e-05\n", - "3.990017992944e+00 3.3032 150 2.94027 112.525 14 14 14 7 0.02 7.34071e-06\n", - "3.206771867883e+00 3.07671 150 3.11282 112.525 14 14 14 7 0.02 5.93135e-06\n", - "3.006827156705e+00 3.72638 150 0 150 14 7 15 15 0.02 3.68933e-05\n", - "3.218786094847e+00 3.30337 150 3.01344 112.525 14 14 14 7 0.02 5.08861e-06\n", - "4.527722847382e+00 1.42238 150 0 150 13 5 15 15 0.02 1.04459e-05\n", - "3.069567332611e+00 3.27804 150 3.27804 150 14 7 14 7 0.02 5.93135e-06\n", - "5.726405299909e+00 1.29746 150 3.22759 150 13 8 14 14 0.02 7.34071e-06\n", - "3.069626478211e+00 3.27565 150 3.27565 150 14 7 14 7 0.02 5.08861e-06\n", + "1.219029061236e+01 1.60007 17.3205 0 2.97008 13 5 15 15 0.02 0.000498487\n", + "1.935920346899e+01 1.29448 17.3205 0 8.71025 13 13 15 2 0.02 0.000498487\n", + "2.123795595728e+01 1.30902 17.3205 1.58519 8.71025 13 13 13 5 0.02 0.000287968\n", + "3.579099761269e+01 1.52414 17.3205 1.30642 8.71025 13 13 13 5 0.02 0.000220016\n", + "1.674063083432e+01 1.29457 17.3205 0 14.4504 13 13 15 2 0.02 0.000498487\n", + "1.779197348711e+01 1.3228 17.3205 1.71196 14.4504 13 13 13 8 0.02 0.000287968\n", + "1.548740826516e+01 1.52415 17.3205 1.45407 14.4504 13 13 13 5 0.02 0.000220016\n", + "1.772169325356e+01 1.81957 73.0434 1.46573 12.2572 13 13 13 5 0.02 4.43422e-05\n", + "1.367065500196e+01 1.66003 73.0434 1.79487 12.2572 13 13 13 8 0.02 7.67586e-05\n", + "2.021960493499e+01 1.82061 73.0434 1.39205 12.2572 13 13 13 5 0.02 3.38788e-05\n", + "9.012246630357e+00 1.81529 73.0434 0 36.5717 13 8 15 15 0.02 7.67586e-05\n", + "7.462779538274e+00 1.82255 73.0434 1.81499 36.5717 13 13 13 8 0.02 3.38788e-05\n", + "1.030499912298e+01 1.80592 73.0434 1.81066 36.5717 13 13 13 8 0.02 4.43422e-05\n", + "4.227002356107e+00 2.43719 73.0434 0 60.8862 14 14 15 1 0.02 7.67586e-05\n", + "7.396288708628e+00 1.8216 73.0434 1.8216 60.8862 13 8 13 8 0.02 3.38788e-05\n", + "7.394728392218e+00 1.80919 73.0434 1.79091 60.8862 13 13 13 8 0.02 4.43422e-05\n", "\n" ] } ], "source": [ - "import os\n", - "\n", - "from binarycpython.utils.grid import Population\n", - "from binarycpython.utils.custom_logging_functions import temp_dir\n", - "\n", "def parse_function(self, output):\n", " \"\"\"\n", " Example parsing function\n", @@ -1067,10 +991,11 @@ " \n", " # grid_options\n", " amt_cores=2, # grid_options\n", + " tmp_dir=TMP_DIR,\n", "\n", " # Custom options: the data directory and the output filename\n", " data_dir=os.path.join(\n", - " temp_dir(), \"example_python_population_result\"\n", + " TMP_DIR, \"example_python_population_result\"\n", " ), # custom_options\n", " base_filename=\"example_pop.dat\", # custom_options\n", ")\n", @@ -1168,14 +1093,14 @@ "example_pop.export_all_info()\n", "\n", "# remove the result file if it exists\n", - "if os.path.isfile(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\")):\n", - " os.remove(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"))\n", + "if os.path.isfile(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\")):\n", + " os.remove(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"))\n", "\n", "# Evolve the population\n", "example_pop.evolve()\n", "\n", "# \n", - "with open(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", + "with open(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", " output = f.read()\n", "print(\"\\n\")\n", "print(output)" diff --git a/docs/build/doctrees/notebook_api_functionality.doctree b/docs/build/doctrees/notebook_api_functionality.doctree index d13dc561967683b55c3d7d9fa7e91bc39cca513f..890f5ccb12977bd94483fecef8e7c6d2aec58e81 100644 Binary files a/docs/build/doctrees/notebook_api_functionality.doctree and b/docs/build/doctrees/notebook_api_functionality.doctree differ diff --git a/docs/build/doctrees/notebook_custom_logging.doctree b/docs/build/doctrees/notebook_custom_logging.doctree index 9e84119cc3983c0cb2d071608c44147ef25ddab1..77f56e2c4e43522a91280b0629d7edbf60601b04 100644 Binary files a/docs/build/doctrees/notebook_custom_logging.doctree and b/docs/build/doctrees/notebook_custom_logging.doctree differ diff --git a/docs/build/doctrees/notebook_luminosity_function_binaries.doctree b/docs/build/doctrees/notebook_luminosity_function_binaries.doctree new file mode 100644 index 0000000000000000000000000000000000000000..4ae3b628729370e197a3a44aab7d6644cbcc29b2 Binary files /dev/null and b/docs/build/doctrees/notebook_luminosity_function_binaries.doctree differ diff --git a/docs/build/doctrees/notebook_luminosity_function_single.doctree b/docs/build/doctrees/notebook_luminosity_function_single.doctree new file mode 100644 index 0000000000000000000000000000000000000000..2943f8610c7fff7599bc92bd5c4b0695eeb1c9ec Binary files /dev/null and b/docs/build/doctrees/notebook_luminosity_function_single.doctree differ diff --git a/docs/build/doctrees/notebook_population.doctree b/docs/build/doctrees/notebook_population.doctree index 8dc7f0c81bcae8dba9df8e55481ed6ade245f1cd..daa813d00a85f0ed7e860603d3e1985cccfa8027 100644 Binary files a/docs/build/doctrees/notebook_population.doctree and b/docs/build/doctrees/notebook_population.doctree differ diff --git a/docs/build/doctrees/readme_link.doctree b/docs/build/doctrees/readme_link.doctree index fd66cbc8cbd1f29cc2332d668bdbc6c429422a30..e0d5b1779a1d966852f4d94e2b0fac30f86115b8 100644 Binary files a/docs/build/doctrees/readme_link.doctree and b/docs/build/doctrees/readme_link.doctree differ diff --git a/docs/build/html/_images/notebook_luminosity_function_binaries_20_1.png b/docs/build/html/_images/notebook_luminosity_function_binaries_20_1.png new file mode 100644 index 0000000000000000000000000000000000000000..fd1782b3a11abd6e0f188902b49f69eb32319f1b Binary files /dev/null and b/docs/build/html/_images/notebook_luminosity_function_binaries_20_1.png differ diff --git a/docs/build/html/_images/notebook_luminosity_function_single_20_1.png b/docs/build/html/_images/notebook_luminosity_function_single_20_1.png new file mode 100644 index 0000000000000000000000000000000000000000..8895750e8fce660f5b0b948fe506a414af7a4517 Binary files /dev/null and b/docs/build/html/_images/notebook_luminosity_function_single_20_1.png differ diff --git a/docs/build/html/_images/notebook_luminosity_function_single_26_1.png b/docs/build/html/_images/notebook_luminosity_function_single_26_1.png new file mode 100644 index 0000000000000000000000000000000000000000..fc990e6c4cb03cb8f70d8d5355c9f765558752b2 Binary files /dev/null and b/docs/build/html/_images/notebook_luminosity_function_single_26_1.png differ diff --git a/docs/build/html/_images/notebook_luminosity_function_single_34_0.png b/docs/build/html/_images/notebook_luminosity_function_single_34_0.png new file mode 100644 index 0000000000000000000000000000000000000000..980e3e44d1aa73fd9907fbe0a6cf485ba5ef811c Binary files /dev/null and b/docs/build/html/_images/notebook_luminosity_function_single_34_0.png differ diff --git a/docs/build/html/_modules/binarycpython/utils/custom_logging_functions.html b/docs/build/html/_modules/binarycpython/utils/custom_logging_functions.html index de6d5f80aa620972a7bfd2adc6f3148ab69e4525..310a1536f8c33ab27f6825ffb3363110c44087b4 100644 --- a/docs/build/html/_modules/binarycpython/utils/custom_logging_functions.html +++ b/docs/build/html/_modules/binarycpython/utils/custom_logging_functions.html @@ -644,9 +644,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/_modules/binarycpython/utils/distribution_functions.html b/docs/build/html/_modules/binarycpython/utils/distribution_functions.html index 1cddf50cc54dc1cbc277437ad1bac7f22229235b..93d532d7a13cb1c00bd6f081c1dc554e46c177cb 100644 --- a/docs/build/html/_modules/binarycpython/utils/distribution_functions.html +++ b/docs/build/html/_modules/binarycpython/utils/distribution_functions.html @@ -2482,9 +2482,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/_modules/binarycpython/utils/functions.html b/docs/build/html/_modules/binarycpython/utils/functions.html index 4e1bbc15df334fcc4d699503ff7fcb1cdca18db2..c3af7ccd6cc109564a5d465691f9c1fe1c6e4351 100644 --- a/docs/build/html/_modules/binarycpython/utils/functions.html +++ b/docs/build/html/_modules/binarycpython/utils/functions.html @@ -187,6 +187,8 @@ <span class="kn">import</span> <span class="nn">h5py</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<span class="kn">import</span> <span class="nn">astropy.units</span> <span class="k">as</span> <span class="nn">u</span> + <span class="kn">from</span> <span class="nn">binarycpython</span> <span class="kn">import</span> <span class="n">_binary_c_bindings</span> <span class="kn">import</span> <span class="nn">binarycpython.utils.moe_di_stefano_2017_data</span> <span class="k">as</span> <span class="nn">moe_di_stefano_2017_data</span> @@ -195,6 +197,44 @@ <span class="c1">########################################################</span> <span class="c1"># Unsorted</span> <span class="c1">########################################################</span> +<div class="viewcode-block" id="AutoVivificationDict"><a class="viewcode-back" href="../../../functions.html#binarycpython.utils.functions.AutoVivificationDict">[docs]</a><span class="k">class</span> <span class="nc">AutoVivificationDict</span><span class="p">(</span><span class="nb">dict</span><span class="p">):</span> + <span class="sd">"""</span> +<span class="sd"> Implementation of perl's autovivification feature, by overriding the</span> +<span class="sd"> get item and the __iadd__ operator (https://docs.python.org/3/reference/datamodel.html?highlight=iadd#object.__iadd__)</span> + +<span class="sd"> This allows to set values within a subdict that might not exist yet:</span> + +<span class="sd"> Example:</span> +<span class="sd"> newdict = {}</span> +<span class="sd"> newdict['example']['mass'] += 10</span> +<span class="sd"> print(newdict)</span> +<span class="sd"> >>> {'example': {'mass': 10}}</span> +<span class="sd"> """</span> + + <span class="k">def</span> <span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span> + <span class="k">try</span><span class="p">:</span> + <span class="k">return</span> <span class="nb">dict</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">)</span> + <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> + <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">item</span><span class="p">]</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)()</span> + <span class="k">return</span> <span class="n">value</span> + + <span class="k">def</span> <span class="fm">__iadd__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> + <span class="c1"># if a value does not exist, assume it is 0.0</span> + <span class="k">try</span><span class="p">:</span> + <span class="bp">self</span> <span class="o">+=</span> <span class="n">other</span> + <span class="k">except</span><span class="p">:</span> + <span class="bp">self</span> <span class="o">=</span> <span class="n">other</span> + <span class="k">return</span> <span class="bp">self</span></div> + +<div class="viewcode-block" id="bin_data"><a class="viewcode-back" href="../../../functions.html#binarycpython.utils.functions.bin_data">[docs]</a><span class="k">def</span> <span class="nf">bin_data</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">binwidth</span><span class="p">):</span> + <span class="sd">"""</span> +<span class="sd"> Function that bins the data</span> + +<span class="sd"> Uses the absolute value of binwidth</span> +<span class="sd"> """</span> + + <span class="k">return</span> <span class="p">((</span><span class="mf">0.5</span> <span class="k">if</span> <span class="n">value</span> <span class="o">></span> <span class="mf">0.0</span> <span class="k">else</span> <span class="o">-</span><span class="mf">0.5</span><span class="p">)</span> <span class="o">+</span> <span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="o">/</span><span class="nb">abs</span><span class="p">(</span><span class="n">binwidth</span><span class="p">)))</span> <span class="o">*</span> <span class="nb">abs</span><span class="p">(</span><span class="n">binwidth</span><span class="p">)</span></div> + <div class="viewcode-block" id="convert_bytes"><a class="viewcode-back" href="../../../functions.html#binarycpython.utils.functions.convert_bytes">[docs]</a><span class="k">def</span> <span class="nf">convert_bytes</span><span class="p">(</span><span class="n">size</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Function to return the size + a magnitude string</span> @@ -451,6 +491,51 @@ <span class="k">yield</span> <span class="n">val</span><span class="o">.</span><span class="vm">__name__</span></div> + +<div class="viewcode-block" id="convfloat"><a class="viewcode-back" href="../../../functions.html#binarycpython.utils.functions.convfloat">[docs]</a><span class="k">def</span> <span class="nf">convfloat</span><span class="p">(</span><span class="n">x</span><span class="p">):</span> + <span class="sd">"""</span> +<span class="sd"> Convert scalar x to a float if we can, in which case return the float, otherwise just return x without changing it. Usually, x is a string, but could be anything that float() can handle without failure.</span> +<span class="sd"> """</span> + <span class="k">try</span><span class="p">:</span> + <span class="n">y</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> + <span class="k">return</span> <span class="n">y</span> + <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> + <span class="k">return</span> <span class="n">x</span></div> + +<div class="viewcode-block" id="datalinedict"><a class="viewcode-back" href="../../../functions.html#binarycpython.utils.functions.datalinedict">[docs]</a><span class="k">def</span> <span class="nf">datalinedict</span><span class="p">(</span><span class="n">line</span> <span class="p">:</span> <span class="nb">str</span><span class="p">,</span> + <span class="n">parameters</span> <span class="p">:</span> <span class="nb">list</span><span class="p">):</span> + <span class="sd">"""</span> +<span class="sd"> Convert a line of data to a more convenient dictionary.</span> +<span class="sd"> Arguments:</span> +<span class="sd"> line = a line of data as a string</span> +<span class="sd"> parameters = a list of the parameter names</span> + +<span class="sd"> Note: if the parameter is a floating point number, it will be converted to Python's float type.</span> +<span class="sd"> """</span> + + <span class="k">return</span> <span class="p">{</span><span class="n">param</span><span class="p">:</span><span class="n">convfloat</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">for</span> <span class="n">param</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">parameters</span><span class="p">,</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">())}</span></div> + +<div class="viewcode-block" id="pad_output_distribution"><a class="viewcode-back" href="../../../functions.html#binarycpython.utils.functions.pad_output_distribution">[docs]</a><span class="k">def</span> <span class="nf">pad_output_distribution</span><span class="p">(</span><span class="n">dist</span> <span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> + <span class="n">binwidth</span> <span class="p">:</span> <span class="nb">float</span><span class="p">):</span> + <span class="sd">"""</span> +<span class="sd"> Given a distribution, dist (a dictionary), which should be binned every binwidth (float), fill the distribution with zeros when there is no data. Note: this changes the data in place.</span> +<span class="sd"> """</span> + + <span class="c1"># sorted list of the keys</span> + <span class="n">skeys</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">dist</span><span class="o">.</span><span class="n">keys</span><span class="p">(),</span> <span class="n">key</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">))</span> + + <span class="c1"># get min and max, offset by the binwidth</span> + <span class="n">min_val</span> <span class="o">=</span> <span class="n">skeys</span><span class="p">[</span> <span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">binwidth</span> + <span class="n">max_val</span> <span class="o">=</span> <span class="n">skeys</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">binwidth</span> + + <span class="c1"># pad with zeros</span> + <span class="n">x</span> <span class="o">=</span> <span class="n">min_val</span> + <span class="k">while</span> <span class="n">x</span> <span class="o"><=</span> <span class="n">max_val</span><span class="p">:</span> + <span class="n">dist</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">dist</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="mf">0.0</span><span class="p">)</span> + <span class="n">x</span> <span class="o">+=</span> <span class="n">binwidth</span> + + <span class="k">return</span> <span class="n">dist</span></div> + <div class="viewcode-block" id="catchtime"><a class="viewcode-back" href="../../../functions.html#binarycpython.utils.functions.catchtime">[docs]</a><span class="k">class</span> <span class="nc">catchtime</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Context manager to calculate time spent</span> @@ -545,7 +630,6 @@ <span class="k">if</span> <span class="n">verbosity</span> <span class="o">>=</span> <span class="n">minimal_verbosity</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="n">message</span><span class="p">)</span></div> - <div class="viewcode-block" id="remove_file"><a class="viewcode-back" href="../../../functions.html#binarycpython.utils.functions.remove_file">[docs]</a><span class="k">def</span> <span class="nf">remove_file</span><span class="p">(</span><span class="n">file</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">verbosity</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span> <span class="sd">"""</span> <span class="sd"> Function to remove files but with verbosity</span> @@ -1033,7 +1117,7 @@ <span class="sd"> Args:</span> <span class="sd"> output: binary_c output string</span> -<span class="sd"> selected_header: string header of the output (the start of the line that you want to </span> +<span class="sd"> selected_header: string header of the output (the start of the line that you want to</span> <span class="sd"> process)</span> <span class="sd"> Returns:</span> @@ -1712,7 +1796,7 @@ <span class="sd"> """</span> <span class="c1"># Set up new dict</span> - <span class="n">new_dict</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">()</span> <span class="c1"># TODO: check if this still works</span> + <span class="n">new_dict</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">()</span> <span class="c1"># TODO: check if this still necessary</span> <span class="c1">#</span> <span class="n">keys_1</span> <span class="o">=</span> <span class="n">dict_1</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span> @@ -1747,19 +1831,17 @@ <span class="c1"># Go over the common keys:</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">overlapping_keys</span><span class="p">:</span> - <span class="c1"># See whether the types are actually the same</span> + <span class="c1"># If they keys are not the same, it depends on their type whether we still deal with them at all, or just raise an error</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">type</span><span class="p">(</span><span class="n">dict_1</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> <span class="ow">is</span> <span class="nb">type</span><span class="p">(</span><span class="n">dict_2</span><span class="p">[</span><span class="n">key</span><span class="p">]):</span> - <span class="c1"># Exceptions:</span> - <span class="k">if</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">dict_1</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> <span class="ow">in</span> <span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">])</span> <span class="ow">and</span> <span class="p">(</span> - <span class="nb">type</span><span class="p">(</span><span class="n">dict_2</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> <span class="ow">in</span> <span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">]</span> - <span class="p">):</span> + <span class="c1"># Exceptions: numbers can be added</span> + <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dict_1</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">))</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dict_2</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)):</span> <span class="n">new_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">dict_1</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">+</span> <span class="n">dict_2</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> - <span class="c1"># Exceptions:</span> - <span class="k">elif</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">dict_1</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> <span class="ow">in</span> <span class="p">[</span><span class="nb">dict</span><span class="p">,</span> <span class="n">OrderedDict</span><span class="p">])</span> <span class="ow">and</span> <span class="p">(</span> - <span class="nb">type</span><span class="p">(</span><span class="n">dict_2</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> <span class="ow">in</span> <span class="p">[</span><span class="nb">dict</span><span class="p">,</span> <span class="n">OrderedDict</span><span class="p">]</span> - <span class="p">):</span> + + <span class="c1"># Exceptions: versions of dicts can be merged</span> + <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dict_1</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">OrderedDict</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">AutoVivificationDict</span><span class="p">)))</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dict_2</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">OrderedDict</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">AutoVivificationDict</span><span class="p">))):</span> <span class="n">new_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">merge_dicts</span><span class="p">(</span><span class="n">dict_1</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">dict_2</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> + <span class="c1"># If the above cases have not dealt with it, then we should raise an error</span> <span class="k">else</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span> <span class="s2">"Error key: </span><span class="si">{}</span><span class="s2"> value: </span><span class="si">{}</span><span class="s2"> type: </span><span class="si">{}</span><span class="s2"> and key: </span><span class="si">{}</span><span class="s2"> value: </span><span class="si">{}</span><span class="s2"> type: </span><span class="si">{}</span><span class="s2"> are not of the same type and cannot be merged"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> @@ -1793,6 +1875,10 @@ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dict_1</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="nb">list</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dict_2</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="nb">list</span><span class="p">):</span> <span class="n">new_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">dict_1</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">+</span> <span class="n">dict_2</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> + <span class="c1"># Astropy quantities (using a dummy type representing the numpy array)</span> + <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dict_1</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="nb">type</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">1</span><span class="p">])</span><span class="o">*</span><span class="n">u</span><span class="o">.</span><span class="n">m</span><span class="p">))</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dict_2</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="nb">type</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">1</span><span class="p">])</span><span class="o">*</span><span class="n">u</span><span class="o">.</span><span class="n">m</span><span class="p">)):</span> + <span class="n">new_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">dict_1</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">+</span> <span class="n">dict_2</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> + <span class="c1"># dicts</span> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dict_1</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dict_2</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="nb">dict</span><span class="p">):</span> <span class="n">new_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">merge_dicts</span><span class="p">(</span><span class="n">dict_1</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">dict_2</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> @@ -1928,7 +2014,7 @@ <span class="sd"> When the keys of the current dictionary are of mixed type, we first find all the unique types.</span> <span class="sd"> Sort that list of type names. Then find the values that fit that type.</span> -<span class="sd"> Sort those and append them to the sorted keys list. </span> +<span class="sd"> Sort those and append them to the sorted keys list.</span> <span class="sd"> This is done until all the keys are sorted.</span> <span class="sd"> All objects other than dictionary types are directly return as they are</span> @@ -1949,7 +2035,7 @@ <span class="c1"># If there are multiple types, then we loop over them and do a piece wise sort</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">all_types_keys</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span> <span class="n">msg</span> <span class="o">=</span> <span class="s2">"Different types in the same dictionary key set"</span> - + <span class="c1"># Create a string repr of the type name to sort them afterwards</span> <span class="n">str_types</span> <span class="o">=</span> <span class="p">{</span><span class="nb">repr</span><span class="p">(</span><span class="n">el</span><span class="p">):</span><span class="n">el</span> <span class="k">for</span> <span class="n">el</span> <span class="ow">in</span> <span class="n">all_types_keys</span><span class="p">}</span> @@ -2190,9 +2276,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/_modules/binarycpython/utils/grid.html b/docs/build/html/_modules/binarycpython/utils/grid.html index 12c1a2512766f481cb452be0ac338af30d0a7a11..ac7f7eae8d12b26b3cbdc1a2284b462295a02ec2 100644 --- a/docs/build/html/_modules/binarycpython/utils/grid.html +++ b/docs/build/html/_modules/binarycpython/utils/grid.html @@ -161,9 +161,6 @@ <span class="sd">Here all the functionality of a Population object is defined.</span> -<span class="sd">Useful for the user to understand the functionality,</span> -<span class="sd">but copying functionality isn't recommended except if you know what you are doing</span> - <span class="sd">Tasks:</span> <span class="sd"> - TODO: add functionality to 'on-init' set arguments</span> <span class="sd"> - TODO: add functionality to return the initial_abundance_hash</span> @@ -178,8 +175,7 @@ <span class="sd"> - TODO: fix the correct object types for the default values of the bse_options</span> <span class="sd"> - TODO: uncomment and implement the HPC functionality</span> <span class="sd"> - TODO: think of a clean and nice way to unload and remove the custom_logging_info library from memory (and from disk)</span> -<span class="sd"> - TODO: think of a nice way to remove the loaded grid_code/ generator from memory. </span> -<span class="sd"> - TODO: Create a designated dict for results</span> +<span class="sd"> - TODO: think of a nice way to remove the loaded grid_code/ generator from memory.</span> <span class="sd">"""</span> <span class="kn">import</span> <span class="nn">os</span> @@ -194,6 +190,7 @@ <span class="kn">import</span> <span class="nn">argparse</span> <span class="kn">import</span> <span class="nn">importlib.util</span> <span class="kn">import</span> <span class="nn">multiprocessing</span> +<span class="kn">import</span> <span class="nn">resource</span> <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Union</span><span class="p">,</span> <span class="n">Any</span> <span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="p">(</span> <span class="n">OrderedDict</span><span class="p">,</span> @@ -231,9 +228,9 @@ <span class="n">recursive_change_key_to_string</span><span class="p">,</span> <span class="n">multiply_values_dict</span><span class="p">,</span> <span class="n">format_ensemble_results</span><span class="p">,</span> + <span class="n">AutoVivificationDict</span><span class="p">,</span> <span class="p">)</span> - <span class="c1"># from binarycpython.utils.hpc_functions import (</span> <span class="c1"># get_condor_version,</span> <span class="c1"># get_slurm_version,</span> @@ -254,6 +251,7 @@ <span class="kn">from</span> <span class="nn">binarycpython</span> <span class="kn">import</span> <span class="n">_binary_c_bindings</span> +<span class="n">secs_per_day</span> <span class="o">=</span> <span class="mi">86400</span> <span class="c1"># probably needs to go somewhere more sensible</span> <div class="viewcode-block" id="Population"><a class="viewcode-back" href="../../../grid.html#binarycpython.utils.grid.Population">[docs]</a><span class="k">class</span> <span class="nc">Population</span><span class="p">:</span> <span class="sd">"""</span> @@ -286,6 +284,9 @@ <span class="c1"># Custom options</span> <span class="bp">self</span><span class="o">.</span><span class="n">custom_options</span> <span class="o">=</span> <span class="p">{}</span> + <span class="c1"># shared memory used for logging</span> + <span class="bp">self</span><span class="o">.</span><span class="n">shared_memory</span> <span class="o">=</span> <span class="p">{}</span> + <span class="c1"># Load M&s options</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s1">'m&s_options'</span><span class="p">]</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">moe_di_stefano_default_options</span><span class="p">)</span> @@ -307,7 +308,8 @@ <span class="bp">self</span><span class="o">.</span><span class="n">process_ID</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># Create location to store results. Users should write to this dictionary.</span> - <span class="bp">self</span><span class="o">.</span><span class="n">grid_results</span> <span class="o">=</span> <span class="p">{}</span> + <span class="c1"># The AutoVivificationDict allows for perls method of accessing possibly non-existant subdicts</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_results</span> <span class="o">=</span> <span class="n">AutoVivificationDict</span><span class="p">()</span> <span class="c1"># Create location where ensemble results are written to</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_ensemble_results</span> <span class="o">=</span> <span class="p">{}</span> @@ -523,6 +525,64 @@ <span class="p">):</span> <span class="k">return</span> <span class="n">grid_variable</span> +<div class="viewcode-block" id="Population.update_grid_variable"><a class="viewcode-back" href="../../../grid.html#binarycpython.utils.grid.Population.update_grid_variable">[docs]</a> <span class="k">def</span> <span class="nf">update_grid_variable</span><span class="p">(</span> + <span class="bp">self</span><span class="p">,</span> + <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> + <span class="o">**</span><span class="n">kwargs</span> + <span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span> + <span class="sd">"""</span> +<span class="sd"> Function to update the values of a grid variable.</span> + +<span class="sd"> Args:</span> +<span class="sd"> name:</span> +<span class="sd"> name of the grid variable to be changed.</span> +<span class="sd"> **kwargs:</span> +<span class="sd"> key-value pairs to override the existing grid variable data. See add_grid_variable for these names.</span> +<span class="sd"> """</span> + + <span class="n">grid_variable</span> <span class="o">=</span> <span class="kc">None</span> + <span class="k">try</span><span class="p">:</span> + <span class="n">grid_variable</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_grid_variables"</span><span class="p">][</span><span class="n">name</span><span class="p">]</span> + <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> + <span class="n">msg</span> <span class="o">=</span> <span class="s2">"Unknown grid variable </span><span class="si">{}</span><span class="s2"> - please create it with the add_grid_variable() method."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> + <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> + + <span class="k">for</span> <span class="n">key</span><span class="p">,</span><span class="n">value</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> + <span class="n">grid_variable</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span> + <span class="n">verbose_print</span><span class="p">(</span> + <span class="s2">"Updated grid variable: </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">grid_variable</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">)),</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">],</span> + <span class="mi">1</span><span class="p">,</span> + <span class="p">)</span></div> + +<div class="viewcode-block" id="Population.rename_grid_variable"><a class="viewcode-back" href="../../../grid.html#binarycpython.utils.grid.Population.rename_grid_variable">[docs]</a> <span class="k">def</span> <span class="nf">rename_grid_variable</span><span class="p">(</span> + <span class="bp">self</span><span class="p">,</span> + <span class="n">oldname</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> + <span class="n">newname</span><span class="p">:</span> <span class="nb">str</span> + <span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span> + <span class="sd">"""</span> +<span class="sd"> Function to rename a grid variable.</span> + +<span class="sd"> note: this does NOT alter the order</span> +<span class="sd"> of the self.grid_options["_grid_variables"] dictionary.</span> + +<span class="sd"> The order in which the grid variables are loaded into the grid is based on their</span> +<span class="sd"> `grid_variable_number` property</span> + +<span class="sd"> Args:</span> +<span class="sd"> oldname:</span> +<span class="sd"> old name of the grid variable</span> +<span class="sd"> newname:</span> +<span class="sd"> new name of the grid variable</span> +<span class="sd"> """</span> + + <span class="k">try</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_grid_variables"</span><span class="p">][</span><span class="n">newname</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_grid_variables"</span><span class="p">]</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">oldname</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_grid_variables"</span><span class="p">][</span><span class="n">newname</span><span class="p">][</span><span class="s2">"name"</span><span class="p">]</span> <span class="o">=</span> <span class="n">newname</span> + <span class="k">except</span><span class="p">:</span> + <span class="n">msg</span> <span class="o">=</span> <span class="s2">"Failed to rename grid variable </span><span class="si">{}</span><span class="s2"> to </span><span class="si">{}</span><span class="s2">."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">oldname</span><span class="p">,</span><span class="n">newname</span><span class="p">)</span> + <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span></div> + <div class="viewcode-block" id="Population.add_grid_variable"><a class="viewcode-back" href="../../../grid.html#binarycpython.utils.grid.Population.add_grid_variable">[docs]</a> <span class="k">def</span> <span class="nf">add_grid_variable</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> @@ -610,8 +670,6 @@ <span class="sd"> (steps starting at lower edge + 0.5 * stepsize).</span> <span class="sd"> """</span> - <span class="c1"># TODO: Add check for the grid type input value</span> - <span class="c1"># Add grid_variable</span> <span class="n">grid_variable</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"name"</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> @@ -655,7 +713,6 @@ <span class="sd"> Returns:</span> <span class="sd"> dictionary containing "bse_options", "grid_options", "custom_options"</span> <span class="sd"> """</span> - <span class="n">options</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"bse_options"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">bse_options</span><span class="p">,</span> <span class="s2">"grid_options"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">,</span> @@ -709,7 +766,6 @@ <span class="c1">#</span> <span class="n">all_info</span> <span class="o">=</span> <span class="p">{}</span> - <span class="c1">#</span> <span class="k">if</span> <span class="n">include_population_settings</span><span class="p">:</span> <span class="n">population_settings</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">return_population_settings</span><span class="p">()</span> @@ -778,37 +834,42 @@ <span class="n">all_info_cleaned</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">all_info</span><span class="p">)</span> <span class="k">if</span> <span class="n">use_datadir</span><span class="p">:</span> - <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">custom_options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"base_filename"</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span> - <span class="n">base_name</span> <span class="o">=</span> <span class="s2">"simulation_</span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> - <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(),</span> <span class="s2">"%Y%m</span><span class="si">%d</span><span class="s2">_%H%M%S"</span><span class="p">)</span> - <span class="p">)</span> - <span class="k">else</span><span class="p">:</span> - <span class="n">base_name</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">custom_options</span><span class="p">[</span><span class="s2">"base_filename"</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span> + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">custom_options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"data_dir"</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span> + <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">custom_options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"base_filename"</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span> + <span class="n">base_name</span> <span class="o">=</span> <span class="s2">"simulation_</span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> + <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(),</span> <span class="s2">"%Y%m</span><span class="si">%d</span><span class="s2">_%H%M%S"</span><span class="p">)</span> + <span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">base_name</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">custom_options</span><span class="p">[</span><span class="s2">"base_filename"</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span> - <span class="n">settings_name</span> <span class="o">=</span> <span class="n">base_name</span> <span class="o">+</span> <span class="s2">"_settings.json"</span> + <span class="n">settings_name</span> <span class="o">=</span> <span class="n">base_name</span> <span class="o">+</span> <span class="s2">"_settings.json"</span> - <span class="c1"># Check directory, make if necessary</span> - <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">custom_options</span><span class="p">[</span><span class="s2">"data_dir"</span><span class="p">],</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> + <span class="c1"># Check directory, make if necessary</span> + <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">custom_options</span><span class="p">[</span><span class="s2">"data_dir"</span><span class="p">],</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> - <span class="n">settings_fullname</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span> - <span class="bp">self</span><span class="o">.</span><span class="n">custom_options</span><span class="p">[</span><span class="s2">"data_dir"</span><span class="p">],</span> <span class="n">settings_name</span> - <span class="p">)</span> + <span class="n">settings_fullname</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span> + <span class="bp">self</span><span class="o">.</span><span class="n">custom_options</span><span class="p">[</span><span class="s2">"data_dir"</span><span class="p">],</span> <span class="n">settings_name</span> + <span class="p">)</span> - <span class="n">verbose_print</span><span class="p">(</span> - <span class="s2">"Writing settings to </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">settings_fullname</span><span class="p">),</span> - <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">],</span> - <span class="mi">1</span><span class="p">,</span> - <span class="p">)</span> - <span class="c1"># if not outfile.endswith('json'):</span> - <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">settings_fullname</span><span class="p">,</span> <span class="s2">"w"</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span> - <span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span> - <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span> - <span class="n">all_info_cleaned</span><span class="p">,</span> - <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> - <span class="n">default</span><span class="o">=</span><span class="n">binaryc_json_serializer</span><span class="p">,</span> - <span class="p">)</span> + <span class="n">verbose_print</span><span class="p">(</span> + <span class="s2">"Writing settings to </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">settings_fullname</span><span class="p">),</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">],</span> + <span class="mi">1</span><span class="p">,</span> <span class="p">)</span> - <span class="k">return</span> <span class="n">settings_fullname</span> + <span class="c1"># if not outfile.endswith('json'):</span> + <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">settings_fullname</span><span class="p">,</span> <span class="s2">"w"</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span> + <span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span> + <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span> + <span class="n">all_info_cleaned</span><span class="p">,</span> + <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> + <span class="n">default</span><span class="o">=</span><span class="n">binaryc_json_serializer</span><span class="p">,</span> + <span class="p">)</span> + <span class="p">)</span> + <span class="k">return</span> <span class="n">settings_fullname</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">msg</span> <span class="o">=</span> <span class="s2">"Exporting all info without passing a value for `outfile` requires custom_options['data_dir'] to be present. That is not the cause. Either set the `data_dir` or pass a value for `outfile` "</span> + <span class="k">raise</span> <span class="ne">ValueError</span> + <span class="k">else</span><span class="p">:</span> <span class="n">verbose_print</span><span class="p">(</span> <span class="s2">"Writing settings to </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outfile</span><span class="p">),</span> @@ -835,51 +896,61 @@ <span class="sd">"""</span> <span class="sd"> Function/routine to set all the custom logging so that the function memory pointer</span> <span class="sd"> is known to the grid.</span> + +<span class="sd"> When the memory adress is loaded and the library file is set we'll skip rebuilding the library</span> <span class="sd"> """</span> - <span class="c1"># C_logging_code gets priority of C_autogen_code</span> - <span class="n">verbose_print</span><span class="p">(</span> - <span class="s2">"Creating and loading custom logging functionality"</span><span class="p">,</span> - <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">],</span> - <span class="mi">1</span><span class="p">,</span> - <span class="p">)</span> - <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"C_logging_code"</span><span class="p">]:</span> - <span class="c1"># Generate entire shared lib code around logging lines</span> - <span class="n">custom_logging_code</span> <span class="o">=</span> <span class="n">binary_c_log_code</span><span class="p">(</span> - <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"C_logging_code"</span><span class="p">],</span> - <span class="n">verbosity</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">]</span><span class="o">-</span><span class="p">(</span><span class="n">_CUSTOM_LOGGING_VERBOSITY_LEVEL</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> + <span class="c1"># Only if the values are the 'default' unset values</span> + <span class="k">if</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"custom_logging_func_memaddr"</span><span class="p">]</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_custom_logging_shared_library_file"</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">):</span> + <span class="n">verbose_print</span><span class="p">(</span> + <span class="s2">"Creating and loading custom logging functionality"</span><span class="p">,</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">],</span> + <span class="mi">1</span><span class="p">,</span> <span class="p">)</span> + <span class="c1"># C_logging_code gets priority of C_autogen_code</span> + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"C_logging_code"</span><span class="p">]:</span> + <span class="c1"># Generate entire shared lib code around logging lines</span> + <span class="n">custom_logging_code</span> <span class="o">=</span> <span class="n">binary_c_log_code</span><span class="p">(</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"C_logging_code"</span><span class="p">],</span> + <span class="n">verbosity</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">]</span><span class="o">-</span><span class="p">(</span><span class="n">_CUSTOM_LOGGING_VERBOSITY_LEVEL</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> + <span class="p">)</span> - <span class="c1"># Load memory address</span> - <span class="p">(</span> - <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"custom_logging_func_memaddr"</span><span class="p">],</span> - <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_custom_logging_shared_library_file"</span><span class="p">],</span> - <span class="p">)</span> <span class="o">=</span> <span class="n">create_and_load_logging_function</span><span class="p">(</span> - <span class="n">custom_logging_code</span><span class="p">,</span> - <span class="n">verbosity</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">]</span><span class="o">-</span><span class="p">(</span><span class="n">_CUSTOM_LOGGING_VERBOSITY_LEVEL</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> - <span class="n">custom_tmp_dir</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"tmp_dir"</span><span class="p">],</span> - <span class="p">)</span> + <span class="c1"># Load memory address</span> + <span class="p">(</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"custom_logging_func_memaddr"</span><span class="p">],</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_custom_logging_shared_library_file"</span><span class="p">],</span> + <span class="p">)</span> <span class="o">=</span> <span class="n">create_and_load_logging_function</span><span class="p">(</span> + <span class="n">custom_logging_code</span><span class="p">,</span> + <span class="n">verbosity</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">]</span><span class="o">-</span><span class="p">(</span><span class="n">_CUSTOM_LOGGING_VERBOSITY_LEVEL</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> + <span class="n">custom_tmp_dir</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"tmp_dir"</span><span class="p">],</span> + <span class="p">)</span> - <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"C_auto_logging"</span><span class="p">]:</span> - <span class="c1"># Generate real logging code</span> - <span class="n">logging_line</span> <span class="o">=</span> <span class="n">autogen_C_logging_code</span><span class="p">(</span> - <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"C_auto_logging"</span><span class="p">],</span> - <span class="n">verbosity</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">]</span><span class="o">-</span><span class="p">(</span><span class="n">_CUSTOM_LOGGING_VERBOSITY_LEVEL</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> - <span class="p">)</span> + <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"C_auto_logging"</span><span class="p">]:</span> + <span class="c1"># Generate real logging code</span> + <span class="n">logging_line</span> <span class="o">=</span> <span class="n">autogen_C_logging_code</span><span class="p">(</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"C_auto_logging"</span><span class="p">],</span> + <span class="n">verbosity</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">]</span><span class="o">-</span><span class="p">(</span><span class="n">_CUSTOM_LOGGING_VERBOSITY_LEVEL</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> + <span class="p">)</span> - <span class="c1"># Generate entire shared lib code around logging lines</span> - <span class="n">custom_logging_code</span> <span class="o">=</span> <span class="n">binary_c_log_code</span><span class="p">(</span> - <span class="n">logging_line</span><span class="p">,</span> <span class="n">verbosity</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">]</span><span class="o">-</span><span class="p">(</span><span class="n">_CUSTOM_LOGGING_VERBOSITY_LEVEL</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> - <span class="p">)</span> + <span class="c1"># Generate entire shared lib code around logging lines</span> + <span class="n">custom_logging_code</span> <span class="o">=</span> <span class="n">binary_c_log_code</span><span class="p">(</span> + <span class="n">logging_line</span><span class="p">,</span> <span class="n">verbosity</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">]</span><span class="o">-</span><span class="p">(</span><span class="n">_CUSTOM_LOGGING_VERBOSITY_LEVEL</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> + <span class="p">)</span> - <span class="c1"># Load memory address</span> - <span class="p">(</span> - <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"custom_logging_func_memaddr"</span><span class="p">],</span> - <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_custom_logging_shared_library_file"</span><span class="p">],</span> - <span class="p">)</span> <span class="o">=</span> <span class="n">create_and_load_logging_function</span><span class="p">(</span> - <span class="n">custom_logging_code</span><span class="p">,</span> - <span class="n">verbosity</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">]</span><span class="o">-</span><span class="p">(</span><span class="n">_CUSTOM_LOGGING_VERBOSITY_LEVEL</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> - <span class="n">custom_tmp_dir</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"tmp_dir"</span><span class="p">],</span> + <span class="c1"># Load memory address</span> + <span class="p">(</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"custom_logging_func_memaddr"</span><span class="p">],</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_custom_logging_shared_library_file"</span><span class="p">],</span> + <span class="p">)</span> <span class="o">=</span> <span class="n">create_and_load_logging_function</span><span class="p">(</span> + <span class="n">custom_logging_code</span><span class="p">,</span> + <span class="n">verbosity</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">]</span><span class="o">-</span><span class="p">(</span><span class="n">_CUSTOM_LOGGING_VERBOSITY_LEVEL</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> + <span class="n">custom_tmp_dir</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"tmp_dir"</span><span class="p">],</span> + <span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">verbose_print</span><span class="p">(</span> + <span class="s2">"Custom logging library already loaded. Not setting them again."</span><span class="p">,</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">],</span> + <span class="mi">1</span><span class="p">,</span> <span class="p">)</span> <span class="c1">###################################################</span> @@ -893,19 +964,48 @@ <span class="c1"># Evolution functions</span> <span class="c1">###################################################</span> - <span class="k">def</span> <span class="nf">_pre_run_cleanup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="k">def</span> <span class="nf">_pre_run_cleanup</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span> <span class="sd">"""</span> <span class="sd"> Function to clean up some stuff in the grid before a run (like results, ensemble results etc)</span> <span class="sd"> """</span> <span class="c1"># empty results</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"results"</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_results</span> <span class="o">=</span> <span class="n">AutoVivificationDict</span><span class="p">()</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_ensemble_results</span> <span class="o">=</span> <span class="p">{}</span> + + <span class="c1"># Reset the process ID (should not have a value initially, but can't hurt if it does)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">process_ID</span> <span class="o">=</span> <span class="mi">0</span> + + <span class="c1"># Reset population ID:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_population_id"</span><span class="p">]</span> <span class="o">=</span> <span class="n">uuid</span><span class="o">.</span><span class="n">uuid4</span><span class="p">()</span><span class="o">.</span><span class="n">hex</span> + + <span class="c1"># set previous logging time</span> + <span class="bp">self</span><span class="o">.</span><span class="n">shared_memory</span><span class="p">[</span><span class="s2">"prev_log_time"</span><span class="p">]</span> <span class="o">=</span> <span class="n">multiprocessing</span><span class="o">.</span><span class="n">Value</span><span class="p">(</span><span class="s1">'d'</span><span class="p">,</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> + <span class="c1"># set previous logging system number to 0</span> + <span class="bp">self</span><span class="o">.</span><span class="n">shared_memory</span><span class="p">[</span><span class="s2">"prev_log_system_number"</span><span class="p">]</span> <span class="o">=</span> <span class="n">multiprocessing</span><span class="o">.</span><span class="n">Value</span><span class="p">(</span><span class="s1">'i'</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span> + <span class="c1"># array to store memory use per-thread</span> + <span class="n">mem</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mem_use</span><span class="p">()</span> + <span class="bp">self</span><span class="o">.</span><span class="n">shared_memory</span><span class="p">[</span><span class="s2">"memory_use_per_thread"</span><span class="p">]</span> <span class="o">=</span> <span class="n">multiprocessing</span><span class="o">.</span><span class="n">Array</span><span class="p">(</span><span class="s1">'d'</span><span class="p">,[</span><span class="mf">1.0</span><span class="o">*</span><span class="n">mem</span><span class="p">]</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"amt_cores"</span><span class="p">])</span> + +<div class="viewcode-block" id="Population.clean"><a class="viewcode-back" href="../../../grid.html#binarycpython.utils.grid.Population.clean">[docs]</a> <span class="k">def</span> <span class="nf">clean</span><span class="p">(</span> + <span class="bp">self</span> + <span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span> + <span class="sd">"""</span> +<span class="sd"> Clean the contents of the population object so it can be reused.</span> + +<span class="sd"> Calling _pre_run_cleanup()</span> + +<span class="sd"> TODO: decide to deprecate this function</span> +<span class="sd"> """</span> + + <span class="bp">self</span><span class="o">.</span><span class="n">_pre_run_cleanup</span><span class="p">()</span></div> <div class="viewcode-block" id="Population.evolve"><a class="viewcode-back" href="../../../grid.html#binarycpython.utils.grid.Population.evolve">[docs]</a> <span class="k">def</span> <span class="nf">evolve</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span> <span class="sd">"""</span> <span class="sd"> Entry point function of the whole object. From here, based on the settings,</span> <span class="sd"> we set up a SLURM or CONDOR grid, or if no setting is given we go straight</span> -<span class="sd"> to evolving the population</span> +<span class="sd"> to evolving the population.</span> <span class="sd"> There are no direct arguments to this function, rather it is based on the grid_options settings:</span> <span class="sd"> grid_options['slurm']: integer Boolean whether to use a slurm_grid evolution</span> @@ -915,7 +1015,9 @@ <span class="sd"> (that doesn't mean this cannot be run on a server with many cores)</span> <span class="sd"> Returns an dictionary containing the analytics of the run</span> + <span class="sd"> TODO: change the way this is done. Slurm & CONDOR should probably do this different</span> +<span class="sd"> NOTE: SLURM and CONDOR options are not working properly yet</span> <span class="sd"> """</span> <span class="c1"># Just to make sure we don't have stuff from a previous run hanging around</span> @@ -978,9 +1080,6 @@ <span class="sd"> - TODO: include options for different ways of generating a population here. (i.e. MC or source file)</span> <span class="sd"> """</span> - <span class="c1"># Reset some settings: population_id, results, ensemble_results etc</span> - <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_population_id"</span><span class="p">]</span> <span class="o">=</span> <span class="n">uuid</span><span class="o">.</span><span class="n">uuid4</span><span class="p">()</span><span class="o">.</span><span class="n">hex</span> - <span class="c1">##</span> <span class="c1"># Prepare code/initialise grid.</span> <span class="c1"># set custom logging, set up store_memaddr, build grid code. dry run grid code.</span> @@ -1005,7 +1104,7 @@ <span class="p">)</span> <span class="p">)</span> - <span class="c1">#</span> + <span class="c1"># finished!</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_end_time_evolution"</span><span class="p">]</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="c1"># Log and print some information</span> @@ -1119,7 +1218,7 @@ <span class="c1"># Send closing signal to workers. When they receive this they will terminate</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s1">'verbosity'</span><span class="p">]</span> <span class="o">>=</span> <span class="n">_LOGGER_VERBOSITY_LEVEL</span><span class="p">:</span> <span class="n">stream_logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Signaling stop to processes"</span><span class="p">)</span> <span class="c1"># DEBUG</span> - + <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">amt_cores</span><span class="p">):</span> <span class="n">job_queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="s2">"STOP"</span><span class="p">)</span> @@ -1355,6 +1454,9 @@ <span class="n">zero_prob_stars_skipped</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">total_time_calling_binary_c</span> <span class="o">=</span> <span class="mi">0</span> + <span class="n">start_grid_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> + <span class="n">next_log_time</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">shared_memory</span><span class="p">[</span><span class="s2">"prev_log_time"</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"log_dt"</span><span class="p">]</span> + <span class="n">next_mem_update_time</span> <span class="o">=</span> <span class="n">start_grid_time</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"log_dt"</span><span class="p">]</span> <span class="n">total_mass_run</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">total_probability_weighted_mass_run</span> <span class="o">=</span> <span class="mi">0</span> @@ -1419,11 +1521,31 @@ <span class="c1"># )</span> <span class="c1">#</span> - <span class="n">verbose_print</span><span class="p">(</span> - <span class="s2">"Process </span><span class="si">{}</span><span class="s2"> is handling system </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ID</span><span class="p">,</span> <span class="n">system_number</span><span class="p">),</span> - <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">],</span> - <span class="mi">1</span><span class="p">,</span> - <span class="p">)</span> + +<span class="c1"># verbose_print(</span> +<span class="c1"># "Process {} is handling system {}".format(ID, system_number),</span> +<span class="c1"># self.grid_options["verbosity"],</span> +<span class="c1"># 1,</span> +<span class="c1"># )</span> + + <span class="c1"># save the current time (used often)</span> + <span class="n">now</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> + + <span class="c1"># update memory use stats every log_dt seconds (not every time, this is likely a bit expensive)</span> + <span class="k">if</span> <span class="n">now</span> <span class="o">></span> <span class="n">next_mem_update_time</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">shared_memory</span><span class="p">[</span><span class="s2">"memory_use_per_thread"</span><span class="p">][</span><span class="n">ID</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mem_use</span><span class="p">()</span> + <span class="n">next_mem_update</span> <span class="o">=</span> <span class="n">now</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"log_dt"</span><span class="p">]</span> + + <span class="c1"># calculate the next logging time</span> + <span class="n">next_log_time</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">shared_memory</span><span class="p">[</span><span class="s2">"prev_log_time"</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"log_dt"</span><span class="p">]</span> + + <span class="k">if</span> <span class="n">now</span> <span class="o">></span> <span class="n">next_log_time</span><span class="p">:</span> + <span class="c1"># we have exceeded the next log time : output and update timers</span> + <span class="n">lock</span> <span class="o">=</span> <span class="n">multiprocessing</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span> + <span class="bp">self</span><span class="o">.</span><span class="n">vb1print</span><span class="p">(</span><span class="n">ID</span><span class="p">,</span><span class="n">now</span><span class="p">,</span><span class="n">system_number</span><span class="p">)</span> + <span class="n">next_log_time</span> <span class="o">=</span> <span class="n">now</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"log_dt"</span><span class="p">]</span> + <span class="bp">self</span><span class="o">.</span><span class="n">shared_memory</span><span class="p">[</span><span class="s2">"prev_log_time"</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">now</span> + <span class="bp">self</span><span class="o">.</span><span class="n">shared_memory</span><span class="p">[</span><span class="s2">"prev_log_system_number"</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">system_number</span> <span class="c1"># In some cases, the whole run crashes. To be able to figure out which system</span> <span class="c1"># that was on, we log each current system to a file (each thread has one).</span> @@ -1511,7 +1633,6 @@ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s1">'verbosity'</span><span class="p">]</span> <span class="o">>=</span> <span class="n">_LOGGER_VERBOSITY_LEVEL</span><span class="p">:</span> <span class="n">stream_logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Process-</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">process_ID</span><span class="si">}</span><span class="s2"> is finishing."</span><span class="p">)</span> - <span class="c1"># Handle ensemble output: is ensemble==1, then either directly write that data to a file, or combine everything into 1 file.</span> <span class="n">ensemble_json</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># Make sure it exists already</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">bse_options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"ensemble"</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> @@ -1675,31 +1796,42 @@ <span class="c1">### Custom logging code:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set_custom_logging</span><span class="p">()</span> - <span class="c1"># Get argument line</span> - <span class="n">argline</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_return_argline</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bse_options</span><span class="p">)</span> - <span class="n">verbose_print</span><span class="p">(</span><span class="s2">"Running </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">argline</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">],</span> <span class="mi">1</span><span class="p">)</span> - <span class="c1"># Run system</span> - <span class="n">out</span> <span class="o">=</span> <span class="n">_binary_c_bindings</span><span class="o">.</span><span class="n">run_system</span><span class="p">(</span> - <span class="n">argstring</span><span class="o">=</span><span class="n">argline</span><span class="p">,</span> - <span class="n">custom_logging_func_memaddr</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span> - <span class="s2">"custom_logging_func_memaddr"</span> - <span class="p">],</span> - <span class="n">store_memaddr</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_store_memaddr"</span><span class="p">],</span> - <span class="n">population</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> - <span class="p">)</span> + <span class="c1"># Check if there are actually arguments passed:</span> + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">bse_options</span><span class="p">:</span> + + <span class="c1"># Get argument line and</span> + <span class="n">argline</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_return_argline</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bse_options</span><span class="p">)</span> + + <span class="n">verbose_print</span><span class="p">(</span><span class="s2">"Running </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">argline</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">],</span> <span class="mi">1</span><span class="p">)</span> + + <span class="c1"># Run system</span> + <span class="n">out</span> <span class="o">=</span> <span class="n">_binary_c_bindings</span><span class="o">.</span><span class="n">run_system</span><span class="p">(</span> + <span class="n">argstring</span><span class="o">=</span><span class="n">argline</span><span class="p">,</span> + <span class="n">custom_logging_func_memaddr</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span> + <span class="s2">"custom_logging_func_memaddr"</span> + <span class="p">],</span> + <span class="n">store_memaddr</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_store_memaddr"</span><span class="p">],</span> + <span class="n">population</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> + <span class="p">)</span> + + <span class="c1"># Clean up custom logging</span> + <span class="k">if</span> <span class="n">clean_up_custom_logging_files</span><span class="p">:</span> + <span class="bp">self</span><span class="o">.</span><span class="n">_clean_up_custom_logging</span><span class="p">(</span><span class="n">evol_type</span><span class="o">=</span><span class="s2">"single"</span><span class="p">)</span> + + <span class="c1"># Parse output and return the result</span> + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"parse_function"</span><span class="p">]:</span> + <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"parse_function"</span><span class="p">](</span><span class="bp">self</span><span class="p">,</span> <span class="n">out</span><span class="p">)</span> + + <span class="c1"># Otherwise just return the raw output</span> + <span class="k">return</span> <span class="n">out</span> + + <span class="k">else</span><span class="p">:</span> + <span class="n">msg</span> <span class="o">=</span> <span class="s2">"No actual evolution options passed to the evolve call. Aborting"</span> + <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span></div> - <span class="c1"># TODO: add call to function that cleans up the temp custom logging dir,</span> - <span class="c1"># and unloads the loaded libraries.</span> - <span class="c1"># TODO: make a switch to turn this off</span> - <span class="k">if</span> <span class="n">clean_up_custom_logging_files</span><span class="p">:</span> - <span class="bp">self</span><span class="o">.</span><span class="n">_clean_up_custom_logging</span><span class="p">(</span><span class="n">evol_type</span><span class="o">=</span><span class="s2">"single"</span><span class="p">)</span> - <span class="c1"># Parse</span> - <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"parse_function"</span><span class="p">]:</span> - <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"parse_function"</span><span class="p">](</span><span class="bp">self</span><span class="p">,</span> <span class="n">out</span><span class="p">)</span> - <span class="k">return</span> <span class="n">out</span></div> <span class="k">def</span> <span class="nf">_setup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> @@ -2419,7 +2551,7 @@ <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="p">)</span> - <span class="c1"># Take into account the multiplicity fraction: </span> + <span class="c1"># Take into account the multiplicity fraction:</span> <span class="n">code_string</span> <span class="o">+=</span> <span class="p">(</span> <span class="n">indent</span> <span class="o">*</span> <span class="p">(</span><span class="n">depth</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> @@ -3283,10 +3415,10 @@ <span class="mi">1</span><span class="p">,</span> <span class="p">)</span> - <span class="c1"># TODO: Unset custom logging code</span> + <span class="c1"># TODO: Explicitly unload the library</span> - <span class="c1"># TODO: Unset function memory address</span> - <span class="c1"># print(self.grid_options["custom_logging_func_memaddr"])</span> + <span class="c1"># Reset the memory adress location</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"custom_logging_func_memaddr"</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="c1"># remove shared library files</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_custom_logging_shared_library_file"</span><span class="p">]:</span> @@ -3294,6 +3426,7 @@ <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_custom_logging_shared_library_file"</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">],</span> <span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_custom_logging_shared_library_file"</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">if</span> <span class="n">evol_type</span> <span class="o">==</span> <span class="s2">"population"</span><span class="p">:</span> <span class="n">verbose_print</span><span class="p">(</span> @@ -3441,7 +3574,7 @@ <div class="viewcode-block" id="Population.set_moe_di_stefano_settings"><a class="viewcode-back" href="../../../grid.html#binarycpython.utils.grid.Population.set_moe_di_stefano_settings">[docs]</a> <span class="k">def</span> <span class="nf">set_moe_di_stefano_settings</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Function to set user input configurations for the moe & di Stefano methods</span> -<span class="sd"> </span> + <span class="sd"> If nothing is passed then we just use the default options</span> <span class="sd"> """</span> @@ -3784,7 +3917,7 @@ <span class="n">resolution</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s1">'m&s_options'</span><span class="p">][</span><span class="s2">"resolutions"</span><span class="p">][</span><span class="s2">"logP"</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="n">probdist</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">condition</span><span class="o">=</span><span class="s1">'(self.grid_options["multiplicity"] >= 2)'</span><span class="p">,</span> - <span class="n">branchpoint</span><span class="o">=</span><span class="mi">1</span> <span class="k">if</span> <span class="n">max_multiplicity</span> <span class="o">></span> <span class="mi">1</span> <span class="k">else</span> <span class="mi">0</span><span class="p">,</span> <span class="c1"># Signal here to put a branchpoint if we have a max multiplicity higher than 1. </span> + <span class="n">branchpoint</span><span class="o">=</span><span class="mi">1</span> <span class="k">if</span> <span class="n">max_multiplicity</span> <span class="o">></span> <span class="mi">1</span> <span class="k">else</span> <span class="mi">0</span><span class="p">,</span> <span class="c1"># Signal here to put a branchpoint if we have a max multiplicity higher than 1.</span> <span class="n">gridtype</span><span class="o">=</span><span class="s2">"centred"</span><span class="p">,</span> <span class="n">dphasevol</span><span class="o">=</span><span class="s2">"(</span><span class="si">{}</span><span class="s2"> * dlog10per)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">LOG_LN_CONVERTER</span><span class="p">),</span> <span class="n">valuerange</span><span class="o">=</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s1">'m&s_options'</span><span class="p">][</span><span class="s2">"ranges"</span><span class="p">][</span><span class="s2">"logP"</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s1">'m&s_options'</span><span class="p">][</span><span class="s2">"ranges"</span><span class="p">][</span><span class="s2">"logP"</span><span class="p">][</span><span class="mi">1</span><span class="p">]],</span> @@ -3799,7 +3932,7 @@ <span class="s2">"""</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s1">'m&s_options'</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"Mmin"</span><span class="p">,</span> <span class="mf">0.07</span><span class="p">)</span> <span class="p">),</span> - <span class="p">)</span> <span class="c1"># TODO: change the maximum_mass_ratio_for_RLOF </span> + <span class="p">)</span> <span class="c1"># TODO: change the maximum_mass_ratio_for_RLOF</span> <span class="c1"># binaries: mass ratio</span> <span class="bp">self</span><span class="o">.</span><span class="n">add_grid_variable</span><span class="p">(</span> @@ -3865,7 +3998,7 @@ <span class="n">resolution</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s1">'m&s_options'</span><span class="p">][</span><span class="s2">"resolutions"</span><span class="p">][</span><span class="s2">"logP"</span><span class="p">][</span><span class="mi">1</span><span class="p">],</span> <span class="n">probdist</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">condition</span><span class="o">=</span><span class="s1">'(self.grid_options["multiplicity"] >= 3)'</span><span class="p">,</span> - <span class="n">branchpoint</span><span class="o">=</span><span class="mi">2</span> <span class="k">if</span> <span class="n">max_multiplicity</span> <span class="o">></span> <span class="mi">2</span> <span class="k">else</span> <span class="mi">0</span><span class="p">,</span> <span class="c1"># Signal here to put a branchpoint if we have a max multiplicity higher than 1. </span> + <span class="n">branchpoint</span><span class="o">=</span><span class="mi">2</span> <span class="k">if</span> <span class="n">max_multiplicity</span> <span class="o">></span> <span class="mi">2</span> <span class="k">else</span> <span class="mi">0</span><span class="p">,</span> <span class="c1"># Signal here to put a branchpoint if we have a max multiplicity higher than 1.</span> <span class="n">gridtype</span><span class="o">=</span><span class="s2">"centred"</span><span class="p">,</span> <span class="n">dphasevol</span><span class="o">=</span><span class="s2">"(</span><span class="si">{}</span><span class="s2"> * dlog10per2)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">LOG_LN_CONVERTER</span><span class="p">),</span> <span class="n">valuerange</span><span class="o">=</span><span class="p">[</span> @@ -4198,7 +4331,91 @@ <span class="mi">2</span><span class="p">,</span> <span class="p">)</span> - <span class="k">return</span> <span class="n">multiplicity_fraction_dict</span><span class="p">[</span><span class="n">system_dict</span><span class="p">[</span><span class="s1">'multiplicity'</span><span class="p">]]</span></div> + <span class="k">return</span> <span class="n">multiplicity_fraction_dict</span><span class="p">[</span><span class="n">system_dict</span><span class="p">[</span><span class="s1">'multiplicity'</span><span class="p">]]</span> + + <span class="k">def</span> <span class="nf">_trem</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">dt</span><span class="p">,</span><span class="n">count</span><span class="p">,</span><span class="n">dn</span><span class="p">,</span><span class="n">n</span><span class="p">):</span> + <span class="sd">"""</span> +<span class="sd"> Estimate time remaining (seconds) given a differential time and count (i.e. progress = $count/$n). $dt is the time since the last call, $count is the current progress count, $dn is the number run since the last call, and $n is the total number required.</span> +<span class="sd"> """</span> + <span class="n">tpr</span> <span class="o">=</span> <span class="n">dt</span> <span class="o">/</span> <span class="nb">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">dn</span><span class="p">)</span> + <span class="n">etasecs</span> <span class="o">=</span> <span class="n">tpr</span> <span class="o">*</span> <span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="n">count</span><span class="p">)</span> + <span class="p">(</span><span class="n">eta</span><span class="p">,</span><span class="n">units</span><span class="p">)</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_conv_time_units</span><span class="p">(</span><span class="n">etasecs</span><span class="p">)</span> + <span class="k">return</span> <span class="p">(</span><span class="n">eta</span><span class="p">,</span><span class="n">units</span><span class="p">,</span><span class="n">tpr</span><span class="p">,</span><span class="n">etasecs</span><span class="p">)</span> + + <span class="k">def</span> <span class="nf">_conv_time_units</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">t</span><span class="p">):</span> + <span class="sd">"""</span> +<span class="sd"> Converts time (t, in seconds, passing in as the only argument) to seconds, minutes or hours depending on its magnitude. Returns a tuple (t,units).</span> +<span class="sd"> """</span> + <span class="n">units</span><span class="o">=</span><span class="s1">'s'</span><span class="p">;</span> <span class="c1"># default to seconds</span> + <span class="k">if</span> <span class="n">t</span> <span class="o">></span> <span class="mi">60</span><span class="p">:</span> + <span class="n">t</span> <span class="o">/=</span> <span class="mi">60</span><span class="p">;</span> + <span class="n">units</span><span class="o">=</span><span class="s1">'m'</span><span class="p">;</span> + <span class="k">if</span> <span class="n">t</span> <span class="o">></span> <span class="mi">60</span><span class="p">:</span> + <span class="n">t</span> <span class="o">/=</span><span class="mi">60</span><span class="p">;</span> + <span class="n">units</span><span class="o">=</span><span class="s1">'h'</span><span class="p">;</span> + <span class="k">return</span> <span class="p">(</span><span class="n">t</span><span class="p">,</span><span class="n">units</span><span class="p">)</span> + +<div class="viewcode-block" id="Population.vb1print"><a class="viewcode-back" href="../../../grid.html#binarycpython.utils.grid.Population.vb1print">[docs]</a> <span class="k">def</span> <span class="nf">vb1print</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">ID</span><span class="p">,</span><span class="n">now</span><span class="p">,</span><span class="n">system_number</span><span class="p">):</span> + <span class="sd">"""</span> +<span class="sd"> Verbosity-level 1 printing, to keep an eye on a grid.</span> +<span class="sd"> Arguments:</span> +<span class="sd"> ID : thread ID for debugging (int)</span> +<span class="sd"> now : the time now as a UNIX-style epoch in seconds (float)</span> +<span class="sd"> system_number : the system number</span> +<span class="sd"> """</span> + <span class="c1"># calculate estimated time of arrive (eta and eta_secs), time per run (tpr)</span> + <span class="n">localtime</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">localtime</span><span class="p">(</span><span class="n">now</span><span class="p">)</span> + <span class="n">dt</span> <span class="o">=</span> <span class="n">now</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">shared_memory</span><span class="p">[</span><span class="s2">"prev_log_time"</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> + <span class="n">dn</span> <span class="o">=</span> <span class="n">system_number</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">shared_memory</span><span class="p">[</span><span class="s2">"prev_log_system_number"</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> + <span class="p">(</span><span class="n">eta</span><span class="p">,</span><span class="n">units</span><span class="p">,</span><span class="n">tpr</span><span class="p">,</span><span class="n">eta_secs</span><span class="p">)</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_trem</span><span class="p">(</span><span class="n">dt</span><span class="p">,</span> + <span class="n">system_number</span><span class="p">,</span> + <span class="n">dn</span><span class="p">,</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_total_starcount"</span><span class="p">])</span> + <span class="k">if</span> <span class="n">eta_secs</span> <span class="o"><</span> <span class="n">secs_per_day</span><span class="p">:</span> + <span class="n">fintime</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">localtime</span><span class="p">(</span><span class="n">now</span> <span class="o">+</span> <span class="n">eta_secs</span><span class="p">)</span> + <span class="n">etf</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{hours:02d}</span><span class="s2">:</span><span class="si">{minutes:02d}</span><span class="s2">:</span><span class="si">{seconds:02d}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">hours</span> <span class="o">=</span> <span class="n">fintime</span><span class="o">.</span><span class="n">tm_hour</span><span class="p">,</span> + <span class="n">minutes</span> <span class="o">=</span> <span class="n">fintime</span><span class="o">.</span><span class="n">tm_min</span><span class="p">,</span> + <span class="n">seconds</span> <span class="o">=</span> <span class="n">fintime</span><span class="o">.</span><span class="n">tm_sec</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">d</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">eta_secs</span><span class="o">/</span><span class="n">secs_per_day</span><span class="p">)</span> + <span class="k">if</span> <span class="n">d</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> + <span class="n">etf</span> <span class="o">=</span> <span class="s2">"Tomorrow"</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">etf</span> <span class="o">=</span> <span class="s2">"In "</span> <span class="o">+</span> <span class="n">d</span> <span class="o">+</span> <span class="s2">" days"</span> + + <span class="c1"># modulo information</span> + <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s1">'modulo'</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> + <span class="n">modulo</span> <span class="o">=</span> <span class="s1">''</span> <span class="c1"># usual case</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">modulo</span> <span class="o">=</span> <span class="s1">'%'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s1">'modulo'</span><span class="p">])</span> + + <span class="c1"># add up memory use from each thread</span> + <span class="n">mem_use</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">shared_memory</span><span class="p">[</span><span class="s2">"memory_use_per_thread"</span><span class="p">])</span> + + <span class="n">verbose_print</span><span class="p">(</span> + <span class="s2">"</span><span class="si">{system_number}</span><span class="s2">/</span><span class="si">{total_starcount}{modulo}</span><span class="s2"> </span><span class="si">{complete:5.1f}% c</span><span class="s2">omplete </span><span class="si">{hours:02d}</span><span class="s2">:</span><span class="si">{minutes:02d}</span><span class="s2">:</span><span class="si">{seconds:02d}</span><span class="s2"> ETA=</span><span class="si">{eta:7.1f}{units}</span><span class="s2"> tpr=</span><span class="si">{tpr:2.2e}</span><span class="s2"> ETF=</span><span class="si">{etf}</span><span class="s2"> mem:</span><span class="si">{mem_use:.1f}</span><span class="s2">MB"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> + <span class="n">system_number</span> <span class="o">=</span> <span class="n">system_number</span><span class="p">,</span> + <span class="n">total_starcount</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_total_starcount"</span><span class="p">],</span> + <span class="n">complete</span><span class="o">=</span><span class="p">(</span><span class="mf">100.0</span><span class="o">*</span><span class="n">system_number</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="mf">1.0</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"_total_starcount"</span><span class="p">]),</span> + <span class="n">modulo</span> <span class="o">=</span> <span class="n">modulo</span><span class="p">,</span> + <span class="n">hours</span> <span class="o">=</span> <span class="n">localtime</span><span class="o">.</span><span class="n">tm_hour</span><span class="p">,</span> + <span class="n">minutes</span> <span class="o">=</span> <span class="n">localtime</span><span class="o">.</span><span class="n">tm_min</span><span class="p">,</span> + <span class="n">seconds</span> <span class="o">=</span> <span class="n">localtime</span><span class="o">.</span><span class="n">tm_sec</span><span class="p">,</span> + <span class="n">eta</span> <span class="o">=</span> <span class="n">eta</span><span class="p">,</span> + <span class="n">units</span> <span class="o">=</span> <span class="n">units</span><span class="p">,</span> + <span class="n">tpr</span> <span class="o">=</span> <span class="n">tpr</span><span class="p">,</span> + <span class="n">etf</span> <span class="o">=</span> <span class="n">etf</span><span class="p">,</span> + <span class="n">mem_use</span> <span class="o">=</span> <span class="n">mem_use</span> + <span class="p">),</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s2">"verbosity"</span><span class="p">],</span> + <span class="mi">1</span> + <span class="p">)</span></div> + + <span class="k">def</span> <span class="nf">_mem_use</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="sd">"""</span> +<span class="sd"> Return current process memory use in MB. (Takes no arguments) Note: this is per-thread only.</span> +<span class="sd"> """</span> + <span class="k">return</span> <span class="n">resource</span><span class="o">.</span><span class="n">getrusage</span><span class="p">(</span><span class="n">resource</span><span class="o">.</span><span class="n">RUSAGE_SELF</span><span class="p">)</span><span class="o">.</span><span class="n">ru_maxrss</span> <span class="o">/</span> <span class="mf">1024.0</span></div> </pre></div> </div> @@ -4225,9 +4442,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/_modules/binarycpython/utils/grid_options_defaults.html b/docs/build/html/_modules/binarycpython/utils/grid_options_defaults.html index e0fdf688e80d830f14294c861ce8584003245c68..4811d9522e827e34ef48e8aa6fe207d35b5f25e7 100644 --- a/docs/build/html/_modules/binarycpython/utils/grid_options_defaults.html +++ b/docs/build/html/_modules/binarycpython/utils/grid_options_defaults.html @@ -157,16 +157,16 @@ <h1>Source code for binarycpython.utils.grid_options_defaults</h1><div class="highlight"><pre> <span></span><span class="sd">"""</span> -<span class="sd">Module that contains the default options for the population grid code along with the description for these options, in the form of dictionaries: </span> +<span class="sd">Module that contains the default options for the population grid code along with the description for these options, in the form of dictionaries:</span> <span class="sd"> - grid_options_defaults_dict: dictionary containing the default values for all the options</span> <span class="sd"> - grid_options_descriptions: dictionary containing the description for these options.</span> <span class="sd">There are several other functions in this module, mostly to generate help texts or documents:</span> -<span class="sd"> - grid_options_help: interactive function for the user to get descriptions for options </span> +<span class="sd"> - grid_options_help: interactive function for the user to get descriptions for options</span> <span class="sd"> - grid_options_description_checker: function that checks that checks which options have a description.</span> <span class="sd"> - write_grid_options_to_rst_file: function to generate the .rst document for the docs</span> -<span class="sd">With this its also possible to automatically generate a document containing all the setting names + descriptions. </span> +<span class="sd">With this its also possible to automatically generate a document containing all the setting names + descriptions.</span> <span class="sd">All the options starting with _ should not be changed by the user except when you really know what you're doing (which is probably hacking the code :P)</span> <span class="sd">"""</span> @@ -208,6 +208,7 @@ <span class="s2">"log_file"</span><span class="p">:</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span> <span class="n">temp_dir</span><span class="p">(),</span> <span class="s2">"binary_c_python.log"</span> <span class="p">),</span> <span class="c1"># Set to None to not log to file. The directory will be created</span> + <span class="s2">"log_dt"</span> <span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="c1"># time between vb=1 logging outputs</span> <span class="c1">##########################</span> <span class="c1"># binary_c files</span> <span class="c1">##########################</span> @@ -633,7 +634,7 @@ <span class="s2">"_main_pid"</span><span class="p">:</span> <span class="s2">"Main process ID of the master process. Used and set by the population object."</span><span class="p">,</span> <span class="s2">"_store_memaddr"</span><span class="p">:</span> <span class="s2">"Memory address of the store object for binary_c."</span><span class="p">,</span> <span class="s2">"failed_systems_threshold"</span><span class="p">:</span> <span class="s2">"Variable storing the maximum amount of systems that are allowed to fail before logging their command line arguments to failed_systems log files"</span><span class="p">,</span> - <span class="s2">"parse_function"</span><span class="p">:</span> <span class="s2">"Function that the user can provide to handle the output the binary_c. This function has to take the arguments (self, output). Its best not to return anything in this function, and just store stuff in the grid_options['results'] dictionary, or just output results to a file"</span><span class="p">,</span> + <span class="s2">"parse_function"</span><span class="p">:</span> <span class="s2">"Function that the user can provide to handle the output the binary_c. This function has to take the arguments (self, output). Its best not to return anything in this function, and just store stuff in the self.grid_results dictionary, or just output results to a file"</span><span class="p">,</span> <span class="s2">"condor"</span><span class="p">:</span> <span class="s2">"Int flag whether to use a condor type population evolution. Not implemented yet."</span><span class="p">,</span> <span class="c1"># TODO: describe this in more detail</span> <span class="s2">"slurm"</span><span class="p">:</span> <span class="s2">"Int flag whether to use a Slurm type population evolution."</span><span class="p">,</span> <span class="c1"># TODO: describe this in more detail</span> <span class="s2">"weight"</span><span class="p">:</span> <span class="s2">"Weight factor for each system. The calculated probability is multiplied by this. If the user wants each system to be repeated several times, then this variable should not be changed, rather change the _repeat variable instead, as that handles the reduction in probability per system. This is useful for systems that have a process with some random element in it."</span><span class="p">,</span> <span class="c1"># TODO: add more info here, regarding the evolution splitting.</span> @@ -692,7 +693,7 @@ <span class="s2">"ecc"</span><span class="p">:</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.99</span><span class="p">],</span> <span class="p">},</span> <span class="c1"># minimum stellar mass</span> - <span class="s2">"Mmin"</span><span class="p">:</span> <span class="nb">float</span><span class="p">(</span><span class="n">return_binary_c_version_info</span><span class="p">(</span><span class="n">parsed</span><span class="o">=</span><span class="kc">True</span><span class="p">)[</span><span class="s1">'macros'</span><span class="p">][</span><span class="s1">'BINARY_C_MINIMUM_STELLAR_MASS'</span><span class="p">]),</span> <span class="c1"># We take the value that binary_c has set as the default </span> + <span class="s2">"Mmin"</span><span class="p">:</span> <span class="nb">float</span><span class="p">(</span><span class="n">return_binary_c_version_info</span><span class="p">(</span><span class="n">parsed</span><span class="o">=</span><span class="kc">True</span><span class="p">)[</span><span class="s1">'macros'</span><span class="p">][</span><span class="s1">'BINARY_C_MINIMUM_STELLAR_MASS'</span><span class="p">]),</span> <span class="c1"># We take the value that binary_c has set as the default</span> <span class="c1"># multiplicity model (as a function of log10M1)</span> <span class="c1">#</span> @@ -1007,9 +1008,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/_modules/binarycpython/utils/plot_functions.html b/docs/build/html/_modules/binarycpython/utils/plot_functions.html index 64e1f27cc49100aeb8899ec46a0683297a049887..6269a61c3866c17d92e3b8d99b28a78bba40eeeb 100644 --- a/docs/build/html/_modules/binarycpython/utils/plot_functions.html +++ b/docs/build/html/_modules/binarycpython/utils/plot_functions.html @@ -829,9 +829,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/_modules/binarycpython/utils/run_system_wrapper.html b/docs/build/html/_modules/binarycpython/utils/run_system_wrapper.html index 70d649d6a6419e761f7ef63b8254d2dd9cb7f4ff..7f1a50500b5378665f2ea530a591db6559ddbff9 100644 --- a/docs/build/html/_modules/binarycpython/utils/run_system_wrapper.html +++ b/docs/build/html/_modules/binarycpython/utils/run_system_wrapper.html @@ -298,9 +298,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/_modules/binarycpython/utils/spacing_functions.html b/docs/build/html/_modules/binarycpython/utils/spacing_functions.html index 6fa1aeaec36172e82be9aed794f34c5662439dbf..c890ee05308cabaf238d93f9a5eea7782fc5ab19 100644 --- a/docs/build/html/_modules/binarycpython/utils/spacing_functions.html +++ b/docs/build/html/_modules/binarycpython/utils/spacing_functions.html @@ -209,9 +209,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/_modules/binarycpython/utils/useful_funcs.html b/docs/build/html/_modules/binarycpython/utils/useful_funcs.html index 8a34e232604ac478da7309fb5479c4ed50d77459..0a193b389eb964a494fc9f6031c7bff3c37466ff 100644 --- a/docs/build/html/_modules/binarycpython/utils/useful_funcs.html +++ b/docs/build/html/_modules/binarycpython/utils/useful_funcs.html @@ -566,9 +566,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/_modules/index.html b/docs/build/html/_modules/index.html index 5306f95eff8b15b92a9493147f00b5237bbb31cb..fc09ef11fea786435a4a03b7d1eaaa9d9a10ccde 100644 --- a/docs/build/html/_modules/index.html +++ b/docs/build/html/_modules/index.html @@ -189,9 +189,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/_sources/binary_c_parameters.rst.txt b/docs/build/html/_sources/binary_c_parameters.rst.txt index 9d05193ac3eee376842356a9aea21ccba0d96899..cdce51580c9e3478b29c356fadc3e11bb84ac62b 100644 --- a/docs/build/html/_sources/binary_c_parameters.rst.txt +++ b/docs/build/html/_sources/binary_c_parameters.rst.txt @@ -4,7 +4,7 @@ The following chapter contains all the parameters that the current version of bi This information was obtained by the following binary_c build: - **binary_c git branch**: branch_david **binary_c git revision**: 6162:20210825:093caf0e9 **Built on**: Aug 25 2021 18:02:39 + **binary_c git branch**: newmaster **binary_c git revision**: 6185:20210910:1621c23a5 **Built on**: Sep 10 2021 15:05:46 Section: stars @@ -424,6 +424,11 @@ Section: stars | **Parameter input type**: Float(scanf) | **Default value**: NULL +| **Parameter**: artificial_mass_accretion_rate_by_stellar_type%d +| **Description**: Constant mass accretion rate for stellar type <n>. +| **Parameter input type**: Float(scanf) +| **Default value**: NULL + | **Parameter**: artificial_angular_momentum_accretion_rate%d | **Description**: Constant angular momentum accretion for star <n>. | **Parameter input type**: Float(scanf) @@ -468,13 +473,6 @@ Section: stars | **Default value**: 0 | **Macros**: ['BH_HURLEY2002 = 0', 'BH_BELCZYNSKI = 1', 'BH_SPERA2015 = 2', 'BH_FRYER12_DELAYED = 3', 'BH_FRYER12_RAPID = 4', 'BH_FRYER12_STARTRACK = 5'] -| **Parameter**: PPISN_prescription -| **Description**: (Pulsational) Pair-Instability Supernova prescription: Relates initial helium core mass of star to whether the star undergoes PPISN or PISN. Requires PPISN flag to be True (see binary_c_parameters.h). 0=no ppisn, 1=Farmer et al 2019. -| **Parameter input type**: Integer -| **Default value**: 1 -| **Macros**: ['PPISN_NONE = 0', 'PPISN_FARMER19 = 1'] -| **Extra**: Ignore - | **Parameter**: sn_kick_distribution_II | **Description**: Set the distribution of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). | **Parameter input type**: Integer @@ -502,7 +500,7 @@ Section: stars | **Parameter**: sn_kick_distribution_GRB_COLLAPSAR | **Description**: Set the distribution of speeds applied to kick newly-born neutron stars and black holes after a type Ib/c core-collapse supernova which is also a collapsar. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). | **Parameter input type**: Integer -| **Default value**: 0 +| **Default value**: 1 | **Macros**: ['KICK_VELOCITY_FIXED = 0', 'KICK_VELOCITY_MAXWELLIAN = 1', 'KICK_VELOCITY_CUSTOM = 2'] | **Parameter**: sn_kick_distribution_TZ @@ -541,24 +539,6 @@ Section: stars | **Default value**: 0 | **Macros**: ['KICK_VELOCITY_FIXED = 0', 'KICK_VELOCITY_MAXWELLIAN = 1', 'KICK_VELOCITY_CUSTOM = 2'] -| **Parameter**: sn_kick_distribution_PPISN -| **Description**: Set the distribution of speeds applied to PPISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). -| **Parameter input type**: Integer -| **Default value**: 1 -| **Macros**: ['KICK_VELOCITY_FIXED = 0', 'KICK_VELOCITY_MAXWELLIAN = 1', 'KICK_VELOCITY_CUSTOM = 2'] - -| **Parameter**: sn_kick_distribution_PISN -| **Description**: Set the distribution of speeds applied to PISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). -| **Parameter input type**: Integer -| **Default value**: 0 -| **Macros**: ['KICK_VELOCITY_FIXED = 0', 'KICK_VELOCITY_MAXWELLIAN = 1', 'KICK_VELOCITY_CUSTOM = 2'] - -| **Parameter**: sn_kick_distribution_PHDIS -| **Description**: Set the distribution of speeds applied to PHDIS supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). -| **Parameter input type**: Integer -| **Default value**: 0 -| **Macros**: ['KICK_VELOCITY_FIXED = 0', 'KICK_VELOCITY_MAXWELLIAN = 1', 'KICK_VELOCITY_CUSTOM = 2'] - | **Parameter**: sn_kick_dispersion_II | **Description**: Set the dispersion of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). | **Parameter input type**: Float @@ -582,7 +562,7 @@ Section: stars | **Parameter**: sn_kick_dispersion_GRB_COLLAPSAR | **Description**: Set the dispersion of speeds applied to kick newly-born neutron stars and black holes after a type Ib/c core-collapse supernova which is also a collapsar. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). | **Parameter input type**: Float -| **Default value**: 0 +| **Default value**: 190 | **Parameter**: sn_kick_dispersion_TZ | **Description**: Set the dispersion of speeds applied to kick newly-born neutron stars and black holes at the death of a Thorne-Zytkow object. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). @@ -614,21 +594,6 @@ Section: stars | **Parameter input type**: Float | **Default value**: 0 -| **Parameter**: sn_kick_dispersion_PPISN -| **Description**: Set the dispersion of speeds applied to the survivor of a PPISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). -| **Parameter input type**: Float -| **Default value**: 190 - -| **Parameter**: sn_kick_dispersion_PISN -| **Description**: Set the dispersion of speeds applied to the survivor of a PISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). -| **Parameter input type**: Float -| **Default value**: 0 - -| **Parameter**: sn_kick_dispersion_PHDIS -| **Description**: Set the dispersion of speeds applied to the survivor of a PHDIS supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). -| **Parameter input type**: Float -| **Default value**: 0 - | **Parameter**: sn_kick_companion_IA_He | **Description**: Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia He supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. | **Parameter input type**: Float @@ -749,24 +714,6 @@ Section: stars | **Default value**: 0 | **Macros**: ['SN_IMPULSE_NONE = 0', 'SN_IMPULSE_LIU2015 = 1', 'SN_IMPULSE_WHEELER1975 = 2'] -| **Parameter**: sn_kick_companion_PPISN -| **Description**: Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PPISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. -| **Parameter input type**: Float -| **Default value**: 0 -| **Macros**: ['SN_IMPULSE_NONE = 0', 'SN_IMPULSE_LIU2015 = 1', 'SN_IMPULSE_WHEELER1975 = 2'] - -| **Parameter**: sn_kick_companion_PISN -| **Description**: Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. -| **Parameter input type**: Float -| **Default value**: 0 -| **Macros**: ['SN_IMPULSE_NONE = 0', 'SN_IMPULSE_LIU2015 = 1', 'SN_IMPULSE_WHEELER1975 = 2'] - -| **Parameter**: sn_kick_companion_PHDIS -| **Description**: Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PHDIS supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. -| **Parameter input type**: Float -| **Default value**: 0 -| **Macros**: ['SN_IMPULSE_NONE = 0', 'SN_IMPULSE_LIU2015 = 1', 'SN_IMPULSE_WHEELER1975 = 2'] - | **Parameter**: wd_sigma | **Description**: Set the speed at which white dwarfs are kicked when they form, in km/s. Default is zero (i.e. no kick). Requires WD_KICKS. | **Parameter input type**: Float @@ -827,22 +774,22 @@ Section: stars | **Parameter**: delta_mcmin | **Description**: A parameter to reduce the minimum core mass for third dredge up to occur on the TPAGB. As used by Izzard and Tout (2004) to increase the amount of dredge up, hence carbon, in Magellanic cloud stars. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 0 | **Parameter**: lambda_min | **Description**: A parameter to increase the efficiency of third dredge up on the TPAGB. The efficiency is lambda * lambda_mult, and setting lambda_min>0 implies that, once Mc>Mcmin (see delta_mcmin) lambda=Max(lambda(fit to Karakas), lambda_min). As used by Izzard and Tout (2004) to increase the amount of dredge up, hence carbon, in Magellanic cloud stars. See also lambda_multiplier. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 0 | **Parameter**: lambda_multiplier | **Description**: A parameter to increase the efficiency of third dredge up on the TPAGB. The efficiency is lambda * lambda_mult, and setting lambda_min>0 implies that, once Mc>Mcmin (see delta_mcmin) lambda=Max(lambda(fit to Karakas), lambda_min). As used by Izzard and Tout (2004) to increase the amount of dredge up, hence carbon, in Magellanic cloud stars. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 1 | **Parameter**: minimum_envelope_mass_for_third_dredgeup | **Description**: The minimum envelope mass for third dredge up on the TPAGB. Early, solar metallicity models by Straniero et al suggested 0.5Msun is typical. However, circumstantial evidence (Izzard et al 2009) as well as newer models by Stancliffe and Karakas suggest that at low metallicity a value nearer zero is more appropriate. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 0.5 | **Parameter**: mass_of_pmz | **Description**: The mass in the partial mixing zone of a TPAGB star, using the Karakas 2012 tables. Ask Carlo Abate for more details, or see the series of papers Abate et al 2012, 2013, 2014. Requires NUCSYN and USE_TABULAR_INTERSHELL_ABUNDANCES_KARAKAS_2012. @@ -852,12 +799,12 @@ Section: stars | **Parameter**: c13_eff | **Description**: The "efficiency" of partial mixing in a TPAGB star intershell region, when using the s-process tables of Gallino, Busso, Lugaro et al. as provided by Maria Lugaro for the Izzard et al. 2009 paper. Requires NUCSYN and NUCSYN_S_PROCESS. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 1 | **Parameter**: mc13_pocket_multiplier | **Description**: Multiplies the mass in the partial mixing zone of a TPAGB star, when using the s-process tables of Gallino, Busso, Lugaro et al. as provided by Maria Lugaro for the Izzard et al. 2009 paper. Requires NUCSYN and NUCSYN_S_PROCESS. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 1 | **Parameter**: tides_convective_damping | **Description**: Tidal convective damping algorithm. 0=TIDES_HURLEY2002 Zahn 197x timescales + Hut, as in Hurley et al (2002), 1 = TIDES_ZAHN1989: Zahn 1989 lambdas + Hut. @@ -879,7 +826,7 @@ Section: stars | **Parameter**: hbbtfac | **Description**: A parameter to modulate the temperature at the base of the hot-bottom burning zone in TPAGB stars. (Works only if NUCSYN is defined) | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 1 | **Parameter**: wind_multiplier_%d | **Description**: Wind multiplier for the stellar type specified by the intger %d. By default these are all 1.0. @@ -951,7 +898,7 @@ Section: stars | **Parameter**: MINT_metallicity | **Description**: This sets the metallicity for MINT. It is ignored if set to -1.0, the default, in which case the normal metallicity parameter is used. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: -1 | **Parameter**: gaia_Teff_binwidth | **Description**: log10(Effective temperature) bin width used to make Gaia-like HRDs @@ -978,25 +925,25 @@ Section: stars | **Parameter**: AGB_core_algorithm | **Description**: Algorithm to use for calculating AGB core masses. 0=Hurley et al. 2002 if no NUCSYN, Karakas 2002 if NUCSYN is defined; 1=Hurley et al. 2002 (overshooting models); 1=Karakas 2002 (non-overshooting models). | **Parameter input type**: Integer -| **Default value**: 1 +| **Default value**: 2 | **Macros**: ['AGB_CORE_ALGORITHM_DEFAULT = 0', 'AGB_CORE_ALGORITHM_HURLEY = 1', 'AGB_CORE_ALGORITHM_KARAKAS = 2'] | **Parameter**: AGB_radius_algorithm | **Description**: Algorithm to use for calculating radii on the TPAGB. | **Parameter input type**: Integer -| **Default value**: 1 +| **Default value**: 2 | **Macros**: ['AGB_RADIUS_ALGORITHM_DEFAULT = 0', 'AGB_RADIUS_ALGORITHM_HURLEY = 1', 'AGB_RADIUS_ALGORITHM_KARAKAS = 2'] | **Parameter**: AGB_luminosity_algorithm | **Description**: Algorithm to use for calculating luminosities on the TPAGB. | **Parameter input type**: Integer -| **Default value**: 1 +| **Default value**: 2 | **Macros**: ['AGB_LUMINOSITY_ALGORITHM_DEFAULT = 0', 'AGB_LUMINOSITY_ALGORITHM_HURLEY = 1', 'AGB_LUMINOSITY_ALGORITHM_KARAKAS = 2'] | **Parameter**: AGB_3dup_algorithm | **Description**: Algorithm to use for calculating third dredge up efficiency on the TPAGB. | **Parameter input type**: Integer -| **Default value**: 1 +| **Default value**: 2 | **Macros**: ['AGB_THIRD_DREDGE_UP_ALGORITHM_DEFAULT = 0', 'AGB_THIRD_DREDGE_UP_ALGORITHM_HURLEY = 1', 'AGB_THIRD_DREDGE_UP_ALGORITHM_KARAKAS = 2', 'AGB_THIRD_DREDGE_UP_ALGORITHM_STANCLIFFE = 3'] | **Parameter**: overspin_algorithm @@ -1136,6 +1083,21 @@ Section: stars | **Parameter input type**: True|False | **Default value**: False +| **Parameter**: degenerate_core_merger_nucsyn +| **Description**: If TRUE, assume that in a degnerate core merger, energy is generated from nucleosynthesis of the whole core, and that this can disrupt the core. The BSE algorithm (Hurley et al. 2002) assumes this to be TRUE, but binary_c assumes FALSE by default. (FALSE) +| **Parameter input type**: True|False +| **Default value**: False + +| **Parameter**: degenerate_core_helium_merger_ignition +| **Description**: If TRUE, assume that when there is a degenerate helium core merger, the star reignites helium. This is required to make R-type carbon stars. (TRUE) +| **Parameter input type**: True|False +| **Default value**: True + +| **Parameter**: degenerate_core_merger_dredgeup_fraction +| **Description**: If non-zero, mix this fraction of the degenerate core during a merger.(0.0). +| **Parameter input type**: Float +| **Default value**: 0 + Section: binary --------------- @@ -1308,7 +1270,7 @@ Section: binary | **Parameter**: post_ce_objects_have_envelopes | **Description**: If TRUE then post-common-envelope objects have thin envelopes. You need this if you are to have post-CE post-AGB stars. Note that this *may* be unstable, i.e. you may end up having many CEEs. The mass in the envelope is controlled by post_ce_adaptive_menv. TRUE by default. | **Parameter input type**: True|False -| **Default value**: True +| **Default value**: False | **Parameter**: PN_comenv_transition_time | **Description**: post-common envelope transition time in years (1e2). This is the time taken to move from CEE ejection to Teff > 30e4 K. Hall et al. (2013) suggest ~100 years. @@ -1478,18 +1440,20 @@ Section: binary | **Parameter**: type_Ia_MCh_supernova_algorithm | **Description**: Algorithm to be used when calculating type Ia yields from Chandrasekhar-mass exploders. 0 = DD7 (Iwamoto 1999), 1 = Seitenzahl 2013 3D hydro yields (you must also set Seitenzahl2013_model) | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: 0 +| **Macros**: ['TYPE_IA_MCH_SUPERNOVA_ALGORITHM_DD2 = 0', 'TYPE_IA_MCH_SUPERNOVA_ALGORITHM_SEITENZAHL2013 = 1', 'TYPE_IA_MCH_SUPERNOVA_ALGORITHM_SEITENZAHL2013_AUTOMATIC = 2'] | **Parameter**: Seitenzahl2013_model | **Description**: Which of Seitenzahl et al. 2013's models to use? One of N1,N3,N5,N10,N20,N40,N100L,N100,N100H,N150,N200,N300C,N1600,N1600C,N100_Z0.5,N100_Z0.1,N100_Z0.01 (defaults to N100). | **Parameter input type**: String -| **Default value**: NULL +| **Default value**: N100 | **Extra**: N1 | **Parameter**: type_Ia_sub_MCh_supernova_algorithm | **Description**: Algorithm to be used when calculating type Ia yields from sub-Chandrasekhar-mass exploders. (Currently unused.) | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: 0 +| **Macros**: ['TYPE_IA_SUB_MCH_SUPERNOVA_ALGORITHM_LIVNE_ARNETT_1995 = 0'] | **Parameter**: max_HeWD_mass | **Description**: The maximum mass a HeWD can have before it ignites helium (0.7). @@ -2130,7 +2094,7 @@ Section: nucsyn | **Parameter**: NeNaMgAl | **Description**: Enables NeNaMgAl reaction network. Requires NUCSYN and NUCSYN_HBB. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: True | **Extra**: Ignore | **Parameter**: nucsyn_network%d @@ -2151,19 +2115,21 @@ Section: nucsyn | **Parameter**: nucsyn_metallicity | **Description**: This sets the metallicity of the nucleosynthesis algorithms, i.e. the amount (by mass) of matter which is not hydrogen or helium. Usually you'd just set this with the metallicity parameter, but if you want the nucleosynthesis to be outside the range of the stellar evolution algorithm (e.g. Z=0 or Z=0.04) then you need to use nucsyn_metallicity. That said, it's also outside the range of some of the nucleosynthesis algorithms as well, so you have been warned! | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: -1 | **Macros**: ['DEFAULT_TO_METALLICITY = -1'] | **Parameter**: nucsyn_solver | **Description**: Choose the solver used in nuclear burning. 0 = KAPS_RENTROP is a Kaps-Rentrop scheme (fast, not great for stiff problems), 1 = LSODA (Adams/BSF switcher), 2 = CVODE library (https://computing.llnl.gov/projects/sundials. Default 0. | **Parameter input type**: Unsigned integer -| **Default value**: NULL +| **Default value**: 0 +| **Macros**: ['NUCSYN_SOLVER_KAPS_RENTROP = 0', 'NUCSYN_SOLVER_LSODA = 1', 'NUCSYN_SOLVER_CVODE = 2', 'NUCSYN_SOLVER_NUMBER = 3', 'NUCSYN_SOLVER_KAPS_RENTROP = 0', 'NUCSYN_SOLVER_LSODA = 1', 'NUCSYN_SOLVER_CVODE = 2', 'NUCSYN_SOLVER_NUMBER = 3'] | **Extra**: 0 | **Parameter**: initial_abundance_mix | **Description**: initial abundance mixture: 0=AG89, 1=Karakas 2002, 2=Lodders 2003, 3=Asplund 2005 (not available?), 4=Garcia Berro, 5=Grevesse Noels 1993 | **Parameter input type**: Unsigned integer -| **Default value**: NULL +| **Default value**: 0 +| **Macros**: ['NUCSYN_INIT_ABUND_MIX_AG89 = 0', 'NUCSYN_INIT_ABUND_MIX_KARAKAS2002 = 1', 'NUCSYN_INIT_ABUND_MIX_LODDERS2003 = 2', 'NUCSYN_INIT_ABUND_MIX_ASPLUND2005 = 3', 'NUCSYN_INIT_ABUND_MIX_GARCIABERRO = 4', 'NUCSYN_INIT_ABUND_MIX_GREVESSE_NOELS_1993 = 5', 'NUCSYN_INIT_ABUND_MIX_ASPLUND2009 = 6', 'NUCSYN_INIT_ABUND_MIX_KOBAYASHI2011_ASPLUND2009 = 7', 'NUCSYN_INIT_ABUND_MIX_LODDERS2010 = 8'] | **Extra**: 0 | **Parameter**: init_abund @@ -2187,37 +2153,38 @@ Section: nucsyn | **Parameter**: init_abunds_only | **Description**: If True, outputs only the initial abundances, then exits. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Parameter**: initial_abunds_only | **Description**: If True, outputs only the initial abundances, then exits. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Parameter**: no_thermohaline_mixing | **Description**: If True, disables thermohaline mixing. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Parameter**: lithium_GB_post_Heflash | **Description**: Sets the lithium abundances after the helium flash. Requires NUCSYN and LITHIUM_TABLES. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 0 | **Parameter**: lithium_GB_post_1DUP | **Description**: Sets the lithium abundance after first dredge up. Requires NUCSYN and LITHIUM_TABLES. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 0 | **Parameter**: lithium_hbb_multiplier | **Description**: Multiplies the lithium abundances on the AGB during HBB (based on Karakas/Fishlock et al models).Requires NUCSYN and LITHIUM_TABLES. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 1 | **Parameter**: angelou_lithium_decay_function | **Description**: Functional form which describes Li7 decay. Requires NUCSYN and NUCSYN_ANGELOU_LITHIUM. Choices are: 0 expoential (see angelou_lithium_decay_time). | **Parameter input type**: Integer | **Default value**: NULL +| **Macros**: ['ANGELOU_LITHIUM_DECAY_FUNCTION_EXPONENTIAL = 0'] | **Parameter**: angelou_lithium_LMMS_time | **Description**: Time at which lithium manufacture is triggered in a low-mass (convective) main sequence (Myr). Requires NUCSYN and NUCSYN_ANGELOU_LITHIUM. Ignored if 0 (for the start, use 1e-6). @@ -2337,16 +2304,10 @@ Section: nucsyn Section: output --------------- -| **Parameter**: david_logging_function -| **Description**: Function to choose which kind of information gets logged Requires DAVID. Choices are: 0= None, >0 for custom logging functions -| **Parameter input type**: Integer -| **Default value**: 0 -| **Extra**: Ignore - | **Parameter**: cf_amanda_log | **Description**: Enable logging to compare to Amanda's models. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Parameter**: float_overflow_checks | **Description**: Turn on to enable floating-point overflow checks at the end of each timestep, if they are available. 0=off, 1=warn (stderr) on failure, 2=exit on failure (0) @@ -2386,7 +2347,7 @@ Section: output | **Parameter**: legacy_yields | **Description**: Turn on ensemble legacy yield output. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Parameter**: ensemble_defer | **Description**: Defer ensemble output. @@ -2426,27 +2387,27 @@ Section: output | **Parameter**: EMP_logg_maximum | **Description**: Maximum logg that EMP stars are allowed to have. See Izzard et al 2009. See also CEMP_cfe_minimum, NEMP_nfe_minimum, EMP_minimum_age. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 4 | **Parameter**: EMP_minimum_age | **Description**: Minimum age that EMP stars are required to have. See Izzard et al 2009. See also CEMP_cfe_minimum, NEMP_nfe_minimum, EMP_logg_maximum. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 10 | **Parameter**: EMP_feh_maximum | **Description**: Maximum [Fe/H] that an EMP stars may have. See Izzard et al 2009. See also CEMP_cfe_minimum, NEMP_nfe_minimum, EMP_logg_maximum, EMP_minimum_age. Default -2.0. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: -2 | **Parameter**: CEMP_cfe_minimum | **Description**: Minimum [C/Fe] that CEMP stars are required to have. See Izzard et al 2009. See also NEMP_cfe_minimum, EMP_logg_maximum, EMP_minimum_age. Default 0.7. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 0.7 | **Parameter**: NEMP_cfe_minimum | **Description**: Minimum [N/Fe] that NEMP stars are required to have. See Izzard et al 2009, Pols et al. 2012. See also CEMP_cfe_minimum, EMP_logg_maximum, EMP_minimum_age. Default 1.0. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 1 | **Parameter**: thick_disc_start_age | **Description**: Lookback time for the start of the thick disc star formation, e.g. 13e3 Myr. Units = Myr. @@ -2582,99 +2543,99 @@ Section: input | **Parameter**: MINT_dir | **Description**: Location of MINT algorithm data. | **Parameter input type**: String -| **Default value**: NULL +| **Default value**: | **Extra**: | **Parameter**: MINT_data_cleanup | **Description**: Activate checks on incoming data to try to account for problems. Will make data-loading slower, but may fix a few things. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Extra**: | **Parameter**: MINT_MS_rejuvenation | **Description**: Turn on or off (hydrogen) main-sequence rejuvenation. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: True | **Extra**: | **Parameter**: MINT_remesh | **Description**: Turn on or off MINT's remeshing. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: True | **Extra**: | **Parameter**: MINT_use_ZAMS_profiles | **Description**: Use chemical profiles at the ZAMS if MINT_use_ZAMS_profiles is TRUE, otherwise set homogeneous abundances. (Default is TRUE, so we use the profiles if they are available.) | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: True | **Extra**: | **Parameter**: MINT_fallback_to_test_data | **Description**: If TRUE, use the MINT test_data directory as a fallback when data is unavailable. (FALSE) | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Extra**: | **Parameter**: MINT_disable_grid_load_warnings | **Description**: Use this to explicitly disable MINT's warnings when loading a grid with, e.g., missing or too much data. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Extra**: | **Parameter**: MINT_Kippenhahn | **Description**: Turn on or off MINT's Kippenhahn diagrams. If 0, off, if 1, output star 1 (index 0), if 2 output star 2 (index 1). Default 0. | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: 0 | **Extra**: | **Parameter**: MINT_nshells | **Description**: Set the initial number of shells MINT uses in each star when doing nuclear burning. Note: remeshing can change this. If MINT_nshells is 0, shellular burning and other routines that require shells will not be available. (200) | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: 200 | **Extra**: | **Parameter**: MINT_maximum_nshells | **Description**: Set the maximum number of shells MINT uses in each star when doing nuclear burning. Note that this will be limited to MINT_HARD_MAX_NSHELLS. (1000) | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: 1000 | **Extra**: | **Parameter**: MINT_minimum_nshells | **Description**: Set the minimum number of shells MINT uses in each star when doing nuclear burning. Note that this will be greater than or equal to MINT_HARD_MIN_NSHELLS, which is 0 by default. (0) | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: 10 | **Extra**: | **Parameter**: MINT_Kippenhahn_stellar_type | **Description**: Stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for which Kippenhahn plot data should be output. | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: -1 | **Macros**: ['LOW_MASS_MS = 0', 'MS = 1', 'HG = 2', 'GIANT_BRANCH = 3', 'CHeB = 4', 'EAGB = 5', 'TPAGB = 6', 'HeMS = 7', 'HeHG = 8', 'HeGB = 9', 'HeWD = 10', 'COWD = 11', 'ONeWD = 12', 'NS = 13', 'BH = 14', 'MASSLESS_REMNANT = 15'] | **Extra**: | **Parameter**: MINT_Kippenhahn_companion_stellar_type | **Description**: Companion stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for the companion for which Kippenhahn plot data should be output. | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: -1 | **Macros**: ['LOW_MASS_MS = 0', 'MS = 1', 'HG = 2', 'GIANT_BRANCH = 3', 'CHeB = 4', 'EAGB = 5', 'TPAGB = 6', 'HeMS = 7', 'HeHG = 8', 'HeGB = 9', 'HeWD = 10', 'COWD = 11', 'ONeWD = 12', 'NS = 13', 'BH = 14', 'MASSLESS_REMNANT = 15'] | **Extra**: | **Parameter**: MINT_nuclear_burning | **Description**: Turn on or off MINT's nuclear burning algorithm. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Extra**: | **Parameter**: MINT_minimum_shell_mass | **Description**: Minimum shell mass in MINT's nuclear burning routines. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 1e-06 | **Extra**: | **Parameter**: MINT_maximum_shell_mass | **Description**: Maximum shell mass in MINT's nuclear burning routines. : | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 0.1 | **Extra**: Section: i/o diff --git a/docs/build/html/_sources/example_notebooks.rst.txt b/docs/build/html/_sources/example_notebooks.rst.txt index 7e2eef403ef98e8f4cf2785691ed1aadca497439..d15ea559afa7bd4bad185683c804cc9c39d8d914 100644 --- a/docs/build/html/_sources/example_notebooks.rst.txt +++ b/docs/build/html/_sources/example_notebooks.rst.txt @@ -2,7 +2,7 @@ Example notebooks ================= We have a set of notebooks that explain and show the usage of the binarycpython features. The notebooks are also stored in the examples/ directory in the `repository <https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master/examples>`_ -The order of the notebooks below is more or less the recommended order to read. +The order of the notebooks below is more or less the recommended order to read. The last couple of notebooks are example usecases .. toctree:: :maxdepth: 2 @@ -12,4 +12,6 @@ The order of the notebooks below is more or less the recommended order to read. notebook_custom_logging.ipynb notebook_population.ipynb notebook_extra_features.ipynb - notebook_api_functionality.ipynb \ No newline at end of file + notebook_api_functionality.ipynb + notebook_luminosity_function_single.ipynb + notebook_luminosity_function_binaries.ipynb \ No newline at end of file diff --git a/docs/build/html/_sources/grid_options_descriptions.rst.txt b/docs/build/html/_sources/grid_options_descriptions.rst.txt index 319b8d56a6d616f55498ec2c10fbc358a8de8183..84538e2c4a51e19e6c1e6299dcea91c1c5e2d5f2 100644 --- a/docs/build/html/_sources/grid_options_descriptions.rst.txt +++ b/docs/build/html/_sources/grid_options_descriptions.rst.txt @@ -1,7 +1,7 @@ Population grid code options ============================ The following chapter contains all grid code options, along with their descriptions -There are 1 options that are not described yet. +There are 2 options that are not described yet. Public options @@ -35,6 +35,8 @@ The following options are meant to be changed by the user. | **log_args_dir**: Directory to log the arguments to. Unused +| **log_dt**: No description available yet + | **log_file**: Log file for the population object. Unused | **log_runtime_systems**: Whether to log the runtime of the systems . Each systems run by the thread is logged to a file and is stored in the tmp_dir. (1 file per thread). Don't use this if you are planning to run a lot of systems. This is mostly for debugging and finding systems that take long to run. Integer, default = 0. if value is 1 then the systems are logged @@ -47,7 +49,7 @@ The following options are meant to be changed by the user. | **multiplicity_fraction_function**: Which multiplicity fraction function to use. 0: None, 1: Arenou 2010, 2: Rhagavan 2010, 3: M&S 2017 -| **parse_function**: Function that the user can provide to handle the output the binary_c. This function has to take the arguments (self, output). Its best not to return anything in this function, and just store stuff in the grid_options['results'] dictionary, or just output results to a file +| **parse_function**: Function that the user can provide to handle the output the binary_c. This function has to take the arguments (self, output). Its best not to return anything in this function, and just store stuff in the self.grid_results dictionary, or just output results to a file | **repeat**: Factor of how many times a system should be repeated. Consider the evolution splitting binary_c argument for supernovae kick repeating. diff --git a/docs/build/html/_sources/notebook_api_functionality.ipynb.txt b/docs/build/html/_sources/notebook_api_functionality.ipynb.txt index d81c31711bfc5d6de3159fd8958df96dd145ded0..8d454880c82dba172d33a95532c47bc95f24ff6a 100644 --- a/docs/build/html/_sources/notebook_api_functionality.ipynb.txt +++ b/docs/build/html/_sources/notebook_api_functionality.ipynb.txt @@ -15,7 +15,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "ded7eaf6-e1ba-46c2-9f6f-9ebcb14a264d", "metadata": {}, "outputs": [ @@ -30,37 +30,69 @@ "\n", "FUNCTIONS\n", " free_persistent_data_memaddr_and_return_json_output(...)\n", - " Frees the persistent_data memory and returns the json output\n", + " Frees the persistent_data memory and returns the json output.\n", + " \n", + " Arguments:\n", + " store capsule: capsule containing the memory adress of the persistent data object (contains the ensemble)\n", " \n", " free_store_memaddr(...)\n", - " Frees the store memaddr\n", + " Frees the store memaddr.\n", + " \n", + " Arguments:\n", + " store capsule: capsule containing the memory adress of the store object\n", " \n", " return_arglines(...)\n", " Return the default args for a binary_c system\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_help(...)\n", " Return the help info for a given parameter\n", + " \n", + " Arguments:\n", + " parameter: parameter name.\n", " \n", " return_help_all(...)\n", " Return an overview of all the parameters, their description, categorized in sections\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_maximum_mass_ratio_for_RLOF(...)\n", - " Returns a string containing the maximum mass ratio for which a binary system does not RLOF at zams. Optionally accepts a store_capsule. Please use the wrapper functions in utils for this except when you know what you're doing\n", + " Returns a string containing the maximum mass ratio for which a binary system does not RLOF at ZAMS. Please use the wrapper functions in utils for this except when you know what you're doing.\n", + " \n", + " Arguments:\n", + " argstring: argument string for binary_c\n", + " (opt) store_capsule: capsule containing memory adress for the store object.unction. Default = Null\n", " \n", " return_minimum_orbit_for_RLOF(...)\n", - " Returns a string containing the minimum orbit and separation for which a binary system does not RLOF at zams. Please use the wrapper functions in utils for this except when you know what you're doing\n", + " Returns a string containing the minimum orbit and separation for which a binary system does not RLOF at ZAMS. Please use the wrapper functions in utils for this except when you know what you're doing.\n", + " \n", + " Arguments:\n", + " argstring: argument string for binary_c\n", + " (opt) store_capsule: capsule containing memory adress for the store object.unction. Default = Null\n", " \n", " return_persistent_data_memaddr(...)\n", " Return the store memory adress that will be passed to run_population\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_store_memaddr(...)\n", " Return the store memory adress that will be passed to run_population\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_version_info(...)\n", " Return the version information of the used binary_c build\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " run_system(...)\n", - " Function to run a system. This is a general function that will be able to handle different kinds of situations: single system run with different settings, population run with different settings, etc. To avoid having too many functions doing slightly different things. \n", + " Function to run a system. This is a general function that will be able to handle different kinds of situations: single system run with different settings, population run with different settings, etc. To avoid having too many functions doing slightly different things.\n", " \n", " Arguments:\n", " argstring: argument string for binary_c\n", @@ -126,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 2, "id": "10a74d5a-a3d5-4543-a5bc-20d1fe885bb4", "metadata": {}, "outputs": [ @@ -134,8 +166,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "<capsule object \"STORE\" at 0x7f163859d0c0>\n", - "SINGLE_STAR_LIFETIME 10 27.7358\n", + "<capsule object \"STORE\" at 0x7fa6a45ed180>\n", + "SINGLE_STAR_LIFETIME 10 28.4838\n", "\n" ] } @@ -183,7 +215,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 3, "id": "318874f6-7acf-49bb-9786-299d4dffc0b3", "metadata": {}, "outputs": [ @@ -217,7 +249,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 4, "id": "d7e757ae-579c-42a2-a310-f0401b7800e8", "metadata": { "scrolled": true, @@ -291,6 +323,9 @@ "opacity_algorithm : Set the opacity algorithm. 0 = Paczynski, 1 = Ferguson/Opal. : (null)\n", "wind_mass_loss : Defines the algorithm used for stellar winds. 0 = none, 1 = Hurley et al. (2002), 2 = Schneider (2018). : 0\n", "gbwind : Wind prescription for first red giant branch stars. 0=Reimers (Hurley et al 2000/2002; choose gb_reimers_eta=0.5 for their mass loss rate), 1=Schroeder+Cuntz 2005 (set gb_reimers_eta=1.0 for their mass loss rate). : (null)\n", + "postagbwind : Apply special post-(A)GB prescription. Default is POSTAGB_WIND_USE_GIANT which means we just use whatever is prescribed on the giant branch. Other options include: POSTAGB_WIND_NONE = 1 (no wind on the post (A)GB), POSTAGB_WIND_KRTICKA2020 = 2 which uses Krticka, Kubát and Krticková (2020, A&A 635, A173). : (null)\n", + "Teff_postAGB_min : The minimum temperature for which we apply post-(A)GB winds. See also Teff_postAGB_max. (6000 K) : (null)\n", + "Teff_postAGB_max : The maximum temperature for which we apply post-(A)GB winds. See also Teff_postAGB_min. (120000 K) : (null)\n", "mattsson_Orich_tpagbwind : Experimental : turns on Mattsson's TPAGB wind when the star is oxygen rich. Requires MATTSSON_MASS_LOSS. : (null)\n", "magnetic_braking_factor : Multiplier for the magnetic braking angular momentum loss rate. : (null)\n", "magnetic_braking_gamma : gamma factor in Rappaport style magnetic braking expression. : (null)\n", @@ -310,7 +345,9 @@ "vw93_mira_shift : In the Vassiliadis and Wood (1993) AGB wind prescription, the wind loss rate depends on the Mira period plus this offset. Requires VW93_MIRA_SHIFT. : (null)\n", "vw93_multiplier : In the Vassiliadis and Wood (1993) AGB wind prescription, the wind loss rate is multiplied by this factor. Requires VW93_MULTIPLIER. : (null)\n", "tpagb_reimers_eta : TPAGB Reimers wind multiplication factor, cf. eta in Reimers' mass loss formula. (This multiplies the 4e-13 in Reimers' formula, or the 8e-14 in Schroeder and Cuntz.) Note that Reimers is not the default TPAGB wind prescription. See also tpagbwind. : (null)\n", + "Tout_Pringle_1992_multiplier : Multiplier for the Tout & Pringle (1992) magnetic wind. (0.0) : (null)\n", "artificial_mass_accretion_rate%d : Constant mass accretion rate for star <n>. : (null)\n", + "artificial_mass_accretion_rate_by_stellar_type%d : Constant mass accretion rate for stellar type <n>. : (null)\n", "artificial_angular_momentum_accretion_rate%d : Constant angular momentum accretion for star <n>. : (null)\n", "artificial_orbital_angular_momentum_accretion_rate : Constant angular momentum accretion rate on the orbit. : (null)\n", "artificial_accretion_start_time : Time at which artificial accretion stars. Ignored if <0 (default is -1). : (null)\n", @@ -318,8 +355,7 @@ "wr_wind : Massive-star (WR) wind prescription. 0 = Hurley et al 2000/2002, 1=Maeder and Meynet, 2=Nugis and Lamers, 3=John Eldridge's version of Vink's early-2000s wind (See Lynnette Dray's thesis, or John Eldridge's thesis) : (null)\n", "wr_wind_fac : Massive-star (WR) wind multiplication factor. : (null)\n", "wrwindfac : Massive-star (WR) wind multiplication factor. Synonymous with wr_wind_fac (which you should use instead). : (null)\n", - "BH_prescription : Black hole mass prescrition: relates the mass of a newly formed black hole to its progenitor's (CO) core mass. 0=Hurley et al 2000/2002, 1=Belczynski (early 2000s). : (null)\n", - "PPISN_prescription : (Pulsational) Pair-Instability Supernova prescription: Relates initial helium core mass of star to whether the star undergoes PPISN or PISN. Requires PPISN flag to be True (see binary_c_parameters.h). 0=no ppisn, 1=Farmer et al 2019. : Ignore\n", + "BH_prescription : Black hole mass prescrition: relates the mass of a newly formed black hole to its progenitor's (CO) core mass. BH_HURLEY2002 = 0 = Hurley et al 2000/2002, BH_BELCZYNSKI = 1 = Belczynski (early 2000s), BH_SPERA2015 = Spera+ 2015, BH_FRYER12_DELAYED = 3 = Fryer et al. (2012) delayed prescription, BH_FRYER12_RAPID = 4 = Fryer et al. (2012) rapid prescription, BH_FRYER12_STARTRACK = 5 = Fryer et al. (2012) startrack prescription. : (null)\n", "sn_kick_distribution_II : Set the distribution of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_ECAP : Set the distribution of speeds applied to the remnants of electron-capture supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_NS_NS : Set the distribution of speeds applied to kick neutron stars and black holes that survive a NS-NS merger. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", @@ -331,9 +367,6 @@ "sn_kick_distribution_BH_NS : Set the distribution of speeds applied to black holes formed by the merger of a neutron star and a black holes. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_IA_Hybrid_HeCOWD : Set the distribution of speeds applied to any survivor of a hybrid He-COWD SNIa explosion. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_IA_Hybrid_HeCOWD_subluminous : Set the distribution of speeds applied to any survivor of a subluminous hybrid He-COWD SNIa explosion. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_distribution_PPISN : Set the distribution of speeds applied to PPISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_distribution_PISN : Set the distribution of speeds applied to PISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_distribution_PHDIS : Set the distribution of speeds applied to PHDIS supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_II : Set the dispersion of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_ECAP : Set the dispersion of speeds applied to the remnants of electron-capture supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_NS_NS : Set the dispersion of speeds applied to kick neutron stars and black holes that survive a NS-NS merger. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", @@ -345,9 +378,6 @@ "sn_kick_dispersion_BH_NS : Set the dispersion of speeds applied to black holes formed by the merger of a neutron star and a black holes. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_IA_Hybrid_HeCOWD : Set the dispersion of speeds applied to the survivor of a SNIa explosion of a hybrid He-COWD. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_IA_Hybrid_HeCOWD_subluminous : Set the dispersion of speeds applied to the survivor of a subluminous SNIa explosion of a hybrid He-COWD. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_dispersion_PPISN : Set the dispersion of speeds applied to the survivor of a PPISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_dispersion_PISN : Set the dispersion of speeds applied to the survivor of a PISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_dispersion_PHDIS : Set the dispersion of speeds applied to the survivor of a PHDIS supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_companion_IA_He : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia He supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_ELD : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia ELD (sub-Mch) supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_CHAND : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia Mch supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", @@ -368,9 +398,6 @@ "sn_kick_companion_BH_NS : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a black hole merges with a neutron star. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_Hybrid_HeCOWD : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a hybrid He-COWD type Ia explosion. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_Hybrid_HeCOWD_subluminous : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a subluminous hybrid He-COWD type Ia explosion. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", - "sn_kick_companion_PPISN : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PPISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", - "sn_kick_companion_PISN : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", - "sn_kick_companion_PHDIS : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PHDIS supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "wd_sigma : Set the speed at which white dwarfs are kicked when they form, in km/s. Default is zero (i.e. no kick). Requires WD_KICKS. : (null)\n", "wd_kick_direction : Set the direction of white dwarf kicks. 0 = random, 1 = up, 2 = forward, 3 = backward, 4 = inward, 5 = outward. Requires WD_KICKS. : (null)\n", "wd_kick_when : Decide when to kick a white dwarf. 0=at birth, 1=at first RLOF, 2=at given pulse number (see wd_kick_pulse_number), 3 at every pulse Requires WD_KICKS. : (null)\n", @@ -443,6 +470,11 @@ "HeWD_HeWD_ignition_mass : HeWD-HeWD mergers above this mass reignite helium. (0.3) : (null)\n", "wind_Nieuwenhuijzen_luminosity_lower_limit : Above this luminosity we activate the Nieuwenhuijzen and de Jager wind (4e3 Lsun). : (null)\n", "wind_LBV_luminosity_lower_limit : Above this luminosity we activate the LBV wind (6e5 Lsun). : (null)\n", + "colour%d : Sets colour %d (0 to NUM_ANSI_COLOURS-1) to the extended ANSI set colour you choose (1-255, 0 means ignore). The colour numbers are defined in src/logging/ansi_colours.h : (null)\n", + "apply_Darwin_Radau_correction : Apply Darwin-Radau correction to the moment of inertia to take rotation into account? : (null)\n", + "degenerate_core_merger_nucsyn : If TRUE, assume that in a degnerate core merger, energy is generated from nucleosynthesis of the whole core, and that this can disrupt the core. The BSE algorithm (Hurley et al. 2002) assumes this to be TRUE, but binary_c assumes FALSE by default. (FALSE) : (null)\n", + "degenerate_core_helium_merger_ignition : If TRUE, assume that when there is a degenerate helium core merger, the star reignites helium. This is required to make R-type carbon stars. (TRUE) : (null)\n", + "degenerate_core_merger_dredgeup_fraction : If non-zero, mix this fraction of the degenerate core during a merger.(0.0). : (null)\n", "\n", "############################################################\n", "##### Section Binary\n", @@ -709,7 +741,6 @@ "############################################################\n", "##### Section Output\n", "############################################################\n", - "david_logging_function : Function to choose which kind of information gets logged Requires DAVID. Choices are: 0= None, >0 for custom logging functions : Ignore\n", "cf_amanda_log : Enable logging to compare to Amanda's models. : (null)\n", "float_overflow_checks : Turn on to enable floating-point overflow checks at the end of each timestep, if they are available. 0=off, 1=warn (stderr) on failure, 2=exit on failure (0) : (null)\n", "save_pre_events_stardata : Enable this to save a copy of stardata to stardata->pre_events_stardata just before an event. : (null)\n", @@ -739,6 +770,7 @@ "escape_fraction : A parameter used in constructing galactic chemical evolution (GCE) models. If the stellar wind velocity exceeds this value, any chemical yield from the wind is ignored, i.e. assumed lost. (km/s) Requires NUCSYN_GCE_OUTFLOW_CHECKS. Default 0.0. See also escape_velocity. : (null)\n", "colour_log : If set to True, thelog is coloured with ANSI colour formatting. Requires FILE_LOG to be defined. : \n", "log_filename : Location of the output logging filename. If set to \"/dev/null\" then there is no logging. : \n", + "log_arrows : Add arrows to the output log to show whether values are increasing or decreasing. : \n", "stopfile : File which, when it exists, will stop the current binary_c repeat run. : \n", "stardata_dump_filename : Location of the stardata dump file. : \n", "stardata_load_filename : Location of the stardata file to load. : \n", @@ -763,8 +795,12 @@ "MINT_MS_rejuvenation : Turn on or off (hydrogen) main-sequence rejuvenation. : \n", "MINT_remesh : Turn on or off MINT's remeshing. : \n", "MINT_use_ZAMS_profiles : Use chemical profiles at the ZAMS if MINT_use_ZAMS_profiles is TRUE, otherwise set homogeneous abundances. (Default is TRUE, so we use the profiles if they are available.) : \n", + "MINT_fallback_to_test_data : If TRUE, use the MINT test_data directory as a fallback when data is unavailable. (FALSE) : \n", "MINT_disable_grid_load_warnings : Use this to explicitly disable MINT's warnings when loading a grid with, e.g., missing or too much data. : \n", "MINT_Kippenhahn : Turn on or off MINT's Kippenhahn diagrams. If 0, off, if 1, output star 1 (index 0), if 2 output star 2 (index 1). Default 0. : \n", + "MINT_nshells : Set the initial number of shells MINT uses in each star when doing nuclear burning. Note: remeshing can change this. If MINT_nshells is 0, shellular burning and other routines that require shells will not be available. (200) : \n", + "MINT_maximum_nshells : Set the maximum number of shells MINT uses in each star when doing nuclear burning. Note that this will be limited to MINT_HARD_MAX_NSHELLS. (1000) : \n", + "MINT_minimum_nshells : Set the minimum number of shells MINT uses in each star when doing nuclear burning. Note that this will be greater than or equal to MINT_HARD_MIN_NSHELLS, which is 0 by default. (0) : \n", "MINT_Kippenhahn_stellar_type : Stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for which Kippenhahn plot data should be output. : \n", "MINT_Kippenhahn_companion_stellar_type : Companion stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for the companion for which Kippenhahn plot data should be output. : \n", "MINT_nuclear_burning : Turn on or off MINT's nuclear burning algorithm. : \n", @@ -825,7 +861,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 5, "id": "3d29ca9d-ac66-4f9e-81cf-2edd14a98b79", "metadata": {}, "outputs": [ @@ -854,7 +890,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "e517f561-09c6-419d-ba89-d9cb61e6ebab", "metadata": {}, "outputs": [ @@ -887,7 +923,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 7, "id": "7da75a95-8831-4346-a584-e042ced75249", "metadata": {}, "outputs": [ diff --git a/docs/build/html/_sources/notebook_custom_logging.ipynb.txt b/docs/build/html/_sources/notebook_custom_logging.ipynb.txt index 05ffbccfc23f0b08e85abed0d467233385520a4b..84e41e6bcee06490f5b4dc61fb616cc213024aba 100644 --- a/docs/build/html/_sources/notebook_custom_logging.ipynb.txt +++ b/docs/build/html/_sources/notebook_custom_logging.ipynb.txt @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 1, "id": "696ecbb9-1efd-48f4-a57e-2cf6dfe416f1", "metadata": {}, "outputs": [], @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 2, "id": "236cf821-09ac-4237-9b8f-6e36d2edf446", "metadata": {}, "outputs": [ @@ -90,7 +90,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 3, "id": "feb423d5-5cc3-433c-9801-f8017abbc03a", "metadata": {}, "outputs": [ @@ -110,7 +110,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 4, "id": "2f5defbf-c623-49ed-a238-fba52a563a58", "metadata": {}, "outputs": [ @@ -155,7 +155,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 5, "id": "dcd74bbc-478b-43e4-b495-8c456e8d1d88", "metadata": {}, "outputs": [ @@ -195,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 6, "id": "77bd09b0-1a94-499d-97db-a1f991c67c12", "metadata": {}, "outputs": [ @@ -203,10 +203,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "EXAMPLE_ABOVE_MS 1.041660877905e+02 4.99198 4.99198 6.1357 6.1357 2 1\n", - "EXAMPLE_ABOVE_MS 1.041662558619e+02 4.99198 4.99198 6.14057 6.1357 2 2\n", - "EXAMPLE_ABOVE_MS 1.041662560111e+02 4.99198 4.99198 6.14057 6.14057 2 2\n", - "EXAMPLE_ABOVE_MS 1.041662564579e+02 4.99198 4.99198 6.14059 6.14057 2 2\n" + "EXAMPLE_ABOVE_MS 1.044142002936e+02 4.99194 4.99194 6.13567 6.13567 2 1\n", + "EXAMPLE_ABOVE_MS 1.044572277695e+02 4.99192 4.99194 7.51803 6.13567 2 2\n", + "EXAMPLE_ABOVE_MS 1.044654032097e+02 4.99192 4.99192 7.81395 7.51803 2 2\n", + "EXAMPLE_ABOVE_MS 1.045084306856e+02 4.99191 4.99192 9.57443 7.81395 2 2\n" ] } ], @@ -260,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 7, "id": "30142286-34ce-433e-82c8-565e2160ff5b", "metadata": {}, "outputs": [ @@ -336,7 +336,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 8, "id": "6f0edc65-a788-4706-a0c5-2ace030765ec", "metadata": {}, "outputs": [ @@ -344,8 +344,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "SINGLE_STAR_LIFETIME 10 27.7358\n", - "EXAMPLE_LOG_CO 2.773581245005e+01 1.33524 9.19314 1.72498e-05 730.446 13 5\n" + "SINGLE_STAR_LIFETIME 10 28.4838\n", + "EXAMPLE_LOG_CO 2.848380621869e+01 1.33469 9.1865 1.72498e-05 724.338 13 5\n" ] } ], @@ -395,7 +395,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 10, "id": "8f58fdf9-3e76-4c18-a1c5-eed0980d4133", "metadata": {}, "outputs": [ @@ -403,8 +403,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "EXAMPLE_MASSLOSS 9.878236827680e+00 1.61349 8.38063 20 13 1\n", - "EXAMPLE_SN 9.878236827680e+00 1.61349 8.38063 20 12 13 5 1 6.74037 4.92267 6.74037 0 0\n" + "EXAMPLE_MASSLOSS 1.050651207308e+01 1.59452 9.34213 20 13 1\n", + "EXAMPLE_SN 1.050651207308e+01 1.59452 9.34213 20 12 13 5 1 6.55458 4.71662 6.55458\n" ] } ], @@ -424,58 +424,27 @@ "{\n", " if (stardata->model.time < stardata->model.max_evolution_time)\n", " {\n", - " if(stardata->pre_events_stardata != NULL)\n", - " {\n", - " Printf(\"EXAMPLE_SN %30.12e \" // 1\n", - " \"%g %g %g %d \" // 2-5\n", - " \"%d %d %g %g \" // 6-9\n", - " \"%g %g %g %g\\\\n\", // 10-13\n", - "\n", - " // \n", - " stardata->model.time, // 1\n", - "\n", - " stardata->star[0].mass, //2\n", - " stardata->pre_events_stardata->star[0].mass, //3\n", - " stardata->common.zero_age.mass[0], //4\n", - " stardata->star[0].SN_type, //5\n", + " Printf(\"EXAMPLE_SN %30.12e \" // 1\n", + " \"%g %g %g %d \" // 2-5\n", + " \"%d %d %g %g \" // 6-9\n", + " \"%g %g\\\\n\", // 10-13\n", "\n", - " stardata->star[0].stellar_type, //6\n", - " stardata->pre_events_stardata->star[0].stellar_type, //7\n", - " stardata->model.probability, //8\n", - " stardata->pre_events_stardata->star[0].core_mass[ID_core(stardata->pre_events_stardata->star[0].stellar_type)], // 9\n", - "\n", - " stardata->pre_events_stardata->star[0].core_mass[CORE_CO], // 10\n", - " stardata->pre_events_stardata->star[0].core_mass[CORE_He], // 11\n", - " stardata->star[0].fallback, // 12\n", - " stardata->star[0].fallback_mass // 13\n", - " );\n", - " }\n", - " else\n", - " {\n", - " Printf(\"EXAMPLE_SN %30.12e \" // 1\n", - " \"%g %g %g %d \" // 2-5\n", - " \"%d %d %g %g \" // 6-9\n", - " \"%g %g %g %g\\\\n\", // 10-13\n", - "\n", - " // \n", - " stardata->model.time, // 1\n", + " // \n", + " stardata->model.time, // 1\n", "\n", - " stardata->star[0].mass, //2\n", - " stardata->previous_stardata->star[0].mass, //3\n", - " stardata->common.zero_age.mass[0], //4\n", - " stardata->star[0].SN_type, //5\n", + " stardata->star[0].mass, //2\n", + " stardata->previous_stardata->star[0].mass, //3\n", + " stardata->common.zero_age.mass[0], //4\n", + " stardata->star[0].SN_type, //5\n", "\n", - " stardata->star[0].stellar_type, //6\n", - " stardata->previous_stardata->star[0].stellar_type, //7\n", - " stardata->model.probability, //8\n", - " stardata->previous_stardata->star[0].core_mass[ID_core(stardata->previous_stardata->star[0].stellar_type)], // 9\n", + " stardata->star[0].stellar_type, //6\n", + " stardata->previous_stardata->star[0].stellar_type, //7\n", + " stardata->model.probability, //8\n", + " stardata->previous_stardata->star[0].core_mass[ID_core(stardata->previous_stardata->star[0].stellar_type)], // 9\n", "\n", - " stardata->previous_stardata->star[0].core_mass[CORE_CO], // 10\n", - " stardata->previous_stardata->star[0].core_mass[CORE_He], // 11\n", - " stardata->star[0].fallback, // 12\n", - " stardata->star[0].fallback_mass // 13\n", - " );\n", - " }\n", + " stardata->previous_stardata->star[0].core_mass[CORE_CO], // 10\n", + " stardata->previous_stardata->star[0].core_mass[CORE_He] // 11\n", + " );\n", " };\n", " /* Kill the simulation to save time */\n", " stardata->model.max_evolution_time = stardata->model.time - stardata->model.dtm;\n", @@ -491,6 +460,14 @@ "# print (abridged) output\n", "print(\"\\n\".join(output.splitlines()[-2:]))" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "484297c0-accb-4efc-a9c8-dbd2f32b89a6", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/docs/build/html/_sources/notebook_luminosity_function_binaries.ipynb.txt b/docs/build/html/_sources/notebook_luminosity_function_binaries.ipynb.txt new file mode 100644 index 0000000000000000000000000000000000000000..fb64dbcc9754aa9dc823a41ae3c52223cb2a8d9a --- /dev/null +++ b/docs/build/html/_sources/notebook_luminosity_function_binaries.ipynb.txt @@ -0,0 +1,839 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bbbaafbb-fd7d-4b73-a970-93506ba35d71", + "metadata": {}, + "source": [ + "# Zero-age stellar luminosity function in binaries\n", + "\n", + "In this notebook we compute the luminosity function of the zero-age main-sequence by running a population of binary stars using binary_c. \n", + "\n", + "Before you go through this notebook, you should look at notebook_luminosity_function.ipynb which is for the - conceptually more simple - single stars.\n", + "\n", + "We start by loading in some standard Python modules and the binary_c module.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bf6b8673-a2b5-4b50-ad1b-e90671f57470", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import math\n", + "from binarycpython.utils.grid import Population\n", + "\n", + "# help(Population) # Uncomment this line to see the public functions of this object" + ] + }, + { + "cell_type": "markdown", + "id": "f268eff3-4e08-4f6b-8b59-f22dba4d2074", + "metadata": {}, + "source": [ + "## Setting up the Population object\n", + "To set up and configure the population object we need to make a new instance of the `Population` object and configure it with the `.set()` function.\n", + "\n", + "In our case, we only need to set the maximum evolution time to something short, because we care only about zero-age main sequence stars which have, by definition, age zero." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "79ab50b7-591f-4883-af09-116d1835a751", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "adding: max_evolution_time=0.1 to BSE_options\n", + "verbosity is 1\n" + ] + } + ], + "source": [ + "# Create population object\n", + "population = Population()\n", + "\n", + "# If you want verbosity, set this before other things\n", + "population.set(verbosity=1)\n", + "\n", + "# Setting values can be done via .set(<parameter_name>=<value>)\n", + "# Values that are known to be binary_c_parameters are loaded into bse_options.\n", + "# Those that are present in the default grid_options are set in grid_options\n", + "# All other values that you set are put in a custom_options dict\n", + "population.set(\n", + " # binary_c physics options\n", + " max_evolution_time=0.1, # maximum stellar evolution time in Myr\n", + " )\n", + "\n", + "# We can access the options through \n", + "print(\"verbosity is\", population.grid_options['verbosity'])" + ] + }, + { + "cell_type": "markdown", + "id": "f9a65554-36ab-4a04-96ca-9f1422c307fd", + "metadata": {}, + "source": [ + "## Adding grid variables\n", + "The main purpose of the Population object is to handle the population synthesis side of running a set of stars. The main method to do this with binarycpython, as is the case with Perl binarygrid, is to use grid variables. These are loops over a predefined range of values, where a probability will be assigned to the systems based on the chosen probability distributions.\n", + "\n", + "Usually we use either 1 mass grid variable, or a trio of mass, mass ratio and period (other notebooks cover these examples). We can, however, also add grid sampling for e.g. eccentricity, metallicity or other parameters. \n", + "\n", + "To add a grid variable to the population object we use `population.add_grid_variable`" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "68c84521-9ae8-4020-af7a-5334173db969", + "metadata": {}, + "outputs": [], + "source": [ + "# help(population.add_grid_variable)" + ] + }, + { + "cell_type": "markdown", + "id": "bd75cebe-2152-4025-b680-dc020b80889b", + "metadata": {}, + "source": [ + "All the distribution functions that we can use are stored in the `binarycpython.utils.distribution_functions` or `binarycpython/utils/distribution_functions.py` on git. If you uncomment the help statement below you can see which functions are available now:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "048db541-3e92-4c5d-a25c-9c5a34b9c857", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "import binarycpython.utils.distribution_functions\n", + "# help(binarycpython.utils.distribution_functions)" + ] + }, + { + "cell_type": "markdown", + "id": "2a9104fc-4136-4e53-8604-f24ad52fbe56", + "metadata": {}, + "source": [ + "First let us set up some global variables that will be useful throughout. \n", + "* The resolution is the number of stars we simulate in our model population.\n", + "* The massrange is a list of the min and max masses\n", + "* The total_probability is the theoretical integral of a probability density function, i.e. 1.0.\n", + "* The binwidth sets the resolution of the final distribution. If set to 0.5, the bins in log*L* are 0.5dex wide." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "aba3fe4e-18f2-4bb9-8e5c-4c6007ab038b", + "metadata": {}, + "outputs": [], + "source": [ + "# Set resolution and mass range that we simulate\n", + "resolution = {\"M_1\": 40} # start with resolution = 10, and increase later if you want \"more accurate\" data\n", + "massrange = (0.07, 100.0) # we work with stars of mass 0.07 to 100 Msun\n", + "total_probability = 1.0 # theoretical integral of the mass probability density function over all masses \n", + "# distribution binwidths : \n", + "# (log10) luminosity distribution\n", + "binwidth = { 'luminosity' : 1.0 }" + ] + }, + { + "cell_type": "markdown", + "id": "1b3a007b-5c17-42a7-a981-7e268e6f545c", + "metadata": {}, + "source": [ + "The next cell contains an example of adding the mass grid variable, sampling the phase space in linear mass *M*_1." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "47979841-2c26-4b26-8945-603d013dc93a", + "metadata": {}, + "outputs": [], + "source": [ + "# Set up the binary grid in \"cubic\" M1 - M2=q*M1 - log10 period space\n", + "\n", + "population = Population()\n", + "\n", + "# resolution on each side of the cube, with more stars for the primary mass\n", + "nres = 10\n", + "resolution = {\"M_1\": 2*nres,\n", + " \"q\": nres,\n", + " \"per\": nres}\n", + "\n", + "massrange = [0.07,100]\n", + "logperrange = [0.15, 5.5]\n", + "\n", + "population.add_grid_variable(\n", + " name=\"lnm1\",\n", + " longname=\"Primary mass\",\n", + " valuerange=massrange,\n", + " resolution=\"{}\".format(resolution[\"M_1\"]),\n", + " spacingfunc=\"const(math.log({min}), math.log({max}), {res})\".format(min=massrange[0],max=massrange[1],res=resolution[\"M_1\"]),\n", + " precode=\"M_1=math.exp(lnm1)\",\n", + " probdist=\"three_part_powerlaw(M_1, 0.1, 0.5, 1.0, 150, -1.3, -2.3, -2.3)*M_1\",\n", + " dphasevol=\"dlnm1\",\n", + " parameter_name=\"M_1\",\n", + " condition=\"\", # Impose a condition on this grid variable. Mostly for a check for yourself\n", + ")\n", + "\n", + "# Mass ratio\n", + "population.add_grid_variable(\n", + " name=\"q\",\n", + " longname=\"Mass ratio\",\n", + " valuerange=[\"0.1/M_1\", 1],\n", + " resolution=\"{}\".format(resolution['q']),\n", + " spacingfunc=\"const({}/M_1, 1, {})\".format(massrange[0],resolution['q']),\n", + " probdist=\"flatsections(q, [{{'min': {}/M_1, 'max': 1.0, 'height': 1}}])\".format(massrange[0]),\n", + " dphasevol=\"dq\",\n", + " precode=\"M_2 = q * M_1\",\n", + " parameter_name=\"M_2\",\n", + " condition=\"\", # Impose a condition on this grid variable. Mostly for a check for yourself\n", + " )\n", + "\n", + "# Orbital period\n", + "population.add_grid_variable(\n", + " name=\"log10per\", # in days\n", + " longname=\"log10(Orbital_Period)\",\n", + " valuerange=[0.15, 5.5],\n", + " resolution=\"{}\".format(resolution[\"per\"]),\n", + " spacingfunc=\"const({}, {}, {})\".format(logperrange[0],logperrange[1],resolution[\"per\"]),\n", + " precode=\"\"\"orbital_period = 10.0 ** log10per\n", + "sep = calc_sep_from_period(M_1, M_2, orbital_period)\n", + "sep_min = calc_sep_from_period(M_1, M_2, 10**{})\n", + "sep_max = calc_sep_from_period(M_1, M_2, 10**{})\"\"\".format(logperrange[0],logperrange[1]),\n", + " probdist=\"sana12(M_1, M_2, sep, orbital_period, sep_min, sep_max, math.log10(10**{}), math.log10(10**{}), {})\".format(logperrange[0],logperrange[1],-0.55),\n", + " parameter_name=\"orbital_period\",\n", + " dphasevol=\"dlog10per\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "163f13ae-fec1-4ee8-b9d4-c1b75c19ff39", + "metadata": {}, + "source": [ + "## Setting logging and handling the output\n", + "By default, binary_c will not output anything (except for 'SINGLE STAR LIFETIME'). It is up to us to determine what will be printed. We can either do that by hardcoding the print statements into `binary_c` (see documentation binary_c) or we can use the custom logging functionality of binarycpython (see notebook `notebook_custom_logging.ipynb`), which is faster to set up and requires no recompilation of binary_c, but is somewhat more limited in its functionality. For our current purposes, it works perfectly well.\n", + "\n", + "After configuring what will be printed, we need to make a function to parse the output. This can be done by setting the parse_function parameter in the population object (see also notebook `notebook_individual_systems.ipynb`). \n", + "\n", + "In the code below we will set up both the custom logging and a parse function to handle that output." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0c986215-93b1-4e30-ad79-f7c397e9ff7d", + "metadata": {}, + "outputs": [], + "source": [ + "# Create custom logging statement\n", + "#\n", + "# we check that the model number is zero, i.e. we're on the first timestep (stars are born on the ZAMS)\n", + "# we make sure that the stellar type is <= MAIN_SEQUENCE, i.e. the star is a main-sequence star\n", + "# we also check that the time is 0.0 (this is not strictly required, but good to show how it is done)\n", + "#\n", + "# The \n", + "#\n", + "# The Printf statement does the outputting: note that the header string is ZERO_AGE_MAIN_SEQUENCE_STARn\n", + "#\n", + "# where:\n", + "#\n", + "# n = PRIMARY = 0 is star 0 (primary star)\n", + "# n = SECONDARY = 1 is star 1 (secondary star)\n", + "# n = UNRESOLVED = 2 is the unresolved system (both stars added)\n", + "\n", + "PRIMARY = 0\n", + "SECONDARY = 1\n", + "UNRESOLVED = 2\n", + "\n", + "custom_logging_statement = \"\"\"\n", + "// select ZAMS\n", + "if(stardata->model.model_number == 0 &&\n", + " stardata->model.time == 0)\n", + "{\n", + " // loop over the stars individually (equivalent to a resolved binary) \n", + " Foreach_star(star)\n", + " {\n", + " // select main-sequence stars\n", + " if(star->stellar_type <= MAIN_SEQUENCE)\n", + " {\n", + " /* Note that we use Printf - with a capital P! */\n", + " Printf(\"ZERO_AGE_MAIN_SEQUENCE_STAR%d %30.12e %g %g %g %g\\\\n\",\n", + " star->starnum,\n", + " stardata->model.time, // 1\n", + " stardata->common.zero_age.mass[0], // 2\n", + " star->mass, // 3\n", + " star->luminosity, // 4\n", + " stardata->model.probability // 5\n", + " );\n", + " }\n", + " }\n", + " \n", + " // unresolved MS-MS binary\n", + " if(stardata->star[0].stellar_type <= MAIN_SEQUENCE &&\n", + " stardata->star[1].stellar_type <= MAIN_SEQUENCE) \n", + " {\n", + " Printf(\"ZERO_AGE_MAIN_SEQUENCE_STAR%d %30.12e %g %g %g %g\\\\n\",\n", + " 2,\n", + " stardata->model.time, // 1\n", + " stardata->common.zero_age.mass[0] + stardata->common.zero_age.mass[1], // 2\n", + " stardata->star[0].mass + stardata->star[1].mass, // 3\n", + " stardata->star[0].luminosity + stardata->star[1].luminosity, // 4\n", + " stardata->model.probability // 5\n", + " );\n", + " }\n", + "}\n", + "\"\"\"\n", + "\n", + "population.set(\n", + " C_logging_code=custom_logging_statement\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "ae1f1f0c-1f8b-42d8-b051-cbf8c6b51514", + "metadata": {}, + "source": [ + "The parse function must now catch lines that start with \"ZERO_AGE_MAIN_SEQUENCE_STAR\" and process the associated data." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "fd197154-a8ce-4865-8929-008d3483101a", + "metadata": {}, + "outputs": [], + "source": [ + "# import the bin_data function so we can construct finite-resolution probability distributions\n", + "# import the datalinedict to make a dictionary from each line of data from binary_c\n", + "from binarycpython.utils.functions import bin_data,datalinedict\n", + "import re\n", + "\n", + "def parse_function(self, output):\n", + " \"\"\"\n", + " Example parse function\n", + " \"\"\"\n", + " \n", + " # list of the data items\n", + " parameters = [\"header\", \"time\", \"zams_mass\", \"mass\", \"luminosity\", \"probability\"]\n", + " \n", + " # Loop over the output.\n", + " for line in output.splitlines():\n", + " \n", + " # check if we match a ZERO_AGE_MAIN_SEQUENCE_STAR\n", + " match = re.search('ZERO_AGE_MAIN_SEQUENCE_STAR(\\d)',line) \n", + " if match:\n", + " nstar = match.group(1) \n", + " #print(\"matched star\",nstar)\n", + "\n", + " # obtain the line of data in dictionary form \n", + " linedata = datalinedict(line,parameters)\n", + "\n", + " # bin the log10(luminosity) to the nearest 0.1dex\n", + " binned_log_luminosity = bin_data(math.log10(linedata['luminosity']),\n", + " binwidth['luminosity'])\n", + " \n", + " # append the data to the results_dictionary \n", + " self.grid_results['luminosity distribution'][int(nstar)][binned_log_luminosity] += linedata['probability'] \n", + " \n", + " #print (self.grid_results)\n", + " \n", + " # verbose reporting\n", + " #print(\"parse out results_dictionary=\",self.grid_results)\n", + " \n", + "# Add the parsing function\n", + "population.set(\n", + " parse_function=parse_function,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "91509ce5-ffe7-4937-aa87-6d7baac9ac04", + "metadata": {}, + "source": [ + "## Evolving the grid\n", + "Now that we configured all the main parts of the population object, we can actually run the population! Doing this is straightforward: `population.evolve()`\n", + "\n", + "This will start up the processing of all the systems. We can control how many cores are used by settings `amt_cores`. By setting the `verbosity` of the population object to a higher value we can get a lot of verbose information about the run, but for now we will set it to 0.\n", + "\n", + "There are many grid_options that can lead to different behaviour of the evolution of the grid. Please do have a look at those: [grid options docs](https://ri0005.pages.surrey.ac.uk/binary_c-python/grid_options_descriptions.html), and try " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8ea376c1-1e92-45af-8cab-9d7fdca564eb", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "adding: amt_cores=4 to grid_options\n", + "Running the population now, this may take a little while...\n", + "Creating and loading custom logging functionality\n", + "Generating grid code\n", + "Generating grid code\n", + "Constructing/adding: lnm1\n", + "Constructing/adding: q\n", + "Constructing/adding: log10per\n", + "Saving grid code to grid_options\n", + "Writing grid code to /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Loading grid code function from /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Grid code loaded\n", + "Grid has handled 2000 stars\n", + "with a total probability of 0.6495098935846658\n", + "Total starcount for this run will be: 2000\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:14:08,077 DEBUG Process-2] --- Setting up processor: process-0[2021-09-10 15:14:08,080 DEBUG Process-3] --- Setting up processor: process-1[2021-09-10 15:14:08,086 DEBUG MainProcess] --- setting up the system_queue_filler now\n", + "\n", + "[2021-09-10 15:14:08,084 DEBUG Process-4] --- Setting up processor: process-2\n", + "\n", + "[2021-09-10 15:14:08,117 DEBUG Process-5] --- Setting up processor: process-3" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 1 started at 2021-09-10T15:14:08.119437.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff53810>Process 0 started at 2021-09-10T15:14:08.126435.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff539f0>\n", + "Process 2 started at 2021-09-10T15:14:08.138353.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff539f0>" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "Process 3 started at 2021-09-10T15:14:08.186492.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff53810>\n", + "Generating grid code\n", + "Generating grid code\n", + "Constructing/adding: lnm1\n", + "Constructing/adding: q\n", + "Constructing/adding: log10per\n", + "Saving grid code to grid_options\n", + "Writing grid code to /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Loading grid code function from /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Grid code loaded\n", + "624/2000 31.2% complete 15:14:12 ETA= 11.1s tpr=8.05e-03 ETF=15:14:23 mem:800.5MB625/2000 31.2% complete 15:14:12 ETA= 11.1s tpr=8.04e-03 ETF=15:14:23 mem:800.5MB\n", + "626/2000 31.3% complete 15:14:12 ETA= 11.1s tpr=8.05e-03 ETF=15:14:23 mem:800.5MB\n", + "\n", + "713/2000 35.6% complete 15:14:17 ETA= 1.3m tpr=6.00e-02 ETF=15:15:34 mem:547.8MB\n", + "728/2000 36.4% complete 15:14:22 ETA= 7.1m tpr=3.37e-01 ETF=15:21:30 mem:548.1MB\n", + "743/2000 37.1% complete 15:14:27 ETA= 7.0m tpr=3.34e-01 ETF=15:21:26 mem:549.5MB\n", + "759/2000 38.0% complete 15:14:33 ETA= 7.7m tpr=3.73e-01 ETF=15:22:16 mem:550.5MB\n", + "774/2000 38.7% complete 15:14:38 ETA= 6.9m tpr=3.35e-01 ETF=15:21:29 mem:551.1MB\n", + "787/2000 39.4% complete 15:14:43 ETA= 7.8m tpr=3.88e-01 ETF=15:22:33 mem:551.1MB\n", + "799/2000 40.0% complete 15:14:48 ETA= 8.5m tpr=4.24e-01 ETF=15:23:17 mem:552.5MB\n", + "812/2000 40.6% complete 15:14:54 ETA= 8.4m tpr=4.23e-01 ETF=15:23:16 mem:554.8MB\n", + "830/2000 41.5% complete 15:14:59 ETA= 5.5m tpr=2.80e-01 ETF=15:20:26 mem:555.2MB\n", + "847/2000 42.4% complete 15:15:05 ETA= 6.8m tpr=3.52e-01 ETF=15:21:50 mem:555.2MB\n", + "864/2000 43.2% complete 15:15:10 ETA= 6.2m tpr=3.28e-01 ETF=15:21:23 mem:557.0MB\n", + "876/2000 43.8% complete 15:15:15 ETA= 8.2m tpr=4.38e-01 ETF=15:23:27 mem:559.7MB\n", + "887/2000 44.4% complete 15:15:21 ETA= 9.2m tpr=4.95e-01 ETF=15:24:32 mem:560.5MB\n", + "898/2000 44.9% complete 15:15:26 ETA= 9.2m tpr=4.99e-01 ETF=15:24:37 mem:560.5MB\n", + "908/2000 45.4% complete 15:15:32 ETA= 9.5m tpr=5.23e-01 ETF=15:25:03 mem:560.5MB\n", + "919/2000 46.0% complete 15:15:37 ETA= 8.3m tpr=4.60e-01 ETF=15:23:54 mem:560.9MB\n", + "934/2000 46.7% complete 15:15:42 ETA= 6.4m tpr=3.60e-01 ETF=15:22:06 mem:561.7MB\n", + "947/2000 47.4% complete 15:15:47 ETA= 7.2m tpr=4.08e-01 ETF=15:22:57 mem:561.7MB\n", + "956/2000 47.8% complete 15:15:53 ETA= 11.1m tpr=6.39e-01 ETF=15:27:01 mem:561.7MB\n", + "963/2000 48.1% complete 15:15:58 ETA= 12.6m tpr=7.30e-01 ETF=15:28:35 mem:561.7MB\n", + "969/2000 48.5% complete 15:16:04 ETA= 15.2m tpr=8.85e-01 ETF=15:31:16 mem:561.9MB\n", + "979/2000 49.0% complete 15:16:11 ETA= 11.9m tpr=7.01e-01 ETF=15:28:06 mem:562.0MB\n", + "988/2000 49.4% complete 15:16:16 ETA= 9.7m tpr=5.76e-01 ETF=15:25:59 mem:562.0MB\n", + "995/2000 49.8% complete 15:16:21 ETA= 12.3m tpr=7.37e-01 ETF=15:28:42 mem:562.2MB\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:16:25,175 DEBUG MainProcess] --- Signaling stop to processes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1003/2000 50.1% complete 15:16:26 ETA= 11.2m tpr=6.76e-01 ETF=15:27:40 mem:563.0MB\n", + "1015/2000 50.8% complete 15:16:32 ETA= 7.6m tpr=4.65e-01 ETF=15:24:10 mem:563.0MB\n", + "1025/2000 51.2% complete 15:16:37 ETA= 8.1m tpr=5.01e-01 ETF=15:24:45 mem:563.0MB\n", + "1033/2000 51.6% complete 15:16:42 ETA= 10.7m tpr=6.65e-01 ETF=15:27:26 mem:563.0MB\n", + "1040/2000 52.0% complete 15:16:47 ETA= 12.1m tpr=7.55e-01 ETF=15:28:52 mem:563.5MB\n", + "1048/2000 52.4% complete 15:16:53 ETA= 11.8m tpr=7.45e-01 ETF=15:28:42 mem:563.5MB\n", + "1057/2000 52.9% complete 15:16:59 ETA= 9.1m tpr=5.78e-01 ETF=15:26:03 mem:563.6MB\n", + "1062/2000 53.1% complete 15:17:04 ETA= 15.7m tpr=1.01e+00 ETF=15:32:47 mem:564.4MB\n", + "1069/2000 53.5% complete 15:17:09 ETA= 12.4m tpr=7.97e-01 ETF=15:29:31 mem:564.9MB\n", + "1077/2000 53.9% complete 15:17:15 ETA= 11.5m tpr=7.46e-01 ETF=15:28:44 mem:565.0MB\n", + "1085/2000 54.2% complete 15:17:20 ETA= 10.0m tpr=6.55e-01 ETF=15:27:20 mem:565.0MB\n", + "1091/2000 54.5% complete 15:17:26 ETA= 13.8m tpr=9.10e-01 ETF=15:31:13 mem:565.9MB\n", + "1099/2000 55.0% complete 15:17:32 ETA= 12.1m tpr=8.05e-01 ETF=15:29:37 mem:566.5MB\n", + "1114/2000 55.7% complete 15:17:37 ETA= 5.0m tpr=3.35e-01 ETF=15:22:34 mem:566.5MB\n", + "1126/2000 56.3% complete 15:17:43 ETA= 6.8m tpr=4.64e-01 ETF=15:24:29 mem:566.5MB\n", + "1134/2000 56.7% complete 15:17:48 ETA= 9.2m tpr=6.37e-01 ETF=15:27:00 mem:566.6MB\n", + "1139/2000 57.0% complete 15:17:54 ETA= 16.3m tpr=1.14e+00 ETF=15:34:13 mem:567.4MB\n", + "1148/2000 57.4% complete 15:17:59 ETA= 8.8m tpr=6.20e-01 ETF=15:26:47 mem:567.4MB\n", + "1156/2000 57.8% complete 15:18:05 ETA= 9.3m tpr=6.60e-01 ETF=15:27:22 mem:567.5MB\n", + "1162/2000 58.1% complete 15:18:11 ETA= 14.3m tpr=1.02e+00 ETF=15:32:28 mem:567.6MB\n", + "1168/2000 58.4% complete 15:18:17 ETA= 15.2m tpr=1.09e+00 ETF=15:33:27 mem:568.6MB\n", + "1177/2000 58.9% complete 15:18:23 ETA= 8.8m tpr=6.45e-01 ETF=15:27:14 mem:568.6MB\n", + "1181/2000 59.0% complete 15:18:28 ETA= 17.8m tpr=1.30e+00 ETF=15:36:16 mem:568.7MB\n", + "1187/2000 59.4% complete 15:18:34 ETA= 12.1m tpr=8.93e-01 ETF=15:30:40 mem:568.7MB\n", + "1194/2000 59.7% complete 15:18:39 ETA= 9.8m tpr=7.29e-01 ETF=15:28:26 mem:568.8MB\n", + "1202/2000 60.1% complete 15:18:44 ETA= 9.5m tpr=7.12e-01 ETF=15:28:12 mem:568.8MB\n", + "1219/2000 61.0% complete 15:18:51 ETA= 5.3m tpr=4.07e-01 ETF=15:24:09 mem:569.7MB\n", + "1228/2000 61.4% complete 15:18:57 ETA= 7.4m tpr=5.76e-01 ETF=15:26:21 mem:569.7MB\n", + "1234/2000 61.7% complete 15:19:02 ETA= 11.8m tpr=9.22e-01 ETF=15:30:48 mem:571.7MB1235/2000 61.8% complete 15:19:02 ETA= 10.1m tpr=7.92e-01 ETF=15:29:08 mem:571.7MB\n", + "\n", + "1243/2000 62.1% complete 15:19:07 ETA= 7.3m tpr=5.79e-01 ETF=15:26:26 mem:573.4MB\n", + "1251/2000 62.5% complete 15:19:13 ETA= 8.3m tpr=6.68e-01 ETF=15:27:33 mem:575.4MB\n", + "1260/2000 63.0% complete 15:19:19 ETA= 8.2m tpr=6.65e-01 ETF=15:27:31 mem:575.4MB\n", + "1268/2000 63.4% complete 15:19:24 ETA= 7.8m tpr=6.41e-01 ETF=15:27:13 mem:576.8MB\n", + "1276/2000 63.8% complete 15:19:29 ETA= 7.6m tpr=6.30e-01 ETF=15:27:05 mem:577.0MB\n", + "1282/2000 64.1% complete 15:19:34 ETA= 10.1m tpr=8.44e-01 ETF=15:29:40 mem:578.0MB\n", + "1289/2000 64.5% complete 15:19:40 ETA= 10.8m tpr=9.08e-01 ETF=15:30:26 mem:578.0MB\n", + "1295/2000 64.8% complete 15:19:46 ETA= 10.5m tpr=8.95e-01 ETF=15:30:16 mem:578.1MB\n", + "1309/2000 65.5% complete 15:19:51 ETA= 4.3m tpr=3.70e-01 ETF=15:24:06 mem:578.1MB\n", + "1323/2000 66.2% complete 15:19:58 ETA= 6.1m tpr=5.45e-01 ETF=15:26:07 mem:579.2MB\n", + "1332/2000 66.6% complete 15:20:03 ETA= 6.2m tpr=5.58e-01 ETF=15:26:16 mem:579.3MB\n", + "1338/2000 66.9% complete 15:20:09 ETA= 10.1m tpr=9.11e-01 ETF=15:30:12 mem:579.3MB\n", + "1346/2000 67.3% complete 15:20:18 ETA= 12.5m tpr=1.14e+00 ETF=15:32:46 mem:581.5MB\n", + "1355/2000 67.8% complete 15:20:25 ETA= 8.5m tpr=7.90e-01 ETF=15:28:54 mem:581.6MB\n", + "1359/2000 68.0% complete 15:20:30 ETA= 13.9m tpr=1.30e+00 ETF=15:34:26 mem:581.6MB\n", + "1366/2000 68.3% complete 15:20:38 ETA= 11.7m tpr=1.10e+00 ETF=15:32:18 mem:581.7MB\n", + "1376/2000 68.8% complete 15:20:44 ETA= 6.1m tpr=5.89e-01 ETF=15:26:51 mem:581.7MB\n", + "1384/2000 69.2% complete 15:20:49 ETA= 6.9m tpr=6.76e-01 ETF=15:27:46 mem:581.7MB\n", + "1393/2000 69.7% complete 15:20:55 ETA= 6.2m tpr=6.13e-01 ETF=15:27:07 mem:581.8MB1394/2000 69.7% complete 15:20:55 ETA= 5.6m tpr=5.52e-01 ETF=15:26:29 mem:581.8MB\n", + "\n", + "1423/2000 71.2% complete 15:21:00 ETA= 1.6m tpr=1.69e-01 ETF=15:22:37 mem:581.9MB\n", + "1435/2000 71.8% complete 15:21:07 ETA= 5.6m tpr=5.92e-01 ETF=15:26:42 mem:582.3MB\n", + "1443/2000 72.2% complete 15:21:12 ETA= 6.1m tpr=6.54e-01 ETF=15:27:17 mem:582.5MB\n", + "1445/2000 72.2% complete 15:21:18 ETA= 28.2m tpr=3.05e+00 ETF=15:49:28 mem:582.6MB\n", + "1448/2000 72.4% complete 15:21:25 ETA= 20.0m tpr=2.18e+00 ETF=15:41:27 mem:582.6MB\n", + "1454/2000 72.7% complete 15:21:31 ETA= 8.6m tpr=9.49e-01 ETF=15:30:09 mem:583.0MB\n", + "1455/2000 72.8% complete 15:21:37 ETA= 54.9m tpr=6.05e+00 ETF=16:16:32 mem:583.0MB\n", + "1459/2000 73.0% complete 15:21:43 ETA= 13.5m tpr=1.50e+00 ETF=15:35:12 mem:583.0MB\n", + "1465/2000 73.2% complete 15:21:48 ETA= 8.6m tpr=9.65e-01 ETF=15:30:25 mem:583.0MB\n", + "1474/2000 73.7% complete 15:21:54 ETA= 5.6m tpr=6.38e-01 ETF=15:27:30 mem:583.0MB\n", + "1482/2000 74.1% complete 15:21:59 ETA= 5.4m tpr=6.30e-01 ETF=15:27:26 mem:583.0MB\n", + "1485/2000 74.2% complete 15:22:04 ETA= 14.8m tpr=1.73e+00 ETF=15:36:54 mem:583.5MB\n", + "1487/2000 74.3% complete 15:22:10 ETA= 24.9m tpr=2.91e+00 ETF=15:47:02 mem:583.5MB\n", + "1496/2000 74.8% complete 15:22:16 ETA= 5.0m tpr=5.91e-01 ETF=15:27:13 mem:583.7MB\n", + "1509/2000 75.5% complete 15:22:21 ETA= 3.6m tpr=4.40e-01 ETF=15:25:57 mem:583.9MB\n", + "1523/2000 76.2% complete 15:22:27 ETA= 3.0m tpr=3.80e-01 ETF=15:25:28 mem:583.9MB\n", + "1531/2000 76.5% complete 15:22:33 ETA= 5.9m tpr=7.60e-01 ETF=15:28:29 mem:583.9MB\n", + "1537/2000 76.8% complete 15:22:38 ETA= 6.7m tpr=8.71e-01 ETF=15:29:21 mem:583.9MB\n", + "1545/2000 77.2% complete 15:22:44 ETA= 5.4m tpr=7.14e-01 ETF=15:28:08 mem:584.0MB\n", + "1555/2000 77.8% complete 15:22:49 ETA= 4.1m tpr=5.52e-01 ETF=15:26:55 mem:584.2MB\n", + "1564/2000 78.2% complete 15:22:54 ETA= 4.2m tpr=5.78e-01 ETF=15:27:06 mem:584.2MB\n", + "1574/2000 78.7% complete 15:23:00 ETA= 4.4m tpr=6.16e-01 ETF=15:27:23 mem:584.4MB\n", + "1584/2000 79.2% complete 15:23:07 ETA= 4.4m tpr=6.28e-01 ETF=15:27:28 mem:584.8MB\n", + "1594/2000 79.7% complete 15:23:12 ETA= 3.8m tpr=5.66e-01 ETF=15:27:02 mem:584.9MB\n", + "1607/2000 80.3% complete 15:23:17 ETA= 2.5m tpr=3.86e-01 ETF=15:25:49 mem:585.0MB\n", + "1618/2000 80.9% complete 15:23:24 ETA= 3.8m tpr=5.97e-01 ETF=15:27:12 mem:585.4MB\n", + "1628/2000 81.4% complete 15:23:29 ETA= 3.3m tpr=5.28e-01 ETF=15:26:46 mem:585.5MB\n", + "1635/2000 81.8% complete 15:23:34 ETA= 4.4m tpr=7.30e-01 ETF=15:28:01 mem:585.9MB\n", + "1645/2000 82.2% complete 15:23:40 ETA= 3.4m tpr=5.81e-01 ETF=15:27:06 mem:585.9MB\n", + "1655/2000 82.8% complete 15:23:47 ETA= 4.0m tpr=7.02e-01 ETF=15:27:49 mem:586.0MB1656/2000 82.8% complete 15:23:47 ETA= 3.7m tpr=6.39e-01 ETF=15:27:27 mem:586.0MB\n", + "\n", + "1664/2000 83.2% complete 15:23:54 ETA= 4.5m tpr=8.01e-01 ETF=15:28:23 mem:586.1MB\n", + "1674/2000 83.7% complete 15:24:02 ETA= 4.5m tpr=8.27e-01 ETF=15:28:31 mem:586.2MB\n", + "1684/2000 84.2% complete 15:24:07 ETA= 2.9m tpr=5.55e-01 ETF=15:27:03 mem:586.2MB\n", + "1691/2000 84.5% complete 15:24:13 ETA= 4.2m tpr=8.21e-01 ETF=15:28:27 mem:586.5MB\n", + "1699/2000 85.0% complete 15:24:19 ETA= 3.4m tpr=6.75e-01 ETF=15:27:42 mem:586.5MB\n", + "1713/2000 85.7% complete 15:24:24 ETA= 1.9m tpr=4.07e-01 ETF=15:26:21 mem:586.6MB\n", + "1725/2000 86.2% complete 15:24:31 ETA= 2.6m tpr=5.57e-01 ETF=15:27:04 mem:586.7MB\n", + "1735/2000 86.8% complete 15:24:38 ETA= 3.0m tpr=6.76e-01 ETF=15:27:37 mem:586.7MB\n", + "1745/2000 87.2% complete 15:24:44 ETA= 2.7m tpr=6.40e-01 ETF=15:27:27 mem:586.9MB\n", + "1755/2000 87.8% complete 15:24:51 ETA= 2.8m tpr=6.88e-01 ETF=15:27:40 mem:586.9MB\n", + "1763/2000 88.2% complete 15:24:56 ETA= 2.6m tpr=6.59e-01 ETF=15:27:32 mem:586.9MB\n", + "1767/2000 88.3% complete 15:25:02 ETA= 5.3m tpr=1.36e+00 ETF=15:30:18 mem:586.9MB\n", + "1776/2000 88.8% complete 15:25:09 ETA= 2.9m tpr=7.71e-01 ETF=15:28:01 mem:586.9MB\n", + "1785/2000 89.2% complete 15:25:14 ETA= 2.1m tpr=5.90e-01 ETF=15:27:21 mem:586.9MB\n", + "1793/2000 89.7% complete 15:25:19 ETA= 2.2m tpr=6.29e-01 ETF=15:27:29 mem:587.1MB\n", + "1801/2000 90.0% complete 15:25:24 ETA= 2.2m tpr=6.59e-01 ETF=15:27:35 mem:587.1MB\n", + "1812/2000 90.6% complete 15:25:29 ETA= 1.5m tpr=4.68e-01 ETF=15:26:57 mem:587.1MB\n", + "1822/2000 91.1% complete 15:25:35 ETA= 1.6m tpr=5.54e-01 ETF=15:27:14 mem:587.4MB\n", + "1830/2000 91.5% complete 15:25:41 ETA= 2.1m tpr=7.49e-01 ETF=15:27:48 mem:587.4MB\n", + "1839/2000 92.0% complete 15:25:47 ETA= 1.7m tpr=6.21e-01 ETF=15:27:27 mem:587.4MB\n", + "1847/2000 92.3% complete 15:25:52 ETA= 1.8m tpr=7.10e-01 ETF=15:27:41 mem:587.4MB\n", + "1855/2000 92.8% complete 15:25:59 ETA= 2.0m tpr=8.17e-01 ETF=15:27:57 mem:587.6MB\n", + "1864/2000 93.2% complete 15:26:05 ETA= 1.5m tpr=6.79e-01 ETF=15:27:37 mem:587.8MB\n", + "1873/2000 93.7% complete 15:26:10 ETA= 1.3m tpr=6.07e-01 ETF=15:27:27 mem:588.0MB\n", + "1884/2000 94.2% complete 15:26:16 ETA= 57.0s tpr=4.91e-01 ETF=15:27:13 mem:588.1MB\n", + "1895/2000 94.8% complete 15:26:21 ETA= 48.7s tpr=4.63e-01 ETF=15:27:09 mem:588.8MB\n", + "1907/2000 95.3% complete 15:26:27 ETA= 45.6s tpr=4.91e-01 ETF=15:27:12 mem:588.9MB\n", + "1916/2000 95.8% complete 15:26:33 ETA= 57.5s tpr=6.84e-01 ETF=15:27:30 mem:589.1MB\n", + "1926/2000 96.3% complete 15:26:39 ETA= 46.5s tpr=6.28e-01 ETF=15:27:26 mem:589.1MB\n", + "1936/2000 96.8% complete 15:26:46 ETA= 42.0s tpr=6.57e-01 ETF=15:27:28 mem:589.1MB\n", + "1946/2000 97.3% complete 15:26:53 ETA= 40.1s tpr=7.42e-01 ETF=15:27:33 mem:589.2MB\n", + "1956/2000 97.8% complete 15:26:59 ETA= 25.1s tpr=5.70e-01 ETF=15:27:24 mem:589.2MB\n", + "1966/2000 98.3% complete 15:27:04 ETA= 19.1s tpr=5.62e-01 ETF=15:27:24 mem:589.5MB\n", + "1976/2000 98.8% complete 15:27:10 ETA= 14.4s tpr=6.01e-01 ETF=15:27:25 mem:589.5MB\n", + "1987/2000 99.3% complete 15:27:16 ETA= 6.4s tpr=4.92e-01 ETF=15:27:22 mem:589.5MB\n", + "1998/2000 99.9% complete 15:27:21 ETA= 1.0s tpr=4.85e-01 ETF=15:27:22 mem:589.6MB\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,382 DEBUG Process-5] --- Process-3 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 3 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.117391, done at 2021-09-10T15:27:22.400722 (total: 794.283331s of which 792.6935975551605s interfacing with binary_c).\n", + "\tRan 499 systems with a total probability of 0.17005450973840136.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,435 DEBUG Process-5] --- Process-3 is finished.\n", + "[2021-09-10 15:27:22,480 DEBUG Process-3] --- Process-1 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 1 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.080367, done at 2021-09-10T15:27:22.505288 (total: 794.424921s of which 793.1943278312683s interfacing with binary_c).\n", + "\tRan 474 systems with a total probability of 0.15740832333567983.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,531 DEBUG Process-3] --- Process-1 is finished.\n", + "[2021-09-10 15:27:22,846 DEBUG Process-2] --- Process-0 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 0 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.077117, done at 2021-09-10T15:27:22.851971 (total: 794.774854s of which 793.4976091384888s interfacing with binary_c).\n", + "\tRan 507 systems with a total probability of 0.16018641159091498.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,872 DEBUG Process-2] --- Process-0 is finished.\n", + "[2021-09-10 15:27:22,976 DEBUG Process-4] --- Process-2 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 2 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.084369, done at 2021-09-10T15:27:22.981706 (total: 794.897337s of which 793.4600214958191s interfacing with binary_c).\n", + "\tRan 520 systems with a total probability of 0.1618606489196724.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,986 DEBUG Process-4] --- Process-2 is finished.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Population-0fa295ee5c76444bace8fd0ee17a3e11 finished! The total probability was: 0.6495098935846686. It took a total of 795.1383104324341s to run 2000 systems on 4 cores\n", + "There were no errors found in this run.\n", + "Done population run!\n" + ] + } + ], + "source": [ + "# set number of threads\n", + "population.set(\n", + " # verbose output is not required \n", + " verbosity=1,\n", + " # set number of threads (i.e. number of CPU cores we use)\n", + " amt_cores=4,\n", + " )\n", + "\n", + "# Evolve the population - this is the slow, number-crunching step\n", + "print(\"Running the population now, this may take a little while...\")\n", + "analytics = population.evolve() \n", + "print(\"Done population run!\")\n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "markdown", + "id": "91ab45c7-7d31-4543-aee4-127ab58e891f", + "metadata": {}, + "source": [ + "After the run is complete, some technical report on the run is returned. I stored that in `analytics`. As we can see below, this dictionary is like a status report of the evolution. Useful for e.g. debugging." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e1f0464b-0424-4022-b34b-5b744bc2c59d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'population_name': '0fa295ee5c76444bace8fd0ee17a3e11', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 0.6495098935846686, 'total_count': 2000, 'start_timestamp': 1631283248.057525, 'end_timestamp': 1631284043.1958354, 'total_mass_run': 41112.220964392276, 'total_probability_weighted_mass_run': 0.6452116023479681, 'zero_prob_stars_skipped': 0}\n" + ] + } + ], + "source": [ + "print(analytics)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "05c6d132-abee-423e-b1a8-2039c8996fbc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[None]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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p9///vdq2bKlJKlFixbavn274VSIBLNnz1aPHj1Uq1YtJSQkaMiQIZoyZYrpWIggWVlZuuWWW+TxeOR2u9WkSRNt27bNdCxEmIKCAj3xxBO66qqrTEdBBPrkk080fPhw1a5dW263W0888YQ6dOhgOhYiSDAYVCgUUllZmQKBgAKBgLxer+lYMYMB0//YvHmz6tatqwceeEBnnXWWbrjhBrndbtOxEGFmzJih8vJyDR061HQURCCPx6Ozzz5bkhQKhTR+/HgNHDjQcCpEgl27dikrK6vycnZ2tnbu3GkwESJNs2bN1LFjR0nShg0b9NFHH6l///5mQyHi3HnnnbrxxhuVkpJiOgoi0MaNGxUMBnX55ZfrrLPO0muvvabU1FTTsRBBkpKS9Pvf/17Dhg1Tv379lJubq86dO5uOFTNcpgOY8vHHH+vBBx884rqGDRtq+fLluv7663X77bfrrbfe0i233KJXXnnFUErY2U89hxo3bqzi4mK99NJLZkIhohztOfTSSy/J5/PplltuUSAQ0JVXXmkoISJJOBz+0XWWZRlIgki3Zs0aXXnllbr55pvVqFEj03EQQd566y3VqVNHPXv21Lvvvms6DiJQMBjU/Pnz9corryghIUHXXHONJk6cqHPPPdd0NESIlStX6p133tGnn36q5ORk/elPf9K//vUv/fa3vzUdLSZY4Z/6jTRGbdq0Seecc44WLFgg6UB/s0ePHlq8eLHhZIgUb731lv75z38qMTFR0oEfcC1bttSrr76qpKQkw+kQKUpKSnT11VerVq1aeuyxx+TxeExHQgSYOHGi5s+fr/vvv1+S9I9//EPhcFjXXXed4WSIJAsWLNANN9yg2267TWeccYbpOIgwv/nNb7R79245nU7t379fpaWlGjlypG677TbT0RAh/va3v6m4uFjjxo2TJL366qtas2aN7r77brPBEDFeeOEF7d27VzfffLMk6bPPPtNrr72m5557znCy2EBF7n80aNBAOTk5lRvJffrpp2rTpo3hVIgk5513nqZPn65JkyZp0qRJkg6cYsBwCSfiz3/+sxo2bKgnn3yS4RKOW69evTRnzhzl5+errKxM06ZNU79+/UzHQgTZvn27rr32Wj322GMMl/CLvPjii/rggw80adIk3XDDDTrttNMYLuGEnHrqqZo1a5YKCwsVDAb15Zdf8noMJ6Rly5aaPXu2SktLFQ6HNXPmTLVr1850rJgRsxW5oxk/frzuuusuPfroo0pKStJDDz1kOhKAGLJ8+XLNmDFDTZs21ciRIyUd2Evn+eefNxsMtpeTk6Mbb7xRF198sfx+v0aPHq327dubjoUI8q9//UsVFRVH/O4zduxYnX/++QZTAYglHTp00G9/+1tdcMEF8vv96t27t0aNGmU6FiJInz59tHz5cp177rlyu91q166drrjiCtOxYgYVOQAAAAAAAJwUKnIAAAAAAAA4KQyYAAAAAAAAcFIYMAEAAAAAAOCkMGACAAAAAADASWHABAAAAAAAgJPCgAkAAAAAAAAnhQETAAAAAAAATgoDJgAAEPFOO+00zZ4923QMAACAmMWACQAAoIrl5+erRYsW2rlzp+koAAAANYIBEwAAQBV47LHH9OWXX0qSVq5cqfT0dOXk5BhOdcANN9yg1atXV17esmWLOnXq9Ivuq6SkRL/97W9VXl5eVfEAAEAUYMAEAACiyrp163TRRRepa9euOuOMMzRjxozKzy1btkwjR45Up06ddMMNN+gPf/iDnnjiiZN+zEWLFmnt2rXq27evJGnFihVq2bLlSd9vVfD5fNq4caOaN29eJfeXmJioM888U08++WSV3B8AAIgODJgAAEDU8Pv9uuqqq9S7d2/Nnj1b48aN05/+9CetX79ePp9P1113nc455xzNmzdPZ555pqZPn14lj/vUU09pzJgxlZftNGCaPXu2evbsWaX3OWzYME2ePFl79uyp0vsFAACRiwETAACIGosXL1ZpaamuuOIKeTwe9ezZU6eeeqo+/PBDLV68WIFAQBdffLHcbrcGDx6sdu3aVX5tUVGRRo8erU6dOh1RJ3v00Ud1wQUX6M9//rP8fv+PHrOwsFALFixQ7969K69buXKlWrVq9aPbvvHGG7rooosq/7Rv315Lliyp/PzYsWM1fvx4SQdqbC1atNDXX38t6cBKpG7dumnChAmSpOLiYl111VW66KKLNGbMGH3++ec/+T2ZMWOGBg4ceCLfxmPyer3q3LnzUR8TAADEHpfpAAAAAFVl165dql27thyOw++h1a1bVzt37tSuXbuUk5Mjy7IqP1enTp3Kj+Pi4vTcc8/pkUceqbxu5cqV2rlzp1577TU988wzmjp1qs4888wjHnPjxo3KysqSx+ORJFVUVOj7779X69atf5RvzJgxlSudZs6cqYkTJ6p9+/aSpO3btysnJ0fz5s2rvH3btm31ySefqEePHpozZ44aNmxY+blJkyapb9++uvDCCxUOh1VUVPSjxwuFQlq0aJHuvvvu4/r+HbJz5069/PLLCgQCCofDatWqlc4555wjbtOgQQN9//33J3S/AAAgerGCCQAARI3s7Gzt2LFDoVCo8rpDg5usrCzt3LlT4XD4iM8d4na7lZ6efsT9LVy4UH369JEk9e3bVwsXLvzRYzocDgWDwcrLq1evlsvlUl5e3lFz5ufn68knn9Q999xTed3UqVM1YsQINW7cWOvWrZMk5ebmatu2bQqHw/rkk080ePDgytt7vV4tWrRIe/bskWVZSklJ+dHjLF68WG3btpXT6Txqlh8KhUJ6//33deONN+rWW2/VbbfdpiZNmuizzz474nbBYPCE7hcAAEQ3BkwAACBqtG/fXnFxcXrhhRfk9/s1d+5czZw5U8OHD1fHjh3ldDo1YcIEBQIBTZ8+Xd99993P3l9hYaGSkpIkScnJydq/f/+PblO/fn3l5+eroqJC0oFVT02aNFEgEFBFRYUqKirk8/mO+Jq7775bv//9748YaM2aNUv9+vXTmWeeqSlTplRe36lTJ33zzTfKz89XZmZm5fVnn3228vLydPnll2vMmDFav379j7JNnz5dp59++nF85w5bsmSJRo4cKZfLpY8//lhbt25V+/btVVZWdsTttmzZ8rNDNAAAEFsYMAEAgKjh8Xj07LPP6osvvlCPHj10zz336JFHHlGTJk3k8Xj01FNP6e2331a3bt30/vvva8CAAZXVtp+SnJys4uJiSQf2aEpNTf3RbVJSUtSlS5fKvZJWrFihZcuWqX379pV/hg8fXnn79957T8nJyTrttNMqr9uxY4fWrFmjq6++Ws8888wRexsNHjxYDz74oE455ZQjHtftduuaa67RpEmTdMMNN+ipp576UbbZs2dXrsD6odLSUnXq1OmIP6tWrZLT6axcAfbss89q/vz5knTEaiWfz6dvv/32iH8HAAAQ29iDCQAARLyZM2dWftysWbPKjbB/qF27dpo0aVLl5fPOO0+nnnrqUe+3c+fOevHFFzVy5EjNmjVLnTt3/snbXXvttXr22WfVv39/3Xnnnbrzzjt/8nbbt2/XSy+99KN8U6ZM0a233qqhQ4dKOrDC6dCqp0aNGqlLly4aOnSoZs+eXfk1W7durdz7KSMj44jq3yETJ078yRz16tXTqlWrfvJzfr9fL7/8si655JLK79V33313xIDpgw8+0IgRI36ylgcAAGITAyYAABAz5s2bp7y8PKWlpWny5MlatWqV+vbtW/n53/3ud1qxYoW+//57jRkzRueee64yMjJ0wQUXqE6dOrrssst+8n47d+6svLw8ffHFF+rXr99RH/+f//ynCgsLdfXVV1ded80112jatGn6xz/+UXld9+7d9fHHH1deHjdu3I/ua/Xq1brxxhvl9XoVDoePOtQ6UW63W8OGDdPjjz9euZKpWbNmGj16tKQDp9d98MEHlafdAQAASJIV/qm3uwAAAKLQG2+8oSeffFJlZWWqV6+e/vjHP2rAgAGmYwEAAEQ8BkwAAAAAAAA4KWzyDQAAAAAAgJPCgAkAAAAAAAAnhQETAAAAAAAATgoDJgAAAAAAAJwUBkwAAAAAAAA4KQyYAAAAAAAAcFIYMAEAAAAAAOCkMGACAAAAAADASfl/6hNZaplFmREAAAAASUVORK5CYII=\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# make a plot of the luminosity distribution using Seaborn and Pandas\n", + "import seaborn as sns\n", + "import pandas as pd\n", + "from binarycpython.utils.functions import pad_output_distribution\n", + "\n", + "# set the figure size (for a Jupyter notebook in a web browser) \n", + "sns.set( rc = {'figure.figsize':(20,10)} )\n", + "\n", + "titles = { 0 : \"Primary\",\n", + " 1 : \"Secondary\",\n", + " 2 : \"Unresolved\" }\n", + "\n", + "# choose to plot the \n", + "# PRIMARY, SECONDARY or UNRESOLVED\n", + "nstar = UNRESOLVED\n", + "\n", + "plots = {}\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "for n in range(0,3):\n", + " pad_output_distribution(population.grid_results['luminosity distribution'][n],\n", + " binwidth['luminosity'])\n", + " plots[titles[n] + ' ZAMS luminosity distribution'] = population.grid_results['luminosity distribution'][n]\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict(plots)\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e7541ebf-fe9a-4fb0-a88e-bb318d06f9eb", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/build/html/_sources/notebook_luminosity_function_single.ipynb.txt b/docs/build/html/_sources/notebook_luminosity_function_single.ipynb.txt new file mode 100644 index 0000000000000000000000000000000000000000..fb971b34a58887a38066f2dbb3d056ff4c5dc5b6 --- /dev/null +++ b/docs/build/html/_sources/notebook_luminosity_function_single.ipynb.txt @@ -0,0 +1,716 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bbbaafbb-fd7d-4b73-a970-93506ba35d71", + "metadata": { + "tags": [] + }, + "source": [ + "# Example use case: Zero-age stellar luminosity function\n", + "\n", + "In this notebook we compute the luminosity function of the zero-age main-sequence by running a population of single stars using binary_c. \n", + "\n", + "We start by loading in some standard Python modules and the binary_c module.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bf6b8673-a2b5-4b50-ad1b-e90671f57470", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import math\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from binarycpython.utils.functions import temp_dir\n", + "from binarycpython.utils.grid import Population\n", + "\n", + "TMP_DIR = temp_dir(\"notebooks\", \"notebook_luminosity\")\n", + "\n", + "# help(Population) # Uncomment this line to see the public functions of this object" + ] + }, + { + "cell_type": "markdown", + "id": "f268eff3-4e08-4f6b-8b59-f22dba4d2074", + "metadata": {}, + "source": [ + "## Setting up the Population object\n", + "To set up and configure the population object we need to make a new instance of the `Population` object and configure it with the `.set()` function.\n", + "\n", + "In our case, we only need to set the maximum evolution time to something short, because we care only about zero-age main sequence stars which have, by definition, age zero." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "79ab50b7-591f-4883-af09-116d1835a751", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "adding: tmp_dir=/tmp/binary_c_python/notebooks/notebook_luminosity to grid_options\n", + "adding: max_evolution_time=0.1 to BSE_options\n", + "verbosity is 1\n" + ] + } + ], + "source": [ + "# Create population object\n", + "population = Population()\n", + "\n", + "# If you want verbosity, set this before other things\n", + "population.set(verbosity=1)\n", + "\n", + "# Setting values can be done via .set(<parameter_name>=<value>)\n", + "# Values that are known to be binary_c_parameters are loaded into bse_options.\n", + "# Those that are present in the default grid_options are set in grid_options\n", + "# All other values that you set are put in a custom_options dict\n", + "population.set(\n", + " # binary_c physics options\n", + " max_evolution_time=0.1, # maximum stellar evolution time in Myr\n", + " tmp_dir=TMP_DIR,\n", + ")\n", + "\n", + "# We can access the options through \n", + "print(\"verbosity is\", population.grid_options['verbosity'])" + ] + }, + { + "cell_type": "markdown", + "id": "f9a65554-36ab-4a04-96ca-9f1422c307fd", + "metadata": {}, + "source": [ + "## Adding grid variables\n", + "The main purpose of the Population object is to handle the population synthesis side of running a set of stars. The main method to do this with binarycpython, as is the case with Perl binarygrid, is to use grid variables. These are loops over a predefined range of values, where a probability will be assigned to the systems based on the chosen probability distributions.\n", + "\n", + "Usually we use either 1 mass grid variable, or a trio of mass, mass ratio and period (other notebooks cover these examples). We can, however, also add grid sampling for e.g. eccentricity, metallicity or other parameters. \n", + "\n", + "To add a grid variable to the population object we use `population.add_grid_variable`" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "68c84521-9ae8-4020-af7a-5334173db969", + "metadata": {}, + "outputs": [], + "source": [ + "# help(population.add_grid_variable)" + ] + }, + { + "cell_type": "markdown", + "id": "bd75cebe-2152-4025-b680-dc020b80889b", + "metadata": {}, + "source": [ + "All the distribution functions that we can use are stored in the `binarycpython.utils.distribution_functions` or `binarycpython/utils/distribution_functions.py` on git. If you uncomment the help statement below you can see which functions are available now:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "048db541-3e92-4c5d-a25c-9c5a34b9c857", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "import binarycpython.utils.distribution_functions\n", + "# help(binarycpython.utils.distribution_functions)" + ] + }, + { + "cell_type": "markdown", + "id": "2a9104fc-4136-4e53-8604-f24ad52fbe56", + "metadata": {}, + "source": [ + "First let us set up some global variables that will be useful throughout. \n", + "* The resolution is the number of stars we simulate in our model population.\n", + "* The massrange is a list of the min and max masses\n", + "* The total_probability is the theoretical integral of a probability density function, i.e. 1.0.\n", + "* The binwidth sets the resolution of the final distribution. If set to 0.5, the bins in log*L* are 0.5dex wide." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aba3fe4e-18f2-4bb9-8e5c-4c6007ab038b", + "metadata": {}, + "outputs": [], + "source": [ + "# Set resolution and mass range that we simulate\n", + "resolution = {\"M_1\": 40} # start with resolution = 10, and increase later if you want \"more accurate\" data\n", + "massrange = (0.07, 100.0) # we work with stars of mass 0.07 to 100 Msun\n", + "total_probability = 1.0 # theoretical integral of the mass probability density function over all masses \n", + "# distribution binwidths : \n", + "# (log10) luminosity distribution\n", + "binwidth = { 'luminosity' : 0.5 }" + ] + }, + { + "cell_type": "markdown", + "id": "1b3a007b-5c17-42a7-a981-7e268e6f545c", + "metadata": {}, + "source": [ + "The next cell contains an example of adding the mass grid variable, sampling the phase space in linear mass *M*_1." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "47979841-2c26-4b26-8945-603d013dc93a", + "metadata": {}, + "outputs": [], + "source": [ + "# Mass\n", + "population = Population()\n", + "population.set(\n", + " tmp_dir=TMP_DIR,\n", + ")\n", + "population.add_grid_variable(\n", + " name=\"M_1\",\n", + " longname=\"Primary mass\",\n", + " valuerange=massrange,\n", + " resolution=\"{res}\".format(res = resolution[\"M_1\"]),\n", + " spacingfunc=\"const({min}, {max}, {res})\".format(min = massrange[0], max = massrange[1], res = resolution[\"M_1\"]),\n", + " probdist=\"{probtot}/({max} - {min})\".format(probtot = total_probability, min = massrange[0], max = massrange[1]), # dprob/dm1 : all stars are equally likely so this is 1.0 / (Mmax - Mmin)\n", + " dphasevol=\"dM_1\",\n", + " parameter_name=\"M_1\",\n", + " condition=\"\", # Impose a condition on this grid variable. Mostly for a check for yourself\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "163f13ae-fec1-4ee8-b9d4-c1b75c19ff39", + "metadata": {}, + "source": [ + "## Setting logging and handling the output\n", + "By default, binary_c will not output anything (except for 'SINGLE STAR LIFETIME'). It is up to us to determine what will be printed. We can either do that by hardcoding the print statements into `binary_c` (see documentation binary_c) or we can use the custom logging functionality of binarycpython (see notebook `notebook_custom_logging.ipynb`), which is faster to set up and requires no recompilation of binary_c, but is somewhat more limited in its functionality. For our current purposes, it works perfectly well.\n", + "\n", + "After configuring what will be printed, we need to make a function to parse the output. This can be done by setting the parse_function parameter in the population object (see also notebook `notebook_individual_systems.ipynb`). \n", + "\n", + "In the code below we will set up both the custom logging and a parse function to handle that output." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "0c986215-93b1-4e30-ad79-f7c397e9ff7d", + "metadata": {}, + "outputs": [], + "source": [ + "# Create custom logging statement\n", + "#\n", + "# we check that the model number is zero, i.e. we're on the first timestep (stars are born on the ZAMS)\n", + "# we make sure that the stellar type is <= MAIN_SEQUENCE, i.e. the star is a main-sequence star\n", + "# we also check that the time is 0.0 (this is not strictly required, but good to show how it is done)\n", + "#\n", + "# The Printf statement does the outputting: note that the header string is ZERO_AGE_MAIN_SEQUENCE_STAR\n", + "\n", + "custom_logging_statement = \"\"\"\n", + "if(stardata->model.model_number == 0 &&\n", + " stardata->star[0].stellar_type <= MAIN_SEQUENCE &&\n", + " stardata->model.time == 0)\n", + "{\n", + " /* Note that we use Printf - with a capital P! */\n", + " Printf(\"ZERO_AGE_MAIN_SEQUENCE_STAR %30.12e %g %g %g %g\\\\n\",\n", + " stardata->model.time, // 1\n", + " stardata->common.zero_age.mass[0], // 2\n", + " stardata->star[0].mass, // 3\n", + " stardata->star[0].luminosity, // 4\n", + " stardata->model.probability // 5\n", + " );\n", + "};\n", + "\"\"\"\n", + "\n", + "population.set(\n", + " C_logging_code=custom_logging_statement\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "ae1f1f0c-1f8b-42d8-b051-cbf8c6b51514", + "metadata": {}, + "source": [ + "The parse function must now catch lines that start with \"ZERO_AGE_MAIN_SEQUENCE_STAR\" and process the associated data." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "fd197154-a8ce-4865-8929-008d3483101a", + "metadata": {}, + "outputs": [], + "source": [ + "# import the bin_data function so we can construct finite-resolution probability distributions\n", + "# import the datalinedict to make a dictionary from each line of data from binary_c\n", + "from binarycpython.utils.functions import bin_data,datalinedict\n", + "\n", + "def parse_function(self, output):\n", + " \"\"\"\n", + " Example parse function\n", + " \"\"\"\n", + " \n", + " # list of the data items\n", + " parameters = [\"header\", \"time\", \"zams_mass\", \"mass\", \"luminosity\", \"probability\"]\n", + " \n", + " # Loop over the output.\n", + " for line in output.splitlines():\n", + " # obtain the line of data in dictionary form \n", + " linedata = datalinedict(line,parameters)\n", + " \n", + " # Check the header and act accordingly\n", + " if linedata['header'] == \"ZERO_AGE_MAIN_SEQUENCE_STAR\":\n", + " \n", + " # bin the log10(luminosity) to the nearest 0.1dex\n", + " binned_log_luminosity = bin_data(math.log10(linedata['luminosity']),\n", + " binwidth['luminosity'])\n", + " \n", + " # append the data to the results_dictionary \n", + " self.grid_results['luminosity distribution'][binned_log_luminosity] += linedata['probability'] \n", + " \n", + " #print (self.grid_results)\n", + " \n", + " # verbose reporting\n", + " #print(\"parse out results_dictionary=\",self.grid_results)\n", + " \n", + "# Add the parsing function\n", + "population.set(\n", + " parse_function=parse_function,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "91509ce5-ffe7-4937-aa87-6d7baac9ac04", + "metadata": {}, + "source": [ + "## Evolving the grid\n", + "Now that we configured all the main parts of the population object, we can actually run the population! Doing this is straightforward: `population.evolve()`\n", + "\n", + "This will start up the processing of all the systems. We can control how many cores are used by settings `amt_cores`. By setting the `verbosity` of the population object to a higher value we can get a lot of verbose information about the run, but for now we will set it to 0.\n", + "\n", + "There are many grid_options that can lead to different behaviour of the evolution of the grid. Please do have a look at those: [grid options docs](https://ri0005.pages.surrey.ac.uk/binary_c-python/grid_options_descriptions.html), and try " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8ea376c1-1e92-45af-8cab-9d7fdca564eb", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Grid has handled 40 stars\n", + "with a total probability of 1.0000000000000004\n", + "Total starcount for this run will be: 40\n", + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Population-08f8230453084e4ca6a2391d45ce658b finished! The total probability was: 1.0000000000000002. It took a total of 1.5262682437896729s to run 40 systems on 2 cores\n", + "There were no errors found in this run.\n", + "OrderedDict([('luminosity distribution', OrderedDict([(2.25, 0.025), (3.75, 0.05), (4.25, 0.05), (0.25, 0.025), (3.25, 0.025), (5.25, 0.2), (4.75, 0.1), (5.75, 0.39999999999999997), (6.25, 0.125)]))])\n" + ] + } + ], + "source": [ + "# set number of threads\n", + "population.set(\n", + " # verbose output is not required \n", + " verbosity=0,\n", + " # set number of threads (i.e. number of CPU cores we use)\n", + " amt_cores=2,\n", + " )\n", + "\n", + "# Evolve the population - this is the slow, number-crunching step\n", + "analytics = population.evolve() \n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "markdown", + "id": "91ab45c7-7d31-4543-aee4-127ab58e891f", + "metadata": {}, + "source": [ + "After the run is complete, some technical report on the run is returned. I stored that in `analytics`. As we can see below, this dictionary is like a status report of the evolution. Useful for e.g. debugging." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e1f0464b-0424-4022-b34b-5b744bc2c59d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'population_name': '08f8230453084e4ca6a2391d45ce658b', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 1.0000000000000002, 'total_count': 40, 'start_timestamp': 1631124829.303065, 'end_timestamp': 1631124830.8293333, 'total_mass_run': 2001.4, 'total_probability_weighted_mass_run': 50.035000000000004, 'zero_prob_stars_skipped': 0}\n" + ] + } + ], + "source": [ + "print(analytics)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "05c6d132-abee-423e-b1a8-2039c8996fbc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[None]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJcAAAJWCAYAAADlbWbDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABhMklEQVR4nO3dd3jV9cH//9c5J3tB5gkQRiYQlA1hyA6ooOJAWbd22arV27vetnbI3dr2tq3a8VN737XTfltFRBQVdwAB2XvIygACYWRD9jrn8/vDmt4UMBCSvM94Pq7L6zLnnJzzJB5j8vJ8PsdmWZYlAAAAAAAAoB3spgMAAAAAAADgvRiXAAAAAAAA0G6MSwAAAAAAAGg3xiUAAAAAAAC0G+MSAAAAAAAA2o1xCQAAAAAAAO3GuAQAAAAAAIB2CzAd0FkqK2vldlumM3xObGyEystrTGfAS/H8wdXiOYSrxXMIV4vnEK4WzyFcLZ5DuFrtfQ7Z7TZFR4df9DqfHZfcbotxqZPwdcXV4PmDq8VzCFeL5xCuFs8hXC2eQ7haPIdwtTr6OcRhcQAAAAAAAGg3xiUAAAAAAAC0m88eFgcAAAAAQFdyuVpUWVmqlpamTnuMkhK73G53p90/fF9bz6GAgCBFR8fL4bj8yYhxCQAAAACADlBZWaqQkDCFhyfKZrN1ymMEBNjV0sK4hPb7oueQZVmqra1SZWWp4uJ6XPZ9clgcAAAAAAAdoKWlSeHhUZ02LAGdzWazKTw86opffce4BAAAAABAB2FYgrdrz3OYcQkAAAAAAADtxrgEAAAAAICP2bNnl7785QXn/TVx4mh9+OF7rbd5/fVXNXnyGJWXl533udddN1L/+Z8PnXfZ2bNnNWlSlv78599Lks6cOaPHHntEX/rSPN199136r//6niorKy7o+POff9/6OVfjT396QevXr73q+/ncm28u05tvLpMk/exnP9aZM6fbdT8PPfQN7dy5XYcOHdAvfvHTS97u1KmT+vnPf9Jmy3XXjbyix1+/fp2WLHnpgvvpapzQGwAAAAAAHzNkyDD99a+LWz9+9dWX9cEH72ry5Gmtl7377gpdd90kvfPOW/rSl7523uefOHFCVVVVioqKkiStWbNKkZFRrdc/88zPdMMNMzV9+g2SpL///UU988zP9bOfPdMpf557772/Q+/v1lvntP79zp3b9ZWvfP2q7m/AgEx973uZl7z+zJnTOnmyqM2WK3X48MEOuZ+rxbgEAAAAAIAP27Nnl/72t7/oD3/4fwoODpYk5efnqarqnB577HEtWvSY7r77K7Lb/3lw03XXTdQnn6zRrFm3SPpsXJo4cXLr9RUVZWpsbGj9+I477tLBgwe+sOO660Zq/frtkqT33luhXbt26PHHn9CcOTdr6tTp2rhxvRwOh+6770EtWfKSiopO6MEHv6Vp06brySef0LBhIzRs2Aj94AffVkpKqnJzDysmJlY//ekvFBXVTRs2fKI//vF3siy3evbspe985weKiYnVb3/7/2nbti1yOOy67rpJ+upXv9H6aqqgoGCVlZXqO9/5D9177/1asuRlvfDCXyRJ77//jvbv36dvf/v7rX+GpqYmPfXUT3Xo0EElJvbUuXNnJX02UP3lL3/Qb3/7By1Z8pLef/9d2e02DRw4SI899rieffaXOnXqpH71q6c0Zco0/e53z8nlcislJVU9evSUJH3ta/dJkp566kkdPLhf3bp11/e//0MlJibqoYe+oa9+9RsaPnykTp8+pX//9/v0zDPP6q233pAkJSb2aH311de+dt8lvxZz5tysG2+cpc2bN6q+vkGLFv1YAwYMvOzn0qUwLgEAAAAA0ME27Dut9Xvbd6jVF7HZpPHX9tD4ay/vbeIrKyv0xBOP67vf/S/16pXUevl7772tqVOzNWDAQDkcDm3ZslFjx17Xev3Uqdn629/+olmzblF5eZksS4qNjWu9/r77HtJPfvJf+vOf/6ARI0ZpzJhxmjp1erv/XHFx8XrppaX62c9+rJde+quee+4F7du3R8899ytNm3b+/ebn5+n73/+hMjIG6PHHv6OPPnpf06bN0DPP/Ey/+92f1aNHTy1e/Df9+tdP66GHvqXNmzfqpZeWqrGxUU899d9qbGxsva+77/6y3nrrdT3zzLNKTOyh//mf53TyZJF69UrS+++/o/vuO//wwGXLXpUkvfzyMp04cVxf+tL8865vaWnRSy/9VW+++YHsdrt+/eunVFpaov/4j2/rL3/5gx599LvauXO7Tpw4rmXL3lFERMQFhw0OGzZc3/3u43rjjdf07LO/1M9//suLfs2Sk1M0e/btkqRZs25pvZ/KyoqLfi3++7+fkiR169ZNf/zj37Rs2RL9/e9/0ZNPXv2rzTjnEgAAAAAAPsjtduuJJxYpO/v681511NLSoo8++kDZ2ddLkqZOnd76CpjPXXPNYB0/XqiamhqtWbNKU6ZMPe/6MWPGafny9/Td7y5S9+7R+t//fU6PP/6ddreOGTNOkuR0Jmro0OEKCAhQYmIPVVdXX3Db6OgYZWQMkCSlpKSpqqpKBw7s18CBg1pfBXTLLbdrx45tiouLV3BwsB544KtaunSxvv71B1pfvfWvbDabbrxxlj788D2dOXNGFRUVGjTomvNus3v3Dk2Z8tnY1bt3H1177eDzrg8ICNA11wzWvffeoxdf/KNuv/1OxccnXPBYvXv3VURExAWXBwcHa8aMGyVJ119/o3bt2vGFX7eLudTX4nOff60//9p1BF65BAAAAABAB7uSVxddiYAAu1pa3Jd12xdf/KNaWpp1330Pnnf5hg2fqLq6Sj/4wWdjUEtLiyorK1RSUqyEBKekz4aW8eMnaP36tVq79mP9+Mc/1xtvLJUkVVWd01//+ic9/PCjGjNmnMaMGacvf/lezZ59vSorKxUdHX3JJsuyZLPZ1NLSct7lgYGBrX/vcDi+8M8VFBR0wX1alvuCy1wulwICAvSHP/xVu3fv1KZNG3T//V/R88//4ZL3PXPmzXr00X9XUFCQbrhh5kVuYTvvsS7W+vOf/0r79+/T5s0b9eijD+uHP7zwRN+XGrjs9n/en2V9NlZJn/3z+Ny/fu3+1aW+Fp8LCgo+77qOwCuXAAAAAADwMdu2bdaKFW/qxz/+eetA8bn33ntbX//6A1q2bIWWLVuhN998X9deO0QrVrx53u2mTp2uN954TQEBgecNRuHhEVq/fp3ef/+d1stOnixSTExs6wnAL6Z79+46erRAlmVp/fp1HfMH/YfMzGt04MA+nT59SpL09ttvaPjwEcrNPaSHHvqGhgwZpoce+pb69UvR8eOF532uw+FoHV8SE3soPj5Bb775um64YdYFjzNy5Gjl5Hwot9utM2dOa9++veddX1lZqYUL5yglJU333nu/Ro3KUkFBnhyOgPMGnkupr69rfVe8d999SyNHjpYkdev22ddOkj75ZM1F29v6WnQmXrkEAAAAAICP+fvf/yqXy6Vvf/vh8y6fOHGydu7cru9//0fnXT5v3r/pV7/6hb785XtbLxs06FqVl5fplltuPe+2DodDv/zls3r++d/oT396QSEhIYqLi9dTT/36C191dP/9D+mxxx5RTEysBg8e2noy7I4QExOr73zncf3gB99Wc3OLEhMT9b3v/VBxcXG65prBuueeuQoJCVF6en+NGTPuvHdZGzdugr797f/Qr3/9vHr27KXs7Blas2a14uLiL3ic22+/U0ePFmjhwjlKTOyhlJTU866Pjo7W7Nm36+tfv0fBwSFyOhM1c+bNam5uVk1NtX760//SrFmzL/nniIiI1Lp1a/THP76g+Ph4/eAHn/1zWrjwHj355BN69923NWHC5NbbDx06XE8++YRiYmLa/Fp0JpvVUa+B8jDl5TVyu33yj2ZUfHykSksvPOYVuBw8f3C1eA7havEcwtXiOYSrxXPIt505U6jExL6d+hhXclgcrlxLS4t++tMfaurUbE2aNLXtT/BCl/Mcuthz2W63KTb2wvNESRwWBwAAAAAAIMuydOutN8put5/36iC0jcPiAAAAAACA37PZbHrnnRzTGV6JVy4BAAAAAACg3RiXAAAAAADoID56WmP4kfY8hxmXAAAAAAC4iNPltaqsbrzs2wcEBKm2toqBCV7LsizV1lYpICDoij6Pcy4BAAAAAPAvquqa9OTfdqhvYqS+M3/YZX1OdHS8KitLVVNzttO67Ha73G7eLQ7t19ZzKCAgSNHR8Vd0n4xLAAAAAAD8i+XrjqiusUWHCitVWd2o6MjgNj/H4QhQXFyPTu2Kj49UaWl1pz4GfFtnPIc4LA4AAAAAgP+j8Ey11u0+paFpcbIkbTtUYjoJ8GiMSwAAAAAA/INlWXo5J1eRYYG696ZM9XVGasuBM6azAI/GuAQAAAAAwD9s3l+s/JPndMekVIWFBCgr06mjp6tVXFlnOg3wWIxLAAAAAABIqm9s0dI1+eqXGKnxgz87d9LogQmySdpyoNhsHODBGJcAAAAAAJD0zqZjOlfTpIXTM2S32SRJMVEhSu/dXVsOFMuyLMOFgGdiXAIAAAAA+L3iijp9tPWExl+TqNRe3c67bkymU6fL63SipMZQHeDZGJcAAAAAAH7vlVV5Cgyw647JqRdcN3JAghx2G4fGAZfAuAQAAAAA8Gt78su0t6Bct4xPVveI4AuujwgN1KDkGG05WCw3h8YBF2BcAgAAAAD4reYWt15ZlafEmDBlj0y65O2yMp2qqGpUftG5LqwDvAPjEgAAAADAb+VsP6GSynrNz05XgOPSvyIPS49TUICdQ+OAi2BcAgAAAAD4pcrqRq3YcExD0+J0bUrsF942JChAQ9PjtO1QiVpc7i4qBLwD4xIAAAAAwC8tW5Mvl9utedPSLuv2WZlO1dQ362BhZSeXAd6FcQkAAAAA4Hfyis5q0/5iXT+6jxKiwy7rc65JjlVYcIA27+fQOOD/YlwCAAAAAPgVt9vS4pw8RUcGa9bYvpf9eYEBdo3oH6+deaVqanZ1YiHgXRiXAAAAAAB+5ZO9p1RYXK27pqQpJCjgij53TKZTjU0u7Sko76Q6wPswLgEAAAAA/EZtQ7NeX3tEGUndNHpgwhV/fv8+0eoWEcS7xgH/B+MSAAAAAMBvvPnJUdU2NGvB9AzZbLYr/ny73abRA5zaW1CmuobmTigEvA/jEgAAAADALxSV1OjjnSc1eWgv9XFGtvt+sjKdanFZ2pFb2oF1gPdiXAIAAAAA+DzLsrR4Za5Cgx26bWLKVd1Xco9IJXQP5dA44B8YlwAAAAAAPm/H4VIdOn5Wt01MUURo4FXdl81m0+hMpw4WVupcTWMHFQLei3EJAAAAAODTGptdenV1nnonRGjy0F4dcp9jMp2yLGnroZIOuT/AmzEuAQAAAAB82vubC1Ve1agF2emy26/8JN4X0zMuXL0TIrSVQ+MAxiUAAAAAgO8qPVuv9zYf1+iBCerfJ7pD73tMplMFp6pUcra+Q+8X8DaMSwAAAAAAn7V0db7sdumuKWkdft+jBzoliVcvwe8xLgEAAAAAfNL+YxXakVuqWWP7KSYqpMPvP7ZbiNKTuvGucfB7jEsAAAAAAJ/T4nLrlZV5iu8eohtG9+60x8nKdOpkWa2KSmo67TEAT8e4BAAAAADwOR/vPKlTZbWaNy1dgQGOTnuckQMSZLfZtJlXL8GPMS4BAAAAAHxKVW2T3lx/VNckx2hoWlynPlZUWJAyk6O15UCxLMvq1McCPBXjEgAAAADAp7y+tkBNzS7Nz06XzWbr9Mcbk+lUeVWDCk5WdfpjAZ6IcQkAAAAA4DOOnq7S+r2nlT0yST1iw7vkMYelxyswwM6JveG3GJcAAAAAAD7BbVlanJOryPAg3TI+ucseNzQ4QEPS4rTtULFcbneXPS7gKRiXAAAAAAA+YdOnZ1RwqkpzJqUqNDigSx87a6BTVXXNOlhY2aWPC3gCxiUAAAAAgNerb2zRsjUFSukZpXHXJnb54w9OjVFocIC27OfQOPgfxiUAAAAAgNdbseGYztU2aeH0DNm74CTe/yowwKERGfHakVuqpmZXlz8+YBLjEgAAAADAq50ur1XO9hO6bnAPJfeIMtaRNciphiaX9haUG2sATGBcAgAAAAB4Lcuy9MrKPAUF2nXHpFSjLQP7RCsqPEhbDnJoHPwL4xIAAAAAwGvtyS/Xp0crNHt8srqFBxltsdttGj0gQXvyy1XX0GK0BehKjEsAAAAAAK/U3OLSK6ty1SM2TFNHJJnOkSRlZTrV4nJrV16p6RSgyzAuAQAAAAC80kfbTqj0bIMWZGcowOEZv96m9IxSXLcQbT7AoXHwH57xbx8AAAAAAFegoqpBKzYe0/CMeA1KjjGd08pmsykr06mDxyp1rrbJdA7QJRiXAAAAAABe57U1BXK7pblT00ynXGBMplNuy9L2QyWmU4AuwbgEAAAAAPAquSfOasuBYt2Y1Ufx3UNN51ygV3yEkuLDtYVD4+AnGJcAAAAAAF7D7bb0ck6uYqKCNXNsX9M5l5SV6VT+yXMqO1tvOgXodIxLAAAAAACvsXbPKZ0oqdFdU9IUHOgwnXNJWQOdkqQtB3n1Enwf4xIAAAAAwCvU1DfrjbUFGtCnu0YNSDCd84XiuocqrVc3bTnAeZfg+xiXAAAAAABe4c1PjqiusUULsjNks9lM57QpK9OpotIanSytMZ0CdCrGJQAAAACAxzteXK2Pd53U1GFJSkqIMJ1zWUYOSJDNxqFx8H2MSwAAAAAAj2ZZlhavzFN4SKBmT0g2nXPZuoUHKbNfjLYcKJZlWaZzgE7DuAQAAAAA8GjbDpUo98RZ3T4xRRGhgaZzrkjWQKdKzzboyOkq0ylAp2FcAgAAAAB4rMYml15dna8+CRGaOKSn6ZwrNjwjXgEOu7bs59A4+C7GJQAAAACAx3p3c6Eqqxu1YHqG7HbPP4n3vwoLCdCQ1FhtPVQit5tD4+CbGJcAAAAAAB6p5Gy9PthyXGMGOZXRu7vpnHbLynSqqrZJB49Xmk4BOgXjEgAAAADAI726Kk8Ou013Tk4znXJVBqfGKiTIoS0HODQOvolxCQAAAADgcT49Uq5deWW6aVxfRUcGm865KkGBDo3IiNeOw6VqbnGbzgE6HOMSAAAAAMCjtLjcWrwyTwndQzVjVB/TOR0iK9Op+sYW7TtSbjoF6HCMSwAAAAAAj7JqR5HOVNRpXna6AgN849fWgf2iFRkWqM0cGgcf5Bv/lgIAAAAAfMK5mka9tf6ork2J1ZDUWNM5HcZht2vUgATtyS9TfWOL6RygQzEuAQAAAAA8xutrj6i5xa352emy2WymczrUmMxENbe4tSuv1HQK0KEYlwAAAAAAHuHIqSqt33daM0b1VmJMmOmcDpfaK0qxUSHacqDEdArQoRiXAAAAAADGuS1LL+ccVrfwIN00rp/pnE5hs9mUlenU/qMVqqprMp0DdBjGJQAAAACAcRv2ndbR09W6c0qqQoMDTOd0mqxMp9yWpR2HePUSfAfjEgAAAADAqLqGFr2+pkCpvaI0ZlCi6ZxOlRQfrl5x4bxrHHwK4xIAAAAAwKi3NxxVdV2zFk7PkN3HTuL9r2w2m0ZnOpVXdE7l5xpM5wAdgnEJAAAAAGDMqbJardpRpAlDeqpfYpTpnC6RlemUJG09yKuX4BsYlwAAAAAARliWpVdW5Sko0KHbJ6WYzukyCd1DldIzSls4NA4+gnEJAAAAAGDErrwy7T9aoVsnJCsqLMh0TpfKynTqeEmNTpXVmk4BrhrjEgAAAACgyzU1u7RkVZ56xYVryrBepnO63OgBCbLZxKuX4BMYlwAAAAAAXe7DrcdVdq5B87PTFeDwv19Nu0UEa2DfaG05UCzLskznAFfF//4NBgAAAAAYVVHVoHc3FWpE/3hl9osxnWNM1kCnSs7W69iZatMpwFVhXAIAAAAAdKmlH+fLkjR3SprpFKNG9I9XgMOmzfs5NA7ejXEJAAAAANBlDh+v1NaDJZo5pq/iuoeazjEqLCRQ16bEauuhYrndHBoH78W4BAAAAADoEi63Wy/n5Co2KkQ3ZvUxneMRxgxK1LmaJh0+Xmk6BWg3xiUAAAAAQJdYs+uUikprNXdqmoICHaZzPMKQ1FgFBzm05SCHxsF7MS4BAAAAADpddV2T3vzkiAb2jdaI/vGmczxGUKBDw9Pjtf1QqZpb3KZzgHZhXAIAAAAAdLrlnxxVfaNL87PTZbPZTOd4lKxMp+oaW/Tp0XLTKUC7MC4BAAAAADpV4Zlqrd11UlOH91JSfITpHI+T2S9aEaGB2nKAQ+PgnRiXAAAAAACdxrIsLV6Zq/DQQN06Idl0jkcKcNg1akCCdueVqaGpxXQOcMUYlwAAAAAAnWbLwWLlFZ3TnMmpCgsJNJ3jsbIynWpqcWt3XpnpFOCKMS4BAAAAADpFQ1OLlq7OV9/ESF13bQ/TOR4tLambYqKCtZlD4+CFGJcAAAAAAJ3i3U2FOlvTpIXZGbLbOYn3F7HbbBo90Kn9RytUU99sOge4IoxLAAAAAIAOV1xZpw+3HtfYQYlKS+pmOscrjMl0yuW2tP1QiekU4IowLgEAAAAAOtyrq/LlcNh155RU0yleo3dChHrEhvGucfA6jEsAAAAAgA61t6Bcu/PLdMv4fuoeEWw6x2vYbDZlZTqVe+KsKqoaTOcAl41xCQAAAADQYVpcbr2yKk/OmDBNH9nbdI7Xycp0ypK09SCHxsF7MC4BAAAAADpMzvYTKq6o0/xp6Qpw8CvnlXJGhym5RySHxsGr8G86AAAAAKBDnK1p1NsbjmlIaqwGp8aazvFaWQOdKiyu1unyWtMpwGVhXAIAAAAAdIhlawrkcrk1LzvddIpXGzXQKZvEq5fgNRiXAAAAAABXLf/kOW389IxmjOojZ3SY6RyvFh0ZrP59umvLwRJZlmU6B2gT4xIAAAAA4Kq4LUsv5+Sqe0SQbhrX13SOTxgzKFHFFXUqLK42nQK0iXEJAAAAAHBV1u89rcIz1bprSppCggJM5/iEEf3j5bDbODQOXoFxCQAAAADQbnUNzXp9bYHSkropK9NpOsdnhIcE6tqUWG09WCI3h8bBwzEuAQAAAADa7c31R1VT16yF2Rmy2Wymc3xKVqZTldWNyjtx1nQK8IUYlwAAAAAA7XKytEard5zUpKE91Tcx0nSOzxmaFqfgQIc2c2gcPBzjEgAAAADgilmWpcUr8xQa7NBtE1NM5/ik4CCHhqXHafuhErW43KZzgEtiXAIAAAAAXLGduaU6WFipWyekKDIsyHSOz8rKdKq2oUWfHq0wnQJcEuMSAAAAAOCKNDW7tGRVvpLiwzV5WE/TOT5tUHKMwkMCtJVD4+DBGJcAAAAAAFfkgy3HVV7VoAXZGXLY+bWyMwU47Bo1IEE780rV2OQynQNcFN8FAAAAAACXrexcvd7dXKhRAxI0oG+06Ry/kJXpVFOzW7vzy0ynABfFuAQAAAAAuGxLV+fLJumuKWmmU/xGeu/uio4M1hYOjYOHYlwCAAAAAFyWg8cqtP1wqWaO7avYbiGmc/yG3WbT6IEJ2nekXNV1TaZzgAswLgEAAAAA2uRyu7V4ZZ7iuoXoxqw+pnP8zpjMRLncljbuPWU6BbgA4xIAAAAAoE0f7zypk2W1mjctXYEBDtM5fqePM0LOmDCt23XSdApwAcYlAAAAAMAXqqpr0pufHNWgftEalh5nOscv2Ww2jcl0al9BmSqrG03nAOdhXAIAAAAAfKE31h5RY7NL87MzZLPZTOf4raxMpyxL2naQE3vDszAuAQAAAAAu6diZKn2y55SmjUhSz7hw0zl+LTEmTGlJ3bSZd42Dh2FcAgAAAABclGVZejknV5FhgbplfLLpHEiaOCxJx85Uq7iiznQK0IpxCQAAAABwUZv3F6vgZJXumJSqsJAA0zmQNGFoL9kkbeHVS/AgjEsAAAAAgAvUN7Zo6Zp8JfeI1PjBPUzn4B/iuocqo3d3bTlYLMuyTOcAkhiXAAAAAAAX8c6mYzpX06QF0zNk5yTeHiUr06nT5XU6UVJjOgWQxLgEAAAAAPgXZyrq9NHWExp/baJSe3YznYN/MXJAghx2Gyf2hsdgXAIAAAAAnGfJqjwFBtg1Z1Kq6RRcRERooAYlx2jrwWK5OTQOHoBxCQAAAADQak9+mfYWlOuW8cnqFhFsOgeXMCbTqYqqRuUXnTOdAjAuAQAAAAA+09zi1iur8pQYE6bskUmmc/AFhqbHKSjAzrvGwSMwLgEAAAAAJEk520+opLJeC6anK8DBr4ueLCQoQEPT47TtUIlaXG7TOfBzfLcAAAAAAKiyulErNhzTsPQ4XZMcazoHlyEr06ma+mYdOFZpOgV+jnEJAAAAAKBla/LlcluaOy3ddAou07UpsQoPCdCWA2dMp8DPMS4BAAAAgJ/LKzqrTfuLdUNWbyV0DzWdg8sU4LBrRP947cwrU2Ozy3QO/BjjEgAAAAD4Mbfb0ss5uYqODNasMf1M5+AKZWUmqrHJpT35ZaZT4McYlwAAAADAj63be0rHi2t015Q0BQc5TOfgCvXv3V3dIoJ41zgYxbgEAAAAAH6qtqFZb6w9ooze3TV6YILpHLSD3W5T1kCn9h0pV11Ds+kc+CnGJQAAAADwU29+clS1Dc1akJ0um81mOgftlJXpVIvL0o7DpaZT4KcYlwAAAADADxWV1OjjnSc1eVgv9XFGms7BVeiXGKmE6FBt5tA4GMK4BAAAAAB+xrIsLV6Zq9Bgh26bkGI6B1fJZvvs0LhDxyt1tqbRdA78EOMSAAAAAPiZ7YdLdej4Wd0+MUURoYGmc9ABsjKdsixp28ES0ynwQ4xLAAAAAOBHGptdenV1nnonRGjS0F6mc9BBesaFq09ChLYc5NA4dD3GJQAAAADwI+9vLlRFVaMWTs+Q3c5JvH1J1iCnjpyqUkllnekU+BnGJQAAAADwE6Vn6/Xe5uPKynQqo3d30znoYKMHOCVJWzg0Dl2McQkAAAAA/MTS1fmy26U7J6eaTkEniO0WooykbtpyoFiWZZnOgR9hXAIAAAAAP7D/WIV25JbqprH9FBMVYjoHnSQr06lTZbUqKq01nQI/wrgEAAAAAD6uxeXW4pxcxXcP0fWje5vOQScaOSBBDrtNmw+cMZ0CP8K4BAAAAAA+bvXOkzpdXqd509IVGOAwnYNOFBkWpMx+Mdp6oERuDo1DF2FcAgAAAAAfVlXbpLfWH9E1KTEamhZnOgddYEymU+VVDSo4ec50CvwE4xIAAAAA+LDX1xaoqdmt+dPSZbPZTOegCwxNj1NggF1bDhSbToGfYFwCAAAAAB919HSV1u89rekje6tHbLjpHHSR0OAADU2L07ZDJXK53aZz4AcYlwAAAADAB7ktSy/n5CoyPEg3j+9nOgddLCvTqeq6Zh08Vmk6BX6AcQkAAAAAfNCmT8/oyKkq3Tk5VaHBAaZz0MWuTYlVaHCANnNoHLoA4xIAAAAA+Jj6xha9tqZAqT2jNPaaRNM5MCAwwK4R/eO1M7dUTc0u0znwcYxLAAAAAOBjVmw4puraJi2YniE7J/H2W2MynWpocmlvQbnpFPg4xiUAAAAA8CGny2uVs/2ErhvcQ8k9okznwKABfaLVLTyId41Dp2NcAgAAAAAfYVmWXlmZp6BAu+6YlGo6B4bZ7TaNGpCgPQXlqmtoMZ0DH8a4BAAAAAA+Ynd+mT49WqHZ16UoKjzIdA48QNYgp1pcbu3MLTWdAh/GuAQAAAAAPqC5xaUlq/LUIzZMU4f3Mp0DD5HSI0rx3UO05SCHxqHzMC4BAAAAgA/4cOsJlZ5t0ILpGQpw8KsePmOz2ZSV6dSBYxU6V9tkOgc+iu84AAAAAODlKqoa9M6mYxqREa9B/WJM58DDZA10yrKk7YdKTKfARzEuAQAAAICXe21NgSxLmjs1zXQKPFCv+AglxUdo84EzplPgoxiXAAAAAMCL5Z44qy0HinVjVh/FdQ81nQMPlZWZoIKTVSo9W286BT6IcQkAAAAAvJTbbenlnFzFRAXrxjF9TefAg2UNdEqStnJib3QCxiUAAAAA8FJrd5/UiZIazZ2aruBAh+kceLC47qFK69VNWw4wLqHjMS4BAAAAgBeqqW/WG+uOaECf7hrZP950DrxAVqZTRaW1KiqtMZ0CH8O4BAAAAABeaPknR1Tf6NKC7AzZbDbTOfACowYkyG6z8eoldDjGJQAAAADwMseLq7Vm10lNGd5LSQkRpnPgJaLCg5TZL1pbDhTLsizTOfAhjEsAAAAA4EUsy9LilXkKDwnUrROSTefAy2RlOlV2rkFHTlWZToEPYVwCAAAAAC+y7VCJck+c1e2TUhQeEmg6B15meEa8Ahx2bebQOHQgxiUAAAAA8BKNTS69ujpffZwRmji4p+kceKHQ4AANSYvVtkMlcrndpnPgIxiXAAAAAMBLvLv5mCqrG7Vweobsdk7ijfYZk+lUVW2TDhWeNZ0CH8G4BAAAAABeoKSyTh9sOa6xg5xKT+puOgdebHBqrEKDHbxrHDoM4xIAAAAAeIFXV+fLYbdrzuQ00ynwcoEBDg3PiNeO3BI1t7hM58AHMC4BAAAAgIf79Ei5duWV6ebx/RQdGWw6Bz4gK9Op+kaX9hZUmE6BD2BcAgAAAAAP1uJya/HKPCVEh2r6yN6mc+AjBvaNVlRYoLYcOGM6BT6AcQkAAAAAPNjK7UU6U1Gn+dPSFRjAr3DoGA67XaMGOLWnoFz1jS2mc+Dl+M4EAAAAAB7qXE2j3t5wVINTYzUkLc50DnxM1iCnmlvc2plbajoFXo5xCQAAAAA81LK1BWpucWv+tHTTKfBBqT2jFNctRFsO8q5xuDqMSwAAAADggQpOndOGfWc0Y3RvOWPCTOfAB9lsNmVlOnXgaKWq6ppM58CLMS4BAAAAgIdxW5YW5+SqW0SQbhrbz3QOfFjWQKfclqXth0pMp8CLMS4BAAAAgIfZsO+0jp6u1l2T0xQaHGA6Bz4sKSFCveLDtfkAh8ah/RiXAAAAAMCD1DW06PU1BUrtFaUxg5ymc+AHsgY6lV90TmXn6k2nwEsxLgEAAACAB3l7w1FV1zXr36b3l81mM50DP5CV+dmIufUgh8ahfRiXAAAAAMBDnCyr1aodRZo4tKf6JkaazoGfiO8eqtSeUdrCoXFoJ8YlAAAAAPAAlmXplZW5Cg506LaJKaZz4GeyMp06UVKjk2W1plPghRiXAAAAAMAD7Mor04Fjlbp1QrKiwoJM58DPjBrolM0mXr2EdmFcAgAAAADDmppdWrIqT73iwjVleC/TOfBD3cKDNLBvtLYcOCPLskznwMswLgEAAACAYR9sPa6ycw1akJ0uh51f02BGVqZTpWcbdPR0tekUeBm+awEAAACAQeXnGvTepkKN7B+vgf1iTOfAj43IiFeAw6bNB86YToGXYVwCAAAAAIOWfpwvSbpraprhEvi7sJBADU6N07aDJXK7OTQOl49xCQAAAAAMOVRYqW2HSjRzTF/FdQs1nQMoK9Opc7VNOny80nQKvAjjEgAAAAAY4HK7tXhlrmKjQnRDVh/TOYAkaUhqrIKDHNrMu8bhCjAuAQAAAIABa3adUlFpreZNS1NQoMN0DiBJCgp0aHh6vHYcLlVzi9t0DrwE4xIAAAAAdLHquia9+ckRDewbreEZ8aZzgPOMGeRUXWOLPj1SbjoFXoJxCQAAAAC62PJ1R1Tf6NKC7HTZbDbTOcB5BvaNVkRooLYc5NA4XB7GJQAAAADoQoVnqrV29ylNG5GkXvERpnOACwQ47Bo1MEG788rU0NRiOgdegHEJAAAAALqIZVl6eWWuIsICNfu6fqZzgEvKGuhUU4tbu/LKTKfACzAuAQAAAEAXWbvrpPKLzumOSakKCwk0nQNcUlpSN8VGBWsL7xqHy8C4BAAAAABdoKGpRS+u2K9+iZG6bnAP0znAF7LbbBo90Kn9RytUXddkOgcejnEJAAAAALrAu5sKVVHVoAXTM2TnJN7wAlmZTrnclrYfLjWdAg/HuAQAAAAAnay4sk4fbj2uqSN7K61XN9M5wGXpnRChHrFhHBqHNjEuAQAAAEAnW7IyTwEOu740K9N0CnDZbDabxmQ6lXvirCqqGkznwIMxLgEAAABAJ9pbUKY9BeW6ZXyyYqJCTOcAV2R0plOStPVgieESeDLGJQAAAADoJC0ut15ZmSdnTJiyRyaZzgGumDM6TMk9orT5wBnTKfBgjEsAAAAA0Elytp9QcWW9FmSnK8DBr1/wTlmZTh0vrtHp8lrTKfBQfHcDAAAAgE5wtqZRb284pqFpcbo2JdZ0DtBuowcmyCZxYm9cEuMSAAAAAHSC1z4ukMvl1txpaaZTgKvSPSJYA/pGa8uBYlmWZToHHohxCQAAAAA6WH7ROW3af0bXj+4jZ3SY6RzgqmVlOlVcWa9jZ6pNp8ADMS4BAAAAQAdyuy29vDJX0ZHBmjW2r+kcoEOM6B8vh93GoXG4KMYlAAAAAOhA6/edVuGZat05JVUhQQGmc4AOER4SqMGpsdp6sFhuN4fG4XyMSwAAAADQQeoamrVsTYHSk7opa6DTdA7QobIynTpb06TcE2dNp8DDMC4BAAAAQAd5c/1R1TY0a+H0DNlsNtM5QIcakhan4ECHNnNoHP4F4xIAAAAAdICi0hqt3nFSk4b2Uh9npOkcoMMFBzo0LCNOOw6XqMXlNp0DD8K4BAAAAABXybIsvbIyT6HBDt0+McV0DtBpxmQ6VdvQok+PVJhOgQdhXAIAAACAq7TjcKkOFlbqtokpiggNNJ0DdJrMfjGKCA3UloMcGod/YlwCAAAAgKvQ2OzSq6vzlBQfoUlDe5rOATpVgMOukQMStCuvVI1NLtM58BCMSwAAAABwFT7YclzlVY1aOD1dDju/YsH3ZQ1MUFOzW7vyS02nwEPwnQ8AAAAA2qnsXL3e21yo0QMT1L9PtOkcoEuk9+6u6MhgbdnPoXH4DOMSAAAAALTTq6vzZbNJd01JM50CdBm7zaasgU59erRCNfXNpnPgARiXAAAAAKAdDhyr0I7DpZo1tp9iokJM5wBdKivTKZfb0vbDJaZT4AGueFxqbmaVBAAAAODfWlxuvbIyT3HdQnTD6N6mc4Au18cZocSYMG09wKFxuIxxafv27frf//1fNTU16bbbbtPIkSP13nvvdUUbAAAAAHikj3ed1MmyWs2flq7AAIfpHKDL2Ww2ZWU6dfj4WVXXNZnOgWFtjkvPPPOMhg4dqpUrVyouLk7vvvuu/vKXv3RFGwAAAAB4nKq6Jr35yVENSo7R0PQ40zmAMXHdQmRJqm9ymU6BYW2OSy6XS+PGjdPGjRuVnZ2tpKQkud3urmgDAAAAAI/zxtojamp2af60dNlsNtM5AGBcm+OS2+3W3r17tWbNGo0fP165ubmcdwkAAACAXzp2pkqf7DmlaSOS1DMu3HQOAHiEgLZu8MADD+jRRx/VnDlzlJSUpKlTp+rxxx/vijYAAAAA8Bhuy9LLObmKDA/S7OuSTecAgMdoc1wqKSlRTk5O68c5OTlyODhhHQAAAAD/snn/GRWcrNJXZw5UaHCbv0oBgN9o87C4V1555byPGZYAAAAA+Jv6xha99nGBkntEady1iaZzAMCjtDm3Jycna9GiRRo5cqTCwsJaL58xY0anhgEAAACAp3hn4zGdq23Sv98xWHZO4g0A52lzXDp79qzOnj2rwsLC1stsNhvjEgAAAAC/cKaiTh9tO6Hrru2hlJ5RpnMAwOO0OS79/e9/74oOAAAAAPBIS1blKSjQrjsmp5pOAQCP1Oa4dOzYMb300kuqq6uTZVlyu90qLCzUkiVLuqIPAAAAAIzZnV+mvQXlmjc1Td3Cg0znAIBHavOE3o8++qiam5u1a9cu9erVS/n5+crIyOiKNgAAAAAwprnFrSUr89QjNkxTRySZzgEAj9XmuFRbW6sf//jHuu666zRx4kS9+OKL2r9/f1e0AQAAAIAxH207rpKz9VqQnaEAR5u/OgGA32rzO2T37t0lSX379lVeXp6ioqLkdrs7uwsAAAAAjKmsbtQ7Gws1LD1Og5JjTOcAgEdr85xLffv21ZNPPqnbbrtNjz/+uOrq6tTU1NQVbQAAAABgxGtr8uVyW5o7Ld10CgB4vDZfufTEE09o5MiRyszM1J133qnNmzfrpz/9aVe0AQAAAECXyys6q837i3VDVh8ldA81nQMAHq/Ncen3v/+9rr/+eknSggUL9D//8z967733Oj0MAAAAALqa223p5Y9yFRMVrFlj+5rOAQCvcMnD4p577jlVVVXpvffeU01NTevlzc3NWr16tRYtWtQlgQAAAADQVdbtOaXjJTW6f/YgBQc6TOcAgFe45Lg0ZMgQ7du3T3a7vfWk3pLkcDj0/PPPd0UbAAAAAHSZmvpmvbHuiPr37q5RAxJM5wCA17jkuDRp0iRNmjRJEydO1ODBg1svb25uVmBgYJfEAQAAAEBXeeuTo6ptaNaC6Rmy2WymcwDAa7R5zqWmpib97//+r5qamnTbbbdp5MiRnHMJAAAAgE8pKqnR6l1FmjKsl3onRJjOAQCv0ua49Mwzz2jo0KFauXKl4uLi9O677+ovf/lLV7QBAAAAQKezLEuLV+YqPCRQt05IMZ0DAF6nzXHJ5XJp3Lhx2rhxo7Kzs5WUlCS3290VbQAAAADQ6bYdKtGh42d1+8QURYRyChDgilmW6QIY1ua45Ha7tXfvXq1Zs0bjx49Xbm6umpubu6INAAAAADpVY5NLSz/OV5+ECE0c0tN0DgB4pUue0Ptz999/vx599FHNmTNHSUlJmjp1qh5//PGuaAMAAACATvXe5kJVVDXqGzcPkt3OSbyBK8F57/G5NselGTNmaMaMGa0f5+TkyOFwdGoUAAAAAHS20rP1en/LcY3JdCqjd3fTOQDgtdo8LO5fMSwBAAAA8AWvrs6Xw27TnVPSTKcAgFe74nEJAAAAALzd/qMV2plbqpvG9VV0ZLDpHADwapccl3JyciRJTU1NXRYDAAAAAJ2txeXW4pW5Sugeqhmj+pjOAQCvd8lx6bnnnpMkzZ07t8tiAAAAAKCzrd5RpNPldZqXna7AAA7mAICrdckTeoeHh+v6669XcXGxbr755guuX7FiRaeGAQAAAEBHO1fbpLc2HNW1KbEakhprOgcAfMIlx6U//elPOnjwoB5//HH913/9V1c2AQAAAECneH1tgZqa3Zo3LU023kcdADrEJceliIgIjRo1Sr///e+VkJCg/fv3q6WlRYMHD1ZERERXNgIAAADAVTtyqkrr957WDVl91CM23HQOAPiMS45Ln6uurtbdd9+tuLg4uVwuFRcX64UXXtDw4cO7og8AAAAArprbsrR4Za66hQfp5nH9TOcAgE9pc1x66qmn9Mtf/lJjxoyRJG3atEm/+MUvtHTp0k6PAwAAAICOsHHfGR05VaV7bxqo0OA2fw0CAFyBNt8aoaampnVYkqSxY8eqvr6+U6M+d+LECd1+++1d8lgAAAAAfFNdQ4uWrS1Qaq8ojRmUaDoHAHxOm+OS3W7XyZMnWz8uKiqSw+Ho1ChJqqqq0pIlSxQezrHQAAAAANpvxcajqq5t0oLsDNk5iTcAdLg2Xw/64IMPau7cuRo7dqwkacOGDfrRj37U4SGvvvqq3nnnndaPf/3rX+s73/mO7rvvvg5/LAAAAAD+4XR5rVZuL9KEIT2U3CPKdA4A+KQ2x6Xs7GylpKRo8+bNsixL999/v1JTUzs8ZO7cuZo7d26H3y8AAAAA/2RZlhavzFNQoEO3T+z432EAAJ+5rDPZpaSkKCUlpbNbAAAAAKDD7M4v0/6jFZo/LV1R4UGmcwDAZ9ksy7I68wFqamo0b948vfDCC0pKSpIkrVixQr/73e/U3NysL3/5y1q4cGFnJgAAAADwM03NLj34zGoFBjj03KOTFeBo83SzAK7Q6u0n9JtXduoP389WjzjOl+zPOvU9OPfs2aNFixbp2LFjrZcVFxfrN7/5jd544w0FBQVp3rx5ysrKUlpaWoc+dnl5jdzuTt3N/FJ8fKRKS6tNZ8BL8fzB1eI5hKvFcwhXi+eQ91ix8ZjOlNfp2/OGqrKi1nROK55DuFqe9Byqrv7sneQrKmoUYLkN1+Bytfc5ZLfbFBsbcfHr2vrkxx577Iof8HNLly7Vj370IyUkJLRetnHjRo0ZM0bdu3dXWFiYrr/+en3wwQftfgwAAAAA+L8qqhr07qZjGtE/Xpn9YkznAIDPa/OVS4cOHZJlWbK14y07n3zyyQsuKykpUXx8fOvHCQkJ2rt37xXfNwAAAABczNKP82VZ0twpHXt0BADg4tocl+Lj4zVr1iwNGTJE4eH/PIZy0aJF7XrAi53iqT3DFQAAAAD8q8PHK7X1YIluGd9Pcd1DTecAgF9oc1waNmyYhg0b1mEP6HQ6tX379taPS0pKzjtsDgAAAADaw+V26+WcPMVGBevGMX1N5wB+g7Mdo81x6aGHHlJDQ4MKCwuVnp6upqYmhYSEtPsBx40bp+eff14VFRUKDQ3VRx99pJ/+9Kftvj8AAAAAkKR1u0+pqLRG37z1GgUHOkznAD7PJo5CwmfaPKH3nj17lJ2drfvuu08lJSWaNGmSdu7c2e4HdDqdeuSRR3TPPffo1ltv1U033aTBgwe3+/4AAAAAoKa+WW+sO6KBfaM1on98258AAOgwbb5y6amnntJf//pXffvb31ZiYqKefvppPfnkk3r99dcv+0FWr1593sc333yzbr755iuvBQAAAICLWL7uiOobXZqfnc45XQGgi7X5yqWGhgalpf3zXRYmTZokl8vVqVEAAAAAcLmOF1drze6Tmjq8l5LiI0znAIDfaXNcCggI0Llz51rX/yNHjnR6FAAAAABcDsuytDgnV+EhgZo9Idl0DgD4pTYPi3vggQf0b//2byotLdV//ud/asOGDfrJT37SFW0AAAAA8IW2HixRbtE5femG/goPCTSdAwB+qc1xacqUKUpJSdGGDRvkdrv1zW9+87zD5AAAAADAhMYml5Z+nK++zkhNGNzTdA4A+K02D4uTpJaWFrndbgUEBCgwkP8bAAAAAMC8dzYdU2V1oxZOz5Ddzkm8AcCUNsel119/XXfffbf27dunHTt2aOHChfrwww+7og0AAAAALqqksk4fbj2usYMSlZbUzXQOAPi1Ng+L++tf/6o333xTCQkJkqRTp07pvvvu0/XXX9/pcQAAAABwMUtW5cvhsGvO5FTTKQDg99p85VJgYGDrsCRJPXv25NA4AAAAAMbsO1Ku3fllumVcP0VHBpvOAQC/d8lXLu3fv1+S1L9/f/3kJz/R3Llz5XA49MYbb2j48OFdFggAAAAAn2txufXKyjw5o0OVPbK36RwAgL5gXPr3f//38z5es2ZN69/bbDYtWrSo06IAAAAA4GJWbi/SmYo6fevOwQoMuKz3JwIAdLJLjkurV6/uyg4AAAAA+EJnaxr19oajGpwaq8GpcaZzAAD/0OYJvUtLS7V8+XKdPXv2vMsfe+yxzmoCAAAAgAu8vqZALS635menm04BAPwfbb6O9IEHHtDevXtlWdZ5fwEAAABAVyk4eU4bPj2jGaP6yBkdZjoHAPB/tPnKpebmZv32t7/tihYAAAAAuIDbsvRyTq66RwTppnF9TecAAP5Fm69cGjRokHJzc7uiBQAAAAAusGHvaR07U607p6QpJKjN/z8OAOhibX5nHj58uG699VbFx8crIOCfN1+1alWnhgEAAABAXUOzlq0tUFqvbhqT6TSdAwC4iDbHpd/+9rf65S9/qT59+nRFDwAAAAC0envDMdXUNes/78qQzWYznQMAuIg2x6Vu3bpp5syZXdECAAAAAK1OltVq1Y4iTRraU30TI03nAAAuoc1xafLkyXrqqac0Y8YMBQUFtV4+aNCgTg0DAAAA4L8sy9LinFwFBzp028QU0zkAvghvKO/32hyXVqxYIUn68MMPWy+z2WyccwkAAABAp9mZW6aDhZVaOD1DkWFBbX8CgK7Hkar4hzbHpdWrV3dFBwAAAABIkpqaXXp1dZ56xYdr8rCepnMAAG1oc1x68cUXL3r5V77ylQ6PAQAAAIAPth5X2bkGfWf+MDnsdtM5AIA2tDku5ebmtv59U1OTduzYoaysrE6NAgAAAOCfys816L1NhRo5IEED+0abzgEAXIY2x6Wf//zn531cUVGhxx57rNOCAAAAAPivVz/OlyTNnZJmuAQAcLmu+DWmMTExOnnyZGe0AAAAAPBjBwsrtf1QiWaO7avYbiGmcwAAl+mKzrlkWZY+/fRTxcbGdmoUAAAAAP/icru1eGWu4rqF6IbRfUznAACuwBWdc0mSevTowWFxAAAAADrUml2ndLK0Vg/edq2CAh2mcwAAV+CKz7kEAAAAAB2puq5Jy9cdUWa/aA3PiDOdAwC4Qpccl77//e9f8pNsNpt+9rOfdUoQAAAAAP+yfN0RNTS5ND87QzabzXQOAOAKXXJcSk9Pv+CyyspK/b//9//Uq1evTo0CAAAA4B8Kz1Rr7e5Tyh7ZW73iwk3nAADa4ZLj0le/+tXzPt64caO++93v6uabb9aiRYs6PQwAAACAb7MsSy/n5CoyLFCzr0s2nQMAaKc2z7nU0tKiX/3qV1q+fLmeeOIJ3XDDDV3RBQAAAMDHbT5QrPyT5/SVGwcoLKTNX00AAB7qC7+DFxYW6pFHHlFYWJiWL1+uHj16dFUXAAAAAB9W39iipR/nq19ipMYP5vcMAPBm9ktdsWzZMt15552aPn26XnrpJYYlAAAAAB3m3U2FOlfTpIXTM2TnJN4A4NUu+cqlRYsWyW636w9/+IP++Mc/tl5uWZZsNpt27tzZJYEAAAAAfEtxRZ0+2nZc469JVGqvbqZzAABX6ZLj0qpVq7qyAwAAAICfWLIqTwEOu+6YnGo6BQDQAS45LvXq1asrOwAAAAD4gb0FZdpTUK67pqSpe0Sw6RwAQAe45DmXAAAAAKAjNbe49crKPCXGhCl7ZJLpHABAB2FcAgAAANAlVm4/oeLKes3PTleAg19FAMBX8B0dAAAAQKerrG7U2xuPaWhanK5NiTWdAwDoQIxLAAAAADrdsjUFcrncmjctzXQKgA5mmQ6AcYxLAAAAADpVftE5bdp/RteP7qOE6DDTOQA6iM10ADwG4xIAAACATuN2W3o5J1fRkcGaNbav6RwAQCdgXAIAAADQaT7Ze0qFxdW6a0qaQoICTOcAADoB4xIAAACATlHb0KzX1x5RRlI3jR6YYDoHANBJGJcAAAAAdIq3Pjmq2oZmLZieIZuNs7MAgK9iXAIAAADQ4YpKa7R650lNHtpLfZyRpnMAAJ2IcQkAAABAh7IsS6+szFNosEO3TUwxnQMA6GSMSwAAAAA61I7DpTpYWKnbJqYoIjTQdA4AoJMxLgEAAADoMI3NLr26Ok9J8RGaNLSn6RwAQBdgXAIAAADQYd7fXKjyqkYtnJ4uh51fNwDAH/DdHgAAAECHKDtbr/e3HNfogQnq3yfadA4AoIswLgEAAADoEK9+nC+bTbprSprpFABAF2JcAgAAAHDVDhyr0I7DpZo1tp9iokJM5wAAuhDjEgAAAICr0uJya/HKPMV1C9ENo3ubzgEAdDHGJQAAAABX5eOdJ3WqrFbzp6UrMMBhOgcA0MUYlwAAAAC0W1Vtk95cf1TXJMdoaHqc6RwAgAGMSwAAAADa7Y11BWpqdml+drpsNpvpHACAAYxLAAAAANrl6OkqfbLntLJHJqlHbLjpHACAIYxLAAAAAK6Y27K0eGWuIsODdMv4ZNM5AACDGJcAAAAAXLHN+8+o4GSV5kxKVWhwgOkcAIBBjEsAAAAArkh9Y4te+7hAyT2iNO7aRNM5AADDGJcAAAAAXJEVG4/pXG2TFk7PkJ2TeAN+z7Is0wkwjHEJAAAAwGU7XV6rnG0ndN3gHkrpGWU6B4BJbMv4B8YlAAAAAJfFsiy9sipPQYF23TEp1XQOAMBDMC4BAAAAuCx7Csr16ZEKzR6frG7hQaZzAAAegnEJAAAAQJuaW9xasjJPPWLDNHVEkukcAIAHYVwCAAAA0KaPth1Xydl6LcjOUICDXyMAAP/EfxUAAAAAfKGKqgat2HhMw9LjNCg5xnQOAMDDMC4BAAAA+ELL1hTI7ZbmTUs3nQIA8ECMSwAAAAAuKffEWW0+UKwbs/oovnuo6RwAgAdiXAIAAABwUW63pcU5uYqJCtbMsX1N5wAAPBTjEgAAAICLWrfnlI6X1OiuKWkKDnSYzgEAeCjGJQAAAAAXqKlv1hvrjqh/7+4aNSDBdA4AwIMxLgEAAAC4wJufHFFtQ7MWTM+QzWYznQMA8GCMSwAAAADOc6KkRh/vOqkpw3qpd0KE6RwAgIdjXAIAAADQyrI+O4l3eEigbp2QYjoHAOAFGJcAAAAAtNp2qESHT5zV7RNTFBEaaDoHAOAFGJcAAAAASJIam1xa+nG++iREaOKQnqZzAABegnEJAAAAgCTp3c2Fqqhq1ILpGbLbOYk3AODyMC4BAAAAUMnZen2w5bjGZDqV0bu76RwAgBdhXAIAAACgV1flyWG36c4paaZTAABehnEJAAAA8HOfHi3Xrrwy3TSur6Ijg03nAAC8DOMSAAAA4MdaXG69sjJPCd1DNWNUH9M5AAAvxLgEAAAA+LHVO4p0urxO87LTFRjArwcAgCvHfz0AAAAAP3WutklvbTiqa1NiNSQ11nQOAMBLMS4BAAAAfur1NQVqanZr3rQ02Ww20zkAvIxNfN/AZxiXAAAAAD905FSV1u87remjeqtHbLjpHACAF2NcAgAAAPyM27L0ck6uuoUH6eZx/UznAAC8HOMSAAAA4Gc27jujo6erdOeUVIUGB5jOAQB4OcYlAAAAwI/UNbRo2doCpfaK0phBiaZzAAA+gHEJAAAA8CMrNh5VdW2TFmRnyM5JvAEAHYBxCQAAAPATp8pqtXJ7kSYM6aHkHlGmcwAAPoJxCQAAAPADlmXplVV5Cgp06PaJqaZzAAA+hHEJAAAA8AO788q0/2iFbr0uWVHhQaZzAAA+hHEJAAAA8HHNLS69sipPPePCNWV4L9M5AAAfw7gEAAAA+LgPtp5Q2bkGLchOV4CDXwEAAB2L/7IAAAAAPqyiqkHvbjqmEf3jldkvxnQOAMAHMS4BAAAAPmzpx/myLGnulDTTKQAAH8W4BAAAAPiow8crtfVgiW7M6qO47qGmcwAAPopxCQAAAPBBLrdbL+fkKTYqWDeO6Ws6BwDgwxiXAAAAAB+0dvcpFZXWaO7UdAUHOkznAAB8GOMSAAAA4GNq6pu1fN0RDewbrRH9403nAAB8HOMSAAAA4GOWrzui+kaX5meny2azmc4BAPg4xiUAAADAhxwvrtaa3Sc1dXgvJcVHmM4BAPgBxiUAAADAR1iWpcU5uQoPCdTsCcmmcwAAfoJxCQAAAPARWw4WK7fonO6YlKLwkEDTOQAAP8G4BAAAAPiAhqYWvfZxgfo6IzVhcE/TOQD8iGWZLoBpjEsAAACAD3h3U6Eqqxu1cHqG7HZO4g2g8/F+Afgc4xIAAADg5Uoq6/Th1uMaOyhRaUndTOcAAPwM4xIAAADg5ZasypfDYdecyammUwAAfohxCQAAAPBi+46Ua3d+mW4Z10/RkcGmcwAAfohxCQAAAPBSLS63Fq/MkzM6VNkje5vOAQD4KcYlAAAAwEut3F6k4oo6zc9OV2AAP9oDAMwIMB0AAAAAXMzWg8Xa+OkZ0xnnCQoKUFNTi+mMVoePn9Xg1FgNTo0znQIA8GOMSwAAAPA4pWfr9ad3DioqPFCRYUGmc1oFNraoucVtOqNVaq8oLZyeYToDAODnGJcAAADgcV5dnS+H3abH7x7pUSepjo+PVGlptekMAAA8CgdmAwAAwKPsP1qhnbmlumlcX48algAAwMUxLgEAAMBjfPbuZ7lK6B6qGaN49zMAALwB4xIAAAA8xuodRTpdXqd509IVGOAwnQMAAC4D4xIAAAA8wrnaJr214aiuTYnVkLRY0zkAAOAyMS4BAADAI7y+tkBNzW7Nm5Ymm81mOgcAAFwmxiUAAAAYd+RUldbvPa3po3qrR2y46RwAAHAFGJcAAABglNuytHhlrrqFB+nmcf1M5wAAgCvEuAQAAACjNu47oyOnqjRncqpCgwNM5wAAgCvEuAQAAABj6hpatGxtgVJ7RmnsNYmmcwAAQDswLgEAAMCYFRuPqrq2SQumZ8jOSbwBAPBKjEsAAAAw4nR5rVZuL9KEIT2U3CPKdA4AAGgnxiUAAAB0OcuytHhlnoICHbp9YqrpHAAAcBUYlwAAANDldueXaf/RCt16XbKiwoNM5wAAroJlOgDGMS4BAACgSzW3uLRkVZ56xoVryvBepnMAAMBVYlwCAABAl/pg6wmVnm3Qgux0BTj4cRQAAG/Hf80BAADQZSqqGvTupmMa0T9emf1iTOcAAIAOwLgEAACALrP043xZljR3SprpFAAA0EEYlwAAANAlDh+v1NaDJboxq4/iuoeazgEAAB2EcQkAAACdzuV26+WcPMVGBevGMX1N5wAAgA7EuAQAAIBOt3b3KRWV1mju1HQFBzpM5wAAgA7EuAQAAIBOVVPfrOXrjmhAn+4a0T/edA4AAOhgjEsAAADoVMvXHVF9o0sLpmfIZrOZzgEAAB2McQkAAACd5nhxtdbsPqmpw3spKT7CdA4AAOgEjEsAAADoFJZlaXFOrsJDAjV7QrLpHAAA0EkYlwAAANApth4sUW7ROd0xKUXhIYGmcwAAQCdhXAIAAECHa2xyaenH+errjNSEwT1N5wAAgE7EuAQAAIAO986mY6qsbtSC6emy2zmJNwAAvoxxCQAAAB2qpLJOH249rrGDnEpP6m46BwAAdDLGJQAAAHSoJavy5XDYNWdymukUAADQBRiXAAAA0GH2HSnX7vwy3TKun6Ijg03nAACALsC4BAAAgA7R4nLrlZV5ckaHKntkb9M5AACgizAuAQAAoEOs3F6kMxV1mp+drsAAfswEAMBf8F99AAAAXLWzNY16e8NRDU6N1eDUONM5AACgCzEuAQAA4Kq9vqZALS635k9LN50CAAC6GOMSAAAArkrByXPa8OkZzRjVR86YMNM5AICuZlmmC2AY4xIAAADazW1ZejknV90jgnTTuL6mcwAAXchms5lOgIdgXAIAAEC7bdh7WsfOVOvOKWkKCQownQMAAAxgXAIAAEC71DU0a9naAqX16qYxmU7TOQAAwBDGJQAAALTLW+uPqaauWQunZ3BoBAAAfoxxCQAAAFfsZFmtVu0o0sShPdU3MdJ0DgAAMIhxCQAAAFfEsiwtzslVSJBDt09MMZ0DAAAMY1wCAADAFdmZW6aDhZW6bWKKIsOCTOcAAADDGJcAAABw2ZqaXXp1dZ56xYdr8rCepnMAAIAHYFwCAADAZftg63GVnWvQguwMOez8KAkAABiXAAAAcJnKztXrvU2FGjkgQQP7RpvOAQAAHoJxCQAAAJdl6ccFkqS7pqQaLgEAAJ6EcQkAAABtOlhYqe2HSjRzTF/FdQs1nQMAADwI4xIAAAC+kMvt1uKVuYrrFqIbsvqYzgEAAB6GcQkAAABfaM2uUzpZWqu5U9MVFOgwnQMAADwM4xIAAAAuqbquScvXHVFmv2gNz4gznQMAADwQ4xIAAAAu6Y11R9TQ5NL87AzZbDbTOQAAwAMxLgEAAOCiCs9Ua93uU5o2Ikm94sJN5wAAAA/FuAQAAIALWJall3NyFREWqNnX9TOdAwAAPBjjEgAAAC6w+UCx8k+e05xJqQoLCTSdAwAAPBjjEgAAAM5T39iipR/nq19ipMYP7mE6BwAAeDjGJQAAAJzn3U2FOlfTpIXTM2TnJN4AAKANjEsAAABoVVxRp4+2Hdf4axKV2qub6RwAAOAFGJcAAADQ6pVVeQpw2HXH5FTTKQAAL2GZDoBxjEsAAACQJO3JL9PegnLdMj5Z3SOCTecAADwcB07jc4xLAAAAUHOLW0tW5SkxJkzZI5NM5wAAAC/CuAQAAACt3H5CxZX1mp+drgAHPyICAIDLx08OAAAAfq6yulFvbzymoWlxujYl1nQOAADwMoxLAAAAfm7ZmgK5XG7Nm5ZmOgUAAHghxiUAAAA/ll90Tpv2n9H1o/soITrMdA4AAPBCjEsAAAB+yu229HJOrqIjgzVrbF/TOQAAwEsxLgEAAPipT/aeUmFxte6akqaQoADTOQAAwEsxLgEAAPih2oZmvb72iDKSumn0wATTOQAAwIsxLgEAAPihtz45qtqGZi2YniGbzWY6BwAAeDHGJQAAAD9TVFqj1TtPavLQXurjjDSdAwAAvBzjEgAAgB+xLEuLc3IVGuzQbRNTTOcAAAAfwLgEAADgR3YcLtWh42d128QURYQGms4BAAA+gHEJAADATzQ2u/Tq6jwlxUdo0tCepnMAAICPYFwCAADwE+9vLlR5VaMWTk+Xw86PgQAAoGPwUwUAAIAfKDtbr/e3HNfogQnq3yfadA4AAPAhjEsAAAB+4NWP82WzSXdNSTOdAgAAfAzjEgAAgI87cKxCOw6XatbYfoqJCjGdAwAAfAzjEgAAgA9rcbm1eGWe4rqF6IbRvU3nAAAAH8S4BAAA4MM+3nlSp8pqNX9augIDHKZzAACAD2JcAgAA8FFVtU16c/1RXZMco6HpcaZzAACAj2JcAgAA8FFvrCtQU7NL87PTZbPZTOcAAHyVZToApjEuAQAA+KCjp6v0yZ7Tyh6ZpB6x4aZzAACAD2NcAgAA8DFuy9LinFxFhgfplvHJpnMAAICPY1wCAADwMZs+PaOCU1WaMylVocEBpnMAAICPY1wCAADwIfWNLVq2pkApPaM07tpE0zkAAMAPMC4BAAD4kBUbj+lcbZMWTs+QnZN4AwCALsC4BAAA4CNOl9cqZ9sJXTe4h5J7RJnOAQAAfoJxCQAAwAdYlqVXVuUpKNCuOyalms4BAAB+hHEJAADAB+wpKNenRyo0e3yyuoUHmc4BAAB+hHEJAADAyzW3uLRkZZ56xIZp6ogk0zkAAMDPMC4BAAB4uY+2nVDJ2XotyM5QgIMf7wAAQNfipw8AAAAvVlHVoBUbj2lYepwGJceYzgEAAH6IcQkAAMCLLVtTILdbmjct3XQKAADwU4xLAAAAXir3xFltPlCsG7P6KL57qOkcAADgpxiXAAAAvJDbbWlxTq5iooI1c2xf0zkAAMCPMS4BAAB4obV7Tul4SY3umpKm4ECH6RwAAODHGJcAAAC8TE19s95YW6D+vbtr1IAE0zkAAMDPMS4BAAB4mTc/OaK6xhYtmJ4hm81mOgcAAPg5xiUAAAAvcqKkRh/vOqmpw5LUOyHCdA4AAADjEgAAgLewrM9O4h0eEqjZE5JN5wAAAEhiXAIAAPAa2w6V6PCJs7p9YooiQgNN5wAAAEhiXAIAAPAKjU0uvbo6X30SIjRxSE/TOQAAAK0YlwAAALzAu5sLVVndqAXTM2S3cxJvAIDnsEwHwDjGJQAAAA9XcrZeH2w5rjGZTmX07m46BwAASRJvWIrPMS4BAAB4uFdX5clht+nOKWmmUwAAAC7AuAQAAODBPj1arl15ZbppXF9FRwabzgEAALgA4xIAAICHanG59crKPCV0D9WMUX1M5wAAAFwU4xIAAICHWrWjSKfL6zQvO12BAfzYBgAAPBM/pQAAAHigczWNemv9UV2bEqshqbGmcwAAAC6JcQkAAMADvb72iJpb3JqfnS4bb8cDAAA8GOMSAACAhzlyqkrr953WjFG9lRgTZjoHAADgCzEuAQAAeBC3ZenlnFx1Cw/STeP6mc4BAABoE+MSAACAB9m474yOnq7SnVNSFRocYDoHAACgTYxLAAAAHqKuoUXL1uQrtVeUxgxKNJ0DAABwWRiXAAAAPMTbG46quq5ZC7IzZOck3gAAwEswLgEAAHiAU2W1WrWjSBOG9FByjyjTOQAAAJeNcQkAAMAwy7L0yqo8BQU6dPvEVNM5AAAAV4RxCQAAwLDdeWXaf7RCt05IVlR4kOkcAACAK8K4BAAAYFBzi0uvrMpTr7hwTRnWy3QOAADAFWNcAgAAMOiDLcdVdq5B87PTFeDgRzMAAOB9+AkGAADAkIqqBr27qVAj+scrs1+M6RwAAIB2YVyC12psdsnttkxnAPBjDU0tsiy+D6H9ln6cL0vS3ClpplMAAADajXEJXuuBX63Vn989YDoDgJ+qrG7UN3+9Th9uPWE6BV6q7Gy9th4s0fWjeyuue6jpHAAAgHZjXIJX27S/2HQCAD9VXtUgSdpxuMRwCbxVQ5NLktQnIdJwCQAAwNVhXAIAAAAAAO3GaQLAuAQAAAAAANrBZjoAHoJxCQAAAAAAAO3GuAQAAAAAAIB2Y1wCAAAAAABAuzEuAQAAAAAAoN0YlwAAAAAAANBujEsAAAAAAABoN8YlAAAAAAAAtBvjEgAAAAAAANqNcQkAAAAAAADtxrgEAAAAAACAdmNcAgAAAAAAQLsxLgEAAAAAAKDdGJcAAAAAAADQboxLAAAAAAAAaDfGJQAAAAAAALQb4xIAAAAAAADajXEJAAAAAAAA7ca4BAAAAAAAgHZjXAIAAAAAAEC7MS4BAAAAAACg3QJMB3QWu91mOsFnecrXNiE6VJLn9ODy8M8LV8tTnkPBQQ4lRIcqOirEY5pweTzln1dQ4GfPodDgAI9pwuXhnxeuFs8hXC1PeQ6FBgcoITpUQYEOj2nC5WnPP68v+hybZVnW1QQBAAAAAADAf3FYHAAAAAAAANqNcQkAAAAAAADtxrgEAAAAAACAdmNcAgAAAAAAQLsxLgEAAAAAAKDdGJcAAAAAAADQboxLAAAAAAAAaDfGJQAAAAAAALQb4xIAAAAAAADajXEJl2XFihWaOXOmpk+frpdfftl0DrxUTU2NbrrpJhUVFZlOgRf67W9/q1mzZmnWrFl6+umnTefACz377LOaOXOmZs2apRdffNF0DrzUU089pe9973umM+Cl7rnnHs2aNUuzZ8/W7NmztWfPHtNJ8CKrV6/W7bffrhtuuEH//d//bToHXui1115r/f4ze/ZsjRgxQj/5yU865L4DOuRe4NOKi4v1m9/8Rm+88YaCgoI0b948ZWVlKS0tzXQavMiePXu0aNEiHTt2zHQKvNDGjRu1fv16LV++XDabTffee69ycnI0ffp002nwElu3btXmzZv19ttvq6WlRTNnztSkSZOUkpJiOg1eZNOmTVq+fLkmT55sOgVeyLIsHTlyRGvWrFFAAL+G4cqcOHFCP/rRj/Taa68pNjZWX/rSl7R27VpNmjTJdBq8yJ133qk777xTkpSXl6cHH3xQDz30UIfcN69cQps2btyoMWPGqHv37goLC9P111+vDz74wHQWvMzSpUv1ox/9SAkJCaZT4IXi4+P1ve99T0FBQQoMDFRqaqpOnTplOgteZPTo0frb3/6mgIAAlZeXy+VyKSwszHQWvMjZs2f1m9/8Rvfff7/pFHipI0eOyGaz6etf/7puueUWvfTSS6aT4EVycnI0c+ZMJSYmKjAwUL/5zW80ZMgQ01nwYk888YQeeeQRxcTEdMj9MZmjTSUlJYqPj2/9OCEhQXv37jVYBG/05JNPmk6AF0tPT2/9+2PHjum9997TkiVLDBbBGwUGBuq5557TX/7yF91www1yOp2mk+BFfvjDH+qRRx7R6dOnTafAS1VVVWns2LF64okn1NDQoHvuuUfJyckaP3686TR4gcLCQgUGBuprX/uaSktLNWXKFH3rW98ynQUvtXHjRjU0NOjGG2/ssPvklUtok2VZF1xms9kMlADwd3l5efrqV7+q7373u+rXr5/pHHihhx9+WJs2bdLp06e1dOlS0znwEq+99pp69OihsWPHmk6BFxs2bJiefvpphYWFKSYmRnPmzNHatWtNZ8FLuFwubdq0Sc8884yWLl2qffv2afny5aaz4KWWLFmir3zlKx16n4xLaJPT6VRZWVnrxyUlJRzaBKDL7dixQ1/+8pf16KOP6rbbbjOdAy9TUFCggwcPSpJCQ0M1Y8YMHT582HAVvMV7772nDRs2aPbs2Xruuee0evVq/exnPzOdBS+zfft2bdq0qfVjy7I49xIuW1xcnMaOHauYmBiFhIRo2rRpHE2CdmlqatK2bds0derUDr1fxiW0ady4cdq0aZMqKipUX1+vjz76SBMnTjSdBcCPnD59Wg8++KB++ctfatasWaZz4IWKioq0aNEiNTU1qampSatWrdKIESNMZ8FLvPjii3rnnXf01ltv6eGHH9bUqVP1gx/8wHQWvEx1dbWefvppNTY2qqamRsuXL+eNKXDZpkyZovXr16uqqkoul0uffPKJBg0aZDoLXujw4cPq169fh597kqkcbXI6nXrkkUd0zz33qLm5WXPmzNHgwYNNZwHwI3/+85/V2NioX/ziF62XzZs3T/PnzzdYBW8yadIk7dmzR7feeqscDodmzJjBUAmgS02ZMqX1+5Db7daCBQs0bNgw01nwEkOGDNG9996rBQsWqLm5WePHj9cdd9xhOgte6MSJE0pMTOzw+7VZFzuhDgAAAAAAAHAZOCwOAAAAAAAA7ca4BAAAAAAAgHZjXAIAAAAAAEC7MS4BAAAAAACg3RiXAAAAAAAA0G6MSwAAAAAAAGg3xiUAAAAAAAC0G+MSAADwalOnTtXGjRtNZwAAAPgtxiUAAIAOVFFRof79+6u4uNh0CgAAQJdgXAIAALhKv/zlL/XJJ59Ikg4dOqSYmBg5nU7DVZ95+OGHlZub2/pxUVGRhg0b1q77qq2t1b333quGhoaOygMAAD6AcQkAAPiMgoIC3X333Ro5cqRmzZqlVatWtV63f/9+3XrrrRo2bJgefvhhfetb39JvfvObq37M3bt3Kz8/XxMmTJAkHTx4UAMGDLjq++0ITU1NKiwsVEZGRofcX3h4uG666SY9++yzHXJ/AADANzAuAQAAn9Dc3Kz7779f48eP18aNG7Vo0SJ9+9vf1pEjR9TU1KSHHnpIt912m7Zu3aqbbrpJK1eu7JDHff755zV37tzWjz1pXNq4caPGjh3bofd54403asWKFSorK+vQ+wUAAN6LcQkAAPiEPXv2qK6uTt/4xjcUFBSksWPHasqUKXr33Xe1Z88etbS06J577lFgYKBmzJiha6+9tvVzq6urNWfOHA0bNuy8Q8ieeeYZLViwQN/5znfU3Nx8wWNWVVVpx44dGj9+fOtlhw4d0sCBAy+47auvvqq777679a/Bgwdr7969rdfPmzdPv/3tbyV9duha//79tXnzZkmfvQJp1KhReumllyRJNTU1uv/++3X33Xdr7ty5Wrt27UW/JqtWrVJ2dvaVfBnbFBwcrOHDh1/yMQEAgP8JMB0AAADQEUpKSpSYmCi7/Z//76xnz54qLi5WSUmJnE6nbDZb63U9evRo/fuQkBD94Q9/0NNPP9162aFDh1RcXKzFixfrd7/7nT788EPddNNN5z1mYWGh4uPjFRQUJElqbGzU0aNHlZmZeUHf3LlzW1/htHr1ai1fvlyDBw+WJJ0+fVpOp1Nbt25tvf0111yjnJwcjRkzRps2bVLfvn1br3vrrbc0YcIELVy4UJZlqbq6+oLHc7vd2r17t5544onL+vp9rri4WH/729/U0tIiy7I0cOBA3Xbbbefdpk+fPjp69OgV3S8AAPBdvHIJAAD4hISEBJ05c0Zut7v1ss9Hm/j4eBUXF8uyrPOu+1xgYKBiYmLOu7+dO3fquuuukyRNmDBBO3fuvOAx7Xa7XC5X68e5ubkKCAhQcnLyJTsrKir07LPP6sc//nHrZR9++KFuvvlmpaSkqKCgQJLUq1cvnTp1SpZlKScnRzNmzGi9fXBwsHbv3q2ysjLZbDZFRUVd8Dh79uzRNddcI4fDccmWf+V2u/X222/rkUce0fe//3394Ac/UGpqqtasWXPe7Vwu1xXdLwAA8G2MSwAAwCcMHjxYISEh+tOf/qTm5mZt2bJFq1ev1syZMzV06FA5HA699NJLamlp0cqVK7Vv374vvL+qqipFRERIkiIjI3Xu3LkLbtO7d29VVFSosbFR0mevdkpNTVVLS4saGxvV2Niopqam8z7niSee0H/8x3+cN2atX79eEydO1E033aQPPvig9fJhw4Zp27ZtqqioUFxcXOvls2fPVnJysr72ta9p7ty5OnLkyAVtK1eu1LRp0y7jK/dPe/fu1a233qqAgAC9//77OnnypAYPHqz6+vrzbldUVPSFAxoAAPAvjEsAAMAnBAUF6YUXXtC6des0ZswY/fjHP9bTTz+t1NRUBQUF6fnnn9eyZcs0atQovf3225o8eXLr4WwXExkZqZqaGkmfnZOpW7duF9wmKipKI0aMaD030sGDB7V//34NHjy49a+ZM2e23v7NN99UZGSkpk6d2nrZmTNnlJeXpwceeEC/+93vzjuX0YwZM/Tzn/9co0ePPu9xAwMD9c1vflNvvfWWHn74YT3//PMXtG3cuLH1lVf/qq6uTsOGDTvvr8OHD8vhcLS+8uuFF17Q9u3bJem8Vyk1NTVp165d5/0ZAACAf+OcSwAAwKutXr269e/T09NbT3r9r6699lq99dZbrR/feeedmjJlyiXvd/jw4XrxxRd16623av369Ro+fPhFb/fggw/qhRde0KRJk/TDH/5QP/zhDy96u9OnT+uvf/3rBX0ffPCBvv/97+uGG26Q9Nkrmz5/tVO/fv00YsQI3XDDDdq4cWPr55w8ebL1XE+xsbHnHe73ueXLl1+0IykpSYcPH77odc3Nzfrb3/6mL33pS61fq3379p03Lr3zzju6+eabL3ooHgAA8E+MSwAAwC9s3bpVycnJio6O1ooVK3T48GFNmDCh9fqvf/3rOnjwoI4ePaq5c+fq9ttvV2xsrBYsWKAePXroq1/96kXvd/jw4UpOTta6des0ceLESz7+73//e1VVVemBBx5oveyb3/ymPvroI/3P//xP62VZWVl6//33Wz9etGjRBfeVm5urRx55RMHBwbIs65KD1pUKDAzUjTfeqF/96letr2BKT0/XnDlzJH32LnXvvPNO67vaAQAASJLNutj/6gIAAPAxr776qp599lnV19crKSlJjz76qCZPnmw6CwAAwOsxLgEAAAAAAKDdOKE3AAAAAAAA2o1xCQAAAAAAAO3GuAQAAAAAAIB2Y1wCAAAAAABAuzEuAQAAAAAAoN0YlwAAAAAAANBujEsAAAAAAABoN8YlAAAAAAAAtNv/D2ltZ660RybEAAAAAElFTkSuQmCC\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# make a plot of the luminosity distribution using Seaborn and Pandas\n", + "import seaborn as sns\n", + "import pandas as pd\n", + "from binarycpython.utils.functions import pad_output_distribution\n", + "\n", + "# set the figure size (for a Jupyter notebook in a web browser) \n", + "sns.set( rc = {'figure.figsize':(20,10)} )\n", + "\n", + "# this saves a lot of typing! \n", + "ldist = population.grid_results['luminosity distribution']\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "pad_output_distribution(ldist,\n", + " binwidth['luminosity'])\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict({'ZAMS luminosity distribution' : ldist})\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")" + ] + }, + { + "cell_type": "markdown", + "id": "7d7b275e-be92-4d59-b44d-ef6f24023cc3", + "metadata": {}, + "source": [ + "Does this look like a reasonable stellar luminosity function to you? The implication is that the most likely stellar luminosity is 10<sup>5.8</sup> L<sub>☉</sub>! Clearly, this is not very realistic... let's see what went wrong." + ] + }, + { + "cell_type": "markdown", + "id": "44586e42-b7cb-4a55-be0a-330b98b20de4", + "metadata": {}, + "source": [ + "## " + ] + }, + { + "cell_type": "markdown", + "id": "e32c3bbf-390f-45da-ad9c-cc3e7c9449dc", + "metadata": {}, + "source": [ + "## ZAMS Luminosity distribution with the initial mass function\n", + "\n", + "In the previous example, all the stars in our grid had an equal weighting. This is very unlikely to be true in reality: indeed, we know that low mass stars are far more likely than high mass stars. So we now include an initial mass function as a three-part power law based on Kroupa (2001). Kroupa's distribution is a three-part power law: we have a function that does this for us (it's very common to use power laws in astrophysics).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "1f37d2c0-1108-4ab9-a309-20b1e6b6e3fd", + "metadata": {}, + "outputs": [], + "source": [ + "# Update the probability distribution to use the three-part power law IMF \n", + "population.update_grid_variable(\n", + " name=\"M_1\",\n", + " probdist=\"three_part_powerlaw(M_1, 0.1, 0.5, 1.0, 150, -1.3, -2.3, -2.3)\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "6f4463e8-1935-45f2-8c5f-e7b215f8dc47", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Grid has handled 40 stars\n", + "with a total probability of 0.2182216189410787\n", + "Total starcount for this run will be: 40\n", + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Population-92de7c9221c54206ab4dd10e58e09a34 finished! The total probability was: 0.21822161894107872. It took a total of 1.5900418758392334s to run 40 systems on 2 cores\n", + "There were no errors found in this run.\n", + "OrderedDict([('luminosity distribution', OrderedDict([(2.25, 0.0164166), (3.25, 0.00515685), (0.25, 0.189097), (3.75, 0.0037453900000000004), (4.25, 0.0014346559999999999), (5.25, 0.0007493004), (4.75, 0.001171479), (5.75, 0.00039801020000000003), (6.25, 5.2369339999999996e-05)]))])\n" + ] + } + ], + "source": [ + "# Clean and re-evolve the population \n", + "population.clean()\n", + "analytics = population.evolve() \n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cfe45a9e-1121-43b6-b6b6-4de6f8946a18", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[None]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJgAAAJWCAYAAAAUZj1OAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABcnUlEQVR4nO3dd3SUZf7+8Wtm0gvpjQRIo0PovSNNiiDiBnXBsrqCsq6sK66CirroWlZ/lu/ay6oooIIIItIEhID03ksCBJIACYTQ0ub3R3TcCBjIk+SZSd6vczgn82QycyW5HTPX3M9nLHa73S4AAAAAAACgnKxmBwAAAAAAAIBro2ACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIZQMAEAAAAAAMAQCiYAAAAAAAAYQsEEAAAAAAAAQ9zMDlCZcnLOqrjYbnaMaickxE8nT+aZHQMuivUDo1hDMIo1BKNYQzCKNQSjWEMwqrxryGq1KCjI97Kfq9YFU3GxnYKpkvBzhRGsHxjFGoJRrCEYxRqCUawhGMUaglEVvYY4RQ4AAAAAAACGUDABAAAAAADAkGp9ihwAAAAAAFWpqKhQOTnHVViYX2n3kZVlVXFxcaXdPqq/staQm5uHgoLCZLNdfW1EwQQAAAAAQAXJyTkuLy8f+fpGymKxVMp9uLlZVVhIwYTy+701ZLfbdfZsrnJyjis0NOqqb5NT5AAAAAAAqCCFhfny9a1VaeUSUNksFot8fWtd8y48CiYAAAAAACoQ5RJcXXnWMAUTAAAAAAAADKFgAgAAAACgGtq8eaPuuOPWUv+6d2+v77+f57jOV19NV8+eHXXy5IlSX9u1a1v97W/jSh07deqUevTooPfff1uSlJGRoQkTxuv220dq1Kg/6PHH/6GcnOxLcrz//tuOrzHivffe0ooVywzfzi++/vpLff31l5KkZ599ShkZx8p1O+PG/VkbNqzTrl079K9/PXPF6x09mq7nnnu6zCxdu7a9pvtfsWK5pk379JLbqWoM+QYAAAAAoBpq0aKVPvroM8fl6dOnav78b9Wz53WOY99+O0ddu/bQ3Lmzdfvtfyr19YcPH1Zubq5q1aolSVq6dLH8/Ws5Pv/ii89qwICB6tt3gCTpk08+1IsvPqdnn32xUr6fu+8eU6G3N2zYCMfHGzas05133mPo9ho1aqJ//KPJFT+fkXFM6elHysxyrXbv3lkht2MUBRMAAAAAANXc5s0b9fHHH+idd/4rT09PSdK+fXuVm3taEyZM1KRJEzRq1J2yWn890alr1+768celGjToBkklBVP37j0dn8/OPqGLFy84Lt900x+0c+eO383RtWtbrVixTpI0b94cbdy4XhMnTtaIEUPUu3dfpaSskM1m07333q9p0z7VkSOHdf/9D+q66/pqypTJatWqjVq1aqPHHvu74uMTtGfPbgUHh+iZZ/6lWrUCtHLlj3r33Tdltxerdu1oPfzwYwoODtEbb/w/rV37k2w2q7p27aG77vqzY1eVh4enTpw4rocf/qvuvnuMpk2bqrfe+kCS9N13c7V9+1b9/e+POr6H/Px8Pf/8M9q1a6ciI2vr9OlTkkpKqg8+eEdvvPGOpk37VN99962sVosaN26qCRMm6tVXX9LRo+n697+fV69e1+nNN19TUVGx4uMTFBVVW5L0pz/dK0l6/vkp2rlzuwICAvXoo08oMjJS48b9WXfd9We1bt1Wx44d1V/+cq9efPFVzZ49U5IUGRnl2IX1pz/de8WfxYgRQ3T99YO0enWKzp+/oEmTnlKjRo2vei1dCQUTAAAAAACVYOXWY1qxpXynXf0ei0Xq0jxKXZpf3VvI5+Rka/LkiXrkkccVHR3jOD5v3jfq3buPGjVqLJvNpp9+SlGnTl0dn+/du48+/vgDDRp0g06ePCG7XQoJCXV8/t57x+nppx/X+++/ozZt2qljx87q3btvub+v0NAwffrpDD377FP69NOP9Nprb2nr1s167bV/67rrSt/uvn179eijT6hBg0aaOPFhLVjwna67rp9efPFZvfnm+4qKqq3PPvtYL7/8gsaNe1CrV6fo009n6OLFi3r++X/q4sWLjtsaNeoOzZ79lV588VVFRkbp//7vNaWnH1F0dIy++26u7r239KmCX345XZI0deqXOnz4kG6//ZZSny8sLNSnn36kr7+eL6vVqpdffl7Hj2fpr3/9uz744B099NAj2rBhnQ4fPqQvv5wrPz+/S04hbNWqtR55ZKJmzvxCr776kp577qXL/szi4uI1dOhwSdKgQTc4bicnJ/uyP4t//vN5SVJAQIDeffdjffnlNH3yyQeaMsX4rjNmMAEAAAAAUE0VFxdr8uRJ6tOnf6ndR4WFhVqwYL769OkvSerdu69jJ8wvmjVL0qFDacrLy9PSpYvVq1fvUp/v2LGzZs2ap0cemaTAwCD95z+vaeLEh8udtWPHzpKkiIhItWzZWm5uboqMjNKZM2cuuW5QULAaNGgkSYqPT1Rubq527Niuxo2bOnYD3XDDcK1fv1ahoWHy9PTU2LF3acaMz3TPPWMdu7h+y2Kx6PrrB+n77+cpIyND2dnZatq0WanrbNq0Xr16lRRederUVfPmSaU+7+bmpmbNknT33aP14YfvavjwmxUWFn7JfdWpU09+fn6XHPf09FS/ftdLkvr3v14bN67/3Z/b5VzpZ/GLX37Wv/zsKgI7mAAAAAAAqATXssvoWri5WVVYWHxV1/3ww3dVWFige++9v9TxlSt/1JkzuXrssZJCqLCwUDk52crKylR4eISkkrKlS5duWrFimZYt+0FPPfWcZs6cIUnKzT2tjz56Tw888JA6duysjh0764477tbQof2Vk5OjoKCgK2ay2+2yWCwqLCwsddzd3d3xsc1m+93vy8PD45LbtNuLLzlWVFQkNzc3vfPOR9q0aYNWrVqpMWPu1Ouvv3PF2x44cIgeeugv8vDw0IABAy9zDUup+7pc1uee+7e2b9+q1atT9NBDD+iJJy4d/n2lkstq/fX27PaSwkoq+X384rc/u9+60s/iFx4enqU+VxHYwQQAAAAAQDW0du1qzZnztZ566jlHSfGLefO+0T33jNWXX87Rl1/O0ddff6fmzVtozpyvS12vd+++mjnzC7m5uZcqjXx9/bRixXJ9991cx7H09CMKDg5xDAW/nMDAQB08uF92u10rViyvmG/0Z02aNNOOHVt17NhRSdI338xU69ZttGfPLo0b92e1aNFK48Y9qNjYeB06lFbqa202m6OAiYyMUlhYuL7++isNGDDokvtp27a9Fi78XsXFxcrIOKatW7eU+nxOTo5uu22E4uMTdffdY9SuXQft379XNptbqZLnSs6fP+d4t7xvv52ttm3bS5ICAkp+dpL0449LL5u9rJ9FZWIHEwAAAAAA1dAnn3ykoqIi/f3vD5Q63r17T23YsE6PPvpkqeMjR/5R//73v3THHXc7jjVt2lwnT57QDTcMK3Vdm82ml156Va+//oree+8teXl5KTQ0TM8///Lv7j4aM2acJkwYr+DgECUltXQMyK4IwcEhevjhiXrssb+roKBQkZGR+sc/nlBoaKiaNUvS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zY4DF/TFF184Hn+GDh2qNm3a6Omnn66Q23arkFtBtZeZmalXXnlFM2fOlIeHh0aOHKkOHTooMTHR7GhwIZs3b9akSZOUmppqdhS4oJSUFK1YsUKzZs2SxWLR3XffrYULF6pv375mR4OLWLNmjVavXq1vvvlGhYWFGjhwoHr06KH4+Hizo8GFrFq1SrNmzVLPnj3NjgIXZLfbdeDAAS1dulRubjwVw7U5fPiwnnzySX3xxRcKCQnR7bffrmXLlqlHjx5mR4MLufnmm3XzzTdLkvbu3av7779f48aNq5DbZgcTrkpKSoo6duyowMBA+fj4qH///po/f77ZseBiZsyYoSeffFLh4eFmR4ELCgsL0z/+8Q95eHjI3d1dCQkJOnr0qNmx4ELat2+vjz/+WG5ubjp58qSKiork4+Njdiy4kFOnTumVV17RmDFjzI4CF3XgwAFZLBbdc889uuGGG/Tpp5+aHQkuZOHChRo4cKAiIyPl7u6uV155RS1atDA7FlzY5MmTNX78eAUHB1fI7VGb46pkZWUpLCzMcTk8PFxbtmwxMRFc0ZQpU8yOABdWv359x8epqamaN2+epk2bZmIiuCJ3d3e99tpr+uCDDzRgwABFRESYHQku5IknntD48eN17Ngxs6PAReXm5qpTp06aPHmyLly4oNGjRysuLk5dunQxOxpcQFpamtzd3fWnP/1Jx48fV69evfTggw+aHQsuKiUlRRcuXND1119fYbfJDiZcFbvdfskxi8ViQhIANd3evXt111136ZFHHlFsbKzZceCCHnjgAa1atUrHjh3TjBkzzI4DF/HFF18oKipKnTp1MjsKXFirVq30wgsvyMfHR8HBwRoxYoSWLVtmdiy4iKKiIq1atUovvviiZsyYoa1bt2rWrFlmx4KLmjZtmu68884KvU0KJlyViIgInThxwnE5KyuL05wAVLn169frjjvu0EMPPaQbb7zR7DhwMfv379fOnTslSd7e3urXr592795tciq4innz5mnlypUaOnSoXnvtNS1ZskTPPvus2bHgYtatW6dVq1Y5LtvtdmYx4aqFhoaqU6dOCg4OlpeXl6677jrOKkG55Ofna+3aterdu3eF3i4FE65K586dtWrVKmVnZ+v8+fNasGCBunfvbnYsADXIsWPHdP/99+ull17SoEGDzI4DF3TkyBFNmjRJ+fn5ys/P1+LFi9WmTRuzY8FFfPjhh5o7d65mz56tBx54QL1799Zjjz1mdiy4mDNnzuiFF17QxYsXlZeXp1mzZvFmFbhqvXr10ooVK5Sbm6uioiL9+OOPatq0qdmx4IJ2796t2NjYCp9FSV2OqxIREaHx48dr9OjRKigo0IgRI5SUlGR2LAA1yPvvv6+LFy/qX//6l+PYyJEjdcstt5iYCq6kR48e2rx5s4YNGyabzaZ+/fpRVgKoUr169XI8DhUXF+vWW29Vq1atzI4FF9GiRQvdfffduvXWW1VQUKAuXbropptuMjsWXNDhw4cVGRlZ4bdrsV9uuA4AAAAAAABwlThFDgAAAAAAAIZQMAEAAAAAAMAQCiYAAAAAAAAYQsEEAAAAAAAAQyiYAAAAAAAAYAgFEwAAAAAAAAyhYAIAAAAAAIAhFEwAAMDl9e7dWykpKWbHAAAAqLEomAAAACpYdna2GjZsqMzMTLOjAAAAVAkKJgAAgArw0ksv6ccff5Qk7dq1S8HBwYqIiDA5VYkHHnhAe/bscVw+cuSIWrVqVa7bOnv2rO6++25duHChouIBAIBqgIIJAABUK/v379eoUaPUtm1bDRo0SIsXL3Z8bvv27Ro2bJhatWqlBx54QA8++KBeeeUVw/e5adMm7du3T926dZMk7dy5U40aNTJ8uxUhPz9faWlpatCgQYXcnq+vrwYPHqxXX321Qm4PAABUDxRMAACg2igoKNCYMWPUpUsXpaSkaNKkSfr73/+uAwcOKD8/X+PGjdONN96oNWvWaPDgwVq0aFGF3O/rr7+u5ORkx2VnKphSUlLUqVOnCr3N66+/XnPmzNGJEycq9HYBAIDromACAADVxubNm3Xu3Dn9+c9/loeHhzp16qRevXrp22+/1ebNm1VYWKjRo0fL3d1d/fr1U/PmzR1fe+bMGY0YMUKtWrUqdTrZiy++qFtvvVUPP/ywCgoKLrnP3NxcrV+/Xl26dHEc27Vrlxo3bnzJdadPn65Ro0Y5/iUlJWnLli2Oz48cOVJvvPGGpJLT2Bo2bKjVq1dLKtmJ1K5dO3366aeSpLy8PI0ZM0ajRo1ScnKyli1bdtmfyeLFi9WnT59r+TGWydPTU61bt77ifQIAgJrHzewAAAAAFSUrK0uRkZGyWn99Da127drKzMxUVlaWIiIiZLFYHJ+LiopyfOzl5aV33nlHL7zwguPYrl27lJmZqc8++0xvvvmmvv/+ew0ePLjUfaalpSksLEweHh6SpIsXL+rgwYNq0qTJJfmSk5MdO52WLFmiWbNmKSkpSZJ07NgxRUREaM2aNY7rN2vWTAsXLlTHjh21atUq1atXz/G52bNnq1u3brrttttkt9t15syZS+6vuLhYmzZt0uTJk6/q5/eLzMxMffzxxyosLJTdblfjxo114403lrpO3bp1dfDgwWu6XQAAUH2xgwkAAFQb4eHhysjIUHFxsePYL8VNWFiYMjMzZbfbS33uF+7u7goODi51exs2bFDXrl0lSd26ddOGDRsuuU+r1aqioiLH5T179sjNzU1xcXFXzJmdna1XX31VTz31lOPY999/ryFDhig+Pl779++XJEVHR+vo0aOy2+1auHCh+vXr57i+p6enNm3apBMnTshisahWrVqX3M/mzZvVrFkz2Wy2K2b5reLiYn3zzTcaP368Hn30UT322GNKSEjQ0qVLS12vqKjomm4XAABUbxRMAACg2khKSpKXl5fee+89FRQU6KefftKSJUs0cOBAtWzZUjabTZ9++qkKCwu1aNEibd269XdvLzc3V35+fpIkf39/nT59+pLr1KlTR9nZ2bp48aKkkl1PCQkJKiws1MWLF3Xx4kXl5+eX+prJkyfrr3/9a6lCa8WKFerevbsGDx6s+fPnO463atVKa9euVXZ2tkJDQx3Hhw4dqri4OP3pT39ScnKyDhw4cEm2RYsW6brrrruKn9yvtmzZomHDhsnNzU3fffed0tPTlZSUpPPnz5e63pEjR363RAMAADULBRMAAKg2PDw89NZbb2n58uXq2LGjnnrqKb3wwgtKSEiQh4eHXn/9dX355Zdq166dvvnmG/Xs2dNxatvl+Pv7Ky8vT1LJjKaAgIBLrlOrVi21adPGMStp586d2r59u5KSkhz/Bg4c6Lj+119/LX9/f/Xu3dtxLCMjQ3v37tXYsWP15ptvlppt1K9fPz333HNq3759qft1d3fXfffdp9mzZ+uBBx7Q66+/fkm2lJQUxw6s3zp37pxatWpV6t/u3btls9kcO8DeeustrVu3TpJK7VbKz8/Xxo0bS30PAACgZmMGEwAAcHlLlixxfFy/fn3HIOzfat68uWbPnu24fPPNN6tXr15XvN3WrVvrww8/1LBhw7RixQq1bt36ste7//779dZbb6lHjx564okn9MQTT1z2eseOHdNHH310Sb758+fr0Ucf1YABAySV7HD6ZddTbGys2rRpowEDBiglJcXxNenp6Y7ZTyEhIaVO/fvFrFmzLpsjJiZGu3fvvuznCgoK9PHHH+v22293/Ky2bt1aqmCaO3euhgwZctnT8gAAQM1EwQQAAGqMNWvWKC4uTkFBQZozZ452796tbt26OT5/zz33aOfOnTp48KCSk5M1fPhwhYSE6NZbb1VUVJTuuuuuy95u69atFRcXp+XLl6t79+5XvP+3335bubm5Gjt2rOPYfffdpwULFuj//u//HMc6dOig7777znF50qRJl9zWnj17NH78eHl6esput1+x1LpW7u7uuv766/Xvf//bsZOpfv36GjFihKSSd6+bO3eu493uAAAAJMliv9zLXQAAANXQ9OnT9eqrr+r8+fOKiYnRQw89pJ49e5odCwAAwOVRMAEAAAAAAMAQhnwDAAAAAADAEAomAAAAAAAAGELBBAAAAAAAAEMomAAAAAAAAGAIBRMAAAAAAAAMoWACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIb8fxzqA03KlXkqAAAAAElFTkSuQmCC\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot luminosity distribution\n", + "ldist = population.grid_results['luminosity distribution']\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "pad_output_distribution(ldist,\n", + " binwidth['luminosity'])\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict({'ZAMS luminosity distribution' : ldist})\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")" + ] + }, + { + "cell_type": "markdown", + "id": "0546f2f3-4732-4841-8ef3-565fbf6b9961", + "metadata": {}, + "source": [ + "This distribution is peaked at low luminosity, as one expects from observations, but the resolution is clearly not great because it's not smooth - it's spiky! \n", + "\n", + "If you noticed above, the total probability of the grid was about 0.2. Given that the total probability of a probability distribution function should be 1.0, this shows that our sampling is (very) poor. \n", + "\n", + "We could simply increase the resolution to compensate, but this is very CPU intensive and a complete waste of time and resources. Instead, let's try sampling the masses of the stars in a smarter way." + ] + }, + { + "cell_type": "markdown", + "id": "673031c9-7d80-45d4-b209-301c127d3edf", + "metadata": {}, + "source": [ + "# A better-sampled grid\n", + "\n", + "The IMF has many more low-mass stars than high-mass stars. So, instead of sampling M1 linearly, we can sample it in log space. \n", + "\n", + "To do this we first rename the mass grid variable so that it is clear we are working in (natural) logarithmic phase space." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "5956f746-e3b9-4912-b75f-8eb0af66d3f6", + "metadata": {}, + "outputs": [], + "source": [ + "# Rename the old variable (M_1) because we want it to be called lnM_1 now\n", + "population.rename_grid_variable(\"M_1\",\"lnM_1\")" + ] + }, + { + "cell_type": "markdown", + "id": "532f691c-c1f6-46cc-84f2-970ec1216e40", + "metadata": {}, + "source": [ + "Next, we change the spacing function so that it works in the log space. We also adapt the probability calculation so that it calculates dprob/dlnM = M * dprob/dM. Finally, we set the precode to compute M_1 because binary_c requires the actual mass, not the logarithm of the mass." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "108d470a-bb21-40b0-8387-2caa7ab0f923", + "metadata": {}, + "outputs": [], + "source": [ + "# update the sampling, note that the IMF is dprob/dM1, and the phase \n", + "# space is now sampled in lnM1, so we multiply by M_1 to \n", + "# because M * dprob/dM = dprob/dlnM\n", + "population.update_grid_variable(\n", + " name=\"lnM_1\",\n", + " spacingfunc=\"const(math.log({min}), math.log({max}), {res})\".format(min = massrange[0], max = massrange[1], res = resolution[\"M_1\"]),\n", + " probdist=\"three_part_powerlaw(M_1, 0.1, 0.5, 1.0, 150, -1.3, -2.3, -2.3)*M_1\",\n", + " dphasevol=\"dlnM_1\",\n", + " parameter_name=\"M_1\",\n", + " precode=\"M_1=math.exp(lnM_1)\",\n", + ")\n", + "# print(population.grid_options[\"_grid_variables\"]) # debugging" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "fb8db646-f3d0-4ccd-81ba-7fde23f29c79", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating grid code\n", + "Constructing/adding: lnM_1\n", + "Grid has handled 40 stars\n", + "with a total probability of 0.9956307907476224\n", + "Total starcount for this run will be: 40\n", + "Generating grid code\n", + "Constructing/adding: lnM_1\n", + "Population-83f80d829dbd418aa2bc745c99b71991 finished! The total probability was: 0.9956307907476224. It took a total of 0.9961590766906738s to run 40 systems on 2 cores\n", + "There were no errors found in this run.\n", + "OrderedDict([('luminosity distribution', OrderedDict([(0.25, 0.0212294), (2.75, 0.00321118), (-0.25, 0.0268827), (1.25, 0.0104553), (3.75, 0.00283037), (6.25, 7.34708e-05), (-0.75, 0.0771478), (0.75, 0.030004499999999996), (2.25, 0.00921541), (3.25, 0.0045385), (1.75, 0.014776889999999999), (4.25, 0.002380189), (4.75, 0.000869303), (5.25, 0.0007310379999999999), (5.75, 0.00036002859999999996), (-2.75, 0.1961345), (-1.75, 0.2181597), (-3.25, 0.0), (-2.25, 0.2568974), (-1.25, 0.11973310000000001)]))])\n" + ] + } + ], + "source": [ + "# Clean and re-evolve the population \n", + "population.clean()\n", + "analytics = population.evolve() \n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "markdown", + "id": "182b1094-5057-4ccf-bac6-9b0e560ad4f6", + "metadata": {}, + "source": [ + "You should see that the total probability is very close to 1.0, as you would expect for a well-sampled grid. The total will never be exactly 1.0, but that is because we are running a simulation, not a perfect copy of reality." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "68ee1e56-21e5-48f4-b74c-50e48685ae94", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJgAAAJWCAYAAAAUZj1OAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAB37ElEQVR4nOzdd3iV9f3/8dcZ2XtPstkhrLD3ElkyREGtA+vA0eHXqq1SRa221rb+2lpx1C3WVYaAKEtUlpAwE0YgJJCQkAGEEFbW+f2BpqUKAZJz7pOc5+O6uC7PneTcrxy8Q/LK5/O+TTabzSYAAAAAAADgCpmNDgAAAAAAAICWjYIJAAAAAAAATULBBAAAAAAAgCahYAIAAAAAAECTUDABAAAAAACgSSiYAAAAAAAA0CQUTAAAAAAAAGgSq9EB7OnYsZOqr7fZ9RwhIb46cqTKrucAnBnXAMB1AHANwNVxDcDVcQ24DrPZpKAgnx99W6sumOrrbXYvmL4/D+DKuAYArgOAawCujmsAro5rAGyRAwAAAAAAQJNQMAEAAAAAAKBJWvUWOQAAAAAAHKmurlbHjpWptrba6CgOU1pqVn19vdEx0IysVncFBYXJYrn02oiCCQAAAACAZnLsWJk8Pb3l4xMpk8lkdByHsFrNqq2lYGotbDabTp6s1LFjZQoNjbrkj2OLHAAAAAAAzaS2tlo+Pv4uUy6h9TGZTPLx8b/sVXgUTAAAAAAANCPKJbR0V/L/MAUTAAAAAAAAmoSCCQAAAACAVmjbti267bYbz/szeHBvffHFZw3v8+9/f6ihQ/vqyJHy8z524MB0/d//3X/esYqKCg0Z0kevv/6KJOnw4cN6+OEHdNNN1+vmm6/Xb3/7ax07dvQHOV5//ZWGj2mKf/7zZa1Z81WTn+d7CxZ8ogULPpEkPfvskzp8uPiKnuf+++/S5s0Z2r17p/7wh6cv+H5FRYf0+98/1WiWgQPTL+v8a9Z8rQ8+eO8Hz+NoDPkGAAAAAKAV6tq1u9566/2Gxx9+OFeff75EQ4eOaDi2ZMkiDRw4RIsXL9Stt/70vI8vKChQZWWl/P39JUmrV6+Un59/w9uff/5ZXX31WI0ZM1a1tfV699039fzzv9ezzz5vl8/njjtmNuvzTZo0teG/N2/O0IwZdzbp+Tp06KRf/7rTBd9++HCxDh0qbDTL5dqzZ1ezPE9TUTABAAAAANDKbdu2Re+884ZeffVteXh4SJL27durysrjevjhxzRr1sO6+eYZMpv/s9Fp4MDB+uab1Ro37hpJ5wqmwYOHNrz96NFynT17puHxtdder127dl40x8CB6VqzJkOS9Nlni7RlS6Yee2y2pk6doOHDR2ndujWyWCy6++779MEH76mwsED33fdLjRgxSs88M1vdu/dU9+499eijv1JSUrJycvYoODhETz/9B/n7B2jt2m/02mtzZLPVKzo6Rg899KiCg0P04ov/T5s2fSuLxayBA4fo9tvvalhV5e7uofLyMj300C90xx0z9cEHc/Xyy29IkpYuXazs7B361a9+0/A5VFdX67nnntbu3bsUGRmt48crJJ0rqd5441W9+OKr+uCD97R06RKZzSZ17NhZDz/8mP761z+pqOiQ/vzn5zRs2AjNmfM31dXVKykpWVFR0ZKkn/70bknSc889o127shUQEKjf/OZxRUZG6v7779Ltt9+lHj3SVVxcpJ/97G49//xftXDhPElSZGRUwyqsn/707gu+FlOnTtDo0WO1ceN6nT59RrNmPakOHTpe8v9LF0LBBAAAAACAHazdUaw1269s21VjBqZFaUCXS7uF/LFjRzV79mN65JHfKiYmtuH4Z599quHDR6pDh46yWCz69tt16tdvYMPbhw8fqXfeeUPjxl2jI0fKZbNJISGhDW+/++779dRTv9Xrr7+qnj17qW/f/ho+fNQVf06hoWF6772P9OyzT+q9997S3/72snbs2Ka//e3PGjHi/Ofdt2+vfvObx9WuXQc99thDWrZsqUaMuErPP/+s5sx5XVFR0Xr//Xf0l7/8Ufff/0tt2LBO7733kc6ePavnnvudzp492/BcN998mxYu/Leef/6vioyM0j/+8TcdOlSomJhYLV26WHffff5WwU8++VCSNHfuJyooOKhbb73hvLfX1tbqvffe0oIFn8tsNusvf3lOZWWl+sUvfqU33nhVDz74iDZvzlBBwUF98sli+fr6/mALYffuPfTII49p3ryP9de//km///2ffvQ1S0xM0sSJUyRJ48Zd0/A8x44d/dHX4ne/e06SFBAQoNdee0effPKB3n33DT3zTNNXnTGDCQAAAACAVqq+vl6zZ8/SyJGjz1t9VFtbq2XLPtfIkaMlScOHj2pYCfO91NQ0HTx4QFVVVVq9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hQsXasKECfzDApdQUlKiF154Qe+//74WLlyoDz/8UPv27TM6FuAw69at05o1azR//nwtWLBA2dnZWr58udGxAIdbv3695s+fb3QMwBAFBQV64okn9NJLL2nRokXauXOnvvrqK6NjwSAUTM3gD3/4g2677TajYwCGqK6u1i9+8Qt16NBBktS+fXsVFxcbnAqwv3Xr1qlv374KDAyUt7e3Ro8erc8//9zoWIDDhIWF6de//rXc3d3l5uam5ORkFRUVGR0LcKiKigq98MILmjlzptFRAEMsX75cY8eOVWRkpNzc3PTCCy+oa9euRseCQSiYmmjlypU6c+aMrr76aqOjAIZwd3fXxIkTJUn19fV68cUXNXLkSINTAfZXWlqqsLCwhsfh4eEqKSkxMBHgWG3btlW3bt0kSfn5+frss880ZMgQY0MBDvb444/rgQcekL+/v9FRAEMcOHBAdXV1+ulPf6prrrlG77//vgICAoyOBYNYjQ7QUixdulS///3vzzuWlJSkqqoqvfXWW8aEAhzsQtfBW2+9perqav36179WbW2t7r77boMSAo5js9l+cMxkMhmQBDDW3r17dffdd+uRRx5RQkKC0XEAh/n4448VFRWlfv36ad68eUbHAQxRV1enjIwMvfvuu/L29ta9996r+fPna8qUKUZHgwEomC7RmDFjNGbMmPOOffzxx3rllVd00003NRybOHGi5s6dK19fX0dHBOzux64DSTp58qTuueceBQYGas6cOXJzczMgHeBYERERysjIaHhcWlqq8PBwAxMBjpeZmamf//znevTRRzVu3Dij4wAO9dlnn6msrEwTJ07U8ePHderUKT377LN69NFHjY4GOExoaKj69eun4OBgSdKIESO0fft2CiYXZbL92K9gcUXat2+vPXv2GB0DcLh7771XISEheuqpp1jBAZdRUlKiG264QZ988om8vLw0ffp0Pf3000pLSzM6GuAQxcXFmjx5sl544QX169fP6DiAoebNm6eNGzfqD3/4g9FRAIfatm2bHnnkEX300Ufy8fHRfffdpxEjRui6664zOhoMwAomAE2yc+dOrVy5UikpKZo0aZKkc7NoXnvtNWODAXYWERGhBx54QLfccotqamo0depUyiW4lNdff11nz5497wfq6dOn64YbbjAwFQDAkbp27ao77rhDN954o2pqajRgwABde+21RseCQVjBBAAAAAAAgCbhLnIAAAAAAABoEgomAAAAAAAANAkFEwAAAAAAAJqEggkAAAAAAABNQsEEAAAAAACAJqFgAgAAAAAAQJNQMAEAAAAAAKBJKJgAAECLN3z4cK1bt87oGAAAAC6LggkAAKCZHT16VO3bt1dJSYnRUQAAAByCggkAAKAZ/OlPf9I333wjSdq9e7eCg4MVERFhcKpzfv7znysnJ6fhcWFhobp3735Fz3Xy5EndcccdOnPmTHPFAwAArQAFEwAAaFVyc3N18803Kz09XePGjdPKlSsb3padna1Jkyape/fu+vnPf65f/vKXeuGFF5p8zq1bt2rfvn0aNGiQJGnXrl3q0KFDk5+3OVRXV+vAgQNq165dszyfj4+Pxo8fr7/+9a/N8nwAAKB1oGACAACtRk1NjWbOnKkBAwZo3bp1mjVrln71q19p//79qq6u1v3336/Jkydr48aNGj9+vFasWNEs5/373/+uadOmNTx2poJp3bp16tevX7M+55gxY7Ro0SKVl5c36/MCAICWi4IJAAC0Gtu2bdOpU6d01113yd3dXf369dOwYcO0ZMkSbdu2TbW1tbrlllvk5uamq666Sl26dGn42BMnTmjq1Knq3r37edvJnn/+ed1444166KGHVFNT84NzVlZWKjMzUwMGDGg4tnv3bnXs2PEH7/vhhx/q5ptvbviTlpam7du3N7x9+vTpevHFFyWd28bWvn17bdiwQdK5lUi9evXSe++9J0mqqqrSzJkzdfPNN2vatGn66quvfvQ1WblypUaOHHk5L2OjPDw81KNHjwueEwAAuB6r0QEAAACaS2lpqSIjI2U2/+d3aNHR0SopKVFpaakiIiJkMpka3hYVFdXw356ennr11Vf1xz/+seHY7t27VVJSovfff19z5szRF198ofHjx593zgMHDigsLEzu7u6SpLNnzyovL0+dOnX6Qb5p06Y1rHRatWqV5s+fr7S0NElScXGxIiIitHHjxob3T01N1fLly9W3b1+tX79e8fHxDW9buHChBg0apJtuukk2m00nTpz4wfnq6+u1detWzZ49+5Jev++VlJTonXfeUW1trWw2mzp27KjJkyef9z5xcXHKy8u7rOcFAACtFyuYAABAqxEeHq7Dhw+rvr6+4dj3xU1YWJhKSkpks9nOe9v33NzcFBwcfN7zbd68WQMHDpQkDRo0SJs3b/7BOc1ms+rq6hoe5+TkyGq1KjEx8YI5jx49qr/+9a968sknG4598cUXmjBhgpKSkpSbmytJiomJUVFRkWw2m5YvX67/3979hTT1xnEc/8icduEWsm4EhcbYXY02Mb1xLgMxMRpSDLoRjC5cUIhXioy6EgQvRKQJQRHeCEFtDiYxhgwZ9Af6IyIrqJtGXYSQRGN/yt+FdH6szfjFLn6k7xcc2HnO9zznOefys+c8p6+vz6hvbGzUy5cv9fnzZ9XV1clqtVZc59WrVzpx4oRMJtO+Y/nVjx8/FI1GNTY2pomJCU1OTsrhcGhtba2s7vv373/ULwAAONgImAAAwIHhcrl05MgR3blzR8ViUU+ePFEymdTAwIBOnTolk8mkpaUllUolJRIJbWxs/La/nZ0dNTU1SZIsFou+fPlSUdPW1qbt7W3l83lJe7OeHA6HSqWS8vm88vm8CoVC2Tk3b97UjRs3ygKt9fV1eb1eDQ4OanV11Wh3u9169uyZtre3dezYMaP9woULstvtunLligKBgN69e1cxtkQiobNnz/6HJ/ev169fy+/3q76+XvF4XNlsVi6XS7lcrqzuw4cPvw3RAADA4ULABAAADoyGhgaFw2GlUil1dXXp1q1bmpmZkcPhUENDg+bn5/XgwQN1dHQoGo3K5/MZr7ZVY7FY9PXrV0l7azQdPXq0osZqtaq9vd1YK2lra0ubm5tyuVzGNjAwYNQ/evRIFotFvb29RtunT5/09u1bjY6O6vbt22VrG/X19Wl6elqnT58uu67ZbFYwGFQkEtH169c1Pz9fMbZ0Om3MwPrVt2/f5Ha7y7ZMJiOTyWTMAAuHw3r+/Lkklc1WKhQKevHiRdk9AACAw401mAAAwF8vmUwav51Op7EQ9q9OnjypSCRi7F+6dElnzpzZt1+Px6O7d+/K7/drfX1dHo+nat21a9cUDofV09OjUCikUChUte7jx4+6d+9exfhWV1c1MTGh/v5+SXsznH7Oejp+/Lja29vV39+vdDptnJPNZo21n2w2W9mrfz89fPiw6jhaW1uVyWSqHisWi7p//76Gh4eNZ7WxsVEWMMViMZ0/f77qa3kAAOBwImACAACHxtOnT2W329Xc3KyVlRVlMhl1d3cbx69evaqtrS29f/9egUBAQ0NDstlsunz5slpaWjQyMlK1X4/HI7vdrlQqJa/Xu+/1FxcXtbOzo9HRUaMtGAzq8ePHWlhYMNo6OzsVj8eN/ampqYq+3rx5o7GxMTU2Nmp3d3ffUOtPmc1mnTt3TrOzs8ZMJqfTqYsXL0ra+3pdLBYzvnYHAAAgSXW71f7uAgAAOICWl5c1NzenXC6n1tZWjY+Py+fz/d/DAgAA+OsRMAEAAAAAAKAmLPINAAAAAACAmhAwAQAAAAAAoCYETAAAAAAAAKgJARMAAAAAAABqQsAEAAAAAACAmhAwAQAAAAAAoCYETAAAAAAAAKgJARMAAAAAAABq8g/wlbD9p3152QAAAABJRU5ErkJggg==\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot luminosity distribution\n", + "ldist = population.grid_results['luminosity distribution']\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "pad_output_distribution(ldist,\n", + " binwidth['luminosity'])\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict({'ZAMS luminosity distribution' : ldist})\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "31fe91bb-177d-4e4e-90cf-298a3f8a8b61", + "metadata": {}, + "source": [ + "Most stars are low mass red dwarfs, with small luminosities. Without the IMF weighting, our model population would have got this completely wrong! \n", + "\n", + "As you increase the resolution, you will see this curve becomes even smoother. The wiggles in the curve are (usually) sampling artefacts because the curve should monotonically brighten above about log(*L*/L<sub>☉</sub>)=-2. \n", + " \n", + "Remember you can play with the binwidth too. If you want a very accurate distribution you need a narrow binwidth, but then you'll also need high resolution (lots of stars) so lots of CPU time, hence cost, CO<sub>2</sub>, etc." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/build/html/_sources/notebook_population.ipynb.txt b/docs/build/html/_sources/notebook_population.ipynb.txt index b6a37baa8d90a2f36c0fd19311548ed49e77f173..f6f27ee4329b90d22651068ea0aca8d8756c5eb9 100644 --- a/docs/build/html/_sources/notebook_population.ipynb.txt +++ b/docs/build/html/_sources/notebook_population.ipynb.txt @@ -23,9 +23,12 @@ "outputs": [], "source": [ "import os\n", + "\n", "from binarycpython.utils.custom_logging_functions import temp_dir\n", "from binarycpython.utils.grid import Population\n", "\n", + "TMP_DIR = temp_dir(\"notebooks\", \"notebook_population\")\n", + "\n", "# help(Population) # Uncomment to see the public functions of this object" ] }, @@ -60,7 +63,8 @@ "adding: max_evolution_time=15000 to BSE_options\n", "adding: eccentricity=0.02 to BSE_options\n", "adding: amt_cores=2 to grid_options\n", - "<<<< Warning: Key does not match previously known parameter: adding: data_dir=/tmp/binary_c_python/example_python_population_result to custom_options >>>>\n", + "adding: tmp_dir=/tmp/binary_c_python/notebooks/notebook_population to grid_options\n", + "<<<< Warning: Key does not match previously known parameter: adding: data_dir=/tmp/binary_c_python/notebooks/notebook_population/example_python_population_result to custom_options >>>>\n", "<<<< Warning: Key does not match previously known parameter: adding: base_filename=example_pop.dat to custom_options >>>>\n", "1\n", "example_pop.dat\n", @@ -88,11 +92,12 @@ "\n", "\n", " # grid_options\n", - " amt_cores=2, # grid_options\n", + " amt_cores=2,\n", + " tmp_dir=TMP_DIR,\n", " \n", " # Custom options # TODO: need to be set in grid_options probably\n", " data_dir=os.path.join(\n", - " temp_dir(), \"example_python_population_result\"\n", + " TMP_DIR, \"example_python_population_result\"\n", " ), # custom_options\n", " base_filename=\"example_pop.dat\", # custom_options\n", ")\n", @@ -133,13 +138,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "Writing settings to /tmp/binary_c_python/example_python_population_result/example_pop_settings.json\n" + "Writing settings to /tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/example_pop_settings.json\n" ] }, { "data": { "text/plain": [ - "'/tmp/binary_c_python/example_python_population_result/example_pop_settings.json'" + "'/tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/example_pop_settings.json'" ] }, "execution_count": 3, @@ -181,7 +186,7 @@ "text": [ "Help on method add_grid_variable in module binarycpython.utils.grid:\n", "\n", - "add_grid_variable(name:str, longname:str, valuerange:Union[list, str], resolution:str, spacingfunc:str, probdist:str, dphasevol:Union[str, int], parameter_name:str, gridtype:str='edge', branchpoint:int=0, precode:Union[str, NoneType]=None, condition:Union[str, NoneType]=None) -> None method of binarycpython.utils.grid.Population instance\n", + "add_grid_variable(name:str, longname:str, valuerange:Union[list, str], resolution:str, spacingfunc:str, probdist:str, dphasevol:Union[str, int], parameter_name:str, gridtype:str='centred', branchpoint:int=0, precode:Union[str, NoneType]=None, condition:Union[str, NoneType]=None) -> None method of binarycpython.utils.grid.Population instance\n", " Function to add grid variables to the grid_options.\n", " \n", " The execution of the grid generation will be through a nested for loop.\n", @@ -199,25 +204,25 @@ " name:\n", " name of parameter. This is evaluated as a parameter and you can use it throughout\n", " the rest of the function\n", - " \n", + " \n", " Examples:\n", " name = 'lnm1'\n", " longname:\n", " Long name of parameter\n", - " \n", + " \n", " Examples:\n", " longname = 'Primary mass'\n", " range:\n", " Range of values to take. Does not get used really, the spacingfunction is used to\n", " get the values from\n", - " \n", + " \n", " Examples:\n", " range = [math.log(m_min), math.log(m_max)]\n", " resolution:\n", " Resolution of the sampled range (amount of samples).\n", " TODO: check if this is used anywhere\n", " \n", - " Examples: \n", + " Examples:\n", " resolution = resolution[\"M_1\"]\n", " spacingfunction:\n", " Function determining how the range is sampled. You can either use a real function,\n", @@ -230,12 +235,12 @@ " precode:\n", " Extra room for some code. This code will be evaluated within the loop of the\n", " sampling function (i.e. a value for lnm1 is chosen already)\n", - " \n", + " \n", " Examples:\n", " precode = 'M_1=math.exp(lnm1);'\n", " probdist:\n", " Function determining the probability that gets assigned to the sampled parameter\n", - " \n", + " \n", " Examples:\n", " probdist = 'Kroupa2001(M_1)*M_1'\n", " dphasevol:\n", @@ -249,7 +254,7 @@ " condition = 'self.grid_options['binary']==1'\n", " gridtype:\n", " Method on how the value range is sampled. Can be either 'edge' (steps starting at\n", - " the lower edge of the value range) or 'center'\n", + " the lower edge of the value range) or 'centred'\n", " (steps starting at lower edge + 0.5 * stepsize).\n", "\n" ] @@ -313,7 +318,7 @@ " \"dphasevol\": \"dlnm1\",\n", " \"parameter_name\": \"M_1\",\n", " \"condition\": \"\",\n", - " \"gridtype\": \"edge\",\n", + " \"gridtype\": \"centred\",\n", " \"branchpoint\": 0,\n", " \"grid_variable_number\": 0\n", "}\n" @@ -457,7 +462,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "adding: parse_function=<function parse_function at 0x7ff3bdf79620> to grid_options\n" + "adding: parse_function=<function parse_function at 0x7f531bc3b6a8> to grid_options\n" ] } ], @@ -536,25 +541,25 @@ "Generating grid code\n", "Constructing/adding: lnm1\n", "Grid has handled 20 stars\n", - "with a total probability of 0.05150046619238192\n", + "with a total probability of 0.044402888438054094\n", "Total starcount for this run will be: 20\n", - "EXAMPLE_COMPACT_OBJECT 2.867655467480e+01 1.33079 9.81391 0.00167028 13\n", "Generating grid code\n", "Constructing/adding: lnm1\n", - "EXAMPLE_COMPACT_OBJECT 1.931266944719e+01 1.3933 12.3177 0.00124307 13\n", - "EXAMPLE_COMPACT_OBJECT 4.439623364590e+01 1.38004 7.81906 0.00224431 13\n", - "EXAMPLE_COMPACT_OBJECT 1.364277535630e+01 1.47961 15.4603 0.000925128 13\n", - "EXAMPLE_COMPACT_OBJECT 1.017435498578e+01 1.59052 19.4046 0.000688507 13\n", - "EXAMPLE_COMPACT_OBJECT 8.294870923827e+00 1.7197 24.3552 0.000512406 13\n", - "EXAMPLE_COMPACT_OBJECT 6.802132608769e+00 1.84162 30.5689 0.000381347 13\n", - "EXAMPLE_COMPACT_OBJECT 5.723570798020e+00 1.99471 38.3678 0.00028381 13\n", - "EXAMPLE_COMPACT_OBJECT 4.933751523833e+00 2.15875 48.1564 0.000211219 13\n", - "EXAMPLE_COMPACT_OBJECT 4.337250536639e+00 2.35209 60.4424 0.000157195 14\n", - "EXAMPLE_COMPACT_OBJECT 3.862081089332e+00 2.56776 75.8628 0.000116989 14\n", - "EXAMPLE_COMPACT_OBJECT 3.449960890183e+00 2.80457 95.2174 8.70668e-05 14\n", - "EXAMPLE_COMPACT_OBJECT 3.172196856333e+00 3.05193 119.51 6.47976e-05 14\n", - "EXAMPLE_COMPACT_OBJECT 3.069627290216e+00 3.27563 150 4.82242e-05 14\n", - "Population-2a7732d03e594ef4b5dfe9051b41d9c0 finished! The total probability was: 0.05150046619238191. It took a total of 0.7797017097473145s to run 20 systems on 2 cores\n", + "EXAMPLE_COMPACT_OBJECT 4.139293101586e+01 1.29427 8.13626 0.00202467 13\n", + "EXAMPLE_COMPACT_OBJECT 2.802986496151e+01 1.33699 10.0967 0.00152924 13\n", + "EXAMPLE_COMPACT_OBJECT 1.963621764679e+01 1.39754 12.5294 0.00115504 13\n", + "EXAMPLE_COMPACT_OBJECT 1.427601421985e+01 1.47745 15.5483 0.000872405 13\n", + "EXAMPLE_COMPACT_OBJECT 1.094409257247e+01 1.57571 19.2947 0.00065893 13\n", + "EXAMPLE_COMPACT_OBJECT 9.181971798545e+00 1.68748 23.9436 0.000497691 13\n", + "EXAMPLE_COMPACT_OBJECT 7.905335716621e+00 1.77287 29.7128 0.000375908 13\n", + "EXAMPLE_COMPACT_OBJECT 7.451192744924e+00 1.81495 36.872 0.000283924 13\n", + "EXAMPLE_COMPACT_OBJECT 7.396133472739e+00 1.82088 45.7561 0.000214449 13\n", + "EXAMPLE_COMPACT_OBJECT 7.396675941641e+00 1.82123 56.7809 0.000161974 13\n", + "EXAMPLE_COMPACT_OBJECT 7.404641347602e+00 1.82074 70.4621 0.000122339 13\n", + "EXAMPLE_COMPACT_OBJECT 7.444217227690e+00 1.81636 87.4397 9.2403e-05 13\n", + "EXAMPLE_COMPACT_OBJECT 7.453317880232e+00 1.81536 108.508 6.97923e-05 13\n", + "EXAMPLE_COMPACT_OBJECT 7.450828476484e+00 1.81563 134.653 5.27143e-05 13\n", + "Population-f28b5f98d7ef40dcb17fc2481a6d3ced finished! The total probability was: 0.04440288843805411. It took a total of 2.785212755203247s to run 20 systems on 2 cores\n", "There were no errors found in this run.\n" ] } @@ -586,7 +591,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'population_name': '2a7732d03e594ef4b5dfe9051b41d9c0', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 0.05150046619238191, 'total_count': 20, 'start_timestamp': 1628444120.234709, 'end_timestamp': 1628444121.0144107, 'total_mass_run': 730.1048014407228, 'total_probability_weighted_mass_run': 0.2983275843337705, 'zero_prob_stars_skipped': 0}\n" + "{'population_name': 'f28b5f98d7ef40dcb17fc2481a6d3ced', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 0.04440288843805411, 'total_count': 20, 'start_timestamp': 1629459533.935186, 'end_timestamp': 1629459536.7203987, 'total_mass_run': 684.2544031669779, 'total_probability_weighted_mass_run': 0.28134439269236855, 'zero_prob_stars_skipped': 0}\n" ] } ], @@ -660,42 +665,22 @@ "Generating grid code\n", "Constructing/adding: lnm1\n", "Saving grid code to grid_options\n", - "Writing grid code to /tmp/binary_c_python/binary_c_grid_2a7732d03e594ef4b5dfe9051b41d9c0.py\n", - "Loading grid code function from /tmp/binary_c_python/binary_c_grid_2a7732d03e594ef4b5dfe9051b41d9c0.py\n", + "Writing grid code to /tmp/binary_c_python/notebooks/notebook_population/binary_c_grid_f28b5f98d7ef40dcb17fc2481a6d3ced.py\n", + "Loading grid code function from /tmp/binary_c_python/notebooks/notebook_population/binary_c_grid_f28b5f98d7ef40dcb17fc2481a6d3ced.py\n", "Grid code loaded\n", - "Writing binary_c calls to /tmp/binary_c_python/example_python_population_result/binary_c_calls.txt\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", + "Writing binary_c calls to /tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/binary_c_calls.txt\n", "Grid has handled 20 stars\n", - "with a total probability of 0.05150046619238192\n", - "/tmp/binary_c_python/example_python_population_result/binary_c_calls.txt\n", - "binary_c M_1 2.0 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.013208238029791246\n", - "binary_c M_1 2.5102526289471614 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.009829948023831718\n", - "binary_c M_1 3.1506841305680684 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.0073157281034221516\n", - "binary_c M_1 3.9545065608702976 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.005444573822104362\n" + "with a total probability of 0.044402888438054094\n", + "/tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/binary_c_calls.txt\n", + "binary_c M_1 2.227955577093495 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.010905083645619543\n", + "binary_c M_1 2.7647737053496777 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.008236638755149857\n", + "binary_c M_1 3.4309362899259503 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.006221155214163634\n", + "binary_c M_1 4.257608426597089 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.004698855121516278\n" ] } ], "source": [ - "example_pop.set(verbosity=10)\n", + "example_pop.set(verbosity=1)\n", "calls_filename = example_pop.write_binary_c_calls_to_file()\n", "print(calls_filename)\n", "\n", @@ -725,39 +710,34 @@ "Generating grid code\n", "Constructing/adding: lnm1\n", "Grid has handled 20 stars\n", - "with a total probability of 0.05150046619238192\n", + "with a total probability of 0.044402888438054094\n", "Total starcount for this run will be: 20\n", "Generating grid code\n", "Constructing/adding: lnm1\n", - "Population-3680f3882c0a449c944462abffea2447 finished! The total probability was: 0.05150046619238191. It took a total of 0.6246354579925537s to run 20 systems on 2 cores\n", + "Population-e45c25448b32440cb7e220f4a3562907 finished! The total probability was: 0.04440288843805411. It took a total of 1.9539172649383545s to run 20 systems on 2 cores\n", "There were no errors found in this run.\n", "\n", "\n", "time mass zams_mass probability radius stellar_type\n", - "2.867655467480e+01 1.33079 9.81391 0.00167028 1.72498e-05 13\n", - "1.931266944719e+01 1.3933 12.3177 0.00124307 1.72498e-05 13\n", - "4.439623364590e+01 1.38004 7.81906 0.00224431 1.72498e-05 13\n", - "1.364277535630e+01 1.47961 15.4603 0.000925128 1.72498e-05 13\n", - "1.017435498578e+01 1.59052 19.4046 0.000688507 1.72498e-05 13\n", - "8.294870923827e+00 1.7197 24.3552 0.000512406 1.72498e-05 13\n", - "6.802132608769e+00 1.84162 30.5689 0.000381347 1.72498e-05 13\n", - "5.723570798020e+00 1.99471 38.3678 0.00028381 1.72498e-05 13\n", - "4.933751523833e+00 2.15875 48.1564 0.000211219 1.72498e-05 13\n", - "4.337250536639e+00 2.35209 60.4424 0.000157195 9.97286e-06 14\n", - "3.862081089332e+00 2.56776 75.8628 0.000116989 1.08873e-05 14\n", - "3.449960890183e+00 2.80457 95.2174 8.70668e-05 1.18914e-05 14\n", - "3.172196856333e+00 3.05193 119.51 6.47976e-05 1.29402e-05 14\n", - "3.069627290216e+00 3.27563 150 4.82242e-05 1.38887e-05 14\n", + "4.139293101586e+01 1.29427 8.13626 0.00202467 1.72498e-05 13\n", + "2.802986496151e+01 1.33699 10.0967 0.00152924 1.72498e-05 13\n", + "1.963621764679e+01 1.39754 12.5294 0.00115504 1.72498e-05 13\n", + "1.427601421985e+01 1.47745 15.5483 0.000872405 1.72498e-05 13\n", + "1.094409257247e+01 1.57571 19.2947 0.00065893 1.72498e-05 13\n", + "9.181971798545e+00 1.68748 23.9436 0.000497691 1.72498e-05 13\n", + "7.905335716621e+00 1.77287 29.7128 0.000375908 1.72498e-05 13\n", + "7.451192744924e+00 1.81495 36.872 0.000283924 1.72498e-05 13\n", + "7.396133472739e+00 1.82088 45.7561 0.000214449 1.72498e-05 13\n", + "7.396675941641e+00 1.82123 56.7809 0.000161974 1.72498e-05 13\n", + "7.404641347602e+00 1.82074 70.4621 0.000122339 1.72498e-05 13\n", + "7.444217227690e+00 1.81636 87.4397 9.2403e-05 1.72498e-05 13\n", + "7.453317880232e+00 1.81536 108.508 6.97923e-05 1.72498e-05 13\n", + "7.450828476484e+00 1.81563 134.653 5.27143e-05 1.72498e-05 13\n", "\n" ] } ], "source": [ - "import os\n", - "\n", - "from binarycpython.utils.grid import Population\n", - "from binarycpython.utils.custom_logging_functions import temp_dir\n", - "\n", "def parse_function(self, output):\n", " \"\"\"\n", " Example parsing function\n", @@ -817,11 +797,12 @@ " eccentricity=0.02, # bse_options\n", " \n", " # grid_options\n", - " amt_cores=2, # grid_options\n", + " amt_cores=2,\n", + " tmp_dir=TMP_DIR,\n", "\n", " # Custom options: the data directory and the output filename\n", " data_dir=os.path.join(\n", - " temp_dir(), \"example_python_population_result\"\n", + " TMP_DIR, \"example_python_population_result\"\n", " ), # custom_options\n", " base_filename=\"example_pop.dat\", # custom_options\n", ")\n", @@ -876,15 +857,15 @@ "example_pop.export_all_info()\n", "\n", "# remove the result file if it exists\n", - "if os.path.isfile(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\")):\n", - " os.remove(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"))\n", + "if os.path.isfile(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\")):\n", + " os.remove(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"))\n", "\n", "\n", "# Evolve the population\n", "example_pop.evolve()\n", "\n", "# \n", - "with open(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", + "with open(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", " output = f.read()\n", "print(\"\\n\")\n", "print(output)" @@ -912,96 +893,39 @@ "Constructing/adding: lnm1\n", "Constructing/adding: q\n", "Constructing/adding: log10per\n", - "Grid has handled 125 stars\n", - "with a total probability of 0.0862478164626921\n", - "Total starcount for this run will be: 125\n", + "Grid has handled 27 stars\n", + "with a total probability of 0.024868380796643753\n", + "Total starcount for this run will be: 27\n", "Generating grid code\n", "Constructing/adding: lnm1\n", "Constructing/adding: q\n", "Constructing/adding: log10per\n", - "Population-d20a4c74d20a43b881c0c9e5def5f76c finished! The total probability was: 0.08624781646269201. It took a total of 8.561265707015991s to run 125 systems on 2 cores\n", + "Population-05128ef4c5fe4274a0356c3e99e2f2d2 finished! The total probability was: 0.024868380796643757. It took a total of 9.792905807495117s to run 27 systems on 2 cores\n", "There were no errors found in this run.\n", "\n", "\n", "time mass_1 zams_mass_1 mass_2 zams_mass_2 stellar_type_1 prev_stellar_type_1 stellar_type_2 prev_stellar_type_2 metallicity probability\n", - "8.863377990313e+01 1.29444 5.88566 0 2.99283 13 5 15 15 0.02 0.000627913\n", - "1.146421815741e+02 0 5.88566 1.33062 4.43925 15 15 13 5 0.02 0.000627913\n", - "7.222715508467e+01 1.34922 5.88566 0 5.88566 13 5 15 15 0.02 0.000627913\n", - "1.350021848285e+01 1.48488 17.3205 0 0.1 13 5 15 15 0.02 0.000154349\n", - "1.171108213270e+01 1.53113 17.3205 0 0.1 13 5 15 15 0.02 0.000154349\n", - "1.171086983243e+01 1.53177 17.3205 0 0.1 13 9 15 15 0.02 0.000154349\n", - "1.170770599495e+01 1.53176 17.3205 0 4.40513 13 5 15 15 0.02 0.000172877\n", - "1.230407246199e+01 1.59499 17.3205 0 4.40513 13 5 15 15 0.02 0.000610573\n", - "1.108751340926e+01 1.70319 17.3205 0 8.71025 13 4 15 15 0.02 0.000610573\n", - "1.941017702765e+01 1.34903 17.3205 1.65097 8.71025 13 13 13 5 0.02 0.000172877\n", - "1.980988739731e+01 1.36979 17.3205 1.60808 8.71025 13 13 13 5 0.02 0.000121486\n", - "3.571858031651e+01 1.53174 17.3205 1.30504 8.71025 13 13 13 5 0.02 8.42148e-05\n", - "3.459153942631e+01 1.53176 17.3205 1.31004 8.71025 13 13 13 5 0.02 9.8162e-05\n", - "1.687368550125e+01 1.34937 17.3205 1.73856 13.0154 13 13 13 8 0.02 0.000172877\n", - "1.194842917007e+01 1.78096 17.3205 0 13.0154 13 8 15 15 0.02 0.000610573\n", - "1.733614170983e+01 1.53184 17.3205 1.42375 13.0154 13 13 13 5 0.02 9.8162e-05\n", - "1.723547465714e+01 1.38403 17.3205 1.71288 13.0154 13 13 13 8 0.02 0.000121486\n", - "1.764340254985e+01 1.53174 17.3205 1.41264 13.0154 13 13 13 5 0.02 8.42148e-05\n", - "1.170425790780e+01 1.52963 17.3205 0 17.3205 13 5 15 15 0.02 0.000172877\n", - "8.922967341481e+00 1.85486 17.3205 0 17.3205 13 8 15 15 0.02 0.000610573\n", - "1.232906623449e+01 1.41074 17.3205 1.34281 17.3205 13 13 13 8 0.02 0.000121486\n", - "1.170775828562e+01 1.53183 17.3205 1.53183 17.3205 13 5 13 5 0.02 9.8162e-05\n", - "1.170770422321e+01 1.53175 17.3205 1.53175 17.3205 13 5 13 5 0.02 8.42148e-05\n", - "5.075844624794e+00 2.12303 50.9713 0 0.1 13 8 15 15 0.02 3.79411e-05\n", - "4.766606588165e+00 2.20484 50.9713 0 0.1 14 8 15 15 0.02 3.79411e-05\n", - "4.768305081494e+00 2.18838 50.9713 0 0.1 13 8 15 15 0.02 3.79411e-05\n", - "4.458869865939e+00 2.29864 50.9713 0 12.8178 14 8 15 15 0.02 0.000150087\n", - "1.806014211040e+01 2.10446 50.9713 1.40749 12.8178 13 13 13 5 0.02 2.9863e-05\n", - "4.797342083485e+00 2.10328 50.9713 0 12.8178 13 13 15 1 0.02 4.24954e-05\n", - "1.721374713429e+01 2.21673 50.9713 1.42212 12.8178 14 14 13 5 0.02 2.41295e-05\n", - "4.055645404546e+00 2.47276 50.9713 0 25.5357 14 7 15 15 0.02 0.000150087\n", - "1.806123543037e+01 2.21893 50.9713 1.40745 12.8178 14 14 13 5 0.02 2.07011e-05\n", - "8.117519147635e+00 2.10433 50.9713 2.21473 25.5357 13 13 14 8 0.02 4.24954e-05\n", - "8.315554923168e+00 2.15343 50.9713 2.08519 25.5357 13 13 13 8 0.02 2.9863e-05\n", - "7.917420996633e+00 2.21892 50.9713 1.7431 25.5357 14 14 13 8 0.02 2.07011e-05\n", - "7.693213405973e+00 2.21805 50.9713 1.78384 25.5357 14 14 13 8 0.02 2.41295e-05\n", - "3.753837732894e+00 2.62517 50.9713 0 38.2535 14 7 15 15 0.02 0.000150087\n", - "7.087296558990e+00 2.10417 50.9713 2.40935 38.2535 13 13 14 8 0.02 4.24954e-05\n", - "7.007109286263e+00 2.15854 50.9713 2.28672 38.2535 13 13 14 8 0.02 2.9863e-05\n", - "5.653200958306e+00 2.21878 50.9713 2.0587 38.2535 14 14 13 8 0.02 2.41295e-05\n", - "5.733794947644e+00 2.21892 50.9713 1.99255 38.2535 14 14 13 8 0.02 2.07011e-05\n", - "3.513216011269e+00 2.76647 50.9713 0 50.9713 14 7 15 15 0.02 0.000150087\n", - "4.750574783854e+00 2.27442 50.9713 0 50.9713 14 8 15 15 0.02 4.24954e-05\n", - "7.278384712062e+00 1.29678 50.9713 2.09216 50.9713 13 8 13 13 0.02 2.9863e-05\n", - "4.765996194699e+00 2.20787 50.9713 2.20787 50.9713 14 8 14 8 0.02 2.07011e-05\n", - "4.765535914728e+00 2.21331 50.9713 2.21331 50.9713 14 8 14 8 0.02 2.41295e-05\n", - "3.104706358826e+00 3.17639 150 0 0.1 14 7 15 15 0.02 9.32641e-06\n", - "3.069363482023e+00 3.27572 150 0 0.1 14 7 15 15 0.02 9.32641e-06\n", - "3.047074050271e+00 3.3836 150 0 37.575 14 7 15 15 0.02 3.68933e-05\n", - "5.974759306305e+00 3.23604 150 2.53922 37.575 14 14 14 7 0.02 1.04459e-05\n", - "6.074084349384e+00 3.30145 150 2.13876 37.575 14 14 13 8 0.02 7.34071e-06\n", - "5.733865371895e+00 3.29994 150 2.00498 37.575 14 14 13 8 0.02 5.93135e-06\n", - "3.027099358410e+00 3.53631 150 0 75.05 14 7 15 15 0.02 3.68933e-05\n", - "5.807147339697e+00 3.30197 150 1.9791 37.575 14 14 13 8 0.02 5.08861e-06\n", - "4.862942347290e+00 3.25294 150 2.97823 75.05 14 14 14 7 0.02 1.04459e-05\n", - "4.556479830908e+00 3.29942 150 2.73221 75.05 14 14 14 7 0.02 7.34071e-06\n", - "3.853070305680e+00 3.29977 150 2.62486 75.05 14 14 14 7 0.02 5.93135e-06\n", - "3.881529045940e+00 3.30149 150 2.55924 75.05 14 14 14 7 0.02 5.08861e-06\n", - "3.015033359333e+00 3.64419 150 0 112.525 14 7 15 15 0.02 3.68933e-05\n", - "4.126828648362e+00 3.32047 150 0 112.525 14 14 15 3 0.02 1.04459e-05\n", - "3.990017992944e+00 3.3032 150 2.94027 112.525 14 14 14 7 0.02 7.34071e-06\n", - "3.206771867883e+00 3.07671 150 3.11282 112.525 14 14 14 7 0.02 5.93135e-06\n", - "3.006827156705e+00 3.72638 150 0 150 14 7 15 15 0.02 3.68933e-05\n", - "3.218786094847e+00 3.30337 150 3.01344 112.525 14 14 14 7 0.02 5.08861e-06\n", - "4.527722847382e+00 1.42238 150 0 150 13 5 15 15 0.02 1.04459e-05\n", - "3.069567332611e+00 3.27804 150 3.27804 150 14 7 14 7 0.02 5.93135e-06\n", - "5.726405299909e+00 1.29746 150 3.22759 150 13 8 14 14 0.02 7.34071e-06\n", - "3.069626478211e+00 3.27565 150 3.27565 150 14 7 14 7 0.02 5.08861e-06\n", + "1.219029061236e+01 1.60007 17.3205 0 2.97008 13 5 15 15 0.02 0.000498487\n", + "1.935920346899e+01 1.29448 17.3205 0 8.71025 13 13 15 2 0.02 0.000498487\n", + "2.123795595728e+01 1.30902 17.3205 1.58519 8.71025 13 13 13 5 0.02 0.000287968\n", + "3.579099761269e+01 1.52414 17.3205 1.30642 8.71025 13 13 13 5 0.02 0.000220016\n", + "1.674063083432e+01 1.29457 17.3205 0 14.4504 13 13 15 2 0.02 0.000498487\n", + "1.779197348711e+01 1.3228 17.3205 1.71196 14.4504 13 13 13 8 0.02 0.000287968\n", + "1.548740826516e+01 1.52415 17.3205 1.45407 14.4504 13 13 13 5 0.02 0.000220016\n", + "1.772169325356e+01 1.81957 73.0434 1.46573 12.2572 13 13 13 5 0.02 4.43422e-05\n", + "1.367065500196e+01 1.66003 73.0434 1.79487 12.2572 13 13 13 8 0.02 7.67586e-05\n", + "2.021960493499e+01 1.82061 73.0434 1.39205 12.2572 13 13 13 5 0.02 3.38788e-05\n", + "9.012246630357e+00 1.81529 73.0434 0 36.5717 13 8 15 15 0.02 7.67586e-05\n", + "7.462779538274e+00 1.82255 73.0434 1.81499 36.5717 13 13 13 8 0.02 3.38788e-05\n", + "1.030499912298e+01 1.80592 73.0434 1.81066 36.5717 13 13 13 8 0.02 4.43422e-05\n", + "4.227002356107e+00 2.43719 73.0434 0 60.8862 14 14 15 1 0.02 7.67586e-05\n", + "7.396288708628e+00 1.8216 73.0434 1.8216 60.8862 13 8 13 8 0.02 3.38788e-05\n", + "7.394728392218e+00 1.80919 73.0434 1.79091 60.8862 13 13 13 8 0.02 4.43422e-05\n", "\n" ] } ], "source": [ - "import os\n", - "\n", - "from binarycpython.utils.grid import Population\n", - "from binarycpython.utils.custom_logging_functions import temp_dir\n", - "\n", "def parse_function(self, output):\n", " \"\"\"\n", " Example parsing function\n", @@ -1067,10 +991,11 @@ " \n", " # grid_options\n", " amt_cores=2, # grid_options\n", + " tmp_dir=TMP_DIR,\n", "\n", " # Custom options: the data directory and the output filename\n", " data_dir=os.path.join(\n", - " temp_dir(), \"example_python_population_result\"\n", + " TMP_DIR, \"example_python_population_result\"\n", " ), # custom_options\n", " base_filename=\"example_pop.dat\", # custom_options\n", ")\n", @@ -1168,14 +1093,14 @@ "example_pop.export_all_info()\n", "\n", "# remove the result file if it exists\n", - "if os.path.isfile(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\")):\n", - " os.remove(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"))\n", + "if os.path.isfile(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\")):\n", + " os.remove(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"))\n", "\n", "# Evolve the population\n", "example_pop.evolve()\n", "\n", "# \n", - "with open(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", + "with open(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", " output = f.read()\n", "print(\"\\n\")\n", "print(output)" diff --git a/docs/build/html/binary_c_parameters.html b/docs/build/html/binary_c_parameters.html index ecb6bba95e82541b829172e378f1cf7c195befd2..b1131e2db62339e36f2f0359cb630d58e8d955e5 100644 --- a/docs/build/html/binary_c_parameters.html +++ b/docs/build/html/binary_c_parameters.html @@ -40,7 +40,7 @@ <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="Population grid code options" href="grid_options_descriptions.html" /> - <link rel="prev" title="Using the API functionality of binarycpython" href="notebook_api_functionality.html" /> + <link rel="prev" title="Zero-age stellar luminosity function in binaries" href="notebook_luminosity_function_binaries.html" /> </head> <body class="wy-body-for-nav"> @@ -197,7 +197,7 @@ <h1>Binary_c parameters<a class="headerlink" href="#binary-c-parameters" title="Permalink to this headline">¶</a></h1> <p>The following chapter contains all the parameters that the current version of binary_c can handle, along with their descriptions and other properties.</p> <dl class="simple"> -<dt>This information was obtained by the following binary_c build:</dt><dd><p><strong>binary_c git branch</strong>: branch_david <strong>binary_c git revision</strong>: 6162:20210825:093caf0e9 <strong>Built on</strong>: Aug 25 2021 18:02:39</p> +<dt>This information was obtained by the following binary_c build:</dt><dd><p><strong>binary_c git branch</strong>: newmaster <strong>binary_c git revision</strong>: 6185:20210910:1621c23a5 <strong>Built on</strong>: Sep 10 2021 15:05:46</p> </dd> </dl> <div class="section" id="section-stars"> @@ -695,6 +695,12 @@ <div class="line"><strong>Default value</strong>: NULL</div> </div> <div class="line-block"> +<div class="line"><strong>Parameter</strong>: artificial_mass_accretion_rate_by_stellar_type%d</div> +<div class="line"><strong>Description</strong>: Constant mass accretion rate for stellar type <n>.</div> +<div class="line"><strong>Parameter input type</strong>: Float(scanf)</div> +<div class="line"><strong>Default value</strong>: NULL</div> +</div> +<div class="line-block"> <div class="line"><strong>Parameter</strong>: artificial_angular_momentum_accretion_rate%d</div> <div class="line"><strong>Description</strong>: Constant angular momentum accretion for star <n>.</div> <div class="line"><strong>Parameter input type</strong>: Float(scanf)</div> @@ -747,14 +753,6 @@ <div class="line"><strong>Macros</strong>: [‘BH_HURLEY2002 = 0’, ‘BH_BELCZYNSKI = 1’, ‘BH_SPERA2015 = 2’, ‘BH_FRYER12_DELAYED = 3’, ‘BH_FRYER12_RAPID = 4’, ‘BH_FRYER12_STARTRACK = 5’]</div> </div> <div class="line-block"> -<div class="line"><strong>Parameter</strong>: PPISN_prescription</div> -<div class="line"><strong>Description</strong>: (Pulsational) Pair-Instability Supernova prescription: Relates initial helium core mass of star to whether the star undergoes PPISN or PISN. Requires PPISN flag to be True (see binary_c_parameters.h). 0=no ppisn, 1=Farmer et al 2019.</div> -<div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: 1</div> -<div class="line"><strong>Macros</strong>: [‘PPISN_NONE = 0’, ‘PPISN_FARMER19 = 1’]</div> -<div class="line"><strong>Extra</strong>: Ignore</div> -</div> -<div class="line-block"> <div class="line"><strong>Parameter</strong>: sn_kick_distribution_II</div> <div class="line"><strong>Description</strong>: Set the distribution of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c).</div> <div class="line"><strong>Parameter input type</strong>: Integer</div> @@ -786,7 +784,7 @@ <div class="line"><strong>Parameter</strong>: sn_kick_distribution_GRB_COLLAPSAR</div> <div class="line"><strong>Description</strong>: Set the distribution of speeds applied to kick newly-born neutron stars and black holes after a type Ib/c core-collapse supernova which is also a collapsar. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c).</div> <div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: 0</div> +<div class="line"><strong>Default value</strong>: 1</div> <div class="line"><strong>Macros</strong>: [‘KICK_VELOCITY_FIXED = 0’, ‘KICK_VELOCITY_MAXWELLIAN = 1’, ‘KICK_VELOCITY_CUSTOM = 2’]</div> </div> <div class="line-block"> @@ -832,27 +830,6 @@ <div class="line"><strong>Macros</strong>: [‘KICK_VELOCITY_FIXED = 0’, ‘KICK_VELOCITY_MAXWELLIAN = 1’, ‘KICK_VELOCITY_CUSTOM = 2’]</div> </div> <div class="line-block"> -<div class="line"><strong>Parameter</strong>: sn_kick_distribution_PPISN</div> -<div class="line"><strong>Description</strong>: Set the distribution of speeds applied to PPISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c).</div> -<div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: 1</div> -<div class="line"><strong>Macros</strong>: [‘KICK_VELOCITY_FIXED = 0’, ‘KICK_VELOCITY_MAXWELLIAN = 1’, ‘KICK_VELOCITY_CUSTOM = 2’]</div> -</div> -<div class="line-block"> -<div class="line"><strong>Parameter</strong>: sn_kick_distribution_PISN</div> -<div class="line"><strong>Description</strong>: Set the distribution of speeds applied to PISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c).</div> -<div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: 0</div> -<div class="line"><strong>Macros</strong>: [‘KICK_VELOCITY_FIXED = 0’, ‘KICK_VELOCITY_MAXWELLIAN = 1’, ‘KICK_VELOCITY_CUSTOM = 2’]</div> -</div> -<div class="line-block"> -<div class="line"><strong>Parameter</strong>: sn_kick_distribution_PHDIS</div> -<div class="line"><strong>Description</strong>: Set the distribution of speeds applied to PHDIS supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c).</div> -<div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: 0</div> -<div class="line"><strong>Macros</strong>: [‘KICK_VELOCITY_FIXED = 0’, ‘KICK_VELOCITY_MAXWELLIAN = 1’, ‘KICK_VELOCITY_CUSTOM = 2’]</div> -</div> -<div class="line-block"> <div class="line"><strong>Parameter</strong>: sn_kick_dispersion_II</div> <div class="line"><strong>Description</strong>: Set the dispersion of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c).</div> <div class="line"><strong>Parameter input type</strong>: Float</div> @@ -880,7 +857,7 @@ <div class="line"><strong>Parameter</strong>: sn_kick_dispersion_GRB_COLLAPSAR</div> <div class="line"><strong>Description</strong>: Set the dispersion of speeds applied to kick newly-born neutron stars and black holes after a type Ib/c core-collapse supernova which is also a collapsar. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c).</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: 0</div> +<div class="line"><strong>Default value</strong>: 190</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: sn_kick_dispersion_TZ</div> @@ -919,24 +896,6 @@ <div class="line"><strong>Default value</strong>: 0</div> </div> <div class="line-block"> -<div class="line"><strong>Parameter</strong>: sn_kick_dispersion_PPISN</div> -<div class="line"><strong>Description</strong>: Set the dispersion of speeds applied to the survivor of a PPISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c).</div> -<div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: 190</div> -</div> -<div class="line-block"> -<div class="line"><strong>Parameter</strong>: sn_kick_dispersion_PISN</div> -<div class="line"><strong>Description</strong>: Set the dispersion of speeds applied to the survivor of a PISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c).</div> -<div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: 0</div> -</div> -<div class="line-block"> -<div class="line"><strong>Parameter</strong>: sn_kick_dispersion_PHDIS</div> -<div class="line"><strong>Description</strong>: Set the dispersion of speeds applied to the survivor of a PHDIS supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c).</div> -<div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: 0</div> -</div> -<div class="line-block"> <div class="line"><strong>Parameter</strong>: sn_kick_companion_IA_He</div> <div class="line"><strong>Description</strong>: Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia He supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> @@ -1077,27 +1036,6 @@ <div class="line"><strong>Macros</strong>: [‘SN_IMPULSE_NONE = 0’, ‘SN_IMPULSE_LIU2015 = 1’, ‘SN_IMPULSE_WHEELER1975 = 2’]</div> </div> <div class="line-block"> -<div class="line"><strong>Parameter</strong>: sn_kick_companion_PPISN</div> -<div class="line"><strong>Description</strong>: Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PPISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975.</div> -<div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: 0</div> -<div class="line"><strong>Macros</strong>: [‘SN_IMPULSE_NONE = 0’, ‘SN_IMPULSE_LIU2015 = 1’, ‘SN_IMPULSE_WHEELER1975 = 2’]</div> -</div> -<div class="line-block"> -<div class="line"><strong>Parameter</strong>: sn_kick_companion_PISN</div> -<div class="line"><strong>Description</strong>: Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975.</div> -<div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: 0</div> -<div class="line"><strong>Macros</strong>: [‘SN_IMPULSE_NONE = 0’, ‘SN_IMPULSE_LIU2015 = 1’, ‘SN_IMPULSE_WHEELER1975 = 2’]</div> -</div> -<div class="line-block"> -<div class="line"><strong>Parameter</strong>: sn_kick_companion_PHDIS</div> -<div class="line"><strong>Description</strong>: Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PHDIS supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975.</div> -<div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: 0</div> -<div class="line"><strong>Macros</strong>: [‘SN_IMPULSE_NONE = 0’, ‘SN_IMPULSE_LIU2015 = 1’, ‘SN_IMPULSE_WHEELER1975 = 2’]</div> -</div> -<div class="line-block"> <div class="line"><strong>Parameter</strong>: wd_sigma</div> <div class="line"><strong>Description</strong>: Set the speed at which white dwarfs are kicked when they form, in km/s. Default is zero (i.e. no kick). Requires WD_KICKS.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> @@ -1169,25 +1107,25 @@ <div class="line"><strong>Parameter</strong>: delta_mcmin</div> <div class="line"><strong>Description</strong>: A parameter to reduce the minimum core mass for third dredge up to occur on the TPAGB. As used by Izzard and Tout (2004) to increase the amount of dredge up, hence carbon, in Magellanic cloud stars.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 0</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: lambda_min</div> <div class="line"><strong>Description</strong>: A parameter to increase the efficiency of third dredge up on the TPAGB. The efficiency is lambda * lambda_mult, and setting lambda_min>0 implies that, once Mc>Mcmin (see delta_mcmin) lambda=Max(lambda(fit to Karakas), lambda_min). As used by Izzard and Tout (2004) to increase the amount of dredge up, hence carbon, in Magellanic cloud stars. See also lambda_multiplier.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 0</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: lambda_multiplier</div> <div class="line"><strong>Description</strong>: A parameter to increase the efficiency of third dredge up on the TPAGB. The efficiency is lambda * lambda_mult, and setting lambda_min>0 implies that, once Mc>Mcmin (see delta_mcmin) lambda=Max(lambda(fit to Karakas), lambda_min). As used by Izzard and Tout (2004) to increase the amount of dredge up, hence carbon, in Magellanic cloud stars.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 1</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: minimum_envelope_mass_for_third_dredgeup</div> <div class="line"><strong>Description</strong>: The minimum envelope mass for third dredge up on the TPAGB. Early, solar metallicity models by Straniero et al suggested 0.5Msun is typical. However, circumstantial evidence (Izzard et al 2009) as well as newer models by Stancliffe and Karakas suggest that at low metallicity a value nearer zero is more appropriate.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 0.5</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: mass_of_pmz</div> @@ -1199,13 +1137,13 @@ <div class="line"><strong>Parameter</strong>: c13_eff</div> <div class="line"><strong>Description</strong>: The “efficiency†of partial mixing in a TPAGB star intershell region, when using the s-process tables of Gallino, Busso, Lugaro et al. as provided by Maria Lugaro for the Izzard et al. 2009 paper. Requires NUCSYN and NUCSYN_S_PROCESS.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 1</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: mc13_pocket_multiplier</div> <div class="line"><strong>Description</strong>: Multiplies the mass in the partial mixing zone of a TPAGB star, when using the s-process tables of Gallino, Busso, Lugaro et al. as provided by Maria Lugaro for the Izzard et al. 2009 paper. Requires NUCSYN and NUCSYN_S_PROCESS.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 1</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: tides_convective_damping</div> @@ -1231,7 +1169,7 @@ <div class="line"><strong>Parameter</strong>: hbbtfac</div> <div class="line"><strong>Description</strong>: A parameter to modulate the temperature at the base of the hot-bottom burning zone in TPAGB stars. (Works only if NUCSYN is defined)</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 1</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: wind_multiplier_%d</div> @@ -1317,7 +1255,7 @@ <div class="line"><strong>Parameter</strong>: MINT_metallicity</div> <div class="line"><strong>Description</strong>: This sets the metallicity for MINT. It is ignored if set to -1.0, the default, in which case the normal metallicity parameter is used.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: -1</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: gaia_Teff_binwidth</div> @@ -1349,28 +1287,28 @@ <div class="line"><strong>Parameter</strong>: AGB_core_algorithm</div> <div class="line"><strong>Description</strong>: Algorithm to use for calculating AGB core masses. 0=Hurley et al. 2002 if no NUCSYN, Karakas 2002 if NUCSYN is defined; 1=Hurley et al. 2002 (overshooting models); 1=Karakas 2002 (non-overshooting models).</div> <div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: 1</div> +<div class="line"><strong>Default value</strong>: 2</div> <div class="line"><strong>Macros</strong>: [‘AGB_CORE_ALGORITHM_DEFAULT = 0’, ‘AGB_CORE_ALGORITHM_HURLEY = 1’, ‘AGB_CORE_ALGORITHM_KARAKAS = 2’]</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: AGB_radius_algorithm</div> <div class="line"><strong>Description</strong>: Algorithm to use for calculating radii on the TPAGB.</div> <div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: 1</div> +<div class="line"><strong>Default value</strong>: 2</div> <div class="line"><strong>Macros</strong>: [‘AGB_RADIUS_ALGORITHM_DEFAULT = 0’, ‘AGB_RADIUS_ALGORITHM_HURLEY = 1’, ‘AGB_RADIUS_ALGORITHM_KARAKAS = 2’]</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: AGB_luminosity_algorithm</div> <div class="line"><strong>Description</strong>: Algorithm to use for calculating luminosities on the TPAGB.</div> <div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: 1</div> +<div class="line"><strong>Default value</strong>: 2</div> <div class="line"><strong>Macros</strong>: [‘AGB_LUMINOSITY_ALGORITHM_DEFAULT = 0’, ‘AGB_LUMINOSITY_ALGORITHM_HURLEY = 1’, ‘AGB_LUMINOSITY_ALGORITHM_KARAKAS = 2’]</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: AGB_3dup_algorithm</div> <div class="line"><strong>Description</strong>: Algorithm to use for calculating third dredge up efficiency on the TPAGB.</div> <div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: 1</div> +<div class="line"><strong>Default value</strong>: 2</div> <div class="line"><strong>Macros</strong>: [‘AGB_THIRD_DREDGE_UP_ALGORITHM_DEFAULT = 0’, ‘AGB_THIRD_DREDGE_UP_ALGORITHM_HURLEY = 1’, ‘AGB_THIRD_DREDGE_UP_ALGORITHM_KARAKAS = 2’, ‘AGB_THIRD_DREDGE_UP_ALGORITHM_STANCLIFFE = 3’]</div> </div> <div class="line-block"> @@ -1537,6 +1475,24 @@ <div class="line"><strong>Parameter input type</strong>: True|False</div> <div class="line"><strong>Default value</strong>: False</div> </div> +<div class="line-block"> +<div class="line"><strong>Parameter</strong>: degenerate_core_merger_nucsyn</div> +<div class="line"><strong>Description</strong>: If TRUE, assume that in a degnerate core merger, energy is generated from nucleosynthesis of the whole core, and that this can disrupt the core. The BSE algorithm (Hurley et al. 2002) assumes this to be TRUE, but binary_c assumes FALSE by default. (FALSE)</div> +<div class="line"><strong>Parameter input type</strong>: True|False</div> +<div class="line"><strong>Default value</strong>: False</div> +</div> +<div class="line-block"> +<div class="line"><strong>Parameter</strong>: degenerate_core_helium_merger_ignition</div> +<div class="line"><strong>Description</strong>: If TRUE, assume that when there is a degenerate helium core merger, the star reignites helium. This is required to make R-type carbon stars. (TRUE)</div> +<div class="line"><strong>Parameter input type</strong>: True|False</div> +<div class="line"><strong>Default value</strong>: True</div> +</div> +<div class="line-block"> +<div class="line"><strong>Parameter</strong>: degenerate_core_merger_dredgeup_fraction</div> +<div class="line"><strong>Description</strong>: If non-zero, mix this fraction of the degenerate core during a merger.(0.0).</div> +<div class="line"><strong>Parameter input type</strong>: Float</div> +<div class="line"><strong>Default value</strong>: 0</div> +</div> </div> <div class="section" id="section-binary"> <h2>Section: binary<a class="headerlink" href="#section-binary" title="Permalink to this headline">¶</a></h2> @@ -1742,7 +1698,7 @@ <div class="line"><strong>Parameter</strong>: post_ce_objects_have_envelopes</div> <div class="line"><strong>Description</strong>: If TRUE then post-common-envelope objects have thin envelopes. You need this if you are to have post-CE post-AGB stars. Note that this <em>may</em> be unstable, i.e. you may end up having many CEEs. The mass in the envelope is controlled by post_ce_adaptive_menv. TRUE by default.</div> <div class="line"><strong>Parameter input type</strong>: True|False</div> -<div class="line"><strong>Default value</strong>: True</div> +<div class="line"><strong>Default value</strong>: False</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: PN_comenv_transition_time</div> @@ -1944,20 +1900,22 @@ <div class="line"><strong>Parameter</strong>: type_Ia_MCh_supernova_algorithm</div> <div class="line"><strong>Description</strong>: Algorithm to be used when calculating type Ia yields from Chandrasekhar-mass exploders. 0 = DD7 (Iwamoto 1999), 1 = Seitenzahl 2013 3D hydro yields (you must also set Seitenzahl2013_model)</div> <div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 0</div> +<div class="line"><strong>Macros</strong>: [‘TYPE_IA_MCH_SUPERNOVA_ALGORITHM_DD2 = 0’, ‘TYPE_IA_MCH_SUPERNOVA_ALGORITHM_SEITENZAHL2013 = 1’, ‘TYPE_IA_MCH_SUPERNOVA_ALGORITHM_SEITENZAHL2013_AUTOMATIC = 2’]</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: Seitenzahl2013_model</div> <div class="line"><strong>Description</strong>: Which of Seitenzahl et al. 2013’s models to use? One of N1,N3,N5,N10,N20,N40,N100L,N100,N100H,N150,N200,N300C,N1600,N1600C,N100_Z0.5,N100_Z0.1,N100_Z0.01 (defaults to N100).</div> <div class="line"><strong>Parameter input type</strong>: String</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: N100</div> <div class="line"><strong>Extra</strong>: N1</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: type_Ia_sub_MCh_supernova_algorithm</div> <div class="line"><strong>Description</strong>: Algorithm to be used when calculating type Ia yields from sub-Chandrasekhar-mass exploders. (Currently unused.)</div> <div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 0</div> +<div class="line"><strong>Macros</strong>: [‘TYPE_IA_SUB_MCH_SUPERNOVA_ALGORITHM_LIVNE_ARNETT_1995 = 0’]</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: max_HeWD_mass</div> @@ -2719,7 +2677,7 @@ <div class="line"><strong>Parameter</strong>: NeNaMgAl</div> <div class="line"><strong>Description</strong>: Enables NeNaMgAl reaction network. Requires NUCSYN and NUCSYN_HBB.</div> <div class="line"><strong>Parameter input type</strong>: True|False</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: True</div> <div class="line"><strong>Extra</strong>: Ignore</div> </div> <div class="line-block"> @@ -2744,21 +2702,23 @@ <div class="line"><strong>Parameter</strong>: nucsyn_metallicity</div> <div class="line"><strong>Description</strong>: This sets the metallicity of the nucleosynthesis algorithms, i.e. the amount (by mass) of matter which is not hydrogen or helium. Usually you’d just set this with the metallicity parameter, but if you want the nucleosynthesis to be outside the range of the stellar evolution algorithm (e.g. Z=0 or Z=0.04) then you need to use nucsyn_metallicity. That said, it’s also outside the range of some of the nucleosynthesis algorithms as well, so you have been warned!</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: -1</div> <div class="line"><strong>Macros</strong>: [‘DEFAULT_TO_METALLICITY = -1’]</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: nucsyn_solver</div> <div class="line"><strong>Description</strong>: Choose the solver used in nuclear burning. 0 = KAPS_RENTROP is a Kaps-Rentrop scheme (fast, not great for stiff problems), 1 = LSODA (Adams/BSF switcher), 2 = CVODE library (<a class="reference external" href="https://computing.llnl.gov/projects/sundials">https://computing.llnl.gov/projects/sundials</a>. Default 0.</div> <div class="line"><strong>Parameter input type</strong>: Unsigned integer</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 0</div> +<div class="line"><strong>Macros</strong>: [‘NUCSYN_SOLVER_KAPS_RENTROP = 0’, ‘NUCSYN_SOLVER_LSODA = 1’, ‘NUCSYN_SOLVER_CVODE = 2’, ‘NUCSYN_SOLVER_NUMBER = 3’, ‘NUCSYN_SOLVER_KAPS_RENTROP = 0’, ‘NUCSYN_SOLVER_LSODA = 1’, ‘NUCSYN_SOLVER_CVODE = 2’, ‘NUCSYN_SOLVER_NUMBER = 3’]</div> <div class="line"><strong>Extra</strong>: 0</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: initial_abundance_mix</div> <div class="line"><strong>Description</strong>: initial abundance mixture: 0=AG89, 1=Karakas 2002, 2=Lodders 2003, 3=Asplund 2005 (not available?), 4=Garcia Berro, 5=Grevesse Noels 1993</div> <div class="line"><strong>Parameter input type</strong>: Unsigned integer</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 0</div> +<div class="line"><strong>Macros</strong>: [‘NUCSYN_INIT_ABUND_MIX_AG89 = 0’, ‘NUCSYN_INIT_ABUND_MIX_KARAKAS2002 = 1’, ‘NUCSYN_INIT_ABUND_MIX_LODDERS2003 = 2’, ‘NUCSYN_INIT_ABUND_MIX_ASPLUND2005 = 3’, ‘NUCSYN_INIT_ABUND_MIX_GARCIABERRO = 4’, ‘NUCSYN_INIT_ABUND_MIX_GREVESSE_NOELS_1993 = 5’, ‘NUCSYN_INIT_ABUND_MIX_ASPLUND2009 = 6’, ‘NUCSYN_INIT_ABUND_MIX_KOBAYASHI2011_ASPLUND2009 = 7’, ‘NUCSYN_INIT_ABUND_MIX_LODDERS2010 = 8’]</div> <div class="line"><strong>Extra</strong>: 0</div> </div> <div class="line-block"> @@ -2786,43 +2746,44 @@ <div class="line"><strong>Parameter</strong>: init_abunds_only</div> <div class="line"><strong>Description</strong>: If True, outputs only the initial abundances, then exits.</div> <div class="line"><strong>Parameter input type</strong>: True|False</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: False</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: initial_abunds_only</div> <div class="line"><strong>Description</strong>: If True, outputs only the initial abundances, then exits.</div> <div class="line"><strong>Parameter input type</strong>: True|False</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: False</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: no_thermohaline_mixing</div> <div class="line"><strong>Description</strong>: If True, disables thermohaline mixing.</div> <div class="line"><strong>Parameter input type</strong>: True|False</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: False</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: lithium_GB_post_Heflash</div> <div class="line"><strong>Description</strong>: Sets the lithium abundances after the helium flash. Requires NUCSYN and LITHIUM_TABLES.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 0</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: lithium_GB_post_1DUP</div> <div class="line"><strong>Description</strong>: Sets the lithium abundance after first dredge up. Requires NUCSYN and LITHIUM_TABLES.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 0</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: lithium_hbb_multiplier</div> <div class="line"><strong>Description</strong>: Multiplies the lithium abundances on the AGB during HBB (based on Karakas/Fishlock et al models).Requires NUCSYN and LITHIUM_TABLES.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 1</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: angelou_lithium_decay_function</div> <div class="line"><strong>Description</strong>: Functional form which describes Li7 decay. Requires NUCSYN and NUCSYN_ANGELOU_LITHIUM. Choices are: 0 expoential (see angelou_lithium_decay_time).</div> <div class="line"><strong>Parameter input type</strong>: Integer</div> <div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Macros</strong>: [‘ANGELOU_LITHIUM_DECAY_FUNCTION_EXPONENTIAL = 0’]</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: angelou_lithium_LMMS_time</div> @@ -2966,17 +2927,10 @@ <div class="section" id="section-output"> <h2>Section: output<a class="headerlink" href="#section-output" title="Permalink to this headline">¶</a></h2> <div class="line-block"> -<div class="line"><strong>Parameter</strong>: david_logging_function</div> -<div class="line"><strong>Description</strong>: Function to choose which kind of information gets logged Requires DAVID. Choices are: 0= None, >0 for custom logging functions</div> -<div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: 0</div> -<div class="line"><strong>Extra</strong>: Ignore</div> -</div> -<div class="line-block"> <div class="line"><strong>Parameter</strong>: cf_amanda_log</div> <div class="line"><strong>Description</strong>: Enable logging to compare to Amanda’s models.</div> <div class="line"><strong>Parameter input type</strong>: True|False</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: False</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: float_overflow_checks</div> @@ -3024,7 +2978,7 @@ <div class="line"><strong>Parameter</strong>: legacy_yields</div> <div class="line"><strong>Description</strong>: Turn on ensemble legacy yield output.</div> <div class="line"><strong>Parameter input type</strong>: True|False</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: False</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: ensemble_defer</div> @@ -3072,31 +3026,31 @@ <div class="line"><strong>Parameter</strong>: EMP_logg_maximum</div> <div class="line"><strong>Description</strong>: Maximum logg that EMP stars are allowed to have. See Izzard et al 2009. See also CEMP_cfe_minimum, NEMP_nfe_minimum, EMP_minimum_age.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 4</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: EMP_minimum_age</div> <div class="line"><strong>Description</strong>: Minimum age that EMP stars are required to have. See Izzard et al 2009. See also CEMP_cfe_minimum, NEMP_nfe_minimum, EMP_logg_maximum.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 10</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: EMP_feh_maximum</div> <div class="line"><strong>Description</strong>: Maximum [Fe/H] that an EMP stars may have. See Izzard et al 2009. See also CEMP_cfe_minimum, NEMP_nfe_minimum, EMP_logg_maximum, EMP_minimum_age. Default -2.0.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: -2</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: CEMP_cfe_minimum</div> <div class="line"><strong>Description</strong>: Minimum [C/Fe] that CEMP stars are required to have. See Izzard et al 2009. See also NEMP_cfe_minimum, EMP_logg_maximum, EMP_minimum_age. Default 0.7.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 0.7</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: NEMP_cfe_minimum</div> <div class="line"><strong>Description</strong>: Minimum [N/Fe] that NEMP stars are required to have. See Izzard et al 2009, Pols et al. 2012. See also CEMP_cfe_minimum, EMP_logg_maximum, EMP_minimum_age. Default 1.0.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 1</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: thick_disc_start_age</div> @@ -3256,84 +3210,84 @@ <div class="line"><strong>Parameter</strong>: MINT_dir</div> <div class="line"><strong>Description</strong>: Location of MINT algorithm data.</div> <div class="line"><strong>Parameter input type</strong>: String</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>:</div> <div class="line"><strong>Extra</strong>:</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: MINT_data_cleanup</div> <div class="line"><strong>Description</strong>: Activate checks on incoming data to try to account for problems. Will make data-loading slower, but may fix a few things.</div> <div class="line"><strong>Parameter input type</strong>: True|False</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: False</div> <div class="line"><strong>Extra</strong>:</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: MINT_MS_rejuvenation</div> <div class="line"><strong>Description</strong>: Turn on or off (hydrogen) main-sequence rejuvenation.</div> <div class="line"><strong>Parameter input type</strong>: True|False</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: True</div> <div class="line"><strong>Extra</strong>:</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: MINT_remesh</div> <div class="line"><strong>Description</strong>: Turn on or off MINT’s remeshing.</div> <div class="line"><strong>Parameter input type</strong>: True|False</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: True</div> <div class="line"><strong>Extra</strong>:</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: MINT_use_ZAMS_profiles</div> <div class="line"><strong>Description</strong>: Use chemical profiles at the ZAMS if MINT_use_ZAMS_profiles is TRUE, otherwise set homogeneous abundances. (Default is TRUE, so we use the profiles if they are available.)</div> <div class="line"><strong>Parameter input type</strong>: True|False</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: True</div> <div class="line"><strong>Extra</strong>:</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: MINT_fallback_to_test_data</div> <div class="line"><strong>Description</strong>: If TRUE, use the MINT test_data directory as a fallback when data is unavailable. (FALSE)</div> <div class="line"><strong>Parameter input type</strong>: True|False</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: False</div> <div class="line"><strong>Extra</strong>:</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: MINT_disable_grid_load_warnings</div> <div class="line"><strong>Description</strong>: Use this to explicitly disable MINT’s warnings when loading a grid with, e.g., missing or too much data.</div> <div class="line"><strong>Parameter input type</strong>: True|False</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: False</div> <div class="line"><strong>Extra</strong>:</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: MINT_Kippenhahn</div> <div class="line"><strong>Description</strong>: Turn on or off MINT’s Kippenhahn diagrams. If 0, off, if 1, output star 1 (index 0), if 2 output star 2 (index 1). Default 0.</div> <div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 0</div> <div class="line"><strong>Extra</strong>:</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: MINT_nshells</div> <div class="line"><strong>Description</strong>: Set the initial number of shells MINT uses in each star when doing nuclear burning. Note: remeshing can change this. If MINT_nshells is 0, shellular burning and other routines that require shells will not be available. (200)</div> <div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 200</div> <div class="line"><strong>Extra</strong>:</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: MINT_maximum_nshells</div> <div class="line"><strong>Description</strong>: Set the maximum number of shells MINT uses in each star when doing nuclear burning. Note that this will be limited to MINT_HARD_MAX_NSHELLS. (1000)</div> <div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 1000</div> <div class="line"><strong>Extra</strong>:</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: MINT_minimum_nshells</div> <div class="line"><strong>Description</strong>: Set the minimum number of shells MINT uses in each star when doing nuclear burning. Note that this will be greater than or equal to MINT_HARD_MIN_NSHELLS, which is 0 by default. (0)</div> <div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 10</div> <div class="line"><strong>Extra</strong>:</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: MINT_Kippenhahn_stellar_type</div> <div class="line"><strong>Description</strong>: Stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for which Kippenhahn plot data should be output.</div> <div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: -1</div> <div class="line"><strong>Macros</strong>: [‘LOW_MASS_MS = 0’, ‘MS = 1’, ‘HG = 2’, ‘GIANT_BRANCH = 3’, ‘CHeB = 4’, ‘EAGB = 5’, ‘TPAGB = 6’, ‘HeMS = 7’, ‘HeHG = 8’, ‘HeGB = 9’, ‘HeWD = 10’, ‘COWD = 11’, ‘ONeWD = 12’, ‘NS = 13’, ‘BH = 14’, ‘MASSLESS_REMNANT = 15’]</div> <div class="line"><strong>Extra</strong>:</div> </div> @@ -3341,7 +3295,7 @@ <div class="line"><strong>Parameter</strong>: MINT_Kippenhahn_companion_stellar_type</div> <div class="line"><strong>Description</strong>: Companion stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for the companion for which Kippenhahn plot data should be output.</div> <div class="line"><strong>Parameter input type</strong>: Integer</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: -1</div> <div class="line"><strong>Macros</strong>: [‘LOW_MASS_MS = 0’, ‘MS = 1’, ‘HG = 2’, ‘GIANT_BRANCH = 3’, ‘CHeB = 4’, ‘EAGB = 5’, ‘TPAGB = 6’, ‘HeMS = 7’, ‘HeHG = 8’, ‘HeGB = 9’, ‘HeWD = 10’, ‘COWD = 11’, ‘ONeWD = 12’, ‘NS = 13’, ‘BH = 14’, ‘MASSLESS_REMNANT = 15’]</div> <div class="line"><strong>Extra</strong>:</div> </div> @@ -3349,21 +3303,21 @@ <div class="line"><strong>Parameter</strong>: MINT_nuclear_burning</div> <div class="line"><strong>Description</strong>: Turn on or off MINT’s nuclear burning algorithm.</div> <div class="line"><strong>Parameter input type</strong>: True|False</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: False</div> <div class="line"><strong>Extra</strong>:</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: MINT_minimum_shell_mass</div> <div class="line"><strong>Description</strong>: Minimum shell mass in MINT’s nuclear burning routines.</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 1e-06</div> <div class="line"><strong>Extra</strong>:</div> </div> <div class="line-block"> <div class="line"><strong>Parameter</strong>: MINT_maximum_shell_mass</div> <div class="line"><strong>Description</strong>: Maximum shell mass in MINT’s nuclear burning routines. :</div> <div class="line"><strong>Parameter input type</strong>: Float</div> -<div class="line"><strong>Default value</strong>: NULL</div> +<div class="line"><strong>Default value</strong>: 0.1</div> <div class="line"><strong>Extra</strong>:</div> </div> </div> @@ -3532,7 +3486,7 @@ <a href="grid_options_descriptions.html" class="btn btn-neutral float-right" title="Population grid code options" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> - <a href="notebook_api_functionality.html" class="btn btn-neutral float-left" title="Using the API functionality of binarycpython" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + <a href="notebook_luminosity_function_binaries.html" class="btn btn-neutral float-left" title="Zero-age stellar luminosity function in binaries" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> </div> @@ -3555,9 +3509,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/custom_logging_functions.html b/docs/build/html/custom_logging_functions.html index c7e8dfe67c5db268fcb3dfffd1615518205a5053..4903f865a057d78bef4ad86dbda4c75cc82a74d5 100644 --- a/docs/build/html/custom_logging_functions.html +++ b/docs/build/html/custom_logging_functions.html @@ -420,9 +420,9 @@ I recommend using this in function in combination with a function that generates provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/distribution_functions.html b/docs/build/html/distribution_functions.html index 2ab05aaf84cc404d58b9abfc3c3507c2293f811c..dbddacf9047c94ffe463cec5ee0c436aeb949d8d 100644 --- a/docs/build/html/distribution_functions.html +++ b/docs/build/html/distribution_functions.html @@ -911,9 +911,9 @@ and is be given by dp/dlogP ~ (logP)^p for all other binary configurations (defa provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/example_notebooks.html b/docs/build/html/example_notebooks.html index 57f157057cfb92f6a7a126e21bc85d7bc2ec206a..ec6f583d05f1fa9ff1b9d2937c3e802bbde44744 100644 --- a/docs/build/html/example_notebooks.html +++ b/docs/build/html/example_notebooks.html @@ -95,6 +95,9 @@ <li class="toctree-l2"><a class="reference internal" href="notebook_population.html">Running populations with binarycpython</a></li> <li class="toctree-l2"><a class="reference internal" href="notebook_extra_features.html">Extra features and functionality of binarycpython</a></li> <li class="toctree-l2"><a class="reference internal" href="notebook_api_functionality.html">Using the API functionality of binarycpython</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html">Example use case: Zero-age stellar luminosity function</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html#A-better-sampled-grid">A better-sampled grid</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_binaries.html">Zero-age stellar luminosity function in binaries</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="binary_c_parameters.html">Binary_c parameters</a></li> @@ -193,7 +196,7 @@ <div class="section" id="example-notebooks"> <h1>Example notebooks<a class="headerlink" href="#example-notebooks" title="Permalink to this headline">¶</a></h1> <p>We have a set of notebooks that explain and show the usage of the binarycpython features. The notebooks are also stored in the examples/ directory in the <a class="reference external" href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master/examples">repository</a></p> -<p>The order of the notebooks below is more or less the recommended order to read.</p> +<p>The order of the notebooks below is more or less the recommended order to read. The last couple of notebooks are example usecases</p> <div class="toctree-wrapper compound"> <p class="caption"><span class="caption-text">Contents:</span></p> <ul> @@ -229,6 +232,22 @@ <li class="toctree-l2"><a class="reference internal" href="notebook_api_functionality.html#Example-usage:">Example usage:</a></li> </ul> </li> +<li class="toctree-l1"><a class="reference internal" href="notebook_luminosity_function_single.html">Example use case: Zero-age stellar luminosity function</a><ul> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html#Setting-up-the-Population-object">Setting up the Population object</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html#Adding-grid-variables">Adding grid variables</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html#Setting-logging-and-handling-the-output">Setting logging and handling the output</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html#Evolving-the-grid">Evolving the grid</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html#ZAMS-Luminosity-distribution-with-the-initial-mass-function">ZAMS Luminosity distribution with the initial mass function</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="notebook_luminosity_function_single.html#A-better-sampled-grid">A better-sampled grid</a></li> +<li class="toctree-l1"><a class="reference internal" href="notebook_luminosity_function_binaries.html">Zero-age stellar luminosity function in binaries</a><ul> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_binaries.html#Setting-up-the-Population-object">Setting up the Population object</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_binaries.html#Adding-grid-variables">Adding grid variables</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_binaries.html#Setting-logging-and-handling-the-output">Setting logging and handling the output</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_binaries.html#Evolving-the-grid">Evolving the grid</a></li> +</ul> +</li> </ul> </div> </div> @@ -267,9 +286,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/functions.html b/docs/build/html/functions.html index 5974c283c710c64fade409bdde0fbb6d975a3aea..7b864f4e98c8af4d81e1bc79667e778aac124f85 100644 --- a/docs/build/html/functions.html +++ b/docs/build/html/functions.html @@ -209,6 +209,20 @@ useful functions for the user</p> </ul> </dd> </dl> +<dl class="py class"> +<dt id="binarycpython.utils.functions.AutoVivificationDict"> +<em class="property">class </em><code class="sig-prename descclassname">binarycpython.utils.functions.</code><code class="sig-name descname">AutoVivificationDict</code><a class="reference internal" href="_modules/binarycpython/utils/functions.html#AutoVivificationDict"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.functions.AutoVivificationDict" title="Permalink to this definition">¶</a></dt> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">dict</span></code></p> +<p>Implementation of perl’s autovivification feature, by overriding the +get item and the __iadd__ operator (<a class="reference external" href="https://docs.python.org/3/reference/datamodel.html?highlight=iadd#object.__iadd__">https://docs.python.org/3/reference/datamodel.html?highlight=iadd#object.__iadd__</a>)</p> +<p>This allows to set values within a subdict that might not exist yet:</p> +<p class="rubric">Example</p> +<p>newdict = {} +newdict[‘example’][‘mass’] += 10 +print(newdict) +>>> {‘example’: {‘mass’: 10}}</p> +</dd></dl> + <dl class="py class"> <dt id="binarycpython.utils.functions.BinaryCEncoder"> <em class="property">class </em><code class="sig-prename descclassname">binarycpython.utils.functions.</code><code class="sig-name descname">BinaryCEncoder</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span></em>, <em class="sig-param"><span class="n">skipkeys</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">ensure_ascii</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">check_circular</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">allow_nan</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">sort_keys</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">indent</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">separators</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">default</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/functions.html#BinaryCEncoder"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.functions.BinaryCEncoder" title="Permalink to this definition">¶</a></dt> @@ -241,6 +255,13 @@ useful functions for the user</p> </dd></dl> +<dl class="py function"> +<dt id="binarycpython.utils.functions.bin_data"> +<code class="sig-prename descclassname">binarycpython.utils.functions.</code><code class="sig-name descname">bin_data</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">value</span></em>, <em class="sig-param"><span class="n">binwidth</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/functions.html#bin_data"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.functions.bin_data" title="Permalink to this definition">¶</a></dt> +<dd><p>Function that bins the data</p> +<p>Uses the absolute value of binwidth</p> +</dd></dl> + <dl class="py class"> <dt id="binarycpython.utils.functions.binarycDecoder"> <em class="property">class </em><code class="sig-prename descclassname">binarycpython.utils.functions.</code><code class="sig-name descname">binarycDecoder</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span></em>, <em class="sig-param"><span class="n">object_hook</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">parse_float</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">parse_int</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">parse_constant</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">strict</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">object_pairs_hook</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/functions.html#binarycDecoder"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.functions.binarycDecoder" title="Permalink to this definition">¶</a></dt> @@ -318,6 +339,12 @@ that we want to export.</p> <dd><p>Function to return the size + a magnitude string</p> </dd></dl> +<dl class="py function"> +<dt id="binarycpython.utils.functions.convfloat"> +<code class="sig-prename descclassname">binarycpython.utils.functions.</code><code class="sig-name descname">convfloat</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">x</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/functions.html#convfloat"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.functions.convfloat" title="Permalink to this definition">¶</a></dt> +<dd><p>Convert scalar x to a float if we can, in which case return the float, otherwise just return x without changing it. Usually, x is a string, but could be anything that float() can handle without failure.</p> +</dd></dl> + <dl class="py function"> <dt id="binarycpython.utils.functions.count_keys_recursive"> <code class="sig-prename descclassname">binarycpython.utils.functions.</code><code class="sig-name descname">count_keys_recursive</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">input_dict</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/functions.html#count_keys_recursive"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.functions.count_keys_recursive" title="Permalink to this definition">¶</a></dt> @@ -382,6 +409,15 @@ This is done until all the keys are sorted.</p> <p>All objects other than dictionary types are directly return as they are</p> </dd></dl> +<dl class="py function"> +<dt id="binarycpython.utils.functions.datalinedict"> +<code class="sig-prename descclassname">binarycpython.utils.functions.</code><code class="sig-name descname">datalinedict</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">line</span></em>, <em class="sig-param"><span class="n">parameters</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/functions.html#datalinedict"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.functions.datalinedict" title="Permalink to this definition">¶</a></dt> +<dd><p>Convert a line of data to a more convenient dictionary. +:param line = a line of data as a string: +:param parameters = a list of the parameter names:</p> +<p>Note: if the parameter is a floating point number, it will be converted to Python’s float type.</p> +</dd></dl> + <dl class="py function"> <dt id="binarycpython.utils.functions.example_parse_output"> <code class="sig-prename descclassname">binarycpython.utils.functions.</code><code class="sig-name descname">example_parse_output</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">output</span></em>, <em class="sig-param"><span class="n">selected_header</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/functions.html#example_parse_output"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.functions.example_parse_output" title="Permalink to this definition">¶</a></dt> @@ -736,6 +772,12 @@ it will return the type of what the value would be in the input_dict</p> </dl> </dd></dl> +<dl class="py function"> +<dt id="binarycpython.utils.functions.pad_output_distribution"> +<code class="sig-prename descclassname">binarycpython.utils.functions.</code><code class="sig-name descname">pad_output_distribution</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">dist</span></em>, <em class="sig-param"><span class="n">binwidth</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/functions.html#pad_output_distribution"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.functions.pad_output_distribution" title="Permalink to this definition">¶</a></dt> +<dd><p>Given a distribution, dist (a dictionary), which should be binned every binwidth (float), fill the distribution with zeros when there is no data. Note: this changes the data in place.</p> +</dd></dl> + <dl class="py function"> <dt id="binarycpython.utils.functions.parse_binary_c_version_info"> <code class="sig-prename descclassname">binarycpython.utils.functions.</code><code class="sig-name descname">parse_binary_c_version_info</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">version_info_string</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/functions.html#parse_binary_c_version_info"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.functions.parse_binary_c_version_info" title="Permalink to this definition">¶</a></dt> @@ -985,9 +1027,9 @@ of all the binary_c parameters.</p> provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html index eae56de59cb0f778be5dce4a5c0c29481ef26acd..59a3dccf35e493f692164423f27a8968684a0072 100644 --- a/docs/build/html/genindex.html +++ b/docs/build/html/genindex.html @@ -209,11 +209,13 @@ <td style="width: 33%; vertical-align: top;"><ul> <li><a href="grid.html#binarycpython.utils.grid.Population.add_grid_variable">add_grid_variable() (binarycpython.utils.grid.Population method)</a> </li> - </ul></td> - <td style="width: 33%; vertical-align: top;"><ul> <li><a href="distribution_functions.html#binarycpython.utils.distribution_functions.Arenou2010_binary_fraction">Arenou2010_binary_fraction() (in module binarycpython.utils.distribution_functions)</a> </li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> <li><a href="custom_logging_functions.html#binarycpython.utils.custom_logging_functions.autogen_C_logging_code">autogen_C_logging_code() (in module binarycpython.utils.custom_logging_functions)</a> +</li> + <li><a href="functions.html#binarycpython.utils.functions.AutoVivificationDict">AutoVivificationDict (class in binarycpython.utils.functions)</a> </li> </ul></td> </tr></table> @@ -221,6 +223,8 @@ <h2 id="B">B</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="functions.html#binarycpython.utils.functions.bin_data">bin_data() (in module binarycpython.utils.functions)</a> +</li> <li><a href="custom_logging_functions.html#binarycpython.utils.custom_logging_functions.binary_c_log_code">binary_c_log_code() (in module binarycpython.utils.custom_logging_functions)</a> </li> <li><a href="custom_logging_functions.html#binarycpython.utils.custom_logging_functions.binary_c_write_log_code">binary_c_write_log_code() (in module binarycpython.utils.custom_logging_functions)</a> @@ -259,6 +263,8 @@ <li><a href="grid.html#module-binarycpython.utils.grid">module</a> </li> </ul></li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> <li> binarycpython.utils.grid_options_defaults @@ -266,8 +272,6 @@ <li><a href="grid_options_defaults.html#module-binarycpython.utils.grid_options_defaults">module</a> </li> </ul></li> - </ul></td> - <td style="width: 33%; vertical-align: top;"><ul> <li> binarycpython.utils.hpc_functions @@ -335,6 +339,8 @@ <li><a href="functions.html#binarycpython.utils.functions.Capturing">Capturing (class in binarycpython.utils.functions)</a> </li> <li><a href="functions.html#binarycpython.utils.functions.catchtime">catchtime (class in binarycpython.utils.functions)</a> +</li> + <li><a href="grid.html#binarycpython.utils.grid.Population.clean">clean() (binarycpython.utils.grid.Population method)</a> </li> <li><a href="plot_functions.html#binarycpython.utils.plot_functions.color_by_index">color_by_index() (in module binarycpython.utils.plot_functions)</a> </li> @@ -349,6 +355,8 @@ </li> </ul></li> <li><a href="functions.html#binarycpython.utils.functions.convert_bytes">convert_bytes() (in module binarycpython.utils.functions)</a> +</li> + <li><a href="functions.html#binarycpython.utils.functions.convfloat">convfloat() (in module binarycpython.utils.functions)</a> </li> <li><a href="distribution_functions.html#binarycpython.utils.distribution_functions.cosmic_SFH_madau_dickinson2014">cosmic_SFH_madau_dickinson2014() (in module binarycpython.utils.distribution_functions)</a> </li> @@ -368,12 +376,14 @@ <h2 id="D">D</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="functions.html#binarycpython.utils.functions.binarycDecoder.decode">decode() (binarycpython.utils.functions.binarycDecoder method)</a> + <li><a href="functions.html#binarycpython.utils.functions.datalinedict">datalinedict() (in module binarycpython.utils.functions)</a> </li> - <li><a href="functions.html#binarycpython.utils.functions.BinaryCEncoder.default">default() (binarycpython.utils.functions.BinaryCEncoder method)</a> + <li><a href="functions.html#binarycpython.utils.functions.binarycDecoder.decode">decode() (binarycpython.utils.functions.binarycDecoder method)</a> </li> </ul></td> <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="functions.html#binarycpython.utils.functions.BinaryCEncoder.default">default() (binarycpython.utils.functions.BinaryCEncoder method)</a> +</li> <li><a href="plot_functions.html#binarycpython.utils.plot_functions.dummy">dummy() (in module binarycpython.utils.plot_functions)</a> </li> <li><a href="distribution_functions.html#binarycpython.utils.distribution_functions.duquennoy1991">duquennoy1991() (in module binarycpython.utils.distribution_functions)</a> @@ -591,6 +601,8 @@ <h2 id="P">P</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="functions.html#binarycpython.utils.functions.pad_output_distribution">pad_output_distribution() (in module binarycpython.utils.functions)</a> +</li> <li><a href="functions.html#binarycpython.utils.functions.parse_binary_c_version_info">parse_binary_c_version_info() (in module binarycpython.utils.functions)</a> </li> <li><a href="grid.html#binarycpython.utils.grid.Population.parse_cmdline">parse_cmdline() (binarycpython.utils.grid.Population method)</a> @@ -604,11 +616,11 @@ <li><a href="plot_functions.html#binarycpython.utils.plot_functions.plot_HR_diagram">plot_HR_diagram() (in module binarycpython.utils.plot_functions)</a> </li> <li><a href="plot_functions.html#binarycpython.utils.plot_functions.plot_masses">plot_masses() (in module binarycpython.utils.plot_functions)</a> -</li> - <li><a href="plot_functions.html#binarycpython.utils.plot_functions.plot_orbit">plot_orbit() (in module binarycpython.utils.plot_functions)</a> </li> </ul></td> <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="plot_functions.html#binarycpython.utils.plot_functions.plot_orbit">plot_orbit() (in module binarycpython.utils.plot_functions)</a> +</li> <li><a href="plot_functions.html#binarycpython.utils.plot_functions.plot_system">plot_system() (in module binarycpython.utils.plot_functions)</a> </li> <li><a href="distribution_functions.html#binarycpython.utils.distribution_functions.poisson">poisson() (in module binarycpython.utils.distribution_functions)</a> @@ -641,12 +653,14 @@ </li> <li><a href="functions.html#binarycpython.utils.functions.remove_file">remove_file() (in module binarycpython.utils.functions)</a> </li> - <li><a href="grid.html#binarycpython.utils.grid.Population.return_all_info">return_all_info() (binarycpython.utils.grid.Population method)</a> + <li><a href="grid.html#binarycpython.utils.grid.Population.rename_grid_variable">rename_grid_variable() (binarycpython.utils.grid.Population method)</a> </li> - <li><a href="grid.html#binarycpython.utils.grid.Population.return_binary_c_defaults">return_binary_c_defaults() (binarycpython.utils.grid.Population method)</a> + <li><a href="grid.html#binarycpython.utils.grid.Population.return_all_info">return_all_info() (binarycpython.utils.grid.Population method)</a> </li> </ul></td> <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="grid.html#binarycpython.utils.grid.Population.return_binary_c_defaults">return_binary_c_defaults() (binarycpython.utils.grid.Population method)</a> +</li> <li><a href="grid.html#binarycpython.utils.grid.Population.return_binary_c_version_info">return_binary_c_version_info() (binarycpython.utils.grid.Population method)</a> <ul> @@ -700,12 +714,20 @@ <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="functions.html#binarycpython.utils.functions.update_dicts">update_dicts() (in module binarycpython.utils.functions)</a> +</li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="grid.html#binarycpython.utils.grid.Population.update_grid_variable">update_grid_variable() (binarycpython.utils.grid.Population method)</a> </li> </ul></td> </tr></table> <h2 id="V">V</h2> <table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="grid.html#binarycpython.utils.grid.Population.vb1print">vb1print() (binarycpython.utils.grid.Population method)</a> +</li> + </ul></td> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="functions.html#binarycpython.utils.functions.verbose_print">verbose_print() (in module binarycpython.utils.functions)</a> </li> @@ -760,9 +782,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/grid.html b/docs/build/html/grid.html index 35540c71ac6ac40f27c557475141e40960def4bb..540448534320ca899854460172cd37a0abbe6783 100644 --- a/docs/build/html/grid.html +++ b/docs/build/html/grid.html @@ -202,8 +202,6 @@ <span id="grid-class-module"></span><h1>grid_class module<a class="headerlink" href="#module-binarycpython.utils.grid" title="Permalink to this headline">¶</a></h1> <p>Module containing the Population grid class object.</p> <p>Here all the functionality of a Population object is defined.</p> -<p>Useful for the user to understand the functionality, -but copying functionality isn’t recommended except if you know what you are doing</p> <dl class="simple"> <dt>Tasks:</dt><dd><ul class="simple"> <li><p>TODO: add functionality to ‘on-init’ set arguments</p></li> @@ -220,7 +218,6 @@ but copying functionality isn’t recommended except if you know what you are do <li><p>TODO: uncomment and implement the HPC functionality</p></li> <li><p>TODO: think of a clean and nice way to unload and remove the custom_logging_info library from memory (and from disk)</p></li> <li><p>TODO: think of a nice way to remove the loaded grid_code/ generator from memory.</p></li> -<li><p>TODO: Create a designated dict for results</p></li> </ul> </dd> </dl> @@ -312,12 +309,25 @@ the lower edge of the value range) or ‘centred’ </dl> </dd></dl> +<dl class="py method"> +<dt id="binarycpython.utils.grid.Population.clean"> +<code class="sig-name descname">clean</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/grid.html#Population.clean"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.grid.Population.clean" title="Permalink to this definition">¶</a></dt> +<dd><p>Clean the contents of the population object so it can be reused.</p> +<p>Calling _pre_run_cleanup()</p> +<p>TODO: decide to deprecate this function</p> +<dl class="field-list simple"> +<dt class="field-odd">Return type</dt> +<dd class="field-odd"><p><code class="xref py py-obj docutils literal notranslate"><span class="pre">None</span></code></p> +</dd> +</dl> +</dd></dl> + <dl class="py method"> <dt id="binarycpython.utils.grid.Population.evolve"> <code class="sig-name descname">evolve</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/grid.html#Population.evolve"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.grid.Population.evolve" title="Permalink to this definition">¶</a></dt> <dd><p>Entry point function of the whole object. From here, based on the settings, we set up a SLURM or CONDOR grid, or if no setting is given we go straight -to evolving the population</p> +to evolving the population.</p> <dl class="simple"> <dt>There are no direct arguments to this function, rather it is based on the grid_options settings:</dt><dd><p>grid_options[‘slurm’]: integer Boolean whether to use a slurm_grid evolution grid_options[‘condor’]: integer Boolean whether to use a condor_grid evolution</p> @@ -325,8 +335,9 @@ grid_options[‘condor’]: integer Boolean whether to use a condor_grid evoluti </dl> <p>If neither of the above is set, we continue without using HPC routines (that doesn’t mean this cannot be run on a server with many cores)</p> -<p>Returns an dictionary containing the analytics of the run -TODO: change the way this is done. Slurm & CONDOR should probably do this different</p> +<p>Returns an dictionary containing the analytics of the run</p> +<p>TODO: change the way this is done. Slurm & CONDOR should probably do this different +NOTE: SLURM and CONDOR options are not working properly yet</p> <dl class="field-list simple"> <dt class="field-odd">Return type</dt> <dd class="field-odd"><p><code class="xref py py-obj docutils literal notranslate"><span class="pre">None</span></code></p> @@ -422,6 +433,27 @@ can change to ints.</p> </dl> </dd></dl> +<dl class="py method"> +<dt id="binarycpython.utils.grid.Population.rename_grid_variable"> +<code class="sig-name descname">rename_grid_variable</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">oldname</span></em>, <em class="sig-param"><span class="n">newname</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/grid.html#Population.rename_grid_variable"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.grid.Population.rename_grid_variable" title="Permalink to this definition">¶</a></dt> +<dd><p>Function to rename a grid variable.</p> +<p>note: this does NOT alter the order +of the self.grid_options[“_grid_variablesâ€] dictionary.</p> +<p>The order in which the grid variables are loaded into the grid is based on their +<cite>grid_variable_number</cite> property</p> +<dl class="field-list simple"> +<dt class="field-odd">Parameters</dt> +<dd class="field-odd"><ul class="simple"> +<li><p><strong>oldname</strong> (<code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code>) – old name of the grid variable</p></li> +<li><p><strong>newname</strong> (<code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code>) – new name of the grid variable</p></li> +</ul> +</dd> +<dt class="field-even">Return type</dt> +<dd class="field-even"><p><code class="xref py py-obj docutils literal notranslate"><span class="pre">None</span></code></p> +</dd> +</dl> +</dd></dl> + <dl class="py method"> <dt id="binarycpython.utils.grid.Population.return_all_info"> <code class="sig-name descname">return_all_info</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">include_population_settings</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">include_binary_c_defaults</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">include_binary_c_version_info</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">include_binary_c_help_all</span><span class="o">=</span><span class="default_value">True</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/grid.html#Population.return_all_info"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.grid.Population.return_all_info" title="Permalink to this definition">¶</a></dt> @@ -504,6 +536,32 @@ in the self.grid_options</p> <p>If nothing is passed then we just use the default options</p> </dd></dl> +<dl class="py method"> +<dt id="binarycpython.utils.grid.Population.update_grid_variable"> +<code class="sig-name descname">update_grid_variable</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">name</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/grid.html#Population.update_grid_variable"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.grid.Population.update_grid_variable" title="Permalink to this definition">¶</a></dt> +<dd><p>Function to update the values of a grid variable.</p> +<dl class="field-list simple"> +<dt class="field-odd">Parameters</dt> +<dd class="field-odd"><ul class="simple"> +<li><p><strong>name</strong> (<code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code>) – name of the grid variable to be changed.</p></li> +<li><p><strong>**kwargs</strong> – key-value pairs to override the existing grid variable data. See add_grid_variable for these names.</p></li> +</ul> +</dd> +<dt class="field-even">Return type</dt> +<dd class="field-even"><p><code class="xref py py-obj docutils literal notranslate"><span class="pre">None</span></code></p> +</dd> +</dl> +</dd></dl> + +<dl class="py method"> +<dt id="binarycpython.utils.grid.Population.vb1print"> +<code class="sig-name descname">vb1print</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">ID</span></em>, <em class="sig-param"><span class="n">now</span></em>, <em class="sig-param"><span class="n">system_number</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/grid.html#Population.vb1print"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.grid.Population.vb1print" title="Permalink to this definition">¶</a></dt> +<dd><p>Verbosity-level 1 printing, to keep an eye on a grid. +:param ID: thread ID for debugging (int) +:param now: the time now as a UNIX-style epoch in seconds (float) +:param system_number: the system number</p> +</dd></dl> + <dl class="py method"> <dt id="binarycpython.utils.grid.Population.write_binary_c_calls_to_file"> <code class="sig-name descname">write_binary_c_calls_to_file</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">output_dir</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">output_filename</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">include_defaults</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/binarycpython/utils/grid.html#Population.write_binary_c_calls_to_file"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#binarycpython.utils.grid.Population.write_binary_c_calls_to_file" title="Permalink to this definition">¶</a></dt> @@ -575,9 +633,9 @@ like m1,m2,sep, orb-per, ecc, probability etc.</p> provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/grid_options_defaults.html b/docs/build/html/grid_options_defaults.html index 151d7f68328cee9ce102edc9cefdd02b8f579452..4a2331f54d81e183f1e891f18d912c11256b6f6f 100644 --- a/docs/build/html/grid_options_defaults.html +++ b/docs/build/html/grid_options_defaults.html @@ -308,9 +308,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/grid_options_descriptions.html b/docs/build/html/grid_options_descriptions.html index 65faf9f0740dd366409a5a672072b306f8e0913f..2f50ad94737fde074827916113548b605bed0ee5 100644 --- a/docs/build/html/grid_options_descriptions.html +++ b/docs/build/html/grid_options_descriptions.html @@ -190,7 +190,7 @@ <div class="section" id="population-grid-code-options"> <h1>Population grid code options<a class="headerlink" href="#population-grid-code-options" title="Permalink to this headline">¶</a></h1> <p>The following chapter contains all grid code options, along with their descriptions -There are 1 options that are not described yet.</p> +There are 2 options that are not described yet.</p> <div class="section" id="public-options"> <h2>Public options<a class="headerlink" href="#public-options" title="Permalink to this headline">¶</a></h2> <p>The following options are meant to be changed by the user.</p> @@ -234,6 +234,9 @@ There are 1 options that are not described yet.</p> <div class="line"><strong>log_args_dir</strong>: Directory to log the arguments to. Unused</div> </div> <div class="line-block"> +<div class="line"><strong>log_dt</strong>: No description available yet</div> +</div> +<div class="line-block"> <div class="line"><strong>log_file</strong>: Log file for the population object. Unused</div> </div> <div class="line-block"> @@ -252,7 +255,7 @@ There are 1 options that are not described yet.</p> <div class="line"><strong>multiplicity_fraction_function</strong>: Which multiplicity fraction function to use. 0: None, 1: Arenou 2010, 2: Rhagavan 2010, 3: M&S 2017</div> </div> <div class="line-block"> -<div class="line"><strong>parse_function</strong>: Function that the user can provide to handle the output the binary_c. This function has to take the arguments (self, output). Its best not to return anything in this function, and just store stuff in the grid_options[‘results’] dictionary, or just output results to a file</div> +<div class="line"><strong>parse_function</strong>: Function that the user can provide to handle the output the binary_c. This function has to take the arguments (self, output). Its best not to return anything in this function, and just store stuff in the self.grid_results dictionary, or just output results to a file</div> </div> <div class="line-block"> <div class="line"><strong>repeat</strong>: Factor of how many times a system should be repeated. Consider the evolution splitting binary_c argument for supernovae kick repeating.</div> @@ -479,9 +482,9 @@ q extrapolation (below 0.15) method provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/hpc_functions.html b/docs/build/html/hpc_functions.html index eaeff7cea57990585a6573779a0158f00404795a..8369b0da4abd7ba5ad8a700165e9b0360a9129bc 100644 --- a/docs/build/html/hpc_functions.html +++ b/docs/build/html/hpc_functions.html @@ -239,9 +239,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/index.html b/docs/build/html/index.html index 66993241b0901cf713f4522449f50cb21f9fe77f..5ff56a81bb6f9468528ce2aea00f9489b7730078 100644 --- a/docs/build/html/index.html +++ b/docs/build/html/index.html @@ -238,12 +238,13 @@ <p>For this it is best to set up a virtual environment. Activate the virtualenvironment and enter the cloned version of the repo.</p> <p>Then run:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">clean</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">build</span> <span class="o">--</span><span class="n">force</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">sdist</span> <span class="o">&&</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">v</span> <span class="n">dist</span><span class="o">/</span><span class="n">binarycpython</span><span class="o">-<</span><span class="n">version</span> <span class="n">of</span> <span class="n">this</span> <span class="n">package</span><span class="o">>.</span><span class="n">tar</span><span class="o">.</span><span class="n">gz</span> +<span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">clean</span> <span class="o">&&</span> <span class="n">pip</span> <span class="n">uninstall</span> <span class="n">binarycpython</span> <span class="o">&&</span> <span class="n">rm</span> <span class="n">dist</span><span class="o">/*</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">build</span> <span class="o">--</span><span class="n">force</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">sdist</span> <span class="o">&&</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">v</span> <span class="n">dist</span><span class="o">/</span><span class="n">binarycpython</span><span class="o">-<</span><span class="n">version</span> <span class="n">of</span> <span class="n">this</span> <span class="n">package</span><span class="o">>.</span><span class="n">tar</span><span class="o">.</span><span class="n">gz</span> </pre></div> </div> -<p>You can find the version of this package in setup.py.</p> +<p>This will clean the build directory, remove binarycpython from the venv, remove the dist packages, and then rebuilding and reinstalling the package. You can find the version of this package in setup.py.</p> <p>This will install this package into the virtual environment. Making changes to the sourcecode can be “installed†into the virtual env with the same command.</p> <p>If this is not the first time you install the package, but rather rebuild it because you make changes in either binary_c or binarycpython, you should ignore the currently installed version, and also skip installing the dependencies again, by executing the following command:</p> -<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">clean</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">build</span> <span class="o">--</span><span class="n">force</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">sdist</span> <span class="o">&&</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="n">ignore</span><span class="o">-</span><span class="n">installed</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">dependencies</span> <span class="o">-</span><span class="n">v</span> <span class="n">dist</span><span class="o">/</span><span class="n">binarycpython</span><span class="o">-<</span><span class="n">version</span> <span class="n">of</span> <span class="n">this</span> <span class="n">package</span><span class="o">>.</span><span class="n">tar</span><span class="o">.</span><span class="n">gz</span> +<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">clean</span> <span class="o">&&</span> <span class="n">pip</span> <span class="n">uninstall</span> <span class="n">binarycpython</span> <span class="o">&&</span> <span class="n">rm</span> <span class="n">dist</span><span class="o">/*</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">build</span> <span class="o">--</span><span class="n">force</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">sdist</span> <span class="o">&&</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="n">ignore</span><span class="o">-</span><span class="n">installed</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">dependencies</span> <span class="o">-</span><span class="n">v</span> <span class="n">dist</span><span class="o">/</span><span class="n">binarycpython</span><span class="o">-<</span><span class="n">version</span> <span class="n">of</span> <span class="n">this</span> <span class="n">package</span><span class="o">>.</span><span class="n">tar</span><span class="o">.</span><span class="n">gz</span> </pre></div> </div> <div class="section" id="after-installation"> @@ -316,6 +317,9 @@ <li class="toctree-l2"><a class="reference internal" href="notebook_population.html">Running populations with binarycpython</a></li> <li class="toctree-l2"><a class="reference internal" href="notebook_extra_features.html">Extra features and functionality of binarycpython</a></li> <li class="toctree-l2"><a class="reference internal" href="notebook_api_functionality.html">Using the API functionality of binarycpython</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html">Example use case: Zero-age stellar luminosity function</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html#A-better-sampled-grid">A better-sampled grid</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_binaries.html">Zero-age stellar luminosity function in binaries</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="binary_c_parameters.html">Binary_c parameters</a><ul> @@ -382,9 +386,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/modules.html b/docs/build/html/modules.html index 076e1dc8c845801842c00d953e25addd12f23df7..84f5c150ad2c25328f823fbacbe103832053a0f7 100644 --- a/docs/build/html/modules.html +++ b/docs/build/html/modules.html @@ -250,9 +250,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/notebook_api_functionality.html b/docs/build/html/notebook_api_functionality.html index c4b2e364a7fb0ec61b3435caa07adf1e6f6bcc52..155f85e6b9ec641269040f30f3dee488bdb49887 100644 --- a/docs/build/html/notebook_api_functionality.html +++ b/docs/build/html/notebook_api_functionality.html @@ -39,7 +39,7 @@ <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> - <link rel="next" title="Binary_c parameters" href="binary_c_parameters.html" /> + <link rel="next" title="Example use case: Zero-age stellar luminosity function" href="notebook_luminosity_function_single.html" /> <link rel="prev" title="Extra features and functionality of binarycpython" href="notebook_extra_features.html" /> </head> @@ -102,6 +102,9 @@ </li> </ul> </li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html">Example use case: Zero-age stellar luminosity function</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html#A-better-sampled-grid">A better-sampled grid</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_binaries.html">Zero-age stellar luminosity function in binaries</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="binary_c_parameters.html">Binary_c parameters</a></li> @@ -451,7 +454,7 @@ div.rendered_html tbody tr:hover { <p>Binarycpython uses the Python-C extension framework to interface Python with C. The sourcecode for this is contained in <code class="docutils literal notranslate"><span class="pre">src/binary_c_python.c</span></code>, and the functions are available via <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">binarycpython</span> <span class="pre">import</span> <span class="pre">_binary_c_bindings</span></code>.</p> <p>The following functions are available through the API: (run cell below)</p> <div class="nbinput docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -472,35 +475,67 @@ NAME FUNCTIONS free_persistent_data_memaddr_and_return_json_output(...) - Frees the persistent_data memory and returns the json output + Frees the persistent_data memory and returns the json output. + + Arguments: + store capsule: capsule containing the memory adress of the persistent data object (contains the ensemble) free_store_memaddr(...) - Frees the store memaddr + Frees the store memaddr. + + Arguments: + store capsule: capsule containing the memory adress of the store object return_arglines(...) Return the default args for a binary_c system + Arguments: + No arguments. + return_help(...) Return the help info for a given parameter + Arguments: + parameter: parameter name. + return_help_all(...) Return an overview of all the parameters, their description, categorized in sections + Arguments: + No arguments. + return_maximum_mass_ratio_for_RLOF(...) - Returns a string containing the maximum mass ratio for which a binary system does not RLOF at zams. Optionally accepts a store_capsule. Please use the wrapper functions in utils for this except when you know what you're doing + Returns a string containing the maximum mass ratio for which a binary system does not RLOF at ZAMS. Please use the wrapper functions in utils for this except when you know what you're doing. + + Arguments: + argstring: argument string for binary_c + (opt) store_capsule: capsule containing memory adress for the store object.unction. Default = Null return_minimum_orbit_for_RLOF(...) - Returns a string containing the minimum orbit and separation for which a binary system does not RLOF at zams. Please use the wrapper functions in utils for this except when you know what you're doing + Returns a string containing the minimum orbit and separation for which a binary system does not RLOF at ZAMS. Please use the wrapper functions in utils for this except when you know what you're doing. + + Arguments: + argstring: argument string for binary_c + (opt) store_capsule: capsule containing memory adress for the store object.unction. Default = Null return_persistent_data_memaddr(...) Return the store memory adress that will be passed to run_population + Arguments: + No arguments. + return_store_memaddr(...) Return the store memory adress that will be passed to run_population + Arguments: + No arguments. + return_version_info(...) Return the version information of the used binary_c build + Arguments: + No arguments. + run_system(...) Function to run a system. This is a general function that will be able to handle different kinds of situations: single system run with different settings, population run with different settings, etc. To avoid having too many functions doing slightly different things. @@ -550,7 +585,7 @@ FILE <div class="section" id="Setting-up,-using-and-freeing-store"> <h3>Setting up, using and freeing store<a class="headerlink" href="#Setting-up,-using-and-freeing-store" title="Permalink to this headline">¶</a></h3> <div class="nbinput docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[10]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -583,8 +618,8 @@ FILE </div> <div class="output_area docutils container"> <div class="highlight"><pre> -<capsule object "STORE" at 0x7f163859d0c0> -SINGLE_STAR_LIFETIME 10 27.7358 +<capsule object "STORE" at 0x7fa6a45ed180> +SINGLE_STAR_LIFETIME 10 28.4838 </pre></div></div> </div> @@ -593,7 +628,7 @@ SINGLE_STAR_LIFETIME 10 27.7358 <h3>Getting information from binary_c<a class="headerlink" href="#Getting-information-from-binary_c" title="Permalink to this headline">¶</a></h3> <p>We can get information for a parameter via return_help(parameter_name): This will return an unparsed output</p> <div class="nbinput docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[11]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -619,7 +654,7 @@ Default : 0 </div> <p>We can get information on all available parameters via return_help(parameter_name):</p> <div class="nbinput docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[16]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -695,6 +730,9 @@ equation_of_state_algorithm : Set the equation of state algorithm. 0 = Paczynski opacity_algorithm : Set the opacity algorithm. 0 = Paczynski, 1 = Ferguson/Opal. : (null) wind_mass_loss : Defines the algorithm used for stellar winds. 0 = none, 1 = Hurley et al. (2002), 2 = Schneider (2018). : 0 gbwind : Wind prescription for first red giant branch stars. 0=Reimers (Hurley et al 2000/2002; choose gb_reimers_eta=0.5 for their mass loss rate), 1=Schroeder+Cuntz 2005 (set gb_reimers_eta=1.0 for their mass loss rate). : (null) +postagbwind : Apply special post-(A)GB prescription. Default is POSTAGB_WIND_USE_GIANT which means we just use whatever is prescribed on the giant branch. Other options include: POSTAGB_WIND_NONE = 1 (no wind on the post (A)GB), POSTAGB_WIND_KRTICKA2020 = 2 which uses Krticka, Kubát and Krticková (2020, A&A 635, A173). : (null) +Teff_postAGB_min : The minimum temperature for which we apply post-(A)GB winds. See also Teff_postAGB_max. (6000 K) : (null) +Teff_postAGB_max : The maximum temperature for which we apply post-(A)GB winds. See also Teff_postAGB_min. (120000 K) : (null) mattsson_Orich_tpagbwind : Experimental : turns on Mattsson's TPAGB wind when the star is oxygen rich. Requires MATTSSON_MASS_LOSS. : (null) magnetic_braking_factor : Multiplier for the magnetic braking angular momentum loss rate. : (null) magnetic_braking_gamma : gamma factor in Rappaport style magnetic braking expression. : (null) @@ -714,7 +752,9 @@ superwind_mira_switchon : In the Vassiliadis and Wood (1993) AGB wind prescripti vw93_mira_shift : In the Vassiliadis and Wood (1993) AGB wind prescription, the wind loss rate depends on the Mira period plus this offset. Requires VW93_MIRA_SHIFT. : (null) vw93_multiplier : In the Vassiliadis and Wood (1993) AGB wind prescription, the wind loss rate is multiplied by this factor. Requires VW93_MULTIPLIER. : (null) tpagb_reimers_eta : TPAGB Reimers wind multiplication factor, cf. eta in Reimers' mass loss formula. (This multiplies the 4e-13 in Reimers' formula, or the 8e-14 in Schroeder and Cuntz.) Note that Reimers is not the default TPAGB wind prescription. See also tpagbwind. : (null) +Tout_Pringle_1992_multiplier : Multiplier for the Tout & Pringle (1992) magnetic wind. (0.0) : (null) artificial_mass_accretion_rate%d : Constant mass accretion rate for star <n>. : (null) +artificial_mass_accretion_rate_by_stellar_type%d : Constant mass accretion rate for stellar type <n>. : (null) artificial_angular_momentum_accretion_rate%d : Constant angular momentum accretion for star <n>. : (null) artificial_orbital_angular_momentum_accretion_rate : Constant angular momentum accretion rate on the orbit. : (null) artificial_accretion_start_time : Time at which artificial accretion stars. Ignored if <0 (default is -1). : (null) @@ -722,8 +762,7 @@ artificial_accretion_end_time : Time at which artificial accretion ends. Ignored wr_wind : Massive-star (WR) wind prescription. 0 = Hurley et al 2000/2002, 1=Maeder and Meynet, 2=Nugis and Lamers, 3=John Eldridge's version of Vink's early-2000s wind (See Lynnette Dray's thesis, or John Eldridge's thesis) : (null) wr_wind_fac : Massive-star (WR) wind multiplication factor. : (null) wrwindfac : Massive-star (WR) wind multiplication factor. Synonymous with wr_wind_fac (which you should use instead). : (null) -BH_prescription : Black hole mass prescrition: relates the mass of a newly formed black hole to its progenitor's (CO) core mass. 0=Hurley et al 2000/2002, 1=Belczynski (early 2000s). : (null) -PPISN_prescription : (Pulsational) Pair-Instability Supernova prescription: Relates initial helium core mass of star to whether the star undergoes PPISN or PISN. Requires PPISN flag to be True (see binary_c_parameters.h). 0=no ppisn, 1=Farmer et al 2019. : Ignore +BH_prescription : Black hole mass prescrition: relates the mass of a newly formed black hole to its progenitor's (CO) core mass. BH_HURLEY2002 = 0 = Hurley et al 2000/2002, BH_BELCZYNSKI = 1 = Belczynski (early 2000s), BH_SPERA2015 = Spera+ 2015, BH_FRYER12_DELAYED = 3 = Fryer et al. (2012) delayed prescription, BH_FRYER12_RAPID = 4 = Fryer et al. (2012) rapid prescription, BH_FRYER12_STARTRACK = 5 = Fryer et al. (2012) startrack prescription. : (null) sn_kick_distribution_II : Set the distribution of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) sn_kick_distribution_ECAP : Set the distribution of speeds applied to the remnants of electron-capture supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) sn_kick_distribution_NS_NS : Set the distribution of speeds applied to kick neutron stars and black holes that survive a NS-NS merger. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) @@ -735,9 +774,6 @@ sn_kick_distribution_BH_BH : Set the distribution of speeds applied to black hol sn_kick_distribution_BH_NS : Set the distribution of speeds applied to black holes formed by the merger of a neutron star and a black holes. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) sn_kick_distribution_IA_Hybrid_HeCOWD : Set the distribution of speeds applied to any survivor of a hybrid He-COWD SNIa explosion. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) sn_kick_distribution_IA_Hybrid_HeCOWD_subluminous : Set the distribution of speeds applied to any survivor of a subluminous hybrid He-COWD SNIa explosion. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) -sn_kick_distribution_PPISN : Set the distribution of speeds applied to PPISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) -sn_kick_distribution_PISN : Set the distribution of speeds applied to PISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) -sn_kick_distribution_PHDIS : Set the distribution of speeds applied to PHDIS supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) sn_kick_dispersion_II : Set the dispersion of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) sn_kick_dispersion_ECAP : Set the dispersion of speeds applied to the remnants of electron-capture supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) sn_kick_dispersion_NS_NS : Set the dispersion of speeds applied to kick neutron stars and black holes that survive a NS-NS merger. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) @@ -749,9 +785,6 @@ sn_kick_dispersion_BH_BH : Set the dispersion of speeds applied to black holes f sn_kick_dispersion_BH_NS : Set the dispersion of speeds applied to black holes formed by the merger of a neutron star and a black holes. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) sn_kick_dispersion_IA_Hybrid_HeCOWD : Set the dispersion of speeds applied to the survivor of a SNIa explosion of a hybrid He-COWD. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) sn_kick_dispersion_IA_Hybrid_HeCOWD_subluminous : Set the dispersion of speeds applied to the survivor of a subluminous SNIa explosion of a hybrid He-COWD. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) -sn_kick_dispersion_PPISN : Set the dispersion of speeds applied to the survivor of a PPISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) -sn_kick_dispersion_PISN : Set the dispersion of speeds applied to the survivor of a PISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) -sn_kick_dispersion_PHDIS : Set the dispersion of speeds applied to the survivor of a PHDIS supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null) sn_kick_companion_IA_He : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia He supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null) sn_kick_companion_IA_ELD : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia ELD (sub-Mch) supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null) sn_kick_companion_IA_CHAND : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia Mch supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null) @@ -772,9 +805,6 @@ sn_kick_companion_BH_BH : Set the speed (if >=0) of, or the algothim (if < sn_kick_companion_BH_NS : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a black hole merges with a neutron star. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null) sn_kick_companion_IA_Hybrid_HeCOWD : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a hybrid He-COWD type Ia explosion. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null) sn_kick_companion_IA_Hybrid_HeCOWD_subluminous : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a subluminous hybrid He-COWD type Ia explosion. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null) -sn_kick_companion_PPISN : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PPISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null) -sn_kick_companion_PISN : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null) -sn_kick_companion_PHDIS : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PHDIS supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null) wd_sigma : Set the speed at which white dwarfs are kicked when they form, in km/s. Default is zero (i.e. no kick). Requires WD_KICKS. : (null) wd_kick_direction : Set the direction of white dwarf kicks. 0 = random, 1 = up, 2 = forward, 3 = backward, 4 = inward, 5 = outward. Requires WD_KICKS. : (null) wd_kick_when : Decide when to kick a white dwarf. 0=at birth, 1=at first RLOF, 2=at given pulse number (see wd_kick_pulse_number), 3 at every pulse Requires WD_KICKS. : (null) @@ -847,6 +877,11 @@ PN_fast_wind_mdot_AGB : The envelope mass below which fast wind used during the HeWD_HeWD_ignition_mass : HeWD-HeWD mergers above this mass reignite helium. (0.3) : (null) wind_Nieuwenhuijzen_luminosity_lower_limit : Above this luminosity we activate the Nieuwenhuijzen and de Jager wind (4e3 Lsun). : (null) wind_LBV_luminosity_lower_limit : Above this luminosity we activate the LBV wind (6e5 Lsun). : (null) +colour%d : Sets colour %d (0 to NUM_ANSI_COLOURS-1) to the extended ANSI set colour you choose (1-255, 0 means ignore). The colour numbers are defined in src/logging/ansi_colours.h : (null) +apply_Darwin_Radau_correction : Apply Darwin-Radau correction to the moment of inertia to take rotation into account? : (null) +degenerate_core_merger_nucsyn : If TRUE, assume that in a degnerate core merger, energy is generated from nucleosynthesis of the whole core, and that this can disrupt the core. The BSE algorithm (Hurley et al. 2002) assumes this to be TRUE, but binary_c assumes FALSE by default. (FALSE) : (null) +degenerate_core_helium_merger_ignition : If TRUE, assume that when there is a degenerate helium core merger, the star reignites helium. This is required to make R-type carbon stars. (TRUE) : (null) +degenerate_core_merger_dredgeup_fraction : If non-zero, mix this fraction of the degenerate core during a merger.(0.0). : (null) ############################################################ ##### Section Binary @@ -1113,7 +1148,6 @@ angelou_lithium_vrotfrac_trigger : Fraction of Keplerian (breakup) equatorial ro ############################################################ ##### Section Output ############################################################ -david_logging_function : Function to choose which kind of information gets logged Requires DAVID. Choices are: 0= None, >0 for custom logging functions : Ignore cf_amanda_log : Enable logging to compare to Amanda's models. : (null) float_overflow_checks : Turn on to enable floating-point overflow checks at the end of each timestep, if they are available. 0=off, 1=warn (stderr) on failure, 2=exit on failure (0) : (null) save_pre_events_stardata : Enable this to save a copy of stardata to stardata->pre_events_stardata just before an event. : (null) @@ -1143,6 +1177,7 @@ escape_velocity : A parameter used in constructing galactic chemical evolution ( escape_fraction : A parameter used in constructing galactic chemical evolution (GCE) models. If the stellar wind velocity exceeds this value, any chemical yield from the wind is ignored, i.e. assumed lost. (km/s) Requires NUCSYN_GCE_OUTFLOW_CHECKS. Default 0.0. See also escape_velocity. : (null) colour_log : If set to True, thelog is coloured with ANSI colour formatting. Requires FILE_LOG to be defined. : log_filename : Location of the output logging filename. If set to "/dev/null" then there is no logging. : +log_arrows : Add arrows to the output log to show whether values are increasing or decreasing. : stopfile : File which, when it exists, will stop the current binary_c repeat run. : stardata_dump_filename : Location of the stardata dump file. : stardata_load_filename : Location of the stardata file to load. : @@ -1167,8 +1202,12 @@ MINT_data_cleanup : Activate checks on incoming data to try to account for probl MINT_MS_rejuvenation : Turn on or off (hydrogen) main-sequence rejuvenation. : MINT_remesh : Turn on or off MINT's remeshing. : MINT_use_ZAMS_profiles : Use chemical profiles at the ZAMS if MINT_use_ZAMS_profiles is TRUE, otherwise set homogeneous abundances. (Default is TRUE, so we use the profiles if they are available.) : +MINT_fallback_to_test_data : If TRUE, use the MINT test_data directory as a fallback when data is unavailable. (FALSE) : MINT_disable_grid_load_warnings : Use this to explicitly disable MINT's warnings when loading a grid with, e.g., missing or too much data. : MINT_Kippenhahn : Turn on or off MINT's Kippenhahn diagrams. If 0, off, if 1, output star 1 (index 0), if 2 output star 2 (index 1). Default 0. : +MINT_nshells : Set the initial number of shells MINT uses in each star when doing nuclear burning. Note: remeshing can change this. If MINT_nshells is 0, shellular burning and other routines that require shells will not be available. (200) : +MINT_maximum_nshells : Set the maximum number of shells MINT uses in each star when doing nuclear burning. Note that this will be limited to MINT_HARD_MAX_NSHELLS. (1000) : +MINT_minimum_nshells : Set the minimum number of shells MINT uses in each star when doing nuclear burning. Note that this will be greater than or equal to MINT_HARD_MIN_NSHELLS, which is 0 by default. (0) : MINT_Kippenhahn_stellar_type : Stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for which Kippenhahn plot data should be output. : MINT_Kippenhahn_companion_stellar_type : Companion stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for the companion for which Kippenhahn plot data should be output. : MINT_nuclear_burning : Turn on or off MINT's nuclear burning algorithm. : @@ -1216,7 +1255,7 @@ list_args : Display list of arguments with their default values. Useful for batc </div> <p>We can get all the parameter names and their default values with return_arglines(): (abridged output)</p> <div class="nbinput docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[20]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[5]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -1237,7 +1276,7 @@ M_1 = 0 </div> <p>Lastly, we can ask binary_c to determine the minimum period or maximum mass for RLOF at the ZAMS: Both of them need an argstring as input</p> <div class="nbinput docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[7]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[6]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -1269,7 +1308,7 @@ MINIMUM PERIOD 0.00632092 </pre></div></div> </div> <div class="nbinput docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[46]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[7]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -1321,7 +1360,7 @@ MAXIMUM MASS RATIO 0.0141 <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> - <a href="binary_c_parameters.html" class="btn btn-neutral float-right" title="Binary_c parameters" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + <a href="notebook_luminosity_function_single.html" class="btn btn-neutral float-right" title="Example use case: Zero-age stellar luminosity function" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> <a href="notebook_extra_features.html" class="btn btn-neutral float-left" title="Extra features and functionality of binarycpython" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> @@ -1347,9 +1386,9 @@ MAXIMUM MASS RATIO 0.0141 provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/notebook_api_functionality.ipynb b/docs/build/html/notebook_api_functionality.ipynb index d81c31711bfc5d6de3159fd8958df96dd145ded0..8d454880c82dba172d33a95532c47bc95f24ff6a 100644 --- a/docs/build/html/notebook_api_functionality.ipynb +++ b/docs/build/html/notebook_api_functionality.ipynb @@ -15,7 +15,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "ded7eaf6-e1ba-46c2-9f6f-9ebcb14a264d", "metadata": {}, "outputs": [ @@ -30,37 +30,69 @@ "\n", "FUNCTIONS\n", " free_persistent_data_memaddr_and_return_json_output(...)\n", - " Frees the persistent_data memory and returns the json output\n", + " Frees the persistent_data memory and returns the json output.\n", + " \n", + " Arguments:\n", + " store capsule: capsule containing the memory adress of the persistent data object (contains the ensemble)\n", " \n", " free_store_memaddr(...)\n", - " Frees the store memaddr\n", + " Frees the store memaddr.\n", + " \n", + " Arguments:\n", + " store capsule: capsule containing the memory adress of the store object\n", " \n", " return_arglines(...)\n", " Return the default args for a binary_c system\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_help(...)\n", " Return the help info for a given parameter\n", + " \n", + " Arguments:\n", + " parameter: parameter name.\n", " \n", " return_help_all(...)\n", " Return an overview of all the parameters, their description, categorized in sections\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_maximum_mass_ratio_for_RLOF(...)\n", - " Returns a string containing the maximum mass ratio for which a binary system does not RLOF at zams. Optionally accepts a store_capsule. Please use the wrapper functions in utils for this except when you know what you're doing\n", + " Returns a string containing the maximum mass ratio for which a binary system does not RLOF at ZAMS. Please use the wrapper functions in utils for this except when you know what you're doing.\n", + " \n", + " Arguments:\n", + " argstring: argument string for binary_c\n", + " (opt) store_capsule: capsule containing memory adress for the store object.unction. Default = Null\n", " \n", " return_minimum_orbit_for_RLOF(...)\n", - " Returns a string containing the minimum orbit and separation for which a binary system does not RLOF at zams. Please use the wrapper functions in utils for this except when you know what you're doing\n", + " Returns a string containing the minimum orbit and separation for which a binary system does not RLOF at ZAMS. Please use the wrapper functions in utils for this except when you know what you're doing.\n", + " \n", + " Arguments:\n", + " argstring: argument string for binary_c\n", + " (opt) store_capsule: capsule containing memory adress for the store object.unction. Default = Null\n", " \n", " return_persistent_data_memaddr(...)\n", " Return the store memory adress that will be passed to run_population\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_store_memaddr(...)\n", " Return the store memory adress that will be passed to run_population\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_version_info(...)\n", " Return the version information of the used binary_c build\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " run_system(...)\n", - " Function to run a system. This is a general function that will be able to handle different kinds of situations: single system run with different settings, population run with different settings, etc. To avoid having too many functions doing slightly different things. \n", + " Function to run a system. This is a general function that will be able to handle different kinds of situations: single system run with different settings, population run with different settings, etc. To avoid having too many functions doing slightly different things.\n", " \n", " Arguments:\n", " argstring: argument string for binary_c\n", @@ -126,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 2, "id": "10a74d5a-a3d5-4543-a5bc-20d1fe885bb4", "metadata": {}, "outputs": [ @@ -134,8 +166,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "<capsule object \"STORE\" at 0x7f163859d0c0>\n", - "SINGLE_STAR_LIFETIME 10 27.7358\n", + "<capsule object \"STORE\" at 0x7fa6a45ed180>\n", + "SINGLE_STAR_LIFETIME 10 28.4838\n", "\n" ] } @@ -183,7 +215,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 3, "id": "318874f6-7acf-49bb-9786-299d4dffc0b3", "metadata": {}, "outputs": [ @@ -217,7 +249,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 4, "id": "d7e757ae-579c-42a2-a310-f0401b7800e8", "metadata": { "scrolled": true, @@ -291,6 +323,9 @@ "opacity_algorithm : Set the opacity algorithm. 0 = Paczynski, 1 = Ferguson/Opal. : (null)\n", "wind_mass_loss : Defines the algorithm used for stellar winds. 0 = none, 1 = Hurley et al. (2002), 2 = Schneider (2018). : 0\n", "gbwind : Wind prescription for first red giant branch stars. 0=Reimers (Hurley et al 2000/2002; choose gb_reimers_eta=0.5 for their mass loss rate), 1=Schroeder+Cuntz 2005 (set gb_reimers_eta=1.0 for their mass loss rate). : (null)\n", + "postagbwind : Apply special post-(A)GB prescription. Default is POSTAGB_WIND_USE_GIANT which means we just use whatever is prescribed on the giant branch. Other options include: POSTAGB_WIND_NONE = 1 (no wind on the post (A)GB), POSTAGB_WIND_KRTICKA2020 = 2 which uses Krticka, Kubát and Krticková (2020, A&A 635, A173). : (null)\n", + "Teff_postAGB_min : The minimum temperature for which we apply post-(A)GB winds. See also Teff_postAGB_max. (6000 K) : (null)\n", + "Teff_postAGB_max : The maximum temperature for which we apply post-(A)GB winds. See also Teff_postAGB_min. (120000 K) : (null)\n", "mattsson_Orich_tpagbwind : Experimental : turns on Mattsson's TPAGB wind when the star is oxygen rich. Requires MATTSSON_MASS_LOSS. : (null)\n", "magnetic_braking_factor : Multiplier for the magnetic braking angular momentum loss rate. : (null)\n", "magnetic_braking_gamma : gamma factor in Rappaport style magnetic braking expression. : (null)\n", @@ -310,7 +345,9 @@ "vw93_mira_shift : In the Vassiliadis and Wood (1993) AGB wind prescription, the wind loss rate depends on the Mira period plus this offset. Requires VW93_MIRA_SHIFT. : (null)\n", "vw93_multiplier : In the Vassiliadis and Wood (1993) AGB wind prescription, the wind loss rate is multiplied by this factor. Requires VW93_MULTIPLIER. : (null)\n", "tpagb_reimers_eta : TPAGB Reimers wind multiplication factor, cf. eta in Reimers' mass loss formula. (This multiplies the 4e-13 in Reimers' formula, or the 8e-14 in Schroeder and Cuntz.) Note that Reimers is not the default TPAGB wind prescription. See also tpagbwind. : (null)\n", + "Tout_Pringle_1992_multiplier : Multiplier for the Tout & Pringle (1992) magnetic wind. (0.0) : (null)\n", "artificial_mass_accretion_rate%d : Constant mass accretion rate for star <n>. : (null)\n", + "artificial_mass_accretion_rate_by_stellar_type%d : Constant mass accretion rate for stellar type <n>. : (null)\n", "artificial_angular_momentum_accretion_rate%d : Constant angular momentum accretion for star <n>. : (null)\n", "artificial_orbital_angular_momentum_accretion_rate : Constant angular momentum accretion rate on the orbit. : (null)\n", "artificial_accretion_start_time : Time at which artificial accretion stars. Ignored if <0 (default is -1). : (null)\n", @@ -318,8 +355,7 @@ "wr_wind : Massive-star (WR) wind prescription. 0 = Hurley et al 2000/2002, 1=Maeder and Meynet, 2=Nugis and Lamers, 3=John Eldridge's version of Vink's early-2000s wind (See Lynnette Dray's thesis, or John Eldridge's thesis) : (null)\n", "wr_wind_fac : Massive-star (WR) wind multiplication factor. : (null)\n", "wrwindfac : Massive-star (WR) wind multiplication factor. Synonymous with wr_wind_fac (which you should use instead). : (null)\n", - "BH_prescription : Black hole mass prescrition: relates the mass of a newly formed black hole to its progenitor's (CO) core mass. 0=Hurley et al 2000/2002, 1=Belczynski (early 2000s). : (null)\n", - "PPISN_prescription : (Pulsational) Pair-Instability Supernova prescription: Relates initial helium core mass of star to whether the star undergoes PPISN or PISN. Requires PPISN flag to be True (see binary_c_parameters.h). 0=no ppisn, 1=Farmer et al 2019. : Ignore\n", + "BH_prescription : Black hole mass prescrition: relates the mass of a newly formed black hole to its progenitor's (CO) core mass. BH_HURLEY2002 = 0 = Hurley et al 2000/2002, BH_BELCZYNSKI = 1 = Belczynski (early 2000s), BH_SPERA2015 = Spera+ 2015, BH_FRYER12_DELAYED = 3 = Fryer et al. (2012) delayed prescription, BH_FRYER12_RAPID = 4 = Fryer et al. (2012) rapid prescription, BH_FRYER12_STARTRACK = 5 = Fryer et al. (2012) startrack prescription. : (null)\n", "sn_kick_distribution_II : Set the distribution of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_ECAP : Set the distribution of speeds applied to the remnants of electron-capture supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_NS_NS : Set the distribution of speeds applied to kick neutron stars and black holes that survive a NS-NS merger. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", @@ -331,9 +367,6 @@ "sn_kick_distribution_BH_NS : Set the distribution of speeds applied to black holes formed by the merger of a neutron star and a black holes. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_IA_Hybrid_HeCOWD : Set the distribution of speeds applied to any survivor of a hybrid He-COWD SNIa explosion. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_IA_Hybrid_HeCOWD_subluminous : Set the distribution of speeds applied to any survivor of a subluminous hybrid He-COWD SNIa explosion. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_distribution_PPISN : Set the distribution of speeds applied to PPISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_distribution_PISN : Set the distribution of speeds applied to PISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_distribution_PHDIS : Set the distribution of speeds applied to PHDIS supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_II : Set the dispersion of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_ECAP : Set the dispersion of speeds applied to the remnants of electron-capture supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_NS_NS : Set the dispersion of speeds applied to kick neutron stars and black holes that survive a NS-NS merger. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", @@ -345,9 +378,6 @@ "sn_kick_dispersion_BH_NS : Set the dispersion of speeds applied to black holes formed by the merger of a neutron star and a black holes. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_IA_Hybrid_HeCOWD : Set the dispersion of speeds applied to the survivor of a SNIa explosion of a hybrid He-COWD. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_IA_Hybrid_HeCOWD_subluminous : Set the dispersion of speeds applied to the survivor of a subluminous SNIa explosion of a hybrid He-COWD. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_dispersion_PPISN : Set the dispersion of speeds applied to the survivor of a PPISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_dispersion_PISN : Set the dispersion of speeds applied to the survivor of a PISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_dispersion_PHDIS : Set the dispersion of speeds applied to the survivor of a PHDIS supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_companion_IA_He : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia He supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_ELD : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia ELD (sub-Mch) supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_CHAND : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia Mch supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", @@ -368,9 +398,6 @@ "sn_kick_companion_BH_NS : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a black hole merges with a neutron star. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_Hybrid_HeCOWD : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a hybrid He-COWD type Ia explosion. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_Hybrid_HeCOWD_subluminous : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a subluminous hybrid He-COWD type Ia explosion. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", - "sn_kick_companion_PPISN : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PPISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", - "sn_kick_companion_PISN : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", - "sn_kick_companion_PHDIS : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PHDIS supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "wd_sigma : Set the speed at which white dwarfs are kicked when they form, in km/s. Default is zero (i.e. no kick). Requires WD_KICKS. : (null)\n", "wd_kick_direction : Set the direction of white dwarf kicks. 0 = random, 1 = up, 2 = forward, 3 = backward, 4 = inward, 5 = outward. Requires WD_KICKS. : (null)\n", "wd_kick_when : Decide when to kick a white dwarf. 0=at birth, 1=at first RLOF, 2=at given pulse number (see wd_kick_pulse_number), 3 at every pulse Requires WD_KICKS. : (null)\n", @@ -443,6 +470,11 @@ "HeWD_HeWD_ignition_mass : HeWD-HeWD mergers above this mass reignite helium. (0.3) : (null)\n", "wind_Nieuwenhuijzen_luminosity_lower_limit : Above this luminosity we activate the Nieuwenhuijzen and de Jager wind (4e3 Lsun). : (null)\n", "wind_LBV_luminosity_lower_limit : Above this luminosity we activate the LBV wind (6e5 Lsun). : (null)\n", + "colour%d : Sets colour %d (0 to NUM_ANSI_COLOURS-1) to the extended ANSI set colour you choose (1-255, 0 means ignore). The colour numbers are defined in src/logging/ansi_colours.h : (null)\n", + "apply_Darwin_Radau_correction : Apply Darwin-Radau correction to the moment of inertia to take rotation into account? : (null)\n", + "degenerate_core_merger_nucsyn : If TRUE, assume that in a degnerate core merger, energy is generated from nucleosynthesis of the whole core, and that this can disrupt the core. The BSE algorithm (Hurley et al. 2002) assumes this to be TRUE, but binary_c assumes FALSE by default. (FALSE) : (null)\n", + "degenerate_core_helium_merger_ignition : If TRUE, assume that when there is a degenerate helium core merger, the star reignites helium. This is required to make R-type carbon stars. (TRUE) : (null)\n", + "degenerate_core_merger_dredgeup_fraction : If non-zero, mix this fraction of the degenerate core during a merger.(0.0). : (null)\n", "\n", "############################################################\n", "##### Section Binary\n", @@ -709,7 +741,6 @@ "############################################################\n", "##### Section Output\n", "############################################################\n", - "david_logging_function : Function to choose which kind of information gets logged Requires DAVID. Choices are: 0= None, >0 for custom logging functions : Ignore\n", "cf_amanda_log : Enable logging to compare to Amanda's models. : (null)\n", "float_overflow_checks : Turn on to enable floating-point overflow checks at the end of each timestep, if they are available. 0=off, 1=warn (stderr) on failure, 2=exit on failure (0) : (null)\n", "save_pre_events_stardata : Enable this to save a copy of stardata to stardata->pre_events_stardata just before an event. : (null)\n", @@ -739,6 +770,7 @@ "escape_fraction : A parameter used in constructing galactic chemical evolution (GCE) models. If the stellar wind velocity exceeds this value, any chemical yield from the wind is ignored, i.e. assumed lost. (km/s) Requires NUCSYN_GCE_OUTFLOW_CHECKS. Default 0.0. See also escape_velocity. : (null)\n", "colour_log : If set to True, thelog is coloured with ANSI colour formatting. Requires FILE_LOG to be defined. : \n", "log_filename : Location of the output logging filename. If set to \"/dev/null\" then there is no logging. : \n", + "log_arrows : Add arrows to the output log to show whether values are increasing or decreasing. : \n", "stopfile : File which, when it exists, will stop the current binary_c repeat run. : \n", "stardata_dump_filename : Location of the stardata dump file. : \n", "stardata_load_filename : Location of the stardata file to load. : \n", @@ -763,8 +795,12 @@ "MINT_MS_rejuvenation : Turn on or off (hydrogen) main-sequence rejuvenation. : \n", "MINT_remesh : Turn on or off MINT's remeshing. : \n", "MINT_use_ZAMS_profiles : Use chemical profiles at the ZAMS if MINT_use_ZAMS_profiles is TRUE, otherwise set homogeneous abundances. (Default is TRUE, so we use the profiles if they are available.) : \n", + "MINT_fallback_to_test_data : If TRUE, use the MINT test_data directory as a fallback when data is unavailable. (FALSE) : \n", "MINT_disable_grid_load_warnings : Use this to explicitly disable MINT's warnings when loading a grid with, e.g., missing or too much data. : \n", "MINT_Kippenhahn : Turn on or off MINT's Kippenhahn diagrams. If 0, off, if 1, output star 1 (index 0), if 2 output star 2 (index 1). Default 0. : \n", + "MINT_nshells : Set the initial number of shells MINT uses in each star when doing nuclear burning. Note: remeshing can change this. If MINT_nshells is 0, shellular burning and other routines that require shells will not be available. (200) : \n", + "MINT_maximum_nshells : Set the maximum number of shells MINT uses in each star when doing nuclear burning. Note that this will be limited to MINT_HARD_MAX_NSHELLS. (1000) : \n", + "MINT_minimum_nshells : Set the minimum number of shells MINT uses in each star when doing nuclear burning. Note that this will be greater than or equal to MINT_HARD_MIN_NSHELLS, which is 0 by default. (0) : \n", "MINT_Kippenhahn_stellar_type : Stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for which Kippenhahn plot data should be output. : \n", "MINT_Kippenhahn_companion_stellar_type : Companion stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for the companion for which Kippenhahn plot data should be output. : \n", "MINT_nuclear_burning : Turn on or off MINT's nuclear burning algorithm. : \n", @@ -825,7 +861,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 5, "id": "3d29ca9d-ac66-4f9e-81cf-2edd14a98b79", "metadata": {}, "outputs": [ @@ -854,7 +890,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "e517f561-09c6-419d-ba89-d9cb61e6ebab", "metadata": {}, "outputs": [ @@ -887,7 +923,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 7, "id": "7da75a95-8831-4346-a584-e042ced75249", "metadata": {}, "outputs": [ diff --git a/docs/build/html/notebook_custom_logging.html b/docs/build/html/notebook_custom_logging.html index 1c8c66116ae305fa4e1790f093b731392bb1f5e9..a703be91f16dd705307344437f906133acfdc4fb 100644 --- a/docs/build/html/notebook_custom_logging.html +++ b/docs/build/html/notebook_custom_logging.html @@ -107,6 +107,9 @@ <li class="toctree-l2"><a class="reference internal" href="notebook_population.html">Running populations with binarycpython</a></li> <li class="toctree-l2"><a class="reference internal" href="notebook_extra_features.html">Extra features and functionality of binarycpython</a></li> <li class="toctree-l2"><a class="reference internal" href="notebook_api_functionality.html">Using the API functionality of binarycpython</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html">Example use case: Zero-age stellar luminosity function</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html#A-better-sampled-grid">A better-sampled grid</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_binaries.html">Zero-age stellar luminosity function in binaries</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="binary_c_parameters.html">Binary_c parameters</a></li> @@ -454,7 +457,7 @@ div.rendered_html tbody tr:hover { <h1>Using custom logging routines with binarycpython<a class="headerlink" href="#Using-custom-logging-routines-with-binarycpython" title="Permalink to this headline">¶</a></h1> <p>In this notebook you’ll learn how to use the custom logging functionality</p> <div class="nbinput nblast docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[37]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -477,7 +480,7 @@ div.rendered_html tbody tr:hover { <h2>Usage<a class="headerlink" href="#Usage" title="Permalink to this headline">¶</a></h2> <p>There are two methods to create the C-code that will be compiled: - Automatically generate the print statement and use the wrapper to generate the full function string, by using <code class="docutils literal notranslate"><span class="pre">autogen_C_logging_code</span></code> - Create your custom print statement and use the wrapper to generate the full function string, by writing out the print statement. Here the logging statement obviously has to be valid C code</p> <div class="nbinput docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[7]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -501,7 +504,7 @@ Printf("MY_STELLAR_DATA %g %g\n",((double)stardata->model.time),((dou </pre></div></div> </div> <div class="nbinput docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[30]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -520,7 +523,7 @@ Printf("MY_STELLAR_DATA time=%g mass=%g\n", stardata->model.time, sta </pre></div></div> </div> <div class="nbinput docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[31]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -557,7 +560,7 @@ void binary_c_API_function custom_output_function(struct stardata_t * stardata) </div> <p>Combining the above with e.g. run_system() (see notebook_individual_systems for more examples):</p> <div class="nbinput docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[32]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[5]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -590,7 +593,7 @@ MY_STELLAR_DATA time=2e-06 mass=2 <h3>Using custom logging with the population object<a class="headerlink" href="#Using-custom-logging-with-the-population-object" title="Permalink to this headline">¶</a></h3> <p>Custom logging can be used for a whole population by setting the print statement (so not the entire logging script) in <code class="docutils literal notranslate"><span class="pre">C_logging_code</span></code></p> <div class="nbinput docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[33]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[6]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -638,10 +641,10 @@ MY_STELLAR_DATA time=2e-06 mass=2 </div> <div class="output_area docutils container"> <div class="highlight"><pre> -EXAMPLE_ABOVE_MS 1.041660877905e+02 4.99198 4.99198 6.1357 6.1357 2 1 -EXAMPLE_ABOVE_MS 1.041662558619e+02 4.99198 4.99198 6.14057 6.1357 2 2 -EXAMPLE_ABOVE_MS 1.041662560111e+02 4.99198 4.99198 6.14057 6.14057 2 2 -EXAMPLE_ABOVE_MS 1.041662564579e+02 4.99198 4.99198 6.14059 6.14057 2 2 +EXAMPLE_ABOVE_MS 1.044142002936e+02 4.99194 4.99194 6.13567 6.13567 2 1 +EXAMPLE_ABOVE_MS 1.044572277695e+02 4.99192 4.99194 7.51803 6.13567 2 2 +EXAMPLE_ABOVE_MS 1.044654032097e+02 4.99192 4.99192 7.81395 7.51803 2 2 +EXAMPLE_ABOVE_MS 1.045084306856e+02 4.99191 4.99192 9.57443 7.81395 2 2 </pre></div></div> </div> </div> @@ -649,7 +652,7 @@ EXAMPLE_ABOVE_MS 1.041662564579e+02 4.99198 4.99198 6.14059 6.14057 <h3>Using custom logging when running directly from the API<a class="headerlink" href="#Using-custom-logging-when-running-directly-from-the-API" title="Permalink to this headline">¶</a></h3> <p>When running a system directly with the API we need to manually load the custom logging into memory (via <code class="docutils literal notranslate"><span class="pre">create_and_load_logging_function</span></code>) and pass the memory address to the binary_c binding via <code class="docutils literal notranslate"><span class="pre">_binary_c_bindings.run_system(argstring,</span> <span class="pre">custom_logging_func_memaddr=custom_logging_memaddr)</span></code></p> <div class="nbinput docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[40]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[7]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -714,7 +717,7 @@ MY_STELLAR_DATA 2e-06 15 <h3>Compact object<a class="headerlink" href="#Compact-object" title="Permalink to this headline">¶</a></h3> <p>This logging will print the timestep when the star becomes a compact object. After it does, we change the maximum time to be the current time, effectively terminating the evolution</p> <div class="nbinput docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[42]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[8]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -758,8 +761,8 @@ MY_STELLAR_DATA 2e-06 15 </div> <div class="output_area docutils container"> <div class="highlight"><pre> -SINGLE_STAR_LIFETIME 10 27.7358 -EXAMPLE_LOG_CO 2.773581245005e+01 1.33524 9.19314 1.72498e-05 730.446 13 5 +SINGLE_STAR_LIFETIME 10 28.4838 +EXAMPLE_LOG_CO 2.848380621869e+01 1.33469 9.1865 1.72498e-05 724.338 13 5 </pre></div></div> </div> </div> @@ -767,7 +770,7 @@ EXAMPLE_LOG_CO 2.773581245005e+01 1.33524 9.19314 1.72498e-05 730.44 <h3>Logging mass evolution and the supernova<a class="headerlink" href="#Logging-mass-evolution-and-the-supernova" title="Permalink to this headline">¶</a></h3> <p>This logging code prints the mass evolution and the moment the star goes supernova</p> <div class="nbinput docutils container"> -<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[47]: +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[10]: </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> @@ -786,58 +789,27 @@ EXAMPLE_LOG_CO 2.773581245005e+01 1.33524 9.19314 1.72498e-05 730.44 <span class="s2">{</span> <span class="s2"> if (stardata->model.time < stardata->model.max_evolution_time)</span> <span class="s2"> {</span> -<span class="s2"> if(stardata->pre_events_stardata != NULL)</span> -<span class="s2"> {</span> -<span class="s2"> Printf("EXAMPLE_SN </span><span class="si">%30.12e</span><span class="s2"> " // 1</span> -<span class="s2"> "</span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> " // 2-5</span> -<span class="s2"> "</span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> " // 6-9</span> -<span class="s2"> "</span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="se">\\</span><span class="s2">n", // 10-13</span> - -<span class="s2"> //</span> -<span class="s2"> stardata->model.time, // 1</span> - -<span class="s2"> stardata->star[0].mass, //2</span> -<span class="s2"> stardata->pre_events_stardata->star[0].mass, //3</span> -<span class="s2"> stardata->common.zero_age.mass[0], //4</span> -<span class="s2"> stardata->star[0].SN_type, //5</span> - -<span class="s2"> stardata->star[0].stellar_type, //6</span> -<span class="s2"> stardata->pre_events_stardata->star[0].stellar_type, //7</span> -<span class="s2"> stardata->model.probability, //8</span> -<span class="s2"> stardata->pre_events_stardata->star[0].core_mass[ID_core(stardata->pre_events_stardata->star[0].stellar_type)], // 9</span> - -<span class="s2"> stardata->pre_events_stardata->star[0].core_mass[CORE_CO], // 10</span> -<span class="s2"> stardata->pre_events_stardata->star[0].core_mass[CORE_He], // 11</span> -<span class="s2"> stardata->star[0].fallback, // 12</span> -<span class="s2"> stardata->star[0].fallback_mass // 13</span> -<span class="s2"> );</span> -<span class="s2"> }</span> -<span class="s2"> else</span> -<span class="s2"> {</span> -<span class="s2"> Printf("EXAMPLE_SN </span><span class="si">%30.12e</span><span class="s2"> " // 1</span> -<span class="s2"> "</span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> " // 2-5</span> -<span class="s2"> "</span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> " // 6-9</span> -<span class="s2"> "</span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="se">\\</span><span class="s2">n", // 10-13</span> - -<span class="s2"> //</span> -<span class="s2"> stardata->model.time, // 1</span> - -<span class="s2"> stardata->star[0].mass, //2</span> -<span class="s2"> stardata->previous_stardata->star[0].mass, //3</span> -<span class="s2"> stardata->common.zero_age.mass[0], //4</span> -<span class="s2"> stardata->star[0].SN_type, //5</span> - -<span class="s2"> stardata->star[0].stellar_type, //6</span> -<span class="s2"> stardata->previous_stardata->star[0].stellar_type, //7</span> -<span class="s2"> stardata->model.probability, //8</span> -<span class="s2"> stardata->previous_stardata->star[0].core_mass[ID_core(stardata->previous_stardata->star[0].stellar_type)], // 9</span> - -<span class="s2"> stardata->previous_stardata->star[0].core_mass[CORE_CO], // 10</span> -<span class="s2"> stardata->previous_stardata->star[0].core_mass[CORE_He], // 11</span> -<span class="s2"> stardata->star[0].fallback, // 12</span> -<span class="s2"> stardata->star[0].fallback_mass // 13</span> -<span class="s2"> );</span> -<span class="s2"> }</span> +<span class="s2"> Printf("EXAMPLE_SN </span><span class="si">%30.12e</span><span class="s2"> " // 1</span> +<span class="s2"> "</span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> " // 2-5</span> +<span class="s2"> "</span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> " // 6-9</span> +<span class="s2"> "</span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="se">\\</span><span class="s2">n", // 10-13</span> + +<span class="s2"> //</span> +<span class="s2"> stardata->model.time, // 1</span> + +<span class="s2"> stardata->star[0].mass, //2</span> +<span class="s2"> stardata->previous_stardata->star[0].mass, //3</span> +<span class="s2"> stardata->common.zero_age.mass[0], //4</span> +<span class="s2"> stardata->star[0].SN_type, //5</span> + +<span class="s2"> stardata->star[0].stellar_type, //6</span> +<span class="s2"> stardata->previous_stardata->star[0].stellar_type, //7</span> +<span class="s2"> stardata->model.probability, //8</span> +<span class="s2"> stardata->previous_stardata->star[0].core_mass[ID_core(stardata->previous_stardata->star[0].stellar_type)], // 9</span> + +<span class="s2"> stardata->previous_stardata->star[0].core_mass[CORE_CO], // 10</span> +<span class="s2"> stardata->previous_stardata->star[0].core_mass[CORE_He] // 11</span> +<span class="s2"> );</span> <span class="s2"> };</span> <span class="s2"> /* Kill the simulation to save time */</span> <span class="s2"> stardata->model.max_evolution_time = stardata->model.time - stardata->model.dtm;</span> @@ -860,10 +832,19 @@ EXAMPLE_LOG_CO 2.773581245005e+01 1.33524 9.19314 1.72498e-05 730.44 </div> <div class="output_area docutils container"> <div class="highlight"><pre> -EXAMPLE_MASSLOSS 9.878236827680e+00 1.61349 8.38063 20 13 1 -EXAMPLE_SN 9.878236827680e+00 1.61349 8.38063 20 12 13 5 1 6.74037 4.92267 6.74037 0 0 +EXAMPLE_MASSLOSS 1.050651207308e+01 1.59452 9.34213 20 13 1 +EXAMPLE_SN 1.050651207308e+01 1.59452 9.34213 20 12 13 5 1 6.55458 4.71662 6.55458 </pre></div></div> </div> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[ ]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span> +</pre></div> +</div> +</div> </div> </div> </div> @@ -902,9 +883,9 @@ EXAMPLE_SN 9.878236827680e+00 1.61349 8.38063 20 12 13 5 1 6.74037 4 provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/notebook_custom_logging.ipynb b/docs/build/html/notebook_custom_logging.ipynb index 05ffbccfc23f0b08e85abed0d467233385520a4b..84e41e6bcee06490f5b4dc61fb616cc213024aba 100644 --- a/docs/build/html/notebook_custom_logging.ipynb +++ b/docs/build/html/notebook_custom_logging.ipynb @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 1, "id": "696ecbb9-1efd-48f4-a57e-2cf6dfe416f1", "metadata": {}, "outputs": [], @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 2, "id": "236cf821-09ac-4237-9b8f-6e36d2edf446", "metadata": {}, "outputs": [ @@ -90,7 +90,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 3, "id": "feb423d5-5cc3-433c-9801-f8017abbc03a", "metadata": {}, "outputs": [ @@ -110,7 +110,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 4, "id": "2f5defbf-c623-49ed-a238-fba52a563a58", "metadata": {}, "outputs": [ @@ -155,7 +155,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 5, "id": "dcd74bbc-478b-43e4-b495-8c456e8d1d88", "metadata": {}, "outputs": [ @@ -195,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 6, "id": "77bd09b0-1a94-499d-97db-a1f991c67c12", "metadata": {}, "outputs": [ @@ -203,10 +203,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "EXAMPLE_ABOVE_MS 1.041660877905e+02 4.99198 4.99198 6.1357 6.1357 2 1\n", - "EXAMPLE_ABOVE_MS 1.041662558619e+02 4.99198 4.99198 6.14057 6.1357 2 2\n", - "EXAMPLE_ABOVE_MS 1.041662560111e+02 4.99198 4.99198 6.14057 6.14057 2 2\n", - "EXAMPLE_ABOVE_MS 1.041662564579e+02 4.99198 4.99198 6.14059 6.14057 2 2\n" + "EXAMPLE_ABOVE_MS 1.044142002936e+02 4.99194 4.99194 6.13567 6.13567 2 1\n", + "EXAMPLE_ABOVE_MS 1.044572277695e+02 4.99192 4.99194 7.51803 6.13567 2 2\n", + "EXAMPLE_ABOVE_MS 1.044654032097e+02 4.99192 4.99192 7.81395 7.51803 2 2\n", + "EXAMPLE_ABOVE_MS 1.045084306856e+02 4.99191 4.99192 9.57443 7.81395 2 2\n" ] } ], @@ -260,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 7, "id": "30142286-34ce-433e-82c8-565e2160ff5b", "metadata": {}, "outputs": [ @@ -336,7 +336,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 8, "id": "6f0edc65-a788-4706-a0c5-2ace030765ec", "metadata": {}, "outputs": [ @@ -344,8 +344,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "SINGLE_STAR_LIFETIME 10 27.7358\n", - "EXAMPLE_LOG_CO 2.773581245005e+01 1.33524 9.19314 1.72498e-05 730.446 13 5\n" + "SINGLE_STAR_LIFETIME 10 28.4838\n", + "EXAMPLE_LOG_CO 2.848380621869e+01 1.33469 9.1865 1.72498e-05 724.338 13 5\n" ] } ], @@ -395,7 +395,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 10, "id": "8f58fdf9-3e76-4c18-a1c5-eed0980d4133", "metadata": {}, "outputs": [ @@ -403,8 +403,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "EXAMPLE_MASSLOSS 9.878236827680e+00 1.61349 8.38063 20 13 1\n", - "EXAMPLE_SN 9.878236827680e+00 1.61349 8.38063 20 12 13 5 1 6.74037 4.92267 6.74037 0 0\n" + "EXAMPLE_MASSLOSS 1.050651207308e+01 1.59452 9.34213 20 13 1\n", + "EXAMPLE_SN 1.050651207308e+01 1.59452 9.34213 20 12 13 5 1 6.55458 4.71662 6.55458\n" ] } ], @@ -424,58 +424,27 @@ "{\n", " if (stardata->model.time < stardata->model.max_evolution_time)\n", " {\n", - " if(stardata->pre_events_stardata != NULL)\n", - " {\n", - " Printf(\"EXAMPLE_SN %30.12e \" // 1\n", - " \"%g %g %g %d \" // 2-5\n", - " \"%d %d %g %g \" // 6-9\n", - " \"%g %g %g %g\\\\n\", // 10-13\n", - "\n", - " // \n", - " stardata->model.time, // 1\n", - "\n", - " stardata->star[0].mass, //2\n", - " stardata->pre_events_stardata->star[0].mass, //3\n", - " stardata->common.zero_age.mass[0], //4\n", - " stardata->star[0].SN_type, //5\n", + " Printf(\"EXAMPLE_SN %30.12e \" // 1\n", + " \"%g %g %g %d \" // 2-5\n", + " \"%d %d %g %g \" // 6-9\n", + " \"%g %g\\\\n\", // 10-13\n", "\n", - " stardata->star[0].stellar_type, //6\n", - " stardata->pre_events_stardata->star[0].stellar_type, //7\n", - " stardata->model.probability, //8\n", - " stardata->pre_events_stardata->star[0].core_mass[ID_core(stardata->pre_events_stardata->star[0].stellar_type)], // 9\n", - "\n", - " stardata->pre_events_stardata->star[0].core_mass[CORE_CO], // 10\n", - " stardata->pre_events_stardata->star[0].core_mass[CORE_He], // 11\n", - " stardata->star[0].fallback, // 12\n", - " stardata->star[0].fallback_mass // 13\n", - " );\n", - " }\n", - " else\n", - " {\n", - " Printf(\"EXAMPLE_SN %30.12e \" // 1\n", - " \"%g %g %g %d \" // 2-5\n", - " \"%d %d %g %g \" // 6-9\n", - " \"%g %g %g %g\\\\n\", // 10-13\n", - "\n", - " // \n", - " stardata->model.time, // 1\n", + " // \n", + " stardata->model.time, // 1\n", "\n", - " stardata->star[0].mass, //2\n", - " stardata->previous_stardata->star[0].mass, //3\n", - " stardata->common.zero_age.mass[0], //4\n", - " stardata->star[0].SN_type, //5\n", + " stardata->star[0].mass, //2\n", + " stardata->previous_stardata->star[0].mass, //3\n", + " stardata->common.zero_age.mass[0], //4\n", + " stardata->star[0].SN_type, //5\n", "\n", - " stardata->star[0].stellar_type, //6\n", - " stardata->previous_stardata->star[0].stellar_type, //7\n", - " stardata->model.probability, //8\n", - " stardata->previous_stardata->star[0].core_mass[ID_core(stardata->previous_stardata->star[0].stellar_type)], // 9\n", + " stardata->star[0].stellar_type, //6\n", + " stardata->previous_stardata->star[0].stellar_type, //7\n", + " stardata->model.probability, //8\n", + " stardata->previous_stardata->star[0].core_mass[ID_core(stardata->previous_stardata->star[0].stellar_type)], // 9\n", "\n", - " stardata->previous_stardata->star[0].core_mass[CORE_CO], // 10\n", - " stardata->previous_stardata->star[0].core_mass[CORE_He], // 11\n", - " stardata->star[0].fallback, // 12\n", - " stardata->star[0].fallback_mass // 13\n", - " );\n", - " }\n", + " stardata->previous_stardata->star[0].core_mass[CORE_CO], // 10\n", + " stardata->previous_stardata->star[0].core_mass[CORE_He] // 11\n", + " );\n", " };\n", " /* Kill the simulation to save time */\n", " stardata->model.max_evolution_time = stardata->model.time - stardata->model.dtm;\n", @@ -491,6 +460,14 @@ "# print (abridged) output\n", "print(\"\\n\".join(output.splitlines()[-2:]))" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "484297c0-accb-4efc-a9c8-dbd2f32b89a6", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/docs/build/html/notebook_extra_features.html b/docs/build/html/notebook_extra_features.html index bd6f0c339880fd59d4c25aea33c9efb517867483..8c058cd553364229e4adceb4d9e57c6b0358308d 100644 --- a/docs/build/html/notebook_extra_features.html +++ b/docs/build/html/notebook_extra_features.html @@ -102,6 +102,9 @@ </ul> </li> <li class="toctree-l2"><a class="reference internal" href="notebook_api_functionality.html">Using the API functionality of binarycpython</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html">Example use case: Zero-age stellar luminosity function</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html#A-better-sampled-grid">A better-sampled grid</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_binaries.html">Zero-age stellar luminosity function in binaries</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="binary_c_parameters.html">Binary_c parameters</a></li> @@ -646,9 +649,9 @@ get_defaults(filter_values:bool=False) -> dict provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/notebook_individual_systems.html b/docs/build/html/notebook_individual_systems.html index f2110d005926fc4d6ef036b02c16691600b1ee71..fc02322380b188bfb8493fc48f8a558d556eb84d 100644 --- a/docs/build/html/notebook_individual_systems.html +++ b/docs/build/html/notebook_individual_systems.html @@ -100,6 +100,9 @@ <li class="toctree-l2"><a class="reference internal" href="notebook_population.html">Running populations with binarycpython</a></li> <li class="toctree-l2"><a class="reference internal" href="notebook_extra_features.html">Extra features and functionality of binarycpython</a></li> <li class="toctree-l2"><a class="reference internal" href="notebook_api_functionality.html">Using the API functionality of binarycpython</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html">Example use case: Zero-age stellar luminosity function</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html#A-better-sampled-grid">A better-sampled grid</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_binaries.html">Zero-age stellar luminosity function in binaries</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="binary_c_parameters.html">Binary_c parameters</a></li> @@ -927,9 +930,9 @@ SINGLE_STAR_LIFETIME 15 14.9947 provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/notebook_luminosity_function_binaries.html b/docs/build/html/notebook_luminosity_function_binaries.html new file mode 100644 index 0000000000000000000000000000000000000000..850f413f1c673118ff937f15a9b2c5647ff82766 --- /dev/null +++ b/docs/build/html/notebook_luminosity_function_binaries.html @@ -0,0 +1,1247 @@ + + +<!DOCTYPE html> +<html class="writer-html5" lang="en" > +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Zero-age stellar luminosity function in binaries — binary_c-python documentation</title> + + + + <link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + + + + + + + + <!--[if lt IE 9]> + <script src="_static/js/html5shiv.min.js"></script> + <![endif]--> + + + <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> + <script src="_static/jquery.js"></script> + <script src="_static/underscore.js"></script> + <script src="_static/doctools.js"></script> + <script src="_static/language_data.js"></script> + <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> + <script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script> + <script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true, "ignoreClass": "document", "processClass": "math|output_area"}})</script> + + <script type="text/javascript" src="_static/js/theme.js"></script> + + + <link rel="index" title="Index" href="genindex.html" /> + <link rel="search" title="Search" href="search.html" /> + <link rel="next" title="Binary_c parameters" href="binary_c_parameters.html" /> + <link rel="prev" title="Example use case: Zero-age stellar luminosity function" href="notebook_luminosity_function_single.html" /> +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search" > + + + + <a href="index.html" class="icon icon-home" alt="Documentation Home"> binary_c-python + + + + </a> + + + + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="readme_link.html">Python module for binary_c</a></li> +<li class="toctree-l1"><a class="reference internal" href="modules.html">Binarycpython code</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="example_notebooks.html">Example notebooks</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="notebook_individual_systems.html">Running individual systems with binarycpython</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_custom_logging.html">Using custom logging routines with binarycpython</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_population.html">Running populations with binarycpython</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_extra_features.html">Extra features and functionality of binarycpython</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_api_functionality.html">Using the API functionality of binarycpython</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html">Example use case: Zero-age stellar luminosity function</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html#A-better-sampled-grid">A better-sampled grid</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Zero-age stellar luminosity function in binaries</a><ul> +<li class="toctree-l3"><a class="reference internal" href="#Setting-up-the-Population-object">Setting up the Population object</a></li> +<li class="toctree-l3"><a class="reference internal" href="#Adding-grid-variables">Adding grid variables</a></li> +<li class="toctree-l3"><a class="reference internal" href="#Setting-logging-and-handling-the-output">Setting logging and handling the output</a></li> +<li class="toctree-l3"><a class="reference internal" href="#Evolving-the-grid">Evolving the grid</a></li> +</ul> +</li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="binary_c_parameters.html">Binary_c parameters</a></li> +<li class="toctree-l1"><a class="reference internal" href="grid_options_descriptions.html">Population grid code options</a></li> +<li class="toctree-l1"><a class="reference external" href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python">Visit the GitLab repo</a></li> +<li class="toctree-l1"><a class="reference external" href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/issues/new">Submit an issue</a></li> +</ul> + + + + </div> + + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="index.html">binary_c-python</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="index.html" class="icon icon-home"></a> »</li> + + <li><a href="example_notebooks.html">Example notebooks</a> »</li> + + <li>Zero-age stellar luminosity function in binaries</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="_sources/notebook_luminosity_function_binaries.ipynb.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + +<style> +/* CSS for nbsphinx extension */ + +/* remove conflicting styling from Sphinx themes */ +div.nbinput.container div.prompt *, +div.nboutput.container div.prompt *, +div.nbinput.container div.input_area pre, +div.nboutput.container div.output_area pre, +div.nbinput.container div.input_area .highlight, +div.nboutput.container div.output_area .highlight { + border: none; + padding: 0; + margin: 0; + box-shadow: none; +} + +div.nbinput.container > div[class*=highlight], +div.nboutput.container > div[class*=highlight] { + margin: 0; +} + +div.nbinput.container div.prompt *, +div.nboutput.container div.prompt * { + background: none; +} + +div.nboutput.container div.output_area .highlight, +div.nboutput.container div.output_area pre { + background: unset; +} + +div.nboutput.container div.output_area div.highlight { + color: unset; /* override Pygments text color */ +} + +/* avoid gaps between output lines */ +div.nboutput.container div[class*=highlight] pre { + line-height: normal; +} + +/* input/output containers */ +div.nbinput.container, +div.nboutput.container { + display: -webkit-flex; + display: flex; + align-items: flex-start; + margin: 0; + width: 100%; +} +@media (max-width: 540px) { + div.nbinput.container, + div.nboutput.container { + flex-direction: column; + } +} + +/* input container */ +div.nbinput.container { + padding-top: 5px; +} + +/* last container */ +div.nblast.container { + padding-bottom: 5px; +} + +/* input prompt */ +div.nbinput.container div.prompt pre { + color: #307FC1; +} + +/* output prompt */ +div.nboutput.container div.prompt pre { + color: #BF5B3D; +} + +/* all prompts */ +div.nbinput.container div.prompt, +div.nboutput.container div.prompt { + width: 4.5ex; + padding-top: 5px; + position: relative; + user-select: none; +} + +div.nbinput.container div.prompt > div, +div.nboutput.container div.prompt > div { + position: absolute; + right: 0; + margin-right: 0.3ex; +} + +@media (max-width: 540px) { + div.nbinput.container div.prompt, + div.nboutput.container div.prompt { + width: unset; + text-align: left; + padding: 0.4em; + } + div.nboutput.container div.prompt.empty { + padding: 0; + } + + div.nbinput.container div.prompt > div, + div.nboutput.container div.prompt > div { + position: unset; + } +} + +/* disable scrollbars on prompts */ +div.nbinput.container div.prompt pre, +div.nboutput.container div.prompt pre { + overflow: hidden; +} + +/* input/output area */ +div.nbinput.container div.input_area, +div.nboutput.container div.output_area { + -webkit-flex: 1; + flex: 1; + overflow: auto; +} +@media (max-width: 540px) { + div.nbinput.container div.input_area, + div.nboutput.container div.output_area { + width: 100%; + } +} + +/* input area */ +div.nbinput.container div.input_area { + border: 1px solid #e0e0e0; + border-radius: 2px; + /*background: #f5f5f5;*/ +} + +/* override MathJax center alignment in output cells */ +div.nboutput.container div[class*=MathJax] { + text-align: left !important; +} + +/* override sphinx.ext.imgmath center alignment in output cells */ +div.nboutput.container div.math p { + text-align: left; +} + +/* standard error */ +div.nboutput.container div.output_area.stderr { + background: #fdd; +} + +/* ANSI colors */ +.ansi-black-fg { color: #3E424D; } +.ansi-black-bg { background-color: #3E424D; } +.ansi-black-intense-fg { color: #282C36; } +.ansi-black-intense-bg { background-color: #282C36; } +.ansi-red-fg { color: #E75C58; } +.ansi-red-bg { background-color: #E75C58; } +.ansi-red-intense-fg { color: #B22B31; } +.ansi-red-intense-bg { background-color: #B22B31; } +.ansi-green-fg { color: #00A250; } +.ansi-green-bg { background-color: #00A250; } +.ansi-green-intense-fg { color: #007427; } +.ansi-green-intense-bg { background-color: #007427; } +.ansi-yellow-fg { color: #DDB62B; } +.ansi-yellow-bg { background-color: #DDB62B; } +.ansi-yellow-intense-fg { color: #B27D12; } +.ansi-yellow-intense-bg { background-color: #B27D12; } +.ansi-blue-fg { color: #208FFB; } +.ansi-blue-bg { background-color: #208FFB; } +.ansi-blue-intense-fg { color: #0065CA; } +.ansi-blue-intense-bg { background-color: #0065CA; } +.ansi-magenta-fg { color: #D160C4; } +.ansi-magenta-bg { background-color: #D160C4; } +.ansi-magenta-intense-fg { color: #A03196; } +.ansi-magenta-intense-bg { background-color: #A03196; } +.ansi-cyan-fg { color: #60C6C8; } +.ansi-cyan-bg { background-color: #60C6C8; } +.ansi-cyan-intense-fg { color: #258F8F; } +.ansi-cyan-intense-bg { background-color: #258F8F; } +.ansi-white-fg { color: #C5C1B4; } +.ansi-white-bg { background-color: #C5C1B4; } +.ansi-white-intense-fg { color: #A1A6B2; } +.ansi-white-intense-bg { background-color: #A1A6B2; } + +.ansi-default-inverse-fg { color: #FFFFFF; } +.ansi-default-inverse-bg { background-color: #000000; } + +.ansi-bold { font-weight: bold; } +.ansi-underline { text-decoration: underline; } + + +div.nbinput.container div.input_area div[class*=highlight] > pre, +div.nboutput.container div.output_area div[class*=highlight] > pre, +div.nboutput.container div.output_area div[class*=highlight].math, +div.nboutput.container div.output_area.rendered_html, +div.nboutput.container div.output_area > div.output_javascript, +div.nboutput.container div.output_area:not(.rendered_html) > img{ + padding: 5px; + margin: 0; +} + +/* fix copybtn overflow problem in chromium (needed for 'sphinx_copybutton') */ +div.nbinput.container div.input_area > div[class^='highlight'], +div.nboutput.container div.output_area > div[class^='highlight']{ + overflow-y: hidden; +} + +/* hide copybtn icon on prompts (needed for 'sphinx_copybutton') */ +.prompt a.copybtn { + display: none; +} + +/* Some additional styling taken form the Jupyter notebook CSS */ +div.rendered_html table { + border: none; + border-collapse: collapse; + border-spacing: 0; + color: black; + font-size: 12px; + table-layout: fixed; +} +div.rendered_html thead { + border-bottom: 1px solid black; + vertical-align: bottom; +} +div.rendered_html tr, +div.rendered_html th, +div.rendered_html td { + text-align: right; + vertical-align: middle; + padding: 0.5em 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} +div.rendered_html th { + font-weight: bold; +} +div.rendered_html tbody tr:nth-child(odd) { + background: #f5f5f5; +} +div.rendered_html tbody tr:hover { + background: rgba(66, 165, 245, 0.2); +} + +/* CSS overrides for sphinx_rtd_theme */ + +/* 24px margin */ +.nbinput.nblast.container, +.nboutput.nblast.container { + margin-bottom: 19px; /* padding has already 5px */ +} + +/* ... except between code cells! */ +.nblast.container + .nbinput.container { + margin-top: -19px; +} + +.admonition > p:before { + margin-right: 4px; /* make room for the exclamation icon */ +} + +/* Fix math alignment, see https://github.com/rtfd/sphinx_rtd_theme/pull/686 */ +.math { + text-align: unset; +} +</style> +<div class="section" id="Zero-age-stellar-luminosity-function-in-binaries"> +<h1>Zero-age stellar luminosity function in binaries<a class="headerlink" href="#Zero-age-stellar-luminosity-function-in-binaries" title="Permalink to this headline">¶</a></h1> +<p>In this notebook we compute the luminosity function of the zero-age main-sequence by running a population of binary stars using binary_c.</p> +<p>Before you go through this notebook, you should look at notebook_luminosity_function.ipynb which is for the - conceptually more simple - single stars.</p> +<p>We start by loading in some standard Python modules and the binary_c module.</p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">math</span> +<span class="kn">from</span> <span class="nn">binarycpython.utils.grid</span> <span class="kn">import</span> <span class="n">Population</span> + +<span class="c1"># help(Population) # Uncomment this line to see the public functions of this object</span> +</pre></div> +</div> +</div> +<div class="section" id="Setting-up-the-Population-object"> +<h2>Setting up the Population object<a class="headerlink" href="#Setting-up-the-Population-object" title="Permalink to this headline">¶</a></h2> +<p>To set up and configure the population object we need to make a new instance of the <code class="docutils literal notranslate"><span class="pre">Population</span></code> object and configure it with the <code class="docutils literal notranslate"><span class="pre">.set()</span></code> function.</p> +<p>In our case, we only need to set the maximum evolution time to something short, because we care only about zero-age main sequence stars which have, by definition, age zero.</p> +<div class="nbinput docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># Create population object</span> +<span class="n">population</span> <span class="o">=</span> <span class="n">Population</span><span class="p">()</span> + +<span class="c1"># If you want verbosity, set this before other things</span> +<span class="n">population</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">verbosity</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + +<span class="c1"># Setting values can be done via .set(<parameter_name>=<value>)</span> +<span class="c1"># Values that are known to be binary_c_parameters are loaded into bse_options.</span> +<span class="c1"># Those that are present in the default grid_options are set in grid_options</span> +<span class="c1"># All other values that you set are put in a custom_options dict</span> +<span class="n">population</span><span class="o">.</span><span class="n">set</span><span class="p">(</span> + <span class="c1"># binary_c physics options</span> + <span class="n">max_evolution_time</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span> <span class="c1"># maximum stellar evolution time in Myr</span> + <span class="p">)</span> + +<span class="c1"># We can access the options through</span> +<span class="nb">print</span><span class="p">(</span><span class="s2">"verbosity is"</span><span class="p">,</span> <span class="n">population</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s1">'verbosity'</span><span class="p">])</span> +</pre></div> +</div> +</div> +<div class="nboutput nblast docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +adding: max_evolution_time=0.1 to BSE_options +verbosity is 1 +</pre></div></div> +</div> +</div> +<div class="section" id="Adding-grid-variables"> +<h2>Adding grid variables<a class="headerlink" href="#Adding-grid-variables" title="Permalink to this headline">¶</a></h2> +<p>The main purpose of the Population object is to handle the population synthesis side of running a set of stars. The main method to do this with binarycpython, as is the case with Perl binarygrid, is to use grid variables. These are loops over a predefined range of values, where a probability will be assigned to the systems based on the chosen probability distributions.</p> +<p>Usually we use either 1 mass grid variable, or a trio of mass, mass ratio and period (other notebooks cover these examples). We can, however, also add grid sampling for e.g. eccentricity, metallicity or other parameters.</p> +<p>To add a grid variable to the population object we use <code class="docutils literal notranslate"><span class="pre">population.add_grid_variable</span></code></p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># help(population.add_grid_variable)</span> +</pre></div> +</div> +</div> +<p>All the distribution functions that we can use are stored in the <code class="docutils literal notranslate"><span class="pre">binarycpython.utils.distribution_functions</span></code> or <code class="docutils literal notranslate"><span class="pre">binarycpython/utils/distribution_functions.py</span></code> on git. If you uncomment the help statement below you can see which functions are available now:</p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="kn">import</span> <span class="nn">binarycpython.utils.distribution_functions</span> +<span class="c1"># help(binarycpython.utils.distribution_functions)</span> +</pre></div> +</div> +</div> +<p>First let us set up some global variables that will be useful throughout. * The resolution is the number of stars we simulate in our model population. * The massrange is a list of the min and max masses * The total_probability is the theoretical integral of a probability density function, i.e. 1.0. * The binwidth sets the resolution of the final distribution. If set to 0.5, the bins in log<em>L</em> are 0.5dex wide.</p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[5]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># Set resolution and mass range that we simulate</span> +<span class="n">resolution</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"M_1"</span><span class="p">:</span> <span class="mi">40</span><span class="p">}</span> <span class="c1"># start with resolution = 10, and increase later if you want "more accurate" data</span> +<span class="n">massrange</span> <span class="o">=</span> <span class="p">(</span><span class="mf">0.07</span><span class="p">,</span> <span class="mf">100.0</span><span class="p">)</span> <span class="c1"># we work with stars of mass 0.07 to 100 Msun</span> +<span class="n">total_probability</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="c1"># theoretical integral of the mass probability density function over all masses</span> +<span class="c1"># distribution binwidths :</span> +<span class="c1"># (log10) luminosity distribution</span> +<span class="n">binwidth</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'luminosity'</span> <span class="p">:</span> <span class="mf">1.0</span> <span class="p">}</span> +</pre></div> +</div> +</div> +<p>The next cell contains an example of adding the mass grid variable, sampling the phase space in linear mass <em>M</em>_1.</p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[6]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># Set up the binary grid in "cubic" M1 - M2=q*M1 - log10 period space</span> + +<span class="n">population</span> <span class="o">=</span> <span class="n">Population</span><span class="p">()</span> + +<span class="c1"># resolution on each side of the cube, with more stars for the primary mass</span> +<span class="n">nres</span> <span class="o">=</span> <span class="mi">10</span> +<span class="n">resolution</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"M_1"</span><span class="p">:</span> <span class="mi">2</span><span class="o">*</span><span class="n">nres</span><span class="p">,</span> + <span class="s2">"q"</span><span class="p">:</span> <span class="n">nres</span><span class="p">,</span> + <span class="s2">"per"</span><span class="p">:</span> <span class="n">nres</span><span class="p">}</span> + +<span class="n">massrange</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.07</span><span class="p">,</span><span class="mi">100</span><span class="p">]</span> +<span class="n">logperrange</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.15</span><span class="p">,</span> <span class="mf">5.5</span><span class="p">]</span> + +<span class="n">population</span><span class="o">.</span><span class="n">add_grid_variable</span><span class="p">(</span> + <span class="n">name</span><span class="o">=</span><span class="s2">"lnm1"</span><span class="p">,</span> + <span class="n">longname</span><span class="o">=</span><span class="s2">"Primary mass"</span><span class="p">,</span> + <span class="n">valuerange</span><span class="o">=</span><span class="n">massrange</span><span class="p">,</span> + <span class="n">resolution</span><span class="o">=</span><span class="s2">"</span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">resolution</span><span class="p">[</span><span class="s2">"M_1"</span><span class="p">]),</span> + <span class="n">spacingfunc</span><span class="o">=</span><span class="s2">"const(math.log(</span><span class="si">{min}</span><span class="s2">), math.log(</span><span class="si">{max}</span><span class="s2">), </span><span class="si">{res}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">min</span><span class="o">=</span><span class="n">massrange</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="nb">max</span><span class="o">=</span><span class="n">massrange</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">res</span><span class="o">=</span><span class="n">resolution</span><span class="p">[</span><span class="s2">"M_1"</span><span class="p">]),</span> + <span class="n">precode</span><span class="o">=</span><span class="s2">"M_1=math.exp(lnm1)"</span><span class="p">,</span> + <span class="n">probdist</span><span class="o">=</span><span class="s2">"three_part_powerlaw(M_1, 0.1, 0.5, 1.0, 150, -1.3, -2.3, -2.3)*M_1"</span><span class="p">,</span> + <span class="n">dphasevol</span><span class="o">=</span><span class="s2">"dlnm1"</span><span class="p">,</span> + <span class="n">parameter_name</span><span class="o">=</span><span class="s2">"M_1"</span><span class="p">,</span> + <span class="n">condition</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="c1"># Impose a condition on this grid variable. Mostly for a check for yourself</span> +<span class="p">)</span> + +<span class="c1"># Mass ratio</span> +<span class="n">population</span><span class="o">.</span><span class="n">add_grid_variable</span><span class="p">(</span> + <span class="n">name</span><span class="o">=</span><span class="s2">"q"</span><span class="p">,</span> + <span class="n">longname</span><span class="o">=</span><span class="s2">"Mass ratio"</span><span class="p">,</span> + <span class="n">valuerange</span><span class="o">=</span><span class="p">[</span><span class="s2">"0.1/M_1"</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> + <span class="n">resolution</span><span class="o">=</span><span class="s2">"</span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">resolution</span><span class="p">[</span><span class="s1">'q'</span><span class="p">]),</span> + <span class="n">spacingfunc</span><span class="o">=</span><span class="s2">"const(</span><span class="si">{}</span><span class="s2">/M_1, 1, </span><span class="si">{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">massrange</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">resolution</span><span class="p">[</span><span class="s1">'q'</span><span class="p">]),</span> + <span class="n">probdist</span><span class="o">=</span><span class="s2">"flatsections(q, [{{'min': </span><span class="si">{}</span><span class="s2">/M_1, 'max': 1.0, 'height': 1}}])"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">massrange</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> + <span class="n">dphasevol</span><span class="o">=</span><span class="s2">"dq"</span><span class="p">,</span> + <span class="n">precode</span><span class="o">=</span><span class="s2">"M_2 = q * M_1"</span><span class="p">,</span> + <span class="n">parameter_name</span><span class="o">=</span><span class="s2">"M_2"</span><span class="p">,</span> + <span class="n">condition</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="c1"># Impose a condition on this grid variable. Mostly for a check for yourself</span> + <span class="p">)</span> + +<span class="c1"># Orbital period</span> +<span class="n">population</span><span class="o">.</span><span class="n">add_grid_variable</span><span class="p">(</span> + <span class="n">name</span><span class="o">=</span><span class="s2">"log10per"</span><span class="p">,</span> <span class="c1"># in days</span> + <span class="n">longname</span><span class="o">=</span><span class="s2">"log10(Orbital_Period)"</span><span class="p">,</span> + <span class="n">valuerange</span><span class="o">=</span><span class="p">[</span><span class="mf">0.15</span><span class="p">,</span> <span class="mf">5.5</span><span class="p">],</span> + <span class="n">resolution</span><span class="o">=</span><span class="s2">"</span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">resolution</span><span class="p">[</span><span class="s2">"per"</span><span class="p">]),</span> + <span class="n">spacingfunc</span><span class="o">=</span><span class="s2">"const(</span><span class="si">{}</span><span class="s2">, </span><span class="si">{}</span><span class="s2">, </span><span class="si">{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">logperrange</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">logperrange</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">resolution</span><span class="p">[</span><span class="s2">"per"</span><span class="p">]),</span> + <span class="n">precode</span><span class="o">=</span><span class="s2">"""orbital_period = 10.0 ** log10per</span> +<span class="s2">sep = calc_sep_from_period(M_1, M_2, orbital_period)</span> +<span class="s2">sep_min = calc_sep_from_period(M_1, M_2, 10**</span><span class="si">{}</span><span class="s2">)</span> +<span class="s2">sep_max = calc_sep_from_period(M_1, M_2, 10**</span><span class="si">{}</span><span class="s2">)"""</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">logperrange</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">logperrange</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> + <span class="n">probdist</span><span class="o">=</span><span class="s2">"sana12(M_1, M_2, sep, orbital_period, sep_min, sep_max, math.log10(10**</span><span class="si">{}</span><span class="s2">), math.log10(10**</span><span class="si">{}</span><span class="s2">), </span><span class="si">{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">logperrange</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">logperrange</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="o">-</span><span class="mf">0.55</span><span class="p">),</span> + <span class="n">parameter_name</span><span class="o">=</span><span class="s2">"orbital_period"</span><span class="p">,</span> + <span class="n">dphasevol</span><span class="o">=</span><span class="s2">"dlog10per"</span><span class="p">,</span> + <span class="p">)</span> +</pre></div> +</div> +</div> +</div> +<div class="section" id="Setting-logging-and-handling-the-output"> +<h2>Setting logging and handling the output<a class="headerlink" href="#Setting-logging-and-handling-the-output" title="Permalink to this headline">¶</a></h2> +<p>By default, binary_c will not output anything (except for ‘SINGLE STAR LIFETIME’). It is up to us to determine what will be printed. We can either do that by hardcoding the print statements into <code class="docutils literal notranslate"><span class="pre">binary_c</span></code> (see documentation binary_c) or we can use the custom logging functionality of binarycpython (see notebook <code class="docutils literal notranslate"><span class="pre">notebook_custom_logging.ipynb</span></code>), which is faster to set up and requires no recompilation of binary_c, but is somewhat more limited in its functionality. For our current purposes, +it works perfectly well.</p> +<p>After configuring what will be printed, we need to make a function to parse the output. This can be done by setting the parse_function parameter in the population object (see also notebook <code class="docutils literal notranslate"><span class="pre">notebook_individual_systems.ipynb</span></code>).</p> +<p>In the code below we will set up both the custom logging and a parse function to handle that output.</p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[7]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># Create custom logging statement</span> +<span class="c1">#</span> +<span class="c1"># we check that the model number is zero, i.e. we're on the first timestep (stars are born on the ZAMS)</span> +<span class="c1"># we make sure that the stellar type is <= MAIN_SEQUENCE, i.e. the star is a main-sequence star</span> +<span class="c1"># we also check that the time is 0.0 (this is not strictly required, but good to show how it is done)</span> +<span class="c1">#</span> +<span class="c1"># The</span> +<span class="c1">#</span> +<span class="c1"># The Printf statement does the outputting: note that the header string is ZERO_AGE_MAIN_SEQUENCE_STARn</span> +<span class="c1">#</span> +<span class="c1"># where:</span> +<span class="c1">#</span> +<span class="c1"># n = PRIMARY = 0 is star 0 (primary star)</span> +<span class="c1"># n = SECONDARY = 1 is star 1 (secondary star)</span> +<span class="c1"># n = UNRESOLVED = 2 is the unresolved system (both stars added)</span> + +<span class="n">PRIMARY</span> <span class="o">=</span> <span class="mi">0</span> +<span class="n">SECONDARY</span> <span class="o">=</span> <span class="mi">1</span> +<span class="n">UNRESOLVED</span> <span class="o">=</span> <span class="mi">2</span> + +<span class="n">custom_logging_statement</span> <span class="o">=</span> <span class="s2">"""</span> +<span class="s2">// select ZAMS</span> +<span class="s2">if(stardata->model.model_number == 0 &&</span> +<span class="s2"> stardata->model.time == 0)</span> +<span class="s2">{</span> +<span class="s2"> // loop over the stars individually (equivalent to a resolved binary)</span> +<span class="s2"> Foreach_star(star)</span> +<span class="s2"> {</span> +<span class="s2"> // select main-sequence stars</span> +<span class="s2"> if(star->stellar_type <= MAIN_SEQUENCE)</span> +<span class="s2"> {</span> +<span class="s2"> /* Note that we use Printf - with a capital P! */</span> +<span class="s2"> Printf("ZERO_AGE_MAIN_SEQUENCE_STAR</span><span class="si">%d</span><span class="s2"> </span><span class="si">%30.12e</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="se">\\</span><span class="s2">n",</span> +<span class="s2"> star->starnum,</span> +<span class="s2"> stardata->model.time, // 1</span> +<span class="s2"> stardata->common.zero_age.mass[0], // 2</span> +<span class="s2"> star->mass, // 3</span> +<span class="s2"> star->luminosity, // 4</span> +<span class="s2"> stardata->model.probability // 5</span> +<span class="s2"> );</span> +<span class="s2"> }</span> +<span class="s2"> }</span> + +<span class="s2"> // unresolved MS-MS binary</span> +<span class="s2"> if(stardata->star[0].stellar_type <= MAIN_SEQUENCE &&</span> +<span class="s2"> stardata->star[1].stellar_type <= MAIN_SEQUENCE)</span> +<span class="s2"> {</span> +<span class="s2"> Printf("ZERO_AGE_MAIN_SEQUENCE_STAR</span><span class="si">%d</span><span class="s2"> </span><span class="si">%30.12e</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="se">\\</span><span class="s2">n",</span> +<span class="s2"> 2,</span> +<span class="s2"> stardata->model.time, // 1</span> +<span class="s2"> stardata->common.zero_age.mass[0] + stardata->common.zero_age.mass[1], // 2</span> +<span class="s2"> stardata->star[0].mass + stardata->star[1].mass, // 3</span> +<span class="s2"> stardata->star[0].luminosity + stardata->star[1].luminosity, // 4</span> +<span class="s2"> stardata->model.probability // 5</span> +<span class="s2"> );</span> +<span class="s2"> }</span> +<span class="s2">}</span> +<span class="s2">"""</span> + +<span class="n">population</span><span class="o">.</span><span class="n">set</span><span class="p">(</span> + <span class="n">C_logging_code</span><span class="o">=</span><span class="n">custom_logging_statement</span> +<span class="p">)</span> + +</pre></div> +</div> +</div> +<p>The parse function must now catch lines that start with “ZERO_AGE_MAIN_SEQUENCE_STAR†and process the associated data.</p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[8]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># import the bin_data function so we can construct finite-resolution probability distributions</span> +<span class="c1"># import the datalinedict to make a dictionary from each line of data from binary_c</span> +<span class="kn">from</span> <span class="nn">binarycpython.utils.functions</span> <span class="kn">import</span> <span class="n">bin_data</span><span class="p">,</span><span class="n">datalinedict</span> +<span class="kn">import</span> <span class="nn">re</span> + +<span class="k">def</span> <span class="nf">parse_function</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output</span><span class="p">):</span> + <span class="sd">"""</span> +<span class="sd"> Example parse function</span> +<span class="sd"> """</span> + + <span class="c1"># list of the data items</span> + <span class="n">parameters</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"header"</span><span class="p">,</span> <span class="s2">"time"</span><span class="p">,</span> <span class="s2">"zams_mass"</span><span class="p">,</span> <span class="s2">"mass"</span><span class="p">,</span> <span class="s2">"luminosity"</span><span class="p">,</span> <span class="s2">"probability"</span><span class="p">]</span> + + <span class="c1"># Loop over the output.</span> + <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">output</span><span class="o">.</span><span class="n">splitlines</span><span class="p">():</span> + + <span class="c1"># check if we match a ZERO_AGE_MAIN_SEQUENCE_STAR</span> + <span class="n">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s1">'ZERO_AGE_MAIN_SEQUENCE_STAR(\d)'</span><span class="p">,</span><span class="n">line</span><span class="p">)</span> + <span class="k">if</span> <span class="n">match</span><span class="p">:</span> + <span class="n">nstar</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + <span class="c1">#print("matched star",nstar)</span> + + <span class="c1"># obtain the line of data in dictionary form</span> + <span class="n">linedata</span> <span class="o">=</span> <span class="n">datalinedict</span><span class="p">(</span><span class="n">line</span><span class="p">,</span><span class="n">parameters</span><span class="p">)</span> + + <span class="c1"># bin the log10(luminosity) to the nearest 0.1dex</span> + <span class="n">binned_log_luminosity</span> <span class="o">=</span> <span class="n">bin_data</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">log10</span><span class="p">(</span><span class="n">linedata</span><span class="p">[</span><span class="s1">'luminosity'</span><span class="p">]),</span> + <span class="n">binwidth</span><span class="p">[</span><span class="s1">'luminosity'</span><span class="p">])</span> + + <span class="c1"># append the data to the results_dictionary</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_results</span><span class="p">[</span><span class="s1">'luminosity distribution'</span><span class="p">][</span><span class="nb">int</span><span class="p">(</span><span class="n">nstar</span><span class="p">)][</span><span class="n">binned_log_luminosity</span><span class="p">]</span> <span class="o">+=</span> <span class="n">linedata</span><span class="p">[</span><span class="s1">'probability'</span><span class="p">]</span> + + <span class="c1">#print (self.grid_results)</span> + + <span class="c1"># verbose reporting</span> + <span class="c1">#print("parse out results_dictionary=",self.grid_results)</span> + +<span class="c1"># Add the parsing function</span> +<span class="n">population</span><span class="o">.</span><span class="n">set</span><span class="p">(</span> + <span class="n">parse_function</span><span class="o">=</span><span class="n">parse_function</span><span class="p">,</span> +<span class="p">)</span> +</pre></div> +</div> +</div> +</div> +<div class="section" id="Evolving-the-grid"> +<h2>Evolving the grid<a class="headerlink" href="#Evolving-the-grid" title="Permalink to this headline">¶</a></h2> +<p>Now that we configured all the main parts of the population object, we can actually run the population! Doing this is straightforward: <code class="docutils literal notranslate"><span class="pre">population.evolve()</span></code></p> +<p>This will start up the processing of all the systems. We can control how many cores are used by settings <code class="docutils literal notranslate"><span class="pre">amt_cores</span></code>. By setting the <code class="docutils literal notranslate"><span class="pre">verbosity</span></code> of the population object to a higher value we can get a lot of verbose information about the run, but for now we will set it to 0.</p> +<p>There are many grid_options that can lead to different behaviour of the evolution of the grid. Please do have a look at those: <a class="reference external" href="https://ri0005.pages.surrey.ac.uk/binary_c-python/grid_options_descriptions.html">grid options docs</a>, and try</p> +<div class="nbinput docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[9]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># set number of threads</span> +<span class="n">population</span><span class="o">.</span><span class="n">set</span><span class="p">(</span> + <span class="c1"># verbose output is not required</span> + <span class="n">verbosity</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> + <span class="c1"># set number of threads (i.e. number of CPU cores we use)</span> + <span class="n">amt_cores</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> + <span class="p">)</span> + +<span class="c1"># Evolve the population - this is the slow, number-crunching step</span> +<span class="nb">print</span><span class="p">(</span><span class="s2">"Running the population now, this may take a little while..."</span><span class="p">)</span> +<span class="n">analytics</span> <span class="o">=</span> <span class="n">population</span><span class="o">.</span><span class="n">evolve</span><span class="p">()</span> +<span class="nb">print</span><span class="p">(</span><span class="s2">"Done population run!"</span><span class="p">)</span> + +<span class="c1"># Show the results (debugging)</span> +<span class="c1"># print (population.grid_results)</span> +</pre></div> +</div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +adding: amt_cores=4 to grid_options +Running the population now, this may take a little while... +Creating and loading custom logging functionality +Generating grid code +Generating grid code +Constructing/adding: lnm1 +Constructing/adding: q +Constructing/adding: log10per +Saving grid code to grid_options +Writing grid code to /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py +Loading grid code function from /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py +Grid code loaded +Grid has handled 2000 stars +with a total probability of 0.6495098935846658 +Total starcount for this run will be: 2000 +</pre></div></div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area stderr docutils container"> +<div class="highlight"><pre> +[2021-09-10 15:14:08,077 DEBUG Process-2] --- Setting up processor: process-0[2021-09-10 15:14:08,080 DEBUG Process-3] --- Setting up processor: process-1[2021-09-10 15:14:08,086 DEBUG MainProcess] --- setting up the system_queue_filler now + +[2021-09-10 15:14:08,084 DEBUG Process-4] --- Setting up processor: process-2 + +[2021-09-10 15:14:08,117 DEBUG Process-5] --- Setting up processor: process-3 +</pre></div></div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +Process 1 started at 2021-09-10T15:14:08.119437. Using store memaddr <capsule object "STORE" at 0x7f351ff53810>Process 0 started at 2021-09-10T15:14:08.126435. Using store memaddr <capsule object "STORE" at 0x7f351ff539f0> +Process 2 started at 2021-09-10T15:14:08.138353. Using store memaddr <capsule object "STORE" at 0x7f351ff539f0> +</pre></div></div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area stderr docutils container"> +<div class="highlight"><pre> + +</pre></div></div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> + + +Process 3 started at 2021-09-10T15:14:08.186492. Using store memaddr <capsule object "STORE" at 0x7f351ff53810> +Generating grid code +Generating grid code +Constructing/adding: lnm1 +Constructing/adding: q +Constructing/adding: log10per +Saving grid code to grid_options +Writing grid code to /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py +Loading grid code function from /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py +Grid code loaded +624/2000 31.2% complete 15:14:12 ETA= 11.1s tpr=8.05e-03 ETF=15:14:23 mem:800.5MB625/2000 31.2% complete 15:14:12 ETA= 11.1s tpr=8.04e-03 ETF=15:14:23 mem:800.5MB +626/2000 31.3% complete 15:14:12 ETA= 11.1s tpr=8.05e-03 ETF=15:14:23 mem:800.5MB + +713/2000 35.6% complete 15:14:17 ETA= 1.3m tpr=6.00e-02 ETF=15:15:34 mem:547.8MB +728/2000 36.4% complete 15:14:22 ETA= 7.1m tpr=3.37e-01 ETF=15:21:30 mem:548.1MB +743/2000 37.1% complete 15:14:27 ETA= 7.0m tpr=3.34e-01 ETF=15:21:26 mem:549.5MB +759/2000 38.0% complete 15:14:33 ETA= 7.7m tpr=3.73e-01 ETF=15:22:16 mem:550.5MB +774/2000 38.7% complete 15:14:38 ETA= 6.9m tpr=3.35e-01 ETF=15:21:29 mem:551.1MB +787/2000 39.4% complete 15:14:43 ETA= 7.8m tpr=3.88e-01 ETF=15:22:33 mem:551.1MB +799/2000 40.0% complete 15:14:48 ETA= 8.5m tpr=4.24e-01 ETF=15:23:17 mem:552.5MB +812/2000 40.6% complete 15:14:54 ETA= 8.4m tpr=4.23e-01 ETF=15:23:16 mem:554.8MB +830/2000 41.5% complete 15:14:59 ETA= 5.5m tpr=2.80e-01 ETF=15:20:26 mem:555.2MB +847/2000 42.4% complete 15:15:05 ETA= 6.8m tpr=3.52e-01 ETF=15:21:50 mem:555.2MB +864/2000 43.2% complete 15:15:10 ETA= 6.2m tpr=3.28e-01 ETF=15:21:23 mem:557.0MB +876/2000 43.8% complete 15:15:15 ETA= 8.2m tpr=4.38e-01 ETF=15:23:27 mem:559.7MB +887/2000 44.4% complete 15:15:21 ETA= 9.2m tpr=4.95e-01 ETF=15:24:32 mem:560.5MB +898/2000 44.9% complete 15:15:26 ETA= 9.2m tpr=4.99e-01 ETF=15:24:37 mem:560.5MB +908/2000 45.4% complete 15:15:32 ETA= 9.5m tpr=5.23e-01 ETF=15:25:03 mem:560.5MB +919/2000 46.0% complete 15:15:37 ETA= 8.3m tpr=4.60e-01 ETF=15:23:54 mem:560.9MB +934/2000 46.7% complete 15:15:42 ETA= 6.4m tpr=3.60e-01 ETF=15:22:06 mem:561.7MB +947/2000 47.4% complete 15:15:47 ETA= 7.2m tpr=4.08e-01 ETF=15:22:57 mem:561.7MB +956/2000 47.8% complete 15:15:53 ETA= 11.1m tpr=6.39e-01 ETF=15:27:01 mem:561.7MB +963/2000 48.1% complete 15:15:58 ETA= 12.6m tpr=7.30e-01 ETF=15:28:35 mem:561.7MB +969/2000 48.5% complete 15:16:04 ETA= 15.2m tpr=8.85e-01 ETF=15:31:16 mem:561.9MB +979/2000 49.0% complete 15:16:11 ETA= 11.9m tpr=7.01e-01 ETF=15:28:06 mem:562.0MB +988/2000 49.4% complete 15:16:16 ETA= 9.7m tpr=5.76e-01 ETF=15:25:59 mem:562.0MB +995/2000 49.8% complete 15:16:21 ETA= 12.3m tpr=7.37e-01 ETF=15:28:42 mem:562.2MB +</pre></div></div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area stderr docutils container"> +<div class="highlight"><pre> +[2021-09-10 15:16:25,175 DEBUG MainProcess] --- Signaling stop to processes +</pre></div></div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +1003/2000 50.1% complete 15:16:26 ETA= 11.2m tpr=6.76e-01 ETF=15:27:40 mem:563.0MB +1015/2000 50.8% complete 15:16:32 ETA= 7.6m tpr=4.65e-01 ETF=15:24:10 mem:563.0MB +1025/2000 51.2% complete 15:16:37 ETA= 8.1m tpr=5.01e-01 ETF=15:24:45 mem:563.0MB +1033/2000 51.6% complete 15:16:42 ETA= 10.7m tpr=6.65e-01 ETF=15:27:26 mem:563.0MB +1040/2000 52.0% complete 15:16:47 ETA= 12.1m tpr=7.55e-01 ETF=15:28:52 mem:563.5MB +1048/2000 52.4% complete 15:16:53 ETA= 11.8m tpr=7.45e-01 ETF=15:28:42 mem:563.5MB +1057/2000 52.9% complete 15:16:59 ETA= 9.1m tpr=5.78e-01 ETF=15:26:03 mem:563.6MB +1062/2000 53.1% complete 15:17:04 ETA= 15.7m tpr=1.01e+00 ETF=15:32:47 mem:564.4MB +1069/2000 53.5% complete 15:17:09 ETA= 12.4m tpr=7.97e-01 ETF=15:29:31 mem:564.9MB +1077/2000 53.9% complete 15:17:15 ETA= 11.5m tpr=7.46e-01 ETF=15:28:44 mem:565.0MB +1085/2000 54.2% complete 15:17:20 ETA= 10.0m tpr=6.55e-01 ETF=15:27:20 mem:565.0MB +1091/2000 54.5% complete 15:17:26 ETA= 13.8m tpr=9.10e-01 ETF=15:31:13 mem:565.9MB +1099/2000 55.0% complete 15:17:32 ETA= 12.1m tpr=8.05e-01 ETF=15:29:37 mem:566.5MB +1114/2000 55.7% complete 15:17:37 ETA= 5.0m tpr=3.35e-01 ETF=15:22:34 mem:566.5MB +1126/2000 56.3% complete 15:17:43 ETA= 6.8m tpr=4.64e-01 ETF=15:24:29 mem:566.5MB +1134/2000 56.7% complete 15:17:48 ETA= 9.2m tpr=6.37e-01 ETF=15:27:00 mem:566.6MB +1139/2000 57.0% complete 15:17:54 ETA= 16.3m tpr=1.14e+00 ETF=15:34:13 mem:567.4MB +1148/2000 57.4% complete 15:17:59 ETA= 8.8m tpr=6.20e-01 ETF=15:26:47 mem:567.4MB +1156/2000 57.8% complete 15:18:05 ETA= 9.3m tpr=6.60e-01 ETF=15:27:22 mem:567.5MB +1162/2000 58.1% complete 15:18:11 ETA= 14.3m tpr=1.02e+00 ETF=15:32:28 mem:567.6MB +1168/2000 58.4% complete 15:18:17 ETA= 15.2m tpr=1.09e+00 ETF=15:33:27 mem:568.6MB +1177/2000 58.9% complete 15:18:23 ETA= 8.8m tpr=6.45e-01 ETF=15:27:14 mem:568.6MB +1181/2000 59.0% complete 15:18:28 ETA= 17.8m tpr=1.30e+00 ETF=15:36:16 mem:568.7MB +1187/2000 59.4% complete 15:18:34 ETA= 12.1m tpr=8.93e-01 ETF=15:30:40 mem:568.7MB +1194/2000 59.7% complete 15:18:39 ETA= 9.8m tpr=7.29e-01 ETF=15:28:26 mem:568.8MB +1202/2000 60.1% complete 15:18:44 ETA= 9.5m tpr=7.12e-01 ETF=15:28:12 mem:568.8MB +1219/2000 61.0% complete 15:18:51 ETA= 5.3m tpr=4.07e-01 ETF=15:24:09 mem:569.7MB +1228/2000 61.4% complete 15:18:57 ETA= 7.4m tpr=5.76e-01 ETF=15:26:21 mem:569.7MB +1234/2000 61.7% complete 15:19:02 ETA= 11.8m tpr=9.22e-01 ETF=15:30:48 mem:571.7MB1235/2000 61.8% complete 15:19:02 ETA= 10.1m tpr=7.92e-01 ETF=15:29:08 mem:571.7MB + +1243/2000 62.1% complete 15:19:07 ETA= 7.3m tpr=5.79e-01 ETF=15:26:26 mem:573.4MB +1251/2000 62.5% complete 15:19:13 ETA= 8.3m tpr=6.68e-01 ETF=15:27:33 mem:575.4MB +1260/2000 63.0% complete 15:19:19 ETA= 8.2m tpr=6.65e-01 ETF=15:27:31 mem:575.4MB +1268/2000 63.4% complete 15:19:24 ETA= 7.8m tpr=6.41e-01 ETF=15:27:13 mem:576.8MB +1276/2000 63.8% complete 15:19:29 ETA= 7.6m tpr=6.30e-01 ETF=15:27:05 mem:577.0MB +1282/2000 64.1% complete 15:19:34 ETA= 10.1m tpr=8.44e-01 ETF=15:29:40 mem:578.0MB +1289/2000 64.5% complete 15:19:40 ETA= 10.8m tpr=9.08e-01 ETF=15:30:26 mem:578.0MB +1295/2000 64.8% complete 15:19:46 ETA= 10.5m tpr=8.95e-01 ETF=15:30:16 mem:578.1MB +1309/2000 65.5% complete 15:19:51 ETA= 4.3m tpr=3.70e-01 ETF=15:24:06 mem:578.1MB +1323/2000 66.2% complete 15:19:58 ETA= 6.1m tpr=5.45e-01 ETF=15:26:07 mem:579.2MB +1332/2000 66.6% complete 15:20:03 ETA= 6.2m tpr=5.58e-01 ETF=15:26:16 mem:579.3MB +1338/2000 66.9% complete 15:20:09 ETA= 10.1m tpr=9.11e-01 ETF=15:30:12 mem:579.3MB +1346/2000 67.3% complete 15:20:18 ETA= 12.5m tpr=1.14e+00 ETF=15:32:46 mem:581.5MB +1355/2000 67.8% complete 15:20:25 ETA= 8.5m tpr=7.90e-01 ETF=15:28:54 mem:581.6MB +1359/2000 68.0% complete 15:20:30 ETA= 13.9m tpr=1.30e+00 ETF=15:34:26 mem:581.6MB +1366/2000 68.3% complete 15:20:38 ETA= 11.7m tpr=1.10e+00 ETF=15:32:18 mem:581.7MB +1376/2000 68.8% complete 15:20:44 ETA= 6.1m tpr=5.89e-01 ETF=15:26:51 mem:581.7MB +1384/2000 69.2% complete 15:20:49 ETA= 6.9m tpr=6.76e-01 ETF=15:27:46 mem:581.7MB +1393/2000 69.7% complete 15:20:55 ETA= 6.2m tpr=6.13e-01 ETF=15:27:07 mem:581.8MB1394/2000 69.7% complete 15:20:55 ETA= 5.6m tpr=5.52e-01 ETF=15:26:29 mem:581.8MB + +1423/2000 71.2% complete 15:21:00 ETA= 1.6m tpr=1.69e-01 ETF=15:22:37 mem:581.9MB +1435/2000 71.8% complete 15:21:07 ETA= 5.6m tpr=5.92e-01 ETF=15:26:42 mem:582.3MB +1443/2000 72.2% complete 15:21:12 ETA= 6.1m tpr=6.54e-01 ETF=15:27:17 mem:582.5MB +1445/2000 72.2% complete 15:21:18 ETA= 28.2m tpr=3.05e+00 ETF=15:49:28 mem:582.6MB +1448/2000 72.4% complete 15:21:25 ETA= 20.0m tpr=2.18e+00 ETF=15:41:27 mem:582.6MB +1454/2000 72.7% complete 15:21:31 ETA= 8.6m tpr=9.49e-01 ETF=15:30:09 mem:583.0MB +1455/2000 72.8% complete 15:21:37 ETA= 54.9m tpr=6.05e+00 ETF=16:16:32 mem:583.0MB +1459/2000 73.0% complete 15:21:43 ETA= 13.5m tpr=1.50e+00 ETF=15:35:12 mem:583.0MB +1465/2000 73.2% complete 15:21:48 ETA= 8.6m tpr=9.65e-01 ETF=15:30:25 mem:583.0MB +1474/2000 73.7% complete 15:21:54 ETA= 5.6m tpr=6.38e-01 ETF=15:27:30 mem:583.0MB +1482/2000 74.1% complete 15:21:59 ETA= 5.4m tpr=6.30e-01 ETF=15:27:26 mem:583.0MB +1485/2000 74.2% complete 15:22:04 ETA= 14.8m tpr=1.73e+00 ETF=15:36:54 mem:583.5MB +1487/2000 74.3% complete 15:22:10 ETA= 24.9m tpr=2.91e+00 ETF=15:47:02 mem:583.5MB +1496/2000 74.8% complete 15:22:16 ETA= 5.0m tpr=5.91e-01 ETF=15:27:13 mem:583.7MB +1509/2000 75.5% complete 15:22:21 ETA= 3.6m tpr=4.40e-01 ETF=15:25:57 mem:583.9MB +1523/2000 76.2% complete 15:22:27 ETA= 3.0m tpr=3.80e-01 ETF=15:25:28 mem:583.9MB +1531/2000 76.5% complete 15:22:33 ETA= 5.9m tpr=7.60e-01 ETF=15:28:29 mem:583.9MB +1537/2000 76.8% complete 15:22:38 ETA= 6.7m tpr=8.71e-01 ETF=15:29:21 mem:583.9MB +1545/2000 77.2% complete 15:22:44 ETA= 5.4m tpr=7.14e-01 ETF=15:28:08 mem:584.0MB +1555/2000 77.8% complete 15:22:49 ETA= 4.1m tpr=5.52e-01 ETF=15:26:55 mem:584.2MB +1564/2000 78.2% complete 15:22:54 ETA= 4.2m tpr=5.78e-01 ETF=15:27:06 mem:584.2MB +1574/2000 78.7% complete 15:23:00 ETA= 4.4m tpr=6.16e-01 ETF=15:27:23 mem:584.4MB +1584/2000 79.2% complete 15:23:07 ETA= 4.4m tpr=6.28e-01 ETF=15:27:28 mem:584.8MB +1594/2000 79.7% complete 15:23:12 ETA= 3.8m tpr=5.66e-01 ETF=15:27:02 mem:584.9MB +1607/2000 80.3% complete 15:23:17 ETA= 2.5m tpr=3.86e-01 ETF=15:25:49 mem:585.0MB +1618/2000 80.9% complete 15:23:24 ETA= 3.8m tpr=5.97e-01 ETF=15:27:12 mem:585.4MB +1628/2000 81.4% complete 15:23:29 ETA= 3.3m tpr=5.28e-01 ETF=15:26:46 mem:585.5MB +1635/2000 81.8% complete 15:23:34 ETA= 4.4m tpr=7.30e-01 ETF=15:28:01 mem:585.9MB +1645/2000 82.2% complete 15:23:40 ETA= 3.4m tpr=5.81e-01 ETF=15:27:06 mem:585.9MB +1655/2000 82.8% complete 15:23:47 ETA= 4.0m tpr=7.02e-01 ETF=15:27:49 mem:586.0MB1656/2000 82.8% complete 15:23:47 ETA= 3.7m tpr=6.39e-01 ETF=15:27:27 mem:586.0MB + +1664/2000 83.2% complete 15:23:54 ETA= 4.5m tpr=8.01e-01 ETF=15:28:23 mem:586.1MB +1674/2000 83.7% complete 15:24:02 ETA= 4.5m tpr=8.27e-01 ETF=15:28:31 mem:586.2MB +1684/2000 84.2% complete 15:24:07 ETA= 2.9m tpr=5.55e-01 ETF=15:27:03 mem:586.2MB +1691/2000 84.5% complete 15:24:13 ETA= 4.2m tpr=8.21e-01 ETF=15:28:27 mem:586.5MB +1699/2000 85.0% complete 15:24:19 ETA= 3.4m tpr=6.75e-01 ETF=15:27:42 mem:586.5MB +1713/2000 85.7% complete 15:24:24 ETA= 1.9m tpr=4.07e-01 ETF=15:26:21 mem:586.6MB +1725/2000 86.2% complete 15:24:31 ETA= 2.6m tpr=5.57e-01 ETF=15:27:04 mem:586.7MB +1735/2000 86.8% complete 15:24:38 ETA= 3.0m tpr=6.76e-01 ETF=15:27:37 mem:586.7MB +1745/2000 87.2% complete 15:24:44 ETA= 2.7m tpr=6.40e-01 ETF=15:27:27 mem:586.9MB +1755/2000 87.8% complete 15:24:51 ETA= 2.8m tpr=6.88e-01 ETF=15:27:40 mem:586.9MB +1763/2000 88.2% complete 15:24:56 ETA= 2.6m tpr=6.59e-01 ETF=15:27:32 mem:586.9MB +1767/2000 88.3% complete 15:25:02 ETA= 5.3m tpr=1.36e+00 ETF=15:30:18 mem:586.9MB +1776/2000 88.8% complete 15:25:09 ETA= 2.9m tpr=7.71e-01 ETF=15:28:01 mem:586.9MB +1785/2000 89.2% complete 15:25:14 ETA= 2.1m tpr=5.90e-01 ETF=15:27:21 mem:586.9MB +1793/2000 89.7% complete 15:25:19 ETA= 2.2m tpr=6.29e-01 ETF=15:27:29 mem:587.1MB +1801/2000 90.0% complete 15:25:24 ETA= 2.2m tpr=6.59e-01 ETF=15:27:35 mem:587.1MB +1812/2000 90.6% complete 15:25:29 ETA= 1.5m tpr=4.68e-01 ETF=15:26:57 mem:587.1MB +1822/2000 91.1% complete 15:25:35 ETA= 1.6m tpr=5.54e-01 ETF=15:27:14 mem:587.4MB +1830/2000 91.5% complete 15:25:41 ETA= 2.1m tpr=7.49e-01 ETF=15:27:48 mem:587.4MB +1839/2000 92.0% complete 15:25:47 ETA= 1.7m tpr=6.21e-01 ETF=15:27:27 mem:587.4MB +1847/2000 92.3% complete 15:25:52 ETA= 1.8m tpr=7.10e-01 ETF=15:27:41 mem:587.4MB +1855/2000 92.8% complete 15:25:59 ETA= 2.0m tpr=8.17e-01 ETF=15:27:57 mem:587.6MB +1864/2000 93.2% complete 15:26:05 ETA= 1.5m tpr=6.79e-01 ETF=15:27:37 mem:587.8MB +1873/2000 93.7% complete 15:26:10 ETA= 1.3m tpr=6.07e-01 ETF=15:27:27 mem:588.0MB +1884/2000 94.2% complete 15:26:16 ETA= 57.0s tpr=4.91e-01 ETF=15:27:13 mem:588.1MB +1895/2000 94.8% complete 15:26:21 ETA= 48.7s tpr=4.63e-01 ETF=15:27:09 mem:588.8MB +1907/2000 95.3% complete 15:26:27 ETA= 45.6s tpr=4.91e-01 ETF=15:27:12 mem:588.9MB +1916/2000 95.8% complete 15:26:33 ETA= 57.5s tpr=6.84e-01 ETF=15:27:30 mem:589.1MB +1926/2000 96.3% complete 15:26:39 ETA= 46.5s tpr=6.28e-01 ETF=15:27:26 mem:589.1MB +1936/2000 96.8% complete 15:26:46 ETA= 42.0s tpr=6.57e-01 ETF=15:27:28 mem:589.1MB +1946/2000 97.3% complete 15:26:53 ETA= 40.1s tpr=7.42e-01 ETF=15:27:33 mem:589.2MB +1956/2000 97.8% complete 15:26:59 ETA= 25.1s tpr=5.70e-01 ETF=15:27:24 mem:589.2MB +1966/2000 98.3% complete 15:27:04 ETA= 19.1s tpr=5.62e-01 ETF=15:27:24 mem:589.5MB +1976/2000 98.8% complete 15:27:10 ETA= 14.4s tpr=6.01e-01 ETF=15:27:25 mem:589.5MB +1987/2000 99.3% complete 15:27:16 ETA= 6.4s tpr=4.92e-01 ETF=15:27:22 mem:589.5MB +1998/2000 99.9% complete 15:27:21 ETA= 1.0s tpr=4.85e-01 ETF=15:27:22 mem:589.6MB +</pre></div></div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area stderr docutils container"> +<div class="highlight"><pre> +[2021-09-10 15:27:22,382 DEBUG Process-5] --- Process-3 is finishing. +</pre></div></div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +Process 3 finished: + generator started at 2021-09-10T15:14:08.117391, done at 2021-09-10T15:27:22.400722 (total: 794.283331s of which 792.6935975551605s interfacing with binary_c). + Ran 499 systems with a total probability of 0.17005450973840136. + This thread had 0 failing systems with a total probability of 0. + Skipped a total of 0 systems because they had 0 probability +</pre></div></div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area stderr docutils container"> +<div class="highlight"><pre> +[2021-09-10 15:27:22,435 DEBUG Process-5] --- Process-3 is finished. +[2021-09-10 15:27:22,480 DEBUG Process-3] --- Process-1 is finishing. +</pre></div></div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +Process 1 finished: + generator started at 2021-09-10T15:14:08.080367, done at 2021-09-10T15:27:22.505288 (total: 794.424921s of which 793.1943278312683s interfacing with binary_c). + Ran 474 systems with a total probability of 0.15740832333567983. + This thread had 0 failing systems with a total probability of 0. + Skipped a total of 0 systems because they had 0 probability +</pre></div></div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area stderr docutils container"> +<div class="highlight"><pre> +[2021-09-10 15:27:22,531 DEBUG Process-3] --- Process-1 is finished. +[2021-09-10 15:27:22,846 DEBUG Process-2] --- Process-0 is finishing. +</pre></div></div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +Process 0 finished: + generator started at 2021-09-10T15:14:08.077117, done at 2021-09-10T15:27:22.851971 (total: 794.774854s of which 793.4976091384888s interfacing with binary_c). + Ran 507 systems with a total probability of 0.16018641159091498. + This thread had 0 failing systems with a total probability of 0. + Skipped a total of 0 systems because they had 0 probability +</pre></div></div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area stderr docutils container"> +<div class="highlight"><pre> +[2021-09-10 15:27:22,872 DEBUG Process-2] --- Process-0 is finished. +[2021-09-10 15:27:22,976 DEBUG Process-4] --- Process-2 is finishing. +</pre></div></div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +Process 2 finished: + generator started at 2021-09-10T15:14:08.084369, done at 2021-09-10T15:27:22.981706 (total: 794.897337s of which 793.4600214958191s interfacing with binary_c). + Ran 520 systems with a total probability of 0.1618606489196724. + This thread had 0 failing systems with a total probability of 0. + Skipped a total of 0 systems because they had 0 probability +</pre></div></div> +</div> +<div class="nboutput docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area stderr docutils container"> +<div class="highlight"><pre> +[2021-09-10 15:27:22,986 DEBUG Process-4] --- Process-2 is finished. +</pre></div></div> +</div> +<div class="nboutput nblast docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +Population-0fa295ee5c76444bace8fd0ee17a3e11 finished! The total probability was: 0.6495098935846686. It took a total of 795.1383104324341s to run 2000 systems on 4 cores +There were no errors found in this run. +Done population run! +</pre></div></div> +</div> +<p>After the run is complete, some technical report on the run is returned. I stored that in <code class="docutils literal notranslate"><span class="pre">analytics</span></code>. As we can see below, this dictionary is like a status report of the evolution. Useful for e.g. debugging.</p> +<div class="nbinput docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[12]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="nb">print</span><span class="p">(</span><span class="n">analytics</span><span class="p">)</span> +</pre></div> +</div> +</div> +<div class="nboutput nblast docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +{'population_name': '0fa295ee5c76444bace8fd0ee17a3e11', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 0.6495098935846686, 'total_count': 2000, 'start_timestamp': 1631283248.057525, 'end_timestamp': 1631284043.1958354, 'total_mass_run': 41112.220964392276, 'total_probability_weighted_mass_run': 0.6452116023479681, 'zero_prob_stars_skipped': 0} +</pre></div></div> +</div> +<div class="nbinput docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[13]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># make a plot of the luminosity distribution using Seaborn and Pandas</span> +<span class="kn">import</span> <span class="nn">seaborn</span> <span class="k">as</span> <span class="nn">sns</span> +<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> +<span class="kn">from</span> <span class="nn">binarycpython.utils.functions</span> <span class="kn">import</span> <span class="n">pad_output_distribution</span> + +<span class="c1"># set the figure size (for a Jupyter notebook in a web browser)</span> +<span class="n">sns</span><span class="o">.</span><span class="n">set</span><span class="p">(</span> <span class="n">rc</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'figure.figsize'</span><span class="p">:(</span><span class="mi">20</span><span class="p">,</span><span class="mi">10</span><span class="p">)}</span> <span class="p">)</span> + +<span class="n">titles</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span> <span class="p">:</span> <span class="s2">"Primary"</span><span class="p">,</span> + <span class="mi">1</span> <span class="p">:</span> <span class="s2">"Secondary"</span><span class="p">,</span> + <span class="mi">2</span> <span class="p">:</span> <span class="s2">"Unresolved"</span> <span class="p">}</span> + +<span class="c1"># choose to plot the</span> +<span class="c1"># PRIMARY, SECONDARY or UNRESOLVED</span> +<span class="n">nstar</span> <span class="o">=</span> <span class="n">UNRESOLVED</span> + +<span class="n">plots</span> <span class="o">=</span> <span class="p">{}</span> + +<span class="c1"># pad the distribution with zeros where data is missing</span> +<span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">3</span><span class="p">):</span> + <span class="n">pad_output_distribution</span><span class="p">(</span><span class="n">population</span><span class="o">.</span><span class="n">grid_results</span><span class="p">[</span><span class="s1">'luminosity distribution'</span><span class="p">][</span><span class="n">n</span><span class="p">],</span> + <span class="n">binwidth</span><span class="p">[</span><span class="s1">'luminosity'</span><span class="p">])</span> + <span class="n">plots</span><span class="p">[</span><span class="n">titles</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">+</span> <span class="s1">' ZAMS luminosity distribution'</span><span class="p">]</span> <span class="o">=</span> <span class="n">population</span><span class="o">.</span><span class="n">grid_results</span><span class="p">[</span><span class="s1">'luminosity distribution'</span><span class="p">][</span><span class="n">n</span><span class="p">]</span> + +<span class="c1"># make pandas dataframe from our sorted dictionary of data</span> +<span class="n">plot_data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">plots</span><span class="p">)</span> + +<span class="c1"># make the plot</span> +<span class="n">p</span> <span class="o">=</span> <span class="n">sns</span><span class="o">.</span><span class="n">lineplot</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">plot_data</span><span class="p">)</span> +<span class="n">p</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s2">"$\log_</span><span class="si">{10}</span><span class="s2">$ ($L_\mathrm</span><span class="si">{ZAMS}</span><span class="s2">$ / L$_{☉}$)"</span><span class="p">)</span> +<span class="n">p</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s2">"Number of stars"</span><span class="p">)</span> +<span class="n">p</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">yscale</span><span class="o">=</span><span class="s2">"log"</span><span class="p">)</span> +</pre></div> +</div> +</div> +<div class="nboutput docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[13]: +</pre></div> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +[None] +</pre></div></div> +</div> +<div class="nboutput nblast docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<img alt="_images/notebook_luminosity_function_binaries_20_1.png" src="_images/notebook_luminosity_function_binaries_20_1.png" /> +</div> +</div> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[ ]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span> +</pre></div> +</div> +</div> +</div> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="binary_c_parameters.html" class="btn btn-neutral float-right" title="Binary_c parameters" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="notebook_luminosity_function_single.html" class="btn btn-neutral float-left" title="Example use case: Zero-age stellar luminosity function" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + + © Copyright 2021, David Hendriks, Robert Izzard + + </p> + </div> + + + + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a + + <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> + + provided by <a href="https://readthedocs.org">Read the Docs</a>. +<br><br> +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +<br><br> +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. + + + +</footer> + + </div> + </div> + + </section> + + </div> + + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + + + + + + +</body> +</html> \ No newline at end of file diff --git a/docs/build/html/notebook_luminosity_function_binaries.ipynb b/docs/build/html/notebook_luminosity_function_binaries.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..fb64dbcc9754aa9dc823a41ae3c52223cb2a8d9a --- /dev/null +++ b/docs/build/html/notebook_luminosity_function_binaries.ipynb @@ -0,0 +1,839 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bbbaafbb-fd7d-4b73-a970-93506ba35d71", + "metadata": {}, + "source": [ + "# Zero-age stellar luminosity function in binaries\n", + "\n", + "In this notebook we compute the luminosity function of the zero-age main-sequence by running a population of binary stars using binary_c. \n", + "\n", + "Before you go through this notebook, you should look at notebook_luminosity_function.ipynb which is for the - conceptually more simple - single stars.\n", + "\n", + "We start by loading in some standard Python modules and the binary_c module.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bf6b8673-a2b5-4b50-ad1b-e90671f57470", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import math\n", + "from binarycpython.utils.grid import Population\n", + "\n", + "# help(Population) # Uncomment this line to see the public functions of this object" + ] + }, + { + "cell_type": "markdown", + "id": "f268eff3-4e08-4f6b-8b59-f22dba4d2074", + "metadata": {}, + "source": [ + "## Setting up the Population object\n", + "To set up and configure the population object we need to make a new instance of the `Population` object and configure it with the `.set()` function.\n", + "\n", + "In our case, we only need to set the maximum evolution time to something short, because we care only about zero-age main sequence stars which have, by definition, age zero." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "79ab50b7-591f-4883-af09-116d1835a751", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "adding: max_evolution_time=0.1 to BSE_options\n", + "verbosity is 1\n" + ] + } + ], + "source": [ + "# Create population object\n", + "population = Population()\n", + "\n", + "# If you want verbosity, set this before other things\n", + "population.set(verbosity=1)\n", + "\n", + "# Setting values can be done via .set(<parameter_name>=<value>)\n", + "# Values that are known to be binary_c_parameters are loaded into bse_options.\n", + "# Those that are present in the default grid_options are set in grid_options\n", + "# All other values that you set are put in a custom_options dict\n", + "population.set(\n", + " # binary_c physics options\n", + " max_evolution_time=0.1, # maximum stellar evolution time in Myr\n", + " )\n", + "\n", + "# We can access the options through \n", + "print(\"verbosity is\", population.grid_options['verbosity'])" + ] + }, + { + "cell_type": "markdown", + "id": "f9a65554-36ab-4a04-96ca-9f1422c307fd", + "metadata": {}, + "source": [ + "## Adding grid variables\n", + "The main purpose of the Population object is to handle the population synthesis side of running a set of stars. The main method to do this with binarycpython, as is the case with Perl binarygrid, is to use grid variables. These are loops over a predefined range of values, where a probability will be assigned to the systems based on the chosen probability distributions.\n", + "\n", + "Usually we use either 1 mass grid variable, or a trio of mass, mass ratio and period (other notebooks cover these examples). We can, however, also add grid sampling for e.g. eccentricity, metallicity or other parameters. \n", + "\n", + "To add a grid variable to the population object we use `population.add_grid_variable`" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "68c84521-9ae8-4020-af7a-5334173db969", + "metadata": {}, + "outputs": [], + "source": [ + "# help(population.add_grid_variable)" + ] + }, + { + "cell_type": "markdown", + "id": "bd75cebe-2152-4025-b680-dc020b80889b", + "metadata": {}, + "source": [ + "All the distribution functions that we can use are stored in the `binarycpython.utils.distribution_functions` or `binarycpython/utils/distribution_functions.py` on git. If you uncomment the help statement below you can see which functions are available now:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "048db541-3e92-4c5d-a25c-9c5a34b9c857", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "import binarycpython.utils.distribution_functions\n", + "# help(binarycpython.utils.distribution_functions)" + ] + }, + { + "cell_type": "markdown", + "id": "2a9104fc-4136-4e53-8604-f24ad52fbe56", + "metadata": {}, + "source": [ + "First let us set up some global variables that will be useful throughout. \n", + "* The resolution is the number of stars we simulate in our model population.\n", + "* The massrange is a list of the min and max masses\n", + "* The total_probability is the theoretical integral of a probability density function, i.e. 1.0.\n", + "* The binwidth sets the resolution of the final distribution. If set to 0.5, the bins in log*L* are 0.5dex wide." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "aba3fe4e-18f2-4bb9-8e5c-4c6007ab038b", + "metadata": {}, + "outputs": [], + "source": [ + "# Set resolution and mass range that we simulate\n", + "resolution = {\"M_1\": 40} # start with resolution = 10, and increase later if you want \"more accurate\" data\n", + "massrange = (0.07, 100.0) # we work with stars of mass 0.07 to 100 Msun\n", + "total_probability = 1.0 # theoretical integral of the mass probability density function over all masses \n", + "# distribution binwidths : \n", + "# (log10) luminosity distribution\n", + "binwidth = { 'luminosity' : 1.0 }" + ] + }, + { + "cell_type": "markdown", + "id": "1b3a007b-5c17-42a7-a981-7e268e6f545c", + "metadata": {}, + "source": [ + "The next cell contains an example of adding the mass grid variable, sampling the phase space in linear mass *M*_1." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "47979841-2c26-4b26-8945-603d013dc93a", + "metadata": {}, + "outputs": [], + "source": [ + "# Set up the binary grid in \"cubic\" M1 - M2=q*M1 - log10 period space\n", + "\n", + "population = Population()\n", + "\n", + "# resolution on each side of the cube, with more stars for the primary mass\n", + "nres = 10\n", + "resolution = {\"M_1\": 2*nres,\n", + " \"q\": nres,\n", + " \"per\": nres}\n", + "\n", + "massrange = [0.07,100]\n", + "logperrange = [0.15, 5.5]\n", + "\n", + "population.add_grid_variable(\n", + " name=\"lnm1\",\n", + " longname=\"Primary mass\",\n", + " valuerange=massrange,\n", + " resolution=\"{}\".format(resolution[\"M_1\"]),\n", + " spacingfunc=\"const(math.log({min}), math.log({max}), {res})\".format(min=massrange[0],max=massrange[1],res=resolution[\"M_1\"]),\n", + " precode=\"M_1=math.exp(lnm1)\",\n", + " probdist=\"three_part_powerlaw(M_1, 0.1, 0.5, 1.0, 150, -1.3, -2.3, -2.3)*M_1\",\n", + " dphasevol=\"dlnm1\",\n", + " parameter_name=\"M_1\",\n", + " condition=\"\", # Impose a condition on this grid variable. Mostly for a check for yourself\n", + ")\n", + "\n", + "# Mass ratio\n", + "population.add_grid_variable(\n", + " name=\"q\",\n", + " longname=\"Mass ratio\",\n", + " valuerange=[\"0.1/M_1\", 1],\n", + " resolution=\"{}\".format(resolution['q']),\n", + " spacingfunc=\"const({}/M_1, 1, {})\".format(massrange[0],resolution['q']),\n", + " probdist=\"flatsections(q, [{{'min': {}/M_1, 'max': 1.0, 'height': 1}}])\".format(massrange[0]),\n", + " dphasevol=\"dq\",\n", + " precode=\"M_2 = q * M_1\",\n", + " parameter_name=\"M_2\",\n", + " condition=\"\", # Impose a condition on this grid variable. Mostly for a check for yourself\n", + " )\n", + "\n", + "# Orbital period\n", + "population.add_grid_variable(\n", + " name=\"log10per\", # in days\n", + " longname=\"log10(Orbital_Period)\",\n", + " valuerange=[0.15, 5.5],\n", + " resolution=\"{}\".format(resolution[\"per\"]),\n", + " spacingfunc=\"const({}, {}, {})\".format(logperrange[0],logperrange[1],resolution[\"per\"]),\n", + " precode=\"\"\"orbital_period = 10.0 ** log10per\n", + "sep = calc_sep_from_period(M_1, M_2, orbital_period)\n", + "sep_min = calc_sep_from_period(M_1, M_2, 10**{})\n", + "sep_max = calc_sep_from_period(M_1, M_2, 10**{})\"\"\".format(logperrange[0],logperrange[1]),\n", + " probdist=\"sana12(M_1, M_2, sep, orbital_period, sep_min, sep_max, math.log10(10**{}), math.log10(10**{}), {})\".format(logperrange[0],logperrange[1],-0.55),\n", + " parameter_name=\"orbital_period\",\n", + " dphasevol=\"dlog10per\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "163f13ae-fec1-4ee8-b9d4-c1b75c19ff39", + "metadata": {}, + "source": [ + "## Setting logging and handling the output\n", + "By default, binary_c will not output anything (except for 'SINGLE STAR LIFETIME'). It is up to us to determine what will be printed. We can either do that by hardcoding the print statements into `binary_c` (see documentation binary_c) or we can use the custom logging functionality of binarycpython (see notebook `notebook_custom_logging.ipynb`), which is faster to set up and requires no recompilation of binary_c, but is somewhat more limited in its functionality. For our current purposes, it works perfectly well.\n", + "\n", + "After configuring what will be printed, we need to make a function to parse the output. This can be done by setting the parse_function parameter in the population object (see also notebook `notebook_individual_systems.ipynb`). \n", + "\n", + "In the code below we will set up both the custom logging and a parse function to handle that output." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0c986215-93b1-4e30-ad79-f7c397e9ff7d", + "metadata": {}, + "outputs": [], + "source": [ + "# Create custom logging statement\n", + "#\n", + "# we check that the model number is zero, i.e. we're on the first timestep (stars are born on the ZAMS)\n", + "# we make sure that the stellar type is <= MAIN_SEQUENCE, i.e. the star is a main-sequence star\n", + "# we also check that the time is 0.0 (this is not strictly required, but good to show how it is done)\n", + "#\n", + "# The \n", + "#\n", + "# The Printf statement does the outputting: note that the header string is ZERO_AGE_MAIN_SEQUENCE_STARn\n", + "#\n", + "# where:\n", + "#\n", + "# n = PRIMARY = 0 is star 0 (primary star)\n", + "# n = SECONDARY = 1 is star 1 (secondary star)\n", + "# n = UNRESOLVED = 2 is the unresolved system (both stars added)\n", + "\n", + "PRIMARY = 0\n", + "SECONDARY = 1\n", + "UNRESOLVED = 2\n", + "\n", + "custom_logging_statement = \"\"\"\n", + "// select ZAMS\n", + "if(stardata->model.model_number == 0 &&\n", + " stardata->model.time == 0)\n", + "{\n", + " // loop over the stars individually (equivalent to a resolved binary) \n", + " Foreach_star(star)\n", + " {\n", + " // select main-sequence stars\n", + " if(star->stellar_type <= MAIN_SEQUENCE)\n", + " {\n", + " /* Note that we use Printf - with a capital P! */\n", + " Printf(\"ZERO_AGE_MAIN_SEQUENCE_STAR%d %30.12e %g %g %g %g\\\\n\",\n", + " star->starnum,\n", + " stardata->model.time, // 1\n", + " stardata->common.zero_age.mass[0], // 2\n", + " star->mass, // 3\n", + " star->luminosity, // 4\n", + " stardata->model.probability // 5\n", + " );\n", + " }\n", + " }\n", + " \n", + " // unresolved MS-MS binary\n", + " if(stardata->star[0].stellar_type <= MAIN_SEQUENCE &&\n", + " stardata->star[1].stellar_type <= MAIN_SEQUENCE) \n", + " {\n", + " Printf(\"ZERO_AGE_MAIN_SEQUENCE_STAR%d %30.12e %g %g %g %g\\\\n\",\n", + " 2,\n", + " stardata->model.time, // 1\n", + " stardata->common.zero_age.mass[0] + stardata->common.zero_age.mass[1], // 2\n", + " stardata->star[0].mass + stardata->star[1].mass, // 3\n", + " stardata->star[0].luminosity + stardata->star[1].luminosity, // 4\n", + " stardata->model.probability // 5\n", + " );\n", + " }\n", + "}\n", + "\"\"\"\n", + "\n", + "population.set(\n", + " C_logging_code=custom_logging_statement\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "ae1f1f0c-1f8b-42d8-b051-cbf8c6b51514", + "metadata": {}, + "source": [ + "The parse function must now catch lines that start with \"ZERO_AGE_MAIN_SEQUENCE_STAR\" and process the associated data." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "fd197154-a8ce-4865-8929-008d3483101a", + "metadata": {}, + "outputs": [], + "source": [ + "# import the bin_data function so we can construct finite-resolution probability distributions\n", + "# import the datalinedict to make a dictionary from each line of data from binary_c\n", + "from binarycpython.utils.functions import bin_data,datalinedict\n", + "import re\n", + "\n", + "def parse_function(self, output):\n", + " \"\"\"\n", + " Example parse function\n", + " \"\"\"\n", + " \n", + " # list of the data items\n", + " parameters = [\"header\", \"time\", \"zams_mass\", \"mass\", \"luminosity\", \"probability\"]\n", + " \n", + " # Loop over the output.\n", + " for line in output.splitlines():\n", + " \n", + " # check if we match a ZERO_AGE_MAIN_SEQUENCE_STAR\n", + " match = re.search('ZERO_AGE_MAIN_SEQUENCE_STAR(\\d)',line) \n", + " if match:\n", + " nstar = match.group(1) \n", + " #print(\"matched star\",nstar)\n", + "\n", + " # obtain the line of data in dictionary form \n", + " linedata = datalinedict(line,parameters)\n", + "\n", + " # bin the log10(luminosity) to the nearest 0.1dex\n", + " binned_log_luminosity = bin_data(math.log10(linedata['luminosity']),\n", + " binwidth['luminosity'])\n", + " \n", + " # append the data to the results_dictionary \n", + " self.grid_results['luminosity distribution'][int(nstar)][binned_log_luminosity] += linedata['probability'] \n", + " \n", + " #print (self.grid_results)\n", + " \n", + " # verbose reporting\n", + " #print(\"parse out results_dictionary=\",self.grid_results)\n", + " \n", + "# Add the parsing function\n", + "population.set(\n", + " parse_function=parse_function,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "91509ce5-ffe7-4937-aa87-6d7baac9ac04", + "metadata": {}, + "source": [ + "## Evolving the grid\n", + "Now that we configured all the main parts of the population object, we can actually run the population! Doing this is straightforward: `population.evolve()`\n", + "\n", + "This will start up the processing of all the systems. We can control how many cores are used by settings `amt_cores`. By setting the `verbosity` of the population object to a higher value we can get a lot of verbose information about the run, but for now we will set it to 0.\n", + "\n", + "There are many grid_options that can lead to different behaviour of the evolution of the grid. Please do have a look at those: [grid options docs](https://ri0005.pages.surrey.ac.uk/binary_c-python/grid_options_descriptions.html), and try " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8ea376c1-1e92-45af-8cab-9d7fdca564eb", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "adding: amt_cores=4 to grid_options\n", + "Running the population now, this may take a little while...\n", + "Creating and loading custom logging functionality\n", + "Generating grid code\n", + "Generating grid code\n", + "Constructing/adding: lnm1\n", + "Constructing/adding: q\n", + "Constructing/adding: log10per\n", + "Saving grid code to grid_options\n", + "Writing grid code to /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Loading grid code function from /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Grid code loaded\n", + "Grid has handled 2000 stars\n", + "with a total probability of 0.6495098935846658\n", + "Total starcount for this run will be: 2000\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:14:08,077 DEBUG Process-2] --- Setting up processor: process-0[2021-09-10 15:14:08,080 DEBUG Process-3] --- Setting up processor: process-1[2021-09-10 15:14:08,086 DEBUG MainProcess] --- setting up the system_queue_filler now\n", + "\n", + "[2021-09-10 15:14:08,084 DEBUG Process-4] --- Setting up processor: process-2\n", + "\n", + "[2021-09-10 15:14:08,117 DEBUG Process-5] --- Setting up processor: process-3" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 1 started at 2021-09-10T15:14:08.119437.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff53810>Process 0 started at 2021-09-10T15:14:08.126435.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff539f0>\n", + "Process 2 started at 2021-09-10T15:14:08.138353.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff539f0>" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "Process 3 started at 2021-09-10T15:14:08.186492.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff53810>\n", + "Generating grid code\n", + "Generating grid code\n", + "Constructing/adding: lnm1\n", + "Constructing/adding: q\n", + "Constructing/adding: log10per\n", + "Saving grid code to grid_options\n", + "Writing grid code to /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Loading grid code function from /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Grid code loaded\n", + "624/2000 31.2% complete 15:14:12 ETA= 11.1s tpr=8.05e-03 ETF=15:14:23 mem:800.5MB625/2000 31.2% complete 15:14:12 ETA= 11.1s tpr=8.04e-03 ETF=15:14:23 mem:800.5MB\n", + "626/2000 31.3% complete 15:14:12 ETA= 11.1s tpr=8.05e-03 ETF=15:14:23 mem:800.5MB\n", + "\n", + "713/2000 35.6% complete 15:14:17 ETA= 1.3m tpr=6.00e-02 ETF=15:15:34 mem:547.8MB\n", + "728/2000 36.4% complete 15:14:22 ETA= 7.1m tpr=3.37e-01 ETF=15:21:30 mem:548.1MB\n", + "743/2000 37.1% complete 15:14:27 ETA= 7.0m tpr=3.34e-01 ETF=15:21:26 mem:549.5MB\n", + "759/2000 38.0% complete 15:14:33 ETA= 7.7m tpr=3.73e-01 ETF=15:22:16 mem:550.5MB\n", + "774/2000 38.7% complete 15:14:38 ETA= 6.9m tpr=3.35e-01 ETF=15:21:29 mem:551.1MB\n", + "787/2000 39.4% complete 15:14:43 ETA= 7.8m tpr=3.88e-01 ETF=15:22:33 mem:551.1MB\n", + "799/2000 40.0% complete 15:14:48 ETA= 8.5m tpr=4.24e-01 ETF=15:23:17 mem:552.5MB\n", + "812/2000 40.6% complete 15:14:54 ETA= 8.4m tpr=4.23e-01 ETF=15:23:16 mem:554.8MB\n", + "830/2000 41.5% complete 15:14:59 ETA= 5.5m tpr=2.80e-01 ETF=15:20:26 mem:555.2MB\n", + "847/2000 42.4% complete 15:15:05 ETA= 6.8m tpr=3.52e-01 ETF=15:21:50 mem:555.2MB\n", + "864/2000 43.2% complete 15:15:10 ETA= 6.2m tpr=3.28e-01 ETF=15:21:23 mem:557.0MB\n", + "876/2000 43.8% complete 15:15:15 ETA= 8.2m tpr=4.38e-01 ETF=15:23:27 mem:559.7MB\n", + "887/2000 44.4% complete 15:15:21 ETA= 9.2m tpr=4.95e-01 ETF=15:24:32 mem:560.5MB\n", + "898/2000 44.9% complete 15:15:26 ETA= 9.2m tpr=4.99e-01 ETF=15:24:37 mem:560.5MB\n", + "908/2000 45.4% complete 15:15:32 ETA= 9.5m tpr=5.23e-01 ETF=15:25:03 mem:560.5MB\n", + "919/2000 46.0% complete 15:15:37 ETA= 8.3m tpr=4.60e-01 ETF=15:23:54 mem:560.9MB\n", + "934/2000 46.7% complete 15:15:42 ETA= 6.4m tpr=3.60e-01 ETF=15:22:06 mem:561.7MB\n", + "947/2000 47.4% complete 15:15:47 ETA= 7.2m tpr=4.08e-01 ETF=15:22:57 mem:561.7MB\n", + "956/2000 47.8% complete 15:15:53 ETA= 11.1m tpr=6.39e-01 ETF=15:27:01 mem:561.7MB\n", + "963/2000 48.1% complete 15:15:58 ETA= 12.6m tpr=7.30e-01 ETF=15:28:35 mem:561.7MB\n", + "969/2000 48.5% complete 15:16:04 ETA= 15.2m tpr=8.85e-01 ETF=15:31:16 mem:561.9MB\n", + "979/2000 49.0% complete 15:16:11 ETA= 11.9m tpr=7.01e-01 ETF=15:28:06 mem:562.0MB\n", + "988/2000 49.4% complete 15:16:16 ETA= 9.7m tpr=5.76e-01 ETF=15:25:59 mem:562.0MB\n", + "995/2000 49.8% complete 15:16:21 ETA= 12.3m tpr=7.37e-01 ETF=15:28:42 mem:562.2MB\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:16:25,175 DEBUG MainProcess] --- Signaling stop to processes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1003/2000 50.1% complete 15:16:26 ETA= 11.2m tpr=6.76e-01 ETF=15:27:40 mem:563.0MB\n", + "1015/2000 50.8% complete 15:16:32 ETA= 7.6m tpr=4.65e-01 ETF=15:24:10 mem:563.0MB\n", + "1025/2000 51.2% complete 15:16:37 ETA= 8.1m tpr=5.01e-01 ETF=15:24:45 mem:563.0MB\n", + "1033/2000 51.6% complete 15:16:42 ETA= 10.7m tpr=6.65e-01 ETF=15:27:26 mem:563.0MB\n", + "1040/2000 52.0% complete 15:16:47 ETA= 12.1m tpr=7.55e-01 ETF=15:28:52 mem:563.5MB\n", + "1048/2000 52.4% complete 15:16:53 ETA= 11.8m tpr=7.45e-01 ETF=15:28:42 mem:563.5MB\n", + "1057/2000 52.9% complete 15:16:59 ETA= 9.1m tpr=5.78e-01 ETF=15:26:03 mem:563.6MB\n", + "1062/2000 53.1% complete 15:17:04 ETA= 15.7m tpr=1.01e+00 ETF=15:32:47 mem:564.4MB\n", + "1069/2000 53.5% complete 15:17:09 ETA= 12.4m tpr=7.97e-01 ETF=15:29:31 mem:564.9MB\n", + "1077/2000 53.9% complete 15:17:15 ETA= 11.5m tpr=7.46e-01 ETF=15:28:44 mem:565.0MB\n", + "1085/2000 54.2% complete 15:17:20 ETA= 10.0m tpr=6.55e-01 ETF=15:27:20 mem:565.0MB\n", + "1091/2000 54.5% complete 15:17:26 ETA= 13.8m tpr=9.10e-01 ETF=15:31:13 mem:565.9MB\n", + "1099/2000 55.0% complete 15:17:32 ETA= 12.1m tpr=8.05e-01 ETF=15:29:37 mem:566.5MB\n", + "1114/2000 55.7% complete 15:17:37 ETA= 5.0m tpr=3.35e-01 ETF=15:22:34 mem:566.5MB\n", + "1126/2000 56.3% complete 15:17:43 ETA= 6.8m tpr=4.64e-01 ETF=15:24:29 mem:566.5MB\n", + "1134/2000 56.7% complete 15:17:48 ETA= 9.2m tpr=6.37e-01 ETF=15:27:00 mem:566.6MB\n", + "1139/2000 57.0% complete 15:17:54 ETA= 16.3m tpr=1.14e+00 ETF=15:34:13 mem:567.4MB\n", + "1148/2000 57.4% complete 15:17:59 ETA= 8.8m tpr=6.20e-01 ETF=15:26:47 mem:567.4MB\n", + "1156/2000 57.8% complete 15:18:05 ETA= 9.3m tpr=6.60e-01 ETF=15:27:22 mem:567.5MB\n", + "1162/2000 58.1% complete 15:18:11 ETA= 14.3m tpr=1.02e+00 ETF=15:32:28 mem:567.6MB\n", + "1168/2000 58.4% complete 15:18:17 ETA= 15.2m tpr=1.09e+00 ETF=15:33:27 mem:568.6MB\n", + "1177/2000 58.9% complete 15:18:23 ETA= 8.8m tpr=6.45e-01 ETF=15:27:14 mem:568.6MB\n", + "1181/2000 59.0% complete 15:18:28 ETA= 17.8m tpr=1.30e+00 ETF=15:36:16 mem:568.7MB\n", + "1187/2000 59.4% complete 15:18:34 ETA= 12.1m tpr=8.93e-01 ETF=15:30:40 mem:568.7MB\n", + "1194/2000 59.7% complete 15:18:39 ETA= 9.8m tpr=7.29e-01 ETF=15:28:26 mem:568.8MB\n", + "1202/2000 60.1% complete 15:18:44 ETA= 9.5m tpr=7.12e-01 ETF=15:28:12 mem:568.8MB\n", + "1219/2000 61.0% complete 15:18:51 ETA= 5.3m tpr=4.07e-01 ETF=15:24:09 mem:569.7MB\n", + "1228/2000 61.4% complete 15:18:57 ETA= 7.4m tpr=5.76e-01 ETF=15:26:21 mem:569.7MB\n", + "1234/2000 61.7% complete 15:19:02 ETA= 11.8m tpr=9.22e-01 ETF=15:30:48 mem:571.7MB1235/2000 61.8% complete 15:19:02 ETA= 10.1m tpr=7.92e-01 ETF=15:29:08 mem:571.7MB\n", + "\n", + "1243/2000 62.1% complete 15:19:07 ETA= 7.3m tpr=5.79e-01 ETF=15:26:26 mem:573.4MB\n", + "1251/2000 62.5% complete 15:19:13 ETA= 8.3m tpr=6.68e-01 ETF=15:27:33 mem:575.4MB\n", + "1260/2000 63.0% complete 15:19:19 ETA= 8.2m tpr=6.65e-01 ETF=15:27:31 mem:575.4MB\n", + "1268/2000 63.4% complete 15:19:24 ETA= 7.8m tpr=6.41e-01 ETF=15:27:13 mem:576.8MB\n", + "1276/2000 63.8% complete 15:19:29 ETA= 7.6m tpr=6.30e-01 ETF=15:27:05 mem:577.0MB\n", + "1282/2000 64.1% complete 15:19:34 ETA= 10.1m tpr=8.44e-01 ETF=15:29:40 mem:578.0MB\n", + "1289/2000 64.5% complete 15:19:40 ETA= 10.8m tpr=9.08e-01 ETF=15:30:26 mem:578.0MB\n", + "1295/2000 64.8% complete 15:19:46 ETA= 10.5m tpr=8.95e-01 ETF=15:30:16 mem:578.1MB\n", + "1309/2000 65.5% complete 15:19:51 ETA= 4.3m tpr=3.70e-01 ETF=15:24:06 mem:578.1MB\n", + "1323/2000 66.2% complete 15:19:58 ETA= 6.1m tpr=5.45e-01 ETF=15:26:07 mem:579.2MB\n", + "1332/2000 66.6% complete 15:20:03 ETA= 6.2m tpr=5.58e-01 ETF=15:26:16 mem:579.3MB\n", + "1338/2000 66.9% complete 15:20:09 ETA= 10.1m tpr=9.11e-01 ETF=15:30:12 mem:579.3MB\n", + "1346/2000 67.3% complete 15:20:18 ETA= 12.5m tpr=1.14e+00 ETF=15:32:46 mem:581.5MB\n", + "1355/2000 67.8% complete 15:20:25 ETA= 8.5m tpr=7.90e-01 ETF=15:28:54 mem:581.6MB\n", + "1359/2000 68.0% complete 15:20:30 ETA= 13.9m tpr=1.30e+00 ETF=15:34:26 mem:581.6MB\n", + "1366/2000 68.3% complete 15:20:38 ETA= 11.7m tpr=1.10e+00 ETF=15:32:18 mem:581.7MB\n", + "1376/2000 68.8% complete 15:20:44 ETA= 6.1m tpr=5.89e-01 ETF=15:26:51 mem:581.7MB\n", + "1384/2000 69.2% complete 15:20:49 ETA= 6.9m tpr=6.76e-01 ETF=15:27:46 mem:581.7MB\n", + "1393/2000 69.7% complete 15:20:55 ETA= 6.2m tpr=6.13e-01 ETF=15:27:07 mem:581.8MB1394/2000 69.7% complete 15:20:55 ETA= 5.6m tpr=5.52e-01 ETF=15:26:29 mem:581.8MB\n", + "\n", + "1423/2000 71.2% complete 15:21:00 ETA= 1.6m tpr=1.69e-01 ETF=15:22:37 mem:581.9MB\n", + "1435/2000 71.8% complete 15:21:07 ETA= 5.6m tpr=5.92e-01 ETF=15:26:42 mem:582.3MB\n", + "1443/2000 72.2% complete 15:21:12 ETA= 6.1m tpr=6.54e-01 ETF=15:27:17 mem:582.5MB\n", + "1445/2000 72.2% complete 15:21:18 ETA= 28.2m tpr=3.05e+00 ETF=15:49:28 mem:582.6MB\n", + "1448/2000 72.4% complete 15:21:25 ETA= 20.0m tpr=2.18e+00 ETF=15:41:27 mem:582.6MB\n", + "1454/2000 72.7% complete 15:21:31 ETA= 8.6m tpr=9.49e-01 ETF=15:30:09 mem:583.0MB\n", + "1455/2000 72.8% complete 15:21:37 ETA= 54.9m tpr=6.05e+00 ETF=16:16:32 mem:583.0MB\n", + "1459/2000 73.0% complete 15:21:43 ETA= 13.5m tpr=1.50e+00 ETF=15:35:12 mem:583.0MB\n", + "1465/2000 73.2% complete 15:21:48 ETA= 8.6m tpr=9.65e-01 ETF=15:30:25 mem:583.0MB\n", + "1474/2000 73.7% complete 15:21:54 ETA= 5.6m tpr=6.38e-01 ETF=15:27:30 mem:583.0MB\n", + "1482/2000 74.1% complete 15:21:59 ETA= 5.4m tpr=6.30e-01 ETF=15:27:26 mem:583.0MB\n", + "1485/2000 74.2% complete 15:22:04 ETA= 14.8m tpr=1.73e+00 ETF=15:36:54 mem:583.5MB\n", + "1487/2000 74.3% complete 15:22:10 ETA= 24.9m tpr=2.91e+00 ETF=15:47:02 mem:583.5MB\n", + "1496/2000 74.8% complete 15:22:16 ETA= 5.0m tpr=5.91e-01 ETF=15:27:13 mem:583.7MB\n", + "1509/2000 75.5% complete 15:22:21 ETA= 3.6m tpr=4.40e-01 ETF=15:25:57 mem:583.9MB\n", + "1523/2000 76.2% complete 15:22:27 ETA= 3.0m tpr=3.80e-01 ETF=15:25:28 mem:583.9MB\n", + "1531/2000 76.5% complete 15:22:33 ETA= 5.9m tpr=7.60e-01 ETF=15:28:29 mem:583.9MB\n", + "1537/2000 76.8% complete 15:22:38 ETA= 6.7m tpr=8.71e-01 ETF=15:29:21 mem:583.9MB\n", + "1545/2000 77.2% complete 15:22:44 ETA= 5.4m tpr=7.14e-01 ETF=15:28:08 mem:584.0MB\n", + "1555/2000 77.8% complete 15:22:49 ETA= 4.1m tpr=5.52e-01 ETF=15:26:55 mem:584.2MB\n", + "1564/2000 78.2% complete 15:22:54 ETA= 4.2m tpr=5.78e-01 ETF=15:27:06 mem:584.2MB\n", + "1574/2000 78.7% complete 15:23:00 ETA= 4.4m tpr=6.16e-01 ETF=15:27:23 mem:584.4MB\n", + "1584/2000 79.2% complete 15:23:07 ETA= 4.4m tpr=6.28e-01 ETF=15:27:28 mem:584.8MB\n", + "1594/2000 79.7% complete 15:23:12 ETA= 3.8m tpr=5.66e-01 ETF=15:27:02 mem:584.9MB\n", + "1607/2000 80.3% complete 15:23:17 ETA= 2.5m tpr=3.86e-01 ETF=15:25:49 mem:585.0MB\n", + "1618/2000 80.9% complete 15:23:24 ETA= 3.8m tpr=5.97e-01 ETF=15:27:12 mem:585.4MB\n", + "1628/2000 81.4% complete 15:23:29 ETA= 3.3m tpr=5.28e-01 ETF=15:26:46 mem:585.5MB\n", + "1635/2000 81.8% complete 15:23:34 ETA= 4.4m tpr=7.30e-01 ETF=15:28:01 mem:585.9MB\n", + "1645/2000 82.2% complete 15:23:40 ETA= 3.4m tpr=5.81e-01 ETF=15:27:06 mem:585.9MB\n", + "1655/2000 82.8% complete 15:23:47 ETA= 4.0m tpr=7.02e-01 ETF=15:27:49 mem:586.0MB1656/2000 82.8% complete 15:23:47 ETA= 3.7m tpr=6.39e-01 ETF=15:27:27 mem:586.0MB\n", + "\n", + "1664/2000 83.2% complete 15:23:54 ETA= 4.5m tpr=8.01e-01 ETF=15:28:23 mem:586.1MB\n", + "1674/2000 83.7% complete 15:24:02 ETA= 4.5m tpr=8.27e-01 ETF=15:28:31 mem:586.2MB\n", + "1684/2000 84.2% complete 15:24:07 ETA= 2.9m tpr=5.55e-01 ETF=15:27:03 mem:586.2MB\n", + "1691/2000 84.5% complete 15:24:13 ETA= 4.2m tpr=8.21e-01 ETF=15:28:27 mem:586.5MB\n", + "1699/2000 85.0% complete 15:24:19 ETA= 3.4m tpr=6.75e-01 ETF=15:27:42 mem:586.5MB\n", + "1713/2000 85.7% complete 15:24:24 ETA= 1.9m tpr=4.07e-01 ETF=15:26:21 mem:586.6MB\n", + "1725/2000 86.2% complete 15:24:31 ETA= 2.6m tpr=5.57e-01 ETF=15:27:04 mem:586.7MB\n", + "1735/2000 86.8% complete 15:24:38 ETA= 3.0m tpr=6.76e-01 ETF=15:27:37 mem:586.7MB\n", + "1745/2000 87.2% complete 15:24:44 ETA= 2.7m tpr=6.40e-01 ETF=15:27:27 mem:586.9MB\n", + "1755/2000 87.8% complete 15:24:51 ETA= 2.8m tpr=6.88e-01 ETF=15:27:40 mem:586.9MB\n", + "1763/2000 88.2% complete 15:24:56 ETA= 2.6m tpr=6.59e-01 ETF=15:27:32 mem:586.9MB\n", + "1767/2000 88.3% complete 15:25:02 ETA= 5.3m tpr=1.36e+00 ETF=15:30:18 mem:586.9MB\n", + "1776/2000 88.8% complete 15:25:09 ETA= 2.9m tpr=7.71e-01 ETF=15:28:01 mem:586.9MB\n", + "1785/2000 89.2% complete 15:25:14 ETA= 2.1m tpr=5.90e-01 ETF=15:27:21 mem:586.9MB\n", + "1793/2000 89.7% complete 15:25:19 ETA= 2.2m tpr=6.29e-01 ETF=15:27:29 mem:587.1MB\n", + "1801/2000 90.0% complete 15:25:24 ETA= 2.2m tpr=6.59e-01 ETF=15:27:35 mem:587.1MB\n", + "1812/2000 90.6% complete 15:25:29 ETA= 1.5m tpr=4.68e-01 ETF=15:26:57 mem:587.1MB\n", + "1822/2000 91.1% complete 15:25:35 ETA= 1.6m tpr=5.54e-01 ETF=15:27:14 mem:587.4MB\n", + "1830/2000 91.5% complete 15:25:41 ETA= 2.1m tpr=7.49e-01 ETF=15:27:48 mem:587.4MB\n", + "1839/2000 92.0% complete 15:25:47 ETA= 1.7m tpr=6.21e-01 ETF=15:27:27 mem:587.4MB\n", + "1847/2000 92.3% complete 15:25:52 ETA= 1.8m tpr=7.10e-01 ETF=15:27:41 mem:587.4MB\n", + "1855/2000 92.8% complete 15:25:59 ETA= 2.0m tpr=8.17e-01 ETF=15:27:57 mem:587.6MB\n", + "1864/2000 93.2% complete 15:26:05 ETA= 1.5m tpr=6.79e-01 ETF=15:27:37 mem:587.8MB\n", + "1873/2000 93.7% complete 15:26:10 ETA= 1.3m tpr=6.07e-01 ETF=15:27:27 mem:588.0MB\n", + "1884/2000 94.2% complete 15:26:16 ETA= 57.0s tpr=4.91e-01 ETF=15:27:13 mem:588.1MB\n", + "1895/2000 94.8% complete 15:26:21 ETA= 48.7s tpr=4.63e-01 ETF=15:27:09 mem:588.8MB\n", + "1907/2000 95.3% complete 15:26:27 ETA= 45.6s tpr=4.91e-01 ETF=15:27:12 mem:588.9MB\n", + "1916/2000 95.8% complete 15:26:33 ETA= 57.5s tpr=6.84e-01 ETF=15:27:30 mem:589.1MB\n", + "1926/2000 96.3% complete 15:26:39 ETA= 46.5s tpr=6.28e-01 ETF=15:27:26 mem:589.1MB\n", + "1936/2000 96.8% complete 15:26:46 ETA= 42.0s tpr=6.57e-01 ETF=15:27:28 mem:589.1MB\n", + "1946/2000 97.3% complete 15:26:53 ETA= 40.1s tpr=7.42e-01 ETF=15:27:33 mem:589.2MB\n", + "1956/2000 97.8% complete 15:26:59 ETA= 25.1s tpr=5.70e-01 ETF=15:27:24 mem:589.2MB\n", + "1966/2000 98.3% complete 15:27:04 ETA= 19.1s tpr=5.62e-01 ETF=15:27:24 mem:589.5MB\n", + "1976/2000 98.8% complete 15:27:10 ETA= 14.4s tpr=6.01e-01 ETF=15:27:25 mem:589.5MB\n", + "1987/2000 99.3% complete 15:27:16 ETA= 6.4s tpr=4.92e-01 ETF=15:27:22 mem:589.5MB\n", + "1998/2000 99.9% complete 15:27:21 ETA= 1.0s tpr=4.85e-01 ETF=15:27:22 mem:589.6MB\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,382 DEBUG Process-5] --- Process-3 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 3 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.117391, done at 2021-09-10T15:27:22.400722 (total: 794.283331s of which 792.6935975551605s interfacing with binary_c).\n", + "\tRan 499 systems with a total probability of 0.17005450973840136.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,435 DEBUG Process-5] --- Process-3 is finished.\n", + "[2021-09-10 15:27:22,480 DEBUG Process-3] --- Process-1 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 1 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.080367, done at 2021-09-10T15:27:22.505288 (total: 794.424921s of which 793.1943278312683s interfacing with binary_c).\n", + "\tRan 474 systems with a total probability of 0.15740832333567983.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,531 DEBUG Process-3] --- Process-1 is finished.\n", + "[2021-09-10 15:27:22,846 DEBUG Process-2] --- Process-0 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 0 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.077117, done at 2021-09-10T15:27:22.851971 (total: 794.774854s of which 793.4976091384888s interfacing with binary_c).\n", + "\tRan 507 systems with a total probability of 0.16018641159091498.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,872 DEBUG Process-2] --- Process-0 is finished.\n", + "[2021-09-10 15:27:22,976 DEBUG Process-4] --- Process-2 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 2 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.084369, done at 2021-09-10T15:27:22.981706 (total: 794.897337s of which 793.4600214958191s interfacing with binary_c).\n", + "\tRan 520 systems with a total probability of 0.1618606489196724.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,986 DEBUG Process-4] --- Process-2 is finished.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Population-0fa295ee5c76444bace8fd0ee17a3e11 finished! The total probability was: 0.6495098935846686. It took a total of 795.1383104324341s to run 2000 systems on 4 cores\n", + "There were no errors found in this run.\n", + "Done population run!\n" + ] + } + ], + "source": [ + "# set number of threads\n", + "population.set(\n", + " # verbose output is not required \n", + " verbosity=1,\n", + " # set number of threads (i.e. number of CPU cores we use)\n", + " amt_cores=4,\n", + " )\n", + "\n", + "# Evolve the population - this is the slow, number-crunching step\n", + "print(\"Running the population now, this may take a little while...\")\n", + "analytics = population.evolve() \n", + "print(\"Done population run!\")\n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "markdown", + "id": "91ab45c7-7d31-4543-aee4-127ab58e891f", + "metadata": {}, + "source": [ + "After the run is complete, some technical report on the run is returned. I stored that in `analytics`. As we can see below, this dictionary is like a status report of the evolution. Useful for e.g. debugging." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e1f0464b-0424-4022-b34b-5b744bc2c59d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'population_name': '0fa295ee5c76444bace8fd0ee17a3e11', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 0.6495098935846686, 'total_count': 2000, 'start_timestamp': 1631283248.057525, 'end_timestamp': 1631284043.1958354, 'total_mass_run': 41112.220964392276, 'total_probability_weighted_mass_run': 0.6452116023479681, 'zero_prob_stars_skipped': 0}\n" + ] + } + ], + "source": [ + "print(analytics)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "05c6d132-abee-423e-b1a8-2039c8996fbc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[None]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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p9///vdq2bKlJKlFixbavn274VSIBLNnz1aPHj1Uq1YtJSQkaMiQIZoyZYrpWIggWVlZuuWWW+TxeOR2u9WkSRNt27bNdCxEmIKCAj3xxBO66qqrTEdBBPrkk080fPhw1a5dW263W0888YQ6dOhgOhYiSDAYVCgUUllZmQKBgAKBgLxer+lYMYMB0//YvHmz6tatqwceeEBnnXWWbrjhBrndbtOxEGFmzJih8vJyDR061HQURCCPx6Ozzz5bkhQKhTR+/HgNHDjQcCpEgl27dikrK6vycnZ2tnbu3GkwESJNs2bN1LFjR0nShg0b9NFHH6l///5mQyHi3HnnnbrxxhuVkpJiOgoi0MaNGxUMBnX55ZfrrLPO0muvvabU1FTTsRBBkpKS9Pvf/17Dhg1Tv379lJubq86dO5uOFTNcpgOY8vHHH+vBBx884rqGDRtq+fLluv7663X77bfrrbfe0i233KJXXnnFUErY2U89hxo3bqzi4mK99NJLZkIhohztOfTSSy/J5/PplltuUSAQ0JVXXmkoISJJOBz+0XWWZRlIgki3Zs0aXXnllbr55pvVqFEj03EQQd566y3VqVNHPXv21Lvvvms6DiJQMBjU/Pnz9corryghIUHXXHONJk6cqHPPPdd0NESIlStX6p133tGnn36q5ORk/elPf9K//vUv/fa3vzUdLSZY4Z/6jTRGbdq0Seecc44WLFgg6UB/s0ePHlq8eLHhZIgUb731lv75z38qMTFR0oEfcC1bttSrr76qpKQkw+kQKUpKSnT11VerVq1aeuyxx+TxeExHQgSYOHGi5s+fr/vvv1+S9I9//EPhcFjXXXed4WSIJAsWLNANN9yg2267TWeccYbpOIgwv/nNb7R79245nU7t379fpaWlGjlypG677TbT0RAh/va3v6m4uFjjxo2TJL366qtas2aN7r77brPBEDFeeOEF7d27VzfffLMk6bPPPtNrr72m5557znCy2EBF7n80aNBAOTk5lRvJffrpp2rTpo3hVIgk5513nqZPn65JkyZp0qRJkg6cYsBwCSfiz3/+sxo2bKgnn3yS4RKOW69evTRnzhzl5+errKxM06ZNU79+/UzHQgTZvn27rr32Wj322GMMl/CLvPjii/rggw80adIk3XDDDTrttNMYLuGEnHrqqZo1a5YKCwsVDAb15Zdf8noMJ6Rly5aaPXu2SktLFQ6HNXPmTLVr1850rJgRsxW5oxk/frzuuusuPfroo0pKStJDDz1kOhKAGLJ8+XLNmDFDTZs21ciRIyUd2Evn+eefNxsMtpeTk6Mbb7xRF198sfx+v0aPHq327dubjoUI8q9//UsVFRVH/O4zduxYnX/++QZTAYglHTp00G9/+1tdcMEF8vv96t27t0aNGmU6FiJInz59tHz5cp177rlyu91q166drrjiCtOxYgYVOQAAAAAAAJwUKnIAAAAAAAA4KQyYAAAAAAAAcFIYMAEAAAAAAOCkMGACAAAAAADASWHABAAAAAAAgJPCgAkAAAAAAAAnhQETAAAAAAAATgoDJgAAEPFOO+00zZ4923QMAACAmMWACQAAoIrl5+erRYsW2rlzp+koAAAANYIBEwAAQBV47LHH9OWXX0qSVq5cqfT0dOXk5BhOdcANN9yg1atXV17esmWLOnXq9Ivuq6SkRL/97W9VXl5eVfEAAEAUYMAEAACiyrp163TRRRepa9euOuOMMzRjxozKzy1btkwjR45Up06ddMMNN+gPf/iDnnjiiZN+zEWLFmnt2rXq27evJGnFihVq2bLlSd9vVfD5fNq4caOaN29eJfeXmJioM888U08++WSV3B8AAIgODJgAAEDU8Pv9uuqqq9S7d2/Nnj1b48aN05/+9CetX79ePp9P1113nc455xzNmzdPZ555pqZPn14lj/vUU09pzJgxlZftNGCaPXu2evbsWaX3OWzYME2ePFl79uyp0vsFAACRiwETAACIGosXL1ZpaamuuOIKeTwe9ezZU6eeeqo+/PBDLV68WIFAQBdffLHcbrcGDx6sdu3aVX5tUVGRRo8erU6dOh1RJ3v00Ud1wQUX6M9//rP8fv+PHrOwsFALFixQ7969K69buXKlWrVq9aPbvvHGG7rooosq/7Rv315Lliyp/PzYsWM1fvx4SQdqbC1atNDXX38t6cBKpG7dumnChAmSpOLiYl111VW66KKLNGbMGH3++ec/+T2ZMWOGBg4ceCLfxmPyer3q3LnzUR8TAADEHpfpAAAAAFVl165dql27thyOw++h1a1bVzt37tSuXbuUk5Mjy7IqP1enTp3Kj+Pi4vTcc8/pkUceqbxu5cqV2rlzp1577TU988wzmjp1qs4888wjHnPjxo3KysqSx+ORJFVUVOj7779X69atf5RvzJgxlSudZs6cqYkTJ6p9+/aSpO3btysnJ0fz5s2rvH3btm31ySefqEePHpozZ44aNmxY+blJkyapb9++uvDCCxUOh1VUVPSjxwuFQlq0aJHuvvvu4/r+HbJz5069/PLLCgQCCofDatWqlc4555wjbtOgQQN9//33J3S/AAAgerGCCQAARI3s7Gzt2LFDoVCo8rpDg5usrCzt3LlT4XD4iM8d4na7lZ6efsT9LVy4UH369JEk9e3bVwsXLvzRYzocDgWDwcrLq1evlsvlUl5e3lFz5ufn68knn9Q999xTed3UqVM1YsQINW7cWOvWrZMk5ebmatu2bQqHw/rkk080ePDgytt7vV4tWrRIe/bskWVZSklJ+dHjLF68WG3btpXT6Txqlh8KhUJ6//33deONN+rWW2/VbbfdpiZNmuizzz474nbBYPCE7hcAAEQ3BkwAACBqtG/fXnFxcXrhhRfk9/s1d+5czZw5U8OHD1fHjh3ldDo1YcIEBQIBTZ8+Xd99993P3l9hYaGSkpIkScnJydq/f/+PblO/fn3l5+eroqJC0oFVT02aNFEgEFBFRYUqKirk8/mO+Jq7775bv//9748YaM2aNUv9+vXTmWeeqSlTplRe36lTJ33zzTfKz89XZmZm5fVnn3228vLydPnll2vMmDFav379j7JNnz5dp59++nF85w5bsmSJRo4cKZfLpY8//lhbt25V+/btVVZWdsTttmzZ8rNDNAAAEFsYMAEAgKjh8Xj07LPP6osvvlCPHj10zz336JFHHlGTJk3k8Xj01FNP6e2331a3bt30/vvva8CAAZXVtp+SnJys4uJiSQf2aEpNTf3RbVJSUtSlS5fKvZJWrFihZcuWqX379pV/hg8fXnn79957T8nJyTrttNMqr9uxY4fWrFmjq6++Ws8888wRexsNHjxYDz74oE455ZQjHtftduuaa67RpEmTdMMNN+ipp576UbbZs2dXrsD6odLSUnXq1OmIP6tWrZLT6axcAfbss89q/vz5knTEaiWfz6dvv/32iH8HAAAQ29iDCQAARLyZM2dWftysWbPKjbB/qF27dpo0aVLl5fPOO0+nnnrqUe+3c+fOevHFFzVy5EjNmjVLnTt3/snbXXvttXr22WfVv39/3Xnnnbrzzjt/8nbbt2/XSy+99KN8U6ZM0a233qqhQ4dKOrDC6dCqp0aNGqlLly4aOnSoZs+eXfk1W7durdz7KSMj44jq3yETJ078yRz16tXTqlWrfvJzfr9fL7/8si655JLK79V33313xIDpgw8+0IgRI36ylgcAAGITAyYAABAz5s2bp7y8PKWlpWny5MlatWqV+vbtW/n53/3ud1qxYoW+//57jRkzRueee64yMjJ0wQUXqE6dOrrssst+8n47d+6svLw8ffHFF+rXr99RH/+f//ynCgsLdfXVV1ded80112jatGn6xz/+UXld9+7d9fHHH1deHjdu3I/ua/Xq1brxxhvl9XoVDoePOtQ6UW63W8OGDdPjjz9euZKpWbNmGj16tKQDp9d98MEHlafdAQAASJIV/qm3uwAAAKLQG2+8oSeffFJlZWWqV6+e/vjHP2rAgAGmYwEAAEQ8BkwAAAAAAAA4KWzyDQAAAAAAgJPCgAkAAAAAAAAnhQETAAAAAAAATgoDJgAAAAAAAJwUBkwAAAAAAAA4KQyYAAAAAAAAcFIYMAEAAAAAAOCkMGACAAAAAADASfl/6hNZaplFmREAAAAASUVORK5CYII=\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# make a plot of the luminosity distribution using Seaborn and Pandas\n", + "import seaborn as sns\n", + "import pandas as pd\n", + "from binarycpython.utils.functions import pad_output_distribution\n", + "\n", + "# set the figure size (for a Jupyter notebook in a web browser) \n", + "sns.set( rc = {'figure.figsize':(20,10)} )\n", + "\n", + "titles = { 0 : \"Primary\",\n", + " 1 : \"Secondary\",\n", + " 2 : \"Unresolved\" }\n", + "\n", + "# choose to plot the \n", + "# PRIMARY, SECONDARY or UNRESOLVED\n", + "nstar = UNRESOLVED\n", + "\n", + "plots = {}\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "for n in range(0,3):\n", + " pad_output_distribution(population.grid_results['luminosity distribution'][n],\n", + " binwidth['luminosity'])\n", + " plots[titles[n] + ' ZAMS luminosity distribution'] = population.grid_results['luminosity distribution'][n]\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict(plots)\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e7541ebf-fe9a-4fb0-a88e-bb318d06f9eb", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/build/html/notebook_luminosity_function_single.html b/docs/build/html/notebook_luminosity_function_single.html new file mode 100644 index 0000000000000000000000000000000000000000..e2821b3be5eb052ac8881265fc1420a6af59d09c --- /dev/null +++ b/docs/build/html/notebook_luminosity_function_single.html @@ -0,0 +1,1035 @@ + + +<!DOCTYPE html> +<html class="writer-html5" lang="en" > +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Example use case: Zero-age stellar luminosity function — binary_c-python documentation</title> + + + + <link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + + + + + + + + <!--[if lt IE 9]> + <script src="_static/js/html5shiv.min.js"></script> + <![endif]--> + + + <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> + <script src="_static/jquery.js"></script> + <script src="_static/underscore.js"></script> + <script src="_static/doctools.js"></script> + <script src="_static/language_data.js"></script> + <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script> + <script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script> + <script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true, "ignoreClass": "document", "processClass": "math|output_area"}})</script> + + <script type="text/javascript" src="_static/js/theme.js"></script> + + + <link rel="index" title="Index" href="genindex.html" /> + <link rel="search" title="Search" href="search.html" /> + <link rel="next" title="Zero-age stellar luminosity function in binaries" href="notebook_luminosity_function_binaries.html" /> + <link rel="prev" title="Using the API functionality of binarycpython" href="notebook_api_functionality.html" /> +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search" > + + + + <a href="index.html" class="icon icon-home" alt="Documentation Home"> binary_c-python + + + + </a> + + + + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <p class="caption"><span class="caption-text">Contents:</span></p> +<ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="readme_link.html">Python module for binary_c</a></li> +<li class="toctree-l1"><a class="reference internal" href="modules.html">Binarycpython code</a></li> +<li class="toctree-l1 current"><a class="reference internal" href="example_notebooks.html">Example notebooks</a><ul class="current"> +<li class="toctree-l2"><a class="reference internal" href="notebook_individual_systems.html">Running individual systems with binarycpython</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_custom_logging.html">Using custom logging routines with binarycpython</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_population.html">Running populations with binarycpython</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_extra_features.html">Extra features and functionality of binarycpython</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_api_functionality.html">Using the API functionality of binarycpython</a></li> +<li class="toctree-l2 current"><a class="current reference internal" href="#">Example use case: Zero-age stellar luminosity function</a><ul> +<li class="toctree-l3"><a class="reference internal" href="#Setting-up-the-Population-object">Setting up the Population object</a></li> +<li class="toctree-l3"><a class="reference internal" href="#Adding-grid-variables">Adding grid variables</a></li> +<li class="toctree-l3"><a class="reference internal" href="#Setting-logging-and-handling-the-output">Setting logging and handling the output</a></li> +<li class="toctree-l3"><a class="reference internal" href="#Evolving-the-grid">Evolving the grid</a></li> +<li class="toctree-l3"><a class="reference internal" href="#ZAMS-Luminosity-distribution-with-the-initial-mass-function">ZAMS Luminosity distribution with the initial mass function</a></li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="#A-better-sampled-grid">A better-sampled grid</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_binaries.html">Zero-age stellar luminosity function in binaries</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="binary_c_parameters.html">Binary_c parameters</a></li> +<li class="toctree-l1"><a class="reference internal" href="grid_options_descriptions.html">Population grid code options</a></li> +<li class="toctree-l1"><a class="reference external" href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python">Visit the GitLab repo</a></li> +<li class="toctree-l1"><a class="reference external" href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/issues/new">Submit an issue</a></li> +</ul> + + + + </div> + + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="index.html">binary_c-python</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="index.html" class="icon icon-home"></a> »</li> + + <li><a href="example_notebooks.html">Example notebooks</a> »</li> + + <li>Example use case: Zero-age stellar luminosity function</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="_sources/notebook_luminosity_function_single.ipynb.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + +<style> +/* CSS for nbsphinx extension */ + +/* remove conflicting styling from Sphinx themes */ +div.nbinput.container div.prompt *, +div.nboutput.container div.prompt *, +div.nbinput.container div.input_area pre, +div.nboutput.container div.output_area pre, +div.nbinput.container div.input_area .highlight, +div.nboutput.container div.output_area .highlight { + border: none; + padding: 0; + margin: 0; + box-shadow: none; +} + +div.nbinput.container > div[class*=highlight], +div.nboutput.container > div[class*=highlight] { + margin: 0; +} + +div.nbinput.container div.prompt *, +div.nboutput.container div.prompt * { + background: none; +} + +div.nboutput.container div.output_area .highlight, +div.nboutput.container div.output_area pre { + background: unset; +} + +div.nboutput.container div.output_area div.highlight { + color: unset; /* override Pygments text color */ +} + +/* avoid gaps between output lines */ +div.nboutput.container div[class*=highlight] pre { + line-height: normal; +} + +/* input/output containers */ +div.nbinput.container, +div.nboutput.container { + display: -webkit-flex; + display: flex; + align-items: flex-start; + margin: 0; + width: 100%; +} +@media (max-width: 540px) { + div.nbinput.container, + div.nboutput.container { + flex-direction: column; + } +} + +/* input container */ +div.nbinput.container { + padding-top: 5px; +} + +/* last container */ +div.nblast.container { + padding-bottom: 5px; +} + +/* input prompt */ +div.nbinput.container div.prompt pre { + color: #307FC1; +} + +/* output prompt */ +div.nboutput.container div.prompt pre { + color: #BF5B3D; +} + +/* all prompts */ +div.nbinput.container div.prompt, +div.nboutput.container div.prompt { + width: 4.5ex; + padding-top: 5px; + position: relative; + user-select: none; +} + +div.nbinput.container div.prompt > div, +div.nboutput.container div.prompt > div { + position: absolute; + right: 0; + margin-right: 0.3ex; +} + +@media (max-width: 540px) { + div.nbinput.container div.prompt, + div.nboutput.container div.prompt { + width: unset; + text-align: left; + padding: 0.4em; + } + div.nboutput.container div.prompt.empty { + padding: 0; + } + + div.nbinput.container div.prompt > div, + div.nboutput.container div.prompt > div { + position: unset; + } +} + +/* disable scrollbars on prompts */ +div.nbinput.container div.prompt pre, +div.nboutput.container div.prompt pre { + overflow: hidden; +} + +/* input/output area */ +div.nbinput.container div.input_area, +div.nboutput.container div.output_area { + -webkit-flex: 1; + flex: 1; + overflow: auto; +} +@media (max-width: 540px) { + div.nbinput.container div.input_area, + div.nboutput.container div.output_area { + width: 100%; + } +} + +/* input area */ +div.nbinput.container div.input_area { + border: 1px solid #e0e0e0; + border-radius: 2px; + /*background: #f5f5f5;*/ +} + +/* override MathJax center alignment in output cells */ +div.nboutput.container div[class*=MathJax] { + text-align: left !important; +} + +/* override sphinx.ext.imgmath center alignment in output cells */ +div.nboutput.container div.math p { + text-align: left; +} + +/* standard error */ +div.nboutput.container div.output_area.stderr { + background: #fdd; +} + +/* ANSI colors */ +.ansi-black-fg { color: #3E424D; } +.ansi-black-bg { background-color: #3E424D; } +.ansi-black-intense-fg { color: #282C36; } +.ansi-black-intense-bg { background-color: #282C36; } +.ansi-red-fg { color: #E75C58; } +.ansi-red-bg { background-color: #E75C58; } +.ansi-red-intense-fg { color: #B22B31; } +.ansi-red-intense-bg { background-color: #B22B31; } +.ansi-green-fg { color: #00A250; } +.ansi-green-bg { background-color: #00A250; } +.ansi-green-intense-fg { color: #007427; } +.ansi-green-intense-bg { background-color: #007427; } +.ansi-yellow-fg { color: #DDB62B; } +.ansi-yellow-bg { background-color: #DDB62B; } +.ansi-yellow-intense-fg { color: #B27D12; } +.ansi-yellow-intense-bg { background-color: #B27D12; } +.ansi-blue-fg { color: #208FFB; } +.ansi-blue-bg { background-color: #208FFB; } +.ansi-blue-intense-fg { color: #0065CA; } +.ansi-blue-intense-bg { background-color: #0065CA; } +.ansi-magenta-fg { color: #D160C4; } +.ansi-magenta-bg { background-color: #D160C4; } +.ansi-magenta-intense-fg { color: #A03196; } +.ansi-magenta-intense-bg { background-color: #A03196; } +.ansi-cyan-fg { color: #60C6C8; } +.ansi-cyan-bg { background-color: #60C6C8; } +.ansi-cyan-intense-fg { color: #258F8F; } +.ansi-cyan-intense-bg { background-color: #258F8F; } +.ansi-white-fg { color: #C5C1B4; } +.ansi-white-bg { background-color: #C5C1B4; } +.ansi-white-intense-fg { color: #A1A6B2; } +.ansi-white-intense-bg { background-color: #A1A6B2; } + +.ansi-default-inverse-fg { color: #FFFFFF; } +.ansi-default-inverse-bg { background-color: #000000; } + +.ansi-bold { font-weight: bold; } +.ansi-underline { text-decoration: underline; } + + +div.nbinput.container div.input_area div[class*=highlight] > pre, +div.nboutput.container div.output_area div[class*=highlight] > pre, +div.nboutput.container div.output_area div[class*=highlight].math, +div.nboutput.container div.output_area.rendered_html, +div.nboutput.container div.output_area > div.output_javascript, +div.nboutput.container div.output_area:not(.rendered_html) > img{ + padding: 5px; + margin: 0; +} + +/* fix copybtn overflow problem in chromium (needed for 'sphinx_copybutton') */ +div.nbinput.container div.input_area > div[class^='highlight'], +div.nboutput.container div.output_area > div[class^='highlight']{ + overflow-y: hidden; +} + +/* hide copybtn icon on prompts (needed for 'sphinx_copybutton') */ +.prompt a.copybtn { + display: none; +} + +/* Some additional styling taken form the Jupyter notebook CSS */ +div.rendered_html table { + border: none; + border-collapse: collapse; + border-spacing: 0; + color: black; + font-size: 12px; + table-layout: fixed; +} +div.rendered_html thead { + border-bottom: 1px solid black; + vertical-align: bottom; +} +div.rendered_html tr, +div.rendered_html th, +div.rendered_html td { + text-align: right; + vertical-align: middle; + padding: 0.5em 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} +div.rendered_html th { + font-weight: bold; +} +div.rendered_html tbody tr:nth-child(odd) { + background: #f5f5f5; +} +div.rendered_html tbody tr:hover { + background: rgba(66, 165, 245, 0.2); +} + +/* CSS overrides for sphinx_rtd_theme */ + +/* 24px margin */ +.nbinput.nblast.container, +.nboutput.nblast.container { + margin-bottom: 19px; /* padding has already 5px */ +} + +/* ... except between code cells! */ +.nblast.container + .nbinput.container { + margin-top: -19px; +} + +.admonition > p:before { + margin-right: 4px; /* make room for the exclamation icon */ +} + +/* Fix math alignment, see https://github.com/rtfd/sphinx_rtd_theme/pull/686 */ +.math { + text-align: unset; +} +</style> +<div class="section" id="Example-use-case:-Zero-age-stellar-luminosity-function"> +<h1>Example use case: Zero-age stellar luminosity function<a class="headerlink" href="#Example-use-case:-Zero-age-stellar-luminosity-function" title="Permalink to this headline">¶</a></h1> +<p>In this notebook we compute the luminosity function of the zero-age main-sequence by running a population of single stars using binary_c.</p> +<p>We start by loading in some standard Python modules and the binary_c module.</p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[1]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">math</span> +<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> + +<span class="kn">from</span> <span class="nn">binarycpython.utils.functions</span> <span class="kn">import</span> <span class="n">temp_dir</span> +<span class="kn">from</span> <span class="nn">binarycpython.utils.grid</span> <span class="kn">import</span> <span class="n">Population</span> + +<span class="n">TMP_DIR</span> <span class="o">=</span> <span class="n">temp_dir</span><span class="p">(</span><span class="s2">"notebooks"</span><span class="p">,</span> <span class="s2">"notebook_luminosity"</span><span class="p">)</span> + +<span class="c1"># help(Population) # Uncomment this line to see the public functions of this object</span> +</pre></div> +</div> +</div> +<div class="section" id="Setting-up-the-Population-object"> +<h2>Setting up the Population object<a class="headerlink" href="#Setting-up-the-Population-object" title="Permalink to this headline">¶</a></h2> +<p>To set up and configure the population object we need to make a new instance of the <code class="docutils literal notranslate"><span class="pre">Population</span></code> object and configure it with the <code class="docutils literal notranslate"><span class="pre">.set()</span></code> function.</p> +<p>In our case, we only need to set the maximum evolution time to something short, because we care only about zero-age main sequence stars which have, by definition, age zero.</p> +<div class="nbinput docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[2]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># Create population object</span> +<span class="n">population</span> <span class="o">=</span> <span class="n">Population</span><span class="p">()</span> + +<span class="c1"># If you want verbosity, set this before other things</span> +<span class="n">population</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">verbosity</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> + +<span class="c1"># Setting values can be done via .set(<parameter_name>=<value>)</span> +<span class="c1"># Values that are known to be binary_c_parameters are loaded into bse_options.</span> +<span class="c1"># Those that are present in the default grid_options are set in grid_options</span> +<span class="c1"># All other values that you set are put in a custom_options dict</span> +<span class="n">population</span><span class="o">.</span><span class="n">set</span><span class="p">(</span> + <span class="c1"># binary_c physics options</span> + <span class="n">max_evolution_time</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span> <span class="c1"># maximum stellar evolution time in Myr</span> + <span class="n">tmp_dir</span><span class="o">=</span><span class="n">TMP_DIR</span><span class="p">,</span> +<span class="p">)</span> + +<span class="c1"># We can access the options through</span> +<span class="nb">print</span><span class="p">(</span><span class="s2">"verbosity is"</span><span class="p">,</span> <span class="n">population</span><span class="o">.</span><span class="n">grid_options</span><span class="p">[</span><span class="s1">'verbosity'</span><span class="p">])</span> +</pre></div> +</div> +</div> +<div class="nboutput nblast docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +adding: tmp_dir=/tmp/binary_c_python/notebooks/notebook_luminosity to grid_options +adding: max_evolution_time=0.1 to BSE_options +verbosity is 1 +</pre></div></div> +</div> +</div> +<div class="section" id="Adding-grid-variables"> +<h2>Adding grid variables<a class="headerlink" href="#Adding-grid-variables" title="Permalink to this headline">¶</a></h2> +<p>The main purpose of the Population object is to handle the population synthesis side of running a set of stars. The main method to do this with binarycpython, as is the case with Perl binarygrid, is to use grid variables. These are loops over a predefined range of values, where a probability will be assigned to the systems based on the chosen probability distributions.</p> +<p>Usually we use either 1 mass grid variable, or a trio of mass, mass ratio and period (other notebooks cover these examples). We can, however, also add grid sampling for e.g. eccentricity, metallicity or other parameters.</p> +<p>To add a grid variable to the population object we use <code class="docutils literal notranslate"><span class="pre">population.add_grid_variable</span></code></p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[3]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># help(population.add_grid_variable)</span> +</pre></div> +</div> +</div> +<p>All the distribution functions that we can use are stored in the <code class="docutils literal notranslate"><span class="pre">binarycpython.utils.distribution_functions</span></code> or <code class="docutils literal notranslate"><span class="pre">binarycpython/utils/distribution_functions.py</span></code> on git. If you uncomment the help statement below you can see which functions are available now:</p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[4]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="kn">import</span> <span class="nn">binarycpython.utils.distribution_functions</span> +<span class="c1"># help(binarycpython.utils.distribution_functions)</span> +</pre></div> +</div> +</div> +<p>First let us set up some global variables that will be useful throughout. * The resolution is the number of stars we simulate in our model population. * The massrange is a list of the min and max masses * The total_probability is the theoretical integral of a probability density function, i.e. 1.0. * The binwidth sets the resolution of the final distribution. If set to 0.5, the bins in log<em>L</em> are 0.5dex wide.</p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[ ]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># Set resolution and mass range that we simulate</span> +<span class="n">resolution</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"M_1"</span><span class="p">:</span> <span class="mi">40</span><span class="p">}</span> <span class="c1"># start with resolution = 10, and increase later if you want "more accurate" data</span> +<span class="n">massrange</span> <span class="o">=</span> <span class="p">(</span><span class="mf">0.07</span><span class="p">,</span> <span class="mf">100.0</span><span class="p">)</span> <span class="c1"># we work with stars of mass 0.07 to 100 Msun</span> +<span class="n">total_probability</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="c1"># theoretical integral of the mass probability density function over all masses</span> +<span class="c1"># distribution binwidths :</span> +<span class="c1"># (log10) luminosity distribution</span> +<span class="n">binwidth</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'luminosity'</span> <span class="p">:</span> <span class="mf">0.5</span> <span class="p">}</span> +</pre></div> +</div> +</div> +<p>The next cell contains an example of adding the mass grid variable, sampling the phase space in linear mass <em>M</em>_1.</p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[5]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># Mass</span> +<span class="n">population</span> <span class="o">=</span> <span class="n">Population</span><span class="p">()</span> +<span class="n">population</span><span class="o">.</span><span class="n">set</span><span class="p">(</span> + <span class="n">tmp_dir</span><span class="o">=</span><span class="n">TMP_DIR</span><span class="p">,</span> +<span class="p">)</span> +<span class="n">population</span><span class="o">.</span><span class="n">add_grid_variable</span><span class="p">(</span> + <span class="n">name</span><span class="o">=</span><span class="s2">"M_1"</span><span class="p">,</span> + <span class="n">longname</span><span class="o">=</span><span class="s2">"Primary mass"</span><span class="p">,</span> + <span class="n">valuerange</span><span class="o">=</span><span class="n">massrange</span><span class="p">,</span> + <span class="n">resolution</span><span class="o">=</span><span class="s2">"</span><span class="si">{res}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">res</span> <span class="o">=</span> <span class="n">resolution</span><span class="p">[</span><span class="s2">"M_1"</span><span class="p">]),</span> + <span class="n">spacingfunc</span><span class="o">=</span><span class="s2">"const(</span><span class="si">{min}</span><span class="s2">, </span><span class="si">{max}</span><span class="s2">, </span><span class="si">{res}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">min</span> <span class="o">=</span> <span class="n">massrange</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nb">max</span> <span class="o">=</span> <span class="n">massrange</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">res</span> <span class="o">=</span> <span class="n">resolution</span><span class="p">[</span><span class="s2">"M_1"</span><span class="p">]),</span> + <span class="n">probdist</span><span class="o">=</span><span class="s2">"</span><span class="si">{probtot}</span><span class="s2">/(</span><span class="si">{max}</span><span class="s2"> - </span><span class="si">{min}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">probtot</span> <span class="o">=</span> <span class="n">total_probability</span><span class="p">,</span> <span class="nb">min</span> <span class="o">=</span> <span class="n">massrange</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nb">max</span> <span class="o">=</span> <span class="n">massrange</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> <span class="c1"># dprob/dm1 : all stars are equally likely so this is 1.0 / (Mmax - Mmin)</span> + <span class="n">dphasevol</span><span class="o">=</span><span class="s2">"dM_1"</span><span class="p">,</span> + <span class="n">parameter_name</span><span class="o">=</span><span class="s2">"M_1"</span><span class="p">,</span> + <span class="n">condition</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="c1"># Impose a condition on this grid variable. Mostly for a check for yourself</span> +<span class="p">)</span> +</pre></div> +</div> +</div> +</div> +<div class="section" id="Setting-logging-and-handling-the-output"> +<h2>Setting logging and handling the output<a class="headerlink" href="#Setting-logging-and-handling-the-output" title="Permalink to this headline">¶</a></h2> +<p>By default, binary_c will not output anything (except for ‘SINGLE STAR LIFETIME’). It is up to us to determine what will be printed. We can either do that by hardcoding the print statements into <code class="docutils literal notranslate"><span class="pre">binary_c</span></code> (see documentation binary_c) or we can use the custom logging functionality of binarycpython (see notebook <code class="docutils literal notranslate"><span class="pre">notebook_custom_logging.ipynb</span></code>), which is faster to set up and requires no recompilation of binary_c, but is somewhat more limited in its functionality. For our current purposes, +it works perfectly well.</p> +<p>After configuring what will be printed, we need to make a function to parse the output. This can be done by setting the parse_function parameter in the population object (see also notebook <code class="docutils literal notranslate"><span class="pre">notebook_individual_systems.ipynb</span></code>).</p> +<p>In the code below we will set up both the custom logging and a parse function to handle that output.</p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[18]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># Create custom logging statement</span> +<span class="c1">#</span> +<span class="c1"># we check that the model number is zero, i.e. we're on the first timestep (stars are born on the ZAMS)</span> +<span class="c1"># we make sure that the stellar type is <= MAIN_SEQUENCE, i.e. the star is a main-sequence star</span> +<span class="c1"># we also check that the time is 0.0 (this is not strictly required, but good to show how it is done)</span> +<span class="c1">#</span> +<span class="c1"># The Printf statement does the outputting: note that the header string is ZERO_AGE_MAIN_SEQUENCE_STAR</span> + +<span class="n">custom_logging_statement</span> <span class="o">=</span> <span class="s2">"""</span> +<span class="s2">if(stardata->model.model_number == 0 &&</span> +<span class="s2"> stardata->star[0].stellar_type <= MAIN_SEQUENCE &&</span> +<span class="s2"> stardata->model.time == 0)</span> +<span class="s2">{</span> +<span class="s2"> /* Note that we use Printf - with a capital P! */</span> +<span class="s2"> Printf("ZERO_AGE_MAIN_SEQUENCE_STAR </span><span class="si">%30.12e</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="s2"> </span><span class="si">%g</span><span class="se">\\</span><span class="s2">n",</span> +<span class="s2"> stardata->model.time, // 1</span> +<span class="s2"> stardata->common.zero_age.mass[0], // 2</span> +<span class="s2"> stardata->star[0].mass, // 3</span> +<span class="s2"> stardata->star[0].luminosity, // 4</span> +<span class="s2"> stardata->model.probability // 5</span> +<span class="s2"> );</span> +<span class="s2">};</span> +<span class="s2">"""</span> + +<span class="n">population</span><span class="o">.</span><span class="n">set</span><span class="p">(</span> + <span class="n">C_logging_code</span><span class="o">=</span><span class="n">custom_logging_statement</span> +<span class="p">)</span> + +</pre></div> +</div> +</div> +<p>The parse function must now catch lines that start with “ZERO_AGE_MAIN_SEQUENCE_STAR†and process the associated data.</p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[7]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># import the bin_data function so we can construct finite-resolution probability distributions</span> +<span class="c1"># import the datalinedict to make a dictionary from each line of data from binary_c</span> +<span class="kn">from</span> <span class="nn">binarycpython.utils.functions</span> <span class="kn">import</span> <span class="n">bin_data</span><span class="p">,</span><span class="n">datalinedict</span> + +<span class="k">def</span> <span class="nf">parse_function</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output</span><span class="p">):</span> + <span class="sd">"""</span> +<span class="sd"> Example parse function</span> +<span class="sd"> """</span> + + <span class="c1"># list of the data items</span> + <span class="n">parameters</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"header"</span><span class="p">,</span> <span class="s2">"time"</span><span class="p">,</span> <span class="s2">"zams_mass"</span><span class="p">,</span> <span class="s2">"mass"</span><span class="p">,</span> <span class="s2">"luminosity"</span><span class="p">,</span> <span class="s2">"probability"</span><span class="p">]</span> + + <span class="c1"># Loop over the output.</span> + <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">output</span><span class="o">.</span><span class="n">splitlines</span><span class="p">():</span> + <span class="c1"># obtain the line of data in dictionary form</span> + <span class="n">linedata</span> <span class="o">=</span> <span class="n">datalinedict</span><span class="p">(</span><span class="n">line</span><span class="p">,</span><span class="n">parameters</span><span class="p">)</span> + + <span class="c1"># Check the header and act accordingly</span> + <span class="k">if</span> <span class="n">linedata</span><span class="p">[</span><span class="s1">'header'</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"ZERO_AGE_MAIN_SEQUENCE_STAR"</span><span class="p">:</span> + + <span class="c1"># bin the log10(luminosity) to the nearest 0.1dex</span> + <span class="n">binned_log_luminosity</span> <span class="o">=</span> <span class="n">bin_data</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">log10</span><span class="p">(</span><span class="n">linedata</span><span class="p">[</span><span class="s1">'luminosity'</span><span class="p">]),</span> + <span class="n">binwidth</span><span class="p">[</span><span class="s1">'luminosity'</span><span class="p">])</span> + + <span class="c1"># append the data to the results_dictionary</span> + <span class="bp">self</span><span class="o">.</span><span class="n">grid_results</span><span class="p">[</span><span class="s1">'luminosity distribution'</span><span class="p">][</span><span class="n">binned_log_luminosity</span><span class="p">]</span> <span class="o">+=</span> <span class="n">linedata</span><span class="p">[</span><span class="s1">'probability'</span><span class="p">]</span> + + <span class="c1">#print (self.grid_results)</span> + + <span class="c1"># verbose reporting</span> + <span class="c1">#print("parse out results_dictionary=",self.grid_results)</span> + +<span class="c1"># Add the parsing function</span> +<span class="n">population</span><span class="o">.</span><span class="n">set</span><span class="p">(</span> + <span class="n">parse_function</span><span class="o">=</span><span class="n">parse_function</span><span class="p">,</span> +<span class="p">)</span> +</pre></div> +</div> +</div> +</div> +<div class="section" id="Evolving-the-grid"> +<h2>Evolving the grid<a class="headerlink" href="#Evolving-the-grid" title="Permalink to this headline">¶</a></h2> +<p>Now that we configured all the main parts of the population object, we can actually run the population! Doing this is straightforward: <code class="docutils literal notranslate"><span class="pre">population.evolve()</span></code></p> +<p>This will start up the processing of all the systems. We can control how many cores are used by settings <code class="docutils literal notranslate"><span class="pre">amt_cores</span></code>. By setting the <code class="docutils literal notranslate"><span class="pre">verbosity</span></code> of the population object to a higher value we can get a lot of verbose information about the run, but for now we will set it to 0.</p> +<p>There are many grid_options that can lead to different behaviour of the evolution of the grid. Please do have a look at those: <a class="reference external" href="https://ri0005.pages.surrey.ac.uk/binary_c-python/grid_options_descriptions.html">grid options docs</a>, and try</p> +<div class="nbinput docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[8]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># set number of threads</span> +<span class="n">population</span><span class="o">.</span><span class="n">set</span><span class="p">(</span> + <span class="c1"># verbose output is not required</span> + <span class="n">verbosity</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> + <span class="c1"># set number of threads (i.e. number of CPU cores we use)</span> + <span class="n">amt_cores</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> + <span class="p">)</span> + +<span class="c1"># Evolve the population - this is the slow, number-crunching step</span> +<span class="n">analytics</span> <span class="o">=</span> <span class="n">population</span><span class="o">.</span><span class="n">evolve</span><span class="p">()</span> + +<span class="c1"># Show the results (debugging)</span> +<span class="c1"># print (population.grid_results)</span> +</pre></div> +</div> +</div> +<div class="nboutput nblast docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +Generating grid code +Constructing/adding: M_1 +Grid has handled 40 stars +with a total probability of 1.0000000000000004 +Total starcount for this run will be: 40 +Generating grid code +Constructing/adding: M_1 +Population-08f8230453084e4ca6a2391d45ce658b finished! The total probability was: 1.0000000000000002. It took a total of 1.5262682437896729s to run 40 systems on 2 cores +There were no errors found in this run. +OrderedDict([('luminosity distribution', OrderedDict([(2.25, 0.025), (3.75, 0.05), (4.25, 0.05), (0.25, 0.025), (3.25, 0.025), (5.25, 0.2), (4.75, 0.1), (5.75, 0.39999999999999997), (6.25, 0.125)]))]) +</pre></div></div> +</div> +<p>After the run is complete, some technical report on the run is returned. I stored that in <code class="docutils literal notranslate"><span class="pre">analytics</span></code>. As we can see below, this dictionary is like a status report of the evolution. Useful for e.g. debugging.</p> +<div class="nbinput docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[9]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="nb">print</span><span class="p">(</span><span class="n">analytics</span><span class="p">)</span> +</pre></div> +</div> +</div> +<div class="nboutput nblast docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +{'population_name': '08f8230453084e4ca6a2391d45ce658b', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 1.0000000000000002, 'total_count': 40, 'start_timestamp': 1631124829.303065, 'end_timestamp': 1631124830.8293333, 'total_mass_run': 2001.4, 'total_probability_weighted_mass_run': 50.035000000000004, 'zero_prob_stars_skipped': 0} +</pre></div></div> +</div> +<div class="nbinput docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[10]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># make a plot of the luminosity distribution using Seaborn and Pandas</span> +<span class="kn">import</span> <span class="nn">seaborn</span> <span class="k">as</span> <span class="nn">sns</span> +<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> +<span class="kn">from</span> <span class="nn">binarycpython.utils.functions</span> <span class="kn">import</span> <span class="n">pad_output_distribution</span> + +<span class="c1"># set the figure size (for a Jupyter notebook in a web browser)</span> +<span class="n">sns</span><span class="o">.</span><span class="n">set</span><span class="p">(</span> <span class="n">rc</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'figure.figsize'</span><span class="p">:(</span><span class="mi">20</span><span class="p">,</span><span class="mi">10</span><span class="p">)}</span> <span class="p">)</span> + +<span class="c1"># this saves a lot of typing!</span> +<span class="n">ldist</span> <span class="o">=</span> <span class="n">population</span><span class="o">.</span><span class="n">grid_results</span><span class="p">[</span><span class="s1">'luminosity distribution'</span><span class="p">]</span> + +<span class="c1"># pad the distribution with zeros where data is missing</span> +<span class="n">pad_output_distribution</span><span class="p">(</span><span class="n">ldist</span><span class="p">,</span> + <span class="n">binwidth</span><span class="p">[</span><span class="s1">'luminosity'</span><span class="p">])</span> + +<span class="c1"># make pandas dataframe from our sorted dictionary of data</span> +<span class="n">plot_data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">({</span><span class="s1">'ZAMS luminosity distribution'</span> <span class="p">:</span> <span class="n">ldist</span><span class="p">})</span> + +<span class="c1"># make the plot</span> +<span class="n">p</span> <span class="o">=</span> <span class="n">sns</span><span class="o">.</span><span class="n">lineplot</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">plot_data</span><span class="p">)</span> +<span class="n">p</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s2">"$\log_</span><span class="si">{10}</span><span class="s2">$ ($L_\mathrm</span><span class="si">{ZAMS}</span><span class="s2">$ / L$_{☉}$)"</span><span class="p">)</span> +<span class="n">p</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s2">"Number of stars"</span><span class="p">)</span> +<span class="n">p</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">yscale</span><span class="o">=</span><span class="s2">"log"</span><span class="p">)</span> +</pre></div> +</div> +</div> +<div class="nboutput docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[10]: +</pre></div> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +[None] +</pre></div></div> +</div> +<div class="nboutput nblast docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<img alt="_images/notebook_luminosity_function_single_20_1.png" src="_images/notebook_luminosity_function_single_20_1.png" /> +</div> +</div> +<p>Does this look like a reasonable stellar luminosity function to you? The implication is that the most likely stellar luminosity is 105.8 L☉! Clearly, this is not very realistic… let’s see what went wrong.</p> +</div> +<div class="section" id="ZAMS-Luminosity-distribution-with-the-initial-mass-function"> +<h2>ZAMS Luminosity distribution with the initial mass function<a class="headerlink" href="#ZAMS-Luminosity-distribution-with-the-initial-mass-function" title="Permalink to this headline">¶</a></h2> +<p>In the previous example, all the stars in our grid had an equal weighting. This is very unlikely to be true in reality: indeed, we know that low mass stars are far more likely than high mass stars. So we now include an initial mass function as a three-part power law based on Kroupa (2001). Kroupa’s distribution is a three-part power law: we have a function that does this for us (it’s very common to use power laws in astrophysics).</p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[11]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># Update the probability distribution to use the three-part power law IMF</span> +<span class="n">population</span><span class="o">.</span><span class="n">update_grid_variable</span><span class="p">(</span> + <span class="n">name</span><span class="o">=</span><span class="s2">"M_1"</span><span class="p">,</span> + <span class="n">probdist</span><span class="o">=</span><span class="s2">"three_part_powerlaw(M_1, 0.1, 0.5, 1.0, 150, -1.3, -2.3, -2.3)"</span><span class="p">,</span> +<span class="p">)</span> +</pre></div> +</div> +</div> +<div class="nbinput docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[12]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># Clean and re-evolve the population</span> +<span class="n">population</span><span class="o">.</span><span class="n">clean</span><span class="p">()</span> +<span class="n">analytics</span> <span class="o">=</span> <span class="n">population</span><span class="o">.</span><span class="n">evolve</span><span class="p">()</span> + +<span class="c1"># Show the results (debugging)</span> +<span class="c1"># print (population.grid_results)</span> +</pre></div> +</div> +</div> +<div class="nboutput nblast docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +Generating grid code +Constructing/adding: M_1 +Grid has handled 40 stars +with a total probability of 0.2182216189410787 +Total starcount for this run will be: 40 +Generating grid code +Constructing/adding: M_1 +Population-92de7c9221c54206ab4dd10e58e09a34 finished! The total probability was: 0.21822161894107872. It took a total of 1.5900418758392334s to run 40 systems on 2 cores +There were no errors found in this run. +OrderedDict([('luminosity distribution', OrderedDict([(2.25, 0.0164166), (3.25, 0.00515685), (0.25, 0.189097), (3.75, 0.0037453900000000004), (4.25, 0.0014346559999999999), (5.25, 0.0007493004), (4.75, 0.001171479), (5.75, 0.00039801020000000003), (6.25, 5.2369339999999996e-05)]))]) +</pre></div></div> +</div> +<div class="nbinput docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[13]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># plot luminosity distribution</span> +<span class="n">ldist</span> <span class="o">=</span> <span class="n">population</span><span class="o">.</span><span class="n">grid_results</span><span class="p">[</span><span class="s1">'luminosity distribution'</span><span class="p">]</span> + +<span class="c1"># pad the distribution with zeros where data is missing</span> +<span class="n">pad_output_distribution</span><span class="p">(</span><span class="n">ldist</span><span class="p">,</span> + <span class="n">binwidth</span><span class="p">[</span><span class="s1">'luminosity'</span><span class="p">])</span> + +<span class="c1"># make pandas dataframe from our sorted dictionary of data</span> +<span class="n">plot_data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">({</span><span class="s1">'ZAMS luminosity distribution'</span> <span class="p">:</span> <span class="n">ldist</span><span class="p">})</span> + +<span class="c1"># make the plot</span> +<span class="n">p</span> <span class="o">=</span> <span class="n">sns</span><span class="o">.</span><span class="n">lineplot</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">plot_data</span><span class="p">)</span> +<span class="n">p</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s2">"$\log_</span><span class="si">{10}</span><span class="s2">$ ($L_\mathrm</span><span class="si">{ZAMS}</span><span class="s2">$ / L$_{☉}$)"</span><span class="p">)</span> +<span class="n">p</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s2">"Number of stars"</span><span class="p">)</span> +<span class="n">p</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">yscale</span><span class="o">=</span><span class="s2">"log"</span><span class="p">)</span> +</pre></div> +</div> +</div> +<div class="nboutput docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[13]: +</pre></div> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +[None] +</pre></div></div> +</div> +<div class="nboutput nblast docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<img alt="_images/notebook_luminosity_function_single_26_1.png" src="_images/notebook_luminosity_function_single_26_1.png" /> +</div> +</div> +<p>This distribution is peaked at low luminosity, as one expects from observations, but the resolution is clearly not great because it’s not smooth - it’s spiky!</p> +<p>If you noticed above, the total probability of the grid was about 0.2. Given that the total probability of a probability distribution function should be 1.0, this shows that our sampling is (very) poor.</p> +<p>We could simply increase the resolution to compensate, but this is very CPU intensive and a complete waste of time and resources. Instead, let’s try sampling the masses of the stars in a smarter way.</p> +</div> +</div> +<div class="section" id="A-better-sampled-grid"> +<h1>A better-sampled grid<a class="headerlink" href="#A-better-sampled-grid" title="Permalink to this headline">¶</a></h1> +<p>The IMF has many more low-mass stars than high-mass stars. So, instead of sampling M1 linearly, we can sample it in log space.</p> +<p>To do this we first rename the mass grid variable so that it is clear we are working in (natural) logarithmic phase space.</p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[14]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># Rename the old variable (M_1) because we want it to be called lnM_1 now</span> +<span class="n">population</span><span class="o">.</span><span class="n">rename_grid_variable</span><span class="p">(</span><span class="s2">"M_1"</span><span class="p">,</span><span class="s2">"lnM_1"</span><span class="p">)</span> +</pre></div> +</div> +</div> +<p>Next, we change the spacing function so that it works in the log space. We also adapt the probability calculation so that it calculates dprob/dlnM = M * dprob/dM. Finally, we set the precode to compute M_1 because binary_c requires the actual mass, not the logarithm of the mass.</p> +<div class="nbinput nblast docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[15]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># update the sampling, note that the IMF is dprob/dM1, and the phase</span> +<span class="c1"># space is now sampled in lnM1, so we multiply by M_1 to</span> +<span class="c1"># because M * dprob/dM = dprob/dlnM</span> +<span class="n">population</span><span class="o">.</span><span class="n">update_grid_variable</span><span class="p">(</span> + <span class="n">name</span><span class="o">=</span><span class="s2">"lnM_1"</span><span class="p">,</span> + <span class="n">spacingfunc</span><span class="o">=</span><span class="s2">"const(math.log(</span><span class="si">{min}</span><span class="s2">), math.log(</span><span class="si">{max}</span><span class="s2">), </span><span class="si">{res}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">min</span> <span class="o">=</span> <span class="n">massrange</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nb">max</span> <span class="o">=</span> <span class="n">massrange</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">res</span> <span class="o">=</span> <span class="n">resolution</span><span class="p">[</span><span class="s2">"M_1"</span><span class="p">]),</span> + <span class="n">probdist</span><span class="o">=</span><span class="s2">"three_part_powerlaw(M_1, 0.1, 0.5, 1.0, 150, -1.3, -2.3, -2.3)*M_1"</span><span class="p">,</span> + <span class="n">dphasevol</span><span class="o">=</span><span class="s2">"dlnM_1"</span><span class="p">,</span> + <span class="n">parameter_name</span><span class="o">=</span><span class="s2">"M_1"</span><span class="p">,</span> + <span class="n">precode</span><span class="o">=</span><span class="s2">"M_1=math.exp(lnM_1)"</span><span class="p">,</span> +<span class="p">)</span> +<span class="c1"># print(population.grid_options["_grid_variables"]) # debugging</span> +</pre></div> +</div> +</div> +<div class="nbinput docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[16]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># Clean and re-evolve the population</span> +<span class="n">population</span><span class="o">.</span><span class="n">clean</span><span class="p">()</span> +<span class="n">analytics</span> <span class="o">=</span> <span class="n">population</span><span class="o">.</span><span class="n">evolve</span><span class="p">()</span> + +<span class="c1"># Show the results (debugging)</span> +<span class="c1"># print (population.grid_results)</span> +</pre></div> +</div> +</div> +<div class="nboutput nblast docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<div class="highlight"><pre> +Generating grid code +Constructing/adding: lnM_1 +Grid has handled 40 stars +with a total probability of 0.9956307907476224 +Total starcount for this run will be: 40 +Generating grid code +Constructing/adding: lnM_1 +Population-83f80d829dbd418aa2bc745c99b71991 finished! The total probability was: 0.9956307907476224. It took a total of 0.9961590766906738s to run 40 systems on 2 cores +There were no errors found in this run. +OrderedDict([('luminosity distribution', OrderedDict([(0.25, 0.0212294), (2.75, 0.00321118), (-0.25, 0.0268827), (1.25, 0.0104553), (3.75, 0.00283037), (6.25, 7.34708e-05), (-0.75, 0.0771478), (0.75, 0.030004499999999996), (2.25, 0.00921541), (3.25, 0.0045385), (1.75, 0.014776889999999999), (4.25, 0.002380189), (4.75, 0.000869303), (5.25, 0.0007310379999999999), (5.75, 0.00036002859999999996), (-2.75, 0.1961345), (-1.75, 0.2181597), (-3.25, 0.0), (-2.25, 0.2568974), (-1.25, 0.11973310000000001)]))]) +</pre></div></div> +</div> +<p>You should see that the total probability is very close to 1.0, as you would expect for a well-sampled grid. The total will never be exactly 1.0, but that is because we are running a simulation, not a perfect copy of reality.</p> +<div class="nbinput docutils container"> +<div class="prompt highlight-none notranslate"><div class="highlight"><pre><span></span>[17]: +</pre></div> +</div> +<div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> +<span></span><span class="c1"># plot luminosity distribution</span> +<span class="n">ldist</span> <span class="o">=</span> <span class="n">population</span><span class="o">.</span><span class="n">grid_results</span><span class="p">[</span><span class="s1">'luminosity distribution'</span><span class="p">]</span> + +<span class="c1"># pad the distribution with zeros where data is missing</span> +<span class="n">pad_output_distribution</span><span class="p">(</span><span class="n">ldist</span><span class="p">,</span> + <span class="n">binwidth</span><span class="p">[</span><span class="s1">'luminosity'</span><span class="p">])</span> + +<span class="c1"># make pandas dataframe from our sorted dictionary of data</span> +<span class="n">plot_data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_dict</span><span class="p">({</span><span class="s1">'ZAMS luminosity distribution'</span> <span class="p">:</span> <span class="n">ldist</span><span class="p">})</span> + +<span class="c1"># make the plot</span> +<span class="n">p</span> <span class="o">=</span> <span class="n">sns</span><span class="o">.</span><span class="n">lineplot</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">plot_data</span><span class="p">)</span> +<span class="n">p</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s2">"$\log_</span><span class="si">{10}</span><span class="s2">$ ($L_\mathrm</span><span class="si">{ZAMS}</span><span class="s2">$ / L$_{☉}$)"</span><span class="p">)</span> +<span class="n">p</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s2">"Number of stars"</span><span class="p">)</span> +<span class="n">p</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">yscale</span><span class="o">=</span><span class="s2">"log"</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span> +</pre></div> +</div> +</div> +<div class="nboutput nblast docutils container"> +<div class="prompt empty docutils container"> +</div> +<div class="output_area docutils container"> +<img alt="_images/notebook_luminosity_function_single_34_0.png" src="_images/notebook_luminosity_function_single_34_0.png" /> +</div> +</div> +<p>Most stars are low mass red dwarfs, with small luminosities. Without the IMF weighting, our model population would have got this completely wrong!</p> +<p>As you increase the resolution, you will see this curve becomes even smoother. The wiggles in the curve are (usually) sampling artefacts because the curve should monotonically brighten above about log(<em>L</em>/L☉)=-2.</p> +<p>Remember you can play with the binwidth too. If you want a very accurate distribution you need a narrow binwidth, but then you’ll also need high resolution (lots of stars) so lots of CPU time, hence cost, CO2, etc.</p> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="notebook_luminosity_function_binaries.html" class="btn btn-neutral float-right" title="Zero-age stellar luminosity function in binaries" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="notebook_api_functionality.html" class="btn btn-neutral float-left" title="Using the API functionality of binarycpython" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + + © Copyright 2021, David Hendriks, Robert Izzard + + </p> + </div> + + + + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a + + <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> + + provided by <a href="https://readthedocs.org">Read the Docs</a>. +<br><br> +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +<br><br> +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. + + + +</footer> + + </div> + </div> + + </section> + + </div> + + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + + + + + + +</body> +</html> \ No newline at end of file diff --git a/docs/build/html/notebook_luminosity_function_single.ipynb b/docs/build/html/notebook_luminosity_function_single.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..fb971b34a58887a38066f2dbb3d056ff4c5dc5b6 --- /dev/null +++ b/docs/build/html/notebook_luminosity_function_single.ipynb @@ -0,0 +1,716 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bbbaafbb-fd7d-4b73-a970-93506ba35d71", + "metadata": { + "tags": [] + }, + "source": [ + "# Example use case: Zero-age stellar luminosity function\n", + "\n", + "In this notebook we compute the luminosity function of the zero-age main-sequence by running a population of single stars using binary_c. \n", + "\n", + "We start by loading in some standard Python modules and the binary_c module.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bf6b8673-a2b5-4b50-ad1b-e90671f57470", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import math\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from binarycpython.utils.functions import temp_dir\n", + "from binarycpython.utils.grid import Population\n", + "\n", + "TMP_DIR = temp_dir(\"notebooks\", \"notebook_luminosity\")\n", + "\n", + "# help(Population) # Uncomment this line to see the public functions of this object" + ] + }, + { + "cell_type": "markdown", + "id": "f268eff3-4e08-4f6b-8b59-f22dba4d2074", + "metadata": {}, + "source": [ + "## Setting up the Population object\n", + "To set up and configure the population object we need to make a new instance of the `Population` object and configure it with the `.set()` function.\n", + "\n", + "In our case, we only need to set the maximum evolution time to something short, because we care only about zero-age main sequence stars which have, by definition, age zero." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "79ab50b7-591f-4883-af09-116d1835a751", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "adding: tmp_dir=/tmp/binary_c_python/notebooks/notebook_luminosity to grid_options\n", + "adding: max_evolution_time=0.1 to BSE_options\n", + "verbosity is 1\n" + ] + } + ], + "source": [ + "# Create population object\n", + "population = Population()\n", + "\n", + "# If you want verbosity, set this before other things\n", + "population.set(verbosity=1)\n", + "\n", + "# Setting values can be done via .set(<parameter_name>=<value>)\n", + "# Values that are known to be binary_c_parameters are loaded into bse_options.\n", + "# Those that are present in the default grid_options are set in grid_options\n", + "# All other values that you set are put in a custom_options dict\n", + "population.set(\n", + " # binary_c physics options\n", + " max_evolution_time=0.1, # maximum stellar evolution time in Myr\n", + " tmp_dir=TMP_DIR,\n", + ")\n", + "\n", + "# We can access the options through \n", + "print(\"verbosity is\", population.grid_options['verbosity'])" + ] + }, + { + "cell_type": "markdown", + "id": "f9a65554-36ab-4a04-96ca-9f1422c307fd", + "metadata": {}, + "source": [ + "## Adding grid variables\n", + "The main purpose of the Population object is to handle the population synthesis side of running a set of stars. The main method to do this with binarycpython, as is the case with Perl binarygrid, is to use grid variables. These are loops over a predefined range of values, where a probability will be assigned to the systems based on the chosen probability distributions.\n", + "\n", + "Usually we use either 1 mass grid variable, or a trio of mass, mass ratio and period (other notebooks cover these examples). We can, however, also add grid sampling for e.g. eccentricity, metallicity or other parameters. \n", + "\n", + "To add a grid variable to the population object we use `population.add_grid_variable`" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "68c84521-9ae8-4020-af7a-5334173db969", + "metadata": {}, + "outputs": [], + "source": [ + "# help(population.add_grid_variable)" + ] + }, + { + "cell_type": "markdown", + "id": "bd75cebe-2152-4025-b680-dc020b80889b", + "metadata": {}, + "source": [ + "All the distribution functions that we can use are stored in the `binarycpython.utils.distribution_functions` or `binarycpython/utils/distribution_functions.py` on git. If you uncomment the help statement below you can see which functions are available now:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "048db541-3e92-4c5d-a25c-9c5a34b9c857", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "import binarycpython.utils.distribution_functions\n", + "# help(binarycpython.utils.distribution_functions)" + ] + }, + { + "cell_type": "markdown", + "id": "2a9104fc-4136-4e53-8604-f24ad52fbe56", + "metadata": {}, + "source": [ + "First let us set up some global variables that will be useful throughout. \n", + "* The resolution is the number of stars we simulate in our model population.\n", + "* The massrange is a list of the min and max masses\n", + "* The total_probability is the theoretical integral of a probability density function, i.e. 1.0.\n", + "* The binwidth sets the resolution of the final distribution. If set to 0.5, the bins in log*L* are 0.5dex wide." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aba3fe4e-18f2-4bb9-8e5c-4c6007ab038b", + "metadata": {}, + "outputs": [], + "source": [ + "# Set resolution and mass range that we simulate\n", + "resolution = {\"M_1\": 40} # start with resolution = 10, and increase later if you want \"more accurate\" data\n", + "massrange = (0.07, 100.0) # we work with stars of mass 0.07 to 100 Msun\n", + "total_probability = 1.0 # theoretical integral of the mass probability density function over all masses \n", + "# distribution binwidths : \n", + "# (log10) luminosity distribution\n", + "binwidth = { 'luminosity' : 0.5 }" + ] + }, + { + "cell_type": "markdown", + "id": "1b3a007b-5c17-42a7-a981-7e268e6f545c", + "metadata": {}, + "source": [ + "The next cell contains an example of adding the mass grid variable, sampling the phase space in linear mass *M*_1." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "47979841-2c26-4b26-8945-603d013dc93a", + "metadata": {}, + "outputs": [], + "source": [ + "# Mass\n", + "population = Population()\n", + "population.set(\n", + " tmp_dir=TMP_DIR,\n", + ")\n", + "population.add_grid_variable(\n", + " name=\"M_1\",\n", + " longname=\"Primary mass\",\n", + " valuerange=massrange,\n", + " resolution=\"{res}\".format(res = resolution[\"M_1\"]),\n", + " spacingfunc=\"const({min}, {max}, {res})\".format(min = massrange[0], max = massrange[1], res = resolution[\"M_1\"]),\n", + " probdist=\"{probtot}/({max} - {min})\".format(probtot = total_probability, min = massrange[0], max = massrange[1]), # dprob/dm1 : all stars are equally likely so this is 1.0 / (Mmax - Mmin)\n", + " dphasevol=\"dM_1\",\n", + " parameter_name=\"M_1\",\n", + " condition=\"\", # Impose a condition on this grid variable. Mostly for a check for yourself\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "163f13ae-fec1-4ee8-b9d4-c1b75c19ff39", + "metadata": {}, + "source": [ + "## Setting logging and handling the output\n", + "By default, binary_c will not output anything (except for 'SINGLE STAR LIFETIME'). It is up to us to determine what will be printed. We can either do that by hardcoding the print statements into `binary_c` (see documentation binary_c) or we can use the custom logging functionality of binarycpython (see notebook `notebook_custom_logging.ipynb`), which is faster to set up and requires no recompilation of binary_c, but is somewhat more limited in its functionality. For our current purposes, it works perfectly well.\n", + "\n", + "After configuring what will be printed, we need to make a function to parse the output. This can be done by setting the parse_function parameter in the population object (see also notebook `notebook_individual_systems.ipynb`). \n", + "\n", + "In the code below we will set up both the custom logging and a parse function to handle that output." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "0c986215-93b1-4e30-ad79-f7c397e9ff7d", + "metadata": {}, + "outputs": [], + "source": [ + "# Create custom logging statement\n", + "#\n", + "# we check that the model number is zero, i.e. we're on the first timestep (stars are born on the ZAMS)\n", + "# we make sure that the stellar type is <= MAIN_SEQUENCE, i.e. the star is a main-sequence star\n", + "# we also check that the time is 0.0 (this is not strictly required, but good to show how it is done)\n", + "#\n", + "# The Printf statement does the outputting: note that the header string is ZERO_AGE_MAIN_SEQUENCE_STAR\n", + "\n", + "custom_logging_statement = \"\"\"\n", + "if(stardata->model.model_number == 0 &&\n", + " stardata->star[0].stellar_type <= MAIN_SEQUENCE &&\n", + " stardata->model.time == 0)\n", + "{\n", + " /* Note that we use Printf - with a capital P! */\n", + " Printf(\"ZERO_AGE_MAIN_SEQUENCE_STAR %30.12e %g %g %g %g\\\\n\",\n", + " stardata->model.time, // 1\n", + " stardata->common.zero_age.mass[0], // 2\n", + " stardata->star[0].mass, // 3\n", + " stardata->star[0].luminosity, // 4\n", + " stardata->model.probability // 5\n", + " );\n", + "};\n", + "\"\"\"\n", + "\n", + "population.set(\n", + " C_logging_code=custom_logging_statement\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "ae1f1f0c-1f8b-42d8-b051-cbf8c6b51514", + "metadata": {}, + "source": [ + "The parse function must now catch lines that start with \"ZERO_AGE_MAIN_SEQUENCE_STAR\" and process the associated data." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "fd197154-a8ce-4865-8929-008d3483101a", + "metadata": {}, + "outputs": [], + "source": [ + "# import the bin_data function so we can construct finite-resolution probability distributions\n", + "# import the datalinedict to make a dictionary from each line of data from binary_c\n", + "from binarycpython.utils.functions import bin_data,datalinedict\n", + "\n", + "def parse_function(self, output):\n", + " \"\"\"\n", + " Example parse function\n", + " \"\"\"\n", + " \n", + " # list of the data items\n", + " parameters = [\"header\", \"time\", \"zams_mass\", \"mass\", \"luminosity\", \"probability\"]\n", + " \n", + " # Loop over the output.\n", + " for line in output.splitlines():\n", + " # obtain the line of data in dictionary form \n", + " linedata = datalinedict(line,parameters)\n", + " \n", + " # Check the header and act accordingly\n", + " if linedata['header'] == \"ZERO_AGE_MAIN_SEQUENCE_STAR\":\n", + " \n", + " # bin the log10(luminosity) to the nearest 0.1dex\n", + " binned_log_luminosity = bin_data(math.log10(linedata['luminosity']),\n", + " binwidth['luminosity'])\n", + " \n", + " # append the data to the results_dictionary \n", + " self.grid_results['luminosity distribution'][binned_log_luminosity] += linedata['probability'] \n", + " \n", + " #print (self.grid_results)\n", + " \n", + " # verbose reporting\n", + " #print(\"parse out results_dictionary=\",self.grid_results)\n", + " \n", + "# Add the parsing function\n", + "population.set(\n", + " parse_function=parse_function,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "91509ce5-ffe7-4937-aa87-6d7baac9ac04", + "metadata": {}, + "source": [ + "## Evolving the grid\n", + "Now that we configured all the main parts of the population object, we can actually run the population! Doing this is straightforward: `population.evolve()`\n", + "\n", + "This will start up the processing of all the systems. We can control how many cores are used by settings `amt_cores`. By setting the `verbosity` of the population object to a higher value we can get a lot of verbose information about the run, but for now we will set it to 0.\n", + "\n", + "There are many grid_options that can lead to different behaviour of the evolution of the grid. Please do have a look at those: [grid options docs](https://ri0005.pages.surrey.ac.uk/binary_c-python/grid_options_descriptions.html), and try " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8ea376c1-1e92-45af-8cab-9d7fdca564eb", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Grid has handled 40 stars\n", + "with a total probability of 1.0000000000000004\n", + "Total starcount for this run will be: 40\n", + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Population-08f8230453084e4ca6a2391d45ce658b finished! The total probability was: 1.0000000000000002. It took a total of 1.5262682437896729s to run 40 systems on 2 cores\n", + "There were no errors found in this run.\n", + "OrderedDict([('luminosity distribution', OrderedDict([(2.25, 0.025), (3.75, 0.05), (4.25, 0.05), (0.25, 0.025), (3.25, 0.025), (5.25, 0.2), (4.75, 0.1), (5.75, 0.39999999999999997), (6.25, 0.125)]))])\n" + ] + } + ], + "source": [ + "# set number of threads\n", + "population.set(\n", + " # verbose output is not required \n", + " verbosity=0,\n", + " # set number of threads (i.e. number of CPU cores we use)\n", + " amt_cores=2,\n", + " )\n", + "\n", + "# Evolve the population - this is the slow, number-crunching step\n", + "analytics = population.evolve() \n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "markdown", + "id": "91ab45c7-7d31-4543-aee4-127ab58e891f", + "metadata": {}, + "source": [ + "After the run is complete, some technical report on the run is returned. I stored that in `analytics`. As we can see below, this dictionary is like a status report of the evolution. Useful for e.g. debugging." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e1f0464b-0424-4022-b34b-5b744bc2c59d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'population_name': '08f8230453084e4ca6a2391d45ce658b', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 1.0000000000000002, 'total_count': 40, 'start_timestamp': 1631124829.303065, 'end_timestamp': 1631124830.8293333, 'total_mass_run': 2001.4, 'total_probability_weighted_mass_run': 50.035000000000004, 'zero_prob_stars_skipped': 0}\n" + ] + } + ], + "source": [ + "print(analytics)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "05c6d132-abee-423e-b1a8-2039c8996fbc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[None]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJcAAAJWCAYAAADlbWbDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABhMklEQVR4nO3dd3jV9cH//9c5J3tB5gkQRiYQlA1hyA6ooOJAWbd22arV27vetnbI3dr2tq3a8VN737XTfltFRBQVdwAB2XvIygACYWRD9jrn8/vDmt4UMBCSvM94Pq7L6zLnnJzzJB5j8vJ8PsdmWZYlAAAAAAAAoB3spgMAAAAAAADgvRiXAAAAAAAA0G6MSwAAAAAAAGg3xiUAAAAAAAC0G+MSAAAAAAAA2o1xCQAAAAAAAO3GuAQAAAAAAIB2CzAd0FkqK2vldlumM3xObGyEystrTGfAS/H8wdXiOYSrxXMIV4vnEK4WzyFcLZ5DuFrtfQ7Z7TZFR4df9DqfHZfcbotxqZPwdcXV4PmDq8VzCFeL5xCuFs8hXC2eQ7haPIdwtTr6OcRhcQAAAAAAAGg3xiUAAAAAAAC0m88eFgcAAAAAQFdyuVpUWVmqlpamTnuMkhK73G53p90/fF9bz6GAgCBFR8fL4bj8yYhxCQAAAACADlBZWaqQkDCFhyfKZrN1ymMEBNjV0sK4hPb7oueQZVmqra1SZWWp4uJ6XPZ9clgcAAAAAAAdoKWlSeHhUZ02LAGdzWazKTw86opffce4BAAAAABAB2FYgrdrz3OYcQkAAAAAAADtxrgEAAAAAICP2bNnl7785QXn/TVx4mh9+OF7rbd5/fVXNXnyGJWXl533udddN1L/+Z8PnXfZ2bNnNWlSlv78599Lks6cOaPHHntEX/rSPN199136r//6niorKy7o+POff9/6OVfjT396QevXr73q+/ncm28u05tvLpMk/exnP9aZM6fbdT8PPfQN7dy5XYcOHdAvfvHTS97u1KmT+vnPf9Jmy3XXjbyix1+/fp2WLHnpgvvpapzQGwAAAAAAHzNkyDD99a+LWz9+9dWX9cEH72ry5Gmtl7377gpdd90kvfPOW/rSl7523uefOHFCVVVVioqKkiStWbNKkZFRrdc/88zPdMMNMzV9+g2SpL///UU988zP9bOfPdMpf557772/Q+/v1lvntP79zp3b9ZWvfP2q7m/AgEx973uZl7z+zJnTOnmyqM2WK3X48MEOuZ+rxbgEAAAAAIAP27Nnl/72t7/oD3/4fwoODpYk5efnqarqnB577HEtWvSY7r77K7Lb/3lw03XXTdQnn6zRrFm3SPpsXJo4cXLr9RUVZWpsbGj9+I477tLBgwe+sOO660Zq/frtkqT33luhXbt26PHHn9CcOTdr6tTp2rhxvRwOh+6770EtWfKSiopO6MEHv6Vp06brySef0LBhIzRs2Aj94AffVkpKqnJzDysmJlY//ekvFBXVTRs2fKI//vF3siy3evbspe985weKiYnVb3/7/2nbti1yOOy67rpJ+upXv9H6aqqgoGCVlZXqO9/5D9177/1asuRlvfDCXyRJ77//jvbv36dvf/v7rX+GpqYmPfXUT3Xo0EElJvbUuXNnJX02UP3lL3/Qb3/7By1Z8pLef/9d2e02DRw4SI899rieffaXOnXqpH71q6c0Zco0/e53z8nlcislJVU9evSUJH3ta/dJkp566kkdPLhf3bp11/e//0MlJibqoYe+oa9+9RsaPnykTp8+pX//9/v0zDPP6q233pAkJSb2aH311de+dt8lvxZz5tysG2+cpc2bN6q+vkGLFv1YAwYMvOzn0qUwLgEAAAAA0ME27Dut9Xvbd6jVF7HZpPHX9tD4ay/vbeIrKyv0xBOP67vf/S/16pXUevl7772tqVOzNWDAQDkcDm3ZslFjx17Xev3Uqdn629/+olmzblF5eZksS4qNjWu9/r77HtJPfvJf+vOf/6ARI0ZpzJhxmjp1erv/XHFx8XrppaX62c9+rJde+quee+4F7du3R8899ytNm3b+/ebn5+n73/+hMjIG6PHHv6OPPnpf06bN0DPP/Ey/+92f1aNHTy1e/Df9+tdP66GHvqXNmzfqpZeWqrGxUU899d9qbGxsva+77/6y3nrrdT3zzLNKTOyh//mf53TyZJF69UrS+++/o/vuO//wwGXLXpUkvfzyMp04cVxf+tL8865vaWnRSy/9VW+++YHsdrt+/eunVFpaov/4j2/rL3/5gx599LvauXO7Tpw4rmXL3lFERMQFhw0OGzZc3/3u43rjjdf07LO/1M9//suLfs2Sk1M0e/btkqRZs25pvZ/KyoqLfi3++7+fkiR169ZNf/zj37Rs2RL9/e9/0ZNPXv2rzTjnEgAAAAAAPsjtduuJJxYpO/v681511NLSoo8++kDZ2ddLkqZOnd76CpjPXXPNYB0/XqiamhqtWbNKU6ZMPe/6MWPGafny9/Td7y5S9+7R+t//fU6PP/6ddreOGTNOkuR0Jmro0OEKCAhQYmIPVVdXX3Db6OgYZWQMkCSlpKSpqqpKBw7s18CBg1pfBXTLLbdrx45tiouLV3BwsB544KtaunSxvv71B1pfvfWvbDabbrxxlj788D2dOXNGFRUVGjTomvNus3v3Dk2Z8tnY1bt3H1177eDzrg8ICNA11wzWvffeoxdf/KNuv/1OxccnXPBYvXv3VURExAWXBwcHa8aMGyVJ119/o3bt2vGFX7eLudTX4nOff60//9p1BF65BAAAAABAB7uSVxddiYAAu1pa3Jd12xdf/KNaWpp1330Pnnf5hg2fqLq6Sj/4wWdjUEtLiyorK1RSUqyEBKekz4aW8eMnaP36tVq79mP9+Mc/1xtvLJUkVVWd01//+ic9/PCjGjNmnMaMGacvf/lezZ59vSorKxUdHX3JJsuyZLPZ1NLSct7lgYGBrX/vcDi+8M8VFBR0wX1alvuCy1wulwICAvSHP/xVu3fv1KZNG3T//V/R88//4ZL3PXPmzXr00X9XUFCQbrhh5kVuYTvvsS7W+vOf/0r79+/T5s0b9eijD+uHP7zwRN+XGrjs9n/en2V9NlZJn/3z+Ny/fu3+1aW+Fp8LCgo+77qOwCuXAAAAAADwMdu2bdaKFW/qxz/+eetA8bn33ntbX//6A1q2bIWWLVuhN998X9deO0QrVrx53u2mTp2uN954TQEBgecNRuHhEVq/fp3ef/+d1stOnixSTExs6wnAL6Z79+46erRAlmVp/fp1HfMH/YfMzGt04MA+nT59SpL09ttvaPjwEcrNPaSHHvqGhgwZpoce+pb69UvR8eOF532uw+FoHV8SE3soPj5Bb775um64YdYFjzNy5Gjl5Hwot9utM2dOa9++veddX1lZqYUL5yglJU333nu/Ro3KUkFBnhyOgPMGnkupr69rfVe8d999SyNHjpYkdev22ddOkj75ZM1F29v6WnQmXrkEAAAAAICP+fvf/yqXy6Vvf/vh8y6fOHGydu7cru9//0fnXT5v3r/pV7/6hb785XtbLxs06FqVl5fplltuPe+2DodDv/zls3r++d/oT396QSEhIYqLi9dTT/36C191dP/9D+mxxx5RTEysBg8e2noy7I4QExOr73zncf3gB99Wc3OLEhMT9b3v/VBxcXG65prBuueeuQoJCVF6en+NGTPuvHdZGzdugr797f/Qr3/9vHr27KXs7Blas2a14uLiL3ic22+/U0ePFmjhwjlKTOyhlJTU866Pjo7W7Nm36+tfv0fBwSFyOhM1c+bNam5uVk1NtX760//SrFmzL/nniIiI1Lp1a/THP76g+Ph4/eAHn/1zWrjwHj355BN69923NWHC5NbbDx06XE8++YRiYmLa/Fp0JpvVUa+B8jDl5TVyu33yj2ZUfHykSksvPOYVuBw8f3C1eA7havEcwtXiOYSrxXPIt505U6jExL6d+hhXclgcrlxLS4t++tMfaurUbE2aNLXtT/BCl/Mcuthz2W63KTb2wvNESRwWBwAAAAAAIMuydOutN8put5/36iC0jcPiAAAAAACA37PZbHrnnRzTGV6JVy4BAAAAAACg3RiXAAAAAADoID56WmP4kfY8hxmXAAAAAAC4iNPltaqsbrzs2wcEBKm2toqBCV7LsizV1lYpICDoij6Pcy4BAAAAAPAvquqa9OTfdqhvYqS+M3/YZX1OdHS8KitLVVNzttO67Ha73G7eLQ7t19ZzKCAgSNHR8Vd0n4xLAAAAAAD8i+XrjqiusUWHCitVWd2o6MjgNj/H4QhQXFyPTu2Kj49UaWl1pz4GfFtnPIc4LA4AAAAAgP+j8Ey11u0+paFpcbIkbTtUYjoJ8GiMSwAAAAAA/INlWXo5J1eRYYG696ZM9XVGasuBM6azAI/GuAQAAAAAwD9s3l+s/JPndMekVIWFBCgr06mjp6tVXFlnOg3wWIxLAAAAAABIqm9s0dI1+eqXGKnxgz87d9LogQmySdpyoNhsHODBGJcAAAAAAJD0zqZjOlfTpIXTM2S32SRJMVEhSu/dXVsOFMuyLMOFgGdiXAIAAAAA+L3iijp9tPWExl+TqNRe3c67bkymU6fL63SipMZQHeDZGJcAAAAAAH7vlVV5Cgyw647JqRdcN3JAghx2G4fGAZfAuAQAAAAA8Gt78su0t6Bct4xPVveI4AuujwgN1KDkGG05WCw3h8YBF2BcAgAAAAD4reYWt15ZlafEmDBlj0y65O2yMp2qqGpUftG5LqwDvAPjEgAAAADAb+VsP6GSynrNz05XgOPSvyIPS49TUICdQ+OAi2BcAgAAAAD4pcrqRq3YcExD0+J0bUrsF942JChAQ9PjtO1QiVpc7i4qBLwD4xIAAAAAwC8tW5Mvl9utedPSLuv2WZlO1dQ362BhZSeXAd6FcQkAAAAA4Hfyis5q0/5iXT+6jxKiwy7rc65JjlVYcIA27+fQOOD/YlwCAAAAAPgVt9vS4pw8RUcGa9bYvpf9eYEBdo3oH6+deaVqanZ1YiHgXRiXAAAAAAB+5ZO9p1RYXK27pqQpJCjgij53TKZTjU0u7Sko76Q6wPswLgEAAAAA/EZtQ7NeX3tEGUndNHpgwhV/fv8+0eoWEcS7xgH/B+MSAAAAAMBvvPnJUdU2NGvB9AzZbLYr/ny73abRA5zaW1CmuobmTigEvA/jEgAAAADALxSV1OjjnSc1eWgv9XFGtvt+sjKdanFZ2pFb2oF1gPdiXAIAAAAA+DzLsrR4Za5Cgx26bWLKVd1Xco9IJXQP5dA44B8YlwAAAAAAPm/H4VIdOn5Wt01MUURo4FXdl81m0+hMpw4WVupcTWMHFQLei3EJAAAAAODTGptdenV1nnonRGjy0F4dcp9jMp2yLGnroZIOuT/AmzEuAQAAAAB82vubC1Ve1agF2emy26/8JN4X0zMuXL0TIrSVQ+MAxiUAAAAAgO8qPVuv9zYf1+iBCerfJ7pD73tMplMFp6pUcra+Q+8X8DaMSwAAAAAAn7V0db7sdumuKWkdft+jBzoliVcvwe8xLgEAAAAAfNL+YxXakVuqWWP7KSYqpMPvP7ZbiNKTuvGucfB7jEsAAAAAAJ/T4nLrlZV5iu8eohtG9+60x8nKdOpkWa2KSmo67TEAT8e4BAAAAADwOR/vPKlTZbWaNy1dgQGOTnuckQMSZLfZtJlXL8GPMS4BAAAAAHxKVW2T3lx/VNckx2hoWlynPlZUWJAyk6O15UCxLMvq1McCPBXjEgAAAADAp7y+tkBNzS7Nz06XzWbr9Mcbk+lUeVWDCk5WdfpjAZ6IcQkAAAAA4DOOnq7S+r2nlT0yST1iw7vkMYelxyswwM6JveG3GJcAAAAAAD7BbVlanJOryPAg3TI+ucseNzQ4QEPS4rTtULFcbneXPS7gKRiXAAAAAAA+YdOnZ1RwqkpzJqUqNDigSx87a6BTVXXNOlhY2aWPC3gCxiUAAAAAgNerb2zRsjUFSukZpXHXJnb54w9OjVFocIC27OfQOPgfxiUAAAAAgNdbseGYztU2aeH0DNm74CTe/yowwKERGfHakVuqpmZXlz8+YBLjEgAAAADAq50ur1XO9hO6bnAPJfeIMtaRNciphiaX9haUG2sATGBcAgAAAAB4Lcuy9MrKPAUF2nXHpFSjLQP7RCsqPEhbDnJoHPwL4xIAAAAAwGvtyS/Xp0crNHt8srqFBxltsdttGj0gQXvyy1XX0GK0BehKjEsAAAAAAK/U3OLSK6ty1SM2TFNHJJnOkSRlZTrV4nJrV16p6RSgyzAuAQAAAAC80kfbTqj0bIMWZGcowOEZv96m9IxSXLcQbT7AoXHwH57xbx8AAAAAAFegoqpBKzYe0/CMeA1KjjGd08pmsykr06mDxyp1rrbJdA7QJRiXAAAAAABe57U1BXK7pblT00ynXGBMplNuy9L2QyWmU4AuwbgEAAAAAPAquSfOasuBYt2Y1Ufx3UNN51ygV3yEkuLDtYVD4+AnGJcAAAAAAF7D7bb0ck6uYqKCNXNsX9M5l5SV6VT+yXMqO1tvOgXodIxLAAAAAACvsXbPKZ0oqdFdU9IUHOgwnXNJWQOdkqQtB3n1Enwf4xIAAAAAwCvU1DfrjbUFGtCnu0YNSDCd84XiuocqrVc3bTnAeZfg+xiXAAAAAABe4c1PjqiusUULsjNks9lM57QpK9OpotIanSytMZ0CdCrGJQAAAACAxzteXK2Pd53U1GFJSkqIMJ1zWUYOSJDNxqFx8H2MSwAAAAAAj2ZZlhavzFN4SKBmT0g2nXPZuoUHKbNfjLYcKJZlWaZzgE7DuAQAAAAA8GjbDpUo98RZ3T4xRRGhgaZzrkjWQKdKzzboyOkq0ylAp2FcAgAAAAB4rMYml15dna8+CRGaOKSn6ZwrNjwjXgEOu7bs59A4+C7GJQAAAACAx3p3c6Eqqxu1YHqG7HbPP4n3vwoLCdCQ1FhtPVQit5tD4+CbGJcAAAAAAB6p5Gy9PthyXGMGOZXRu7vpnHbLynSqqrZJB49Xmk4BOgXjEgAAAADAI726Kk8Ou013Tk4znXJVBqfGKiTIoS0HODQOvolxCQAAAADgcT49Uq5deWW6aVxfRUcGm865KkGBDo3IiNeOw6VqbnGbzgE6HOMSAAAAAMCjtLjcWrwyTwndQzVjVB/TOR0iK9Op+sYW7TtSbjoF6HCMSwAAAAAAj7JqR5HOVNRpXna6AgN849fWgf2iFRkWqM0cGgcf5Bv/lgIAAAAAfMK5mka9tf6ork2J1ZDUWNM5HcZht2vUgATtyS9TfWOL6RygQzEuAQAAAAA8xutrj6i5xa352emy2WymczrUmMxENbe4tSuv1HQK0KEYlwAAAAAAHuHIqSqt33daM0b1VmJMmOmcDpfaK0qxUSHacqDEdArQoRiXAAAAAADGuS1LL+ccVrfwIN00rp/pnE5hs9mUlenU/qMVqqprMp0DdBjGJQAAAACAcRv2ndbR09W6c0qqQoMDTOd0mqxMp9yWpR2HePUSfAfjEgAAAADAqLqGFr2+pkCpvaI0ZlCi6ZxOlRQfrl5x4bxrHHwK4xIAAAAAwKi3NxxVdV2zFk7PkN3HTuL9r2w2m0ZnOpVXdE7l5xpM5wAdgnEJAAAAAGDMqbJardpRpAlDeqpfYpTpnC6RlemUJG09yKuX4BsYlwAAAAAARliWpVdW5Sko0KHbJ6WYzukyCd1DldIzSls4NA4+gnEJAAAAAGDErrwy7T9aoVsnJCsqLMh0TpfKynTqeEmNTpXVmk4BrhrjEgAAAACgyzU1u7RkVZ56xYVryrBepnO63OgBCbLZxKuX4BMYlwAAAAAAXe7DrcdVdq5B87PTFeDwv19Nu0UEa2DfaG05UCzLskznAFfF//4NBgAAAAAYVVHVoHc3FWpE/3hl9osxnWNM1kCnSs7W69iZatMpwFVhXAIAAAAAdKmlH+fLkjR3SprpFKNG9I9XgMOmzfs5NA7ejXEJAAAAANBlDh+v1NaDJZo5pq/iuoeazjEqLCRQ16bEauuhYrndHBoH78W4BAAAAADoEi63Wy/n5Co2KkQ3ZvUxneMRxgxK1LmaJh0+Xmk6BWg3xiUAAAAAQJdYs+uUikprNXdqmoICHaZzPMKQ1FgFBzm05SCHxsF7MS4BAAAAADpddV2T3vzkiAb2jdaI/vGmczxGUKBDw9Pjtf1QqZpb3KZzgHZhXAIAAAAAdLrlnxxVfaNL87PTZbPZTOd4lKxMp+oaW/Tp0XLTKUC7MC4BAAAAADpV4Zlqrd11UlOH91JSfITpHI+T2S9aEaGB2nKAQ+PgnRiXAAAAAACdxrIsLV6Zq/DQQN06Idl0jkcKcNg1akCCdueVqaGpxXQOcMUYlwAAAAAAnWbLwWLlFZ3TnMmpCgsJNJ3jsbIynWpqcWt3XpnpFOCKMS4BAAAAADpFQ1OLlq7OV9/ESF13bQ/TOR4tLambYqKCtZlD4+CFGJcAAAAAAJ3i3U2FOlvTpIXZGbLbOYn3F7HbbBo90Kn9RytUU99sOge4IoxLAAAAAIAOV1xZpw+3HtfYQYlKS+pmOscrjMl0yuW2tP1QiekU4IowLgEAAAAAOtyrq/LlcNh155RU0yleo3dChHrEhvGucfA6jEsAAAAAgA61t6Bcu/PLdMv4fuoeEWw6x2vYbDZlZTqVe+KsKqoaTOcAl41xCQAAAADQYVpcbr2yKk/OmDBNH9nbdI7Xycp0ypK09SCHxsF7MC4BAAAAADpMzvYTKq6o0/xp6Qpw8CvnlXJGhym5RySHxsGr8G86AAAAAKBDnK1p1NsbjmlIaqwGp8aazvFaWQOdKiyu1unyWtMpwGVhXAIAAAAAdIhlawrkcrk1LzvddIpXGzXQKZvEq5fgNRiXAAAAAABXLf/kOW389IxmjOojZ3SY6RyvFh0ZrP59umvLwRJZlmU6B2gT4xIAAAAA4Kq4LUsv5+Sqe0SQbhrX13SOTxgzKFHFFXUqLK42nQK0iXEJAAAAAHBV1u89rcIz1bprSppCggJM5/iEEf3j5bDbODQOXoFxCQAAAADQbnUNzXp9bYHSkropK9NpOsdnhIcE6tqUWG09WCI3h8bBwzEuAQAAAADa7c31R1VT16yF2Rmy2Wymc3xKVqZTldWNyjtx1nQK8IUYlwAAAAAA7XKytEard5zUpKE91Tcx0nSOzxmaFqfgQIc2c2gcPBzjEgAAAADgilmWpcUr8xQa7NBtE1NM5/ik4CCHhqXHafuhErW43KZzgEtiXAIAAAAAXLGduaU6WFipWyekKDIsyHSOz8rKdKq2oUWfHq0wnQJcEuMSAAAAAOCKNDW7tGRVvpLiwzV5WE/TOT5tUHKMwkMCtJVD4+DBGJcAAAAAAFfkgy3HVV7VoAXZGXLY+bWyMwU47Bo1IEE780rV2OQynQNcFN8FAAAAAACXrexcvd7dXKhRAxI0oG+06Ry/kJXpVFOzW7vzy0ynABfFuAQAAAAAuGxLV+fLJumuKWmmU/xGeu/uio4M1hYOjYOHYlwCAAAAAFyWg8cqtP1wqWaO7avYbiGmc/yG3WbT6IEJ2nekXNV1TaZzgAswLgEAAAAA2uRyu7V4ZZ7iuoXoxqw+pnP8zpjMRLncljbuPWU6BbgA4xIAAAAAoE0f7zypk2W1mjctXYEBDtM5fqePM0LOmDCt23XSdApwAcYlAAAAAMAXqqpr0pufHNWgftEalh5nOscv2Ww2jcl0al9BmSqrG03nAOdhXAIAAAAAfKE31h5RY7NL87MzZLPZTOf4raxMpyxL2naQE3vDszAuAQAAAAAu6diZKn2y55SmjUhSz7hw0zl+LTEmTGlJ3bSZd42Dh2FcAgAAAABclGVZejknV5FhgbplfLLpHEiaOCxJx85Uq7iiznQK0IpxCQAAAABwUZv3F6vgZJXumJSqsJAA0zmQNGFoL9kkbeHVS/AgjEsAAAAAgAvUN7Zo6Zp8JfeI1PjBPUzn4B/iuocqo3d3bTlYLMuyTOcAkhiXAAAAAAAX8c6mYzpX06QF0zNk5yTeHiUr06nT5XU6UVJjOgWQxLgEAAAAAPgXZyrq9NHWExp/baJSe3YznYN/MXJAghx2Gyf2hsdgXAIAAAAAnGfJqjwFBtg1Z1Kq6RRcRERooAYlx2jrwWK5OTQOHoBxCQAAAADQak9+mfYWlOuW8cnqFhFsOgeXMCbTqYqqRuUXnTOdAjAuAQAAAAA+09zi1iur8pQYE6bskUmmc/AFhqbHKSjAzrvGwSMwLgEAAAAAJEk520+opLJeC6anK8DBr4ueLCQoQEPT47TtUIlaXG7TOfBzfLcAAAAAAKiyulErNhzTsPQ4XZMcazoHlyEr06ma+mYdOFZpOgV+jnEJAAAAAKBla/LlcluaOy3ddAou07UpsQoPCdCWA2dMp8DPMS4BAAAAgJ/LKzqrTfuLdUNWbyV0DzWdg8sU4LBrRP947cwrU2Ozy3QO/BjjEgAAAAD4Mbfb0ss5uYqODNasMf1M5+AKZWUmqrHJpT35ZaZT4McYlwAAAADAj63be0rHi2t015Q0BQc5TOfgCvXv3V3dIoJ41zgYxbgEAAAAAH6qtqFZb6w9ooze3TV6YILpHLSD3W5T1kCn9h0pV11Ds+kc+CnGJQAAAADwU29+clS1Dc1akJ0um81mOgftlJXpVIvL0o7DpaZT4KcYlwAAAADADxWV1OjjnSc1eVgv9XFGms7BVeiXGKmE6FBt5tA4GMK4BAAAAAB+xrIsLV6Zq9Bgh26bkGI6B1fJZvvs0LhDxyt1tqbRdA78EOMSAAAAAPiZ7YdLdej4Wd0+MUURoYGmc9ABsjKdsixp28ES0ynwQ4xLAAAAAOBHGptdenV1nnonRGjS0F6mc9BBesaFq09ChLYc5NA4dD3GJQAAAADwI+9vLlRFVaMWTs+Q3c5JvH1J1iCnjpyqUkllnekU+BnGJQAAAADwE6Vn6/Xe5uPKynQqo3d30znoYKMHOCVJWzg0Dl2McQkAAAAA/MTS1fmy26U7J6eaTkEniO0WooykbtpyoFiWZZnOgR9hXAIAAAAAP7D/WIV25JbqprH9FBMVYjoHnSQr06lTZbUqKq01nQI/wrgEAAAAAD6uxeXW4pxcxXcP0fWje5vOQScaOSBBDrtNmw+cMZ0CP8K4BAAAAAA+bvXOkzpdXqd509IVGOAwnYNOFBkWpMx+Mdp6oERuDo1DF2FcAgAAAAAfVlXbpLfWH9E1KTEamhZnOgddYEymU+VVDSo4ec50CvwE4xIAAAAA+LDX1xaoqdmt+dPSZbPZTOegCwxNj1NggF1bDhSbToGfYFwCAAAAAB919HSV1u89rekje6tHbLjpHHSR0OAADU2L07ZDJXK53aZz4AcYlwAAAADAB7ktSy/n5CoyPEg3j+9nOgddLCvTqeq6Zh08Vmk6BX6AcQkAAAAAfNCmT8/oyKkq3Tk5VaHBAaZz0MWuTYlVaHCANnNoHLoA4xIAAAAA+Jj6xha9tqZAqT2jNPaaRNM5MCAwwK4R/eO1M7dUTc0u0znwcYxLAAAAAOBjVmw4puraJi2YniE7J/H2W2MynWpocmlvQbnpFPg4xiUAAAAA8CGny2uVs/2ErhvcQ8k9okznwKABfaLVLTyId41Dp2NcAgAAAAAfYVmWXlmZp6BAu+6YlGo6B4bZ7TaNGpCgPQXlqmtoMZ0DH8a4BAAAAAA+Ynd+mT49WqHZ16UoKjzIdA48QNYgp1pcbu3MLTWdAh/GuAQAAAAAPqC5xaUlq/LUIzZMU4f3Mp0DD5HSI0rx3UO05SCHxqHzMC4BAAAAgA/4cOsJlZ5t0ILpGQpw8KsePmOz2ZSV6dSBYxU6V9tkOgc+iu84AAAAAODlKqoa9M6mYxqREa9B/WJM58DDZA10yrKk7YdKTKfARzEuAQAAAICXe21NgSxLmjs1zXQKPFCv+AglxUdo84EzplPgoxiXAAAAAMCL5Z44qy0HinVjVh/FdQ81nQMPlZWZoIKTVSo9W286BT6IcQkAAAAAvJTbbenlnFzFRAXrxjF9TefAg2UNdEqStnJib3QCxiUAAAAA8FJrd5/UiZIazZ2aruBAh+kceLC47qFK69VNWw4wLqHjMS4BAAAAgBeqqW/WG+uOaECf7hrZP950DrxAVqZTRaW1KiqtMZ0CH8O4BAAAAABeaPknR1Tf6NKC7AzZbDbTOfACowYkyG6z8eoldDjGJQAAAADwMseLq7Vm10lNGd5LSQkRpnPgJaLCg5TZL1pbDhTLsizTOfAhjEsAAAAA4EUsy9LilXkKDwnUrROSTefAy2RlOlV2rkFHTlWZToEPYVwCAAAAAC+y7VCJck+c1e2TUhQeEmg6B15meEa8Ahx2bebQOHQgxiUAAAAA8BKNTS69ujpffZwRmji4p+kceKHQ4AANSYvVtkMlcrndpnPgIxiXAAAAAMBLvLv5mCqrG7Vweobsdk7ijfYZk+lUVW2TDhWeNZ0CH8G4BAAAAABeoKSyTh9sOa6xg5xKT+puOgdebHBqrEKDHbxrHDoM4xIAAAAAeIFXV+fLYbdrzuQ00ynwcoEBDg3PiNeO3BI1t7hM58AHMC4BAAAAgIf79Ei5duWV6ebx/RQdGWw6Bz4gK9Op+kaX9hZUmE6BD2BcAgAAAAAP1uJya/HKPCVEh2r6yN6mc+AjBvaNVlRYoLYcOGM6BT6AcQkAAAAAPNjK7UU6U1Gn+dPSFRjAr3DoGA67XaMGOLWnoFz1jS2mc+Dl+M4EAAAAAB7qXE2j3t5wVINTYzUkLc50DnxM1iCnmlvc2plbajoFXo5xCQAAAAA81LK1BWpucWv+tHTTKfBBqT2jFNctRFsO8q5xuDqMSwAAAADggQpOndOGfWc0Y3RvOWPCTOfAB9lsNmVlOnXgaKWq6ppM58CLMS4BAAAAgIdxW5YW5+SqW0SQbhrbz3QOfFjWQKfclqXth0pMp8CLMS4BAAAAgIfZsO+0jp6u1l2T0xQaHGA6Bz4sKSFCveLDtfkAh8ah/RiXAAAAAMCD1DW06PU1BUrtFaUxg5ymc+AHsgY6lV90TmXn6k2nwEsxLgEAAACAB3l7w1FV1zXr36b3l81mM50DP5CV+dmIufUgh8ahfRiXAAAAAMBDnCyr1aodRZo4tKf6JkaazoGfiO8eqtSeUdrCoXFoJ8YlAAAAAPAAlmXplZW5Cg506LaJKaZz4GeyMp06UVKjk2W1plPghRiXAAAAAMAD7Mor04Fjlbp1QrKiwoJM58DPjBrolM0mXr2EdmFcAgAAAADDmppdWrIqT73iwjVleC/TOfBD3cKDNLBvtLYcOCPLskznwMswLgEAAACAYR9sPa6ycw1akJ0uh51f02BGVqZTpWcbdPR0tekUeBm+awEAAACAQeXnGvTepkKN7B+vgf1iTOfAj43IiFeAw6bNB86YToGXYVwCAAAAAIOWfpwvSbpraprhEvi7sJBADU6N07aDJXK7OTQOl49xCQAAAAAMOVRYqW2HSjRzTF/FdQs1nQMoK9Opc7VNOny80nQKvAjjEgAAAAAY4HK7tXhlrmKjQnRDVh/TOYAkaUhqrIKDHNrMu8bhCjAuAQAAAIABa3adUlFpreZNS1NQoMN0DiBJCgp0aHh6vHYcLlVzi9t0DrwE4xIAAAAAdLHquia9+ckRDewbreEZ8aZzgPOMGeRUXWOLPj1SbjoFXoJxCQAAAAC62PJ1R1Tf6NKC7HTZbDbTOcB5BvaNVkRooLYc5NA4XB7GJQAAAADoQoVnqrV29ylNG5GkXvERpnOACwQ47Bo1MEG788rU0NRiOgdegHEJAAAAALqIZVl6eWWuIsICNfu6fqZzgEvKGuhUU4tbu/LKTKfACzAuAQAAAEAXWbvrpPKLzumOSakKCwk0nQNcUlpSN8VGBWsL7xqHy8C4BAAAAABdoKGpRS+u2K9+iZG6bnAP0znAF7LbbBo90Kn9RytUXddkOgcejnEJAAAAALrAu5sKVVHVoAXTM2TnJN7wAlmZTrnclrYfLjWdAg/HuAQAAAAAnay4sk4fbj2uqSN7K61XN9M5wGXpnRChHrFhHBqHNjEuAQAAAEAnW7IyTwEOu740K9N0CnDZbDabxmQ6lXvirCqqGkznwIMxLgEAAABAJ9pbUKY9BeW6ZXyyYqJCTOcAV2R0plOStPVgieESeDLGJQAAAADoJC0ut15ZmSdnTJiyRyaZzgGumDM6TMk9orT5wBnTKfBgjEsAAAAA0Elytp9QcWW9FmSnK8DBr1/wTlmZTh0vrtHp8lrTKfBQfHcDAAAAgE5wtqZRb284pqFpcbo2JdZ0DtBuowcmyCZxYm9cEuMSAAAAAHSC1z4ukMvl1txpaaZTgKvSPSJYA/pGa8uBYlmWZToHHohxCQAAAAA6WH7ROW3af0bXj+4jZ3SY6RzgqmVlOlVcWa9jZ6pNp8ADMS4BAAAAQAdyuy29vDJX0ZHBmjW2r+kcoEOM6B8vh93GoXG4KMYlAAAAAOhA6/edVuGZat05JVUhQQGmc4AOER4SqMGpsdp6sFhuN4fG4XyMSwAAAADQQeoamrVsTYHSk7opa6DTdA7QobIynTpb06TcE2dNp8DDMC4BAAAAQAd5c/1R1TY0a+H0DNlsNtM5QIcakhan4ECHNnNoHP4F4xIAAAAAdICi0hqt3nFSk4b2Uh9npOkcoMMFBzo0LCNOOw6XqMXlNp0DD8K4BAAAAABXybIsvbIyT6HBDt0+McV0DtBpxmQ6VdvQok+PVJhOgQdhXAIAAACAq7TjcKkOFlbqtokpiggNNJ0DdJrMfjGKCA3UloMcGod/YlwCAAAAgKvQ2OzSq6vzlBQfoUlDe5rOATpVgMOukQMStCuvVI1NLtM58BCMSwAAAABwFT7YclzlVY1aOD1dDju/YsH3ZQ1MUFOzW7vyS02nwEPwnQ8AAAAA2qnsXL3e21yo0QMT1L9PtOkcoEuk9+6u6MhgbdnPoXH4DOMSAAAAALTTq6vzZbNJd01JM50CdBm7zaasgU59erRCNfXNpnPgARiXAAAAAKAdDhyr0I7DpZo1tp9iokJM5wBdKivTKZfb0vbDJaZT4AGueFxqbmaVBAAAAODfWlxuvbIyT3HdQnTD6N6mc4Au18cZocSYMG09wKFxuIxxafv27frf//1fNTU16bbbbtPIkSP13nvvdUUbAAAAAHikj3ed1MmyWs2flq7AAIfpHKDL2Ww2ZWU6dfj4WVXXNZnOgWFtjkvPPPOMhg4dqpUrVyouLk7vvvuu/vKXv3RFGwAAAAB4nKq6Jr35yVENSo7R0PQ40zmAMXHdQmRJqm9ymU6BYW2OSy6XS+PGjdPGjRuVnZ2tpKQkud3urmgDAAAAAI/zxtojamp2af60dNlsNtM5AGBcm+OS2+3W3r17tWbNGo0fP165ubmcdwkAAACAXzp2pkqf7DmlaSOS1DMu3HQOAHiEgLZu8MADD+jRRx/VnDlzlJSUpKlTp+rxxx/vijYAAAAA8Bhuy9LLObmKDA/S7OuSTecAgMdoc1wqKSlRTk5O68c5OTlyODhhHQAAAAD/snn/GRWcrNJXZw5UaHCbv0oBgN9o87C4V1555byPGZYAAAAA+Jv6xha99nGBkntEady1iaZzAMCjtDm3Jycna9GiRRo5cqTCwsJaL58xY0anhgEAAACAp3hn4zGdq23Sv98xWHZO4g0A52lzXDp79qzOnj2rwsLC1stsNhvjEgAAAAC/cKaiTh9tO6Hrru2hlJ5RpnMAwOO0OS79/e9/74oOAAAAAPBIS1blKSjQrjsmp5pOAQCP1Oa4dOzYMb300kuqq6uTZVlyu90qLCzUkiVLuqIPAAAAAIzZnV+mvQXlmjc1Td3Cg0znAIBHavOE3o8++qiam5u1a9cu9erVS/n5+crIyOiKNgAAAAAwprnFrSUr89QjNkxTRySZzgEAj9XmuFRbW6sf//jHuu666zRx4kS9+OKL2r9/f1e0AQAAAIAxH207rpKz9VqQnaEAR5u/OgGA32rzO2T37t0lSX379lVeXp6ioqLkdrs7uwsAAAAAjKmsbtQ7Gws1LD1Og5JjTOcAgEdr85xLffv21ZNPPqnbbrtNjz/+uOrq6tTU1NQVbQAAAABgxGtr8uVyW5o7Ld10CgB4vDZfufTEE09o5MiRyszM1J133qnNmzfrpz/9aVe0AQAAAECXyys6q837i3VDVh8ldA81nQMAHq/Ncen3v/+9rr/+eknSggUL9D//8z967733Oj0MAAAAALqa223p5Y9yFRMVrFlj+5rOAQCvcMnD4p577jlVVVXpvffeU01NTevlzc3NWr16tRYtWtQlgQAAAADQVdbtOaXjJTW6f/YgBQc6TOcAgFe45Lg0ZMgQ7du3T3a7vfWk3pLkcDj0/PPPd0UbAAAAAHSZmvpmvbHuiPr37q5RAxJM5wCA17jkuDRp0iRNmjRJEydO1ODBg1svb25uVmBgYJfEAQAAAEBXeeuTo6ptaNaC6Rmy2WymcwDAa7R5zqWmpib97//+r5qamnTbbbdp5MiRnHMJAAAAgE8pKqnR6l1FmjKsl3onRJjOAQCv0ua49Mwzz2jo0KFauXKl4uLi9O677+ovf/lLV7QBAAAAQKezLEuLV+YqPCRQt05IMZ0DAF6nzXHJ5XJp3Lhx2rhxo7Kzs5WUlCS3290VbQAAAADQ6bYdKtGh42d1+8QURYRyChDgilmW6QIY1ua45Ha7tXfvXq1Zs0bjx49Xbm6umpubu6INAAAAADpVY5NLSz/OV5+ECE0c0tN0DgB4pUue0Ptz999/vx599FHNmTNHSUlJmjp1qh5//PGuaAMAAACATvXe5kJVVDXqGzcPkt3OSbyBK8F57/G5NselGTNmaMaMGa0f5+TkyOFwdGoUAAAAAHS20rP1en/LcY3JdCqjd3fTOQDgtdo8LO5fMSwBAAAA8AWvrs6Xw27TnVPSTKcAgFe74nEJAAAAALzd/qMV2plbqpvG9VV0ZLDpHADwapccl3JyciRJTU1NXRYDAAAAAJ2txeXW4pW5Sugeqhmj+pjOAQCvd8lx6bnnnpMkzZ07t8tiAAAAAKCzrd5RpNPldZqXna7AAA7mAICrdckTeoeHh+v6669XcXGxbr755guuX7FiRaeGAQAAAEBHO1fbpLc2HNW1KbEakhprOgcAfMIlx6U//elPOnjwoB5//HH913/9V1c2AQAAAECneH1tgZqa3Zo3LU023kcdADrEJceliIgIjRo1Sr///e+VkJCg/fv3q6WlRYMHD1ZERERXNgIAAADAVTtyqkrr957WDVl91CM23HQOAPiMS45Ln6uurtbdd9+tuLg4uVwuFRcX64UXXtDw4cO7og8AAAAArprbsrR4Za66hQfp5nH9TOcAgE9pc1x66qmn9Mtf/lJjxoyRJG3atEm/+MUvtHTp0k6PAwAAAICOsHHfGR05VaV7bxqo0OA2fw0CAFyBNt8aoaampnVYkqSxY8eqvr6+U6M+d+LECd1+++1d8lgAAAAAfFNdQ4uWrS1Qaq8ojRmUaDoHAHxOm+OS3W7XyZMnWz8uKiqSw+Ho1ChJqqqq0pIlSxQezrHQAAAAANpvxcajqq5t0oLsDNk5iTcAdLg2Xw/64IMPau7cuRo7dqwkacOGDfrRj37U4SGvvvqq3nnnndaPf/3rX+s73/mO7rvvvg5/LAAAAAD+4XR5rVZuL9KEIT2U3CPKdA4A+KQ2x6Xs7GylpKRo8+bNsixL999/v1JTUzs8ZO7cuZo7d26H3y8AAAAA/2RZlhavzFNQoEO3T+z432EAAJ+5rDPZpaSkKCUlpbNbAAAAAKDD7M4v0/6jFZo/LV1R4UGmcwDAZ9ksy7I68wFqamo0b948vfDCC0pKSpIkrVixQr/73e/U3NysL3/5y1q4cGFnJgAAAADwM03NLj34zGoFBjj03KOTFeBo83SzAK7Q6u0n9JtXduoP389WjzjOl+zPOvU9OPfs2aNFixbp2LFjrZcVFxfrN7/5jd544w0FBQVp3rx5ysrKUlpaWoc+dnl5jdzuTt3N/FJ8fKRKS6tNZ8BL8fzB1eI5hKvFcwhXi+eQ91ix8ZjOlNfp2/OGqrKi1nROK55DuFqe9Byqrv7sneQrKmoUYLkN1+Bytfc5ZLfbFBsbcfHr2vrkxx577Iof8HNLly7Vj370IyUkJLRetnHjRo0ZM0bdu3dXWFiYrr/+en3wwQftfgwAAAAA+L8qqhr07qZjGtE/Xpn9YkznAIDPa/OVS4cOHZJlWbK14y07n3zyyQsuKykpUXx8fOvHCQkJ2rt37xXfNwAAAABczNKP82VZ0twpHXt0BADg4tocl+Lj4zVr1iwNGTJE4eH/PIZy0aJF7XrAi53iqT3DFQAAAAD8q8PHK7X1YIluGd9Pcd1DTecAgF9oc1waNmyYhg0b1mEP6HQ6tX379taPS0pKzjtsDgAAAADaw+V26+WcPMVGBevGMX1N5wB+g7Mdo81x6aGHHlJDQ4MKCwuVnp6upqYmhYSEtPsBx40bp+eff14VFRUKDQ3VRx99pJ/+9Kftvj8AAAAAkKR1u0+pqLRG37z1GgUHOkznAD7PJo5CwmfaPKH3nj17lJ2drfvuu08lJSWaNGmSdu7c2e4HdDqdeuSRR3TPPffo1ltv1U033aTBgwe3+/4AAAAAoKa+WW+sO6KBfaM1on98258AAOgwbb5y6amnntJf//pXffvb31ZiYqKefvppPfnkk3r99dcv+0FWr1593sc333yzbr755iuvBQAAAICLWL7uiOobXZqfnc45XQGgi7X5yqWGhgalpf3zXRYmTZokl8vVqVEAAAAAcLmOF1drze6Tmjq8l5LiI0znAIDfaXNcCggI0Llz51rX/yNHjnR6FAAAAABcDsuytDgnV+EhgZo9Idl0DgD4pTYPi3vggQf0b//2byotLdV//ud/asOGDfrJT37SFW0AAAAA8IW2HixRbtE5femG/goPCTSdAwB+qc1xacqUKUpJSdGGDRvkdrv1zW9+87zD5AAAAADAhMYml5Z+nK++zkhNGNzTdA4A+K02D4uTpJaWFrndbgUEBCgwkP8bAAAAAMC8dzYdU2V1oxZOz5Ddzkm8AcCUNsel119/XXfffbf27dunHTt2aOHChfrwww+7og0AAAAALqqksk4fbj2usYMSlZbUzXQOAPi1Ng+L++tf/6o333xTCQkJkqRTp07pvvvu0/XXX9/pcQAAAABwMUtW5cvhsGvO5FTTKQDg99p85VJgYGDrsCRJPXv25NA4AAAAAMbsO1Ku3fllumVcP0VHBpvOAQC/d8lXLu3fv1+S1L9/f/3kJz/R3Llz5XA49MYbb2j48OFdFggAAAAAn2txufXKyjw5o0OVPbK36RwAgL5gXPr3f//38z5es2ZN69/bbDYtWrSo06IAAAAA4GJWbi/SmYo6fevOwQoMuKz3JwIAdLJLjkurV6/uyg4AAAAA+EJnaxr19oajGpwaq8GpcaZzAAD/0OYJvUtLS7V8+XKdPXv2vMsfe+yxzmoCAAAAgAu8vqZALS635menm04BAPwfbb6O9IEHHtDevXtlWdZ5fwEAAABAVyk4eU4bPj2jGaP6yBkdZjoHAPB/tPnKpebmZv32t7/tihYAAAAAuIDbsvRyTq66RwTppnF9TecAAP5Fm69cGjRokHJzc7uiBQAAAAAusGHvaR07U607p6QpJKjN/z8OAOhibX5nHj58uG699VbFx8crIOCfN1+1alWnhgEAAABAXUOzlq0tUFqvbhqT6TSdAwC4iDbHpd/+9rf65S9/qT59+nRFDwAAAAC0envDMdXUNes/78qQzWYznQMAuIg2x6Vu3bpp5syZXdECAAAAAK1OltVq1Y4iTRraU30TI03nAAAuoc1xafLkyXrqqac0Y8YMBQUFtV4+aNCgTg0DAAAA4L8sy9LinFwFBzp028QU0zkAvghvKO/32hyXVqxYIUn68MMPWy+z2WyccwkAAABAp9mZW6aDhZVaOD1DkWFBbX8CgK7Hkar4hzbHpdWrV3dFBwAAAABIkpqaXXp1dZ56xYdr8rCepnMAAG1oc1x68cUXL3r5V77ylQ6PAQAAAIAPth5X2bkGfWf+MDnsdtM5AIA2tDku5ebmtv59U1OTduzYoaysrE6NAgAAAOCfys816L1NhRo5IEED+0abzgEAXIY2x6Wf//zn531cUVGhxx57rNOCAAAAAPivVz/OlyTNnZJmuAQAcLmu+DWmMTExOnnyZGe0AAAAAPBjBwsrtf1QiWaO7avYbiGmcwAAl+mKzrlkWZY+/fRTxcbGdmoUAAAAAP/icru1eGWu4rqF6IbRfUznAACuwBWdc0mSevTowWFxAAAAADrUml2ndLK0Vg/edq2CAh2mcwAAV+CKz7kEAAAAAB2puq5Jy9cdUWa/aA3PiDOdAwC4Qpccl77//e9f8pNsNpt+9rOfdUoQAAAAAP+yfN0RNTS5ND87QzabzXQOAOAKXXJcSk9Pv+CyyspK/b//9//Uq1evTo0CAAAA4B8Kz1Rr7e5Tyh7ZW73iwk3nAADa4ZLj0le/+tXzPt64caO++93v6uabb9aiRYs6PQwAAACAb7MsSy/n5CoyLFCzr0s2nQMAaKc2z7nU0tKiX/3qV1q+fLmeeOIJ3XDDDV3RBQAAAMDHbT5QrPyT5/SVGwcoLKTNX00AAB7qC7+DFxYW6pFHHlFYWJiWL1+uHj16dFUXAAAAAB9W39iipR/nq19ipMYP5vcMAPBm9ktdsWzZMt15552aPn26XnrpJYYlAAAAAB3m3U2FOlfTpIXTM2TnJN4A4NUu+cqlRYsWyW636w9/+IP++Mc/tl5uWZZsNpt27tzZJYEAAAAAfEtxRZ0+2nZc469JVGqvbqZzAABX6ZLj0qpVq7qyAwAAAICfWLIqTwEOu+6YnGo6BQDQAS45LvXq1asrOwAAAAD4gb0FZdpTUK67pqSpe0Sw6RwAQAe45DmXAAAAAKAjNbe49crKPCXGhCl7ZJLpHABAB2FcAgAAANAlVm4/oeLKes3PTleAg19FAMBX8B0dAAAAQKerrG7U2xuPaWhanK5NiTWdAwDoQIxLAAAAADrdsjUFcrncmjctzXQKgA5mmQ6AcYxLAAAAADpVftE5bdp/RteP7qOE6DDTOQA6iM10ADwG4xIAAACATuN2W3o5J1fRkcGaNbav6RwAQCdgXAIAAADQaT7Ze0qFxdW6a0qaQoICTOcAADoB4xIAAACATlHb0KzX1x5RRlI3jR6YYDoHANBJGJcAAAAAdIq3Pjmq2oZmLZieIZuNs7MAgK9iXAIAAADQ4YpKa7R650lNHtpLfZyRpnMAAJ2IcQkAAABAh7IsS6+szFNosEO3TUwxnQMA6GSMSwAAAAA61I7DpTpYWKnbJqYoIjTQdA4AoJMxLgEAAADoMI3NLr26Ok9J8RGaNLSn6RwAQBdgXAIAAADQYd7fXKjyqkYtnJ4uh51fNwDAH/DdHgAAAECHKDtbr/e3HNfogQnq3yfadA4AoIswLgEAAADoEK9+nC+bTbprSprpFABAF2JcAgAAAHDVDhyr0I7DpZo1tp9iokJM5wAAuhDjEgAAAICr0uJya/HKPMV1C9ENo3ubzgEAdDHGJQAAAABX5eOdJ3WqrFbzp6UrMMBhOgcA0MUYlwAAAAC0W1Vtk95cf1TXJMdoaHqc6RwAgAGMSwAAAADa7Y11BWpqdml+drpsNpvpHACAAYxLAAAAANrl6OkqfbLntLJHJqlHbLjpHACAIYxLAAAAAK6Y27K0eGWuIsODdMv4ZNM5AACDGJcAAAAAXLHN+8+o4GSV5kxKVWhwgOkcAIBBjEsAAAAArkh9Y4te+7hAyT2iNO7aRNM5AADDGJcAAAAAXJEVG4/pXG2TFk7PkJ2TeAN+z7Is0wkwjHEJAAAAwGU7XV6rnG0ndN3gHkrpGWU6B4BJbMv4B8YlAAAAAJfFsiy9sipPQYF23TEp1XQOAMBDMC4BAAAAuCx7Csr16ZEKzR6frG7hQaZzAAAegnEJAAAAQJuaW9xasjJPPWLDNHVEkukcAIAHYVwCAAAA0KaPth1Xydl6LcjOUICDXyMAAP/EfxUAAAAAfKGKqgat2HhMw9LjNCg5xnQOAMDDMC4BAAAA+ELL1hTI7ZbmTUs3nQIA8ECMSwAAAAAuKffEWW0+UKwbs/oovnuo6RwAgAdiXAIAAABwUW63pcU5uYqJCtbMsX1N5wAAPBTjEgAAAICLWrfnlI6X1OiuKWkKDnSYzgEAeCjGJQAAAAAXqKlv1hvrjqh/7+4aNSDBdA4AwIMxLgEAAAC4wJufHFFtQ7MWTM+QzWYznQMA8GCMSwAAAADOc6KkRh/vOqkpw3qpd0KE6RwAgIdjXAIAAADQyrI+O4l3eEigbp2QYjoHAOAFGJcAAAAAtNp2qESHT5zV7RNTFBEaaDoHAOAFGJcAAAAASJIam1xa+nG++iREaOKQnqZzAABegnEJAAAAgCTp3c2Fqqhq1ILpGbLbOYk3AODyMC4BAAAAUMnZen2w5bjGZDqV0bu76RwAgBdhXAIAAACgV1flyWG36c4paaZTAABehnEJAAAA8HOfHi3Xrrwy3TSur6Ijg03nAAC8DOMSAAAA4MdaXG69sjJPCd1DNWNUH9M5AAAvxLgEAAAA+LHVO4p0urxO87LTFRjArwcAgCvHfz0AAAAAP3WutklvbTiqa1NiNSQ11nQOAMBLMS4BAAAAfur1NQVqanZr3rQ02Ww20zkAvIxNfN/AZxiXAAAAAD905FSV1u87remjeqtHbLjpHACAF2NcAgAAAPyM27L0ck6uuoUH6eZx/UznAAC8HOMSAAAA4Gc27jujo6erdOeUVIUGB5jOAQB4OcYlAAAAwI/UNbRo2doCpfaK0phBiaZzAAA+gHEJAAAA8CMrNh5VdW2TFmRnyM5JvAEAHYBxCQAAAPATp8pqtXJ7kSYM6aHkHlGmcwAAPoJxCQAAAPADlmXplVV5Cgp06PaJqaZzAAA+hHEJAAAA8AO788q0/2iFbr0uWVHhQaZzAAA+hHEJAAAA8HHNLS69sipPPePCNWV4L9M5AAAfw7gEAAAA+LgPtp5Q2bkGLchOV4CDXwEAAB2L/7IAAAAAPqyiqkHvbjqmEf3jldkvxnQOAMAHMS4BAAAAPmzpx/myLGnulDTTKQAAH8W4BAAAAPiow8crtfVgiW7M6qO47qGmcwAAPopxCQAAAPBBLrdbL+fkKTYqWDeO6Ws6BwDgwxiXAAAAAB+0dvcpFZXWaO7UdAUHOkznAAB8GOMSAAAA4GNq6pu1fN0RDewbrRH9403nAAB8HOMSAAAA4GOWrzui+kaX5meny2azmc4BAPg4xiUAAADAhxwvrtaa3Sc1dXgvJcVHmM4BAPgBxiUAAADAR1iWpcU5uQoPCdTsCcmmcwAAfoJxCQAAAPARWw4WK7fonO6YlKLwkEDTOQAAP8G4BAAAAPiAhqYWvfZxgfo6IzVhcE/TOQD8iGWZLoBpjEsAAACAD3h3U6Eqqxu1cHqG7HZO4g2g8/F+Afgc4xIAAADg5Uoq6/Th1uMaOyhRaUndTOcAAPwM4xIAAADg5ZasypfDYdecyammUwAAfohxCQAAAPBi+46Ua3d+mW4Z10/RkcGmcwAAfohxCQAAAPBSLS63Fq/MkzM6VNkje5vOAQD4KcYlAAAAwEut3F6k4oo6zc9OV2AAP9oDAMwIMB0AAAAAXMzWg8Xa+OkZ0xnnCQoKUFNTi+mMVoePn9Xg1FgNTo0znQIA8GOMSwAAAPA4pWfr9ad3DioqPFCRYUGmc1oFNraoucVtOqNVaq8oLZyeYToDAODnGJcAAADgcV5dnS+H3abH7x7pUSepjo+PVGlptekMAAA8CgdmAwAAwKPsP1qhnbmlumlcX48algAAwMUxLgEAAMBjfPbuZ7lK6B6qGaN49zMAALwB4xIAAAA8xuodRTpdXqd509IVGOAwnQMAAC4D4xIAAAA8wrnaJr214aiuTYnVkLRY0zkAAOAyMS4BAADAI7y+tkBNzW7Nm5Ymm81mOgcAAFwmxiUAAAAYd+RUldbvPa3po3qrR2y46RwAAHAFGJcAAABglNuytHhlrrqFB+nmcf1M5wAAgCvEuAQAAACjNu47oyOnqjRncqpCgwNM5wAAgCvEuAQAAABj6hpatGxtgVJ7RmnsNYmmcwAAQDswLgEAAMCYFRuPqrq2SQumZ8jOSbwBAPBKjEsAAAAw4nR5rVZuL9KEIT2U3CPKdA4AAGgnxiUAAAB0OcuytHhlnoICHbp9YqrpHAAAcBUYlwAAANDldueXaf/RCt16XbKiwoNM5wAAroJlOgDGMS4BAACgSzW3uLRkVZ56xoVryvBepnMAAMBVYlwCAABAl/pg6wmVnm3Qgux0BTj4cRQAAG/Hf80BAADQZSqqGvTupmMa0T9emf1iTOcAAIAOwLgEAACALrP043xZljR3SprpFAAA0EEYlwAAANAlDh+v1NaDJboxq4/iuoeazgEAAB2EcQkAAACdzuV26+WcPMVGBevGMX1N5wAAgA7EuAQAAIBOt3b3KRWV1mju1HQFBzpM5wAAgA7EuAQAAIBOVVPfrOXrjmhAn+4a0T/edA4AAOhgjEsAAADoVMvXHVF9o0sLpmfIZrOZzgEAAB2McQkAAACd5nhxtdbsPqmpw3spKT7CdA4AAOgEjEsAAADoFJZlaXFOrsJDAjV7QrLpHAAA0EkYlwAAANApth4sUW7ROd0xKUXhIYGmcwAAQCdhXAIAAECHa2xyaenH+errjNSEwT1N5wAAgE7EuAQAAIAO986mY6qsbtSC6emy2zmJNwAAvoxxCQAAAB2qpLJOH249rrGDnEpP6m46BwAAdDLGJQAAAHSoJavy5XDYNWdymukUAADQBRiXAAAA0GH2HSnX7vwy3TKun6Ijg03nAACALsC4BAAAgA7R4nLrlZV5ckaHKntkb9M5AACgizAuAQAAoEOs3F6kMxV1mp+drsAAfswEAMBf8F99AAAAXLWzNY16e8NRDU6N1eDUONM5AACgCzEuAQAA4Kq9vqZALS635k9LN50CAAC6GOMSAAAArkrByXPa8OkZzRjVR86YMNM5AICuZlmmC2AY4xIAAADazW1ZejknV90jgnTTuL6mcwAAXchms5lOgIdgXAIAAEC7bdh7WsfOVOvOKWkKCQownQMAAAxgXAIAAEC71DU0a9naAqX16qYxmU7TOQAAwBDGJQAAALTLW+uPqaauWQunZ3BoBAAAfoxxCQAAAFfsZFmtVu0o0sShPdU3MdJ0DgAAMIhxCQAAAFfEsiwtzslVSJBDt09MMZ0DAAAMY1wCAADAFdmZW6aDhZW6bWKKIsOCTOcAAADDGJcAAABw2ZqaXXp1dZ56xYdr8rCepnMAAIAHYFwCAADAZftg63GVnWvQguwMOez8KAkAABiXAAAAcJnKztXrvU2FGjkgQQP7RpvOAQAAHoJxCQAAAJdl6ccFkqS7pqQaLgEAAJ6EcQkAAABtOlhYqe2HSjRzTF/FdQs1nQMAADwI4xIAAAC+kMvt1uKVuYrrFqIbsvqYzgEAAB6GcQkAAABfaM2uUzpZWqu5U9MVFOgwnQMAADwM4xIAAAAuqbquScvXHVFmv2gNz4gznQMAADwQ4xIAAAAu6Y11R9TQ5NL87AzZbDbTOQAAwAMxLgEAAOCiCs9Ua93uU5o2Ikm94sJN5wAAAA/FuAQAAIALWJall3NyFREWqNnX9TOdAwAAPBjjEgAAAC6w+UCx8k+e05xJqQoLCTSdAwAAPBjjEgAAAM5T39iipR/nq19ipMYP7mE6BwAAeDjGJQAAAJzn3U2FOlfTpIXTM2TnJN4AAKANjEsAAABoVVxRp4+2Hdf4axKV2qub6RwAAOAFGJcAAADQ6pVVeQpw2HXH5FTTKQAAL2GZDoBxjEsAAACQJO3JL9PegnLdMj5Z3SOCTecAADwcB07jc4xLAAAAUHOLW0tW5SkxJkzZI5NM5wAAAC/CuAQAAACt3H5CxZX1mp+drgAHPyICAIDLx08OAAAAfq6yulFvbzymoWlxujYl1nQOAADwMoxLAAAAfm7ZmgK5XG7Nm5ZmOgUAAHghxiUAAAA/ll90Tpv2n9H1o/soITrMdA4AAPBCjEsAAAB+yu229HJOrqIjgzVrbF/TOQAAwEsxLgEAAPipT/aeUmFxte6akqaQoADTOQAAwEsxLgEAAPih2oZmvb72iDKSumn0wATTOQAAwIsxLgEAAPihtz45qtqGZi2YniGbzWY6BwAAeDHGJQAAAD9TVFqj1TtPavLQXurjjDSdAwAAvBzjEgAAgB+xLEuLc3IVGuzQbRNTTOcAAAAfwLgEAADgR3YcLtWh42d128QURYQGms4BAAA+gHEJAADATzQ2u/Tq6jwlxUdo0tCepnMAAICPYFwCAADwE+9vLlR5VaMWTk+Xw86PgQAAoGPwUwUAAIAfKDtbr/e3HNfogQnq3yfadA4AAPAhjEsAAAB+4NWP82WzSXdNSTOdAgAAfAzjEgAAgI87cKxCOw6XatbYfoqJCjGdAwAAfAzjEgAAgA9rcbm1eGWe4rqF6IbRvU3nAAAAH8S4BAAA4MM+3nlSp8pqNX9augIDHKZzAACAD2JcAgAA8FFVtU16c/1RXZMco6HpcaZzAACAj2JcAgAA8FFvrCtQU7NL87PTZbPZTOcAAHyVZToApjEuAQAA+KCjp6v0yZ7Tyh6ZpB6x4aZzAACAD2NcAgAA8DFuy9LinFxFhgfplvHJpnMAAICPY1wCAADwMZs+PaOCU1WaMylVocEBpnMAAICPY1wCAADwIfWNLVq2pkApPaM07tpE0zkAAMAPMC4BAAD4kBUbj+lcbZMWTs+QnZN4AwCALsC4BAAA4CNOl9cqZ9sJXTe4h5J7RJnOAQAAfoJxCQAAwAdYlqVXVuUpKNCuOyalms4BAAB+hHEJAADAB+wpKNenRyo0e3yyuoUHmc4BAAB+hHEJAADAyzW3uLRkZZ56xIZp6ogk0zkAAMDPMC4BAAB4uY+2nVDJ2XotyM5QgIMf7wAAQNfipw8AAAAvVlHVoBUbj2lYepwGJceYzgEAAH6IcQkAAMCLLVtTILdbmjct3XQKAADwU4xLAAAAXir3xFltPlCsG7P6KL57qOkcAADgpxiXAAAAvJDbbWlxTq5iooI1c2xf0zkAAMCPMS4BAAB4obV7Tul4SY3umpKm4ECH6RwAAODHGJcAAAC8TE19s95YW6D+vbtr1IAE0zkAAMDPMS4BAAB4mTc/OaK6xhYtmJ4hm81mOgcAAPg5xiUAAAAvcqKkRh/vOqmpw5LUOyHCdA4AAADjEgAAgLewrM9O4h0eEqjZE5JN5wAAAEhiXAIAAPAa2w6V6PCJs7p9YooiQgNN5wAAAEhiXAIAAPAKjU0uvbo6X30SIjRxSE/TOQAAAK0YlwAAALzAu5sLVVndqAXTM2S3cxJvAIDnsEwHwDjGJQAAAA9XcrZeH2w5rjGZTmX07m46BwAASRJvWIrPMS4BAAB4uFdX5clht+nOKWmmUwAAAC7AuAQAAODBPj1arl15ZbppXF9FRwabzgEAALgA4xIAAICHanG59crKPCV0D9WMUX1M5wAAAFwU4xIAAICHWrWjSKfL6zQvO12BAfzYBgAAPBM/pQAAAHigczWNemv9UV2bEqshqbGmcwAAAC6JcQkAAMADvb72iJpb3JqfnS4bb8cDAAA8GOMSAACAhzlyqkrr953WjFG9lRgTZjoHAADgCzEuAQAAeBC3ZenlnFx1Cw/STeP6mc4BAABoE+MSAACAB9m474yOnq7SnVNSFRocYDoHAACgTYxLAAAAHqKuoUXL1uQrtVeUxgxKNJ0DAABwWRiXAAAAPMTbG46quq5ZC7IzZOck3gAAwEswLgEAAHiAU2W1WrWjSBOG9FByjyjTOQAAAJeNcQkAAMAwy7L0yqo8BQU6dPvEVNM5AAAAV4RxCQAAwLDdeWXaf7RCt05IVlR4kOkcAACAK8K4BAAAYFBzi0uvrMpTr7hwTRnWy3QOAADAFWNcAgAAMOiDLcdVdq5B87PTFeDgRzMAAOB9+AkGAADAkIqqBr27qVAj+scrs1+M6RwAAIB2YVyC12psdsnttkxnAPBjDU0tsiy+D6H9ln6cL0vS3ClpplMAAADajXEJXuuBX63Vn989YDoDgJ+qrG7UN3+9Th9uPWE6BV6q7Gy9th4s0fWjeyuue6jpHAAAgHZjXIJX27S/2HQCAD9VXtUgSdpxuMRwCbxVQ5NLktQnIdJwCQAAwNVhXAIAAAAAAO3GaQLAuAQAAAAAANrBZjoAHoJxCQAAAAAAAO3GuAQAAAAAAIB2Y1wCAAAAAABAuzEuAQAAAAAAoN0YlwAAAAAAANBujEsAAAAAAABoN8YlAAAAAAAAtBvjEgAAAAAAANqNcQkAAAAAAADtxrgEAAAAAACAdmNcAgAAAAAAQLsxLgEAAAAAAKDdGJcAAAAAAADQboxLAAAAAAAAaDfGJQAAAAAAALQb4xIAAAAAAADajXEJAAAAAAAA7ca4BAAAAAAAgHZjXAIAAAAAAEC7MS4BAAAAAACg3QJMB3QWu91mOsFnecrXNiE6VJLn9ODy8M8LV8tTnkPBQQ4lRIcqOirEY5pweTzln1dQ4GfPodDgAI9pwuXhnxeuFs8hXC1PeQ6FBgcoITpUQYEOj2nC5WnPP68v+hybZVnW1QQBAAAAAADAf3FYHAAAAAAAANqNcQkAAAAAAADtxrgEAAAAAACAdmNcAgAAAAAAQLsxLgEAAAAAAKDdGJcAAAAAAADQboxLAAAAAAAAaDfGJQAAAAAAALQb4xIAAAAAAADajXEJl2XFihWaOXOmpk+frpdfftl0DrxUTU2NbrrpJhUVFZlOgRf67W9/q1mzZmnWrFl6+umnTefACz377LOaOXOmZs2apRdffNF0DrzUU089pe9973umM+Cl7rnnHs2aNUuzZ8/W7NmztWfPHtNJ8CKrV6/W7bffrhtuuEH//d//bToHXui1115r/f4ze/ZsjRgxQj/5yU865L4DOuRe4NOKi4v1m9/8Rm+88YaCgoI0b948ZWVlKS0tzXQavMiePXu0aNEiHTt2zHQKvNDGjRu1fv16LV++XDabTffee69ycnI0ffp002nwElu3btXmzZv19ttvq6WlRTNnztSkSZOUkpJiOg1eZNOmTVq+fLkmT55sOgVeyLIsHTlyRGvWrFFAAL+G4cqcOHFCP/rRj/Taa68pNjZWX/rSl7R27VpNmjTJdBq8yJ133qk777xTkpSXl6cHH3xQDz30UIfcN69cQps2btyoMWPGqHv37goLC9P111+vDz74wHQWvMzSpUv1ox/9SAkJCaZT4IXi4+P1ve99T0FBQQoMDFRqaqpOnTplOgteZPTo0frb3/6mgIAAlZeXy+VyKSwszHQWvMjZs2f1m9/8Rvfff7/pFHipI0eOyGaz6etf/7puueUWvfTSS6aT4EVycnI0c+ZMJSYmKjAwUL/5zW80ZMgQ01nwYk888YQeeeQRxcTEdMj9MZmjTSUlJYqPj2/9OCEhQXv37jVYBG/05JNPmk6AF0tPT2/9+2PHjum9997TkiVLDBbBGwUGBuq5557TX/7yF91www1yOp2mk+BFfvjDH+qRRx7R6dOnTafAS1VVVWns2LF64okn1NDQoHvuuUfJyckaP3686TR4gcLCQgUGBuprX/uaSktLNWXKFH3rW98ynQUvtXHjRjU0NOjGG2/ssPvklUtok2VZF1xms9kMlADwd3l5efrqV7+q7373u+rXr5/pHHihhx9+WJs2bdLp06e1dOlS0znwEq+99pp69OihsWPHmk6BFxs2bJiefvpphYWFKSYmRnPmzNHatWtNZ8FLuFwubdq0Sc8884yWLl2qffv2afny5aaz4KWWLFmir3zlKx16n4xLaJPT6VRZWVnrxyUlJRzaBKDL7dixQ1/+8pf16KOP6rbbbjOdAy9TUFCggwcPSpJCQ0M1Y8YMHT582HAVvMV7772nDRs2aPbs2Xruuee0evVq/exnPzOdBS+zfft2bdq0qfVjy7I49xIuW1xcnMaOHauYmBiFhIRo2rRpHE2CdmlqatK2bds0derUDr1fxiW0ady4cdq0aZMqKipUX1+vjz76SBMnTjSdBcCPnD59Wg8++KB++ctfatasWaZz4IWKioq0aNEiNTU1qampSatWrdKIESNMZ8FLvPjii3rnnXf01ltv6eGHH9bUqVP1gx/8wHQWvEx1dbWefvppNTY2qqamRsuXL+eNKXDZpkyZovXr16uqqkoul0uffPKJBg0aZDoLXujw4cPq169fh597kqkcbXI6nXrkkUd0zz33qLm5WXPmzNHgwYNNZwHwI3/+85/V2NioX/ziF62XzZs3T/PnzzdYBW8yadIk7dmzR7feeqscDodmzJjBUAmgS02ZMqX1+5Db7daCBQs0bNgw01nwEkOGDNG9996rBQsWqLm5WePHj9cdd9xhOgte6MSJE0pMTOzw+7VZFzuhDgAAAAAAAHAZOCwOAAAAAAAA7ca4BAAAAAAAgHZjXAIAAAAAAEC7MS4BAAAAAACg3RiXAAAAAAAA0G6MSwAAAAAAAGg3xiUAAAAAAAC0G+MSAADwalOnTtXGjRtNZwAAAPgtxiUAAIAOVFFRof79+6u4uNh0CgAAQJdgXAIAALhKv/zlL/XJJ59Ikg4dOqSYmBg5nU7DVZ95+OGHlZub2/pxUVGRhg0b1q77qq2t1b333quGhoaOygMAAD6AcQkAAPiMgoIC3X333Ro5cqRmzZqlVatWtV63f/9+3XrrrRo2bJgefvhhfetb39JvfvObq37M3bt3Kz8/XxMmTJAkHTx4UAMGDLjq++0ITU1NKiwsVEZGRofcX3h4uG666SY9++yzHXJ/AADANzAuAQAAn9Dc3Kz7779f48eP18aNG7Vo0SJ9+9vf1pEjR9TU1KSHHnpIt912m7Zu3aqbbrpJK1eu7JDHff755zV37tzWjz1pXNq4caPGjh3bofd54403asWKFSorK+vQ+wUAAN6LcQkAAPiEPXv2qK6uTt/4xjcUFBSksWPHasqUKXr33Xe1Z88etbS06J577lFgYKBmzJiha6+9tvVzq6urNWfOHA0bNuy8Q8ieeeYZLViwQN/5znfU3Nx8wWNWVVVpx44dGj9+fOtlhw4d0sCBAy+47auvvqq777679a/Bgwdr7969rdfPmzdPv/3tbyV9duha//79tXnzZkmfvQJp1KhReumllyRJNTU1uv/++3X33Xdr7ty5Wrt27UW/JqtWrVJ2dvaVfBnbFBwcrOHDh1/yMQEAgP8JMB0AAADQEUpKSpSYmCi7/Z//76xnz54qLi5WSUmJnE6nbDZb63U9evRo/fuQkBD94Q9/0NNPP9162aFDh1RcXKzFixfrd7/7nT788EPddNNN5z1mYWGh4uPjFRQUJElqbGzU0aNHlZmZeUHf3LlzW1/htHr1ai1fvlyDBw+WJJ0+fVpOp1Nbt25tvf0111yjnJwcjRkzRps2bVLfvn1br3vrrbc0YcIELVy4UJZlqbq6+oLHc7vd2r17t5544onL+vp9rri4WH/729/U0tIiy7I0cOBA3Xbbbefdpk+fPjp69OgV3S8AAPBdvHIJAAD4hISEBJ05c0Zut7v1ss9Hm/j4eBUXF8uyrPOu+1xgYKBiYmLOu7+dO3fquuuukyRNmDBBO3fuvOAx7Xa7XC5X68e5ubkKCAhQcnLyJTsrKir07LPP6sc//nHrZR9++KFuvvlmpaSkqKCgQJLUq1cvnTp1SpZlKScnRzNmzGi9fXBwsHbv3q2ysjLZbDZFRUVd8Dh79uzRNddcI4fDccmWf+V2u/X222/rkUce0fe//3394Ac/UGpqqtasWXPe7Vwu1xXdLwAA8G2MSwAAwCcMHjxYISEh+tOf/qTm5mZt2bJFq1ev1syZMzV06FA5HA699NJLamlp0cqVK7Vv374vvL+qqipFRERIkiIjI3Xu3LkLbtO7d29VVFSosbFR0mevdkpNTVVLS4saGxvV2Niopqam8z7niSee0H/8x3+cN2atX79eEydO1E033aQPPvig9fJhw4Zp27ZtqqioUFxcXOvls2fPVnJysr72ta9p7ty5OnLkyAVtK1eu1LRp0y7jK/dPe/fu1a233qqAgAC9//77OnnypAYPHqz6+vrzbldUVPSFAxoAAPAvjEsAAMAnBAUF6YUXXtC6des0ZswY/fjHP9bTTz+t1NRUBQUF6fnnn9eyZcs0atQovf3225o8eXLr4WwXExkZqZqaGkmfnZOpW7duF9wmKipKI0aMaD030sGDB7V//34NHjy49a+ZM2e23v7NN99UZGSkpk6d2nrZmTNnlJeXpwceeEC/+93vzjuX0YwZM/Tzn/9co0ePPu9xAwMD9c1vflNvvfWWHn74YT3//PMXtG3cuLH1lVf/qq6uTsOGDTvvr8OHD8vhcLS+8uuFF17Q9u3bJem8Vyk1NTVp165d5/0ZAACAf+OcSwAAwKutXr269e/T09NbT3r9r6699lq99dZbrR/feeedmjJlyiXvd/jw4XrxxRd16623av369Ro+fPhFb/fggw/qhRde0KRJk/TDH/5QP/zhDy96u9OnT+uvf/3rBX0ffPCBvv/97+uGG26Q9Nkrmz5/tVO/fv00YsQI3XDDDdq4cWPr55w8ebL1XE+xsbHnHe73ueXLl1+0IykpSYcPH77odc3Nzfrb3/6mL33pS61fq3379p03Lr3zzju6+eabL3ooHgAA8E+MSwAAwC9s3bpVycnJio6O1ooVK3T48GFNmDCh9fqvf/3rOnjwoI4ePaq5c+fq9ttvV2xsrBYsWKAePXroq1/96kXvd/jw4UpOTta6des0ceLESz7+73//e1VVVemBBx5oveyb3/ymPvroI/3P//xP62VZWVl6//33Wz9etGjRBfeVm5urRx55RMHBwbIs65KD1pUKDAzUjTfeqF/96letr2BKT0/XnDlzJH32LnXvvPNO67vaAQAASJLNutj/6gIAAPAxr776qp599lnV19crKSlJjz76qCZPnmw6CwAAwOsxLgEAAAAAAKDdOKE3AAAAAAAA2o1xCQAAAAAAAO3GuAQAAAAAAIB2Y1wCAAAAAABAuzEuAQAAAAAAoN0YlwAAAAAAANBujEsAAAAAAABoN8YlAAAAAAAAtNv/D2ltZ660RybEAAAAAElFTkSuQmCC\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# make a plot of the luminosity distribution using Seaborn and Pandas\n", + "import seaborn as sns\n", + "import pandas as pd\n", + "from binarycpython.utils.functions import pad_output_distribution\n", + "\n", + "# set the figure size (for a Jupyter notebook in a web browser) \n", + "sns.set( rc = {'figure.figsize':(20,10)} )\n", + "\n", + "# this saves a lot of typing! \n", + "ldist = population.grid_results['luminosity distribution']\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "pad_output_distribution(ldist,\n", + " binwidth['luminosity'])\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict({'ZAMS luminosity distribution' : ldist})\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")" + ] + }, + { + "cell_type": "markdown", + "id": "7d7b275e-be92-4d59-b44d-ef6f24023cc3", + "metadata": {}, + "source": [ + "Does this look like a reasonable stellar luminosity function to you? The implication is that the most likely stellar luminosity is 10<sup>5.8</sup> L<sub>☉</sub>! Clearly, this is not very realistic... let's see what went wrong." + ] + }, + { + "cell_type": "markdown", + "id": "44586e42-b7cb-4a55-be0a-330b98b20de4", + "metadata": {}, + "source": [ + "## " + ] + }, + { + "cell_type": "markdown", + "id": "e32c3bbf-390f-45da-ad9c-cc3e7c9449dc", + "metadata": {}, + "source": [ + "## ZAMS Luminosity distribution with the initial mass function\n", + "\n", + "In the previous example, all the stars in our grid had an equal weighting. This is very unlikely to be true in reality: indeed, we know that low mass stars are far more likely than high mass stars. So we now include an initial mass function as a three-part power law based on Kroupa (2001). Kroupa's distribution is a three-part power law: we have a function that does this for us (it's very common to use power laws in astrophysics).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "1f37d2c0-1108-4ab9-a309-20b1e6b6e3fd", + "metadata": {}, + "outputs": [], + "source": [ + "# Update the probability distribution to use the three-part power law IMF \n", + "population.update_grid_variable(\n", + " name=\"M_1\",\n", + " probdist=\"three_part_powerlaw(M_1, 0.1, 0.5, 1.0, 150, -1.3, -2.3, -2.3)\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "6f4463e8-1935-45f2-8c5f-e7b215f8dc47", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Grid has handled 40 stars\n", + "with a total probability of 0.2182216189410787\n", + "Total starcount for this run will be: 40\n", + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Population-92de7c9221c54206ab4dd10e58e09a34 finished! The total probability was: 0.21822161894107872. It took a total of 1.5900418758392334s to run 40 systems on 2 cores\n", + "There were no errors found in this run.\n", + "OrderedDict([('luminosity distribution', OrderedDict([(2.25, 0.0164166), (3.25, 0.00515685), (0.25, 0.189097), (3.75, 0.0037453900000000004), (4.25, 0.0014346559999999999), (5.25, 0.0007493004), (4.75, 0.001171479), (5.75, 0.00039801020000000003), (6.25, 5.2369339999999996e-05)]))])\n" + ] + } + ], + "source": [ + "# Clean and re-evolve the population \n", + "population.clean()\n", + "analytics = population.evolve() \n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cfe45a9e-1121-43b6-b6b6-4de6f8946a18", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[None]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJgAAAJWCAYAAAAUZj1OAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABcnUlEQVR4nO3dd3SUZf7+8Wtm0gvpjQRIo0PovSNNiiDiBnXBsrqCsq6sK66CirroWlZ/lu/ay6oooIIIItIEhID03ksCBJIACYTQ0ub3R3TcCBjIk+SZSd6vczgn82QycyW5HTPX3M9nLHa73S4AAAAAAACgnKxmBwAAAAAAAIBro2ACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIZQMAEAAAAAAMAQCiYAAAAAAAAYQsEEAAAAAAAAQ9zMDlCZcnLOqrjYbnaMaickxE8nT+aZHQMuivUDo1hDMIo1BKNYQzCKNQSjWEMwqrxryGq1KCjI97Kfq9YFU3GxnYKpkvBzhRGsHxjFGoJRrCEYxRqCUawhGMUaglEVvYY4RQ4AAAAAAACGUDABAAAAAADAkGp9ihwAAAAAAFWpqKhQOTnHVViYX2n3kZVlVXFxcaXdPqq/staQm5uHgoLCZLNdfW1EwQQAAAAAQAXJyTkuLy8f+fpGymKxVMp9uLlZVVhIwYTy+701ZLfbdfZsrnJyjis0NOqqb5NT5AAAAAAAqCCFhfny9a1VaeUSUNksFot8fWtd8y48CiYAAAAAACoQ5RJcXXnWMAUTAAAAAAAADKFgAgAAAACgGtq8eaPuuOPWUv+6d2+v77+f57jOV19NV8+eHXXy5IlSX9u1a1v97W/jSh07deqUevTooPfff1uSlJGRoQkTxuv220dq1Kg/6PHH/6GcnOxLcrz//tuOrzHivffe0ooVywzfzi++/vpLff31l5KkZ599ShkZx8p1O+PG/VkbNqzTrl079K9/PXPF6x09mq7nnnu6zCxdu7a9pvtfsWK5pk379JLbqWoM+QYAAAAAoBpq0aKVPvroM8fl6dOnav78b9Wz53WOY99+O0ddu/bQ3Lmzdfvtfyr19YcPH1Zubq5q1aolSVq6dLH8/Ws5Pv/ii89qwICB6tt3gCTpk08+1IsvPqdnn32xUr6fu+8eU6G3N2zYCMfHGzas05133mPo9ho1aqJ//KPJFT+fkXFM6elHysxyrXbv3lkht2MUBRMAAAAAANXc5s0b9fHHH+idd/4rT09PSdK+fXuVm3taEyZM1KRJEzRq1J2yWn890alr1+768celGjToBkklBVP37j0dn8/OPqGLFy84Lt900x+0c+eO383RtWtbrVixTpI0b94cbdy4XhMnTtaIEUPUu3dfpaSskM1m07333q9p0z7VkSOHdf/9D+q66/pqypTJatWqjVq1aqPHHvu74uMTtGfPbgUHh+iZZ/6lWrUCtHLlj3r33Tdltxerdu1oPfzwYwoODtEbb/w/rV37k2w2q7p27aG77vqzY1eVh4enTpw4rocf/qvuvnuMpk2bqrfe+kCS9N13c7V9+1b9/e+POr6H/Px8Pf/8M9q1a6ciI2vr9OlTkkpKqg8+eEdvvPGOpk37VN99962sVosaN26qCRMm6tVXX9LRo+n697+fV69e1+nNN19TUVGx4uMTFBVVW5L0pz/dK0l6/vkp2rlzuwICAvXoo08oMjJS48b9WXfd9We1bt1Wx44d1V/+cq9efPFVzZ49U5IUGRnl2IX1pz/de8WfxYgRQ3T99YO0enWKzp+/oEmTnlKjRo2vei1dCQUTAAAAAACVYOXWY1qxpXynXf0ei0Xq0jxKXZpf3VvI5+Rka/LkiXrkkccVHR3jOD5v3jfq3buPGjVqLJvNpp9+SlGnTl0dn+/du48+/vgDDRp0g06ePCG7XQoJCXV8/t57x+nppx/X+++/ozZt2qljx87q3btvub+v0NAwffrpDD377FP69NOP9Nprb2nr1s167bV/67rrSt/uvn179eijT6hBg0aaOPFhLVjwna67rp9efPFZvfnm+4qKqq3PPvtYL7/8gsaNe1CrV6fo009n6OLFi3r++X/q4sWLjtsaNeoOzZ79lV588VVFRkbp//7vNaWnH1F0dIy++26u7r239KmCX345XZI0deqXOnz4kG6//ZZSny8sLNSnn36kr7+eL6vVqpdffl7Hj2fpr3/9uz744B099NAj2rBhnQ4fPqQvv5wrPz+/S04hbNWqtR55ZKJmzvxCr776kp577qXL/szi4uI1dOhwSdKgQTc4bicnJ/uyP4t//vN5SVJAQIDeffdjffnlNH3yyQeaMsX4rjNmMAEAAAAAUE0VFxdr8uRJ6tOnf6ndR4WFhVqwYL769OkvSerdu69jJ8wvmjVL0qFDacrLy9PSpYvVq1fvUp/v2LGzZs2ap0cemaTAwCD95z+vaeLEh8udtWPHzpKkiIhItWzZWm5uboqMjNKZM2cuuW5QULAaNGgkSYqPT1Rubq527Niuxo2bOnYD3XDDcK1fv1ahoWHy9PTU2LF3acaMz3TPPWMdu7h+y2Kx6PrrB+n77+cpIyND2dnZatq0WanrbNq0Xr16lRRederUVfPmSaU+7+bmpmbNknT33aP14YfvavjwmxUWFn7JfdWpU09+fn6XHPf09FS/ftdLkvr3v14bN67/3Z/b5VzpZ/GLX37Wv/zsKgI7mAAAAAAAqATXssvoWri5WVVYWHxV1/3ww3dVWFige++9v9TxlSt/1JkzuXrssZJCqLCwUDk52crKylR4eISkkrKlS5duWrFimZYt+0FPPfWcZs6cIUnKzT2tjz56Tw888JA6duysjh0764477tbQof2Vk5OjoKCgK2ay2+2yWCwqLCwsddzd3d3xsc1m+93vy8PD45LbtNuLLzlWVFQkNzc3vfPOR9q0aYNWrVqpMWPu1Ouvv3PF2x44cIgeeugv8vDw0IABAy9zDUup+7pc1uee+7e2b9+q1atT9NBDD+iJJy4d/n2lkstq/fX27PaSwkoq+X384rc/u9+60s/iFx4enqU+VxHYwQQAAAAAQDW0du1qzZnztZ566jlHSfGLefO+0T33jNWXX87Rl1/O0ddff6fmzVtozpyvS12vd+++mjnzC7m5uZcqjXx9/bRixXJ9991cx7H09CMKDg5xDAW/nMDAQB08uF92u10rViyvmG/0Z02aNNOOHVt17NhRSdI338xU69ZttGfPLo0b92e1aNFK48Y9qNjYeB06lFbqa202m6OAiYyMUlhYuL7++isNGDDokvtp27a9Fi78XsXFxcrIOKatW7eU+nxOTo5uu22E4uMTdffdY9SuXQft379XNptbqZLnSs6fP+d4t7xvv52ttm3bS5ICAkp+dpL0449LL5u9rJ9FZWIHEwAAAAAA1dAnn3ykoqIi/f3vD5Q63r17T23YsE6PPvpkqeMjR/5R//73v3THHXc7jjVt2lwnT57QDTcMK3Vdm82ml156Va+//oree+8teXl5KTQ0TM8///Lv7j4aM2acJkwYr+DgECUltXQMyK4IwcEhevjhiXrssb+roKBQkZGR+sc/nlBoaKiaNUvS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zY4DF/TFF184Hn+GDh2qNm3a6Omnn66Q23arkFtBtZeZmalXXnlFM2fOlIeHh0aOHKkOHTooMTHR7GhwIZs3b9akSZOUmppqdhS4oJSUFK1YsUKzZs2SxWLR3XffrYULF6pv375mR4OLWLNmjVavXq1vvvlGhYWFGjhwoHr06KH4+Hizo8GFrFq1SrNmzVLPnj3NjgIXZLfbdeDAAS1dulRubjwVw7U5fPiwnnzySX3xxRcKCQnR7bffrmXLlqlHjx5mR4MLufnmm3XzzTdLkvbu3av7779f48aNq5DbZgcTrkpKSoo6duyowMBA+fj4qH///po/f77ZseBiZsyYoSeffFLh4eFmR4ELCgsL0z/+8Q95eHjI3d1dCQkJOnr0qNmx4ELat2+vjz/+WG5ubjp58qSKiork4+Njdiy4kFOnTumVV17RmDFjzI4CF3XgwAFZLBbdc889uuGGG/Tpp5+aHQkuZOHChRo4cKAiIyPl7u6uV155RS1atDA7FlzY5MmTNX78eAUHB1fI7VGb46pkZWUpLCzMcTk8PFxbtmwxMRFc0ZQpU8yOABdWv359x8epqamaN2+epk2bZmIiuCJ3d3e99tpr+uCDDzRgwABFRESYHQku5IknntD48eN17Ngxs6PAReXm5qpTp06aPHmyLly4oNGjRysuLk5dunQxOxpcQFpamtzd3fWnP/1Jx48fV69evfTggw+aHQsuKiUlRRcuXND1119fYbfJDiZcFbvdfskxi8ViQhIANd3evXt111136ZFHHlFsbKzZceCCHnjgAa1atUrHjh3TjBkzzI4DF/HFF18oKipKnTp1MjsKXFirVq30wgsvyMfHR8HBwRoxYoSWLVtmdiy4iKKiIq1atUovvviiZsyYoa1bt2rWrFlmx4KLmjZtmu68884KvU0KJlyViIgInThxwnE5KyuL05wAVLn169frjjvu0EMPPaQbb7zR7DhwMfv379fOnTslSd7e3urXr592795tciq4innz5mnlypUaOnSoXnvtNS1ZskTPPvus2bHgYtatW6dVq1Y5LtvtdmYx4aqFhoaqU6dOCg4OlpeXl6677jrOKkG55Ofna+3aterdu3eF3i4FE65K586dtWrVKmVnZ+v8+fNasGCBunfvbnYsADXIsWPHdP/99+ull17SoEGDzI4DF3TkyBFNmjRJ+fn5ys/P1+LFi9WmTRuzY8FFfPjhh5o7d65mz56tBx54QL1799Zjjz1mdiy4mDNnzuiFF17QxYsXlZeXp1mzZvFmFbhqvXr10ooVK5Sbm6uioiL9+OOPatq0qdmx4IJ2796t2NjYCp9FSV2OqxIREaHx48dr9OjRKigo0IgRI5SUlGR2LAA1yPvvv6+LFy/qX//6l+PYyJEjdcstt5iYCq6kR48e2rx5s4YNGyabzaZ+/fpRVgKoUr169XI8DhUXF+vWW29Vq1atzI4FF9GiRQvdfffduvXWW1VQUKAuXbropptuMjsWXNDhw4cVGRlZ4bdrsV9uuA4AAAAAAABwlThFDgAAAAAAAIZQMAEAAAAAAMAQCiYAAAAAAAAYQsEEAAAAAAAAQyiYAAAAAAAAYAgFEwAAAAAAAAyhYAIAAAAAAIAhFEwAAMDl9e7dWykpKWbHAAAAqLEomAAAACpYdna2GjZsqMzMTLOjAAAAVAkKJgAAgArw0ksv6ccff5Qk7dq1S8HBwYqIiDA5VYkHHnhAe/bscVw+cuSIWrVqVa7bOnv2rO6++25duHChouIBAIBqgIIJAABUK/v379eoUaPUtm1bDRo0SIsXL3Z8bvv27Ro2bJhatWqlBx54QA8++KBeeeUVw/e5adMm7du3T926dZMk7dy5U40aNTJ8uxUhPz9faWlpatCgQYXcnq+vrwYPHqxXX321Qm4PAABUDxRMAACg2igoKNCYMWPUpUsXpaSkaNKkSfr73/+uAwcOKD8/X+PGjdONN96oNWvWaPDgwVq0aFGF3O/rr7+u5ORkx2VnKphSUlLUqVOnCr3N66+/XnPmzNGJEycq9HYBAIDromACAADVxubNm3Xu3Dn9+c9/loeHhzp16qRevXrp22+/1ebNm1VYWKjRo0fL3d1d/fr1U/PmzR1fe+bMGY0YMUKtWrUqdTrZiy++qFtvvVUPP/ywCgoKLrnP3NxcrV+/Xl26dHEc27Vrlxo3bnzJdadPn65Ro0Y5/iUlJWnLli2Oz48cOVJvvPGGpJLT2Bo2bKjVq1dLKtmJ1K5dO3366aeSpLy8PI0ZM0ajRo1ScnKyli1bdtmfyeLFi9WnT59r+TGWydPTU61bt77ifQIAgJrHzewAAAAAFSUrK0uRkZGyWn99Da127drKzMxUVlaWIiIiZLFYHJ+LiopyfOzl5aV33nlHL7zwguPYrl27lJmZqc8++0xvvvmmvv/+ew0ePLjUfaalpSksLEweHh6SpIsXL+rgwYNq0qTJJfmSk5MdO52WLFmiWbNmKSkpSZJ07NgxRUREaM2aNY7rN2vWTAsXLlTHjh21atUq1atXz/G52bNnq1u3brrttttkt9t15syZS+6vuLhYmzZt0uTJk6/q5/eLzMxMffzxxyosLJTdblfjxo114403lrpO3bp1dfDgwWu6XQAAUH2xgwkAAFQb4eHhysjIUHFxsePYL8VNWFiYMjMzZbfbS33uF+7u7goODi51exs2bFDXrl0lSd26ddOGDRsuuU+r1aqioiLH5T179sjNzU1xcXFXzJmdna1XX31VTz31lOPY999/ryFDhig+Pl779++XJEVHR+vo0aOy2+1auHCh+vXr57i+p6enNm3apBMnTshisahWrVqX3M/mzZvVrFkz2Wy2K2b5reLiYn3zzTcaP368Hn30UT322GNKSEjQ0qVLS12vqKjomm4XAABUbxRMAACg2khKSpKXl5fee+89FRQU6KefftKSJUs0cOBAtWzZUjabTZ9++qkKCwu1aNEibd269XdvLzc3V35+fpIkf39/nT59+pLr1KlTR9nZ2bp48aKkkl1PCQkJKiws1MWLF3Xx4kXl5+eX+prJkyfrr3/9a6lCa8WKFerevbsGDx6s+fPnO463atVKa9euVXZ2tkJDQx3Hhw4dqri4OP3pT39ScnKyDhw4cEm2RYsW6brrrruKn9yvtmzZomHDhsnNzU3fffed0tPTlZSUpPPnz5e63pEjR363RAMAADULBRMAAKg2PDw89NZbb2n58uXq2LGjnnrqKb3wwgtKSEiQh4eHXn/9dX355Zdq166dvvnmG/Xs2dNxatvl+Pv7Ky8vT1LJjKaAgIBLrlOrVi21adPGMStp586d2r59u5KSkhz/Bg4c6Lj+119/LX9/f/Xu3dtxLCMjQ3v37tXYsWP15ptvlppt1K9fPz333HNq3759qft1d3fXfffdp9mzZ+uBBx7Q66+/fkm2lJQUxw6s3zp37pxatWpV6t/u3btls9kcO8DeeustrVu3TpJK7VbKz8/Xxo0bS30PAACgZmMGEwAAcHlLlixxfFy/fn3HIOzfat68uWbPnu24fPPNN6tXr15XvN3WrVvrww8/1LBhw7RixQq1bt36ste7//779dZbb6lHjx564okn9MQTT1z2eseOHdNHH310Sb758+fr0Ucf1YABAySV7HD6ZddTbGys2rRpowEDBiglJcXxNenp6Y7ZTyEhIaVO/fvFrFmzLpsjJiZGu3fvvuznCgoK9PHHH+v22293/Ky2bt1aqmCaO3euhgwZctnT8gAAQM1EwQQAAGqMNWvWKC4uTkFBQZozZ452796tbt26OT5/zz33aOfOnTp48KCSk5M1fPhwhYSE6NZbb1VUVJTuuuuuy95u69atFRcXp+XLl6t79+5XvP+3335bubm5Gjt2rOPYfffdpwULFuj//u//HMc6dOig7777znF50qRJl9zWnj17NH78eHl6esput1+x1LpW7u7uuv766/Xvf//bsZOpfv36GjFihKSSd6+bO3eu493uAAAAJMliv9zLXQAAANXQ9OnT9eqrr+r8+fOKiYnRQw89pJ49e5odCwAAwOVRMAEAAAAAAMAQhnwDAAAAAADAEAomAAAAAAAAGELBBAAAAAAAAEMomAAAAAAAAGAIBRMAAAAAAAAMoWACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIb8fxzqA03KlXkqAAAAAElFTkSuQmCC\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot luminosity distribution\n", + "ldist = population.grid_results['luminosity distribution']\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "pad_output_distribution(ldist,\n", + " binwidth['luminosity'])\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict({'ZAMS luminosity distribution' : ldist})\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")" + ] + }, + { + "cell_type": "markdown", + "id": "0546f2f3-4732-4841-8ef3-565fbf6b9961", + "metadata": {}, + "source": [ + "This distribution is peaked at low luminosity, as one expects from observations, but the resolution is clearly not great because it's not smooth - it's spiky! \n", + "\n", + "If you noticed above, the total probability of the grid was about 0.2. Given that the total probability of a probability distribution function should be 1.0, this shows that our sampling is (very) poor. \n", + "\n", + "We could simply increase the resolution to compensate, but this is very CPU intensive and a complete waste of time and resources. Instead, let's try sampling the masses of the stars in a smarter way." + ] + }, + { + "cell_type": "markdown", + "id": "673031c9-7d80-45d4-b209-301c127d3edf", + "metadata": {}, + "source": [ + "# A better-sampled grid\n", + "\n", + "The IMF has many more low-mass stars than high-mass stars. So, instead of sampling M1 linearly, we can sample it in log space. \n", + "\n", + "To do this we first rename the mass grid variable so that it is clear we are working in (natural) logarithmic phase space." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "5956f746-e3b9-4912-b75f-8eb0af66d3f6", + "metadata": {}, + "outputs": [], + "source": [ + "# Rename the old variable (M_1) because we want it to be called lnM_1 now\n", + "population.rename_grid_variable(\"M_1\",\"lnM_1\")" + ] + }, + { + "cell_type": "markdown", + "id": "532f691c-c1f6-46cc-84f2-970ec1216e40", + "metadata": {}, + "source": [ + "Next, we change the spacing function so that it works in the log space. We also adapt the probability calculation so that it calculates dprob/dlnM = M * dprob/dM. Finally, we set the precode to compute M_1 because binary_c requires the actual mass, not the logarithm of the mass." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "108d470a-bb21-40b0-8387-2caa7ab0f923", + "metadata": {}, + "outputs": [], + "source": [ + "# update the sampling, note that the IMF is dprob/dM1, and the phase \n", + "# space is now sampled in lnM1, so we multiply by M_1 to \n", + "# because M * dprob/dM = dprob/dlnM\n", + "population.update_grid_variable(\n", + " name=\"lnM_1\",\n", + " spacingfunc=\"const(math.log({min}), math.log({max}), {res})\".format(min = massrange[0], max = massrange[1], res = resolution[\"M_1\"]),\n", + " probdist=\"three_part_powerlaw(M_1, 0.1, 0.5, 1.0, 150, -1.3, -2.3, -2.3)*M_1\",\n", + " dphasevol=\"dlnM_1\",\n", + " parameter_name=\"M_1\",\n", + " precode=\"M_1=math.exp(lnM_1)\",\n", + ")\n", + "# print(population.grid_options[\"_grid_variables\"]) # debugging" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "fb8db646-f3d0-4ccd-81ba-7fde23f29c79", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating grid code\n", + "Constructing/adding: lnM_1\n", + "Grid has handled 40 stars\n", + "with a total probability of 0.9956307907476224\n", + "Total starcount for this run will be: 40\n", + "Generating grid code\n", + "Constructing/adding: lnM_1\n", + "Population-83f80d829dbd418aa2bc745c99b71991 finished! The total probability was: 0.9956307907476224. It took a total of 0.9961590766906738s to run 40 systems on 2 cores\n", + "There were no errors found in this run.\n", + "OrderedDict([('luminosity distribution', OrderedDict([(0.25, 0.0212294), (2.75, 0.00321118), (-0.25, 0.0268827), (1.25, 0.0104553), (3.75, 0.00283037), (6.25, 7.34708e-05), (-0.75, 0.0771478), (0.75, 0.030004499999999996), (2.25, 0.00921541), (3.25, 0.0045385), (1.75, 0.014776889999999999), (4.25, 0.002380189), (4.75, 0.000869303), (5.25, 0.0007310379999999999), (5.75, 0.00036002859999999996), (-2.75, 0.1961345), (-1.75, 0.2181597), (-3.25, 0.0), (-2.25, 0.2568974), (-1.25, 0.11973310000000001)]))])\n" + ] + } + ], + "source": [ + "# Clean and re-evolve the population \n", + "population.clean()\n", + "analytics = population.evolve() \n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "markdown", + "id": "182b1094-5057-4ccf-bac6-9b0e560ad4f6", + "metadata": {}, + "source": [ + "You should see that the total probability is very close to 1.0, as you would expect for a well-sampled grid. The total will never be exactly 1.0, but that is because we are running a simulation, not a perfect copy of reality." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "68ee1e56-21e5-48f4-b74c-50e48685ae94", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJgAAAJWCAYAAAAUZj1OAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAB37ElEQVR4nOzdd3iV9f3/8dcZ2XtPstkhrLD3ElkyREGtA+vA0eHXqq1SRa221rb+2lpx1C3WVYaAKEtUlpAwE0YgJJCQkAGEEFbW+f2BpqUKAZJz7pOc5+O6uC7PneTcrxy8Q/LK5/O+TTabzSYAAAAAAADgCpmNDgAAAAAAAICWjYIJAAAAAAAATULBBAAAAAAAgCahYAIAAAAAAECTUDABAAAAAACgSSiYAAAAAAAA0CQUTAAAAAAAAGgSq9EB7OnYsZOqr7fZ9RwhIb46cqTKrucAnBnXAMB1AHANwNVxDcDVcQ24DrPZpKAgnx99W6sumOrrbXYvmL4/D+DKuAYArgOAawCujmsAro5rAGyRAwAAAAAAQJNQMAEAAAAAAKBJWvUWOQAAAAAAHKmurlbHjpWptrba6CgOU1pqVn19vdEx0IysVncFBYXJYrn02oiCCQAAAACAZnLsWJk8Pb3l4xMpk8lkdByHsFrNqq2lYGotbDabTp6s1LFjZQoNjbrkj2OLHAAAAAAAzaS2tlo+Pv4uUy6h9TGZTPLx8b/sVXgUTAAAAAAANCPKJbR0V/L/MAUTAAAAAAAAmoSCCQAAAACAVmjbti267bYbz/szeHBvffHFZw3v8+9/f6ihQ/vqyJHy8z524MB0/d//3X/esYqKCg0Z0kevv/6KJOnw4cN6+OEHdNNN1+vmm6/Xb3/7ax07dvQHOV5//ZWGj2mKf/7zZa1Z81WTn+d7CxZ8ogULPpEkPfvskzp8uPiKnuf+++/S5s0Z2r17p/7wh6cv+H5FRYf0+98/1WiWgQPTL+v8a9Z8rQ8+eO8Hz+NoDPkGAAAAAKAV6tq1u9566/2Gxx9+OFeff75EQ4eOaDi2ZMkiDRw4RIsXL9Stt/70vI8vKChQZWWl/P39JUmrV6+Un59/w9uff/5ZXX31WI0ZM1a1tfV699039fzzv9ezzz5vl8/njjtmNuvzTZo0teG/N2/O0IwZdzbp+Tp06KRf/7rTBd9++HCxDh0qbDTL5dqzZ1ezPE9TUTABAAAAANDKbdu2Re+884ZeffVteXh4SJL27durysrjevjhxzRr1sO6+eYZMpv/s9Fp4MDB+uab1Ro37hpJ5wqmwYOHNrz96NFynT17puHxtdder127dl40x8CB6VqzJkOS9Nlni7RlS6Yee2y2pk6doOHDR2ndujWyWCy6++779MEH76mwsED33fdLjRgxSs88M1vdu/dU9+499eijv1JSUrJycvYoODhETz/9B/n7B2jt2m/02mtzZLPVKzo6Rg899KiCg0P04ov/T5s2fSuLxayBA4fo9tvvalhV5e7uofLyMj300C90xx0z9cEHc/Xyy29IkpYuXazs7B361a9+0/A5VFdX67nnntbu3bsUGRmt48crJJ0rqd5441W9+OKr+uCD97R06RKZzSZ17NhZDz/8mP761z+pqOiQ/vzn5zRs2AjNmfM31dXVKykpWVFR0ZKkn/70bknSc889o127shUQEKjf/OZxRUZG6v7779Ltt9+lHj3SVVxcpJ/97G49//xftXDhPElSZGRUwyqsn/707gu+FlOnTtDo0WO1ceN6nT59RrNmPakOHTpe8v9LF0LBBAAAAACAHazdUaw1269s21VjBqZFaUCXS7uF/LFjRzV79mN65JHfKiYmtuH4Z599quHDR6pDh46yWCz69tt16tdvYMPbhw8fqXfeeUPjxl2jI0fKZbNJISGhDW+/++779dRTv9Xrr7+qnj17qW/f/ho+fNQVf06hoWF6772P9OyzT+q9997S3/72snbs2Ka//e3PGjHi/Ofdt2+vfvObx9WuXQc99thDWrZsqUaMuErPP/+s5sx5XVFR0Xr//Xf0l7/8Ufff/0tt2LBO7733kc6ePavnnvudzp492/BcN998mxYu/Leef/6vioyM0j/+8TcdOlSomJhYLV26WHffff5WwU8++VCSNHfuJyooOKhbb73hvLfX1tbqvffe0oIFn8tsNusvf3lOZWWl+sUvfqU33nhVDz74iDZvzlBBwUF98sli+fr6/mALYffuPfTII49p3ryP9de//km///2ffvQ1S0xM0sSJUyRJ48Zd0/A8x44d/dHX4ne/e06SFBAQoNdee0effPKB3n33DT3zTNNXnTGDCQAAAACAVqq+vl6zZ8/SyJGjz1t9VFtbq2XLPtfIkaMlScOHj2pYCfO91NQ0HTx4QFVVVVq9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hQsXasKECfzDApdQUlKiF154Qe+//74WLlyoDz/8UPv27TM6FuAw69at05o1azR//nwtWLBA2dnZWr58udGxAIdbv3695s+fb3QMwBAFBQV64okn9NJLL2nRokXauXOnvvrqK6NjwSAUTM3gD3/4g2677TajYwCGqK6u1i9+8Qt16NBBktS+fXsVFxcbnAqwv3Xr1qlv374KDAyUt7e3Ro8erc8//9zoWIDDhIWF6de//rXc3d3l5uam5ORkFRUVGR0LcKiKigq98MILmjlzptFRAEMsX75cY8eOVWRkpNzc3PTCCy+oa9euRseCQSiYmmjlypU6c+aMrr76aqOjAIZwd3fXxIkTJUn19fV68cUXNXLkSINTAfZXWlqqsLCwhsfh4eEqKSkxMBHgWG3btlW3bt0kSfn5+frss880ZMgQY0MBDvb444/rgQcekL+/v9FRAEMcOHBAdXV1+ulPf6prrrlG77//vgICAoyOBYNYjQ7QUixdulS///3vzzuWlJSkqqoqvfXWW8aEAhzsQtfBW2+9perqav36179WbW2t7r77boMSAo5js9l+cMxkMhmQBDDW3r17dffdd+uRRx5RQkKC0XEAh/n4448VFRWlfv36ad68eUbHAQxRV1enjIwMvfvuu/L29ta9996r+fPna8qUKUZHgwEomC7RmDFjNGbMmPOOffzxx3rllVd00003NRybOHGi5s6dK19fX0dHBOzux64DSTp58qTuueceBQYGas6cOXJzczMgHeBYERERysjIaHhcWlqq8PBwAxMBjpeZmamf//znevTRRzVu3Dij4wAO9dlnn6msrEwTJ07U8ePHderUKT377LN69NFHjY4GOExoaKj69eun4OBgSdKIESO0fft2CiYXZbL92K9gcUXat2+vPXv2GB0DcLh7771XISEheuqpp1jBAZdRUlKiG264QZ988om8vLw0ffp0Pf3000pLSzM6GuAQxcXFmjx5sl544QX169fP6DiAoebNm6eNGzfqD3/4g9FRAIfatm2bHnnkEX300Ufy8fHRfffdpxEjRui6664zOhoMwAomAE2yc+dOrVy5UikpKZo0aZKkc7NoXnvtNWODAXYWERGhBx54QLfccotqamo0depUyiW4lNdff11nz5497wfq6dOn64YbbjAwFQDAkbp27ao77rhDN954o2pqajRgwABde+21RseCQVjBBAAAAAAAgCbhLnIAAAAAAABoEgomAAAAAAAANAkFEwAAAAAAAJqEggkAAAAAAABNQsEEAAAAAACAJqFgAgAAAAAAQJNQMAEAAAAAAKBJKJgAAECLN3z4cK1bt87oGAAAAC6LggkAAKCZHT16VO3bt1dJSYnRUQAAAByCggkAAKAZ/OlPf9I333wjSdq9e7eCg4MVERFhcKpzfv7znysnJ6fhcWFhobp3735Fz3Xy5EndcccdOnPmTHPFAwAArQAFEwAAaFVyc3N18803Kz09XePGjdPKlSsb3padna1Jkyape/fu+vnPf65f/vKXeuGFF5p8zq1bt2rfvn0aNGiQJGnXrl3q0KFDk5+3OVRXV+vAgQNq165dszyfj4+Pxo8fr7/+9a/N8nwAAKB1oGACAACtRk1NjWbOnKkBAwZo3bp1mjVrln71q19p//79qq6u1v3336/Jkydr48aNGj9+vFasWNEs5/373/+uadOmNTx2poJp3bp16tevX7M+55gxY7Ro0SKVl5c36/MCAICWi4IJAAC0Gtu2bdOpU6d01113yd3dXf369dOwYcO0ZMkSbdu2TbW1tbrlllvk5uamq666Sl26dGn42BMnTmjq1Knq3r37edvJnn/+ed1444166KGHVFNT84NzVlZWKjMzUwMGDGg4tnv3bnXs2PEH7/vhhx/q5ptvbviTlpam7du3N7x9+vTpevHFFyWd28bWvn17bdiwQdK5lUi9evXSe++9J0mqqqrSzJkzdfPNN2vatGn66quvfvQ1WblypUaOHHk5L2OjPDw81KNHjwueEwAAuB6r0QEAAACaS2lpqSIjI2U2/+d3aNHR0SopKVFpaakiIiJkMpka3hYVFdXw356ennr11Vf1xz/+seHY7t27VVJSovfff19z5szRF198ofHjx593zgMHDigsLEzu7u6SpLNnzyovL0+dOnX6Qb5p06Y1rHRatWqV5s+fr7S0NElScXGxIiIitHHjxob3T01N1fLly9W3b1+tX79e8fHxDW9buHChBg0apJtuukk2m00nTpz4wfnq6+u1detWzZ49+5Jev++VlJTonXfeUW1trWw2mzp27KjJkyef9z5xcXHKy8u7rOcFAACtFyuYAABAqxEeHq7Dhw+rvr6+4dj3xU1YWJhKSkpks9nOe9v33NzcFBwcfN7zbd68WQMHDpQkDRo0SJs3b/7BOc1ms+rq6hoe5+TkyGq1KjEx8YI5jx49qr/+9a968sknG4598cUXmjBhgpKSkpSbmytJiomJUVFRkWw2m5YvX67/3979hTT1xnEc/8icduEWsm4EhcbYXY02Mb1xLgMxMRpSDLoRjC5cUIhXioy6EgQvRKQJQRHeCEFtDiYxhgwZ9Af6IyIrqJtGXYSQRGN/yt+FdH6szfjFLn6k7xcc2HnO9zznOefys+c8p6+vz6hvbGzUy5cv9fnzZ9XV1clqtVZc59WrVzpx4oRMJtO+Y/nVjx8/FI1GNTY2pomJCU1OTsrhcGhtba2s7vv373/ULwAAONgImAAAwIHhcrl05MgR3blzR8ViUU+ePFEymdTAwIBOnTolk8mkpaUllUolJRIJbWxs/La/nZ0dNTU1SZIsFou+fPlSUdPW1qbt7W3l83lJe7OeHA6HSqWS8vm88vm8CoVC2Tk3b97UjRs3ygKt9fV1eb1eDQ4OanV11Wh3u9169uyZtre3dezYMaP9woULstvtunLligKBgN69e1cxtkQiobNnz/6HJ/ev169fy+/3q76+XvF4XNlsVi6XS7lcrqzuw4cPvw3RAADA4ULABAAADoyGhgaFw2GlUil1dXXp1q1bmpmZkcPhUENDg+bn5/XgwQN1dHQoGo3K5/MZr7ZVY7FY9PXrV0l7azQdPXq0osZqtaq9vd1YK2lra0ubm5tyuVzGNjAwYNQ/evRIFotFvb29RtunT5/09u1bjY6O6vbt22VrG/X19Wl6elqnT58uu67ZbFYwGFQkEtH169c1Pz9fMbZ0Om3MwPrVt2/f5Ha7y7ZMJiOTyWTMAAuHw3r+/Lkklc1WKhQKevHiRdk9AACAw401mAAAwF8vmUwav51Op7EQ9q9OnjypSCRi7F+6dElnzpzZt1+Px6O7d+/K7/drfX1dHo+nat21a9cUDofV09OjUCikUChUte7jx4+6d+9exfhWV1c1MTGh/v5+SXsznH7Oejp+/Lja29vV39+vdDptnJPNZo21n2w2W9mrfz89fPiw6jhaW1uVyWSqHisWi7p//76Gh4eNZ7WxsVEWMMViMZ0/f77qa3kAAOBwImACAACHxtOnT2W329Xc3KyVlRVlMhl1d3cbx69evaqtrS29f/9egUBAQ0NDstlsunz5slpaWjQyMlK1X4/HI7vdrlQqJa/Xu+/1FxcXtbOzo9HRUaMtGAzq8ePHWlhYMNo6OzsVj8eN/ampqYq+3rx5o7GxMTU2Nmp3d3ffUOtPmc1mnTt3TrOzs8ZMJqfTqYsXL0ra+3pdLBYzvnYHAAAgSXW71f7uAgAAOICWl5c1NzenXC6n1tZWjY+Py+fz/d/DAgAA+OsRMAEAAAAAAKAmLPINAAAAAACAmhAwAQAAAAAAoCYETAAAAAAAAKgJARMAAAAAAABqQsAEAAAAAACAmhAwAQAAAAAAoCYETAAAAAAAAKgJARMAAAAAAABq8g/wlbD9p3152QAAAABJRU5ErkJggg==\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot luminosity distribution\n", + "ldist = population.grid_results['luminosity distribution']\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "pad_output_distribution(ldist,\n", + " binwidth['luminosity'])\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict({'ZAMS luminosity distribution' : ldist})\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "31fe91bb-177d-4e4e-90cf-298a3f8a8b61", + "metadata": {}, + "source": [ + "Most stars are low mass red dwarfs, with small luminosities. Without the IMF weighting, our model population would have got this completely wrong! \n", + "\n", + "As you increase the resolution, you will see this curve becomes even smoother. The wiggles in the curve are (usually) sampling artefacts because the curve should monotonically brighten above about log(*L*/L<sub>☉</sub>)=-2. \n", + " \n", + "Remember you can play with the binwidth too. If you want a very accurate distribution you need a narrow binwidth, but then you'll also need high resolution (lots of stars) so lots of CPU time, hence cost, CO<sub>2</sub>, etc." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/build/html/notebook_population.html b/docs/build/html/notebook_population.html index 5336a7fdf7894646019acf4276fba685e69c0b2a..0b0937d50cdd928bcf5aec42308158b444eaef2b 100644 --- a/docs/build/html/notebook_population.html +++ b/docs/build/html/notebook_population.html @@ -103,6 +103,9 @@ </li> <li class="toctree-l2"><a class="reference internal" href="notebook_extra_features.html">Extra features and functionality of binarycpython</a></li> <li class="toctree-l2"><a class="reference internal" href="notebook_api_functionality.html">Using the API functionality of binarycpython</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html">Example use case: Zero-age stellar luminosity function</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_single.html#A-better-sampled-grid">A better-sampled grid</a></li> +<li class="toctree-l2"><a class="reference internal" href="notebook_luminosity_function_binaries.html">Zero-age stellar luminosity function in binaries</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="binary_c_parameters.html">Binary_c parameters</a></li> @@ -457,9 +460,12 @@ div.rendered_html tbody tr:hover { </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> <span></span><span class="kn">import</span> <span class="nn">os</span> + <span class="kn">from</span> <span class="nn">binarycpython.utils.custom_logging_functions</span> <span class="kn">import</span> <span class="n">temp_dir</span> <span class="kn">from</span> <span class="nn">binarycpython.utils.grid</span> <span class="kn">import</span> <span class="n">Population</span> +<span class="n">TMP_DIR</span> <span class="o">=</span> <span class="n">temp_dir</span><span class="p">(</span><span class="s2">"notebooks"</span><span class="p">,</span> <span class="s2">"notebook_population"</span><span class="p">)</span> + <span class="c1"># help(Population) # Uncomment to see the public functions of this object</span> </pre></div> </div> @@ -497,11 +503,12 @@ you have set them.</p> <span class="c1"># grid_options</span> - <span class="n">amt_cores</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="c1"># grid_options</span> + <span class="n">amt_cores</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> + <span class="n">tmp_dir</span><span class="o">=</span><span class="n">TMP_DIR</span><span class="p">,</span> <span class="c1"># Custom options # TODO: need to be set in grid_options probably</span> <span class="n">data_dir</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span> - <span class="n">temp_dir</span><span class="p">(),</span> <span class="s2">"example_python_population_result"</span> + <span class="n">TMP_DIR</span><span class="p">,</span> <span class="s2">"example_python_population_result"</span> <span class="p">),</span> <span class="c1"># custom_options</span> <span class="n">base_filename</span><span class="o">=</span><span class="s2">"example_pop.dat"</span><span class="p">,</span> <span class="c1"># custom_options</span> <span class="p">)</span> @@ -523,7 +530,8 @@ adding: orbital_period=45000000080 to BSE_options adding: max_evolution_time=15000 to BSE_options adding: eccentricity=0.02 to BSE_options adding: amt_cores=2 to grid_options -<<<< Warning: Key does not match previously known parameter: adding: data_dir=/tmp/binary_c_python/example_python_population_result to custom_options >>>> +adding: tmp_dir=/tmp/binary_c_python/notebooks/notebook_population to grid_options +<<<< Warning: Key does not match previously known parameter: adding: data_dir=/tmp/binary_c_python/notebooks/notebook_population/example_python_population_result to custom_options >>>> <<<< Warning: Key does not match previously known parameter: adding: base_filename=example_pop.dat to custom_options >>>> 1 example_pop.dat @@ -548,7 +556,7 @@ include_binary_c_version_info=False - include_binary_c_help_all (all the help in </div> <div class="output_area docutils container"> <div class="highlight"><pre> -Writing settings to /tmp/binary_c_python/example_python_population_result/example_pop_settings.json +Writing settings to /tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/example_pop_settings.json </pre></div></div> </div> <div class="nboutput nblast docutils container"> @@ -557,7 +565,7 @@ Writing settings to /tmp/binary_c_python/example_python_population_result/exampl </div> <div class="output_area docutils container"> <div class="highlight"><pre> -'/tmp/binary_c_python/example_python_population_result/example_pop_settings.json' +'/tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/example_pop_settings.json' </pre></div></div> </div> </div> @@ -584,7 +592,7 @@ Writing settings to /tmp/binary_c_python/example_python_population_result/exampl <div class="highlight"><pre> Help on method add_grid_variable in module binarycpython.utils.grid: -add_grid_variable(name:str, longname:str, valuerange:Union[list, str], resolution:str, spacingfunc:str, probdist:str, dphasevol:Union[str, int], parameter_name:str, gridtype:str='edge', branchpoint:int=0, precode:Union[str, NoneType]=None, condition:Union[str, NoneType]=None) -> None method of binarycpython.utils.grid.Population instance +add_grid_variable(name:str, longname:str, valuerange:Union[list, str], resolution:str, spacingfunc:str, probdist:str, dphasevol:Union[str, int], parameter_name:str, gridtype:str='centred', branchpoint:int=0, precode:Union[str, NoneType]=None, condition:Union[str, NoneType]=None) -> None method of binarycpython.utils.grid.Population instance Function to add grid variables to the grid_options. The execution of the grid generation will be through a nested for loop. @@ -652,7 +660,7 @@ add_grid_variable(name:str, longname:str, valuerange:Union[list, str], resolutio condition = 'self.grid_options['binary']==1' gridtype: Method on how the value range is sampled. Can be either 'edge' (steps starting at - the lower edge of the value range) or 'center' + the lower edge of the value range) or 'centred' (steps starting at lower edge + 0.5 * stepsize). </pre></div></div> @@ -743,7 +751,7 @@ Added grid variable: { "dphasevol": "dlnm1", "parameter_name": "M_1", "condition": "", - "gridtype": "edge", + "gridtype": "centred", "branchpoint": 0, "grid_variable_number": 0 } @@ -868,7 +876,7 @@ if(stardata->star[0].stellar_type >= 13) </div> <div class="output_area docutils container"> <div class="highlight"><pre> -adding: parse_function=<function parse_function at 0x7ff3bdf79620> to grid_options +adding: parse_function=<function parse_function at 0x7f531bc3b6a8> to grid_options </pre></div></div> </div> </div> @@ -900,25 +908,25 @@ adding: verbosity=0 to grid_options Generating grid code Constructing/adding: lnm1 Grid has handled 20 stars -with a total probability of 0.05150046619238192 +with a total probability of 0.044402888438054094 Total starcount for this run will be: 20 -EXAMPLE_COMPACT_OBJECT 2.867655467480e+01 1.33079 9.81391 0.00167028 13 Generating grid code Constructing/adding: lnm1 -EXAMPLE_COMPACT_OBJECT 1.931266944719e+01 1.3933 12.3177 0.00124307 13 -EXAMPLE_COMPACT_OBJECT 4.439623364590e+01 1.38004 7.81906 0.00224431 13 -EXAMPLE_COMPACT_OBJECT 1.364277535630e+01 1.47961 15.4603 0.000925128 13 -EXAMPLE_COMPACT_OBJECT 1.017435498578e+01 1.59052 19.4046 0.000688507 13 -EXAMPLE_COMPACT_OBJECT 8.294870923827e+00 1.7197 24.3552 0.000512406 13 -EXAMPLE_COMPACT_OBJECT 6.802132608769e+00 1.84162 30.5689 0.000381347 13 -EXAMPLE_COMPACT_OBJECT 5.723570798020e+00 1.99471 38.3678 0.00028381 13 -EXAMPLE_COMPACT_OBJECT 4.933751523833e+00 2.15875 48.1564 0.000211219 13 -EXAMPLE_COMPACT_OBJECT 4.337250536639e+00 2.35209 60.4424 0.000157195 14 -EXAMPLE_COMPACT_OBJECT 3.862081089332e+00 2.56776 75.8628 0.000116989 14 -EXAMPLE_COMPACT_OBJECT 3.449960890183e+00 2.80457 95.2174 8.70668e-05 14 -EXAMPLE_COMPACT_OBJECT 3.172196856333e+00 3.05193 119.51 6.47976e-05 14 -EXAMPLE_COMPACT_OBJECT 3.069627290216e+00 3.27563 150 4.82242e-05 14 -Population-2a7732d03e594ef4b5dfe9051b41d9c0 finished! The total probability was: 0.05150046619238191. It took a total of 0.7797017097473145s to run 20 systems on 2 cores +EXAMPLE_COMPACT_OBJECT 4.139293101586e+01 1.29427 8.13626 0.00202467 13 +EXAMPLE_COMPACT_OBJECT 2.802986496151e+01 1.33699 10.0967 0.00152924 13 +EXAMPLE_COMPACT_OBJECT 1.963621764679e+01 1.39754 12.5294 0.00115504 13 +EXAMPLE_COMPACT_OBJECT 1.427601421985e+01 1.47745 15.5483 0.000872405 13 +EXAMPLE_COMPACT_OBJECT 1.094409257247e+01 1.57571 19.2947 0.00065893 13 +EXAMPLE_COMPACT_OBJECT 9.181971798545e+00 1.68748 23.9436 0.000497691 13 +EXAMPLE_COMPACT_OBJECT 7.905335716621e+00 1.77287 29.7128 0.000375908 13 +EXAMPLE_COMPACT_OBJECT 7.451192744924e+00 1.81495 36.872 0.000283924 13 +EXAMPLE_COMPACT_OBJECT 7.396133472739e+00 1.82088 45.7561 0.000214449 13 +EXAMPLE_COMPACT_OBJECT 7.396675941641e+00 1.82123 56.7809 0.000161974 13 +EXAMPLE_COMPACT_OBJECT 7.404641347602e+00 1.82074 70.4621 0.000122339 13 +EXAMPLE_COMPACT_OBJECT 7.444217227690e+00 1.81636 87.4397 9.2403e-05 13 +EXAMPLE_COMPACT_OBJECT 7.453317880232e+00 1.81536 108.508 6.97923e-05 13 +EXAMPLE_COMPACT_OBJECT 7.450828476484e+00 1.81563 134.653 5.27143e-05 13 +Population-f28b5f98d7ef40dcb17fc2481a6d3ced finished! The total probability was: 0.04440288843805411. It took a total of 2.785212755203247s to run 20 systems on 2 cores There were no errors found in this run. </pre></div></div> </div> @@ -937,7 +945,7 @@ There were no errors found in this run. </div> <div class="output_area docutils container"> <div class="highlight"><pre> -{'population_name': '2a7732d03e594ef4b5dfe9051b41d9c0', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 0.05150046619238191, 'total_count': 20, 'start_timestamp': 1628444120.234709, 'end_timestamp': 1628444121.0144107, 'total_mass_run': 730.1048014407228, 'total_probability_weighted_mass_run': 0.2983275843337705, 'zero_prob_stars_skipped': 0} +{'population_name': 'f28b5f98d7ef40dcb17fc2481a6d3ced', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 0.04440288843805411, 'total_count': 20, 'start_timestamp': 1629459533.935186, 'end_timestamp': 1629459536.7203987, 'total_mass_run': 684.2544031669779, 'total_probability_weighted_mass_run': 0.28134439269236855, 'zero_prob_stars_skipped': 0} </pre></div></div> </div> </div> @@ -990,7 +998,7 @@ write_binary_c_calls_to_file(output_dir:Union[str, NoneType]=None, output_filena </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> -<span></span><span class="n">example_pop</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">verbosity</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span> +<span></span><span class="n">example_pop</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">verbosity</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="n">calls_filename</span> <span class="o">=</span> <span class="n">example_pop</span><span class="o">.</span><span class="n">write_binary_c_calls_to_file</span><span class="p">()</span> <span class="nb">print</span><span class="p">(</span><span class="n">calls_filename</span><span class="p">)</span> @@ -1008,37 +1016,17 @@ Generating grid code Generating grid code Constructing/adding: lnm1 Saving grid code to grid_options -Writing grid code to /tmp/binary_c_python/binary_c_grid_2a7732d03e594ef4b5dfe9051b41d9c0.py -Loading grid code function from /tmp/binary_c_python/binary_c_grid_2a7732d03e594ef4b5dfe9051b41d9c0.py +Writing grid code to /tmp/binary_c_python/notebooks/notebook_population/binary_c_grid_f28b5f98d7ef40dcb17fc2481a6d3ced.py +Loading grid code function from /tmp/binary_c_python/notebooks/notebook_population/binary_c_grid_f28b5f98d7ef40dcb17fc2481a6d3ced.py Grid code loaded -Writing binary_c calls to /tmp/binary_c_python/example_python_population_result/binary_c_calls.txt -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. -_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction. +Writing binary_c calls to /tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/binary_c_calls.txt Grid has handled 20 stars -with a total probability of 0.05150046619238192 -/tmp/binary_c_python/example_python_population_result/binary_c_calls.txt -binary_c M_1 2.0 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.013208238029791246 -binary_c M_1 2.5102526289471614 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.009829948023831718 -binary_c M_1 3.1506841305680684 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.0073157281034221516 -binary_c M_1 3.9545065608702976 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.005444573822104362 +with a total probability of 0.044402888438054094 +/tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/binary_c_calls.txt +binary_c M_1 2.227955577093495 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.010905083645619543 +binary_c M_1 2.7647737053496777 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.008236638755149857 +binary_c M_1 3.4309362899259503 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.006221155214163634 +binary_c M_1 4.257608426597089 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.004698855121516278 </pre></div></div> </div> </div> @@ -1050,12 +1038,7 @@ binary_c M_1 3.9545065608702976 eccentricity 0.02 max_evolution_time 15000 orbit </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> -<span></span><span class="kn">import</span> <span class="nn">os</span> - -<span class="kn">from</span> <span class="nn">binarycpython.utils.grid</span> <span class="kn">import</span> <span class="n">Population</span> -<span class="kn">from</span> <span class="nn">binarycpython.utils.custom_logging_functions</span> <span class="kn">import</span> <span class="n">temp_dir</span> - -<span class="k">def</span> <span class="nf">parse_function</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output</span><span class="p">):</span> +<span></span><span class="k">def</span> <span class="nf">parse_function</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Example parsing function</span> <span class="sd"> """</span> @@ -1114,11 +1097,12 @@ binary_c M_1 3.9545065608702976 eccentricity 0.02 max_evolution_time 15000 orbit <span class="n">eccentricity</span><span class="o">=</span><span class="mf">0.02</span><span class="p">,</span> <span class="c1"># bse_options</span> <span class="c1"># grid_options</span> - <span class="n">amt_cores</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="c1"># grid_options</span> + <span class="n">amt_cores</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> + <span class="n">tmp_dir</span><span class="o">=</span><span class="n">TMP_DIR</span><span class="p">,</span> <span class="c1"># Custom options: the data directory and the output filename</span> <span class="n">data_dir</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span> - <span class="n">temp_dir</span><span class="p">(),</span> <span class="s2">"example_python_population_result"</span> + <span class="n">TMP_DIR</span><span class="p">,</span> <span class="s2">"example_python_population_result"</span> <span class="p">),</span> <span class="c1"># custom_options</span> <span class="n">base_filename</span><span class="o">=</span><span class="s2">"example_pop.dat"</span><span class="p">,</span> <span class="c1"># custom_options</span> <span class="p">)</span> @@ -1173,15 +1157,15 @@ binary_c M_1 3.9545065608702976 eccentricity 0.02 max_evolution_time 15000 orbit <span class="n">example_pop</span><span class="o">.</span><span class="n">export_all_info</span><span class="p">()</span> <span class="c1"># remove the result file if it exists</span> -<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">temp_dir</span><span class="p">(),</span> <span class="s2">"example_python_population_result"</span><span class="p">,</span> <span class="s2">"example_pop.dat"</span><span class="p">)):</span> - <span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">temp_dir</span><span class="p">(),</span> <span class="s2">"example_python_population_result"</span><span class="p">,</span> <span class="s2">"example_pop.dat"</span><span class="p">))</span> +<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">TMP_DIR</span><span class="p">,</span> <span class="s2">"example_python_population_result"</span><span class="p">,</span> <span class="s2">"example_pop.dat"</span><span class="p">)):</span> + <span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">TMP_DIR</span><span class="p">,</span> <span class="s2">"example_python_population_result"</span><span class="p">,</span> <span class="s2">"example_pop.dat"</span><span class="p">))</span> <span class="c1"># Evolve the population</span> <span class="n">example_pop</span><span class="o">.</span><span class="n">evolve</span><span class="p">()</span> <span class="c1">#</span> -<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">temp_dir</span><span class="p">(),</span> <span class="s2">"example_python_population_result"</span><span class="p">,</span> <span class="s2">"example_pop.dat"</span><span class="p">),</span> <span class="s1">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> +<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">TMP_DIR</span><span class="p">,</span> <span class="s2">"example_python_population_result"</span><span class="p">,</span> <span class="s2">"example_pop.dat"</span><span class="p">),</span> <span class="s1">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> <span class="n">output</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">output</span><span class="p">)</span> @@ -1196,29 +1180,29 @@ binary_c M_1 3.9545065608702976 eccentricity 0.02 max_evolution_time 15000 orbit Generating grid code Constructing/adding: lnm1 Grid has handled 20 stars -with a total probability of 0.05150046619238192 +with a total probability of 0.044402888438054094 Total starcount for this run will be: 20 Generating grid code Constructing/adding: lnm1 -Population-3680f3882c0a449c944462abffea2447 finished! The total probability was: 0.05150046619238191. It took a total of 0.6246354579925537s to run 20 systems on 2 cores +Population-e45c25448b32440cb7e220f4a3562907 finished! The total probability was: 0.04440288843805411. It took a total of 1.9539172649383545s to run 20 systems on 2 cores There were no errors found in this run. time mass zams_mass probability radius stellar_type -2.867655467480e+01 1.33079 9.81391 0.00167028 1.72498e-05 13 -1.931266944719e+01 1.3933 12.3177 0.00124307 1.72498e-05 13 -4.439623364590e+01 1.38004 7.81906 0.00224431 1.72498e-05 13 -1.364277535630e+01 1.47961 15.4603 0.000925128 1.72498e-05 13 -1.017435498578e+01 1.59052 19.4046 0.000688507 1.72498e-05 13 -8.294870923827e+00 1.7197 24.3552 0.000512406 1.72498e-05 13 -6.802132608769e+00 1.84162 30.5689 0.000381347 1.72498e-05 13 -5.723570798020e+00 1.99471 38.3678 0.00028381 1.72498e-05 13 -4.933751523833e+00 2.15875 48.1564 0.000211219 1.72498e-05 13 -4.337250536639e+00 2.35209 60.4424 0.000157195 9.97286e-06 14 -3.862081089332e+00 2.56776 75.8628 0.000116989 1.08873e-05 14 -3.449960890183e+00 2.80457 95.2174 8.70668e-05 1.18914e-05 14 -3.172196856333e+00 3.05193 119.51 6.47976e-05 1.29402e-05 14 -3.069627290216e+00 3.27563 150 4.82242e-05 1.38887e-05 14 +4.139293101586e+01 1.29427 8.13626 0.00202467 1.72498e-05 13 +2.802986496151e+01 1.33699 10.0967 0.00152924 1.72498e-05 13 +1.963621764679e+01 1.39754 12.5294 0.00115504 1.72498e-05 13 +1.427601421985e+01 1.47745 15.5483 0.000872405 1.72498e-05 13 +1.094409257247e+01 1.57571 19.2947 0.00065893 1.72498e-05 13 +9.181971798545e+00 1.68748 23.9436 0.000497691 1.72498e-05 13 +7.905335716621e+00 1.77287 29.7128 0.000375908 1.72498e-05 13 +7.451192744924e+00 1.81495 36.872 0.000283924 1.72498e-05 13 +7.396133472739e+00 1.82088 45.7561 0.000214449 1.72498e-05 13 +7.396675941641e+00 1.82123 56.7809 0.000161974 1.72498e-05 13 +7.404641347602e+00 1.82074 70.4621 0.000122339 1.72498e-05 13 +7.444217227690e+00 1.81636 87.4397 9.2403e-05 1.72498e-05 13 +7.453317880232e+00 1.81536 108.508 6.97923e-05 1.72498e-05 13 +7.450828476484e+00 1.81563 134.653 5.27143e-05 1.72498e-05 13 </pre></div></div> </div> @@ -1228,12 +1212,7 @@ time mass zams_mass probability radius stellar_type </pre></div> </div> <div class="input_area highlight-ipython3 notranslate"><div class="highlight"><pre> -<span></span><span class="kn">import</span> <span class="nn">os</span> - -<span class="kn">from</span> <span class="nn">binarycpython.utils.grid</span> <span class="kn">import</span> <span class="n">Population</span> -<span class="kn">from</span> <span class="nn">binarycpython.utils.custom_logging_functions</span> <span class="kn">import</span> <span class="n">temp_dir</span> - -<span class="k">def</span> <span class="nf">parse_function</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output</span><span class="p">):</span> +<span></span><span class="k">def</span> <span class="nf">parse_function</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Example parsing function</span> <span class="sd"> """</span> @@ -1298,10 +1277,11 @@ time mass zams_mass probability radius stellar_type <span class="c1"># grid_options</span> <span class="n">amt_cores</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="c1"># grid_options</span> + <span class="n">tmp_dir</span><span class="o">=</span><span class="n">TMP_DIR</span><span class="p">,</span> <span class="c1"># Custom options: the data directory and the output filename</span> <span class="n">data_dir</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span> - <span class="n">temp_dir</span><span class="p">(),</span> <span class="s2">"example_python_population_result"</span> + <span class="n">TMP_DIR</span><span class="p">,</span> <span class="s2">"example_python_population_result"</span> <span class="p">),</span> <span class="c1"># custom_options</span> <span class="n">base_filename</span><span class="o">=</span><span class="s2">"example_pop.dat"</span><span class="p">,</span> <span class="c1"># custom_options</span> <span class="p">)</span> @@ -1399,14 +1379,14 @@ time mass zams_mass probability radius stellar_type <span class="n">example_pop</span><span class="o">.</span><span class="n">export_all_info</span><span class="p">()</span> <span class="c1"># remove the result file if it exists</span> -<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">temp_dir</span><span class="p">(),</span> <span class="s2">"example_python_population_result"</span><span class="p">,</span> <span class="s2">"example_pop.dat"</span><span class="p">)):</span> - <span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">temp_dir</span><span class="p">(),</span> <span class="s2">"example_python_population_result"</span><span class="p">,</span> <span class="s2">"example_pop.dat"</span><span class="p">))</span> +<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">TMP_DIR</span><span class="p">,</span> <span class="s2">"example_python_population_result"</span><span class="p">,</span> <span class="s2">"example_pop.dat"</span><span class="p">)):</span> + <span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">TMP_DIR</span><span class="p">,</span> <span class="s2">"example_python_population_result"</span><span class="p">,</span> <span class="s2">"example_pop.dat"</span><span class="p">))</span> <span class="c1"># Evolve the population</span> <span class="n">example_pop</span><span class="o">.</span><span class="n">evolve</span><span class="p">()</span> <span class="c1">#</span> -<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">temp_dir</span><span class="p">(),</span> <span class="s2">"example_python_population_result"</span><span class="p">,</span> <span class="s2">"example_pop.dat"</span><span class="p">),</span> <span class="s1">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> +<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">TMP_DIR</span><span class="p">,</span> <span class="s2">"example_python_population_result"</span><span class="p">,</span> <span class="s2">"example_pop.dat"</span><span class="p">),</span> <span class="s1">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> <span class="n">output</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">output</span><span class="p">)</span> @@ -1422,86 +1402,34 @@ Generating grid code Constructing/adding: lnm1 Constructing/adding: q Constructing/adding: log10per -Grid has handled 125 stars -with a total probability of 0.0862478164626921 -Total starcount for this run will be: 125 +Grid has handled 27 stars +with a total probability of 0.024868380796643753 +Total starcount for this run will be: 27 Generating grid code Constructing/adding: lnm1 Constructing/adding: q Constructing/adding: log10per -Population-d20a4c74d20a43b881c0c9e5def5f76c finished! The total probability was: 0.08624781646269201. It took a total of 8.561265707015991s to run 125 systems on 2 cores +Population-05128ef4c5fe4274a0356c3e99e2f2d2 finished! The total probability was: 0.024868380796643757. It took a total of 9.792905807495117s to run 27 systems on 2 cores There were no errors found in this run. time mass_1 zams_mass_1 mass_2 zams_mass_2 stellar_type_1 prev_stellar_type_1 stellar_type_2 prev_stellar_type_2 metallicity probability -8.863377990313e+01 1.29444 5.88566 0 2.99283 13 5 15 15 0.02 0.000627913 -1.146421815741e+02 0 5.88566 1.33062 4.43925 15 15 13 5 0.02 0.000627913 -7.222715508467e+01 1.34922 5.88566 0 5.88566 13 5 15 15 0.02 0.000627913 -1.350021848285e+01 1.48488 17.3205 0 0.1 13 5 15 15 0.02 0.000154349 -1.171108213270e+01 1.53113 17.3205 0 0.1 13 5 15 15 0.02 0.000154349 -1.171086983243e+01 1.53177 17.3205 0 0.1 13 9 15 15 0.02 0.000154349 -1.170770599495e+01 1.53176 17.3205 0 4.40513 13 5 15 15 0.02 0.000172877 -1.230407246199e+01 1.59499 17.3205 0 4.40513 13 5 15 15 0.02 0.000610573 -1.108751340926e+01 1.70319 17.3205 0 8.71025 13 4 15 15 0.02 0.000610573 -1.941017702765e+01 1.34903 17.3205 1.65097 8.71025 13 13 13 5 0.02 0.000172877 -1.980988739731e+01 1.36979 17.3205 1.60808 8.71025 13 13 13 5 0.02 0.000121486 -3.571858031651e+01 1.53174 17.3205 1.30504 8.71025 13 13 13 5 0.02 8.42148e-05 -3.459153942631e+01 1.53176 17.3205 1.31004 8.71025 13 13 13 5 0.02 9.8162e-05 -1.687368550125e+01 1.34937 17.3205 1.73856 13.0154 13 13 13 8 0.02 0.000172877 -1.194842917007e+01 1.78096 17.3205 0 13.0154 13 8 15 15 0.02 0.000610573 -1.733614170983e+01 1.53184 17.3205 1.42375 13.0154 13 13 13 5 0.02 9.8162e-05 -1.723547465714e+01 1.38403 17.3205 1.71288 13.0154 13 13 13 8 0.02 0.000121486 -1.764340254985e+01 1.53174 17.3205 1.41264 13.0154 13 13 13 5 0.02 8.42148e-05 -1.170425790780e+01 1.52963 17.3205 0 17.3205 13 5 15 15 0.02 0.000172877 -8.922967341481e+00 1.85486 17.3205 0 17.3205 13 8 15 15 0.02 0.000610573 -1.232906623449e+01 1.41074 17.3205 1.34281 17.3205 13 13 13 8 0.02 0.000121486 -1.170775828562e+01 1.53183 17.3205 1.53183 17.3205 13 5 13 5 0.02 9.8162e-05 -1.170770422321e+01 1.53175 17.3205 1.53175 17.3205 13 5 13 5 0.02 8.42148e-05 -5.075844624794e+00 2.12303 50.9713 0 0.1 13 8 15 15 0.02 3.79411e-05 -4.766606588165e+00 2.20484 50.9713 0 0.1 14 8 15 15 0.02 3.79411e-05 -4.768305081494e+00 2.18838 50.9713 0 0.1 13 8 15 15 0.02 3.79411e-05 -4.458869865939e+00 2.29864 50.9713 0 12.8178 14 8 15 15 0.02 0.000150087 -1.806014211040e+01 2.10446 50.9713 1.40749 12.8178 13 13 13 5 0.02 2.9863e-05 -4.797342083485e+00 2.10328 50.9713 0 12.8178 13 13 15 1 0.02 4.24954e-05 -1.721374713429e+01 2.21673 50.9713 1.42212 12.8178 14 14 13 5 0.02 2.41295e-05 -4.055645404546e+00 2.47276 50.9713 0 25.5357 14 7 15 15 0.02 0.000150087 -1.806123543037e+01 2.21893 50.9713 1.40745 12.8178 14 14 13 5 0.02 2.07011e-05 -8.117519147635e+00 2.10433 50.9713 2.21473 25.5357 13 13 14 8 0.02 4.24954e-05 -8.315554923168e+00 2.15343 50.9713 2.08519 25.5357 13 13 13 8 0.02 2.9863e-05 -7.917420996633e+00 2.21892 50.9713 1.7431 25.5357 14 14 13 8 0.02 2.07011e-05 -7.693213405973e+00 2.21805 50.9713 1.78384 25.5357 14 14 13 8 0.02 2.41295e-05 -3.753837732894e+00 2.62517 50.9713 0 38.2535 14 7 15 15 0.02 0.000150087 -7.087296558990e+00 2.10417 50.9713 2.40935 38.2535 13 13 14 8 0.02 4.24954e-05 -7.007109286263e+00 2.15854 50.9713 2.28672 38.2535 13 13 14 8 0.02 2.9863e-05 -5.653200958306e+00 2.21878 50.9713 2.0587 38.2535 14 14 13 8 0.02 2.41295e-05 -5.733794947644e+00 2.21892 50.9713 1.99255 38.2535 14 14 13 8 0.02 2.07011e-05 -3.513216011269e+00 2.76647 50.9713 0 50.9713 14 7 15 15 0.02 0.000150087 -4.750574783854e+00 2.27442 50.9713 0 50.9713 14 8 15 15 0.02 4.24954e-05 -7.278384712062e+00 1.29678 50.9713 2.09216 50.9713 13 8 13 13 0.02 2.9863e-05 -4.765996194699e+00 2.20787 50.9713 2.20787 50.9713 14 8 14 8 0.02 2.07011e-05 -4.765535914728e+00 2.21331 50.9713 2.21331 50.9713 14 8 14 8 0.02 2.41295e-05 -3.104706358826e+00 3.17639 150 0 0.1 14 7 15 15 0.02 9.32641e-06 -3.069363482023e+00 3.27572 150 0 0.1 14 7 15 15 0.02 9.32641e-06 -3.047074050271e+00 3.3836 150 0 37.575 14 7 15 15 0.02 3.68933e-05 -5.974759306305e+00 3.23604 150 2.53922 37.575 14 14 14 7 0.02 1.04459e-05 -6.074084349384e+00 3.30145 150 2.13876 37.575 14 14 13 8 0.02 7.34071e-06 -5.733865371895e+00 3.29994 150 2.00498 37.575 14 14 13 8 0.02 5.93135e-06 -3.027099358410e+00 3.53631 150 0 75.05 14 7 15 15 0.02 3.68933e-05 -5.807147339697e+00 3.30197 150 1.9791 37.575 14 14 13 8 0.02 5.08861e-06 -4.862942347290e+00 3.25294 150 2.97823 75.05 14 14 14 7 0.02 1.04459e-05 -4.556479830908e+00 3.29942 150 2.73221 75.05 14 14 14 7 0.02 7.34071e-06 -3.853070305680e+00 3.29977 150 2.62486 75.05 14 14 14 7 0.02 5.93135e-06 -3.881529045940e+00 3.30149 150 2.55924 75.05 14 14 14 7 0.02 5.08861e-06 -3.015033359333e+00 3.64419 150 0 112.525 14 7 15 15 0.02 3.68933e-05 -4.126828648362e+00 3.32047 150 0 112.525 14 14 15 3 0.02 1.04459e-05 -3.990017992944e+00 3.3032 150 2.94027 112.525 14 14 14 7 0.02 7.34071e-06 -3.206771867883e+00 3.07671 150 3.11282 112.525 14 14 14 7 0.02 5.93135e-06 -3.006827156705e+00 3.72638 150 0 150 14 7 15 15 0.02 3.68933e-05 -3.218786094847e+00 3.30337 150 3.01344 112.525 14 14 14 7 0.02 5.08861e-06 -4.527722847382e+00 1.42238 150 0 150 13 5 15 15 0.02 1.04459e-05 -3.069567332611e+00 3.27804 150 3.27804 150 14 7 14 7 0.02 5.93135e-06 -5.726405299909e+00 1.29746 150 3.22759 150 13 8 14 14 0.02 7.34071e-06 -3.069626478211e+00 3.27565 150 3.27565 150 14 7 14 7 0.02 5.08861e-06 +1.219029061236e+01 1.60007 17.3205 0 2.97008 13 5 15 15 0.02 0.000498487 +1.935920346899e+01 1.29448 17.3205 0 8.71025 13 13 15 2 0.02 0.000498487 +2.123795595728e+01 1.30902 17.3205 1.58519 8.71025 13 13 13 5 0.02 0.000287968 +3.579099761269e+01 1.52414 17.3205 1.30642 8.71025 13 13 13 5 0.02 0.000220016 +1.674063083432e+01 1.29457 17.3205 0 14.4504 13 13 15 2 0.02 0.000498487 +1.779197348711e+01 1.3228 17.3205 1.71196 14.4504 13 13 13 8 0.02 0.000287968 +1.548740826516e+01 1.52415 17.3205 1.45407 14.4504 13 13 13 5 0.02 0.000220016 +1.772169325356e+01 1.81957 73.0434 1.46573 12.2572 13 13 13 5 0.02 4.43422e-05 +1.367065500196e+01 1.66003 73.0434 1.79487 12.2572 13 13 13 8 0.02 7.67586e-05 +2.021960493499e+01 1.82061 73.0434 1.39205 12.2572 13 13 13 5 0.02 3.38788e-05 +9.012246630357e+00 1.81529 73.0434 0 36.5717 13 8 15 15 0.02 7.67586e-05 +7.462779538274e+00 1.82255 73.0434 1.81499 36.5717 13 13 13 8 0.02 3.38788e-05 +1.030499912298e+01 1.80592 73.0434 1.81066 36.5717 13 13 13 8 0.02 4.43422e-05 +4.227002356107e+00 2.43719 73.0434 0 60.8862 14 14 15 1 0.02 7.67586e-05 +7.396288708628e+00 1.8216 73.0434 1.8216 60.8862 13 8 13 8 0.02 3.38788e-05 +7.394728392218e+00 1.80919 73.0434 1.79091 60.8862 13 13 13 8 0.02 4.43422e-05 </pre></div></div> </div> @@ -1542,9 +1470,9 @@ time mass_1 zams_mass_1 mass_2 zams_mass_2 stellar_type_1 prev_stellar_type_1 st provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/notebook_population.ipynb b/docs/build/html/notebook_population.ipynb index b6a37baa8d90a2f36c0fd19311548ed49e77f173..f6f27ee4329b90d22651068ea0aca8d8756c5eb9 100644 --- a/docs/build/html/notebook_population.ipynb +++ b/docs/build/html/notebook_population.ipynb @@ -23,9 +23,12 @@ "outputs": [], "source": [ "import os\n", + "\n", "from binarycpython.utils.custom_logging_functions import temp_dir\n", "from binarycpython.utils.grid import Population\n", "\n", + "TMP_DIR = temp_dir(\"notebooks\", \"notebook_population\")\n", + "\n", "# help(Population) # Uncomment to see the public functions of this object" ] }, @@ -60,7 +63,8 @@ "adding: max_evolution_time=15000 to BSE_options\n", "adding: eccentricity=0.02 to BSE_options\n", "adding: amt_cores=2 to grid_options\n", - "<<<< Warning: Key does not match previously known parameter: adding: data_dir=/tmp/binary_c_python/example_python_population_result to custom_options >>>>\n", + "adding: tmp_dir=/tmp/binary_c_python/notebooks/notebook_population to grid_options\n", + "<<<< Warning: Key does not match previously known parameter: adding: data_dir=/tmp/binary_c_python/notebooks/notebook_population/example_python_population_result to custom_options >>>>\n", "<<<< Warning: Key does not match previously known parameter: adding: base_filename=example_pop.dat to custom_options >>>>\n", "1\n", "example_pop.dat\n", @@ -88,11 +92,12 @@ "\n", "\n", " # grid_options\n", - " amt_cores=2, # grid_options\n", + " amt_cores=2,\n", + " tmp_dir=TMP_DIR,\n", " \n", " # Custom options # TODO: need to be set in grid_options probably\n", " data_dir=os.path.join(\n", - " temp_dir(), \"example_python_population_result\"\n", + " TMP_DIR, \"example_python_population_result\"\n", " ), # custom_options\n", " base_filename=\"example_pop.dat\", # custom_options\n", ")\n", @@ -133,13 +138,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "Writing settings to /tmp/binary_c_python/example_python_population_result/example_pop_settings.json\n" + "Writing settings to /tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/example_pop_settings.json\n" ] }, { "data": { "text/plain": [ - "'/tmp/binary_c_python/example_python_population_result/example_pop_settings.json'" + "'/tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/example_pop_settings.json'" ] }, "execution_count": 3, @@ -181,7 +186,7 @@ "text": [ "Help on method add_grid_variable in module binarycpython.utils.grid:\n", "\n", - "add_grid_variable(name:str, longname:str, valuerange:Union[list, str], resolution:str, spacingfunc:str, probdist:str, dphasevol:Union[str, int], parameter_name:str, gridtype:str='edge', branchpoint:int=0, precode:Union[str, NoneType]=None, condition:Union[str, NoneType]=None) -> None method of binarycpython.utils.grid.Population instance\n", + "add_grid_variable(name:str, longname:str, valuerange:Union[list, str], resolution:str, spacingfunc:str, probdist:str, dphasevol:Union[str, int], parameter_name:str, gridtype:str='centred', branchpoint:int=0, precode:Union[str, NoneType]=None, condition:Union[str, NoneType]=None) -> None method of binarycpython.utils.grid.Population instance\n", " Function to add grid variables to the grid_options.\n", " \n", " The execution of the grid generation will be through a nested for loop.\n", @@ -199,25 +204,25 @@ " name:\n", " name of parameter. This is evaluated as a parameter and you can use it throughout\n", " the rest of the function\n", - " \n", + " \n", " Examples:\n", " name = 'lnm1'\n", " longname:\n", " Long name of parameter\n", - " \n", + " \n", " Examples:\n", " longname = 'Primary mass'\n", " range:\n", " Range of values to take. Does not get used really, the spacingfunction is used to\n", " get the values from\n", - " \n", + " \n", " Examples:\n", " range = [math.log(m_min), math.log(m_max)]\n", " resolution:\n", " Resolution of the sampled range (amount of samples).\n", " TODO: check if this is used anywhere\n", " \n", - " Examples: \n", + " Examples:\n", " resolution = resolution[\"M_1\"]\n", " spacingfunction:\n", " Function determining how the range is sampled. You can either use a real function,\n", @@ -230,12 +235,12 @@ " precode:\n", " Extra room for some code. This code will be evaluated within the loop of the\n", " sampling function (i.e. a value for lnm1 is chosen already)\n", - " \n", + " \n", " Examples:\n", " precode = 'M_1=math.exp(lnm1);'\n", " probdist:\n", " Function determining the probability that gets assigned to the sampled parameter\n", - " \n", + " \n", " Examples:\n", " probdist = 'Kroupa2001(M_1)*M_1'\n", " dphasevol:\n", @@ -249,7 +254,7 @@ " condition = 'self.grid_options['binary']==1'\n", " gridtype:\n", " Method on how the value range is sampled. Can be either 'edge' (steps starting at\n", - " the lower edge of the value range) or 'center'\n", + " the lower edge of the value range) or 'centred'\n", " (steps starting at lower edge + 0.5 * stepsize).\n", "\n" ] @@ -313,7 +318,7 @@ " \"dphasevol\": \"dlnm1\",\n", " \"parameter_name\": \"M_1\",\n", " \"condition\": \"\",\n", - " \"gridtype\": \"edge\",\n", + " \"gridtype\": \"centred\",\n", " \"branchpoint\": 0,\n", " \"grid_variable_number\": 0\n", "}\n" @@ -457,7 +462,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "adding: parse_function=<function parse_function at 0x7ff3bdf79620> to grid_options\n" + "adding: parse_function=<function parse_function at 0x7f531bc3b6a8> to grid_options\n" ] } ], @@ -536,25 +541,25 @@ "Generating grid code\n", "Constructing/adding: lnm1\n", "Grid has handled 20 stars\n", - "with a total probability of 0.05150046619238192\n", + "with a total probability of 0.044402888438054094\n", "Total starcount for this run will be: 20\n", - "EXAMPLE_COMPACT_OBJECT 2.867655467480e+01 1.33079 9.81391 0.00167028 13\n", "Generating grid code\n", "Constructing/adding: lnm1\n", - "EXAMPLE_COMPACT_OBJECT 1.931266944719e+01 1.3933 12.3177 0.00124307 13\n", - "EXAMPLE_COMPACT_OBJECT 4.439623364590e+01 1.38004 7.81906 0.00224431 13\n", - "EXAMPLE_COMPACT_OBJECT 1.364277535630e+01 1.47961 15.4603 0.000925128 13\n", - "EXAMPLE_COMPACT_OBJECT 1.017435498578e+01 1.59052 19.4046 0.000688507 13\n", - "EXAMPLE_COMPACT_OBJECT 8.294870923827e+00 1.7197 24.3552 0.000512406 13\n", - "EXAMPLE_COMPACT_OBJECT 6.802132608769e+00 1.84162 30.5689 0.000381347 13\n", - "EXAMPLE_COMPACT_OBJECT 5.723570798020e+00 1.99471 38.3678 0.00028381 13\n", - "EXAMPLE_COMPACT_OBJECT 4.933751523833e+00 2.15875 48.1564 0.000211219 13\n", - "EXAMPLE_COMPACT_OBJECT 4.337250536639e+00 2.35209 60.4424 0.000157195 14\n", - "EXAMPLE_COMPACT_OBJECT 3.862081089332e+00 2.56776 75.8628 0.000116989 14\n", - "EXAMPLE_COMPACT_OBJECT 3.449960890183e+00 2.80457 95.2174 8.70668e-05 14\n", - "EXAMPLE_COMPACT_OBJECT 3.172196856333e+00 3.05193 119.51 6.47976e-05 14\n", - "EXAMPLE_COMPACT_OBJECT 3.069627290216e+00 3.27563 150 4.82242e-05 14\n", - "Population-2a7732d03e594ef4b5dfe9051b41d9c0 finished! The total probability was: 0.05150046619238191. It took a total of 0.7797017097473145s to run 20 systems on 2 cores\n", + "EXAMPLE_COMPACT_OBJECT 4.139293101586e+01 1.29427 8.13626 0.00202467 13\n", + "EXAMPLE_COMPACT_OBJECT 2.802986496151e+01 1.33699 10.0967 0.00152924 13\n", + "EXAMPLE_COMPACT_OBJECT 1.963621764679e+01 1.39754 12.5294 0.00115504 13\n", + "EXAMPLE_COMPACT_OBJECT 1.427601421985e+01 1.47745 15.5483 0.000872405 13\n", + "EXAMPLE_COMPACT_OBJECT 1.094409257247e+01 1.57571 19.2947 0.00065893 13\n", + "EXAMPLE_COMPACT_OBJECT 9.181971798545e+00 1.68748 23.9436 0.000497691 13\n", + "EXAMPLE_COMPACT_OBJECT 7.905335716621e+00 1.77287 29.7128 0.000375908 13\n", + "EXAMPLE_COMPACT_OBJECT 7.451192744924e+00 1.81495 36.872 0.000283924 13\n", + "EXAMPLE_COMPACT_OBJECT 7.396133472739e+00 1.82088 45.7561 0.000214449 13\n", + "EXAMPLE_COMPACT_OBJECT 7.396675941641e+00 1.82123 56.7809 0.000161974 13\n", + "EXAMPLE_COMPACT_OBJECT 7.404641347602e+00 1.82074 70.4621 0.000122339 13\n", + "EXAMPLE_COMPACT_OBJECT 7.444217227690e+00 1.81636 87.4397 9.2403e-05 13\n", + "EXAMPLE_COMPACT_OBJECT 7.453317880232e+00 1.81536 108.508 6.97923e-05 13\n", + "EXAMPLE_COMPACT_OBJECT 7.450828476484e+00 1.81563 134.653 5.27143e-05 13\n", + "Population-f28b5f98d7ef40dcb17fc2481a6d3ced finished! The total probability was: 0.04440288843805411. It took a total of 2.785212755203247s to run 20 systems on 2 cores\n", "There were no errors found in this run.\n" ] } @@ -586,7 +591,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'population_name': '2a7732d03e594ef4b5dfe9051b41d9c0', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 0.05150046619238191, 'total_count': 20, 'start_timestamp': 1628444120.234709, 'end_timestamp': 1628444121.0144107, 'total_mass_run': 730.1048014407228, 'total_probability_weighted_mass_run': 0.2983275843337705, 'zero_prob_stars_skipped': 0}\n" + "{'population_name': 'f28b5f98d7ef40dcb17fc2481a6d3ced', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 0.04440288843805411, 'total_count': 20, 'start_timestamp': 1629459533.935186, 'end_timestamp': 1629459536.7203987, 'total_mass_run': 684.2544031669779, 'total_probability_weighted_mass_run': 0.28134439269236855, 'zero_prob_stars_skipped': 0}\n" ] } ], @@ -660,42 +665,22 @@ "Generating grid code\n", "Constructing/adding: lnm1\n", "Saving grid code to grid_options\n", - "Writing grid code to /tmp/binary_c_python/binary_c_grid_2a7732d03e594ef4b5dfe9051b41d9c0.py\n", - "Loading grid code function from /tmp/binary_c_python/binary_c_grid_2a7732d03e594ef4b5dfe9051b41d9c0.py\n", + "Writing grid code to /tmp/binary_c_python/notebooks/notebook_population/binary_c_grid_f28b5f98d7ef40dcb17fc2481a6d3ced.py\n", + "Loading grid code function from /tmp/binary_c_python/notebooks/notebook_population/binary_c_grid_f28b5f98d7ef40dcb17fc2481a6d3ced.py\n", "Grid code loaded\n", - "Writing binary_c calls to /tmp/binary_c_python/example_python_population_result/binary_c_calls.txt\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", + "Writing binary_c calls to /tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/binary_c_calls.txt\n", "Grid has handled 20 stars\n", - "with a total probability of 0.05150046619238192\n", - "/tmp/binary_c_python/example_python_population_result/binary_c_calls.txt\n", - "binary_c M_1 2.0 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.013208238029791246\n", - "binary_c M_1 2.5102526289471614 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.009829948023831718\n", - "binary_c M_1 3.1506841305680684 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.0073157281034221516\n", - "binary_c M_1 3.9545065608702976 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.005444573822104362\n" + "with a total probability of 0.044402888438054094\n", + "/tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/binary_c_calls.txt\n", + "binary_c M_1 2.227955577093495 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.010905083645619543\n", + "binary_c M_1 2.7647737053496777 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.008236638755149857\n", + "binary_c M_1 3.4309362899259503 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.006221155214163634\n", + "binary_c M_1 4.257608426597089 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.004698855121516278\n" ] } ], "source": [ - "example_pop.set(verbosity=10)\n", + "example_pop.set(verbosity=1)\n", "calls_filename = example_pop.write_binary_c_calls_to_file()\n", "print(calls_filename)\n", "\n", @@ -725,39 +710,34 @@ "Generating grid code\n", "Constructing/adding: lnm1\n", "Grid has handled 20 stars\n", - "with a total probability of 0.05150046619238192\n", + "with a total probability of 0.044402888438054094\n", "Total starcount for this run will be: 20\n", "Generating grid code\n", "Constructing/adding: lnm1\n", - "Population-3680f3882c0a449c944462abffea2447 finished! The total probability was: 0.05150046619238191. It took a total of 0.6246354579925537s to run 20 systems on 2 cores\n", + "Population-e45c25448b32440cb7e220f4a3562907 finished! The total probability was: 0.04440288843805411. It took a total of 1.9539172649383545s to run 20 systems on 2 cores\n", "There were no errors found in this run.\n", "\n", "\n", "time mass zams_mass probability radius stellar_type\n", - "2.867655467480e+01 1.33079 9.81391 0.00167028 1.72498e-05 13\n", - "1.931266944719e+01 1.3933 12.3177 0.00124307 1.72498e-05 13\n", - "4.439623364590e+01 1.38004 7.81906 0.00224431 1.72498e-05 13\n", - "1.364277535630e+01 1.47961 15.4603 0.000925128 1.72498e-05 13\n", - "1.017435498578e+01 1.59052 19.4046 0.000688507 1.72498e-05 13\n", - "8.294870923827e+00 1.7197 24.3552 0.000512406 1.72498e-05 13\n", - "6.802132608769e+00 1.84162 30.5689 0.000381347 1.72498e-05 13\n", - "5.723570798020e+00 1.99471 38.3678 0.00028381 1.72498e-05 13\n", - "4.933751523833e+00 2.15875 48.1564 0.000211219 1.72498e-05 13\n", - "4.337250536639e+00 2.35209 60.4424 0.000157195 9.97286e-06 14\n", - "3.862081089332e+00 2.56776 75.8628 0.000116989 1.08873e-05 14\n", - "3.449960890183e+00 2.80457 95.2174 8.70668e-05 1.18914e-05 14\n", - "3.172196856333e+00 3.05193 119.51 6.47976e-05 1.29402e-05 14\n", - "3.069627290216e+00 3.27563 150 4.82242e-05 1.38887e-05 14\n", + "4.139293101586e+01 1.29427 8.13626 0.00202467 1.72498e-05 13\n", + "2.802986496151e+01 1.33699 10.0967 0.00152924 1.72498e-05 13\n", + "1.963621764679e+01 1.39754 12.5294 0.00115504 1.72498e-05 13\n", + "1.427601421985e+01 1.47745 15.5483 0.000872405 1.72498e-05 13\n", + "1.094409257247e+01 1.57571 19.2947 0.00065893 1.72498e-05 13\n", + "9.181971798545e+00 1.68748 23.9436 0.000497691 1.72498e-05 13\n", + "7.905335716621e+00 1.77287 29.7128 0.000375908 1.72498e-05 13\n", + "7.451192744924e+00 1.81495 36.872 0.000283924 1.72498e-05 13\n", + "7.396133472739e+00 1.82088 45.7561 0.000214449 1.72498e-05 13\n", + "7.396675941641e+00 1.82123 56.7809 0.000161974 1.72498e-05 13\n", + "7.404641347602e+00 1.82074 70.4621 0.000122339 1.72498e-05 13\n", + "7.444217227690e+00 1.81636 87.4397 9.2403e-05 1.72498e-05 13\n", + "7.453317880232e+00 1.81536 108.508 6.97923e-05 1.72498e-05 13\n", + "7.450828476484e+00 1.81563 134.653 5.27143e-05 1.72498e-05 13\n", "\n" ] } ], "source": [ - "import os\n", - "\n", - "from binarycpython.utils.grid import Population\n", - "from binarycpython.utils.custom_logging_functions import temp_dir\n", - "\n", "def parse_function(self, output):\n", " \"\"\"\n", " Example parsing function\n", @@ -817,11 +797,12 @@ " eccentricity=0.02, # bse_options\n", " \n", " # grid_options\n", - " amt_cores=2, # grid_options\n", + " amt_cores=2,\n", + " tmp_dir=TMP_DIR,\n", "\n", " # Custom options: the data directory and the output filename\n", " data_dir=os.path.join(\n", - " temp_dir(), \"example_python_population_result\"\n", + " TMP_DIR, \"example_python_population_result\"\n", " ), # custom_options\n", " base_filename=\"example_pop.dat\", # custom_options\n", ")\n", @@ -876,15 +857,15 @@ "example_pop.export_all_info()\n", "\n", "# remove the result file if it exists\n", - "if os.path.isfile(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\")):\n", - " os.remove(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"))\n", + "if os.path.isfile(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\")):\n", + " os.remove(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"))\n", "\n", "\n", "# Evolve the population\n", "example_pop.evolve()\n", "\n", "# \n", - "with open(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", + "with open(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", " output = f.read()\n", "print(\"\\n\")\n", "print(output)" @@ -912,96 +893,39 @@ "Constructing/adding: lnm1\n", "Constructing/adding: q\n", "Constructing/adding: log10per\n", - "Grid has handled 125 stars\n", - "with a total probability of 0.0862478164626921\n", - "Total starcount for this run will be: 125\n", + "Grid has handled 27 stars\n", + "with a total probability of 0.024868380796643753\n", + "Total starcount for this run will be: 27\n", "Generating grid code\n", "Constructing/adding: lnm1\n", "Constructing/adding: q\n", "Constructing/adding: log10per\n", - "Population-d20a4c74d20a43b881c0c9e5def5f76c finished! The total probability was: 0.08624781646269201. It took a total of 8.561265707015991s to run 125 systems on 2 cores\n", + "Population-05128ef4c5fe4274a0356c3e99e2f2d2 finished! The total probability was: 0.024868380796643757. It took a total of 9.792905807495117s to run 27 systems on 2 cores\n", "There were no errors found in this run.\n", "\n", "\n", "time mass_1 zams_mass_1 mass_2 zams_mass_2 stellar_type_1 prev_stellar_type_1 stellar_type_2 prev_stellar_type_2 metallicity probability\n", - "8.863377990313e+01 1.29444 5.88566 0 2.99283 13 5 15 15 0.02 0.000627913\n", - "1.146421815741e+02 0 5.88566 1.33062 4.43925 15 15 13 5 0.02 0.000627913\n", - "7.222715508467e+01 1.34922 5.88566 0 5.88566 13 5 15 15 0.02 0.000627913\n", - "1.350021848285e+01 1.48488 17.3205 0 0.1 13 5 15 15 0.02 0.000154349\n", - "1.171108213270e+01 1.53113 17.3205 0 0.1 13 5 15 15 0.02 0.000154349\n", - "1.171086983243e+01 1.53177 17.3205 0 0.1 13 9 15 15 0.02 0.000154349\n", - "1.170770599495e+01 1.53176 17.3205 0 4.40513 13 5 15 15 0.02 0.000172877\n", - "1.230407246199e+01 1.59499 17.3205 0 4.40513 13 5 15 15 0.02 0.000610573\n", - "1.108751340926e+01 1.70319 17.3205 0 8.71025 13 4 15 15 0.02 0.000610573\n", - "1.941017702765e+01 1.34903 17.3205 1.65097 8.71025 13 13 13 5 0.02 0.000172877\n", - "1.980988739731e+01 1.36979 17.3205 1.60808 8.71025 13 13 13 5 0.02 0.000121486\n", - "3.571858031651e+01 1.53174 17.3205 1.30504 8.71025 13 13 13 5 0.02 8.42148e-05\n", - "3.459153942631e+01 1.53176 17.3205 1.31004 8.71025 13 13 13 5 0.02 9.8162e-05\n", - "1.687368550125e+01 1.34937 17.3205 1.73856 13.0154 13 13 13 8 0.02 0.000172877\n", - "1.194842917007e+01 1.78096 17.3205 0 13.0154 13 8 15 15 0.02 0.000610573\n", - "1.733614170983e+01 1.53184 17.3205 1.42375 13.0154 13 13 13 5 0.02 9.8162e-05\n", - "1.723547465714e+01 1.38403 17.3205 1.71288 13.0154 13 13 13 8 0.02 0.000121486\n", - "1.764340254985e+01 1.53174 17.3205 1.41264 13.0154 13 13 13 5 0.02 8.42148e-05\n", - "1.170425790780e+01 1.52963 17.3205 0 17.3205 13 5 15 15 0.02 0.000172877\n", - "8.922967341481e+00 1.85486 17.3205 0 17.3205 13 8 15 15 0.02 0.000610573\n", - "1.232906623449e+01 1.41074 17.3205 1.34281 17.3205 13 13 13 8 0.02 0.000121486\n", - "1.170775828562e+01 1.53183 17.3205 1.53183 17.3205 13 5 13 5 0.02 9.8162e-05\n", - "1.170770422321e+01 1.53175 17.3205 1.53175 17.3205 13 5 13 5 0.02 8.42148e-05\n", - "5.075844624794e+00 2.12303 50.9713 0 0.1 13 8 15 15 0.02 3.79411e-05\n", - "4.766606588165e+00 2.20484 50.9713 0 0.1 14 8 15 15 0.02 3.79411e-05\n", - "4.768305081494e+00 2.18838 50.9713 0 0.1 13 8 15 15 0.02 3.79411e-05\n", - "4.458869865939e+00 2.29864 50.9713 0 12.8178 14 8 15 15 0.02 0.000150087\n", - "1.806014211040e+01 2.10446 50.9713 1.40749 12.8178 13 13 13 5 0.02 2.9863e-05\n", - "4.797342083485e+00 2.10328 50.9713 0 12.8178 13 13 15 1 0.02 4.24954e-05\n", - "1.721374713429e+01 2.21673 50.9713 1.42212 12.8178 14 14 13 5 0.02 2.41295e-05\n", - "4.055645404546e+00 2.47276 50.9713 0 25.5357 14 7 15 15 0.02 0.000150087\n", - "1.806123543037e+01 2.21893 50.9713 1.40745 12.8178 14 14 13 5 0.02 2.07011e-05\n", - "8.117519147635e+00 2.10433 50.9713 2.21473 25.5357 13 13 14 8 0.02 4.24954e-05\n", - "8.315554923168e+00 2.15343 50.9713 2.08519 25.5357 13 13 13 8 0.02 2.9863e-05\n", - "7.917420996633e+00 2.21892 50.9713 1.7431 25.5357 14 14 13 8 0.02 2.07011e-05\n", - "7.693213405973e+00 2.21805 50.9713 1.78384 25.5357 14 14 13 8 0.02 2.41295e-05\n", - "3.753837732894e+00 2.62517 50.9713 0 38.2535 14 7 15 15 0.02 0.000150087\n", - "7.087296558990e+00 2.10417 50.9713 2.40935 38.2535 13 13 14 8 0.02 4.24954e-05\n", - "7.007109286263e+00 2.15854 50.9713 2.28672 38.2535 13 13 14 8 0.02 2.9863e-05\n", - "5.653200958306e+00 2.21878 50.9713 2.0587 38.2535 14 14 13 8 0.02 2.41295e-05\n", - "5.733794947644e+00 2.21892 50.9713 1.99255 38.2535 14 14 13 8 0.02 2.07011e-05\n", - "3.513216011269e+00 2.76647 50.9713 0 50.9713 14 7 15 15 0.02 0.000150087\n", - "4.750574783854e+00 2.27442 50.9713 0 50.9713 14 8 15 15 0.02 4.24954e-05\n", - "7.278384712062e+00 1.29678 50.9713 2.09216 50.9713 13 8 13 13 0.02 2.9863e-05\n", - "4.765996194699e+00 2.20787 50.9713 2.20787 50.9713 14 8 14 8 0.02 2.07011e-05\n", - "4.765535914728e+00 2.21331 50.9713 2.21331 50.9713 14 8 14 8 0.02 2.41295e-05\n", - "3.104706358826e+00 3.17639 150 0 0.1 14 7 15 15 0.02 9.32641e-06\n", - "3.069363482023e+00 3.27572 150 0 0.1 14 7 15 15 0.02 9.32641e-06\n", - "3.047074050271e+00 3.3836 150 0 37.575 14 7 15 15 0.02 3.68933e-05\n", - "5.974759306305e+00 3.23604 150 2.53922 37.575 14 14 14 7 0.02 1.04459e-05\n", - "6.074084349384e+00 3.30145 150 2.13876 37.575 14 14 13 8 0.02 7.34071e-06\n", - "5.733865371895e+00 3.29994 150 2.00498 37.575 14 14 13 8 0.02 5.93135e-06\n", - "3.027099358410e+00 3.53631 150 0 75.05 14 7 15 15 0.02 3.68933e-05\n", - "5.807147339697e+00 3.30197 150 1.9791 37.575 14 14 13 8 0.02 5.08861e-06\n", - "4.862942347290e+00 3.25294 150 2.97823 75.05 14 14 14 7 0.02 1.04459e-05\n", - "4.556479830908e+00 3.29942 150 2.73221 75.05 14 14 14 7 0.02 7.34071e-06\n", - "3.853070305680e+00 3.29977 150 2.62486 75.05 14 14 14 7 0.02 5.93135e-06\n", - "3.881529045940e+00 3.30149 150 2.55924 75.05 14 14 14 7 0.02 5.08861e-06\n", - "3.015033359333e+00 3.64419 150 0 112.525 14 7 15 15 0.02 3.68933e-05\n", - "4.126828648362e+00 3.32047 150 0 112.525 14 14 15 3 0.02 1.04459e-05\n", - "3.990017992944e+00 3.3032 150 2.94027 112.525 14 14 14 7 0.02 7.34071e-06\n", - "3.206771867883e+00 3.07671 150 3.11282 112.525 14 14 14 7 0.02 5.93135e-06\n", - "3.006827156705e+00 3.72638 150 0 150 14 7 15 15 0.02 3.68933e-05\n", - "3.218786094847e+00 3.30337 150 3.01344 112.525 14 14 14 7 0.02 5.08861e-06\n", - "4.527722847382e+00 1.42238 150 0 150 13 5 15 15 0.02 1.04459e-05\n", - "3.069567332611e+00 3.27804 150 3.27804 150 14 7 14 7 0.02 5.93135e-06\n", - "5.726405299909e+00 1.29746 150 3.22759 150 13 8 14 14 0.02 7.34071e-06\n", - "3.069626478211e+00 3.27565 150 3.27565 150 14 7 14 7 0.02 5.08861e-06\n", + "1.219029061236e+01 1.60007 17.3205 0 2.97008 13 5 15 15 0.02 0.000498487\n", + "1.935920346899e+01 1.29448 17.3205 0 8.71025 13 13 15 2 0.02 0.000498487\n", + "2.123795595728e+01 1.30902 17.3205 1.58519 8.71025 13 13 13 5 0.02 0.000287968\n", + "3.579099761269e+01 1.52414 17.3205 1.30642 8.71025 13 13 13 5 0.02 0.000220016\n", + "1.674063083432e+01 1.29457 17.3205 0 14.4504 13 13 15 2 0.02 0.000498487\n", + "1.779197348711e+01 1.3228 17.3205 1.71196 14.4504 13 13 13 8 0.02 0.000287968\n", + "1.548740826516e+01 1.52415 17.3205 1.45407 14.4504 13 13 13 5 0.02 0.000220016\n", + "1.772169325356e+01 1.81957 73.0434 1.46573 12.2572 13 13 13 5 0.02 4.43422e-05\n", + "1.367065500196e+01 1.66003 73.0434 1.79487 12.2572 13 13 13 8 0.02 7.67586e-05\n", + "2.021960493499e+01 1.82061 73.0434 1.39205 12.2572 13 13 13 5 0.02 3.38788e-05\n", + "9.012246630357e+00 1.81529 73.0434 0 36.5717 13 8 15 15 0.02 7.67586e-05\n", + "7.462779538274e+00 1.82255 73.0434 1.81499 36.5717 13 13 13 8 0.02 3.38788e-05\n", + "1.030499912298e+01 1.80592 73.0434 1.81066 36.5717 13 13 13 8 0.02 4.43422e-05\n", + "4.227002356107e+00 2.43719 73.0434 0 60.8862 14 14 15 1 0.02 7.67586e-05\n", + "7.396288708628e+00 1.8216 73.0434 1.8216 60.8862 13 8 13 8 0.02 3.38788e-05\n", + "7.394728392218e+00 1.80919 73.0434 1.79091 60.8862 13 13 13 8 0.02 4.43422e-05\n", "\n" ] } ], "source": [ - "import os\n", - "\n", - "from binarycpython.utils.grid import Population\n", - "from binarycpython.utils.custom_logging_functions import temp_dir\n", - "\n", "def parse_function(self, output):\n", " \"\"\"\n", " Example parsing function\n", @@ -1067,10 +991,11 @@ " \n", " # grid_options\n", " amt_cores=2, # grid_options\n", + " tmp_dir=TMP_DIR,\n", "\n", " # Custom options: the data directory and the output filename\n", " data_dir=os.path.join(\n", - " temp_dir(), \"example_python_population_result\"\n", + " TMP_DIR, \"example_python_population_result\"\n", " ), # custom_options\n", " base_filename=\"example_pop.dat\", # custom_options\n", ")\n", @@ -1168,14 +1093,14 @@ "example_pop.export_all_info()\n", "\n", "# remove the result file if it exists\n", - "if os.path.isfile(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\")):\n", - " os.remove(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"))\n", + "if os.path.isfile(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\")):\n", + " os.remove(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"))\n", "\n", "# Evolve the population\n", "example_pop.evolve()\n", "\n", "# \n", - "with open(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", + "with open(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", " output = f.read()\n", "print(\"\\n\")\n", "print(output)" diff --git a/docs/build/html/objects.inv b/docs/build/html/objects.inv index 8ac1e328102c8f00b236d77c3d126f5b16f1b475..b5c74453b9aa7d0c5e1ed94e55ab09313e9477ee 100644 Binary files a/docs/build/html/objects.inv and b/docs/build/html/objects.inv differ diff --git a/docs/build/html/plot_functions.html b/docs/build/html/plot_functions.html index 119716b2cf74847f37c7544a4a48cc0430bc41f0..2c3165a517fd52f8f4db3815cd253e02732a930f 100644 --- a/docs/build/html/plot_functions.html +++ b/docs/build/html/plot_functions.html @@ -473,9 +473,9 @@ This is not included in all the plotting routines.</p></li> provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/py-modindex.html b/docs/build/html/py-modindex.html index cafb1a78624c8c019ed90550f9c2bc0b9a18f918..ce13ca923f3b1f6bcb181dc5e823b393706c9065 100644 --- a/docs/build/html/py-modindex.html +++ b/docs/build/html/py-modindex.html @@ -255,9 +255,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/readme_link.html b/docs/build/html/readme_link.html index 27d15ae843e9e2f086f0c09aaf359f8e194550cc..1f71ca1b418557342e617c14df0fe9aa992277f7 100644 --- a/docs/build/html/readme_link.html +++ b/docs/build/html/readme_link.html @@ -252,12 +252,13 @@ <p>For this it is best to set up a virtual environment. Activate the virtualenvironment and enter the cloned version of the repo.</p> <p>Then run:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">clean</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">build</span> <span class="o">--</span><span class="n">force</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">sdist</span> <span class="o">&&</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">v</span> <span class="n">dist</span><span class="o">/</span><span class="n">binarycpython</span><span class="o">-<</span><span class="n">version</span> <span class="n">of</span> <span class="n">this</span> <span class="n">package</span><span class="o">>.</span><span class="n">tar</span><span class="o">.</span><span class="n">gz</span> +<span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">clean</span> <span class="o">&&</span> <span class="n">pip</span> <span class="n">uninstall</span> <span class="n">binarycpython</span> <span class="o">&&</span> <span class="n">rm</span> <span class="n">dist</span><span class="o">/*</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">build</span> <span class="o">--</span><span class="n">force</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">sdist</span> <span class="o">&&</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">v</span> <span class="n">dist</span><span class="o">/</span><span class="n">binarycpython</span><span class="o">-<</span><span class="n">version</span> <span class="n">of</span> <span class="n">this</span> <span class="n">package</span><span class="o">>.</span><span class="n">tar</span><span class="o">.</span><span class="n">gz</span> </pre></div> </div> -<p>You can find the version of this package in setup.py.</p> +<p>This will clean the build directory, remove binarycpython from the venv, remove the dist packages, and then rebuilding and reinstalling the package. You can find the version of this package in setup.py.</p> <p>This will install this package into the virtual environment. Making changes to the sourcecode can be “installed†into the virtual env with the same command.</p> <p>If this is not the first time you install the package, but rather rebuild it because you make changes in either binary_c or binarycpython, you should ignore the currently installed version, and also skip installing the dependencies again, by executing the following command:</p> -<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">clean</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">build</span> <span class="o">--</span><span class="n">force</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">sdist</span> <span class="o">&&</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="n">ignore</span><span class="o">-</span><span class="n">installed</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">dependencies</span> <span class="o">-</span><span class="n">v</span> <span class="n">dist</span><span class="o">/</span><span class="n">binarycpython</span><span class="o">-<</span><span class="n">version</span> <span class="n">of</span> <span class="n">this</span> <span class="n">package</span><span class="o">>.</span><span class="n">tar</span><span class="o">.</span><span class="n">gz</span> +<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">clean</span> <span class="o">&&</span> <span class="n">pip</span> <span class="n">uninstall</span> <span class="n">binarycpython</span> <span class="o">&&</span> <span class="n">rm</span> <span class="n">dist</span><span class="o">/*</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">build</span> <span class="o">--</span><span class="n">force</span> <span class="o">&&</span> <span class="n">python</span> <span class="n">setup</span><span class="o">.</span><span class="n">py</span> <span class="n">sdist</span> <span class="o">&&</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="n">ignore</span><span class="o">-</span><span class="n">installed</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">dependencies</span> <span class="o">-</span><span class="n">v</span> <span class="n">dist</span><span class="o">/</span><span class="n">binarycpython</span><span class="o">-<</span><span class="n">version</span> <span class="n">of</span> <span class="n">this</span> <span class="n">package</span><span class="o">>.</span><span class="n">tar</span><span class="o">.</span><span class="n">gz</span> </pre></div> </div> <div class="section" id="after-installation"> @@ -334,9 +335,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/run_system_wrapper.html b/docs/build/html/run_system_wrapper.html index 98017ad46588089035d4888e94feb4dcb8a35540..d37ea5272bc9f5c908ea0a9f4be38738aba9a447 100644 --- a/docs/build/html/run_system_wrapper.html +++ b/docs/build/html/run_system_wrapper.html @@ -283,9 +283,9 @@ and returns what the parse_function returns</p> provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/search.html b/docs/build/html/search.html index c131aef39e756d8d23fb95b6292fa5bcaf6278dd..d01c4ead87439b10f5dd4eacdeee2933f2799ce5 100644 --- a/docs/build/html/search.html +++ b/docs/build/html/search.html @@ -194,9 +194,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js index 4d686578bbc3eaf4cf907a9b5ba1fbbf375a5f77..b8f060acae0d5a8d2ce935a680f0e945ceb54ec3 100644 --- a/docs/build/html/searchindex.js +++ b/docs/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["binary_c_parameters","custom_logging_functions","distribution_functions","example_notebooks","functions","grid","grid_options_defaults","grid_options_descriptions","hpc_functions","index","modules","notebook_api_functionality","notebook_custom_logging","notebook_extra_features","notebook_individual_systems","notebook_population","plot_functions","readme_link","run_system_wrapper","spacing_functions","stellar_types","useful_funcs"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,nbsphinx:3,sphinx:56},filenames:["binary_c_parameters.rst","custom_logging_functions.rst","distribution_functions.rst","example_notebooks.rst","functions.rst","grid.rst","grid_options_defaults.rst","grid_options_descriptions.rst","hpc_functions.rst","index.rst","modules.rst","notebook_api_functionality.ipynb","notebook_custom_logging.ipynb","notebook_extra_features.ipynb","notebook_individual_systems.ipynb","notebook_population.ipynb","plot_functions.rst","readme_link.rst","run_system_wrapper.rst","spacing_functions.rst","stellar_types.rst","useful_funcs.rst"],objects:{"binarycpython.utils":{custom_logging_functions:[1,0,0,"-"],distribution_functions:[2,0,0,"-"],functions:[4,0,0,"-"],grid:[5,0,0,"-"],grid_options_defaults:[6,0,0,"-"],hpc_functions:[8,0,0,"-"],plot_functions:[16,0,0,"-"],run_system_wrapper:[18,0,0,"-"],spacing_functions:[19,0,0,"-"],stellar_types:[20,0,0,"-"],useful_funcs:[21,0,0,"-"]},"binarycpython.utils.custom_logging_functions":{autogen_C_logging_code:[1,1,1,""],binary_c_log_code:[1,1,1,""],binary_c_write_log_code:[1,1,1,""],compile_shared_lib:[1,1,1,""],create_and_load_logging_function:[1,1,1,""],from_binary_c_config:[1,1,1,""],return_compilation_dict:[1,1,1,""]},"binarycpython.utils.distribution_functions":{"const":[2,1,1,""],Arenou2010_binary_fraction:[2,1,1,""],Izzard2012_period_distribution:[2,1,1,""],Kroupa2001:[2,1,1,""],Moe_di_Stefano_2017_multiplicity_fractions:[2,1,1,""],Moe_di_Stefano_2017_pdf:[2,1,1,""],build_q_table:[2,1,1,""],calc_P_integral:[2,1,1,""],calc_e_integral:[2,1,1,""],calc_total_probdens:[2,1,1,""],calculate_constants_three_part_powerlaw:[2,1,1,""],cosmic_SFH_madau_dickinson2014:[2,1,1,""],duquennoy1991:[2,1,1,""],fill_data:[2,1,1,""],flat:[2,1,1,""],flatsections:[2,1,1,""],gaussian:[2,1,1,""],gaussian_func:[2,1,1,""],gaussian_normalizing_const:[2,1,1,""],get_integration_constant_q:[2,1,1,""],get_max_multiplicity:[2,1,1,""],imf_chabrier2003:[2,1,1,""],imf_scalo1986:[2,1,1,""],imf_scalo1998:[2,1,1,""],imf_tinsley1980:[2,1,1,""],interpolate_in_mass_izzard2012:[2,1,1,""],ktg93:[2,1,1,""],linear_extrapolation_q:[2,1,1,""],merge_multiplicities:[2,1,1,""],normalize_dict:[2,1,1,""],number:[2,1,1,""],poisson:[2,1,1,""],powerlaw:[2,1,1,""],powerlaw_constant:[2,1,1,""],powerlaw_extrapolation_q:[2,1,1,""],prepare_dict:[2,1,1,""],raghavan2010_binary_fraction:[2,1,1,""],sana12:[2,1,1,""],set_opts:[2,1,1,""],three_part_powerlaw:[2,1,1,""]},"binarycpython.utils.functions":{BinaryCEncoder:[4,2,1,""],Capturing:[4,2,1,""],binarycDecoder:[4,2,1,""],binaryc_json_serializer:[4,1,1,""],call_binary_c_config:[4,1,1,""],catchtime:[4,2,1,""],convert_bytes:[4,1,1,""],count_keys_recursive:[4,1,1,""],create_arg_string:[4,1,1,""],create_hdf5:[4,1,1,""],custom_sort_dict:[4,1,1,""],example_parse_output:[4,1,1,""],extract_ensemble_json_from_string:[4,1,1,""],filter_arg_dict:[4,1,1,""],format_ensemble_results:[4,1,1,""],get_arg_keys:[4,1,1,""],get_defaults:[4,1,1,""],get_help:[4,1,1,""],get_help_all:[4,1,1,""],get_help_super:[4,1,1,""],get_moe_di_stefano_dataset:[4,1,1,""],get_size:[4,1,1,""],handle_ensemble_string_to_json:[4,1,1,""],imports:[4,1,1,""],inspect_dict:[4,1,1,""],is_capsule:[4,1,1,""],load_logfile:[4,1,1,""],make_build_text:[4,1,1,""],merge_dicts:[4,1,1,""],multiply_values_dict:[4,1,1,""],output_lines:[4,1,1,""],parse_binary_c_version_info:[4,1,1,""],recursive_change_key_to_float:[4,1,1,""],recursive_change_key_to_string:[4,1,1,""],remove_file:[4,1,1,""],return_binary_c_version_info:[4,1,1,""],subtract_dicts:[4,1,1,""],temp_dir:[4,1,1,""],update_dicts:[4,1,1,""],verbose_print:[4,1,1,""],write_binary_c_parameter_descriptions_to_rst_file:[4,1,1,""]},"binarycpython.utils.functions.BinaryCEncoder":{"default":[4,3,1,""]},"binarycpython.utils.functions.Capturing":{__enter__:[4,3,1,""],__exit__:[4,3,1,""]},"binarycpython.utils.functions.binarycDecoder":{decode:[4,3,1,""]},"binarycpython.utils.functions.catchtime":{__enter__:[4,3,1,""],__exit__:[4,3,1,""]},"binarycpython.utils.grid":{Population:[5,2,1,""]},"binarycpython.utils.grid.Population":{Moe_di_Stefano_2017:[5,3,1,""],add_grid_variable:[5,3,1,""],evolve:[5,3,1,""],evolve_single:[5,3,1,""],export_all_info:[5,3,1,""],parse_cmdline:[5,3,1,""],return_all_info:[5,3,1,""],return_binary_c_defaults:[5,3,1,""],return_binary_c_version_info:[5,3,1,""],return_population_settings:[5,3,1,""],set:[5,3,1,""],set_moe_di_stefano_settings:[5,3,1,""],write_binary_c_calls_to_file:[5,3,1,""]},"binarycpython.utils.grid_options_defaults":{grid_options_description_checker:[6,1,1,""],grid_options_help:[6,1,1,""],print_option_descriptions:[6,1,1,""],write_grid_options_to_rst_file:[6,1,1,""]},"binarycpython.utils.plot_functions":{color_by_index:[16,1,1,""],dummy:[16,1,1,""],parse_function_hr_diagram:[16,1,1,""],parse_function_masses:[16,1,1,""],parse_function_orbit:[16,1,1,""],plot_HR_diagram:[16,1,1,""],plot_masses:[16,1,1,""],plot_orbit:[16,1,1,""],plot_system:[16,1,1,""]},"binarycpython.utils.run_system_wrapper":{run_system:[18,1,1,""]},"binarycpython.utils.spacing_functions":{"const":[19,1,1,""]},"binarycpython.utils.useful_funcs":{calc_period_from_sep:[21,1,1,""],calc_sep_from_period:[21,1,1,""],maximum_mass_ratio_for_RLOF:[21,1,1,""],minimum_period_for_RLOF:[21,1,1,""],minimum_separation_for_RLOF:[21,1,1,""],ragb:[21,1,1,""],roche_lobe:[21,1,1,""],rzams:[21,1,1,""],zams_collision:[21,1,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:method"},terms:{"000":14,"0000":14,"000000000000e":14,"0001":[11,21],"000116989":15,"000121486":15,"000150087":15,"000154349":15,"000157195":15,"000172877":15,"000211219":15,"00028381":15,"000381347":15,"000512406":15,"000610573":15,"000627913":15,"000688507":15,"0007":2,"000925128":15,"001":[0,11],"00124307":15,"00167028":15,"00224431":15,"00498":15,"005444573822104362":15,"00632092":11,"006827156705e":15,"007109286263e":15,"0073157281034221516":15,"009829948023831718":15,"013208238029791246":15,"01344":15,"0141":11,"0144107":15,"015033359333e":15,"0154":15,"017435498578e":15,"027099358410e":15,"041660877905e":12,"041662558619e":12,"041662560111e":12,"041662564579e":12,"04459e":15,"047074050271e":15,"05150046619238191":15,"05150046619238192":15,"05193":15,"054":2,"055645404546e":15,"0587":15,"069363482023e":15,"069567332611e":15,"069626478211e":15,"069627290216e":15,"07011e":15,"074084349384e":15,"075844624794e":15,"07671":15,"0820":[0,11],"08519":15,"08624781646269201":15,"0862478164626921":15,"087296558990e":15,"08861e":15,"08873e":15,"08msun":[0,11],"0902":[0,11],"09216":15,"093caf0e9":0,"0x7f163859d0c0":11,"0x7f9265091598":[],"0x7fb4d41ebbf8":14,"0x7ff3bdf79620":15,"100":[0,2,11],"1000":[0,7],"10328":15,"10417":15,"10433":15,"10446":15,"104706358826e":15,"1048014407228":15,"1085":14,"108751340926e":15,"11003":14,"112":15,"11282":15,"115":2,"11582":14,"117519147635e":15,"119":15,"120000":0,"12303":15,"12325":14,"12457":14,"12460":14,"12461":14,"12462":[],"125":[0,11,15],"12500":0,"126828648362e":15,"12e":[1,12,14,15],"1300":[],"1301":14,"1302":14,"13461":14,"13462":[],"1357":12,"13876":15,"13e3":[0,11],"1403":2,"14057":12,"14059":12,"14461":14,"14462":[],"146421815741e":15,"150":15,"15000":[0,11,12,14,15],"1506841305680684":15,"15343":15,"1564":15,"15854":15,"15875":15,"15msun":2,"1612":[],"1613":[],"1614":[],"1615":[],"1616":[],"1617":14,"1618":14,"1619":14,"1620":14,"1621":14,"1628444120":15,"1628444121":15,"170425790780e":15,"170770422321e":15,"170770599495e":15,"170775828562e":15,"17089":14,"171086983243e":15,"171108213270e":15,"172196856333e":15,"17639":15,"18838":15,"18914e":15,"190":0,"19314":12,"194842917007e":15,"1951":[0,11],"1972":[0,11],"1975":[0,11],"197x":[0,11],"1980":2,"1983":21,"1986":[0,2,11],"1989":[0,11],"1991":2,"1992":0,"1993":[0,11],"1996":21,"1998":[0,2,11],"1999":[0,11],"1ckzg0p9":[9,17],"1e2":[0,11],"1e9":[0,11],"200":[0,11],"2000":[0,11],"2001":2,"2002":[0,11],"2003":[0,2,11],"2004":[0,11],"2005":[0,11],"2009":[0,11],"2010":[0,2,7,11],"2012":[0,2,11],"2013":[0,11],"2014":[0,2,11],"2015":[0,11],"2016":[0,11],"2017":[0,7,11,15],"2018":[0,1,11],"2019":[0,11],"2020":[0,11],"2021":0,"20210807":[],"20210825":0,"20484":15,"206771867883e":15,"20787":15,"21331":15,"21473":15,"21673":15,"2174":15,"21805":15,"21878":15,"218786094847e":15,"21892":15,"21893":15,"222715508467e":15,"22723621650191106":15,"22759":15,"230407246199e":15,"232906623449e":15,"234709":15,"23604":15,"2383":[],"2424":14,"24954e":15,"25294":15,"2535":15,"255":0,"257":21,"25msun":[0,11],"27442":15,"27563":15,"27565":15,"27572":15,"27804":15,"278384712062e":15,"281":21,"28672":15,"29402e":15,"29444":15,"294870923827e":15,"29678":15,"2969346":2,"29746":15,"2983275843337705":15,"29864":15,"29942":15,"29977":15,"29994":15,"2a7732d03e594ef4b5dfe9051b41d9c0":15,"2msun":[0,11],"3000":[0,11],"30145":15,"30149":15,"30197":15,"3032":15,"30337":15,"30504":15,"30e4":[0,11],"31004":15,"315554923168e":15,"3177":15,"32047":15,"3205":15,"32641e":15,"33062":15,"33079":15,"33524":12,"337250536639e":15,"34071e":15,"34281":15,"34903":15,"34922":15,"34937":15,"350021848285e":15,"35209":15,"3552":15,"364277535630e":15,"3678":15,"3680f3882c0a449c944462abffea2447":15,"36979":15,"36m":11,"38004":15,"38063":12,"3836":15,"38403":15,"38887e":15,"3933":15,"3msun":2,"4000":0,"4046":15,"40513":15,"40745":15,"40749":15,"40935":15,"41074":15,"41264":15,"41295e":15,"42148e":15,"42212":15,"42238":15,"42375":15,"42msun":[0,11],"43925":15,"439623364590e":15,"4424":15,"446":12,"449960890183e":15,"44msun":[0,11],"4500":11,"45000000080":15,"4530":[12,14],"458869865939e":15,"459153942631e":15,"45msun":[0,11],"4603":15,"47276":15,"47961":15,"47976e":15,"4838":14,"48488":15,"4e3":[0,11],"500":[0,11],"5102526289471614":15,"513216011269e":15,"517749":14,"518":14,"522806":[],"523":[],"525":15,"527722847382e":15,"52963":15,"53113":15,"53174":15,"53175":15,"53176":15,"53177":15,"53183":15,"53184":15,"5357":15,"53631":15,"53922":15,"546683":14,"556479830908e":15,"55924":15,"561265707015991":15,"56776":15,"5689":15,"571858031651e":15,"575":15,"577754":[],"59052":15,"59499":15,"5msun":[0,11],"6000":0,"600000":0,"60808":15,"6101":[],"61349":12,"6162":0,"6246354579925537":15,"62486":15,"625":0,"62517":15,"635":0,"64419":15,"65097":15,"653200958306e":15,"67365":[],"687368550125e":15,"68933e":15,"693213405973e":15,"6944":0,"6e1":2,"6e5":[0,11],"6msun":[0,11],"70319":15,"70668e":15,"71025":15,"71288":15,"716":14,"7197":15,"721374713429e":15,"723547465714e":15,"723570798020e":15,"72498e":[12,15],"72638":15,"726405299909e":15,"730":[12,15],"73221":15,"733614170983e":15,"733794947644e":15,"733865371895e":15,"7358":[11,12],"73856":15,"74037":12,"7431":15,"750574783854e":15,"753837732894e":15,"7619":0,"763":2,"764340254985e":15,"765535914728e":15,"765996194699e":15,"76647":15,"766606588165e":15,"768305081494e":15,"773581245005e":12,"774":[],"7797017097473145":15,"78096":15,"78125":0,"783":14,"78384":15,"79411e":15,"795":2,"797342083485e":15,"802132608769e":15,"80457":15,"806014211040e":15,"806123543037e":15,"807147339697e":15,"80msol":2,"81391":15,"8162e":15,"817":14,"8178":15,"81906":15,"82242e":15,"84162":15,"853070305680e":15,"85486":15,"862081089332e":15,"8628":15,"862942347290e":15,"863377990313e":15,"867655467480e":15,"878236827680e":12,"881529045940e":15,"88566":15,"8955":[],"917420996633e":15,"92267":12,"922967341481e":15,"931266944719e":15,"93135e":15,"933751523833e":15,"94027":15,"941017702765e":15,"9458":14,"9514":[],"9545065608702976":15,"9713":15,"97286e":15,"974759306305e":15,"97823":15,"9791":15,"980988739731e":15,"9863e":15,"990017992944e":15,"99198":12,"99255":15,"99283":15,"9947":14,"99471":15,"9983":14,"boolean":[0,4,5,7,11,16,21],"break":[0,11],"case":[0,4,7,11,15],"catch":[4,7,14,15],"char":7,"class":[4,5],"const":[2,5,15,19],"default":[0,1,2,4,5,6,7,11,12,13,15,18],"export":[4,5,15],"float":[0,2,4,11,13,14,19,21],"function":[0,1,2,3,5,6,7,8,9,10,12,16,17,18,19,21],"import":[4,5,11,12,13,14,15],"int":[0,1,2,4,5,6,7,11,15,19,21],"krtickov\u00e1":0,"kub\u00e1t":0,"long":[0,4,5,7,11,15,20],"new":[0,2,4,5,11,14,15],"null":[0,4,11,12,13],"paczy\u0144ski":[0,11],"public":[6,9,15],"return":[1,2,4,5,6,7,11,13,14,15,16,18,19,21],"short":[0,11,20],"super":[0,11],"switch":[0,11],"throw":[9,17],"true":[0,4,5,6,7,11,13,15,16],"try":[0,9,11,14,15,17],"void":12,"while":[0,11],Added:15,Adding:[3,14],And:[6,9,17,21],But:14,Doing:15,For:[0,4,9,11,12,14,16,17],Gas:[0,11],Its:7,NOT:[0,11,18],Not:7,One:[0,11],Pms:16,That:[0,11],The:[0,1,2,3,4,5,7,9,11,12,13,14,15,16,17,18],Then:[4,9,17],There:[2,5,6,7,11,12,13,14,15,16],These:[4,7,11,15,16],Use:[0,5,11,15],Used:[0,7,11,16],Useful:[0,5,6,11,15],Uses:[0,11,19],Using:[3,9],Was:[0,11],Will:[0,4,5,11,15,18],With:6,__arg_begin:11,__attribute__:12,__enter__:4,__exit__:4,_actually_evolve_system:7,_binary_c_bind:[4,11,12,14,21],_binary_c_config_execut:7,_binary_c_dir:7,_binary_c_execut:7,_binary_c_shared_librari:7,_calculate_multiplicity_fract:15,_commandline_input:7,_count:7,_custom_logging_shared_library_fil:7,_end_time_evolut:7,_errors_exceed:7,_errors_found:7,_evolution_type_opt:7,_failed_count:7,_failed_prob:7,_failed_systems_error_cod:7,_generate_grid_cod:7,_grid_vari:7,_loaded_ms_data:7,_main_pid:7,_population_id:7,_probtot:7,_process_run_population_grid:7,_repeat:7,_set:5,_set_ms_grid:7,_start_time_evolut:7,_store_memaddr:7,_system_gener:7,_total_mass_run:7,_total_probability_weighted_mass_run:7,_total_starcount:7,_zero_prob_stars_skip:7,a173:0,abat:[0,11],abbrevi:20,abl:11,about:[3,4,5,6,15,21],abov:[0,2,4,5,11,12,14,15],abridg:[11,12],absolut:[0,11],abund:[0,11],acceler:[0,11],accept:[4,11,15],access:[2,7,12,14,15],accord:[0,2,11],accordingli:[14,15],account:[0,7,11],accret:[0,11],accretion_limit_dynamical_multipli:[0,11],accretion_limit_eddington_lmms_multipli:[0,11],accretion_limit_eddington_steady_multipli:[0,11],accretion_limit_eddington_wd_to_remnant_multipli:[0,11],accretion_limit_thermal_multipli:[0,11],accretor:[0,11,21],act:[0,7,11,15],activ:[0,9,11,17],actual:[0,4,5,7,9,11,12,14,15,16,17],adam:[0,11],adapt:[0,11],add:[0,2,4,5,7,12,14,15,16,19,21],add_grid_vari:[5,15],added:[4,14],adding:[14,15],address:[1,7,11,12,21],admittedli:16,adress:[11,12,21],advis:12,affect:[0,11],after:[0,5,7,11,12,15],ag89:[0,11],again:[4,7,9,13,14,17],against:16,agb:[0,11],agb_3dup_algorithm:[0,11],agb_core_algorithm:[0,11],agb_core_algorithm_default:0,agb_core_algorithm_hurlei:0,agb_core_algorithm_karaka:0,agb_luminosity_algorithm:[0,11],agb_luminosity_algorithm_default:0,agb_luminosity_algorithm_hurlei:0,agb_luminosity_algorithm_karaka:0,agb_radius_algorithm:[0,11],agb_radius_algorithm_default:0,agb_radius_algorithm_hurlei:0,agb_radius_algorithm_karaka:0,agb_third_dredge_up_algorithm_default:0,agb_third_dredge_up_algorithm_hurlei:0,agb_third_dredge_up_algorithm_karaka:0,agb_third_dredge_up_algorithm_stancliff:0,age:[0,11],aging:[0,11],albedo:[0,11],algorithm:[9,11],algothim:[0,11],all:[0,1,2,4,5,6,7,9,10,11,13,14,15,16,17,18],all_info:5,alloc:11,allow:[0,2,4,7,11,12],allow_nan:4,along:[0,6,7],alpha:[0,11],alpha_c:[0,11],alphacb:[0,11],alreadi:[5,15],also:[0,3,4,5,6,9,11,12,15,17,21],altern:[0,7,11],alwai:[0,2,7,11],amanda:[0,11],amax:2,amin:2,amount:[0,4,5,6,7,11,15,19],amp:11,amt_cor:[7,15],analys:18,analyt:[5,15],analyz:14,andrew:[9,17],andronov:[0,11],angelou_lithium_cheb_decay_tim:[0,11],angelou_lithium_cheb_massfrac:[0,11],angelou_lithium_cheb_tim:[0,11],angelou_lithium_decay_funct:[0,11],angelou_lithium_decay_tim:[0,11],angelou_lithium_eagb_decay_tim:[0,11],angelou_lithium_eagb_massfrac:[0,11],angelou_lithium_eagb_tim:[0,11],angelou_lithium_gb_decay_tim:[0,11],angelou_lithium_gb_massfrac:[0,11],angelou_lithium_gb_tim:[0,11],angelou_lithium_hg_decay_tim:[0,11],angelou_lithium_hg_massfrac:[0,11],angelou_lithium_hg_tim:[0,11],angelou_lithium_lmms_decay_tim:[0,11],angelou_lithium_lmms_massfrac:[0,11],angelou_lithium_lmms_tim:[0,11],angelou_lithium_ms_decay_tim:[0,11],angelou_lithium_ms_massfrac:[0,11],angelou_lithium_ms_tim:[0,11],angelou_lithium_tpagb_decay_tim:[0,11],angelou_lithium_tpagb_massfrac:[0,11],angelou_lithium_tpagb_tim:[0,11],angelou_lithium_vrot_trigg:[0,11],angelou_lithium_vrotfrac_trigg:[0,11],angular:[0,11,16],ani:[0,2,4,5,9,11,14,15,17],anoth:[0,11],ansi:[0,11],ansi_colour:0,anyth:[0,7,11,15],anywai:[5,14,15],anywher:[5,15],api:[0,3,4,9],api_log_filename_prefix:[0,11,14],append:[1,4,14],appli:[0,11],apply_darwin_radau_correct:0,appropri:[0,7,11],approxim:[0,11],aren:[2,7],arenou2010_binary_fract:2,arg:[2,4,11,13,15,16],arg_dict:4,argopt:[0,11],argpair:[4,13],argstr:[11,12,14],argument:[0,2,4,5,7,11,14,15,18],argument_of_periastron:[0,11],argument_of_periastron_quadrupl:[0,11],argument_of_periastron_tripl:[0,11],around:[0,11,12,14],arrai:[2,4,7,14],arrow:0,artifici:[0,11],artificial_accretion_end_tim:[0,11],artificial_accretion_ignor:0,artificial_accretion_start_tim:[0,11],artificial_angular_momentum_accretion_r:[0,11],artificial_mass_accretion_r:[0,11],artificial_orbital_angular_momentum_accretion_r:[0,11],arxiv:[0,2,11],ask:[0,11,21],asplund:[0,11],assign:[5,15],assum:[0,11,16],ast871:[0,11],astronomi:[0,11],astropi:[9,16,17],atom:4,attempt:[4,5],aug:0,auto:[1,10],autogen_c_logging_cod:[1,12],automat:[0,1,6,9,11,12,17],avaibl:[9,17],avail:[0,4,7,11,12,15,16],avoid:11,awai:[0,11],axi:[0,11,16],b_1:[0,11],b_2:[0,11],b_3:[0,11],b_4:[0,11],b_inclination1:[0,11],b_inclination2:[0,11],b_inclination3:[0,11],b_inclination4:[0,11],back:[0,4,11],backward:[0,11],bagb:[0,11],barn:[0,11],base:[0,2,4,5,9,11,15,16,17,21],base_filenam:[5,15],basic:[5,15],batchmod:[0,11],beasor:[0,11],becaus:[0,2,5,7,9,11,14,17],becom:[0,1,2,4,11,12],been:[0,5,7,11,13],befor:[0,5,7,9,11,15,17],behaviour:[4,15,18],belczynski:[0,11],below:[0,3,7,11,12,15],berro:[0,11],bertolami:[0,11],best:[5,7,9,17],beta:[0,11],beta_reverse_nova:[0,11],beta_reverse_novae_geometri:0,better:[0,4,5,11,15],between:[0,2,11,19],bewar:[5,15],bh_belczynski:0,bh_fryer12_delai:0,bh_fryer12_rapid:0,bh_fryer12_startrack:0,bh_hurley2002:0,bh_prescript:[0,11],bh_spera2015:0,big:[0,7,11],biinari:15,bin:[0,9,11,17],binari:[2,5,7,9,11,14,15,16,17,21],binary_c2:[9,17],binary_c:[1,2,3,4,5,7,12,14,15,16,18],binary_c_api_funct:12,binary_c_cal:[5,15],binary_c_default:15,binary_c_grid_2a7732d03e594ef4b5dfe9051b41d9c0:15,binary_c_inline_config:1,binary_c_log_cod:[1,12,14],binary_c_macro:[0,11],binary_c_output:4,binary_c_paramet:[0,11,15],binary_c_python:[4,5,11,14,15],binary_c_task_:[0,11],binary_c_write_log_cod:1,binary_grid:[0,11],binary_star:21,binaryc:[1,4,13,18],binaryc_config:1,binaryc_json_seri:4,binarycdecod:4,binarycencod:4,binarycpython3:11,binarycpython:[1,2,3,4,5,6,9,16,17,18,19,21],binarygrid:15,bind:[0,11,12,14],birth:[0,11],bit:2,bivari:[0,11],black:[0,11],black_hol:0,bloecker:[0,11],blog:1,boltzman:16,boltzmann:[0,11],bondi:[0,11],bondi_hoyle_accretion_factor:[0,11],bool:[4,5,6,13,15,16],born:[0,11],bosswissam:4,both:[0,4,11,15],bottom:[0,11,15],bound:[2,19],boundari:2,brake:[0,11],branch:[0,4,11],branch_david:0,branchpoint:[5,15],breakup:[0,11],broken:[0,11],bse:[0,2,11,12,15],bse_opt:[5,14,15],bsf:[0,11],buffer:[0,11],build:[0,1,3,4,11],build_q_tabl:2,built:[0,1,4,9,13,17],burn:[0,11],busso:[0,11],bye:[0,11],c13_eff:[0,11],c5232be5c:[],c_auto_log:7,c_log:0,c_logging_cod:[7,12,14,15],calc_e_integr:2,calc_p_integr:2,calc_period_from_sep:21,calc_sep_from_period:[15,21],calc_total_probden:2,calcul:[0,2,4,5,7,11,15,21],calculate_constants_three_part_powerlaw:2,call:[0,1,4,5,7,11,13,14,15,16,18],call_binary_c_config:4,calls_filenam:15,can:[0,1,2,4,5,7,9,11,12,13,14,15,16,17,18],cannot:[5,12],canon:7,cap:[0,11],capsul:[1,4,11],captur:[0,4,11],carbon:[0,11],carbon_oxygen_white_dwarf:0,carlo:[0,7,11],carrasco:[0,11],carri:[0,11],cast:[4,13],catchtim:4,categor:11,categori:[11,15],categoris:4,caught:[4,14],caus:21,cbdisc:[0,11],cbdisc_albedo:[0,11],cbdisc_alpha:[0,11],cbdisc_eccentricity_pumping_dermin:0,cbdisc_eccentricity_pumping_method:[0,11],cbdisc_eccentricity_pumping_non:0,cbdisc_end_evolution_after_disc:[0,11],cbdisc_fail_ring_inside_separ:[0,11],cbdisc_gamma:[0,11],cbdisc_init_djdm:[0,11],cbdisc_init_dm:[0,11],cbdisc_inner_edge_strip:[0,11],cbdisc_inner_edge_stripping_timescal:[0,11],cbdisc_kappa:[0,11],cbdisc_mass_loss_constant_r:[0,11],cbdisc_mass_loss_fuv_multipli:[0,11],cbdisc_mass_loss_inner_l2_cross_multipli:[0,11],cbdisc_mass_loss_inner_viscous_accretion_method:[0,11],cbdisc_mass_loss_inner_viscous_accretion_method_equ:0,cbdisc_mass_loss_inner_viscous_accretion_method_gerosa_2015:0,cbdisc_mass_loss_inner_viscous_accretion_method_non:0,cbdisc_mass_loss_inner_viscous_accretion_method_young_clarke_2015:0,cbdisc_mass_loss_inner_viscous_angular_momentum_multipli:[0,11],cbdisc_mass_loss_inner_viscous_multipli:[0,11],cbdisc_mass_loss_ism_pressur:[0,11],cbdisc_mass_loss_ism_ram_pressure_multipli:[0,11],cbdisc_mass_loss_xray_multipli:[0,11],cbdisc_max_lifetim:[0,11],cbdisc_minimum_evaporation_timescal:[0,11],cbdisc_minimum_fr:[0,11],cbdisc_minimum_luminos:[0,11],cbdisc_minimum_mass:[0,11],cbdisc_no_wind_if_cbdisc:[0,11],cbdisc_outer_edge_strip:[0,11],cbdisc_outer_edge_stripping_timescal:[0,11],cbdisc_resonance_damp:[0,11],cbdisc_resonance_multipli:[0,11],cbdisc_torquef:[0,11],cbdisc_viscous_l2_coupl:[0,11],cbdisc_viscous_photoevaporative_coupl:[0,11],cbdisc_viscous_photoevaporative_coupling_inst:[0,11],cbdisc_viscous_photoevaporative_coupling_non:[0,11],cbdisc_viscous_photoevaporative_coupling_visc:[0,11],cee:[0,11],cell:[11,15],cemp:[0,11],cemp_cfe_minimum:[0,11],center:15,centr:5,central_object:[0,11],certain:[7,9,17],cf_amanda_log:[0,11],cflag:[9,17],chabrier:2,chandrasekhar:[0,11],chandrasekhar_mass:[0,11],chang:[0,1,2,4,5,6,7,9,11,12,15,17],chapter:[0,7,10],cheb:[0,11],check:[0,2,4,5,6,11,15,21],check_circular:4,chemic:[0,11],chen:[0,11],child:4,choic:[0,2,11,16],choos:[0,11,12,16],chose:14,chosen:[5,15],circular:[0,11],circumbinari:[0,11],circumstanti:[0,11],claei:[0,11],clark:[0,11],clean:[1,5,9,14,17],clean_up_custom_logging_fil:5,clear:4,clock:4,clone:[9,17],close:[0,11],cloud:[0,11],cls:4,cluster:8,cmdline:5,code:[0,1,5,6,9,11,12,14,15,16,17,18],collaps:[0,11],collapsar:[0,11],collect:21,collid:21,color:16,color_by_index:16,colour:[0,11],colour_log:[0,11],column:[14,15,16],column_nam:14,com:[1,4],combin:[1,4,5,7,12],combine_ensemble_with_thread_join:7,come:[2,9,17,19],comenv_bs:0,comenv_disc_angmom_fract:[0,11],comenv_disc_mass_fract:[0,11],comenv_ejection_spin_method:[0,11],comenv_ejection_spin_method_do_noth:[0,11],comenv_ejection_spin_method_sychron:[0,11],comenv_ejection_spin_method_synchron:0,comenv_merger_spin_method:[0,11],comenv_merger_spin_method_breakup:0,comenv_merger_spin_method_conserve_angmom:[0,11],comenv_merger_spin_method_conserve_omega:[0,11],comenv_merger_spin_method_specif:[0,11],comenv_ms_accret:[0,11],comenv_ms_accretion_fract:[0,11],comenv_ms_accretion_mass:[0,11],comenv_nandez2016:0,comenv_nelemans_tout:0,comenv_ns_accret:[0,11],comenv_ns_accretion_fract:[0,11],comenv_ns_accretion_mass:[0,11],comenv_post_eccentr:[0,11],comenv_prescript:[0,11],comenv_splitmass:[0,11],comenv_undef:0,command:[0,1,5,7,9,11,15,17],commandlin:15,comment:15,commit:4,common:[0,11,12,14,15],compact:15,companion:[0,11],compar:[0,7,11,15],compil:[1,9,12,15,17],compile_shared_lib:1,complet:15,complex:[5,7,12,15,16],compon:[4,16],comput:[0,8,11],condit:[5,12,15],condor:[5,7,8],condor_grid:5,config:[1,4,7,9,17],config_fil:1,configur:[2,5,14,15],conjunct:13,conserv:[0,11],consid:[0,1,2,4,5,7,11,16],constant:[0,2,11,16],construct:[0,1,11,14,15],contain:[0,1,2,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20],content:[3,4,9,11],context:4,continu:[5,15],control:[0,11,15],convect:[0,11],converg:[0,11],convert:[2,4,5],convert_byt:4,cool:[0,11],copi:[0,5,11,21],core:[0,5,7,11,15,16],core_co:12,core_h:12,core_helium_burn:0,core_mass:[0,11,12],correct:[0,2,5,14,16,21],correctli:[9,14,16,17],correspond:16,corretor:[0,11],cosmic:2,cosmic_sfh_madau_dickinson2014:2,could:[0,4,11,15],count:[4,7],count_keys_recurs:4,counter:7,coupl:[0,11],cours:16,cover:13,coverag:[9,17],cowd:[0,11],cpu:[0,11],cpython:11,crap_paramet:[0,11],creat:[2,4,5,12,14,15],create_and_load_logging_funct:[1,12],create_arg_str:4,create_hdf5:4,creation:11,critic:[0,11],cross:[0,11],ctype:1,cuntz:[0,11],current:[0,4,9,11,12,17],custom:[0,1,3,4,5,7,9,11,14,15,16,18],custom_log:[5,7,14],custom_logging_cod:[1,12,14,18],custom_logging_func_memaddr:[7,11,12],custom_logging_funct:[7,9,10,12,14,15],custom_logging_info:5,custom_logging_memaddr:12,custom_logging_print_stat:14,custom_logging_stat:15,custom_opt:[5,14,15],custom_output_funct:12,custom_sort_dict:4,custom_tmp_dir:1,customis:16,cvode:[0,11],d20a4c74d20a43b881c0c9e5def5f76c:15,dai:[0,2,11,12,14,15,21],damp:[0,11],darwin:0,dat:[0,4,15],data:[0,4,5,7,11,14,15,18],data_dict:2,data_dir:[4,5,7,15],datadir:[5,15],datafram:[14,16],dataset:[4,15],date:5,david:[0,9,11,17],david_logging_funct:[0,11],dd7:[0,11],deactiv:[0,11],deal:[4,14],death:[0,11],debug:[0,7,11,15],decai:[0,11],decid:[0,4,11,12],decod:4,decreas:[0,11],deeper:[5,15],def:[14,15],default_to_metal:[0,11],defaultdict:4,defer:[0,11],defin:[0,1,2,5,11,16],definit:[1,21],degener:[0,11],degre:[0,11],delai:0,delta_mcmin:[0,11],den:[0,11],densiti:2,depend:[0,2,9,11,16,17],deprec:[0,11],dermin:[0,11],describ:[0,2,7,11],descript:[0,2,4,7,9,10,11,13],design:[5,16],desir:[0,11],destruct:[5,15],detail:[0,4,11,14],detect:[0,11],determin:[0,5,11,12,15,21],deton:[0,11],dev:[0,11],develop:1,deviat:2,dewi:[0,11],dex:[0,11],diagnost:7,diagram:[0,11,16],dickonson:2,dict2:4,dict:[1,2,4,5,6,13,14,15,20],dict_1:4,dict_2:4,dict_kei:[13,14],dictionari:[1,2,3,4,5,6,7,15,16,20],did:[4,9,17],differ:[0,4,5,9,11,15,16,17],dimmer:[0,11],dir:[9,17],direct:[0,5,11],directli:[4,7,14],director:7,directori:[0,3,4,5,7,9,11,15,17],disabl:[0,11,15],disable_debug:[0,11],disable_end_log:[0,11],disable_ev:[0,11],disc:[0,11],disc_legacy_log:[0,11],disc_log2d:[0,11],disc_log:[0,11],disc_log_directori:[0,11],disc_log_dt:[0,11],disc_log_level_non:0,disc_log_level_norm:0,disc_log_level_normal_first_disc_onli:0,disc_log_level_subtimestep:0,disc_log_level_subtimestep_first_disc_onli:0,disc_n_monte_carlo_guess:[0,11],disc_stripping_timescale_infinit:0,disc_stripping_timescale_inst:0,disc_stripping_timescale_orbit:0,disc_stripping_timescale_visc:0,disc_timestep_factor:[0,11],discret:15,discs_circumbinary_from_comenv:[0,11],discs_circumbinary_from_wind:[0,11],disk:[0,5,11],dispers:[0,11],displai:[0,11],dist:[9,17],distefano:2,distribut:[0,2,5,8,11,15],distribution_funct:[9,10,15],divid:8,dlnm1:[5,15],dlog10per:15,dlogp:2,do_dry_run:7,doc:[4,6,9,15,17],doc_fetch:2,docstr:[9,14,16,17],document:[4,6,7,10,15],doe:[0,2,4,5,7,11,12,13,14,15,21],doesn:[5,7],doesnt:6,doing:[0,1,5,6,9,11,17],don:[2,4,7],done:[0,4,5,9,11,15,17],donor:[0,11,21],donor_limit_dynamical_multipli:[0,11],donor_limit_envelope_multipli:[0,11],donor_limit_thermal_multipli:[0,11],donor_rate_algorithm_bs:0,donor_rate_algorithm_claeys2014:0,dont:11,doubl:[12,15],down:15,dphasevol:[5,15],dr2:[0,11],dr3:[0,11],drai:[0,11],dredg:[0,11],drop:14,dry:7,dstep:2,dt_limit:13,dtfac:[0,11],dtlimit:4,dtm:[1,12,15],due:[9,17],dummi:[2,16],dump:[0,4,11,14],dumpvers:[0,11],duquennoi:2,duquennoy1991:2,dure:[0,11],dust:[0,11],dwarf:[0,11],dynam:[0,11],e2_hurley_2002:0,e2_izzard:0,e2_mint:0,e2_prescript:[0,11],each:[0,2,4,5,7,11,15],eagb:[0,11],eagb_wind_beasor_etal_2020:0,eagb_wind_bs:0,eagb_wind_goldman_etal_2017:0,eagbwind:[0,11],eagbwindfac:[0,11],earli:[0,11],early_asymptotic_giant_branch:0,easi:[4,14],easier:[4,15],ecc2:2,ecc3:2,ecc:[2,5,14,15],eccentr:[0,2,11,12,14,15,16,21],eccentric_rlof_model:[0,11],eccentricity_quadrupl:[0,11],eccentricity_tripl:[0,11],echo:[0,11],eddington:[0,11],edg:[0,5,11,15],edit:12,edu:[0,11],effect:[0,2,7,11,12],effective_metal:[0,11],effici:[0,11],egg:[9,17],eggleton:[0,11,21],either:[0,4,5,7,9,11,15,17,18],eject:[0,11],elabor:12,eld:[0,11],eldridg:[0,11],electon:[0,11],electron:[0,11],element:[0,1,4,7,11,13,16],els:12,email:4,emp:[0,11],emp_feh_maximum:[0,11],emp_logg_maximum:[0,11],emp_minimum_ag:[0,11],empti:[4,6,14],enabl:[0,11],encod:4,encount:7,end:[0,2,4,7,11],end_index:2,end_timestamp:15,energi:[0,11],enhanc:[0,11],enlarg:[0,11],enough:2,ensembl:[0,4,7,11,13],ensemble_def:[0,11],ensemble_dictionari:4,ensemble_dt:[0,11],ensemble_factor_in_probability_weighted_mass:7,ensemble_filter_:[0,11],ensemble_filters_off:[0,11],ensemble_json:4,ensemble_legacy_ensembl:[0,11],ensemble_list:5,ensemble_logdt:[0,11],ensemble_logtim:[0,11],ensemble_macro:[0,11],ensemble_output_:7,ensemble_startlogtim:[0,11],ensure_ascii:4,enter:[0,9,11,17],enthalpi:[0,11],entir:[12,14],entri:[4,5],env:[9,11,16,17],envelop:[0,11],equal:[0,4,15],equat:[0,11],equation_of_state_algorithm:[0,11],equation_of_state_paczynski:0,equatori:[0,11],equival:7,errno:[9,17],error:[0,4,7,9,11,15,17],errors_exceed:15,errors_found:15,esa:2,escap:[0,11],escape_fract:[0,11],escape_veloc:[0,11],eta:[0,11],etal:[0,11],etc:[0,4,5,8,9,11,14,15,16,17,18],euler:[0,11],evalu:[2,5,15,21],evan:[0,11],evapor:[0,11],evaporate_escaped_orbiting_object:[0,11],even:13,event:[0,11],everi:[0,9,11,17],everyth:[5,7,14,15],everytim:[9,17],evid:[0,11],evolut:[0,1,5,7,11,14,15,16],evolution_split:[0,11],evolution_splitting_maxdepth:[0,11],evolution_splitting_sn_eccentricity_threshold:[0,11],evolution_splitting_sn_n:[0,11],evolution_typ:[7,15],evolutionari:[0,11,14],evolv:[0,3,5,7,11,12],evolve_popul:15,evolve_singl:[5,12,14],exact:[1,4,7],exactli:[0,11],exampl:[1,2,4,5,14,18],example_above_m:12,example_compact_object:15,example_dco:15,example_df:14,example_head:4,example_log:18,example_log_co:[1,12],example_logging_string_co:12,example_logging_string_post_m:12,example_massloss:[12,14],example_output:14,example_parse_output:4,example_pop:[14,15],example_pop_set:15,example_python_population_result:15,example_sn:12,exce:[0,7,11],except:[4,5,6,7,11,15,16],execut:[0,5,7,9,11,15,17],exist:[0,5,6,11,15],exist_ok:[4,15],exit:[0,4,11],exp:[5,15],expand:[15,18],expect:[9,11,17],experiment:[0,4,11],explain:[3,4],explicitli:[0,1,11],explod:[0,11],explos:[0,11],expoenti:[0,11],expon:[0,11],export_all_info:[5,15],express:[0,11],extend:[0,9,17],extens:11,extern:[0,11],extra:[0,3,5,7,9,11,15,18],extra_text:6,extract:[4,15],extract_ensemble_json_from_str:4,extrapol:[2,7],fabian:[0,11],fabian_imf_log:[0,11],fabian_imf_log_tim:[0,11],fabian_imf_log_timestep:[0,11],factor:[0,2,4,7,11],fade:[0,11],fail:[0,4,7,9,11,17],fail_sil:4,failed_count:15,failed_prob:15,failed_system:7,failed_system_log:7,failed_systems_error_cod:15,failed_systems_threshold:7,failsaf:14,failur:[0,11],fallback:[0,12],fallback_mass:12,fals:[0,4,5,7,11,13,15,16],fancy_parsing_funct:18,far:[0,11],farmer:[0,11],fase:15,fast:[0,11],faster:15,favorit:14,featur:[3,9,15],feed:7,ferguson:[0,11],fetch:14,few:[0,11],field:[0,11],fig:[0,2,11],figur:[7,16],file:[0,1,4,5,6,7,8,9,11,14,15,16,17,18],file_log:[0,11],filehandl:6,filenam:[0,1,4,5,7,11,14,15,18],filenotfounderror:[9,17],filepath:1,fill:14,fill_data:2,filter:[0,4,11,13],filter_arg_dict:4,filter_valu:[4,13],fin:[0,11],find:[4,5,7,9,15,17],finish:[4,15,16],first:[0,2,4,5,9,11,14,15,17,21],first_giant_branch:0,fishlock:[0,11],fit:[0,2,4,5,11,14,21],fix:[0,2,4,5,11,14,15,16],flag:[0,1,4,7,11],flash:[0,11],flat:[2,7],flatsect:[2,15],flaw:5,float_overflow_check:[0,11],flto:[9,17],fold:2,follow:[0,2,4,7,9,11,12,16,17],forc:[0,9,11,17],force_circularization_on_rlof:[0,11],force_corotation_of_primary_and_orbit:[0,11],form:[0,4,5,6,11,15],formal:[0,11],format:[0,2,4,5,11,12,14,15],format_ensemble_result:4,formula:[0,11],forward:[0,11],found:[2,9,15,17],four:[0,11],fpic:1,fraction:[0,2,7,11,15],framework:11,free_persistent_data_memaddr_and_return_json_output:11,free_store_memaddr:11,frequenc:[0,11],friction:[0,11],fring:[0,11],from:[0,2,4,5,7,13,14,15,16,21],from_binary_c_config:1,fryer:0,ftz:[9,17],full:[3,4,7,12],full_path:4,further:[2,15],fuv:[0,11],gaia:[0,2,11],gaia_colour_transform_method:[0,11],gaia_conversion_ubvri_bivariate_jordi2010:[0,11],gaia_conversion_ubvri_riello2020:[0,11],gaia_conversion_ubvri_univariate_evans2018:[0,11],gaia_conversion_ubvri_univariate_jordi2010:[0,11],gaia_conversion_ugriz_bivariate_jordi2010:[0,11],gaia_conversion_ugriz_riello2020:[0,11],gaia_conversion_ugriz_univariate_evans2018:[0,11],gaia_conversion_ugriz_univariate_jordi2010:[0,11],gaia_l_binwidth:[0,11],gaia_teff_binwidth:[0,11],gain:7,galact:[0,11],gallino:[0,11],gamma:[0,11],gap:[0,11],garcia:[0,11],gauss:[0,11],gaussian:2,gaussian_func:2,gaussian_normalizing_const:2,gb_reimers_eta:[0,11],gb_wind_beasor_etal_2020:0,gb_wind_goldman_etal_2017:0,gb_wind_reim:0,gb_wind_schroeder_cuntz_2005:0,gbwind:[0,11],gbwindfac:[0,11],gcc:[1,9,17],gce:[0,11],gener:[0,1,2,4,5,6,7,11,12,14,15,16],general_info:4,generalis:2,geometr:[0,11],gerosa:[0,11],get:[0,2,3,4,5,6,9,12,14,15,17,18,21],get_arg_kei:4,get_default:[4,13],get_help:[4,13],get_help_al:[4,5,13],get_help_sup:[4,13],get_integration_constant_q:2,get_max_multipl:2,get_moe_di_stefano_dataset:4,get_siz:4,giant:[0,11],giant_branch:0,git:[0,4,15],git_branch:4,git_build:4,github:4,gitlab:9,give:[0,2,4,11,21],given:[0,1,2,4,5,7,11,18,21],global:[0,2,11],global_dict:2,gmax:2,gmin:2,gnu:11,goe:[0,4,5,11,12,14,16],gogo:[0,11],going:[9,17],goldman:[0,11],gonna:2,good:[0,7,11,14,15,21],gov:[0,11],gravit:[0,11,15],gravitational_radiation_bs:0,gravitational_radiation_bse_when_no_rlof:0,gravitational_radiation_landau_lifshitz:0,gravitational_radiation_landau_lifshitz_when_no_rlof:0,gravitational_radiation_model:[0,11],gravitational_radiation_modulator_:[0,11],gravitational_radiation_modulator_j:[0,11],gravitational_radiation_non:0,grb:[0,11],great:[0,11],greater:[0,11],grevess:[0,11],grid:[0,3,4,5,9,10,11,12,14],grid_class:[9,10],grid_cod:5,grid_opt:[5,7,14,15],grid_options_default:6,grid_options_defaults_dict:6,grid_options_descript:[6,15],grid_options_description_check:6,grid_options_help:6,grid_vari:[7,15],grid_variable_numb:15,gridcode_filenam:7,gridtyp:[5,15],group:4,gsl:[9,17],gsl_dir:[9,17],guess:[0,2,11],h5py:[9,17],hachisu:[0,11],hachisu_disk_wind:[0,11],hachisu_ignore_qcrit:0,hachisu_qcrit:[0,11],hack:6,had:5,half:[0,11],hall:[0,11],handi:[0,11],handl:[0,3,4,5,7,11,14,18,21],handle_ensemble_string_to_json:4,happen:[0,11],hardcod:[12,15],has:[0,1,4,5,7,11,12,13,15],have:[0,2,3,4,5,6,7,9,11,12,14,15,16,17],hbb:[0,11],hbbtfac:[0,11],hdf5:4,hdf5file:4,header:[1,4,12,14,15],headerlin:15,headlin:7,hegb:0,hehg:0,height:[2,15],helium:[0,11],helium_flash_mass_loss:[0,11],helium_white_dwarf:0,help:[0,3,4,6,11,14,15],help_al:[0,11],hem:0,henc:[0,11],hendrik:[9,17],here:[1,4,5,7,11,12,14,16],hertzsprung:[0,11],hertzsprung_gap:0,hertzstrpung:[0,11],heuvel:[0,11],hewd:[0,11],hewd_hewd_ignition_mass:[0,11],hex:7,high:[0,2,11],higher:[0,2,4,7,9,11,15,17],his:2,histori:2,hold:7,hole:[0,11],home:11,homogen:[0,11],hood:14,hopefulli:[0,11],hot:[0,11],how:[0,4,5,7,11,12,14,15],howev:[0,11,12,15],hoyl:[0,11],hpc:[5,8],hpc_function:[9,10],hr_diagram:16,hrd:[0,11],hrdiag:[0,11],hrdiag_output:[0,11],html:[9,15,17],http:[0,1,2,4,11,15],hurlei:[0,11],hut:[0,11],hybrid:[0,11],hydro:[0,11],hydrogen:[0,11],ibc:[0,11],id_cor:12,idea:[15,16],idum:[0,11],ignit:[0,11],ignor:[0,5,7,9,11,12,14,15,17],iia:[0,11],iloc:14,imf:[0,2,11],imf_chabrier2003:2,imf_scalo1986:2,imf_scalo1998:2,imf_tinsley1980:2,immedi:[0,11],implement:[0,5,7,11],impli:[0,11],impos:15,improv:2,inclin:[0,11],inclination1:[0,11],inclination2:[0,11],inclination3:[0,11],inclination4:[0,11],inclini:[0,11],incliniation_quadrupl:[0,11],incliniation_tripl:[0,11],includ:[0,1,2,4,5,9,11,12,14,15,16,17],include_binary_c_default:[5,15],include_binary_c_help_al:[5,15],include_binary_c_version_info:[5,15],include_default:[5,15],include_popul:15,include_population_set:5,incom:[0,11],increas:[0,11],inde:[0,11],indent:[4,14],index:[0,2,9,11,13,14],indic:[0,2,11],individu:[3,9],individual_nova:[0,11],induc:[0,11],inertia:[0,11],info:[4,5,9,11,13,15,16,17],inform:[0,1,3,4,5,6,12,14,15,16],init:5,init_abund:[0,11],init_abund_dex:[0,11],init_abund_mult:[0,11],init_abunds_onli:[0,11],initi:[0,2,5,11,13,14],initial_abundance_hash:5,initial_abundance_mix:[0,11],initial_abunds_onli:[0,11],initial_mass:14,inner:[0,11],input:[1,2,4,5,7,9,11,13,14,16,21],input_dict:4,insert:[5,15],insid:[0,11],inspect:[4,14,16],inspect_dict:4,inspir:[1,16,21],instabl:[0,11],instanc:[4,14,15],instant:[0,11],instantli:[0,11],instead:[0,4,7,11],integ:[0,5,7,11,21],integr:2,integrals_str:2,interact:[0,6,11],interfac:[4,9,11,17],interfer:[9,17],intern:[0,7,11,13],internal_buff:[0,11],internal_buffering_off:0,internal_buffering_print:0,internal_buffering_stor:0,interpol:[2,5],interpolate_in_mass_izzard2012:2,interpolator_nam:2,intershel:[0,11],interstellar:[0,11],intger:[0,11],intro:[0,11],invers:21,involv:[0,11],inward:[0,11],ipynb:15,is_capsul:4,isfil:15,isn:[4,5],isnt:15,isotop:[0,4,11,13],isotope_hash:5,isotope_list:5,item:1,iter:4,its:[0,4,5,6,9,11,15,16,17,18],itself:[4,7,9,12,14,17],iwamoto:[0,11],izzard2012_period_distribut:2,izzard:[0,9,11,17],jager:[0,11],jaschek:2,jeff:[9,17],jia:[0,11],john:[0,11],join:[11,12,14,15],jordi:[0,11],json:[4,5,7,11,14,15],jsondecod:4,jsonencod:4,jupyt:[9,17],just:[0,2,4,5,7,11,15,21],kap:[0,11],kappa:[0,11],kaps_rentrop:[0,11],karaka:[0,11],keep:[5,15],kei:[1,2,4,5,6,7,13,14,15,16],kelvin:[0,11],keplerian:[0,11],keyword:[16,18],kick:[0,7,11],kick_backward:0,kick_forward:0,kick_inward:0,kick_outward:0,kick_random:0,kick_straight_up:0,kick_velocity_custom:0,kick_velocity_fix:0,kick_velocity_maxwellian:0,kill:[1,12,15],kim:[0,11],kind:[0,11],kippenhahn:[0,11],know:[0,1,5,6,11,13,14],known:[0,2,5,11,14,15,18],kroupa2001:[2,5,15],kroupa:2,krticka:0,ktg93:2,kwarg:[5,16,18],lambda:[0,11],lambda_c:[0,11],lambda_ce_dewi_tauri:0,lambda_ce_klencki_2020:0,lambda_ce_polytrop:0,lambda_ce_wang_2016:0,lambda_enthalpi:[0,11],lambda_ionis:[0,11],lambda_min:[0,11],lambda_mult:[0,11],lambda_multipli:[0,11],lambda_v:2,lamer:[0,11],landau:[0,11],langer:[0,11],larger:[0,11],last:2,lastli:[11,14],latter:[0,11],law:2,law_const:2,lbv:[0,11],ld_library_path:[9,17],lead:[0,11,15,21],learn:12,least:[9,17],leav:[0,11],left:[0,11],legaci:[0,11],legacy_yield:[0,11],len:[14,15],lengthen:[0,11],less:[0,1,2,3,11,14],let:[5,14,15],level:[1,4],li7:[0,11],lib:[9,11,14,17],libbinary_c:7,libcustom_logging_5d7779e8190e4b79b10c7e6a44cb0e7:14,libcustom_logging_8967553693ac4e11a49c42d4eef773e8:14,libcustom_logging_e9c2bec7f15541eb847fc6013e48e7:[],libcustom_logging_eac2dfc438a14e5a9f5be98b1b6b4294:[],libgsl:[9,17],libmemo:[9,17],librari:[0,1,5,7,11,12,18],library_path:[9,17],librinterpol:[9,17],lies:[0,11],lifetim:[0,11,15],lifshitz:[0,11],like:[0,1,4,5,7,9,11,15,16,17,19],limit:[0,11,15,16],line:[1,4,5,7,9,12,14,15,16,17],linear2:7,linear:[0,2,7,11],linear_extrapolation_q:2,linearli:19,linker:1,linspac:19,linux:11,list:[0,1,2,4,7,11,14,15,18,19],list_arg:[0,11],list_of_sub_kei:2,lit:[0,11],lithium:[0,11],lithium_gb_post_1dup:[0,11],lithium_gb_post_heflash:[0,11],lithium_hbb_multipli:[0,11],lithium_t:[0,11],littleton:[0,11],liu:[0,11],llnl:[0,11],lnm1:[5,15],load:[0,1,4,5,7,11,12,14,15,16],load_logfil:4,lobe:[0,11,21],local:2,locat:[0,2,7,9,11,17],lodder:[0,11],log10:[0,2,11,15],log10m1:7,log10p:2,log10per:15,log10pmin:2,log:[0,1,2,3,4,5,7,9,11,14,16,17,18,21],log_arg:7,log_args_dir:7,log_arrow:0,log_every_timestep:[12,14],log_fil:7,log_filenam:[0,11,14,18],log_runtime_system:7,logarithm:2,logensembletim:[0,11],logfil:[4,9,14,17],logg:[0,11],logger:15,logging_dict:1,logging_lin:12,logic:[1,5,7,12],logmass:2,logp:2,logper:2,logperiod:2,long_spectral_typ:2,longer:[0,11],longnam:[5,15],look:[1,4,9,15,17],lookback:[0,11],loon:[0,11],loop:[5,14,15],loos:16,lose:[0,11],loss:[0,11,14],lost:[0,11],lot:[4,7,15,18],low:[0,2,11],low_mass_m:0,low_mass_main_sequ:0,lower:[0,2,5,11,15,19],lsoda:[0,11],lsun:[0,11,16],lugaro:[0,11],luminos:[0,11,16],luminosity_1:16,luminosity_2:16,lynnett:[0,11],m_1:[0,5,11,12,13,14,15,18],m_2:[0,11,12,14,15],m_3:[0,11],m_4:[0,11],m_max:[2,5,15],m_min:[5,15],maccretor:[0,11],machin:[7,9,17],macro:[0,4,11,13],madau:2,maeder:[0,11],magellan:[0,11],magnet:[0,11],magnetic_braking_algorithm:[0,11],magnetic_braking_algorithm_andronov_2003:0,magnetic_braking_algorithm_barnes_2010:0,magnetic_braking_algorithm_hurley_2002:0,magnetic_braking_algorithm_rappaport_1983:0,magnetic_braking_factor:[0,11],magnetic_braking_gamma:[0,11],magnitud:4,mai:[0,11],main:[0,1,7,9,11,12,15,17],main_sequ:[0,11],mainli:8,major:[0,11],make:[0,1,2,4,5,7,9,11,14,15,16,17,18],make_build_text:4,makedir:[4,15],manag:[4,9,17],mani:[0,5,7,11,13,15],manual:12,manufactur:[0,11],map:7,maria:[0,11],mass:[0,1,2,4,5,7,11,13,14,15,16,18,21],mass_1:[15,16],mass_2:[15,16],mass_accretion_for_eld:[0,11],mass_accretor:21,mass_donor:21,mass_evolut:16,mass_for_hestar_ia_low:[0,11],mass_for_hestar_ia_upp:[0,11],mass_of_pmz:[0,11],mass_str:2,massiv:[0,2,11],massless:[0,11],massless_remn:0,master:[7,16],match:[0,4,11,14,15,16],materi:[0,11],math:[5,15],matplotlib:[9,16,17],matter:[0,11],mattsson:[0,11],mattsson_mass_loss:[0,11],mattsson_orich_tpagbwind:[0,11],max:[0,2,11,12,15],max_bound:[2,19],max_evolution_tim:[0,1,11,12,14,15],max_hewd_mass:[0,11],max_model_numb:[0,11],max_multipl:2,max_neutron_star_mass:[0,11],max_queue_s:7,max_stellar_angmom_chang:[0,11],max_stellar_type_1:[0,11],max_stellar_type_2:[0,11],max_stellar_type_3:[0,11],max_stellar_type_4:[0,11],max_tim:14,max_val:2,maximum:[0,2,7,11,12,21],maximum_mass_ratio_for_instant_rlof:[0,11],maximum_mass_ratio_for_rlof:21,maximum_mcbagb_for_degenerate_carbon_ignit:[0,11],maximum_nuclear_burning_timestep:[0,11],maximum_timestep:[0,11],maximum_timestep_factor:[0,11],maxmimum:[0,11],maxwellian:[0,11],mayb:16,mayor:2,mc13_pocket_multipli:[0,11],mch:[0,11],mcmin:[0,11],mdonor:[0,11],mean:[0,2,4,5,7,9,11,17],meant:7,measur:4,medium:[0,11],mega:2,memaddr:[11,12],memori:[1,5,7,11,12,21],menv:[0,11],merg:[0,2,4,7,11],merge_dict:[4,13],merge_multipl:2,merger:[0,11],merger_angular_momentum_factor:[0,11],merger_mass_loss_fract:[0,11],mesa:[9,17],mesasdk_init:[9,17],mesasdk_root:[9,17],messag:4,mestel:[0,11],met:[5,15],metal:[0,2,11,12,14,15,21],method:[0,5,7,11,12,14,15],meynet:[0,11],might:[4,5,9,15,17],milki:[0,11],miller:[0,11],min:[2,12,15],min_bound:[2,19],min_p:2,min_per:2,min_val:2,minimal_verbos:4,minimum:[0,2,4,7,11,21],minimum_co_core_mass_for_carbon_ignit:[0,11],minimum_co_core_mass_for_neon_ignit:[0,11],minimum_donor_menv_for_comenv:[0,11],minimum_envelope_mass_for_third_dredgeup:[0,11],minimum_helium_ignition_core_mass:[0,11],minimum_mcbagb_for_nondegenerate_carbon_ignit:[0,11],minimum_orbital_period_for_instant_rlof:[0,11],minimum_period_for_rlof:21,minimum_separation_for_instant_rlof:[0,11],minimum_separation_for_rlof:21,minimum_time_between_pn:[0,11],minimum_timestep:[0,11],mint:[0,11],mint_data_cleanup:[0,11],mint_dir:[0,11],mint_disable_grid_load_warn:[0,11],mint_fallback_to_test_data:0,mint_hard_max_nshel:0,mint_hard_min_nshel:0,mint_kippenhahn:[0,11],mint_kippenhahn_companion_stellar_typ:[0,11],mint_kippenhahn_stellar_typ:[0,11],mint_maximum_nshel:0,mint_maximum_shell_mass:[0,11],mint_metal:[0,11],mint_minimum_nshel:0,mint_minimum_shell_mass:[0,11],mint_ms_rejuven:[0,11],mint_nshel:0,mint_nuclear_burn:[0,11],mint_remesh:[0,11],mint_use_zams_profil:[0,11],mira:[0,11],misc:[9,11],miscellan:[4,13],miss:[0,4,6,11],mix:[0,4,7,11],mixtur:[0,11],mmax:2,mmin:[2,7],mnra:21,model:[0,1,7,11,12,14,15],modif:3,modifi:[0,11,12],modul:[0,6,7,10,11,13,15],modulo:7,moe:[2,4,5,9,15],moe_di_stefano_2017:5,moe_di_stefano_2017_multiplicity_fract:2,moe_di_stefano_2017_pdf:2,moment:[0,11,12,15,19],momenta:[0,11,16],momentum:[0,11],mont:[0,7,11],monte_carlo_kick:[0,11],more:[0,1,3,4,5,7,9,11,12,13,14,15,16,17,19],most:[4,11],mostli:[4,6,7,15,16,18],move:[0,11],msun:[0,2,11,12,14],much:[0,4,11,15],multi:7,multipl:[0,2,4,7,11,15],multiplc:[0,11],multipli:[0,4,7,11],multiplicity_arrai:2,multiplicity_fraction_funct:7,multiplicity_model:7,multiplicity_modul:7,multiply_values_dict:[4,13],multiprocess:7,must:[0,2,11,14,15],my_stellar_data:[1,12,15],myr:[0,11,14],n100:[0,11],n100_z0:[0,11],n100h:[0,11],n100l:[0,11],n10:[0,11],n150:[0,11],n1600:[0,11],n1600c:[0,11],n200:[0,11],n20:[0,11],n300c:[0,11],n40:[0,11],naked_helium_star_giant_branch:0,naked_helium_star_hertzsprung_gap:0,naked_main_sequence_helium_star:0,name:[1,4,5,6,11,13,15,18,20],natur:[0,11],nauenberg:[0,11],nearer:[0,11],nebula:[0,11],necessari:[4,5,15],need:[0,2,5,9,11,12,14,15,17],neg:[0,4,11],neither:[0,5,11],neleman:[0,11],nelemans_gamma:[0,11],nelemans_max_frac_j_chang:[0,11],nelemans_minq:[0,11],nelemans_n_comenv:[0,11],nelemans_recalc_eccentr:[0,11],nemp:[0,11],nemp_cfe_minimum:[0,11],nemp_nfe_minimum:[0,11],nenamg:[0,11],neon:[0,11],nest:[4,5,15],network:[0,11,13],neutrn:[0,11],neutron:[0,11,15],neutron_star:0,never:[0,11],newer:[0,2,11],newli:[0,11],newopt:2,newton:[0,11],next:[4,15],nice:[1,5,16],nieuwenhuijzen:[0,11],nieuwenhuijzen_windfac:[0,11],nmax:2,no_thermohaline_mix:[0,11],noecho:[0,11],noechonow:[0,11],noel:[0,11],nolowq:7,nomin:[0,11],non:[0,7,11],nonconservative_angmom_gamma:[0,11],none:[0,1,2,4,5,6,7,11,15,21],nonetyp:15,nonzero:7,nor:[0,11],norm:7,normal:[0,4,11],normalis:[2,7],normalize_dict:2,normalize_multipl:7,notabl:15,note:[0,7,11],notebook:[9,11,12,13,14,15,17],notebook_api_funct:14,notebook_custom_log:[14,15],notebook_individual_system:[12,14,15],notebook_popul:14,noteworthi:3,noth:[5,7],notifi:18,nova:[0,11],nova_faml_multipli:[0,11],nova_irradiation_multipli:[0,11],nova_retention_algorithm_claeys2014:0,nova_retention_algorithm_const:0,nova_retention_algorithm_hillman2015:0,nova_retention_fract:[0,11],nova_retention_method:[0,11],nova_timestep_accelerator_index:[0,11],nova_timestep_accelerator_max:[0,11],nova_timestep_accelerator_num:[0,11],now:[0,2,4,11,12,14,15],nuclear:[0,11],nuclear_mass_hash:5,nuclear_mass_list:5,nucleosynthesi:[0,4,11],nucleosynthesis_sourc:[4,13],nucreacmult:[0,11],nucsyn:[9,11],nucsyn_angelou_lithium:[0,11],nucsyn_gce_outflow_check:[0,11],nucsyn_hbb:[0,11],nucsyn_metal:[0,11],nucsyn_network:[0,11],nucsyn_network_error:[0,11],nucsyn_s_process:[0,11],nucsyn_solv:[0,11],nucsyn_third_dredge_up:[0,11],nugi:[0,11],num_ansi_colour:0,number:[0,2,4,5,7,9,11,15,17],numer:4,numpi:[4,9,14,17,19],obj:4,object:[0,3,4,5,7,8,11,16],object_hook:4,object_pairs_hook:4,object_parse_funct:14,obtain:0,obvious:12,occur:[0,11,21],off:[0,11,15],off_m:14,offset:[0,11],ohio:[0,11],old:7,old_solut:[9,17],omega:[0,11],onc:[0,11],one:[0,4,5,7,11,13,15,16],onewd:0,onli:[0,4,5,7,11,12,15,21],onset:[0,11],onto:[0,2,11],opac:[0,11],opacity_algorithm:[0,11],opacity_algorithm_ferguson_op:0,opacity_algorithm_paczynski:0,opacity_algorithm_star:0,opal:[0,11],open:[14,15],opm:2,opt:[2,4,11],option:[0,1,2,4,5,9,10,11,15,17,21],orb:[5,15],orbit:[0,2,11,16,21],orbit_evolut:16,orbital_inclin:[0,11],orbital_inclinationi:[0,11],orbital_period:[0,11,12,14,15,21],orbital_period_quadrupl:[0,11],orbital_period_tripl:[0,11],orbital_phas:[0,11],orbital_phase_quadrupl:[0,11],orbital_phase_tripl:[0,11],orbiting_object:[0,11],orbiting_objects_close_pc_threshold:[0,11],orbiting_objects_log:[0,11],orbiting_objects_tides_multipli:[0,11],orbiting_objects_wind_accretion_multipli:[0,11],order:[3,4,5,15],ordereddict:4,org:[0,2,11],origin:[9,17],other:[0,1,2,4,6,7,9,11,13,14,15,16,17],otherwis:[0,5,6,7,11],out:[4,6,7,12,13],outcom:[0,11],outer:[0,11],outfil:[5,15],outfile_nam:1,outfilenam:15,output:[1,3,4,5,7,9,11,12,13,14,16,17,18,21],output_dict:14,output_dir:[5,14,15],output_fil:[4,6,14],output_filenam:[5,15],output_lin:4,outsid:[0,2,11],outward:[0,11],over:[4,5,13,14,15],overflow:[0,11],overlap:4,overrid:2,overriden:15,overshoot:[0,11],overspin_algorithm:[0,11],overspin_bs:[0,11],overspin_massloss:[0,11],overview:11,own:[5,7,9,12,14,15,17],oxygen:[0,11],oxygen_neon_white_dwarf:0,packag:[4,9,11,15,17,19],paczynski:[0,11],page:[0,9,11,15,17],pair:[0,4,11],panda:[4,9,14,16,17],pane:16,panel:[0,11],paper:[0,11],param_nam:4,paramet:[1,2,3,4,5,6,7,9,11,12,14,15,16,18,19,21],parameter_nam:[4,5,11,13,15],parameter_value_input_typ:[4,13],pars:[3,4,5,14,15,16,18],parse_binary_c_version_info:4,parse_cmdlin:5,parse_const:4,parse_float:4,parse_funct:[5,7,14,15,18],parse_function_hr_diagram:16,parse_function_mass:16,parse_function_orbit:16,parse_int:4,parsec:2,part:[2,5,11,14,15,21],partial:[0,11],particularli:[0,11],pasp:2,pass:[5,7,9,11,12,14,15,16,17,18],path:[4,7,9,14,15,17],patho:[9,17],pdf:[0,2,9,11,17],pend:[0,11],per:[0,4,5,7,11,14,15,21],percentag:[0,11],peret:[0,11],perform:[0,11],perhap:[0,11],periastron:[0,11],pericent:21,period:[0,2,11,12,14,15,16,21],period_str:2,perl:[1,15],persist:11,persistent_data:11,pgo:[0,11],phase:[0,11],phasevol:[0,11,15],phdi:[0,11],photoevapor:[0,11],php:2,physic:15,pick:16,piec:[5,15],pinnsonneault:[0,11],pisn:[0,11],pkg:[9,17],place:[0,11],placehold:16,plai:[0,11],plan:7,planetari:[0,11],plaw2:7,pleas:[0,4,11,15],plot:[0,11,14,16],plot_funct:[9,10],plot_hr_diagram:16,plot_hr_diagram_singl:16,plot_mass:16,plot_orbit:16,plot_system:16,plot_typ:16,pls:5,plu:[0,11],pms:16,pms_mass_1:16,pms_mass_2:16,pn_comenv_transition_tim:[0,11],pn_fast_wind:[0,11],pn_fast_wind_dm_agb:[0,11],pn_fast_wind_dm_gb:[0,11],pn_fast_wind_mdot_agb:[0,11],pn_fast_wind_mdot_gb:[0,11],pn_hall_fading_time_algorithm:[0,11],pn_hall_fading_time_algorithm_maximum:[0,11],pn_hall_fading_time_algorithm_minimum:[0,11],pn_resolv:[0,11],pn_resolve_maximum_envelope_mass:[0,11],pn_resolve_minimum_effective_temperatur:[0,11],pn_resolve_minimum_luminos:[0,11],pne:[0,11],pogg:[0,11],point:[0,2,4,5,9,11,17],poisson:[2,7],pol:[0,11],polytrop:[0,11],pop:12,pop_macro:12,popul:[0,2,3,5,6,8,9,11,17,19],population_id:7,population_nam:15,population_set:5,posit:[0,2,11],possibl:[0,1,2,4,6,9,11,14,17],post:[0,11,12],post_ce_adaptive_menv:[0,11],post_ce_envelope_dm_eagb:[0,11],post_ce_envelope_dm_gb:[0,11],post_ce_envelope_dm_tpagb:[0,11],post_ce_objects_have_envelop:[0,11],post_sn_orbit_bs:0,post_sn_orbit_method:[0,11],post_sn_orbit_tt98:0,postagb_legacy_log:[0,11],postagb_wind_gi:0,postagb_wind_krticka2020:0,postagb_wind_non:0,postagb_wind_use_gi:0,postagbwind:0,potenti:[0,11],power:[0,2,11],powerlaw:2,powerlaw_const:2,powerlaw_extrapolation_q:2,ppisn:[0,11],ppisn_farmer19:0,ppisn_non:0,ppisn_prescript:[0,11],ppn_envelope_mass:[0,11],pragma:12,pre:[0,11,16],pre_events_stardata:[0,11,12],pre_main_sequ:[0,11],pre_main_sequence_fit_lob:[0,11],precis:4,precod:[5,15],predefin:[2,15],predict:7,predictor:[0,11],prefer:[0,5,11],prefix:[0,11],prepar:2,prepare_dict:2,prescrib:0,prescript:[0,11,15],prescrit:[0,11],present:[2,4,5,15],preserv:[0,11],preset:16,pressur:[0,11],prev_stellar_type_1:15,prev_stellar_type_2:15,prevent:[0,7,11],previou:4,previous:[14,15],previous_stardata:[1,12,14,15],primari:[1,2,5,15,21],pringl:0,print:[4,6,7,11,12,13,14,15],print_help:[4,13],print_info:6,print_option_descript:6,print_structur:4,printf:[1,12,14,15],prior:[0,11],privat:[5,6,9],prob_dict:2,probability_weighted_mass:7,probabl:[0,1,2,5,6,7,11,12,15,16],probdist:[5,15],problem:[0,11],process:[0,4,5,7,11,15],profil:[0,11],progenitor:[0,11,15],program:[9,17],project:[0,11],proper:[6,12],properli:[0,11],properti:[0,4,7,16],prot1:[0,11],prot2:[0,11],prot3:[0,11],prot4:[0,11],provid:[0,2,5,7,11,15,18],pseudorandom:[0,11],publicli:12,puls:[0,11,21],pulsat:[0,11],pump:[0,11],purpos:[7,15,16],push_macro:12,put:[1,4,5,7,15,16],py_rinterpol:[9,17],pyenv:[9,11,17],pysiz:4,pytest:[9,17],python3:[9,11,17],python:[4,11,12,15],q_high_extrapolation_method:7,q_interpol:2,q_low_extrapolation_method:7,qcrit_bh:[0,11],qcrit_bs:0,qcrit_cheb:[0,11],qcrit_chen_han_formula:0,qcrit_chen_han_t:0,qcrit_cowd:[0,11],qcrit_degenerate_bh:[0,11],qcrit_degenerate_cheb:[0,11],qcrit_degenerate_cowd:[0,11],qcrit_degenerate_eagb:[0,11],qcrit_degenerate_gb:[0,11],qcrit_degenerate_hegb:[0,11],qcrit_degenerate_hehg:[0,11],qcrit_degenerate_hem:[0,11],qcrit_degenerate_hewd:[0,11],qcrit_degenerate_hg:[0,11],qcrit_degenerate_lmm:[0,11],qcrit_degenerate_m:[0,11],qcrit_degenerate_n:[0,11],qcrit_degenerate_onewd:[0,11],qcrit_degenerate_tpagb:[0,11],qcrit_eagb:[0,11],qcrit_gb:[0,11],qcrit_gb_bs:0,qcrit_gb_chen_han_formula:0,qcrit_gb_chen_han_t:0,qcrit_gb_ge2015:0,qcrit_gb_hjellming_webbink:0,qcrit_gb_q_no_comenv:0,qcrit_gb_temmink2021:0,qcrit_gb_vos2018:0,qcrit_ge2015:0,qcrit_hegb:[0,11],qcrit_hehg:[0,11],qcrit_hem:[0,11],qcrit_hewd:[0,11],qcrit_hg:[0,11],qcrit_hjellming_webbink:0,qcrit_lmm:[0,11],qcrit_m:[0,11],qcrit_n:[0,11],qcrit_onewd:[0,11],qcrit_q_no_comenv:0,qcrit_temmink2021:0,qcrit_tpagb:[0,11],qcrit_vos2018:0,qcrits_:[0,11],qcrits_degenerate_:[0,11],qdata:2,qlimit:2,quad:7,quadrat:[0,11],quadrulpl:[0,11],quadrupl:[0,2,7,11],quantiti:16,queri:14,queue:7,quickli:14,quit:[0,4,11],r_l:21,radau:0,radi:[0,11],radiat:[0,11],radii:[0,11,21],radiu:[0,1,11,12,15,16,21],radius_1:16,radius_2:16,ragb:21,raghavan2010_binary_fract:2,raghavan:2,rai:[0,11],railton:[0,11],rais:[0,4,7,11,15],ram:[0,11],ran:7,random:[0,7,11],random_count:14,random_se:[0,11,14],random_skip:[0,11],random_system:[0,11],random_systems_se:[0,11],rang:[0,2,5,7,11,14,15,19],rapid:0,rapidli:[0,11],rappaport:[0,11],rate:[0,2,11],rather:[0,4,5,7,9,11,12,14,15,17],ratio:[0,2,11,15,21],raw:[4,5,7,11,16,18],raw_output:4,reach:[0,11],reaction:[0,11],read:[3,4,14,15],real:[5,15],realli:[0,5,6,7,11,15],reason:[0,11],rebuild:[0,9,11,17],rebuilt:[9,17],recalcul:[0,11],receiv:4,recogn:15,recombin:[0,11],recommend:[1,3,5],recompil:[9,15,17],recurs:[4,5],recursive_change_key_to_float:4,recursive_change_key_to_str:4,red:[0,11],redhat:1,redshift:2,reduc:[0,11],reduct:7,regardless:16,region:[0,11],regist:15,reignit:[0,11],reimer:[0,11],reinstal:[9,17],reject:[0,11],rejects_in_log:[0,11],rejuven:[0,11],rel:[0,11],relat:[0,11],releas:[4,9,17],reliabl:11,remain:[0,11],remesh:[0,11],remnant:[0,11],remov:[0,4,5,11,14,15],remove_fil:4,renormalis:2,rentrop:[0,11],repeat:[0,7,11],repo:[9,17],report:[0,11,15],repositori:3,repres:7,represent:[4,5,15],reproduc:[0,11],requir:[0,2,4,11,14,15,16,18],reset:[0,11],reset_pref:[0,11],reset_star:[0,11],reset_stars_default:[0,11],resolut:[0,5,7,11,15],resolv:[0,11],reson:[0,11],respect:[0,2,11],rest:[2,5,15],restructuredtext:4,result:[0,1,2,4,5,7,9,11,14,15,17],result_arrai:2,result_dict:2,retain:[0,11],rethink:4,return_all_info:5,return_arglin:11,return_binary_c_default:5,return_binary_c_version_info:[4,5,13],return_compilation_dict:1,return_help:11,return_help_al:[4,11],return_maximum_mass_ratio_for_rlof:[11,21],return_minimum_orbit_for_rlof:[11,21],return_persistent_data_memaddr:11,return_population_set:5,return_store_memaddr:11,return_version_info:[4,11],revap_in:[0,11],revap_out:[0,11],revers:[0,11,16],reverse_tim:[0,11],revis:[0,4],rewrit:5,rhagavan:7,ri0005:15,rich:[0,11],riello:[0,11],rin:[0,11],ring:[0,11],risk:[5,15],ritter:[0,11],rk2:[0,11],rk4:[0,11],rlof:[0,11,21],rlof_angular_momentum_transfer_model:[0,11],rlof_angular_momentum_transfer_model_bs:0,rlof_angular_momentum_transfer_model_conserv:0,rlof_eccentric_as_circular:[0,11],rlof_entry_threshold:[0,11],rlof_f:[0,11],rlof_interpolation_binary_c:0,rlof_interpolation_bs:0,rlof_interpolation_method:[0,11],rlof_mdot_factor:[0,11],rlof_mdot_modul:[0,11],rlof_method:[0,11],rlof_method_adapt:0,rlof_method_adaptive2:0,rlof_method_bs:0,rlof_method_claei:0,rlof_method_ritt:0,rlof_nonconservative_gamma_donor:0,rlof_nonconservative_gamma_isotrop:0,rlof_radiation_correct:[0,11],rlof_transition_objects_escap:[0,11],rob:[0,2,11,21],robert:[9,17],roch:[0,11,21],roche_lob:21,rochelob:21,rol1:14,rol2:14,room:[5,15],root:[9,17],rotat:[0,2,11],rotation:[0,11],rotationally_enhanced_expon:[0,11],rotationally_enhanced_mass_loss:[0,11],rotationally_enhanced_massloss:[0,11],rotationally_enhanced_massloss_angmom:0,rotationally_enhanced_massloss_langer_formula:[0,11],rotationally_enhanced_massloss_langer_formula_and_angmom:0,rotationally_enhanced_massloss_non:0,rout:[0,11],routin:[0,3,5,9,11,16],row:[14,16],rring:[0,11],rssd:2,rst:[4,6],rsun:16,rubric:5,run:[0,1,3,4,5,7,9,11,17,18],run_popul:11,run_system:[11,12,13,14,16,18],run_system_wrapp:[9,10,12,14],run_wrapp:3,run_zero_probability_system:7,runtim:[1,7],russel:[0,11],rzam:21,s_option:7,safe:15,sai:[0,11],said:[0,11],same:[0,4,7,9,11,14,17],sampl:[0,2,5,11,15,19],sample_valu:2,sampler:9,sana12:[2,15],sana:2,save:[0,1,2,11,12,15],save_pre_events_stardata:[0,11],scalo:2,scanf:0,scheme:[0,11],schneider:[0,11],schroeder:[0,11],script:[3,9,12,17],sdb:[0,11],sdist:[9,17],sdo:[0,11],search:9,second:[0,2,4,11,16],secondari:[2,21],section:[2,4,8,9,11,15,17],see:[0,5,9,11,12,13,14,15,16,17],seed:[0,11],seem:[9,16,17],seen:4,segment:19,seitenzahl2013_model:[0,11],seitenzahl:[0,11],select:[0,4,11,14],selected_head:4,selector:[0,11],self:[5,7,14,15],semi:[0,11],sent:[0,11],sentenc:1,sep:[2,5,14,15,21],sep_max:15,sep_min:15,separ:[0,2,4,5,6,11,12,14,15,16,21],separation_quadrupl:[0,11],separation_tripl:[0,11],separta:[0,11],seper:15,sequenc:[0,11,12],seri:[0,11],serialis:[4,5],serv:4,server:5,set:[0,1,2,3,4,5,6,7,9,12,13,14,16,17],set_moe_di_stefano_set:5,set_opt:2,setup:[9,15,17,18],sever:[6,7,13,15,16,18],sfh:2,shara:[0,11],share:[1,7,14,18],shared_lib_filenam:12,shell:[0,11],shellular:0,shorten:[0,11],should:[0,1,2,5,6,7,9,11,14,15,16,17,18],shouldn:[0,4,11],show:[0,3,7,11,14,15,16],show_plot:16,show_stellar_typ:16,shown:[0,11,16],shrinkagb:14,side:15,siess:[0,11],sigma:2,silent:4,sill:[0,11],simplest:14,simpli:[0,11],simul:[0,1,11,12,15],simulation_:5,sinc:[4,16],singl:[0,2,3,5,7,11,15,16],single_star_lifetim:[11,12,14],sit:[0,11],site:11,situat:11,size:[4,7],skip:[0,4,7,9,11,17],skipkei:4,slightli:11,slope:2,slow:[0,11],slower:[0,11],slurm:[5,7,8],slurm_grid:5,small:[0,11],small_envelope_method:[0,11],small_envelope_method_bs:0,small_envelope_method_miller_bertolami:0,smaller:[0,11],sn_impulse_liu2015:0,sn_impulse_non:0,sn_impulse_wheeler1975:0,sn_kick_companion_a:[0,11],sn_kick_companion_aic_bh:[0,11],sn_kick_companion_bh_bh:[0,11],sn_kick_companion_bh_n:[0,11],sn_kick_companion_ecap:[0,11],sn_kick_companion_grb_collapsar:[0,11],sn_kick_companion_hestaria:[0,11],sn_kick_companion_ia_chand:[0,11],sn_kick_companion_ia_chand_co:[0,11],sn_kick_companion_ia_eld:[0,11],sn_kick_companion_ia_h:[0,11],sn_kick_companion_ia_he_co:[0,11],sn_kick_companion_ia_hybrid_hecowd:[0,11],sn_kick_companion_ia_hybrid_hecowd_sublumin:[0,11],sn_kick_companion_ibc:[0,11],sn_kick_companion_ii:[0,11],sn_kick_companion_iia:[0,11],sn_kick_companion_ns_n:[0,11],sn_kick_companion_phdi:[0,11],sn_kick_companion_pisn:[0,11],sn_kick_companion_ppisn:[0,11],sn_kick_companion_tz:[0,11],sn_kick_companion_wdkick:[0,11],sn_kick_dispersion_aic_bh:[0,11],sn_kick_dispersion_bh_bh:[0,11],sn_kick_dispersion_bh_n:[0,11],sn_kick_dispersion_ecap:[0,11],sn_kick_dispersion_grb_collapsar:[0,11],sn_kick_dispersion_ia_hybrid_hecowd:[0,11],sn_kick_dispersion_ia_hybrid_hecowd_sublumin:[0,11],sn_kick_dispersion_ibc:[0,11],sn_kick_dispersion_ii:[0,11],sn_kick_dispersion_ns_n:[0,11],sn_kick_dispersion_phdi:[0,11],sn_kick_dispersion_pisn:[0,11],sn_kick_dispersion_ppisn:[0,11],sn_kick_dispersion_tz:[0,11],sn_kick_distribution_aic_bh:[0,11],sn_kick_distribution_bh_bh:[0,11],sn_kick_distribution_bh_n:[0,11],sn_kick_distribution_ecap:[0,11],sn_kick_distribution_grb_collapsar:[0,11],sn_kick_distribution_ia_hybrid_hecowd:[0,11],sn_kick_distribution_ia_hybrid_hecowd_sublumin:[0,11],sn_kick_distribution_ibc:[0,11],sn_kick_distribution_ii:[0,11],sn_kick_distribution_ns_n:[0,11],sn_kick_distribution_phdi:[0,11],sn_kick_distribution_pisn:[0,11],sn_kick_distribution_ppisn:[0,11],sn_kick_distribution_tz:[0,11],sn_none:12,sn_type:12,sneia:[0,11],snia:[0,11],snippet:[11,14],solar:[0,2,11,13,21],solver:[0,11],solver_forward_eul:0,solver_predictor_corrector:0,solver_rk2:0,solver_rk4:0,some:[0,1,2,5,7,9,11,12,13,14,15,16,17],someth:[0,5,11,14],sometim:13,somewhat:15,soon:19,sort:4,sort_kei:4,sourc:[1,2,4,5,6,7,10,16,18,19,21],source_file_filenam:7,source_list:5,sourcecod:[9,11,12,17],sourcefile_nam:1,space:[0,5,11,15,19],spacing_funct:[9,10],spacingfunc:[5,15],spacingfunct:[5,15],special:[0,11,15],specif:[0,4,11,13,14,16],specifi:[0,7,11],spectral:2,speed:[0,7,11],speedtest:[0,11],spent:4,spera:0,spheric:[0,11],spin:[0,11],spinrat:[0,11],split:[0,7,11,14,15],split_lin:14,splitlin:[11,12,14,15],splitpoint:[0,11],spread:5,sqrt:[0,11],src:[0,9,11,12,17],stabil:[0,11],stabl:[0,11],stancliff:[0,11],standard:[0,2,11],star:[1,2,7,9,11,12,13,14,15,16,21],star_with_no_mass:0,starcount:15,stardata:[0,1,11,12,14,15],stardata_dump_filenam:[0,11],stardata_load_filenam:[0,11],stardata_t:12,start:[0,1,4,5,6,7,11,14,15],start_tim:[0,11],start_timestamp:15,startrack:0,startswith:14,state:[0,11],statement:[1,12,14,15],statist:[0,11],statu:[0,1,11,15],stderr:[0,11],stdout:4,steadi:[0,11],stefan:16,stefano:[4,5,9,15],stellar:[0,2,7,11,16,20],stellar_structure_algorithm:[0,11],stellar_structure_algorithm_external_funct:0,stellar_structure_algorithm_mint:0,stellar_structure_algorithm_modified_bs:0,stellar_structure_algorithm_non:0,stellar_typ:[1,9,10,12,14,15,16],stellar_type_1:[0,11,15,16],stellar_type_2:[0,11,15,16],stellar_type_3:[0,11],stellar_type_4:[0,11],stellar_type_dict:20,stellar_type_dict_short:20,step:[4,5,12,14,15,16,19],stepsiz:[5,15],stick:7,stiff:[0,11],still:[1,7,12],stop:[0,4,11],stopfil:[0,11],storag:[0,11],store:[0,2,3,4,5,7,9,14,15,17,21],store_capsul:11,store_memaddr:[11,21],str:[1,4,5,6,15,16],straight:5,straightforward:15,straniero:[0,11],strength:[0,11],strict:4,string:[0,1,3,4,5,6,7,11,13,14,15,16,18],strip:[0,11,14],stronger:[0,11],struct:[0,11,12],structur:[0,4,7,11,16],stuff:[4,7,14,15,16],style:[0,11],sub:[0,4,11],subdict:4,subject:[0,11],sublumin:[0,11],submit:9,subroutin:8,subsequ:[0,11],subtract:4,subtract_dict:4,succe:[0,11],suggest:[0,9,11,17],suit:[9,17],sum:[0,11],sundial:[0,11],supercrit:[0,11],supernova:[0,7,11],superwind:[0,11],superwind_mira_switchon:[0,11],sure:[2,5,7,9,14,15,16,17,18],surfac:[0,11],surrei:15,surviv:[0,11],survivor:[0,11],switcher:[0,11],symmetr:[0,11],synchron:[0,11],synonym:[0,11],synthesi:[7,9,15,17],system:[0,3,4,5,7,9,11,12,15,16,17,18],system_gener:[5,15],tabl:[0,2,11],take:[0,2,4,5,7,11,15,18],taken:[0,4,11,12],tar:[9,17],target:[1,6],task:[0,2,4,5,6,8,11,15,16,18,19,21],tauri:[0,11],tbse:[0,11],technic:[12,15],teff:[0,2,11],teff_1:16,teff_2:16,teff_postagb_max:0,teff_postagb_min:0,tell:4,temp_dir:[4,14,15],temperatur:[0,2,11,16],termin:[1,9,12,15,17],test:[0,4,5,7,9,11,14,15,17,21],test_data:0,test_func:11,test_logfil:14,test_pop:15,text:[4,6],than:[0,2,4,7,9,11,15,17],thats:15,thei:[0,2,4,5,7,11,15,16],thelog:[0,11],them:[2,4,5,11,15],themselv:[2,4],thermal:[0,2,11,21],thermally_pulsing_asymptotic_giant_branch:0,thermohalin:[0,11],thesi:[0,11],thi:[0,1,2,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19,21],thick:[0,11],thick_disc_end_ag:[0,11],thick_disc_logg_max:[0,11],thick_disc_logg_min:[0,11],thick_disc_start_ag:[0,11],thin:[0,11],thing:[0,2,4,5,6,11,15,18],think:[0,4,5,11],third:[0,2,11],third_dup:[0,11],third_dup_multipli:[0,11],thorn:[0,11],those:[4,5,9,15,17],thread:7,thread_id:7,three:[0,2,11,15],three_part_powerlaw:[2,15],threshold:[0,4,7,11],through:[5,11,14,15,16,18],throughout:[5,15],tidal:[0,11],tidal_strength_factor:[0,11],tide:[0,11],tides_convective_damp:[0,11],tides_hurley2002:[0,11],tides_zahn1989:[0,11],time:[0,1,2,4,5,7,9,11,12,14,15,16,17],timescal:[0,11],timestamp:7,timestep:[0,11,12,14],timestep_limit:[0,11],timestep_log:[0,11],timestep_modul:[0,11],timestep_multipli:[0,11],timestep_solver_factor:[0,11],tinslei:2,titl:6,tmp:[0,4,9,11,14,15,17],tmp_dir:[5,7,14,15],tmp_tabl:2,todo:[0,1,2,4,5,6,7,11,13,15,16,18,19,21],toler:[0,11],too:[0,4,7,9,11,17,18],took:15,top:15,topic:[0,11],torqu:[0,11],total:[0,2,4,5,7,11,15,16],total_count:15,total_mass_run:15,total_prob:15,total_probability_weighted_mass_run:15,tout:[0,11,21],tout_pringle_1992_multipli:0,tpagb:[0,11],tpagb_reimers_eta:[0,11],tpagb_wind_beasor_etal_2020:0,tpagb_wind_bloeck:0,tpagb_wind_goldman_etal_2017:0,tpagb_wind_mattsson:0,tpagb_wind_reim:0,tpagb_wind_rob_cwind:0,tpagb_wind_van_loon:0,tpagb_wind_vw93_karaka:0,tpagb_wind_vw93_karakas_carbon_star:0,tpagb_wind_vw93_orig:0,tpagb_wind_vw93_orig_carbon_star:0,tpagbwind:[0,11],tpagbwindfac:[0,11],traceback:4,track:[7,16],trade:[0,11],transfer:[0,11],transform:[0,4,11],transit:[0,11],treat:[0,11],trigger:[0,11],trio:15,tripl:[0,2,7,11],truli:[0,11],tupl:1,turn:[0,4,11,14,15],two:[0,4,11,12,20,21],txt:[5,14,15,18],type:[0,1,2,4,5,6,7,11,14,15,16,19,20,21],type_chng:14,type_ia_mch_supernova_algorithm:[0,11],type_ia_sub_mch_supernova_algorithm:[0,11],typic:[0,11],ubvri:[0,11],ugriv:[0,11],unavail:0,uncom:[5,14,15],undef:12,under:[14,19],undergo:[0,11],understand:5,undescrib:6,uniform:2,union:[2,4,5,15,19,21],uniqu:[4,5,7,15],unit:[0,11,13,21],univari:[0,11],unknown:18,unless:[1,5,7],unload:5,unpars:11,unrecogn:[9,17],unsign:0,unstabl:[0,11],until:[0,2,4,11],unus:[0,7,11],unweight:15,updat:[2,4,5,9,15,17],update_dict:[4,13],upper:[0,2,11,19],usag:[0,3],use:[0,2,4,5,7,8,9,11,12,13,14,15,16,17,18],use_astropy_valu:16,use_datadir:[5,15],use_fixed_timestep_:[0,11],use_periastron_roche_radiu:[0,11],use_tabular_intershell_abundances_karakas_2012:[0,11],used:[0,1,2,4,5,7,11,12,13,14,15,16],useful:[0,4,5,7,9,11,13,14,15,17,18,21],useful_func:[9,10],user:[1,2,4,5,6,7,12,18],uses:[0,7,11,12,15],using:[0,1,5,9,12,13,14,17],usual:[0,2,7,11,15],util:[1,2,4,5,6,11,12,13,14,15,16,18,19,21],val:2,valid:[0,2,4,11,12],valu:[0,1,2,4,5,6,7,11,13,14,15,16],value_lin:14,valueerror:15,valuerang:[5,15],values_arrai:14,van:[0,11],vandenheuvel_log:[0,11],vari:[0,11,15],variabl:[0,3,4,5,7,11],variant:[0,11],variou:[0,11],vassiliadi:[0,11],veloc:[0,2,11],verbos:[1,2,4,7,9,14,15,17],verbose_print:4,veri:[0,5,11,12,14,15,19],versa:21,version:[0,4,5,9,11,13,15,17],version_info:4,version_info_dict:13,version_info_str:4,version_onli:[0,11],via:[3,5,7,11,12,15,16],vice:21,vink:[0,11],virtual:[9,17],virtualenviron:[9,17],viscos:[0,11],viscou:[0,11],visibl:12,visit:9,volum:[0,11],vrot1:[0,11],vrot2:[0,11],vrot3:[0,11],vrot4:[0,11],vrot_breakup:0,vrot_bs:0,vrot_non_rot:0,vrot_sync:0,vw93:[0,11],vw93_eagb_wind_spe:[0,11],vw93_mira_shift:[0,11],vw93_multipli:[0,11],vw93_tpagb_wind_spe:[0,11],vwind:[0,11],vwind_beta:[0,11],vwind_multipli:[0,11],wai:[0,4,5,7,11,14,16],wang:[0,11],want:[0,2,4,5,6,7,11,12,13,15,16],warmup_cpu:[0,11],warn:[0,11,14,15],wave:[0,11,15],wd_accretion_rate_new_giant_envelope_lower_limit_helium_donor:[0,11],wd_accretion_rate_new_giant_envelope_lower_limit_hydrogen_donor:[0,11],wd_accretion_rate_new_giant_envelope_lower_limit_other_donor:[0,11],wd_accretion_rate_novae_upper_limit_helium_donor:[0,11],wd_accretion_rate_novae_upper_limit_hydrogen_donor:[0,11],wd_accretion_rate_novae_upper_limit_other_donor:[0,11],wd_kick:[0,11],wd_kick_at_every_puls:0,wd_kick_at_given_puls:0,wd_kick_direct:[0,11],wd_kick_end_agb:0,wd_kick_first_rlof:0,wd_kick_pulse_numb:[0,11],wd_kick_when:[0,11],wd_sigma:[0,11],wdwd_merger_algorithm:[0,11],wdwd_merger_algorithm_bs:0,wdwd_merger_algorithm_chen2016:0,wdwd_merger_algorithm_perets2019:0,weight:[0,7,11],well:[0,4,7,9,11,12,14,17],were:[4,15],what:[0,1,2,4,5,6,7,9,11,12,14,15,17,18],whatev:[0,5,9,12,17],wheeler:[0,11],when:[0,1,2,4,5,6,7,9,11,13,14,15,17,18],whenev:[9,17],where:[0,1,2,4,5,6,7,9,11,15,17],whether:[0,2,4,5,6,7,11,13,15,16,21],which:[0,1,2,4,5,6,7,9,11,12,13,14,15,17,18,21],whichev:7,white:[0,11],white_dwarf_cooling_carrasco2014:[0,11],white_dwarf_cooling_mestel:[0,11],white_dwarf_cooling_mestel_modifi:[0,11],white_dwarf_cooling_model:[0,11],white_dwarf_radius_carrasco2014:[0,11],white_dwarf_radius_model:[0,11],white_dwarf_radius_mu:[0,11],white_dwarf_radius_nauenberg1972:[0,11],whole:[5,7,12],width:[0,11],wind:[0,11],wind_algorithm_binary_c_2020:0,wind_algorithm_hurley2002:0,wind_algorithm_non:0,wind_algorithm_schneider2018:0,wind_angmom_loss_bs:0,wind_angmom_loss_lw:0,wind_angmom_loss_lw_hybrid:0,wind_angmom_loss_spherically_symmetr:0,wind_angular_momentum_loss:[0,11],wind_disc_angmom_fract:[0,11],wind_disc_mass_fract:[0,11],wind_djorb_fac:[0,11],wind_gas_to_dust_ratio:[0,11],wind_lbv_luminosity_lower_limit:[0,11],wind_mass_loss:[0,11],wind_multiplier_:[0,11],wind_nieuwenhuijzen_luminosity_lower_limit:[0,11],wind_type_multiplier_:[0,11],within:[0,4,5,9,11,12,13,15,17],without:[2,5,7,12,14],won:[0,11,14],wood:[0,11],work:[0,4,9,11,12,14,16,17],would:[0,4,11,15,16],wouldn:[5,15],wr_wind:[0,11],wr_wind_bs:0,wr_wind_eldridg:0,wr_wind_fac:[0,11],wr_wind_maeder_meynet:0,wr_wind_nugis_lam:0,wrap:[1,12],wrapper:[4,11,12,14,21],write:[1,4,5,6,7,11,12,14,15,18],write_binary_c_calls_to_fil:[5,15],write_binary_c_parameter_descriptions_to_rst_fil:4,write_grid_options_to_rst_fil:6,write_logfil:11,written:[5,6,7,11,14,15,18],written_data:14,wrlof_mass_transf:[0,11],wrlof_method:[0,11],wrlof_non:0,wrlof_q_depend:0,wrlof_quadrat:0,wrong:[9,17],wrwindfac:[0,11],wtts2:[0,11],wtts_log:[0,11],www:[0,2,11],x86_64:11,year:[0,2,11],yet:[0,4,7,11,16],yield:[0,11],you:[0,1,4,5,6,7,9,11,12,14,15,16,17,21],young:[0,11],your:[7,9,12,14,17],yourself:[15,16],zahn:[0,11],zam:[0,2,11,18,21],zams_collis:21,zams_mass:15,zams_mass_1:15,zams_mass_2:15,zero:[0,1,7,11],zero_ag:[12,14,15],zero_prob_stars_skip:15,zone:[0,11],zoom:[0,11],zoomfac_multiplier_decreas:[0,11],zoomfac_multiplier_increas:[0,11],zsolar:2,zytkow:[0,11]},titles:["Binary_c parameters","custom_logging_functions module","distribution_functions module","Example notebooks","functions module","grid_class module","Grid options and descriptions","Population grid code options","hpc_functions module","Welcome to binary_c-python\u2019s documentation!","Binarycpython code","Using the API functionality of binarycpython","Using custom logging routines with binarycpython","Extra features and functionality of binarycpython","Running individual systems with binarycpython","Running populations with binarycpython","plot_functions module","Python module for binary_c","run_system_wrapper module","spacing_functions module","stellar_types module","useful_funcs module"],titleterms:{"function":[4,11,13,14,15],"public":7,Adding:15,Using:[11,12],about:13,after:[9,17],algorithm:0,api:[11,12,14],binari:0,binary_c:[0,9,11,13,17],binarycpython:[10,11,12,13,14,15],build:[9,13,17],code:[7,10],compact:12,custom:12,custom_logging_funct:1,descript:6,dictionari:13,directli:12,distribution_funct:2,document:[9,17],environ:[9,17],evolut:12,evolv:15,exampl:[3,9,11,12,13,15,17],extra:13,faq:[9,17],featur:13,free:11,from:[9,11,12,17],full:15,get:[11,13],grid:[6,7,15],grid_class:5,handl:15,help:13,hpc_function:8,indic:9,individu:14,inform:[11,13],input:0,instal:[9,17],instruct:[9,17],issu:[9,17],log:[12,15],mass:12,misc:0,modif:13,modul:[1,2,4,5,8,9,16,17,18,19,20,21],moe:7,note:[9,17],notebook:3,noteworthi:15,nucsyn:0,object:[12,14,15],option:[6,7],output:[0,15],paramet:[0,13],pars:13,pip:[9,17],plot_funct:16,popul:[7,12,14,15],privat:7,python:[9,17],requir:[9,17],routin:12,run:[12,14,15],run_system_wrapp:18,run_wrapp:14,sampler:7,script:15,section:0,set:[11,15],singl:14,sourc:[9,17],spacing_funct:19,star:0,stefano:7,stellar_typ:20,store:11,string:12,supernova:12,system:14,tabl:9,usag:[9,11,12,17],useful_func:21,using:11,variabl:[9,15,17],via:[9,14,17],welcom:9,when:12}}) \ No newline at end of file +Search.setIndex({docnames:["binary_c_parameters","custom_logging_functions","distribution_functions","example_notebooks","functions","grid","grid_options_defaults","grid_options_descriptions","hpc_functions","index","modules","notebook_api_functionality","notebook_custom_logging","notebook_extra_features","notebook_individual_systems","notebook_luminosity_function_binaries","notebook_luminosity_function_single","notebook_population","plot_functions","readme_link","run_system_wrapper","spacing_functions","stellar_types","useful_funcs"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,nbsphinx:3,sphinx:56},filenames:["binary_c_parameters.rst","custom_logging_functions.rst","distribution_functions.rst","example_notebooks.rst","functions.rst","grid.rst","grid_options_defaults.rst","grid_options_descriptions.rst","hpc_functions.rst","index.rst","modules.rst","notebook_api_functionality.ipynb","notebook_custom_logging.ipynb","notebook_extra_features.ipynb","notebook_individual_systems.ipynb","notebook_luminosity_function_binaries.ipynb","notebook_luminosity_function_single.ipynb","notebook_population.ipynb","plot_functions.rst","readme_link.rst","run_system_wrapper.rst","spacing_functions.rst","stellar_types.rst","useful_funcs.rst"],objects:{"binarycpython.utils":{custom_logging_functions:[1,0,0,"-"],distribution_functions:[2,0,0,"-"],functions:[4,0,0,"-"],grid:[5,0,0,"-"],grid_options_defaults:[6,0,0,"-"],hpc_functions:[8,0,0,"-"],plot_functions:[18,0,0,"-"],run_system_wrapper:[20,0,0,"-"],spacing_functions:[21,0,0,"-"],stellar_types:[22,0,0,"-"],useful_funcs:[23,0,0,"-"]},"binarycpython.utils.custom_logging_functions":{autogen_C_logging_code:[1,1,1,""],binary_c_log_code:[1,1,1,""],binary_c_write_log_code:[1,1,1,""],compile_shared_lib:[1,1,1,""],create_and_load_logging_function:[1,1,1,""],from_binary_c_config:[1,1,1,""],return_compilation_dict:[1,1,1,""]},"binarycpython.utils.distribution_functions":{"const":[2,1,1,""],Arenou2010_binary_fraction:[2,1,1,""],Izzard2012_period_distribution:[2,1,1,""],Kroupa2001:[2,1,1,""],Moe_di_Stefano_2017_multiplicity_fractions:[2,1,1,""],Moe_di_Stefano_2017_pdf:[2,1,1,""],build_q_table:[2,1,1,""],calc_P_integral:[2,1,1,""],calc_e_integral:[2,1,1,""],calc_total_probdens:[2,1,1,""],calculate_constants_three_part_powerlaw:[2,1,1,""],cosmic_SFH_madau_dickinson2014:[2,1,1,""],duquennoy1991:[2,1,1,""],fill_data:[2,1,1,""],flat:[2,1,1,""],flatsections:[2,1,1,""],gaussian:[2,1,1,""],gaussian_func:[2,1,1,""],gaussian_normalizing_const:[2,1,1,""],get_integration_constant_q:[2,1,1,""],get_max_multiplicity:[2,1,1,""],imf_chabrier2003:[2,1,1,""],imf_scalo1986:[2,1,1,""],imf_scalo1998:[2,1,1,""],imf_tinsley1980:[2,1,1,""],interpolate_in_mass_izzard2012:[2,1,1,""],ktg93:[2,1,1,""],linear_extrapolation_q:[2,1,1,""],merge_multiplicities:[2,1,1,""],normalize_dict:[2,1,1,""],number:[2,1,1,""],poisson:[2,1,1,""],powerlaw:[2,1,1,""],powerlaw_constant:[2,1,1,""],powerlaw_extrapolation_q:[2,1,1,""],prepare_dict:[2,1,1,""],raghavan2010_binary_fraction:[2,1,1,""],sana12:[2,1,1,""],set_opts:[2,1,1,""],three_part_powerlaw:[2,1,1,""]},"binarycpython.utils.functions":{AutoVivificationDict:[4,2,1,""],BinaryCEncoder:[4,2,1,""],Capturing:[4,2,1,""],bin_data:[4,1,1,""],binarycDecoder:[4,2,1,""],binaryc_json_serializer:[4,1,1,""],call_binary_c_config:[4,1,1,""],catchtime:[4,2,1,""],convert_bytes:[4,1,1,""],convfloat:[4,1,1,""],count_keys_recursive:[4,1,1,""],create_arg_string:[4,1,1,""],create_hdf5:[4,1,1,""],custom_sort_dict:[4,1,1,""],datalinedict:[4,1,1,""],example_parse_output:[4,1,1,""],extract_ensemble_json_from_string:[4,1,1,""],filter_arg_dict:[4,1,1,""],format_ensemble_results:[4,1,1,""],get_arg_keys:[4,1,1,""],get_defaults:[4,1,1,""],get_help:[4,1,1,""],get_help_all:[4,1,1,""],get_help_super:[4,1,1,""],get_moe_di_stefano_dataset:[4,1,1,""],get_size:[4,1,1,""],handle_ensemble_string_to_json:[4,1,1,""],imports:[4,1,1,""],inspect_dict:[4,1,1,""],is_capsule:[4,1,1,""],load_logfile:[4,1,1,""],make_build_text:[4,1,1,""],merge_dicts:[4,1,1,""],multiply_values_dict:[4,1,1,""],output_lines:[4,1,1,""],pad_output_distribution:[4,1,1,""],parse_binary_c_version_info:[4,1,1,""],recursive_change_key_to_float:[4,1,1,""],recursive_change_key_to_string:[4,1,1,""],remove_file:[4,1,1,""],return_binary_c_version_info:[4,1,1,""],subtract_dicts:[4,1,1,""],temp_dir:[4,1,1,""],update_dicts:[4,1,1,""],verbose_print:[4,1,1,""],write_binary_c_parameter_descriptions_to_rst_file:[4,1,1,""]},"binarycpython.utils.functions.BinaryCEncoder":{"default":[4,3,1,""]},"binarycpython.utils.functions.Capturing":{__enter__:[4,3,1,""],__exit__:[4,3,1,""]},"binarycpython.utils.functions.binarycDecoder":{decode:[4,3,1,""]},"binarycpython.utils.functions.catchtime":{__enter__:[4,3,1,""],__exit__:[4,3,1,""]},"binarycpython.utils.grid":{Population:[5,2,1,""]},"binarycpython.utils.grid.Population":{Moe_di_Stefano_2017:[5,3,1,""],add_grid_variable:[5,3,1,""],clean:[5,3,1,""],evolve:[5,3,1,""],evolve_single:[5,3,1,""],export_all_info:[5,3,1,""],parse_cmdline:[5,3,1,""],rename_grid_variable:[5,3,1,""],return_all_info:[5,3,1,""],return_binary_c_defaults:[5,3,1,""],return_binary_c_version_info:[5,3,1,""],return_population_settings:[5,3,1,""],set:[5,3,1,""],set_moe_di_stefano_settings:[5,3,1,""],update_grid_variable:[5,3,1,""],vb1print:[5,3,1,""],write_binary_c_calls_to_file:[5,3,1,""]},"binarycpython.utils.grid_options_defaults":{grid_options_description_checker:[6,1,1,""],grid_options_help:[6,1,1,""],print_option_descriptions:[6,1,1,""],write_grid_options_to_rst_file:[6,1,1,""]},"binarycpython.utils.plot_functions":{color_by_index:[18,1,1,""],dummy:[18,1,1,""],parse_function_hr_diagram:[18,1,1,""],parse_function_masses:[18,1,1,""],parse_function_orbit:[18,1,1,""],plot_HR_diagram:[18,1,1,""],plot_masses:[18,1,1,""],plot_orbit:[18,1,1,""],plot_system:[18,1,1,""]},"binarycpython.utils.run_system_wrapper":{run_system:[20,1,1,""]},"binarycpython.utils.spacing_functions":{"const":[21,1,1,""]},"binarycpython.utils.useful_funcs":{calc_period_from_sep:[23,1,1,""],calc_sep_from_period:[23,1,1,""],maximum_mass_ratio_for_RLOF:[23,1,1,""],minimum_period_for_RLOF:[23,1,1,""],minimum_separation_for_RLOF:[23,1,1,""],ragb:[23,1,1,""],roche_lobe:[23,1,1,""],rzams:[23,1,1,""],zams_collision:[23,1,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:method"},terms:{"000":14,"0000":14,"0000000000000002":16,"0000000000000004":16,"000000000000e":14,"0001":[11,23],"000122339":17,"000161974":17,"000214449":17,"000220016":17,"000283924":17,"000287968":17,"00036002859999999996":16,"000375908":17,"00039801020000000003":16,"000497691":17,"000498487":17,"00065893":17,"0007":2,"0007310379999999999":16,"0007493004":16,"000869303":16,"000872405":17,"001":[0,11],"00115504":17,"001171479":16,"0014346559999999999":16,"00152924":17,"00202467":17,"002380189":16,"00283037":16,"00321118":16,"0037453900000000004":16,"0045385":16,"004698855121516278":17,"00515685":16,"006221155214163634":17,"00632092":11,"008236638755149857":17,"00921541":16,"00e":15,"0104553":16,"010905083645619543":17,"012246630357e":17,"0141":11,"014776889999999999":16,"0164166":16,"01e":15,"0212294":16,"021960493499e":17,"024868380796643753":17,"024868380796643757":17,"025":16,"0268827":16,"02e":15,"030004499999999996":16,"030499912298e":17,"035000000000004":16,"0434":17,"044142002936e":12,"044402888438054094":17,"04440288843805411":17,"044572277695e":12,"044654032097e":12,"045084306856e":12,"04e":15,"050651207308e":12,"05128ef4c5fe4274a0356c3e99e2f2d2":17,"054":2,"057525":15,"05e":15,"077":15,"077117":15,"0771478":16,"07e":15,"080":15,"080367":15,"0820":[0,11],"084":15,"084369":15,"086":15,"08e":15,"08f8230453084e4ca6a2391d45ce658b":16,"08msun":[0,11],"0902":[0,11],"094409257247e":17,"0967":17,"09e":15,"0fa295ee5c76444bace8fd0ee17a3e11":15,"0mb":15,"0mb1656":15,"0x7f351ff53810":15,"0x7f351ff539f0":15,"0x7f531bc3b6a8":17,"0x7fa6a45ed180":11,"0x7fb4d41ebbf8":14,"100":[0,2,11,15,16],"1000":[0,7,11],"1003":15,"1015":15,"1025":15,"1033":15,"1040":15,"1048":15,"105":16,"1057":15,"1062":15,"1069":15,"1077":15,"108":17,"1085":[14,15],"1091":15,"1099":15,"10e":15,"10t15":15,"11003":14,"1114":15,"1126":15,"1134":15,"1139":15,"1148":15,"115":2,"1156":15,"11582":14,"1162":15,"1168":15,"117":15,"117391":15,"1177":15,"1181":15,"1187":15,"1194":15,"119437":15,"11973310000000001":16,"11e":15,"120000":[0,11],"1202":15,"1219":15,"1228":15,"12325":14,"1234":15,"123795595728e":17,"1243":15,"12457":14,"12460":14,"12461":14,"125":[0,11,16],"12500":0,"1251":15,"1260":15,"126435":15,"1268":15,"1276":15,"1282":15,"1289":15,"1295":15,"12e":[1,12,14,15,16,17],"1301":14,"1302":14,"1309":15,"1323":15,"1332":15,"1338":15,"134":17,"1346":15,"13461":14,"1355":15,"13567":12,"1359":15,"13626":17,"1366":15,"1376":15,"1383104324341":15,"138353":15,"1384":15,"139293101586e":17,"1393":15,"13e":15,"13e3":[0,11],"1403":2,"1423":15,"1435":15,"1443":15,"1445":15,"14461":14,"1448":15,"1454":15,"1455":15,"1459":15,"1465":15,"1474":15,"1482":15,"1485":15,"1487":15,"1496":15,"14e":15,"150":[15,16,17],"15000":[0,11,12,14,17],"1509":15,"1523":15,"1531":15,"1537":15,"1545":15,"1555":15,"1564":15,"1574":15,"15740832333567983":15,"1584":15,"1594":15,"15msun":2,"16018641159091498":15,"1607":15,"1617":14,"1618":[14,15],"1618606489196724":15,"1619":14,"1620":14,"1621":14,"1621c23a5":0,"1628":15,"1629459533":17,"1629459536":17,"1631124829":16,"1631124830":16,"1631283248":15,"1631284043":15,"1635":15,"1645":15,"1655":15,"1664":15,"1674":15,"1684":15,"1691":15,"1699":15,"16e":15,"17005450973840136":15,"17089":14,"1713":15,"1725":15,"1735":15,"1745":15,"175":15,"1755":15,"1763":15,"1767":15,"1776":15,"1785":15,"1793":15,"17e":15,"1801":15,"1812":15,"181971798545e":17,"1822":15,"1830":15,"1839":15,"1847":15,"1855":15,"1864":15,"186492":15,"1865":12,"1873":15,"1884":15,"189097":16,"1895":15,"18e":15,"190":0,"1907":15,"1916":15,"1926":15,"1936":15,"1943278312683":15,"1946":15,"1951":[0,11],"1956":15,"1958354":15,"1961345":16,"1966":15,"1972":[0,11],"1975":[0,11],"1976":15,"197x":[0,11],"1980":2,"1983":23,"1986":[0,2,11],"1987":15,"1989":[0,11],"1991":2,"1992":[0,11],"1993":[0,11],"1996":23,"1998":[0,2,11,15],"1999":[0,11],"1ckzg0p9":[9,19],"1dex":[15,16],"1e2":[0,11],"1e9":[0,11],"1mb":15,"200":[0,11],"2000":[0,11,15],"2001":[2,16],"2002":[0,11],"2003":[0,2,11],"2004":[0,11],"2005":[0,11],"2009":[0,11],"2010":[0,2,7,11],"2012":[0,2,11],"2013":[0,11],"2014":[0,2,11],"2015":[0,11],"2016":[0,11],"2017":[0,7,11,17],"2018":[0,1,11],"2019":[0,11],"2020":[0,11],"2021":[0,15],"20210910":0,"20e":15,"21587440567681548":17,"2181597":16,"2182216189410787":16,"21822161894107872":16,"219029061236e":17,"21e":15,"220964392276":15,"227002356107e":17,"227955577093495":17,"22e":15,"2369339999999996e":16,"23e":15,"2403e":17,"2424":14,"24e":15,"2544031669779":17,"255":[0,11],"2568974":16,"257":23,"2572":17,"257608426597089":17,"25msun":[0,11],"27143e":17,"27e":15,"281":23,"28134439269236855":17,"283331":15,"28e":15,"29427":17,"29448":17,"29457":17,"2947":17,"2969346":2,"29e":15,"2mb":15,"2msun":[0,11],"3000":[0,11],"303065":16,"30642":17,"30902":17,"30e":15,"30e4":[0,11],"3205":17,"3228":17,"33469":12,"33699":17,"338":12,"34213":12,"34708e":16,"34e":15,"35e":15,"367065500196e":17,"36e":15,"36m":11,"37e":15,"382":15,"38788e":17,"38e":15,"39205":17,"394728392218e":17,"396133472739e":17,"396288708628e":17,"396675941641e":17,"39754":17,"39999999999999997":16,"39e":15,"3mb":15,"3msun":2,"4000":0,"400722":15,"404641347602e":17,"40e":15,"41112":15,"41e":15,"424921":15,"427601421985e":17,"42e":15,"42msun":[0,11],"4309362899259503":17,"43422e":17,"435":15,"43719":17,"4397":17,"444217227690e":17,"44e":15,"44msun":[0,11],"4500":11,"45000000080":17,"4504":17,"450828476484e":17,"451192744924e":17,"4530":[12,14],"453317880232e":17,"45407":17,"45e":15,"45msun":[0,11],"4600214958191":15,"4621":17,"462779538274e":17,"46573":17,"46e":15,"474":15,"47745":17,"480":15,"4838":[11,12,14],"4976091384888":15,"499":15,"49e":15,"4e3":[0,11],"4mb":15,"500":[0,11],"505288":15,"507":15,"508":17,"50e":15,"517749":14,"518":14,"51803":12,"520":15,"52414":17,"52415":17,"5262682437896729":16,"5294":17,"52e":15,"531":15,"546683":14,"547":15,"548":15,"5483":17,"548740826516e":17,"549":15,"54e":15,"550":15,"551":15,"552":15,"554":15,"55458":12,"555":15,"557":15,"559":15,"55e":15,"560":15,"561":15,"562":15,"563":15,"564":15,"565":15,"566":15,"567":15,"568":15,"569":15,"571":15,"5717":17,"573":15,"57443":12,"575":15,"57571":17,"576":15,"577":15,"578":15,"579":15,"579099761269e":17,"57e":15,"581":15,"582":15,"583":15,"584":15,"585":15,"58519":17,"586":15,"587":15,"588":15,"589":15,"58e":15,"5900418758392334":16,"59452":12,"59e":15,"5dex":[15,16],"5mb":15,"5mb625":15,"5msun":[0,11],"6000":[0,11],"600000":0,"60007":17,"60e":15,"6185":0,"624":15,"625":0,"626":15,"62e":15,"635":[0,11],"63e":15,"6452116023479681":15,"6495098935846658":15,"6495098935846686":15,"64e":15,"653":17,"65e":15,"66003":17,"66e":15,"674063083432e":17,"67586e":17,"684":17,"68748":17,"68e":15,"6935975551605":15,"6944":0,"69e":15,"6e1":2,"6e5":[0,11],"6mb":15,"6msun":[0,11],"70e":15,"71025":17,"71196":17,"7128":17,"713":15,"716":14,"71662":12,"71e":15,"7203987":17,"724":12,"72498e":[12,17],"728":15,"73e":15,"743":15,"7561":17,"759":15,"75e":15,"7619":0,"763":2,"7647737053496777":17,"76e":15,"772169325356e":17,"77287":17,"774":15,"774854":15,"779197348711e":17,"7809":17,"78125":0,"783":14,"785212755203247":17,"787":15,"78e":15,"79091":17,"792":15,"792905807495117":17,"793":15,"794":15,"79487":17,"795":[2,15],"799":15,"79e":15,"7mb":15,"7mb1235":15,"800":15,"802986496151e":17,"80592":17,"80919":17,"80e":15,"80msol":2,"81066":17,"812":15,"81395":12,"81495":17,"81499":17,"81529":17,"81536":17,"81563":17,"81636":17,"817":14,"81957":17,"81e":15,"82061":17,"82074":17,"82088":17,"82123":17,"8216":17,"82255":17,"8293333":16,"830":15,"83f80d829dbd418aa2bc745c99b71991":16,"846":15,"847":15,"848380621869e":12,"84e":15,"851971":15,"85e":15,"864":15,"86e":15,"872":[15,17],"876":15,"8862":17,"887":15,"88e":15,"897337":15,"898":15,"89e":15,"8mb":15,"8mb1394":15,"905335716621e":17,"908":15,"90e":15,"919":15,"91e":15,"92de7c9221c54206ab4dd10e58e09a34":16,"92e":15,"934":15,"935186":17,"935920346899e":17,"93e":15,"9436":17,"9458":14,"947":15,"9539172649383545":17,"956":15,"95e":15,"963":15,"963621764679e":17,"969":15,"97008":17,"976":15,"979":15,"97923e":17,"97e":15,"981706":15,"986":15,"988":15,"99191":12,"99192":12,"99194":12,"9947":14,"995":15,"9956307907476224":16,"9961590766906738":16,"9983":14,"99e":15,"9mb":15,"boolean":[0,4,5,7,11,18,23],"break":[0,11],"case":[0,3,4,7,9,11,15,17],"catch":[4,7,14,15,16,17],"char":7,"class":[4,5],"const":[2,5,15,16,17,21],"default":[0,1,2,4,5,6,7,11,12,13,15,16,17,20],"export":[4,5,17],"final":[15,16],"float":[0,2,4,5,11,13,14,21,23],"function":[0,1,2,3,5,6,7,8,9,10,12,18,19,20,21,23],"import":[4,5,11,12,13,14,15,16,17],"int":[0,1,2,4,5,6,7,11,15,17,21,23],"krtickov\u00e1":[0,11],"kub\u00e1t":[0,11],"long":[0,4,5,7,11,17,22],"new":[0,2,4,5,11,14,15,16,17],"null":[0,4,11,13],"paczy\u0144ski":[0,11],"public":[6,9,15,16,17],"return":[1,2,4,5,6,7,11,13,14,15,16,17,18,20,21,23],"short":[0,11,15,16,22],"super":[0,11],"switch":[0,11],"throw":[9,19],"true":[0,4,5,6,7,11,13,16,17,18],"try":[0,9,11,14,15,16,17,19],"void":12,"while":[0,11,15],Added:17,Adding:[3,14],And:[6,9,19,23],But:14,Doing:[15,16,17],For:[0,4,9,11,12,14,15,16,18,19],Gas:[0,11],Its:7,NOT:[0,5,11,20],Not:7,One:[0,11],Pms:18,That:[0,11],The:[0,1,2,3,4,5,7,9,11,12,13,14,15,16,17,18,19,20],Then:[4,9,19],There:[2,5,6,7,11,12,13,14,15,16,17,18],These:[4,7,11,15,16,17,18],Use:[0,5,11,17],Used:[0,7,11,18],Useful:[0,6,11,15,16,17],Uses:[0,4,11,21],Using:[3,9,15],Was:[0,11],Will:[0,4,5,11,17,20],With:6,__arg_begin:11,__attribute__:12,__enter__:4,__exit__:4,__iadd__:4,_actually_evolve_system:7,_binary_c_bind:[4,11,12,14,23],_binary_c_config_execut:7,_binary_c_dir:7,_binary_c_execut:7,_binary_c_shared_librari:7,_commandline_input:7,_count:7,_custom_logging_shared_library_fil:7,_end_time_evolut:7,_errors_exceed:7,_errors_found:7,_evolution_type_opt:7,_failed_count:7,_failed_prob:7,_failed_systems_error_cod:7,_generate_grid_cod:7,_grid_vari:[5,7,16],_loaded_ms_data:7,_main_pid:7,_population_id:7,_pre_run_cleanup:5,_probtot:7,_process_run_population_grid:7,_repeat:7,_set:5,_set_ms_grid:7,_start_time_evolut:7,_store_memaddr:7,_system_gener:7,_total_mass_run:7,_total_probability_weighted_mass_run:7,_total_starcount:7,_zero_prob_stars_skip:7,a173:[0,11],abat:[0,11],abbrevi:22,abl:11,about:[3,4,5,6,15,16,17,23],abov:[0,2,4,5,11,12,14,16,17],abridg:[11,12],absolut:[0,4,11],abund:[0,11],acceler:[0,11],accept:[4,17],access:[2,7,12,14,15,16,17],accord:[0,2,11],accordingli:[14,16,17],account:[0,7,11],accret:[0,11],accretion_limit_dynamical_multipli:[0,11],accretion_limit_eddington_lmms_multipli:[0,11],accretion_limit_eddington_steady_multipli:[0,11],accretion_limit_eddington_wd_to_remnant_multipli:[0,11],accretion_limit_thermal_multipli:[0,11],accretor:[0,11,23],accur:[15,16],act:[0,7,11,16,17],activ:[0,9,11,19],actual:[0,4,5,7,9,11,12,14,15,16,17,18,19],adam:[0,11],adapt:[0,11,16],add:[0,2,4,5,7,11,12,14,15,16,17,18,21,23],add_grid_vari:[5,15,16,17],added:[4,14,15],adding:[14,15,16,17],address:[1,7,11,12,23],admittedli:18,adress:[11,12,23],advis:12,affect:[0,11],after:[0,5,7,11,12,15,16,17],ag89:[0,11],again:[4,7,9,13,14,19],against:18,agb:[0,11],agb_3dup_algorithm:[0,11],agb_core_algorithm:[0,11],agb_core_algorithm_default:0,agb_core_algorithm_hurlei:0,agb_core_algorithm_karaka:0,agb_luminosity_algorithm:[0,11],agb_luminosity_algorithm_default:0,agb_luminosity_algorithm_hurlei:0,agb_luminosity_algorithm_karaka:0,agb_radius_algorithm:[0,11],agb_radius_algorithm_default:0,agb_radius_algorithm_hurlei:0,agb_radius_algorithm_karaka:0,agb_third_dredge_up_algorithm_default:0,agb_third_dredge_up_algorithm_hurlei:0,agb_third_dredge_up_algorithm_karaka:0,agb_third_dredge_up_algorithm_stancliff:0,age:[0,3,9,11],aging:[0,11],albedo:[0,11],algorithm:[9,11],algothim:[0,11],all:[0,1,2,4,5,6,7,9,10,11,13,14,15,16,17,18,19,20],all_info:5,alloc:11,allow:[0,2,4,7,11,12],allow_nan:4,along:[0,6,7],alpha:[0,11],alpha_c:[0,11],alphacb:[0,11],alreadi:[5,17],also:[0,3,4,5,6,9,11,12,15,16,17,19,23],alter:5,altern:[0,7,11],alwai:[0,2,7,11],amanda:[0,11],amax:2,amin:2,amount:[0,4,5,6,7,11,17,21],amp:11,amt_cor:[7,15,16,17],analys:20,analyt:[5,15,16,17],analyz:14,andrew:[9,19],andronov:[0,11],angelou_lithium_cheb_decay_tim:[0,11],angelou_lithium_cheb_massfrac:[0,11],angelou_lithium_cheb_tim:[0,11],angelou_lithium_decay_funct:[0,11],angelou_lithium_decay_function_exponenti:0,angelou_lithium_decay_tim:[0,11],angelou_lithium_eagb_decay_tim:[0,11],angelou_lithium_eagb_massfrac:[0,11],angelou_lithium_eagb_tim:[0,11],angelou_lithium_gb_decay_tim:[0,11],angelou_lithium_gb_massfrac:[0,11],angelou_lithium_gb_tim:[0,11],angelou_lithium_hg_decay_tim:[0,11],angelou_lithium_hg_massfrac:[0,11],angelou_lithium_hg_tim:[0,11],angelou_lithium_lmms_decay_tim:[0,11],angelou_lithium_lmms_massfrac:[0,11],angelou_lithium_lmms_tim:[0,11],angelou_lithium_ms_decay_tim:[0,11],angelou_lithium_ms_massfrac:[0,11],angelou_lithium_ms_tim:[0,11],angelou_lithium_tpagb_decay_tim:[0,11],angelou_lithium_tpagb_massfrac:[0,11],angelou_lithium_tpagb_tim:[0,11],angelou_lithium_vrot_trigg:[0,11],angelou_lithium_vrotfrac_trigg:[0,11],angular:[0,11,18],ani:[0,2,4,5,9,11,14,17,19],anoth:[0,11],ansi:[0,11],ansi_colour:[0,11],anyth:[0,4,7,11,15,16,17],anywai:[5,14,17],anywher:[5,17],api:[0,3,4,9],api_log_filename_prefix:[0,11,14],append:[1,4,14,15,16],appli:[0,11],apply_darwin_radau_correct:[0,11],appropri:[0,7,11],approxim:[0,11],aren:[2,7],arenou2010_binary_fract:2,arg:[2,4,11,13,17,18],arg_dict:4,argopt:[0,11],argpair:[4,13],argstr:[11,12,14],argument:[0,2,4,5,7,11,14,17,20],argument_of_periastron:[0,11],argument_of_periastron_quadrupl:[0,11],argument_of_periastron_tripl:[0,11],around:[0,11,12,14],arrai:[2,4,7,14],arrow:[0,11],artefact:16,artifici:[0,11],artificial_accretion_end_tim:[0,11],artificial_accretion_ignor:0,artificial_accretion_start_tim:[0,11],artificial_angular_momentum_accretion_r:[0,11],artificial_mass_accretion_r:[0,11],artificial_mass_accretion_rate_by_stellar_typ:[0,11],artificial_orbital_angular_momentum_accretion_r:[0,11],arxiv:[0,2,11],ask:[0,11,23],asplund:[0,11],assign:[5,15,16,17],associ:[15,16],assum:[0,11,18],ast871:[0,11],astronomi:[0,11],astrophys:16,astropi:[9,18,19],atom:4,attempt:[4,5],auto:[1,10],autogen_c_logging_cod:[1,12],automat:[0,1,6,9,11,12,19],autovivif:4,autovivificationdict:4,avaibl:[9,19],avail:[0,4,7,11,12,15,16,17,18],avoid:11,awai:[0,11],axi:[0,11,18],b_1:[0,11],b_2:[0,11],b_3:[0,11],b_4:[0,11],b_inclination1:[0,11],b_inclination2:[0,11],b_inclination3:[0,11],b_inclination4:[0,11],back:[0,4,11],backward:[0,11],bagb:[0,11],barn:[0,11],base:[0,2,4,5,9,11,15,16,17,18,19,23],base_filenam:[5,17],basic:[5,17],batchmod:[0,11],beasor:[0,11],becaus:[0,2,5,7,9,11,14,15,16,19],becom:[0,1,2,4,11,12,16],been:[0,5,7,11,13],befor:[0,5,7,9,11,15,16,17,19],behaviour:[4,15,16,17,20],belczynski:[0,11],below:[0,3,7,11,12,15,16,17],berro:[0,11],bertolami:[0,11],best:[5,7,9,19],beta:[0,11],beta_reverse_nova:[0,11],beta_reverse_novae_geometri:0,better:[0,3,4,5,9,11,17],between:[0,2,11,21],bewar:[5,17],bh_belczynski:[0,11],bh_fryer12_delai:[0,11],bh_fryer12_rapid:[0,11],bh_fryer12_startrack:[0,11],bh_hurley2002:[0,11],bh_prescript:[0,11],bh_spera2015:[0,11],big:[0,7,11],biinari:17,bin:[0,4,9,11,15,16,19],bin_data:[4,15,16],binari:[2,3,5,7,9,11,14,17,18,19,23],binary_c2:[9,19],binary_c:[1,2,3,4,5,7,12,14,15,16,17,18,20],binary_c_api_funct:12,binary_c_cal:[5,17],binary_c_default:17,binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11:15,binary_c_grid_f28b5f98d7ef40dcb17fc2481a6d3c:17,binary_c_inline_config:1,binary_c_log_cod:[1,12,14],binary_c_macro:[0,11],binary_c_output:4,binary_c_paramet:[15,16,17],binary_c_python:[4,5,11,14,15,16,17],binary_c_task_:[0,11],binary_c_write_log_cod:1,binary_grid:[0,11],binary_star:23,binaryc:[1,4,13,20],binaryc_config:1,binaryc_json_seri:4,binarycdecod:4,binarycencod:4,binarycpython3:11,binarycpython:[1,2,3,4,5,6,9,15,16,18,19,20,21,23],binarygrid:[15,16,17],bind:[0,11,12,14],binned_log_luminos:[15,16],binwidth:[4,15,16],birth:[0,11],bit:2,bivari:[0,11],black:[0,11],black_hol:0,bloecker:[0,11],blog:1,boltzman:18,boltzmann:[0,11],bondi:[0,11],bondi_hoyle_accretion_factor:[0,11],bool:[4,5,6,13,17,18],born:[0,11,15,16],bosswissam:4,both:[0,4,11,15,16,17],bottom:[0,11,17],bound:[2,21],boundari:2,brake:[0,11],branch:[0,4,11],branchpoint:[5,17],breakup:[0,11],brighten:16,broken:[0,11],browser:[15,16],bse:[0,2,11,12,17],bse_opt:[5,14,15,16,17],bsf:[0,11],buffer:[0,11],build:[0,1,3,4,11],build_q_tabl:2,built:[0,1,4,9,13,19],burn:[0,11],busso:[0,11],bye:[0,11],c13_eff:[0,11],c_auto_log:7,c_log:0,c_logging_cod:[7,12,14,15,16,17],calc_e_integr:2,calc_p_integr:2,calc_period_from_sep:23,calc_sep_from_period:[15,17,23],calc_total_probden:2,calcul:[0,2,4,5,7,11,16,17,23],calculate_constants_three_part_powerlaw:2,call:[0,1,4,5,7,11,13,14,16,17,18,20],call_binary_c_config:4,calls_filenam:17,can:[0,1,2,4,5,7,9,11,12,13,14,15,16,17,18,19,20],cannot:[5,12],canon:7,cap:[0,11],capit:[15,16],capsul:[1,4,11,15],captur:[0,4,11],carbon:[0,11],carbon_oxygen_white_dwarf:0,care:[15,16],carlo:[0,7,11],carrasco:[0,11],carri:[0,11],cast:[4,13],catchtim:4,categor:11,categori:[11,17],categoris:4,caught:[4,14],caus:23,cbdisc:[0,11],cbdisc_albedo:[0,11],cbdisc_alpha:[0,11],cbdisc_eccentricity_pumping_dermin:0,cbdisc_eccentricity_pumping_method:[0,11],cbdisc_eccentricity_pumping_non:0,cbdisc_end_evolution_after_disc:[0,11],cbdisc_fail_ring_inside_separ:[0,11],cbdisc_gamma:[0,11],cbdisc_init_djdm:[0,11],cbdisc_init_dm:[0,11],cbdisc_inner_edge_strip:[0,11],cbdisc_inner_edge_stripping_timescal:[0,11],cbdisc_kappa:[0,11],cbdisc_mass_loss_constant_r:[0,11],cbdisc_mass_loss_fuv_multipli:[0,11],cbdisc_mass_loss_inner_l2_cross_multipli:[0,11],cbdisc_mass_loss_inner_viscous_accretion_method:[0,11],cbdisc_mass_loss_inner_viscous_accretion_method_equ:0,cbdisc_mass_loss_inner_viscous_accretion_method_gerosa_2015:0,cbdisc_mass_loss_inner_viscous_accretion_method_non:0,cbdisc_mass_loss_inner_viscous_accretion_method_young_clarke_2015:0,cbdisc_mass_loss_inner_viscous_angular_momentum_multipli:[0,11],cbdisc_mass_loss_inner_viscous_multipli:[0,11],cbdisc_mass_loss_ism_pressur:[0,11],cbdisc_mass_loss_ism_ram_pressure_multipli:[0,11],cbdisc_mass_loss_xray_multipli:[0,11],cbdisc_max_lifetim:[0,11],cbdisc_minimum_evaporation_timescal:[0,11],cbdisc_minimum_fr:[0,11],cbdisc_minimum_luminos:[0,11],cbdisc_minimum_mass:[0,11],cbdisc_no_wind_if_cbdisc:[0,11],cbdisc_outer_edge_strip:[0,11],cbdisc_outer_edge_stripping_timescal:[0,11],cbdisc_resonance_damp:[0,11],cbdisc_resonance_multipli:[0,11],cbdisc_torquef:[0,11],cbdisc_viscous_l2_coupl:[0,11],cbdisc_viscous_photoevaporative_coupl:[0,11],cbdisc_viscous_photoevaporative_coupling_inst:[0,11],cbdisc_viscous_photoevaporative_coupling_non:[0,11],cbdisc_viscous_photoevaporative_coupling_visc:[0,11],cee:[0,11],cell:[11,15,16,17],cemp:[0,11],cemp_cfe_minimum:[0,11],centr:[5,17],central_object:[0,11],certain:[7,9,19],cf_amanda_log:[0,11],cflag:[9,19],chabrier:2,chandrasekhar:[0,11],chandrasekhar_mass:[0,11],chang:[0,1,2,4,5,6,7,9,11,12,16,17,19],chapter:[0,7,10],cheb:[0,11],check:[0,2,4,5,6,11,15,16,17,23],check_circular:4,chemic:[0,11],chen:[0,11],child:4,choic:[0,2,11,18],choos:[0,11,12,15,18],chose:14,chosen:[5,15,16,17],circular:[0,11],circumbinari:[0,11],circumstanti:[0,11],claei:[0,11],clark:[0,11],clean:[1,5,9,14,16,19],clean_up_custom_logging_fil:5,clear:[4,16],clearli:16,clock:4,clone:[9,19],close:[0,11,16],cloud:[0,11],cls:4,cluster:8,cmdline:5,co2:16,code:[0,1,5,6,9,11,12,14,15,16,17,18,19,20],collaps:[0,11],collapsar:[0,11],collect:23,collid:23,color:18,color_by_index:18,colour:[0,11],colour_log:[0,11],column:[14,17,18],column_nam:14,com:[1,4],combin:[1,4,5,7,12],combine_ensemble_with_thread_join:7,come:[2,9,19,21],comenv_bs:0,comenv_disc_angmom_fract:[0,11],comenv_disc_mass_fract:[0,11],comenv_ejection_spin_method:[0,11],comenv_ejection_spin_method_do_noth:[0,11],comenv_ejection_spin_method_sychron:[0,11],comenv_ejection_spin_method_synchron:0,comenv_merger_spin_method:[0,11],comenv_merger_spin_method_breakup:0,comenv_merger_spin_method_conserve_angmom:[0,11],comenv_merger_spin_method_conserve_omega:[0,11],comenv_merger_spin_method_specif:[0,11],comenv_ms_accret:[0,11],comenv_ms_accretion_fract:[0,11],comenv_ms_accretion_mass:[0,11],comenv_nandez2016:0,comenv_nelemans_tout:0,comenv_ns_accret:[0,11],comenv_ns_accretion_fract:[0,11],comenv_ns_accretion_mass:[0,11],comenv_post_eccentr:[0,11],comenv_prescript:[0,11],comenv_splitmass:[0,11],comenv_undef:0,command:[0,1,5,7,9,11,17,19],commandlin:17,comment:17,commit:4,common:[0,11,12,14,15,16,17],compact:17,companion:[0,11],compar:[0,7,11,17],compens:16,compil:[1,9,12,17,19],compile_shared_lib:1,complet:[15,16,17],complex:[5,7,12,17,18],compon:[4,18],comput:[0,8,11,15,16],conceptu:15,condit:[5,12,15,16,17],condor:[5,7,8],condor_grid:5,config:[1,4,7,9,19],config_fil:1,configur:[2,5,14,15,16,17],conjunct:13,conserv:[0,11],consid:[0,1,2,4,5,7,11,18],constant:[0,2,11,18],construct:[0,1,11,14,15,16,17],contain:[0,1,2,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22],content:[3,4,5,9,11],context:4,continu:[5,17],control:[0,11,15,16,17],convect:[0,11],conveni:4,converg:[0,11],convert:[2,4,5],convert_byt:4,convfloat:4,cool:[0,11],copi:[0,11,16,23],core:[0,5,7,11,15,16,17,18],core_co:12,core_h:12,core_helium_burn:0,core_mass:[0,11,12],correct:[0,2,5,11,14,18,23],correctli:[9,14,18,19],correspond:18,corretor:[0,11],cosmic:2,cosmic_sfh_madau_dickinson2014:2,cost:16,could:[0,4,11,16,17],count:[4,7],count_keys_recurs:4,counter:7,coupl:[0,3,11],cours:18,cover:[13,15,16],coverag:[9,19],cowd:[0,11],cpu:[0,11,15,16],cpython:11,crap_paramet:[0,11],creat:[2,4,5,12,14,15,16,17],create_and_load_logging_funct:[1,12],create_arg_str:4,create_hdf5:4,creation:11,critic:[0,11],cross:[0,11],crunch:[15,16],ctype:1,cube:15,cubic:15,cuntz:[0,11],current:[0,4,9,11,12,15,16,19],curv:16,custom:[0,1,3,4,5,7,9,11,14,15,16,17,18,20],custom_log:[5,7,14],custom_logging_cod:[1,12,14,20],custom_logging_func_memaddr:[7,11,12],custom_logging_funct:[7,9,10,12,14,17],custom_logging_info:5,custom_logging_memaddr:12,custom_logging_print_stat:14,custom_logging_stat:[15,16,17],custom_opt:[5,14,15,16,17],custom_output_funct:12,custom_sort_dict:4,custom_tmp_dir:1,customis:18,cvode:[0,11],dai:[0,2,11,12,14,15,17,23],damp:[0,11],darwin:[0,11],dat:[0,4,17],data:[0,4,5,7,11,14,15,16,17,20],data_dict:2,data_dir:[4,5,7,17],datadir:[5,17],datafram:[14,15,16,18],datalinedict:[4,15,16],datamodel:4,dataset:[4,17],date:5,david:[9,11,19],dd7:[0,11],deactiv:[0,11],deal:[4,14],death:[0,11],debug:[0,5,7,11,15,16,17],decai:[0,11],decid:[0,4,5,11,12],decod:4,decreas:[0,11],deeper:[5,17],def:[14,15,16,17],default_to_metal:[0,11],defaultdict:4,defer:[0,11],defin:[0,1,2,5,11,18],definit:[1,15,16,23],degener:[0,11],degenerate_core_helium_merger_ignit:[0,11],degenerate_core_merger_dredgeup_fract:[0,11],degenerate_core_merger_nucsyn:[0,11],degner:[0,11],degre:[0,11],delai:[0,11],delta_mcmin:[0,11],den:[0,11],densiti:[2,15,16],depend:[0,2,9,11,18,19],deprec:[0,5,11],dermin:[0,11],describ:[0,2,7,11],descript:[0,2,4,7,9,10,11,13],design:18,desir:[0,11],destruct:[5,17],detail:[0,4,11,14],detect:[0,11],determin:[0,5,11,12,15,16,17,23],deton:[0,11],dev:[0,11],develop:1,deviat:2,dewi:[0,11],dex:[0,11],diagnost:7,diagram:[0,11,18],dickonson:2,dict2:4,dict:[1,2,4,5,6,13,14,15,16,17,22],dict_1:4,dict_2:4,dict_kei:[13,14],dictionari:[1,2,3,4,5,6,7,15,16,17,18,22],did:[4,9,19],differ:[0,4,5,9,11,15,16,17,18,19],dimmer:[0,11],dir:[9,19],direct:[0,5,11],directli:[4,7,14],director:7,directori:[0,3,4,5,7,9,11,17,19],disabl:[0,11,17],disable_debug:[0,11],disable_end_log:[0,11],disable_ev:[0,11],disc:[0,11],disc_legacy_log:[0,11],disc_log2d:[0,11],disc_log:[0,11],disc_log_directori:[0,11],disc_log_dt:[0,11],disc_log_level_non:0,disc_log_level_norm:0,disc_log_level_normal_first_disc_onli:0,disc_log_level_subtimestep:0,disc_log_level_subtimestep_first_disc_onli:0,disc_n_monte_carlo_guess:[0,11],disc_stripping_timescale_infinit:0,disc_stripping_timescale_inst:0,disc_stripping_timescale_orbit:0,disc_stripping_timescale_visc:0,disc_timestep_factor:[0,11],discret:17,discs_circumbinary_from_comenv:[0,11],discs_circumbinary_from_wind:[0,11],disk:[0,5,11],dispers:[0,11],displai:[0,11],disrupt:[0,11],dist:[4,9,19],distefano:2,distribut:[0,2,3,4,5,8,11,15,17],distribution_funct:[9,10,15,16,17],divid:8,dlnm1:[5,15,17],dlnm:16,dlnm_1:16,dlog10per:[15,17],dlogp:2,dm1:16,dm_1:16,do_dry_run:7,doc:[4,6,9,15,16,17,19],doc_fetch:2,docstr:[9,14,18,19],document:[4,6,7,10,15,16,17],doe:[0,2,4,5,7,11,12,13,14,15,16,17,23],doesn:[5,7],doesnt:6,doing:[0,1,6,9,11,19],don:[2,4,7],done:[0,4,5,9,11,15,16,17,19],donor:[0,11,23],donor_limit_dynamical_multipli:[0,11],donor_limit_envelope_multipli:[0,11],donor_limit_thermal_multipli:[0,11],donor_rate_algorithm_bs:0,donor_rate_algorithm_claeys2014:0,dont:11,doubl:[12,17],down:17,dphasevol:[5,15,16,17],dprob:16,dr2:[0,11],dr3:[0,11],drai:[0,11],dredg:[0,11],drop:14,dry:7,dstep:2,dt_limit:13,dtfac:[0,11],dtlimit:4,dtm:[1,12,17],due:[9,19],dummi:[2,18],dump:[0,4,11,14],dumpvers:[0,11],duquennoi:2,duquennoy1991:2,dure:[0,11],dust:[0,11],dwarf:[0,11,16],dynam:[0,11],e2_hurley_2002:0,e2_izzard:0,e2_mint:0,e2_prescript:[0,11],e45c25448b32440cb7e220f4a3562907:17,each:[0,2,4,5,7,11,15,16,17],eagb:[0,11],eagb_wind_beasor_etal_2020:0,eagb_wind_bs:0,eagb_wind_goldman_etal_2017:0,eagbwind:[0,11],eagbwindfac:[0,11],earli:[0,11],early_asymptotic_giant_branch:0,easi:[4,14],easier:[4,17],ecc2:2,ecc3:2,ecc:[2,5,14,17],eccentr:[0,2,11,12,14,15,16,17,18,23],eccentric_rlof_model:[0,11],eccentricity_quadrupl:[0,11],eccentricity_tripl:[0,11],echo:[0,11],eddington:[0,11],edg:[0,5,11,17],edit:12,edu:[0,11],effect:[0,2,7,11,12],effective_metal:[0,11],effici:[0,11],egg:[9,19],eggleton:[0,11,23],either:[0,4,5,7,9,11,15,16,17,19,20],eject:[0,11],elabor:12,eld:[0,11],eldridg:[0,11],electon:[0,11],electron:[0,11],element:[0,1,4,7,11,13,18],email:4,emp:[0,11],emp_feh_maximum:[0,11],emp_logg_maximum:[0,11],emp_minimum_ag:[0,11],empti:[4,6,14],enabl:[0,11],encod:4,encount:7,end:[0,2,4,7,11],end_index:2,end_timestamp:[15,16,17],energi:[0,11],enhanc:[0,11],enlarg:[0,11],enough:2,ensembl:[0,4,7,11,13],ensemble_def:[0,11],ensemble_dictionari:4,ensemble_dt:[0,11],ensemble_factor_in_probability_weighted_mass:7,ensemble_filter_:[0,11],ensemble_filters_off:[0,11],ensemble_json:4,ensemble_legacy_ensembl:[0,11],ensemble_list:5,ensemble_logdt:[0,11],ensemble_logtim:[0,11],ensemble_macro:[0,11],ensemble_output_:7,ensemble_startlogtim:[0,11],ensure_ascii:4,enter:[0,9,11,19],enthalpi:[0,11],entir:[12,14],entri:[4,5],env:[9,11,18,19],envelop:[0,11],epoch:5,equal:[0,4,11,16,17],equat:[0,11],equation_of_state_algorithm:[0,11],equation_of_state_paczynski:0,equatori:[0,11],equival:[7,15],errno:[9,19],error:[0,4,7,9,11,15,16,17,19],errors_exceed:[15,16,17],errors_found:[15,16,17],esa:2,escap:[0,11],escape_fract:[0,11],escape_veloc:[0,11],eta:[0,11,15],etal:[0,11],etc:[0,4,5,8,9,11,14,16,17,18,19,20],etf:15,euler:[0,11],evalu:[2,5,17,23],evan:[0,11],evapor:[0,11],evaporate_escaped_orbiting_object:[0,11],even:[13,16],event:[0,11],everi:[0,4,9,11,19],everyth:[5,7,14,17],everytim:[9,19],evid:[0,11],evolut:[0,1,5,7,11,14,15,16,17,18],evolution_split:[0,11],evolution_splitting_maxdepth:[0,11],evolution_splitting_sn_eccentricity_threshold:[0,11],evolution_splitting_sn_n:[0,11],evolution_typ:[7,15,16,17],evolutionari:[0,11,14],evolv:[0,3,5,7,11,12],evolve_popul:17,evolve_singl:[5,12,14],exact:[1,4,7],exactli:[0,11,16],exampl:[1,2,4,5,14,15,20],example_above_m:12,example_compact_object:17,example_dco:17,example_df:14,example_head:4,example_log:20,example_log_co:[1,12],example_logging_string_co:12,example_logging_string_post_m:12,example_massloss:[12,14],example_output:14,example_parse_output:4,example_pop:[14,17],example_pop_set:17,example_python_population_result:17,example_sn:12,exce:[0,7,11],except:[4,6,7,11,15,16,17,18],execut:[0,5,7,9,11,17,19],exist:[0,4,5,6,11,17],exist_ok:[4,17],exit:[0,4,11],exp:[5,15,16,17],expand:[17,20],expect:[9,11,16,19],experiment:[0,4,11],explain:[3,4],explicitli:[0,1,11],explod:[0,11],explos:[0,11],expoenti:[0,11],expon:[0,11],export_all_info:[5,17],express:[0,11],extend:[0,9,11,19],extens:11,extern:[0,11],extra:[0,3,5,7,9,11,17,20],extra_text:6,extract:[4,17],extract_ensemble_json_from_str:4,extrapol:[2,7],eye:5,f28b5f98d7ef40dcb17fc2481a6d3c:17,fabian:[0,11],fabian_imf_log:[0,11],fabian_imf_log_tim:[0,11],fabian_imf_log_timestep:[0,11],factor:[0,2,4,7,11],fade:[0,11],fail:[0,4,7,9,11,15,19],fail_sil:4,failed_count:[15,16,17],failed_prob:[15,16,17],failed_system:7,failed_system_log:7,failed_systems_error_cod:[15,16,17],failed_systems_threshold:7,failsaf:14,failur:[0,4,11],fallback:[0,11],fals:[0,4,5,7,11,13,15,16,17,18],fancy_parsing_funct:20,far:[0,11,16],fase:17,fast:[0,11],faster:[15,16,17],favorit:14,featur:[3,4,9,17],feed:7,ferguson:[0,11],fetch:14,few:[0,11],field:[0,11],fig:[0,2,11],figsiz:[15,16],figur:[7,15,16,18],file:[0,1,4,5,6,7,8,9,11,14,17,18,19,20],file_log:[0,11],filehandl:6,filenam:[0,1,4,5,7,11,14,17,20],filenotfounderror:[9,19],filepath:1,fill:[4,14],fill_data:2,filter:[0,4,11,13],filter_arg_dict:4,filter_valu:[4,13],fin:[0,11],find:[4,5,7,9,17,19],finish:[4,15,16,17,18],finit:[15,16],first:[0,2,4,5,9,11,14,15,16,17,19,23],first_giant_branch:0,fishlock:[0,11],fit:[0,2,4,5,11,14,23],fix:[0,2,4,5,11,14,17,18],flag:[1,4,7],flash:[0,11],flat:[2,7],flatsect:[2,15,17],flaw:5,float_overflow_check:[0,11],flto:[9,19],fold:2,follow:[0,2,4,7,9,11,12,18,19],forc:[0,9,11,19],force_circularization_on_rlof:[0,11],force_corotation_of_primary_and_orbit:[0,11],foreach_star:15,form:[0,4,5,6,11,15,16,17],formal:[0,11],format:[0,2,4,5,11,12,14,15,16,17],format_ensemble_result:4,formula:[0,11],forward:[0,11],found:[2,9,15,16,17,19],four:[0,11],fpic:1,fraction:[0,2,7,11],framework:11,free_persistent_data_memaddr_and_return_json_output:11,free_store_memaddr:11,frequenc:[0,11],friction:[0,11],fring:[0,11],from:[0,2,4,5,7,13,14,15,16,17,18,23],from_binary_c_config:1,from_dict:[15,16],fryer:[0,11],ftz:[9,19],full:[3,4,7,12],full_path:4,further:[2,17],fuv:[0,11],gaia:[0,2,11],gaia_colour_transform_method:[0,11],gaia_conversion_ubvri_bivariate_jordi2010:[0,11],gaia_conversion_ubvri_riello2020:[0,11],gaia_conversion_ubvri_univariate_evans2018:[0,11],gaia_conversion_ubvri_univariate_jordi2010:[0,11],gaia_conversion_ugriz_bivariate_jordi2010:[0,11],gaia_conversion_ugriz_riello2020:[0,11],gaia_conversion_ugriz_univariate_evans2018:[0,11],gaia_conversion_ugriz_univariate_jordi2010:[0,11],gaia_l_binwidth:[0,11],gaia_teff_binwidth:[0,11],gain:7,galact:[0,11],gallino:[0,11],gamma:[0,11],gap:[0,11],garcia:[0,11],gauss:[0,11],gaussian:2,gaussian_func:2,gaussian_normalizing_const:2,gb_reimers_eta:[0,11],gb_wind_beasor_etal_2020:0,gb_wind_goldman_etal_2017:0,gb_wind_reim:0,gb_wind_schroeder_cuntz_2005:0,gbwind:[0,11],gbwindfac:[0,11],gcc:[1,9,19],gce:[0,11],gener:[0,1,2,4,5,6,7,11,12,14,15,16,17,18],general_info:4,generalis:2,geometr:[0,11],gerosa:[0,11],get:[0,2,3,4,5,6,9,12,14,15,16,17,19,20,23],get_arg_kei:4,get_default:[4,13],get_help:[4,13],get_help_al:[4,5,13],get_help_sup:[4,13],get_integration_constant_q:2,get_max_multipl:2,get_moe_di_stefano_dataset:4,get_siz:4,giant:[0,11],giant_branch:0,git:[0,4,15,16,17],git_branch:4,git_build:4,github:4,gitlab:9,give:[0,2,4,11,23],given:[0,1,2,4,5,7,11,16,20,23],global:[0,2,11,15,16],global_dict:2,gmax:2,gmin:2,gnu:11,goe:[0,4,5,11,12,14,18],gogo:[0,11],going:[9,19],goldman:[0,11],gonna:2,good:[0,7,11,14,15,16,17,23],got:16,gov:[0,11],gravit:[0,11,17],gravitational_radiation_bs:0,gravitational_radiation_bse_when_no_rlof:0,gravitational_radiation_landau_lifshitz:0,gravitational_radiation_landau_lifshitz_when_no_rlof:0,gravitational_radiation_model:[0,11],gravitational_radiation_modulator_:[0,11],gravitational_radiation_modulator_j:[0,11],gravitational_radiation_non:0,grb:[0,11],great:[0,11,16],greater:[0,11],grevess:[0,11],grid:[0,3,4,5,9,10,11,12,14],grid_class:[9,10],grid_cod:5,grid_opt:[5,14,15,16,17],grid_options_default:6,grid_options_defaults_dict:6,grid_options_descript:[6,17],grid_options_description_check:6,grid_options_help:6,grid_result:[7,15,16],grid_vari:[7,17],grid_variable_numb:[5,17],gridcode_filenam:7,gridtyp:[5,17],group:[4,15],gsl:[9,19],gsl_dir:[9,19],guess:[0,2,11],h5py:[9,19],hachisu:[0,11],hachisu_disk_wind:[0,11],hachisu_ignore_qcrit:0,hachisu_qcrit:[0,11],hack:6,had:[5,15,16],half:[0,11],hall:[0,11],handi:[0,11],handl:[0,3,4,5,7,11,14,20,23],handle_ensemble_string_to_json:4,happen:[0,11],hardcod:[12,15,16,17],has:[0,1,4,5,7,11,12,13,15,16,17],have:[0,2,3,4,5,6,7,9,11,12,14,15,16,17,18,19],hbb:[0,11],hbbtfac:[0,11],hdf5:4,hdf5file:4,header:[1,4,12,14,15,16,17],headerlin:17,headlin:7,hegb:0,hehg:0,height:[2,15,17],helium:[0,11],helium_flash_mass_loss:[0,11],helium_white_dwarf:0,help:[0,3,4,6,11,14,15,16,17],help_al:[0,11],hem:0,henc:[0,11,16],hendrik:[9,19],here:[1,4,5,7,11,12,14,18],hertzsprung:[0,11],hertzsprung_gap:0,hertzstrpung:[0,11],heuvel:[0,11],hewd:[0,11],hewd_hewd_ignition_mass:[0,11],hex:7,high:[0,2,11,16],higher:[0,2,4,7,9,11,15,16,17,19],highlight:4,his:2,histori:2,hold:7,hole:[0,11],home:11,homogen:[0,11],hood:14,hopefulli:[0,11],hot:[0,11],how:[0,4,5,7,11,12,14,15,16,17],howev:[0,11,12,15,16,17],hoyl:[0,11],hpc:[5,8],hpc_function:[9,10],hr_diagram:18,hrd:[0,11],hrdiag:[0,11],hrdiag_output:[0,11],html:[4,9,17,19],http:[0,1,2,4,11,17],hurlei:[0,11],hut:[0,11],hybrid:[0,11],hydro:[0,11],hydrogen:[0,11],iadd:4,ibc:[0,11],id_cor:12,idea:[17,18],idum:[0,11],ignit:[0,11],ignor:[0,5,7,9,11,12,14,17,19],iia:[0,11],iloc:14,imf:[0,2,11,16],imf_chabrier2003:2,imf_scalo1986:2,imf_scalo1998:2,imf_tinsley1980:2,immedi:[0,11],implement:[0,4,5,7,11],impli:[0,11],implic:16,impos:[15,16,17],improv:2,inclin:[0,11],inclination1:[0,11],inclination2:[0,11],inclination3:[0,11],inclination4:[0,11],inclini:[0,11],incliniation_quadrupl:[0,11],incliniation_tripl:[0,11],includ:[0,1,2,4,5,9,11,12,14,16,17,18,19],include_binary_c_default:[5,17],include_binary_c_help_al:[5,17],include_binary_c_version_info:[5,17],include_default:[5,17],include_popul:17,include_population_set:5,incom:[0,11],increas:[0,11,15,16],inde:[0,11,16],indent:[4,14],index:[0,2,9,11,13,14],indic:[0,2,11],individu:[3,9,15],individual_nova:[0,11],induc:[0,11],inertia:[0,11],info:[4,5,9,11,13,17,18,19],inform:[0,1,3,4,5,6,12,14,15,16,17,18],init:5,init_abund:[0,11],init_abund_dex:[0,11],init_abund_mult:[0,11],init_abunds_onli:[0,11],initi:[0,2,3,5,11,13,14],initial_abundance_hash:5,initial_abundance_mix:[0,11],initial_abunds_onli:[0,11],initial_mass:14,inner:[0,11],input:[1,2,4,5,7,9,11,13,14,18,23],input_dict:4,insert:[5,17],insid:[0,11],inspect:[4,14,18],inspect_dict:4,inspir:[1,18,23],instabl:[0,11],instanc:[4,14,15,16,17],instant:[0,11],instantli:[0,11],instead:[0,4,7,11,16],integ:[0,5,7,11,23],integr:[2,15,16],integrals_str:2,intens:16,interact:[0,6,11],interfac:[4,9,11,15,19],interfer:[9,19],intern:[0,7,11,13],internal_buff:[0,11],internal_buffering_off:0,internal_buffering_print:0,internal_buffering_stor:0,interpol:[2,5],interpolate_in_mass_izzard2012:2,interpolator_nam:2,intershel:[0,11],interstellar:[0,11],intger:[0,11],intro:[0,11],invers:23,involv:[0,11],inward:[0,11],ipynb:[15,16,17],is_capsul:4,isfil:17,isn:4,isnt:17,isotop:[0,4,11,13],isotope_hash:5,isotope_list:5,item:[1,4,15,16],iter:4,its:[0,4,5,6,9,11,15,16,17,18,19,20],itself:[4,7,9,12,14,19],iwamoto:[0,11],izzard2012_period_distribut:2,izzard:[0,9,11,19],jager:[0,11],jaschek:2,jeff:[9,19],jia:[0,11],john:[0,11],join:[11,12,14,17],jordi:[0,11],json:[4,5,7,11,14,17],jsondecod:4,jsonencod:4,jupyt:[9,15,16,19],just:[0,2,4,5,7,11,17,23],kap:[0,11],kappa:[0,11],kaps_rentrop:[0,11],karaka:[0,11],keep:[5,17],kei:[1,2,4,5,6,7,13,14,17,18],kelvin:[0,11],keplerian:[0,11],keyword:[18,20],kick:[0,7,11],kick_backward:0,kick_forward:0,kick_inward:0,kick_outward:0,kick_random:0,kick_straight_up:0,kick_velocity_custom:0,kick_velocity_fix:0,kick_velocity_maxwellian:0,kill:[1,12,17],kim:[0,11],kind:11,kippenhahn:[0,11],know:[0,1,6,11,13,14,16],known:[0,2,5,11,14,15,16,17,20],kroupa2001:[2,5,17],kroupa:[2,16],krticka:[0,11],ktg93:2,kwarg:[5,18,20],lambda:[0,11],lambda_c:[0,11],lambda_ce_dewi_tauri:0,lambda_ce_klencki_2020:0,lambda_ce_polytrop:0,lambda_ce_wang_2016:0,lambda_enthalpi:[0,11],lambda_ionis:[0,11],lambda_min:[0,11],lambda_mult:[0,11],lambda_multipli:[0,11],lambda_v:2,lamer:[0,11],landau:[0,11],langer:[0,11],larger:[0,11],last:[2,3],lastli:[11,14],later:[15,16],latter:[0,11],law:[2,16],law_const:2,lbv:[0,11],ld_library_path:[9,19],ldist:16,lead:[0,11,15,16,17,23],learn:12,least:[9,19],leav:[0,11],left:[0,11],legaci:[0,11],legacy_yield:[0,11],len:[14,17],lengthen:[0,11],less:[0,1,2,3,11,14],let:[5,14,15,16,17],level:[1,4,5],li7:[0,11],lib:[9,11,14,19],libbinary_c:7,libcustom_logging_5d7779e8190e4b79b10c7e6a44cb0e7:14,libcustom_logging_8967553693ac4e11a49c42d4eef773e8:14,libgsl:[9,19],libmemo:[9,19],librari:[0,1,5,7,11,12,20],library_path:[9,19],librinterpol:[9,19],lies:[0,11],lifetim:[0,11,15,16,17],lifshitz:[0,11],like:[0,1,4,5,7,9,11,15,16,17,18,19,21],limit:[0,11,15,16,17,18],line:[1,4,5,7,9,12,14,15,16,17,18,19],linear2:7,linear:[0,2,7,11,15,16],linear_extrapolation_q:2,linearli:[16,21],linedata:[15,16],lineplot:[15,16],linker:1,linspac:21,linux:11,list:[0,1,2,4,7,11,14,15,16,17,20,21],list_arg:[0,11],list_of_sub_kei:2,lit:[0,11],lithium:[0,11],lithium_gb_post_1dup:[0,11],lithium_gb_post_heflash:[0,11],lithium_hbb_multipli:[0,11],lithium_t:[0,11],littl:15,littleton:[0,11],liu:[0,11],llnl:[0,11],lnm1:[5,15,16,17],lnm_1:16,load:[0,1,4,5,7,11,12,14,15,16,17,18],load_logfil:4,lobe:[0,11,23],local:2,locat:[0,2,7,9,11,19],lodder:[0,11],log10:[0,2,11,15,16,17],log10m1:7,log10p:2,log10per:[15,17],log10pmin:2,log:[0,1,2,3,4,5,7,9,11,14,18,19,20,23],log_:[15,16],log_arg:7,log_args_dir:7,log_arrow:[0,11],log_dt:7,log_every_timestep:[12,14],log_fil:7,log_filenam:[0,11,14,20],log_runtime_system:7,logarithm:[2,16],logensembletim:[0,11],logfil:[4,9,14,19],logg:[0,11],logger:17,logging_dict:1,logging_lin:12,logic:[1,5,7,12],logmass:2,logp:2,logper:2,logperiod:2,logperrang:15,long_spectral_typ:2,longer:[0,11],longnam:[5,15,16,17],look:[1,4,9,15,16,17,19],lookback:[0,11],loon:[0,11],loop:[5,14,15,16,17],loos:18,lose:[0,11],loss:[0,11,14],lost:[0,11],lot:[4,7,15,16,17,20],low:[0,2,11,16],low_mass_m:0,low_mass_main_sequ:0,lower:[0,2,5,11,17,21],lsoda:[0,11],lsun:[0,11,18],lugaro:[0,11],luminos:[0,3,9,11,18],luminosity_1:18,luminosity_2:18,lynnett:[0,11],m_1:[0,5,11,12,13,14,15,16,17,20],m_2:[0,11,12,14,15,17],m_3:[0,11],m_4:[0,11],m_max:[2,5,17],m_min:[5,17],maccretor:[0,11],machin:[7,9,19],macro:[0,4,11,13],madau:2,maeder:[0,11],magellan:[0,11],magnet:[0,11],magnetic_braking_algorithm:[0,11],magnetic_braking_algorithm_andronov_2003:0,magnetic_braking_algorithm_barnes_2010:0,magnetic_braking_algorithm_hurley_2002:0,magnetic_braking_algorithm_rappaport_1983:0,magnetic_braking_factor:[0,11],magnetic_braking_gamma:[0,11],magnitud:4,mai:[0,11,15],main:[0,1,7,9,11,12,15,16,17,19],main_sequ:[0,11,15,16],mainli:8,mainprocess:15,major:[0,11],make:[0,1,2,4,5,7,9,11,14,15,16,17,18,19,20],make_build_text:4,makedir:[4,17],manag:[4,9,19],mani:[0,5,7,11,13,15,16,17],manual:12,manufactur:[0,11],map:7,maria:[0,11],mass:[0,1,2,3,4,5,7,11,13,14,15,17,18,20,23],mass_1:[17,18],mass_2:[17,18],mass_accretion_for_eld:[0,11],mass_accretor:23,mass_donor:23,mass_evolut:18,mass_for_hestar_ia_low:[0,11],mass_for_hestar_ia_upp:[0,11],mass_of_pmz:[0,11],mass_str:2,massiv:[0,2,11],massless:[0,11],massless_remn:0,massrang:[15,16],master:[7,18],match:[0,4,11,14,15,17,18],materi:[0,11],math:[5,15,16,17],mathrm:[15,16],matplotlib:[9,16,18,19],matter:[0,11],mattsson:[0,11],mattsson_mass_loss:[0,11],mattsson_orich_tpagbwind:[0,11],max:[0,2,11,12,15,16,17],max_bound:[2,21],max_evolution_tim:[0,1,11,12,14,15,16,17],max_hewd_mass:[0,11],max_model_numb:[0,11],max_multipl:2,max_neutron_star_mass:[0,11],max_queue_s:7,max_stellar_angmom_chang:[0,11],max_stellar_type_1:[0,11],max_stellar_type_2:[0,11],max_stellar_type_3:[0,11],max_stellar_type_4:[0,11],max_tim:14,max_val:2,maximum:[0,2,7,11,12,15,16,23],maximum_mass_ratio_for_instant_rlof:[0,11],maximum_mass_ratio_for_rlof:23,maximum_mcbagb_for_degenerate_carbon_ignit:[0,11],maximum_nuclear_burning_timestep:[0,11],maximum_timestep:[0,11],maximum_timestep_factor:[0,11],maxmimum:[0,11],maxwellian:[0,11],mayb:18,mayor:2,mc13_pocket_multipli:[0,11],mch:[0,11],mcmin:[0,11],mdonor:[0,11],mean:[0,2,4,5,7,9,11,19],meant:7,measur:4,medium:[0,11],mega:2,mem:15,memaddr:[11,12,15],memori:[1,5,7,11,12,23],menv:[0,11],merg:[0,2,4,7,11],merge_dict:[4,13],merge_multipl:2,merger:[0,11],merger_angular_momentum_factor:[0,11],merger_mass_loss_fract:[0,11],mesa:[9,19],mesasdk_init:[9,19],mesasdk_root:[9,19],messag:4,mestel:[0,11],met:[5,17],metal:[0,2,11,12,14,15,16,17,23],method:[0,5,7,11,12,14,15,16,17],meynet:[0,11],might:[4,5,9,17,19],milki:[0,11],miller:[0,11],min:[2,12,15,16,17],min_bound:[2,21],min_p:2,min_per:2,min_val:2,minimal_verbos:4,minimum:[0,2,4,7,11,23],minimum_co_core_mass_for_carbon_ignit:[0,11],minimum_co_core_mass_for_neon_ignit:[0,11],minimum_donor_menv_for_comenv:[0,11],minimum_envelope_mass_for_third_dredgeup:[0,11],minimum_helium_ignition_core_mass:[0,11],minimum_mcbagb_for_nondegenerate_carbon_ignit:[0,11],minimum_orbital_period_for_instant_rlof:[0,11],minimum_period_for_rlof:23,minimum_separation_for_instant_rlof:[0,11],minimum_separation_for_rlof:23,minimum_time_between_pn:[0,11],minimum_timestep:[0,11],mint:[0,11],mint_data_cleanup:[0,11],mint_dir:[0,11],mint_disable_grid_load_warn:[0,11],mint_fallback_to_test_data:[0,11],mint_hard_max_nshel:[0,11],mint_hard_min_nshel:[0,11],mint_kippenhahn:[0,11],mint_kippenhahn_companion_stellar_typ:[0,11],mint_kippenhahn_stellar_typ:[0,11],mint_maximum_nshel:[0,11],mint_maximum_shell_mass:[0,11],mint_metal:[0,11],mint_minimum_nshel:[0,11],mint_minimum_shell_mass:[0,11],mint_ms_rejuven:[0,11],mint_nshel:[0,11],mint_nuclear_burn:[0,11],mint_remesh:[0,11],mint_use_zams_profil:[0,11],mira:[0,11],misc:[9,11],miscellan:[4,13],miss:[0,4,6,11,15,16],mix:[0,4,7,11],mixtur:[0,11],mmax:[2,16],mmin:[2,7,16],mnra:23,model:[0,1,7,11,12,14,15,16,17],model_numb:[15,16],modif:3,modifi:[0,11,12],modul:[0,6,7,10,11,13,15,16,17],modulo:7,moe:[2,4,5,9,17],moe_di_stefano_2017:5,moe_di_stefano_2017_multiplicity_fract:2,moe_di_stefano_2017_pdf:2,moment:[0,11,12,17,21],momenta:[0,11,18],momentum:[0,11],monoton:16,mont:[0,7,11],monte_carlo_kick:[0,11],more:[0,1,3,4,5,7,9,11,12,13,14,15,16,17,18,19,21],most:[4,11,16],mostli:[4,6,7,15,16,17,18,20],move:[0,11],msun:[0,2,11,12,14,15,16],much:[0,4,11,17],multi:7,multipl:[0,2,4,7,11],multiplc:[0,11],multipli:[0,4,7,11,16],multiplicity_arrai:2,multiplicity_fraction_funct:7,multiplicity_model:7,multiplicity_modul:7,multiply_values_dict:[4,13],multiprocess:7,must:[0,2,11,14,15,16,17],my_stellar_data:[1,12,17],myr:[0,11,14,15,16],n100:[0,11],n100_z0:[0,11],n100h:[0,11],n100l:[0,11],n10:[0,11],n150:[0,11],n1600:[0,11],n1600c:[0,11],n200:[0,11],n20:[0,11],n300c:[0,11],n40:[0,11],naked_helium_star_giant_branch:0,naked_helium_star_hertzsprung_gap:0,naked_main_sequence_helium_star:0,name:[1,4,5,6,11,13,15,16,17,20,22],narrow:16,natur:[0,11,16],nauenberg:[0,11],nearer:[0,11],nearest:[15,16],nebula:[0,11],necessari:[4,5,17],need:[0,2,5,9,11,12,14,15,16,17,19],neg:[0,4,11],neither:[0,5,11],neleman:[0,11],nelemans_gamma:[0,11],nelemans_max_frac_j_chang:[0,11],nelemans_minq:[0,11],nelemans_n_comenv:[0,11],nelemans_recalc_eccentr:[0,11],nemp:[0,11],nemp_cfe_minimum:[0,11],nemp_nfe_minimum:[0,11],nenamg:[0,11],neon:[0,11],nest:[4,5,17],network:[0,11,13],neutrn:[0,11],neutron:[0,11,17],neutron_star:0,never:[0,11,16],newdict:4,newer:[0,2,11],newli:[0,11],newmast:0,newnam:5,newopt:2,newton:[0,11],next:[4,15,16,17],nice:[1,5,18],nieuwenhuijzen:[0,11],nieuwenhuijzen_windfac:[0,11],nmax:2,no_thermohaline_mix:[0,11],noecho:[0,11],noechonow:[0,11],noel:[0,11],nolowq:7,nomin:[0,11],non:[0,7,11],nonconservative_angmom_gamma:[0,11],none:[0,1,2,4,5,6,7,11,15,16,17,23],nonetyp:17,nonzero:7,nor:[0,11],norm:7,normal:[0,4,11],normalis:[2,7],normalize_dict:2,normalize_multipl:7,notabl:17,note:[0,4,5,7,11,15,16],notebook:[9,11,12,13,14,15,16,17,19],notebook_api_funct:14,notebook_custom_log:[14,15,16,17],notebook_individual_system:[12,14,15,16,17],notebook_luminos:16,notebook_luminosity_funct:15,notebook_popul:[14,17],noteworthi:3,noth:[5,7],notic:16,notifi:20,nova:[0,11],nova_faml_multipli:[0,11],nova_irradiation_multipli:[0,11],nova_retention_algorithm_claeys2014:0,nova_retention_algorithm_const:0,nova_retention_algorithm_hillman2015:0,nova_retention_fract:[0,11],nova_retention_method:[0,11],nova_timestep_accelerator_index:[0,11],nova_timestep_accelerator_max:[0,11],nova_timestep_accelerator_num:[0,11],now:[0,2,4,5,11,12,14,15,16,17],nre:15,nstar:15,nuclear:[0,11],nuclear_mass_hash:5,nuclear_mass_list:5,nucleosynthesi:[0,4,11],nucleosynthesis_sourc:[4,13],nucreacmult:[0,11],nucsyn:[9,11],nucsyn_angelou_lithium:[0,11],nucsyn_gce_outflow_check:[0,11],nucsyn_hbb:[0,11],nucsyn_init_abund_mix_ag89:0,nucsyn_init_abund_mix_asplund2005:0,nucsyn_init_abund_mix_asplund2009:0,nucsyn_init_abund_mix_garciaberro:0,nucsyn_init_abund_mix_grevesse_noels_1993:0,nucsyn_init_abund_mix_karakas2002:0,nucsyn_init_abund_mix_kobayashi2011_asplund2009:0,nucsyn_init_abund_mix_lodders2003:0,nucsyn_init_abund_mix_lodders2010:0,nucsyn_metal:[0,11],nucsyn_network:[0,11],nucsyn_network_error:[0,11],nucsyn_s_process:[0,11],nucsyn_solv:[0,11],nucsyn_solver_cvod:0,nucsyn_solver_kaps_rentrop:0,nucsyn_solver_lsoda:0,nucsyn_solver_numb:0,nucsyn_third_dredge_up:[0,11],nugi:[0,11],num_ansi_colour:[0,11],number:[0,2,4,5,7,9,11,15,16,17,19],numer:4,numpi:[4,9,14,19,21],obj:4,object:[0,3,4,5,7,8,11,18],object_hook:4,object_pairs_hook:4,object_parse_funct:14,observ:16,obtain:[0,15,16],obvious:12,occur:[0,11,23],off:[0,11,17],off_m:14,offset:[0,11],ohio:[0,11],old:[5,7,16],old_solut:[9,19],oldnam:5,omega:[0,11],onc:[0,11],one:[0,4,5,7,11,13,16,17,18],onewd:0,onli:[0,4,5,7,11,12,15,16,17,23],onset:[0,11],onto:[0,2,11],opac:[0,11],opacity_algorithm:[0,11],opacity_algorithm_ferguson_op:0,opacity_algorithm_paczynski:0,opacity_algorithm_star:0,opal:[0,11],open:[14,17],oper:4,opm:2,opt:[2,4,11],option:[0,1,2,4,5,9,10,11,15,16,17,19,23],orb:[5,17],orbit:[0,2,11,15,18,23],orbit_evolut:18,orbital_inclin:[0,11],orbital_inclinationi:[0,11],orbital_period:[0,11,12,14,15,17,23],orbital_period_quadrupl:[0,11],orbital_period_tripl:[0,11],orbital_phas:[0,11],orbital_phase_quadrupl:[0,11],orbital_phase_tripl:[0,11],orbiting_object:[0,11],orbiting_objects_close_pc_threshold:[0,11],orbiting_objects_log:[0,11],orbiting_objects_tides_multipli:[0,11],orbiting_objects_wind_accretion_multipli:[0,11],order:[3,4,5,17],ordereddict:[4,16],org:[0,2,4,11],origin:[9,19],other:[0,1,2,4,6,7,9,11,13,14,15,16,17,18,19],otherwis:[0,4,5,6,7,11],our:[15,16],out:[4,6,7,12,13,15,16],outcom:[0,11],outer:[0,11],outfil:[5,17],outfile_nam:1,outfilenam:17,output:[1,3,4,5,7,9,11,12,13,14,18,19,20,23],output_dict:14,output_dir:[5,14,17],output_fil:[4,6,14],output_filenam:[5,17],output_lin:4,outsid:[0,2,11],outward:[0,11],over:[4,5,13,14,15,16,17],overflow:[0,11],overlap:4,overrid:[2,4,5],overriden:17,overshoot:[0,11],overspin_algorithm:[0,11],overspin_bs:[0,11],overspin_massloss:[0,11],overview:11,own:[5,7,9,12,14,17,19],oxygen:[0,11],oxygen_neon_white_dwarf:0,packag:[4,9,11,17,19,21],paczynski:[0,11],pad:[15,16],pad_output_distribut:[4,15,16],page:[0,9,11,17,19],pair:[4,5],panda:[4,9,14,15,16,18,19],pane:18,panel:[0,11],paper:[0,11],param:[4,5],param_nam:4,paramet:[1,2,3,4,5,6,7,9,11,12,14,15,16,17,18,20,21,23],parameter_nam:[4,5,11,13,15,16,17],parameter_value_input_typ:[4,13],pars:[3,4,5,14,15,16,17,18,20],parse_binary_c_version_info:4,parse_cmdlin:5,parse_const:4,parse_float:4,parse_funct:[5,7,14,15,16,17,20],parse_function_hr_diagram:18,parse_function_mass:18,parse_function_orbit:18,parse_int:4,parsec:2,part:[2,5,11,14,15,16,17,23],partial:[0,11],particularli:[0,11],pasp:2,pass:[5,7,9,11,12,14,17,18,19,20],path:[4,7,9,14,17,19],patho:[9,19],pdf:[0,2,9,11,19],peak:16,pend:[0,11],per:[0,4,5,7,11,14,15,17,23],percentag:[0,11],peret:[0,11],perfect:16,perfectli:[15,16],perform:[0,11],perhap:[0,11],periastron:[0,11],pericent:23,period:[0,2,11,12,14,15,16,17,18,23],period_str:2,perl:[1,4,15,16,17],persist:11,persistent_data:11,pgo:[0,11],phase:[0,11,15,16],phasevol:[0,11,17],photoevapor:[0,11],php:2,physic:[15,16,17],pick:18,piec:[5,17],pinnsonneault:[0,11],pkg:[9,19],place:[0,4,11],placehold:18,plai:[0,11,16],plan:7,planetari:[0,11],plaw2:7,pleas:[0,4,11,15,16,17],plot:[0,11,14,15,16,18],plot_data:[15,16],plot_funct:[9,10],plot_hr_diagram:18,plot_hr_diagram_singl:18,plot_mass:18,plot_orbit:18,plot_system:18,plot_typ:18,pls:5,plt:16,plu:[0,11],pms:18,pms_mass_1:18,pms_mass_2:18,pn_comenv_transition_tim:[0,11],pn_fast_wind:[0,11],pn_fast_wind_dm_agb:[0,11],pn_fast_wind_dm_gb:[0,11],pn_fast_wind_mdot_agb:[0,11],pn_fast_wind_mdot_gb:[0,11],pn_hall_fading_time_algorithm:[0,11],pn_hall_fading_time_algorithm_maximum:[0,11],pn_hall_fading_time_algorithm_minimum:[0,11],pn_resolv:[0,11],pn_resolve_maximum_envelope_mass:[0,11],pn_resolve_minimum_effective_temperatur:[0,11],pn_resolve_minimum_luminos:[0,11],pne:[0,11],pogg:[0,11],point:[0,2,4,5,9,11,19],poisson:[2,7],pol:[0,11],polytrop:[0,11],poor:16,pop:12,pop_macro:12,popul:[0,2,3,5,6,8,9,11,19,21],population_id:7,population_nam:[15,16,17],population_set:5,posit:[0,2,11],possibl:[0,1,2,4,6,9,11,14,19],post:[0,11,12],post_ce_adaptive_menv:[0,11],post_ce_envelope_dm_eagb:[0,11],post_ce_envelope_dm_gb:[0,11],post_ce_envelope_dm_tpagb:[0,11],post_ce_objects_have_envelop:[0,11],post_sn_orbit_bs:0,post_sn_orbit_method:[0,11],post_sn_orbit_tt98:0,postagb_legacy_log:[0,11],postagb_wind_gi:0,postagb_wind_krticka2020:[0,11],postagb_wind_non:[0,11],postagb_wind_use_gi:[0,11],postagbwind:[0,11],potenti:[0,11],power:[0,2,11,16],powerlaw:2,powerlaw_const:2,powerlaw_extrapolation_q:2,ppn_envelope_mass:[0,11],pragma:12,pre:[0,11,18],pre_events_stardata:[0,11],pre_main_sequ:[0,11],pre_main_sequence_fit_lob:[0,11],precis:4,precod:[5,15,16,17],predefin:[2,15,16,17],predict:7,predictor:[0,11],prefer:[0,5,11],prefix:[0,11],prepar:2,prepare_dict:2,prescrib:[0,11],prescript:[0,11,17],prescrit:[0,11],present:[2,4,5,15,16,17],preserv:[0,11],preset:18,pressur:[0,11],prev_stellar_type_1:17,prev_stellar_type_2:17,prevent:[0,7,11],previou:[4,16],previous:[14,17],previous_stardata:[1,12,14,17],primari:[1,2,5,15,16,17,23],pringl:[0,11],print:[4,5,6,7,11,12,13,14,15,16,17],print_help:[4,13],print_info:6,print_option_descript:6,print_structur:4,printf:[1,12,14,15,16,17],prior:[0,11],privat:[5,6,9],prob_dict:2,probability_weighted_mass:7,probabl:[0,1,2,5,6,7,11,12,15,16,17,18],probdist:[5,15,16,17],problem:[0,11],probtot:16,process:[0,4,5,7,11,15,16,17],processor:15,profil:[0,11],progenitor:[0,11,17],program:[9,19],project:[0,11],proper:[6,12],properli:[0,5,11],properti:[0,4,5,7,18],prot1:[0,11],prot2:[0,11],prot3:[0,11],prot4:[0,11],provid:[0,2,5,7,11,17,20],pseudorandom:[0,11],publicli:12,puls:[0,11,23],pump:[0,11],purpos:[7,15,16,17,18],push_macro:12,put:[1,4,5,7,15,16,17,18],py_rinterpol:[9,19],pyenv:[9,11,19],pyplot:16,pysiz:4,pytest:[9,19],python3:[9,11,19],python:[4,11,12,15,16,17],q_high_extrapolation_method:7,q_interpol:2,q_low_extrapolation_method:7,qcrit_bh:[0,11],qcrit_bs:0,qcrit_cheb:[0,11],qcrit_chen_han_formula:0,qcrit_chen_han_t:0,qcrit_cowd:[0,11],qcrit_degenerate_bh:[0,11],qcrit_degenerate_cheb:[0,11],qcrit_degenerate_cowd:[0,11],qcrit_degenerate_eagb:[0,11],qcrit_degenerate_gb:[0,11],qcrit_degenerate_hegb:[0,11],qcrit_degenerate_hehg:[0,11],qcrit_degenerate_hem:[0,11],qcrit_degenerate_hewd:[0,11],qcrit_degenerate_hg:[0,11],qcrit_degenerate_lmm:[0,11],qcrit_degenerate_m:[0,11],qcrit_degenerate_n:[0,11],qcrit_degenerate_onewd:[0,11],qcrit_degenerate_tpagb:[0,11],qcrit_eagb:[0,11],qcrit_gb:[0,11],qcrit_gb_bs:0,qcrit_gb_chen_han_formula:0,qcrit_gb_chen_han_t:0,qcrit_gb_ge2015:0,qcrit_gb_hjellming_webbink:0,qcrit_gb_q_no_comenv:0,qcrit_gb_temmink2021:0,qcrit_gb_vos2018:0,qcrit_ge2015:0,qcrit_hegb:[0,11],qcrit_hehg:[0,11],qcrit_hem:[0,11],qcrit_hewd:[0,11],qcrit_hg:[0,11],qcrit_hjellming_webbink:0,qcrit_lmm:[0,11],qcrit_m:[0,11],qcrit_n:[0,11],qcrit_onewd:[0,11],qcrit_q_no_comenv:0,qcrit_temmink2021:0,qcrit_tpagb:[0,11],qcrit_vos2018:0,qcrits_:[0,11],qcrits_degenerate_:[0,11],qdata:2,qlimit:2,quad:7,quadrat:[0,11],quadrulpl:[0,11],quadrupl:[0,2,7,11],quantiti:18,queri:14,queue:7,quickli:14,quit:[0,4,11],r_l:23,radau:[0,11],radi:[0,11],radiat:[0,11],radii:[0,11,23],radiu:[0,1,11,12,17,18,23],radius_1:18,radius_2:18,ragb:23,raghavan2010_binary_fract:2,raghavan:2,rai:[0,11],railton:[0,11],rais:[0,4,7,11,17],ram:[0,11],ran:[7,15],random:[0,7,11],random_count:14,random_se:[0,11,14],random_skip:[0,11],random_system:[0,11],random_systems_se:[0,11],rang:[0,2,5,7,11,14,15,16,17,21],rapid:[0,11],rapidli:[0,11],rappaport:[0,11],rate:[0,2,11],rather:[0,4,5,7,9,11,12,14,17,19],ratio:[0,2,11,15,16,17,23],raw:[4,5,7,11,18,20],raw_output:4,reach:[0,11],reaction:[0,11],read:[3,4,14,17],real:[5,17],realist:16,realiti:16,realli:[0,5,6,7,11,17],reason:[0,11,16],rebuild:[0,9,11,19],rebuilt:[9,19],recalcul:[0,11],receiv:4,recogn:17,recombin:[0,11],recommend:[1,3],recompil:[9,15,16,17,19],recurs:[4,5],recursive_change_key_to_float:4,recursive_change_key_to_str:4,red:[0,11,16],redhat:1,redshift:2,reduc:[0,11],reduct:7,refer:4,regardless:18,region:[0,11],regist:17,reignit:[0,11],reimer:[0,11],reinstal:[9,19],reject:[0,11],rejects_in_log:[0,11],rejuven:[0,11],rel:[0,11],relat:[0,11],releas:[4,9,19],reliabl:11,remain:[0,11],rememb:16,remesh:[0,11],remnant:[0,11],remov:[0,4,5,9,11,14,17,19],remove_fil:4,renam:[5,16],rename_grid_vari:[5,16],renormalis:2,rentrop:[0,11],repeat:[0,7,11],repo:[9,19],report:[0,11,15,16,17],repositori:3,repres:7,represent:[4,5,17],reproduc:[0,11],requir:[0,2,4,11,14,15,16,17,18,20],res:[15,16],reset:[0,11],reset_pref:[0,11],reset_star:[0,11],reset_stars_default:[0,11],resolut:[0,5,7,11,15,16,17],resolv:[0,11,15],reson:[0,11],resourc:16,respect:[0,2,11],rest:[2,5,17],restructuredtext:4,result:[0,1,2,4,5,7,9,11,14,15,16,17,19],result_arrai:2,result_dict:2,results_dictionari:[15,16],retain:[0,11],rethink:4,return_all_info:5,return_arglin:11,return_binary_c_default:5,return_binary_c_version_info:[4,5,13],return_compilation_dict:1,return_help:11,return_help_al:[4,11],return_maximum_mass_ratio_for_rlof:[11,23],return_minimum_orbit_for_rlof:[11,23],return_persistent_data_memaddr:11,return_population_set:5,return_store_memaddr:11,return_version_info:[4,11],reus:5,revap_in:[0,11],revap_out:[0,11],revers:[0,11,18],reverse_tim:[0,11],revis:[0,4],rewrit:5,rhagavan:7,ri0005:17,rich:[0,11],riello:[0,11],rin:[0,11],ring:[0,11],risk:[5,17],ritter:[0,11],rk2:[0,11],rk4:[0,11],rlof:[0,11,23],rlof_angular_momentum_transfer_model:[0,11],rlof_angular_momentum_transfer_model_bs:0,rlof_angular_momentum_transfer_model_conserv:0,rlof_eccentric_as_circular:[0,11],rlof_entry_threshold:[0,11],rlof_f:[0,11],rlof_interpolation_binary_c:0,rlof_interpolation_bs:0,rlof_interpolation_method:[0,11],rlof_mdot_factor:[0,11],rlof_mdot_modul:[0,11],rlof_method:[0,11],rlof_method_adapt:0,rlof_method_adaptive2:0,rlof_method_bs:0,rlof_method_claei:0,rlof_method_ritt:0,rlof_nonconservative_gamma_donor:0,rlof_nonconservative_gamma_isotrop:0,rlof_radiation_correct:[0,11],rlof_transition_objects_escap:[0,11],rob:[0,2,11,23],robert:[9,19],roch:[0,11,23],roche_lob:23,rochelob:23,rol1:14,rol2:14,room:[5,17],root:[9,19],rotat:[0,2,11],rotation:[0,11],rotationally_enhanced_expon:[0,11],rotationally_enhanced_mass_loss:[0,11],rotationally_enhanced_massloss:[0,11],rotationally_enhanced_massloss_angmom:0,rotationally_enhanced_massloss_langer_formula:[0,11],rotationally_enhanced_massloss_langer_formula_and_angmom:0,rotationally_enhanced_massloss_non:0,rout:[0,11],routin:[0,3,5,9,11,18],row:[14,18],rring:[0,11],rssd:2,rst:[4,6],rsun:18,rubric:5,run:[0,1,3,4,5,7,9,11,15,16,19,20],run_popul:11,run_system:[11,12,13,14,18,20],run_system_wrapp:[9,10,12,14],run_wrapp:3,run_zero_probability_system:7,runtim:[1,7],russel:[0,11],rzam:23,s_option:7,safe:17,sai:[0,11],said:[0,11],same:[0,4,7,9,11,14,19],sampl:[0,2,3,5,9,11,15,17,21],sample_valu:2,sampler:9,sana12:[2,15,17],sana:2,save:[0,1,2,11,12,15,16,17],save_pre_events_stardata:[0,11],scalar:4,scalo:2,scanf:0,scheme:[0,11],schneider:[0,11],schroeder:[0,11],script:[3,9,12,19],sdb:[0,11],sdist:[9,19],sdo:[0,11],seaborn:[15,16],search:[9,15],second:[0,2,4,5,11,18],secondari:[2,15,23],section:[2,4,8,9,11,17,19],see:[0,5,9,11,12,13,14,15,16,17,18,19],seed:[0,11],seem:[9,18,19],seen:4,segment:21,seitenzahl2013_model:[0,11],seitenzahl:[0,11],select:[0,4,11,14,15],selected_head:4,selector:[0,11],self:[5,7,14,15,16,17],semi:[0,11],sent:[0,11],sentenc:1,sep:[0,2,5,14,15,17,23],sep_max:[15,17],sep_min:[15,17],separ:[0,2,4,5,6,11,12,14,17,18,23],separation_quadrupl:[0,11],separation_tripl:[0,11],separta:[0,11],seper:17,sequenc:[0,11,12,15,16],seri:[0,11],serialis:[4,5],serv:4,server:5,set:[0,1,2,3,4,5,6,7,9,12,13,14,18,19],set_moe_di_stefano_set:5,set_opt:2,set_xlabel:[15,16],set_ylabel:[15,16],setup:[9,17,19,20],sever:[6,7,13,17,18,20],sfh:2,shara:[0,11],share:[1,7,14,20],shared_lib_filenam:12,shell:[0,11],shellular:[0,11],shorten:[0,11],should:[0,1,2,4,5,6,7,9,11,14,15,16,17,18,19,20],shouldn:[0,4,11],show:[0,3,7,11,14,15,16,17,18],show_plot:18,show_stellar_typ:18,shown:[0,11,18],shrinkagb:14,side:[15,16,17],siess:[0,11],sigma:2,signal:15,silent:4,sill:[0,11],simpl:15,simplest:14,simpli:[0,11,16],simul:[0,1,11,12,15,16,17],simulation_:5,sinc:[4,18],singl:[0,2,3,5,7,11,15,16,17,18],single_star_lifetim:[11,12,14],sit:[0,11],site:11,situat:11,size:[4,7,15,16],skip:[0,4,7,9,11,15,19],skipkei:4,slightli:11,slope:2,slow:[0,11,15,16],slower:[0,11],slurm:[5,7,8],slurm_grid:5,small:[0,11,16],small_envelope_method:[0,11],small_envelope_method_bs:0,small_envelope_method_miller_bertolami:0,smaller:[0,11],smarter:16,smooth:16,smoother:16,sn_impulse_liu2015:0,sn_impulse_non:0,sn_impulse_wheeler1975:0,sn_kick_companion_a:[0,11],sn_kick_companion_aic_bh:[0,11],sn_kick_companion_bh_bh:[0,11],sn_kick_companion_bh_n:[0,11],sn_kick_companion_ecap:[0,11],sn_kick_companion_grb_collapsar:[0,11],sn_kick_companion_hestaria:[0,11],sn_kick_companion_ia_chand:[0,11],sn_kick_companion_ia_chand_co:[0,11],sn_kick_companion_ia_eld:[0,11],sn_kick_companion_ia_h:[0,11],sn_kick_companion_ia_he_co:[0,11],sn_kick_companion_ia_hybrid_hecowd:[0,11],sn_kick_companion_ia_hybrid_hecowd_sublumin:[0,11],sn_kick_companion_ibc:[0,11],sn_kick_companion_ii:[0,11],sn_kick_companion_iia:[0,11],sn_kick_companion_ns_n:[0,11],sn_kick_companion_tz:[0,11],sn_kick_companion_wdkick:[0,11],sn_kick_dispersion_aic_bh:[0,11],sn_kick_dispersion_bh_bh:[0,11],sn_kick_dispersion_bh_n:[0,11],sn_kick_dispersion_ecap:[0,11],sn_kick_dispersion_grb_collapsar:[0,11],sn_kick_dispersion_ia_hybrid_hecowd:[0,11],sn_kick_dispersion_ia_hybrid_hecowd_sublumin:[0,11],sn_kick_dispersion_ibc:[0,11],sn_kick_dispersion_ii:[0,11],sn_kick_dispersion_ns_n:[0,11],sn_kick_dispersion_tz:[0,11],sn_kick_distribution_aic_bh:[0,11],sn_kick_distribution_bh_bh:[0,11],sn_kick_distribution_bh_n:[0,11],sn_kick_distribution_ecap:[0,11],sn_kick_distribution_grb_collapsar:[0,11],sn_kick_distribution_ia_hybrid_hecowd:[0,11],sn_kick_distribution_ia_hybrid_hecowd_sublumin:[0,11],sn_kick_distribution_ibc:[0,11],sn_kick_distribution_ii:[0,11],sn_kick_distribution_ns_n:[0,11],sn_kick_distribution_tz:[0,11],sn_none:12,sn_type:12,sneia:[0,11],snia:[0,11],snippet:[11,14],sns:[15,16],solar:[0,2,11,13,23],solver:[0,11],solver_forward_eul:0,solver_predictor_corrector:0,solver_rk2:0,solver_rk4:0,some:[0,1,2,5,7,9,11,12,13,14,15,16,17,18,19],someth:[0,5,11,14,15,16],sometim:13,somewhat:[15,16,17],soon:21,sort:[4,15,16],sort_kei:4,sourc:[1,2,4,5,6,7,10,18,20,21,23],source_file_filenam:7,source_list:5,sourcecod:[9,11,12,19],sourcefile_nam:1,space:[0,5,11,15,16,17,21],spacing_funct:[9,10],spacingfunc:[5,15,16,17],spacingfunct:[5,17],special:[0,11,17],specif:[0,4,11,13,14,18],specifi:[0,7,11],spectral:2,speed:[0,7,11],speedtest:[0,11],spent:4,spera:[0,11],spheric:[0,11],spiki:16,spin:[0,11],spinrat:[0,11],split:[0,7,11,14,17],split_lin:14,splitlin:[11,12,14,15,16,17],splitpoint:[0,11],spread:5,sqrt:[0,11],src:[0,9,11,12,19],stabil:[0,11],stabl:[0,11],stancliff:[0,11],standard:[0,2,11,15,16],star:[1,2,7,9,11,12,13,14,15,16,17,18,23],star_with_no_mass:0,starcount:[15,16,17],stardata:[0,1,11,12,14,15,16,17],stardata_dump_filenam:[0,11],stardata_load_filenam:[0,11],stardata_t:12,starnum:15,start:[0,1,4,5,6,7,11,14,15,16,17],start_tim:[0,11],start_timestamp:[15,16,17],startrack:[0,11],startswith:14,state:[0,11],statement:[1,12,14,15,16,17],statist:[0,11],statu:[0,1,11,15,16,17],stderr:[0,11],stdout:4,steadi:[0,11],stefan:18,stefano:[4,5,9,17],stellar:[0,2,3,7,9,11,18,22],stellar_structure_algorithm:[0,11],stellar_structure_algorithm_external_funct:0,stellar_structure_algorithm_mint:0,stellar_structure_algorithm_modified_bs:0,stellar_structure_algorithm_non:0,stellar_typ:[1,9,10,12,14,15,16,17,18],stellar_type_1:[0,11,17,18],stellar_type_2:[0,11,17,18],stellar_type_3:[0,11],stellar_type_4:[0,11],stellar_type_dict:22,stellar_type_dict_short:22,step:[4,5,12,14,15,16,17,18,21],stepsiz:[5,17],stick:7,stiff:[0,11],still:[1,7,12],stop:[0,4,11,15],stopfil:[0,11],storag:[0,11],store:[0,2,3,4,5,7,9,14,15,16,17,19,23],store_capsul:11,store_memaddr:[11,23],str:[1,4,5,6,17,18],straight:5,straightforward:[15,16,17],straniero:[0,11],strength:[0,11],strict:4,strictli:[15,16],string:[0,1,3,4,5,6,7,11,13,14,15,16,17,18,20],strip:[0,11,14],stronger:[0,11],struct:[0,11,12],structur:[0,4,7,11,18],stuff:[4,7,14,17,18],style:[0,5,11],sub:[0,4,11],subdict:4,subject:[0,11],sublumin:[0,11],submit:9,subroutin:8,subsequ:[0,11],subtract:4,subtract_dict:4,succe:[0,11],suggest:[0,9,11,19],suit:[9,19],sum:[0,11],sundial:[0,11],supercrit:[0,11],supernova:[0,7,11],superwind:[0,11],superwind_mira_switchon:[0,11],sure:[2,5,7,9,14,15,16,17,18,19,20],surfac:[0,11],surrei:17,surviv:[0,11],survivor:[0,11],switcher:[0,11],symmetr:[0,11],synchron:[0,11],synonym:[0,11],synthesi:[7,9,15,16,17,19],system:[0,3,4,5,7,9,11,12,15,16,17,18,19,20],system_gener:[5,17],system_numb:5,system_queue_fil:15,tabl:[0,2,11],take:[0,2,4,5,7,11,15,17,20],taken:[0,4,11,12],tar:[9,19],target:[1,6],task:[0,2,4,5,6,8,11,17,18,20,21,23],tauri:[0,11],tbse:[0,11],technic:[12,15,16,17],teff:[0,2,11],teff_1:18,teff_2:18,teff_postagb_max:[0,11],teff_postagb_min:[0,11],tell:4,temp_dir:[4,14,16,17],temperatur:[0,2,11,18],termin:[1,9,12,17,19],test:[0,4,5,7,9,11,14,17,19,23],test_data:[0,11],test_func:11,test_logfil:14,test_pop:17,text:[4,6],than:[0,2,4,7,9,11,16,17,19],thats:17,thei:[0,2,4,5,7,11,15,17,18],thelog:[0,11],them:[2,4,5,11,17],themselv:[2,4],theoret:[15,16],thermal:[0,2,11,23],thermally_pulsing_asymptotic_giant_branch:0,thermohalin:[0,11],thesi:[0,11],thi:[0,1,2,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19,20,21,23],thick:[0,11],thick_disc_end_ag:[0,11],thick_disc_logg_max:[0,11],thick_disc_logg_min:[0,11],thick_disc_start_ag:[0,11],thin:[0,11],thing:[0,2,4,5,6,11,15,16,17,20],think:[0,4,5,11],third:[0,2,11],third_dup:[0,11],third_dup_multipli:[0,11],thorn:[0,11],those:[4,5,9,15,16,17,19],thread:[5,7,15,16],thread_id:7,three:[0,2,11,16,17],three_part_powerlaw:[2,15,16,17],threshold:[0,4,7,11],through:[5,11,14,15,16,17,18,20],throughout:[5,15,16,17],tidal:[0,11],tidal_strength_factor:[0,11],tide:[0,11],tides_convective_damp:[0,11],tides_hurley2002:[0,11],tides_zahn1989:[0,11],time:[0,1,2,4,5,7,9,11,12,14,15,16,17,18,19],timescal:[0,11],timestamp:7,timestep:[0,11,12,14,15,16],timestep_limit:[0,11],timestep_log:[0,11],timestep_modul:[0,11],timestep_multipli:[0,11],timestep_solver_factor:[0,11],tinslei:2,titl:[6,15],tmp:[0,4,9,11,14,15,16,17,19],tmp_dir:[5,7,14,16,17],tmp_tabl:2,todo:[0,1,2,4,5,6,7,11,13,17,18,20,21,23],toler:[0,11],too:[0,4,7,9,11,16,19,20],took:[15,16,17],top:17,topic:[0,11],torqu:[0,11],total:[0,2,4,5,7,11,15,16,17,18],total_count:[15,16,17],total_mass_run:[15,16,17],total_prob:[15,16,17],total_probability_weighted_mass_run:[15,16,17],tout:[0,11,23],tout_pringle_1992_multipli:[0,11],tpagb:[0,11],tpagb_reimers_eta:[0,11],tpagb_wind_beasor_etal_2020:0,tpagb_wind_bloeck:0,tpagb_wind_goldman_etal_2017:0,tpagb_wind_mattsson:0,tpagb_wind_reim:0,tpagb_wind_rob_cwind:0,tpagb_wind_van_loon:0,tpagb_wind_vw93_karaka:0,tpagb_wind_vw93_karakas_carbon_star:0,tpagb_wind_vw93_orig:0,tpagb_wind_vw93_orig_carbon_star:0,tpagbwind:[0,11],tpagbwindfac:[0,11],tpr:15,traceback:4,track:[7,18],trade:[0,11],transfer:[0,11],transform:[0,4,11],transit:[0,11],treat:[0,11],trigger:[0,11],trio:[15,16,17],tripl:[0,2,7,11],truli:[0,11],tupl:1,turn:[0,4,11,14,17],two:[0,4,11,12,22,23],txt:[5,14,17,20],type:[0,1,2,4,5,6,7,11,14,15,16,17,18,21,22,23],type_chng:14,type_ia_mch_supernova_algorithm:[0,11],type_ia_mch_supernova_algorithm_dd2:0,type_ia_mch_supernova_algorithm_seitenzahl2013:0,type_ia_mch_supernova_algorithm_seitenzahl2013_automat:0,type_ia_sub_mch_supernova_algorithm:[0,11],type_ia_sub_mch_supernova_algorithm_livne_arnett_1995:0,typic:[0,11],ubvri:[0,11],ugriv:[0,11],unavail:[0,11],uncom:[5,14,15,16,17],unction:11,undef:12,under:[14,21],undescrib:6,uniform:2,uninstal:[9,19],union:[2,4,5,17,21,23],uniqu:[4,5,7,17],unit:[0,11,13,23],univari:[0,11],unix:5,unknown:20,unless:[1,5,7],unlik:16,unload:5,unpars:11,unrecogn:[9,19],unresolv:15,unsign:0,unstabl:[0,11],until:[0,2,4,11],unus:[0,7,11],unweight:17,updat:[2,4,5,9,16,17,19],update_dict:[4,13],update_grid_vari:[5,16],upper:[0,2,11,21],usag:[0,3],use:[0,2,3,4,5,7,8,9,11,12,13,14,15,17,18,19,20],use_astropy_valu:18,use_datadir:[5,17],use_fixed_timestep_:[0,11],use_periastron_roche_radiu:[0,11],use_tabular_intershell_abundances_karakas_2012:[0,11],usecas:3,used:[0,1,2,4,5,7,11,12,13,14,15,16,17,18],useful:[0,4,5,7,9,11,13,14,15,16,17,19,20,23],useful_func:[9,10],user:[1,2,4,5,6,7,12,20],uses:[0,7,11,12,17],using:[0,1,5,9,12,13,14,15,16,19],usual:[0,2,4,7,11,15,16,17],util:[1,2,4,5,6,11,12,13,14,15,16,17,18,20,21,23],val:2,valid:[0,2,4,11,12],valu:[0,1,2,4,5,6,7,11,13,14,15,16,17,18],value_lin:14,valueerror:17,valuerang:[5,15,16,17],values_arrai:14,van:[0,11],vandenheuvel_log:[0,11],vari:[0,11,17],variabl:[0,3,4,5,7,11],variant:[0,11],variou:[0,11],vassiliadi:[0,11],vb1print:5,veloc:[0,2,11],venv:[9,19],verbos:[1,2,4,5,7,9,14,15,16,17,19],verbose_print:4,veri:[0,5,11,12,14,16,17,21],versa:23,version:[0,4,5,9,11,13,17,19],version_info:4,version_info_dict:13,version_info_str:4,version_onli:[0,11],via:[3,5,7,11,12,15,16,17,18],vice:23,vink:[0,11],virtual:[9,19],virtualenviron:[9,19],viscos:[0,11],viscou:[0,11],visibl:12,visit:9,volum:[0,11],vrot1:[0,11],vrot2:[0,11],vrot3:[0,11],vrot4:[0,11],vrot_breakup:0,vrot_bs:0,vrot_non_rot:0,vrot_sync:0,vw93:[0,11],vw93_eagb_wind_spe:[0,11],vw93_mira_shift:[0,11],vw93_multipli:[0,11],vw93_tpagb_wind_spe:[0,11],vwind:[0,11],vwind_beta:[0,11],vwind_multipli:[0,11],wai:[0,4,5,7,11,14,16,18],wang:[0,11],want:[0,2,4,5,6,7,11,12,13,15,16,17,18],warmup_cpu:[0,11],warn:[0,11,14,17],wast:16,wave:[0,11,17],wd_accretion_rate_new_giant_envelope_lower_limit_helium_donor:[0,11],wd_accretion_rate_new_giant_envelope_lower_limit_hydrogen_donor:[0,11],wd_accretion_rate_new_giant_envelope_lower_limit_other_donor:[0,11],wd_accretion_rate_novae_upper_limit_helium_donor:[0,11],wd_accretion_rate_novae_upper_limit_hydrogen_donor:[0,11],wd_accretion_rate_novae_upper_limit_other_donor:[0,11],wd_kick:[0,11],wd_kick_at_every_puls:0,wd_kick_at_given_puls:0,wd_kick_direct:[0,11],wd_kick_end_agb:0,wd_kick_first_rlof:0,wd_kick_pulse_numb:[0,11],wd_kick_when:[0,11],wd_sigma:[0,11],wdwd_merger_algorithm:[0,11],wdwd_merger_algorithm_bs:0,wdwd_merger_algorithm_chen2016:0,wdwd_merger_algorithm_perets2019:0,web:[15,16],weight:[0,7,11,16],well:[0,4,7,9,11,12,14,15,16,19],went:16,were:[4,15,16,17],what:[0,1,2,4,6,7,9,11,12,14,15,16,17,19,20],whatev:[0,5,9,11,12,19],wheeler:[0,11],when:[0,1,2,4,5,6,7,9,11,13,14,17,19,20],whenev:[9,19],where:[0,1,2,4,5,6,7,9,11,15,16,17,19],whether:[0,2,4,5,6,7,11,13,17,18,23],which:[0,1,2,4,5,6,7,9,11,12,13,14,15,16,17,19,20,23],whichev:7,white:[0,11],white_dwarf_cooling_carrasco2014:[0,11],white_dwarf_cooling_mestel:[0,11],white_dwarf_cooling_mestel_modifi:[0,11],white_dwarf_cooling_model:[0,11],white_dwarf_radius_carrasco2014:[0,11],white_dwarf_radius_model:[0,11],white_dwarf_radius_mu:[0,11],white_dwarf_radius_nauenberg1972:[0,11],whole:[0,5,7,11,12],wide:[15,16],width:[0,11],wiggl:16,wind:[0,11],wind_algorithm_binary_c_2020:0,wind_algorithm_hurley2002:0,wind_algorithm_non:0,wind_algorithm_schneider2018:0,wind_angmom_loss_bs:0,wind_angmom_loss_lw:0,wind_angmom_loss_lw_hybrid:0,wind_angmom_loss_spherically_symmetr:0,wind_angular_momentum_loss:[0,11],wind_disc_angmom_fract:[0,11],wind_disc_mass_fract:[0,11],wind_djorb_fac:[0,11],wind_gas_to_dust_ratio:[0,11],wind_lbv_luminosity_lower_limit:[0,11],wind_mass_loss:[0,11],wind_multiplier_:[0,11],wind_nieuwenhuijzen_luminosity_lower_limit:[0,11],wind_type_multiplier_:[0,11],within:[0,4,5,9,11,12,13,17,19],without:[2,4,5,7,12,14,16],won:[0,11,14],wood:[0,11],work:[0,4,5,9,11,12,14,15,16,18,19],would:[0,4,11,16,17,18],wouldn:[5,17],wr_wind:[0,11],wr_wind_bs:0,wr_wind_eldridg:0,wr_wind_fac:[0,11],wr_wind_maeder_meynet:0,wr_wind_nugis_lam:0,wrap:[1,12],wrapper:[4,11,12,14,23],write:[1,4,5,6,7,11,12,14,15,17,20],write_binary_c_calls_to_fil:[5,17],write_binary_c_parameter_descriptions_to_rst_fil:4,write_grid_options_to_rst_fil:6,write_logfil:11,written:[5,6,7,11,14,17,20],written_data:14,wrlof_mass_transf:[0,11],wrlof_method:[0,11],wrlof_non:0,wrlof_q_depend:0,wrlof_quadrat:0,wrong:[9,16,19],wrwindfac:[0,11],wtts2:[0,11],wtts_log:[0,11],www:[0,2,11],x86_64:11,year:[0,2,11],yet:[0,4,5,7,11,18],yield:[0,11],you:[0,1,4,5,6,7,9,11,12,14,15,16,17,18,19,23],young:[0,11],your:[7,9,12,14,19],yourself:[15,16,17,18],yscale:[15,16],zahn:[0,11],zam:[0,2,3,11,15,20,23],zams_collis:23,zams_mass:[15,16,17],zams_mass_1:17,zams_mass_2:17,zero:[0,1,3,4,7,9,11],zero_ag:[12,14,15,16,17],zero_age_main_sequence_star:[15,16],zero_age_main_sequence_starn:15,zero_prob_stars_skip:[15,16,17],zone:[0,11],zoom:[0,11],zoomfac_multiplier_decreas:[0,11],zoomfac_multiplier_increas:[0,11],zsolar:2,zytkow:[0,11]},titles:["Binary_c parameters","custom_logging_functions module","distribution_functions module","Example notebooks","functions module","grid_class module","Grid options and descriptions","Population grid code options","hpc_functions module","Welcome to binary_c-python\u2019s documentation!","Binarycpython code","Using the API functionality of binarycpython","Using custom logging routines with binarycpython","Extra features and functionality of binarycpython","Running individual systems with binarycpython","Zero-age stellar luminosity function in binaries","Example use case: Zero-age stellar luminosity function","Running populations with binarycpython","plot_functions module","Python module for binary_c","run_system_wrapper module","spacing_functions module","stellar_types module","useful_funcs module"],titleterms:{"case":16,"function":[4,11,13,14,15,16,17],"public":7,Adding:[15,16,17],Using:[11,12],about:13,after:[9,19],age:[15,16],algorithm:0,api:[11,12,14],better:16,binari:[0,15],binary_c:[0,9,11,13,19],binarycpython:[10,11,12,13,14,17],build:[9,13,19],code:[7,10],compact:12,custom:12,custom_logging_funct:1,descript:6,dictionari:13,directli:12,distribut:16,distribution_funct:2,document:[9,19],environ:[9,19],evolut:12,evolv:[15,16,17],exampl:[3,9,11,12,13,16,17,19],extra:13,faq:[9,19],featur:13,free:11,from:[9,11,12,19],full:17,get:[11,13],grid:[6,7,15,16,17],grid_class:5,handl:[15,16,17],help:13,hpc_function:8,indic:9,individu:14,inform:[11,13],initi:16,input:0,instal:[9,19],instruct:[9,19],issu:[9,19],log:[12,15,16,17],luminos:[15,16],mass:[12,16],misc:0,modif:13,modul:[1,2,4,5,8,9,18,19,20,21,22,23],moe:7,note:[9,19],notebook:3,noteworthi:17,nucsyn:0,object:[12,14,15,16,17],option:[6,7],output:[0,15,16,17],paramet:[0,13],pars:13,pip:[9,19],plot_funct:18,popul:[7,12,14,15,16,17],privat:7,python:[9,19],requir:[9,19],routin:12,run:[12,14,17],run_system_wrapp:20,run_wrapp:14,sampl:16,sampler:7,script:17,section:0,set:[11,15,16,17],singl:14,sourc:[9,19],spacing_funct:21,star:0,stefano:7,stellar:[15,16],stellar_typ:22,store:11,string:12,supernova:12,system:14,tabl:9,usag:[9,11,12,19],use:16,useful_func:23,using:11,variabl:[9,15,16,17,19],via:[9,14,19],welcom:9,when:12,zam:16,zero:[15,16]}}) \ No newline at end of file diff --git a/docs/build/html/spacing_functions.html b/docs/build/html/spacing_functions.html index f9d19b5a8e9e69d49402301f9a341bad1e041ea8..4af76623c38a4fa12fb9e268566bc8c9d47464c7 100644 --- a/docs/build/html/spacing_functions.html +++ b/docs/build/html/spacing_functions.html @@ -262,9 +262,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/stellar_types.html b/docs/build/html/stellar_types.html index c10033199ab225def092f818d74765b9e9a952e7..0bf1079a84d06d05a2bd96a20a03b1baffadc899 100644 --- a/docs/build/html/stellar_types.html +++ b/docs/build/html/stellar_types.html @@ -243,9 +243,9 @@ provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/build/html/useful_funcs.html b/docs/build/html/useful_funcs.html index c2e0dcaca2dd636d72847c8bc6b096160a9eac19..8c504966e14e38e382855c47c1a8780de18ec540 100644 --- a/docs/build/html/useful_funcs.html +++ b/docs/build/html/useful_funcs.html @@ -441,9 +441,9 @@ determine if two stars collide on the ZAMS</p> provided by <a href="https://readthedocs.org">Read the Docs</a>. <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. diff --git a/docs/source/_templates/footer.html b/docs/source/_templates/footer.html index 614d6567ddc50965e7c33fe1117c275bf69b8b88..e9fe70c02ba41f9030f1188b4fb8fba1c401a145 100644 --- a/docs/source/_templates/footer.html +++ b/docs/source/_templates/footer.html @@ -2,8 +2,8 @@ {%- block extrafooter %} <br><br> -Generated on binarycpython git branch: master git revision cac51a6dc71daeeb943b70d5598350ab43901299 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. +Generated on binarycpython git branch: master git revision 9af65282f7f847c8638c85a39f03c803b635e442 url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/master">git url</a>. <br><br> -Using binary_c with bit branch branch_david: git revision: "6162:20210825:093caf0e9" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. +Using binary_c with bit branch newmaster: git revision: "6185:20210910:1621c23a5" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/newmaster">git url</a>. {% endblock %} \ No newline at end of file diff --git a/docs/source/binary_c_parameters.rst b/docs/source/binary_c_parameters.rst index 9d05193ac3eee376842356a9aea21ccba0d96899..cdce51580c9e3478b29c356fadc3e11bb84ac62b 100644 --- a/docs/source/binary_c_parameters.rst +++ b/docs/source/binary_c_parameters.rst @@ -4,7 +4,7 @@ The following chapter contains all the parameters that the current version of bi This information was obtained by the following binary_c build: - **binary_c git branch**: branch_david **binary_c git revision**: 6162:20210825:093caf0e9 **Built on**: Aug 25 2021 18:02:39 + **binary_c git branch**: newmaster **binary_c git revision**: 6185:20210910:1621c23a5 **Built on**: Sep 10 2021 15:05:46 Section: stars @@ -424,6 +424,11 @@ Section: stars | **Parameter input type**: Float(scanf) | **Default value**: NULL +| **Parameter**: artificial_mass_accretion_rate_by_stellar_type%d +| **Description**: Constant mass accretion rate for stellar type <n>. +| **Parameter input type**: Float(scanf) +| **Default value**: NULL + | **Parameter**: artificial_angular_momentum_accretion_rate%d | **Description**: Constant angular momentum accretion for star <n>. | **Parameter input type**: Float(scanf) @@ -468,13 +473,6 @@ Section: stars | **Default value**: 0 | **Macros**: ['BH_HURLEY2002 = 0', 'BH_BELCZYNSKI = 1', 'BH_SPERA2015 = 2', 'BH_FRYER12_DELAYED = 3', 'BH_FRYER12_RAPID = 4', 'BH_FRYER12_STARTRACK = 5'] -| **Parameter**: PPISN_prescription -| **Description**: (Pulsational) Pair-Instability Supernova prescription: Relates initial helium core mass of star to whether the star undergoes PPISN or PISN. Requires PPISN flag to be True (see binary_c_parameters.h). 0=no ppisn, 1=Farmer et al 2019. -| **Parameter input type**: Integer -| **Default value**: 1 -| **Macros**: ['PPISN_NONE = 0', 'PPISN_FARMER19 = 1'] -| **Extra**: Ignore - | **Parameter**: sn_kick_distribution_II | **Description**: Set the distribution of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). | **Parameter input type**: Integer @@ -502,7 +500,7 @@ Section: stars | **Parameter**: sn_kick_distribution_GRB_COLLAPSAR | **Description**: Set the distribution of speeds applied to kick newly-born neutron stars and black holes after a type Ib/c core-collapse supernova which is also a collapsar. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). | **Parameter input type**: Integer -| **Default value**: 0 +| **Default value**: 1 | **Macros**: ['KICK_VELOCITY_FIXED = 0', 'KICK_VELOCITY_MAXWELLIAN = 1', 'KICK_VELOCITY_CUSTOM = 2'] | **Parameter**: sn_kick_distribution_TZ @@ -541,24 +539,6 @@ Section: stars | **Default value**: 0 | **Macros**: ['KICK_VELOCITY_FIXED = 0', 'KICK_VELOCITY_MAXWELLIAN = 1', 'KICK_VELOCITY_CUSTOM = 2'] -| **Parameter**: sn_kick_distribution_PPISN -| **Description**: Set the distribution of speeds applied to PPISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). -| **Parameter input type**: Integer -| **Default value**: 1 -| **Macros**: ['KICK_VELOCITY_FIXED = 0', 'KICK_VELOCITY_MAXWELLIAN = 1', 'KICK_VELOCITY_CUSTOM = 2'] - -| **Parameter**: sn_kick_distribution_PISN -| **Description**: Set the distribution of speeds applied to PISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). -| **Parameter input type**: Integer -| **Default value**: 0 -| **Macros**: ['KICK_VELOCITY_FIXED = 0', 'KICK_VELOCITY_MAXWELLIAN = 1', 'KICK_VELOCITY_CUSTOM = 2'] - -| **Parameter**: sn_kick_distribution_PHDIS -| **Description**: Set the distribution of speeds applied to PHDIS supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). -| **Parameter input type**: Integer -| **Default value**: 0 -| **Macros**: ['KICK_VELOCITY_FIXED = 0', 'KICK_VELOCITY_MAXWELLIAN = 1', 'KICK_VELOCITY_CUSTOM = 2'] - | **Parameter**: sn_kick_dispersion_II | **Description**: Set the dispersion of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). | **Parameter input type**: Float @@ -582,7 +562,7 @@ Section: stars | **Parameter**: sn_kick_dispersion_GRB_COLLAPSAR | **Description**: Set the dispersion of speeds applied to kick newly-born neutron stars and black holes after a type Ib/c core-collapse supernova which is also a collapsar. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). | **Parameter input type**: Float -| **Default value**: 0 +| **Default value**: 190 | **Parameter**: sn_kick_dispersion_TZ | **Description**: Set the dispersion of speeds applied to kick newly-born neutron stars and black holes at the death of a Thorne-Zytkow object. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). @@ -614,21 +594,6 @@ Section: stars | **Parameter input type**: Float | **Default value**: 0 -| **Parameter**: sn_kick_dispersion_PPISN -| **Description**: Set the dispersion of speeds applied to the survivor of a PPISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). -| **Parameter input type**: Float -| **Default value**: 190 - -| **Parameter**: sn_kick_dispersion_PISN -| **Description**: Set the dispersion of speeds applied to the survivor of a PISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). -| **Parameter input type**: Float -| **Default value**: 0 - -| **Parameter**: sn_kick_dispersion_PHDIS -| **Description**: Set the dispersion of speeds applied to the survivor of a PHDIS supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). -| **Parameter input type**: Float -| **Default value**: 0 - | **Parameter**: sn_kick_companion_IA_He | **Description**: Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia He supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. | **Parameter input type**: Float @@ -749,24 +714,6 @@ Section: stars | **Default value**: 0 | **Macros**: ['SN_IMPULSE_NONE = 0', 'SN_IMPULSE_LIU2015 = 1', 'SN_IMPULSE_WHEELER1975 = 2'] -| **Parameter**: sn_kick_companion_PPISN -| **Description**: Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PPISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. -| **Parameter input type**: Float -| **Default value**: 0 -| **Macros**: ['SN_IMPULSE_NONE = 0', 'SN_IMPULSE_LIU2015 = 1', 'SN_IMPULSE_WHEELER1975 = 2'] - -| **Parameter**: sn_kick_companion_PISN -| **Description**: Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. -| **Parameter input type**: Float -| **Default value**: 0 -| **Macros**: ['SN_IMPULSE_NONE = 0', 'SN_IMPULSE_LIU2015 = 1', 'SN_IMPULSE_WHEELER1975 = 2'] - -| **Parameter**: sn_kick_companion_PHDIS -| **Description**: Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PHDIS supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. -| **Parameter input type**: Float -| **Default value**: 0 -| **Macros**: ['SN_IMPULSE_NONE = 0', 'SN_IMPULSE_LIU2015 = 1', 'SN_IMPULSE_WHEELER1975 = 2'] - | **Parameter**: wd_sigma | **Description**: Set the speed at which white dwarfs are kicked when they form, in km/s. Default is zero (i.e. no kick). Requires WD_KICKS. | **Parameter input type**: Float @@ -827,22 +774,22 @@ Section: stars | **Parameter**: delta_mcmin | **Description**: A parameter to reduce the minimum core mass for third dredge up to occur on the TPAGB. As used by Izzard and Tout (2004) to increase the amount of dredge up, hence carbon, in Magellanic cloud stars. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 0 | **Parameter**: lambda_min | **Description**: A parameter to increase the efficiency of third dredge up on the TPAGB. The efficiency is lambda * lambda_mult, and setting lambda_min>0 implies that, once Mc>Mcmin (see delta_mcmin) lambda=Max(lambda(fit to Karakas), lambda_min). As used by Izzard and Tout (2004) to increase the amount of dredge up, hence carbon, in Magellanic cloud stars. See also lambda_multiplier. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 0 | **Parameter**: lambda_multiplier | **Description**: A parameter to increase the efficiency of third dredge up on the TPAGB. The efficiency is lambda * lambda_mult, and setting lambda_min>0 implies that, once Mc>Mcmin (see delta_mcmin) lambda=Max(lambda(fit to Karakas), lambda_min). As used by Izzard and Tout (2004) to increase the amount of dredge up, hence carbon, in Magellanic cloud stars. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 1 | **Parameter**: minimum_envelope_mass_for_third_dredgeup | **Description**: The minimum envelope mass for third dredge up on the TPAGB. Early, solar metallicity models by Straniero et al suggested 0.5Msun is typical. However, circumstantial evidence (Izzard et al 2009) as well as newer models by Stancliffe and Karakas suggest that at low metallicity a value nearer zero is more appropriate. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 0.5 | **Parameter**: mass_of_pmz | **Description**: The mass in the partial mixing zone of a TPAGB star, using the Karakas 2012 tables. Ask Carlo Abate for more details, or see the series of papers Abate et al 2012, 2013, 2014. Requires NUCSYN and USE_TABULAR_INTERSHELL_ABUNDANCES_KARAKAS_2012. @@ -852,12 +799,12 @@ Section: stars | **Parameter**: c13_eff | **Description**: The "efficiency" of partial mixing in a TPAGB star intershell region, when using the s-process tables of Gallino, Busso, Lugaro et al. as provided by Maria Lugaro for the Izzard et al. 2009 paper. Requires NUCSYN and NUCSYN_S_PROCESS. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 1 | **Parameter**: mc13_pocket_multiplier | **Description**: Multiplies the mass in the partial mixing zone of a TPAGB star, when using the s-process tables of Gallino, Busso, Lugaro et al. as provided by Maria Lugaro for the Izzard et al. 2009 paper. Requires NUCSYN and NUCSYN_S_PROCESS. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 1 | **Parameter**: tides_convective_damping | **Description**: Tidal convective damping algorithm. 0=TIDES_HURLEY2002 Zahn 197x timescales + Hut, as in Hurley et al (2002), 1 = TIDES_ZAHN1989: Zahn 1989 lambdas + Hut. @@ -879,7 +826,7 @@ Section: stars | **Parameter**: hbbtfac | **Description**: A parameter to modulate the temperature at the base of the hot-bottom burning zone in TPAGB stars. (Works only if NUCSYN is defined) | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 1 | **Parameter**: wind_multiplier_%d | **Description**: Wind multiplier for the stellar type specified by the intger %d. By default these are all 1.0. @@ -951,7 +898,7 @@ Section: stars | **Parameter**: MINT_metallicity | **Description**: This sets the metallicity for MINT. It is ignored if set to -1.0, the default, in which case the normal metallicity parameter is used. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: -1 | **Parameter**: gaia_Teff_binwidth | **Description**: log10(Effective temperature) bin width used to make Gaia-like HRDs @@ -978,25 +925,25 @@ Section: stars | **Parameter**: AGB_core_algorithm | **Description**: Algorithm to use for calculating AGB core masses. 0=Hurley et al. 2002 if no NUCSYN, Karakas 2002 if NUCSYN is defined; 1=Hurley et al. 2002 (overshooting models); 1=Karakas 2002 (non-overshooting models). | **Parameter input type**: Integer -| **Default value**: 1 +| **Default value**: 2 | **Macros**: ['AGB_CORE_ALGORITHM_DEFAULT = 0', 'AGB_CORE_ALGORITHM_HURLEY = 1', 'AGB_CORE_ALGORITHM_KARAKAS = 2'] | **Parameter**: AGB_radius_algorithm | **Description**: Algorithm to use for calculating radii on the TPAGB. | **Parameter input type**: Integer -| **Default value**: 1 +| **Default value**: 2 | **Macros**: ['AGB_RADIUS_ALGORITHM_DEFAULT = 0', 'AGB_RADIUS_ALGORITHM_HURLEY = 1', 'AGB_RADIUS_ALGORITHM_KARAKAS = 2'] | **Parameter**: AGB_luminosity_algorithm | **Description**: Algorithm to use for calculating luminosities on the TPAGB. | **Parameter input type**: Integer -| **Default value**: 1 +| **Default value**: 2 | **Macros**: ['AGB_LUMINOSITY_ALGORITHM_DEFAULT = 0', 'AGB_LUMINOSITY_ALGORITHM_HURLEY = 1', 'AGB_LUMINOSITY_ALGORITHM_KARAKAS = 2'] | **Parameter**: AGB_3dup_algorithm | **Description**: Algorithm to use for calculating third dredge up efficiency on the TPAGB. | **Parameter input type**: Integer -| **Default value**: 1 +| **Default value**: 2 | **Macros**: ['AGB_THIRD_DREDGE_UP_ALGORITHM_DEFAULT = 0', 'AGB_THIRD_DREDGE_UP_ALGORITHM_HURLEY = 1', 'AGB_THIRD_DREDGE_UP_ALGORITHM_KARAKAS = 2', 'AGB_THIRD_DREDGE_UP_ALGORITHM_STANCLIFFE = 3'] | **Parameter**: overspin_algorithm @@ -1136,6 +1083,21 @@ Section: stars | **Parameter input type**: True|False | **Default value**: False +| **Parameter**: degenerate_core_merger_nucsyn +| **Description**: If TRUE, assume that in a degnerate core merger, energy is generated from nucleosynthesis of the whole core, and that this can disrupt the core. The BSE algorithm (Hurley et al. 2002) assumes this to be TRUE, but binary_c assumes FALSE by default. (FALSE) +| **Parameter input type**: True|False +| **Default value**: False + +| **Parameter**: degenerate_core_helium_merger_ignition +| **Description**: If TRUE, assume that when there is a degenerate helium core merger, the star reignites helium. This is required to make R-type carbon stars. (TRUE) +| **Parameter input type**: True|False +| **Default value**: True + +| **Parameter**: degenerate_core_merger_dredgeup_fraction +| **Description**: If non-zero, mix this fraction of the degenerate core during a merger.(0.0). +| **Parameter input type**: Float +| **Default value**: 0 + Section: binary --------------- @@ -1308,7 +1270,7 @@ Section: binary | **Parameter**: post_ce_objects_have_envelopes | **Description**: If TRUE then post-common-envelope objects have thin envelopes. You need this if you are to have post-CE post-AGB stars. Note that this *may* be unstable, i.e. you may end up having many CEEs. The mass in the envelope is controlled by post_ce_adaptive_menv. TRUE by default. | **Parameter input type**: True|False -| **Default value**: True +| **Default value**: False | **Parameter**: PN_comenv_transition_time | **Description**: post-common envelope transition time in years (1e2). This is the time taken to move from CEE ejection to Teff > 30e4 K. Hall et al. (2013) suggest ~100 years. @@ -1478,18 +1440,20 @@ Section: binary | **Parameter**: type_Ia_MCh_supernova_algorithm | **Description**: Algorithm to be used when calculating type Ia yields from Chandrasekhar-mass exploders. 0 = DD7 (Iwamoto 1999), 1 = Seitenzahl 2013 3D hydro yields (you must also set Seitenzahl2013_model) | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: 0 +| **Macros**: ['TYPE_IA_MCH_SUPERNOVA_ALGORITHM_DD2 = 0', 'TYPE_IA_MCH_SUPERNOVA_ALGORITHM_SEITENZAHL2013 = 1', 'TYPE_IA_MCH_SUPERNOVA_ALGORITHM_SEITENZAHL2013_AUTOMATIC = 2'] | **Parameter**: Seitenzahl2013_model | **Description**: Which of Seitenzahl et al. 2013's models to use? One of N1,N3,N5,N10,N20,N40,N100L,N100,N100H,N150,N200,N300C,N1600,N1600C,N100_Z0.5,N100_Z0.1,N100_Z0.01 (defaults to N100). | **Parameter input type**: String -| **Default value**: NULL +| **Default value**: N100 | **Extra**: N1 | **Parameter**: type_Ia_sub_MCh_supernova_algorithm | **Description**: Algorithm to be used when calculating type Ia yields from sub-Chandrasekhar-mass exploders. (Currently unused.) | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: 0 +| **Macros**: ['TYPE_IA_SUB_MCH_SUPERNOVA_ALGORITHM_LIVNE_ARNETT_1995 = 0'] | **Parameter**: max_HeWD_mass | **Description**: The maximum mass a HeWD can have before it ignites helium (0.7). @@ -2130,7 +2094,7 @@ Section: nucsyn | **Parameter**: NeNaMgAl | **Description**: Enables NeNaMgAl reaction network. Requires NUCSYN and NUCSYN_HBB. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: True | **Extra**: Ignore | **Parameter**: nucsyn_network%d @@ -2151,19 +2115,21 @@ Section: nucsyn | **Parameter**: nucsyn_metallicity | **Description**: This sets the metallicity of the nucleosynthesis algorithms, i.e. the amount (by mass) of matter which is not hydrogen or helium. Usually you'd just set this with the metallicity parameter, but if you want the nucleosynthesis to be outside the range of the stellar evolution algorithm (e.g. Z=0 or Z=0.04) then you need to use nucsyn_metallicity. That said, it's also outside the range of some of the nucleosynthesis algorithms as well, so you have been warned! | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: -1 | **Macros**: ['DEFAULT_TO_METALLICITY = -1'] | **Parameter**: nucsyn_solver | **Description**: Choose the solver used in nuclear burning. 0 = KAPS_RENTROP is a Kaps-Rentrop scheme (fast, not great for stiff problems), 1 = LSODA (Adams/BSF switcher), 2 = CVODE library (https://computing.llnl.gov/projects/sundials. Default 0. | **Parameter input type**: Unsigned integer -| **Default value**: NULL +| **Default value**: 0 +| **Macros**: ['NUCSYN_SOLVER_KAPS_RENTROP = 0', 'NUCSYN_SOLVER_LSODA = 1', 'NUCSYN_SOLVER_CVODE = 2', 'NUCSYN_SOLVER_NUMBER = 3', 'NUCSYN_SOLVER_KAPS_RENTROP = 0', 'NUCSYN_SOLVER_LSODA = 1', 'NUCSYN_SOLVER_CVODE = 2', 'NUCSYN_SOLVER_NUMBER = 3'] | **Extra**: 0 | **Parameter**: initial_abundance_mix | **Description**: initial abundance mixture: 0=AG89, 1=Karakas 2002, 2=Lodders 2003, 3=Asplund 2005 (not available?), 4=Garcia Berro, 5=Grevesse Noels 1993 | **Parameter input type**: Unsigned integer -| **Default value**: NULL +| **Default value**: 0 +| **Macros**: ['NUCSYN_INIT_ABUND_MIX_AG89 = 0', 'NUCSYN_INIT_ABUND_MIX_KARAKAS2002 = 1', 'NUCSYN_INIT_ABUND_MIX_LODDERS2003 = 2', 'NUCSYN_INIT_ABUND_MIX_ASPLUND2005 = 3', 'NUCSYN_INIT_ABUND_MIX_GARCIABERRO = 4', 'NUCSYN_INIT_ABUND_MIX_GREVESSE_NOELS_1993 = 5', 'NUCSYN_INIT_ABUND_MIX_ASPLUND2009 = 6', 'NUCSYN_INIT_ABUND_MIX_KOBAYASHI2011_ASPLUND2009 = 7', 'NUCSYN_INIT_ABUND_MIX_LODDERS2010 = 8'] | **Extra**: 0 | **Parameter**: init_abund @@ -2187,37 +2153,38 @@ Section: nucsyn | **Parameter**: init_abunds_only | **Description**: If True, outputs only the initial abundances, then exits. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Parameter**: initial_abunds_only | **Description**: If True, outputs only the initial abundances, then exits. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Parameter**: no_thermohaline_mixing | **Description**: If True, disables thermohaline mixing. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Parameter**: lithium_GB_post_Heflash | **Description**: Sets the lithium abundances after the helium flash. Requires NUCSYN and LITHIUM_TABLES. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 0 | **Parameter**: lithium_GB_post_1DUP | **Description**: Sets the lithium abundance after first dredge up. Requires NUCSYN and LITHIUM_TABLES. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 0 | **Parameter**: lithium_hbb_multiplier | **Description**: Multiplies the lithium abundances on the AGB during HBB (based on Karakas/Fishlock et al models).Requires NUCSYN and LITHIUM_TABLES. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 1 | **Parameter**: angelou_lithium_decay_function | **Description**: Functional form which describes Li7 decay. Requires NUCSYN and NUCSYN_ANGELOU_LITHIUM. Choices are: 0 expoential (see angelou_lithium_decay_time). | **Parameter input type**: Integer | **Default value**: NULL +| **Macros**: ['ANGELOU_LITHIUM_DECAY_FUNCTION_EXPONENTIAL = 0'] | **Parameter**: angelou_lithium_LMMS_time | **Description**: Time at which lithium manufacture is triggered in a low-mass (convective) main sequence (Myr). Requires NUCSYN and NUCSYN_ANGELOU_LITHIUM. Ignored if 0 (for the start, use 1e-6). @@ -2337,16 +2304,10 @@ Section: nucsyn Section: output --------------- -| **Parameter**: david_logging_function -| **Description**: Function to choose which kind of information gets logged Requires DAVID. Choices are: 0= None, >0 for custom logging functions -| **Parameter input type**: Integer -| **Default value**: 0 -| **Extra**: Ignore - | **Parameter**: cf_amanda_log | **Description**: Enable logging to compare to Amanda's models. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Parameter**: float_overflow_checks | **Description**: Turn on to enable floating-point overflow checks at the end of each timestep, if they are available. 0=off, 1=warn (stderr) on failure, 2=exit on failure (0) @@ -2386,7 +2347,7 @@ Section: output | **Parameter**: legacy_yields | **Description**: Turn on ensemble legacy yield output. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Parameter**: ensemble_defer | **Description**: Defer ensemble output. @@ -2426,27 +2387,27 @@ Section: output | **Parameter**: EMP_logg_maximum | **Description**: Maximum logg that EMP stars are allowed to have. See Izzard et al 2009. See also CEMP_cfe_minimum, NEMP_nfe_minimum, EMP_minimum_age. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 4 | **Parameter**: EMP_minimum_age | **Description**: Minimum age that EMP stars are required to have. See Izzard et al 2009. See also CEMP_cfe_minimum, NEMP_nfe_minimum, EMP_logg_maximum. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 10 | **Parameter**: EMP_feh_maximum | **Description**: Maximum [Fe/H] that an EMP stars may have. See Izzard et al 2009. See also CEMP_cfe_minimum, NEMP_nfe_minimum, EMP_logg_maximum, EMP_minimum_age. Default -2.0. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: -2 | **Parameter**: CEMP_cfe_minimum | **Description**: Minimum [C/Fe] that CEMP stars are required to have. See Izzard et al 2009. See also NEMP_cfe_minimum, EMP_logg_maximum, EMP_minimum_age. Default 0.7. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 0.7 | **Parameter**: NEMP_cfe_minimum | **Description**: Minimum [N/Fe] that NEMP stars are required to have. See Izzard et al 2009, Pols et al. 2012. See also CEMP_cfe_minimum, EMP_logg_maximum, EMP_minimum_age. Default 1.0. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 1 | **Parameter**: thick_disc_start_age | **Description**: Lookback time for the start of the thick disc star formation, e.g. 13e3 Myr. Units = Myr. @@ -2582,99 +2543,99 @@ Section: input | **Parameter**: MINT_dir | **Description**: Location of MINT algorithm data. | **Parameter input type**: String -| **Default value**: NULL +| **Default value**: | **Extra**: | **Parameter**: MINT_data_cleanup | **Description**: Activate checks on incoming data to try to account for problems. Will make data-loading slower, but may fix a few things. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Extra**: | **Parameter**: MINT_MS_rejuvenation | **Description**: Turn on or off (hydrogen) main-sequence rejuvenation. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: True | **Extra**: | **Parameter**: MINT_remesh | **Description**: Turn on or off MINT's remeshing. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: True | **Extra**: | **Parameter**: MINT_use_ZAMS_profiles | **Description**: Use chemical profiles at the ZAMS if MINT_use_ZAMS_profiles is TRUE, otherwise set homogeneous abundances. (Default is TRUE, so we use the profiles if they are available.) | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: True | **Extra**: | **Parameter**: MINT_fallback_to_test_data | **Description**: If TRUE, use the MINT test_data directory as a fallback when data is unavailable. (FALSE) | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Extra**: | **Parameter**: MINT_disable_grid_load_warnings | **Description**: Use this to explicitly disable MINT's warnings when loading a grid with, e.g., missing or too much data. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Extra**: | **Parameter**: MINT_Kippenhahn | **Description**: Turn on or off MINT's Kippenhahn diagrams. If 0, off, if 1, output star 1 (index 0), if 2 output star 2 (index 1). Default 0. | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: 0 | **Extra**: | **Parameter**: MINT_nshells | **Description**: Set the initial number of shells MINT uses in each star when doing nuclear burning. Note: remeshing can change this. If MINT_nshells is 0, shellular burning and other routines that require shells will not be available. (200) | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: 200 | **Extra**: | **Parameter**: MINT_maximum_nshells | **Description**: Set the maximum number of shells MINT uses in each star when doing nuclear burning. Note that this will be limited to MINT_HARD_MAX_NSHELLS. (1000) | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: 1000 | **Extra**: | **Parameter**: MINT_minimum_nshells | **Description**: Set the minimum number of shells MINT uses in each star when doing nuclear burning. Note that this will be greater than or equal to MINT_HARD_MIN_NSHELLS, which is 0 by default. (0) | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: 10 | **Extra**: | **Parameter**: MINT_Kippenhahn_stellar_type | **Description**: Stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for which Kippenhahn plot data should be output. | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: -1 | **Macros**: ['LOW_MASS_MS = 0', 'MS = 1', 'HG = 2', 'GIANT_BRANCH = 3', 'CHeB = 4', 'EAGB = 5', 'TPAGB = 6', 'HeMS = 7', 'HeHG = 8', 'HeGB = 9', 'HeWD = 10', 'COWD = 11', 'ONeWD = 12', 'NS = 13', 'BH = 14', 'MASSLESS_REMNANT = 15'] | **Extra**: | **Parameter**: MINT_Kippenhahn_companion_stellar_type | **Description**: Companion stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for the companion for which Kippenhahn plot data should be output. | **Parameter input type**: Integer -| **Default value**: NULL +| **Default value**: -1 | **Macros**: ['LOW_MASS_MS = 0', 'MS = 1', 'HG = 2', 'GIANT_BRANCH = 3', 'CHeB = 4', 'EAGB = 5', 'TPAGB = 6', 'HeMS = 7', 'HeHG = 8', 'HeGB = 9', 'HeWD = 10', 'COWD = 11', 'ONeWD = 12', 'NS = 13', 'BH = 14', 'MASSLESS_REMNANT = 15'] | **Extra**: | **Parameter**: MINT_nuclear_burning | **Description**: Turn on or off MINT's nuclear burning algorithm. | **Parameter input type**: True|False -| **Default value**: NULL +| **Default value**: False | **Extra**: | **Parameter**: MINT_minimum_shell_mass | **Description**: Minimum shell mass in MINT's nuclear burning routines. | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 1e-06 | **Extra**: | **Parameter**: MINT_maximum_shell_mass | **Description**: Maximum shell mass in MINT's nuclear burning routines. : | **Parameter input type**: Float -| **Default value**: NULL +| **Default value**: 0.1 | **Extra**: Section: i/o diff --git a/docs/source/example_notebooks.rst b/docs/source/example_notebooks.rst index 2f6090b9feca15ef3ffec2e37096fa867a176ba8..d15ea559afa7bd4bad185683c804cc9c39d8d914 100644 --- a/docs/source/example_notebooks.rst +++ b/docs/source/example_notebooks.rst @@ -13,4 +13,5 @@ The order of the notebooks below is more or less the recommended order to read. notebook_population.ipynb notebook_extra_features.ipynb notebook_api_functionality.ipynb - notebook_luminosity_function_single.ipynb \ No newline at end of file + notebook_luminosity_function_single.ipynb + notebook_luminosity_function_binaries.ipynb \ No newline at end of file diff --git a/docs/source/grid_options_descriptions.rst b/docs/source/grid_options_descriptions.rst index 319b8d56a6d616f55498ec2c10fbc358a8de8183..84538e2c4a51e19e6c1e6299dcea91c1c5e2d5f2 100644 --- a/docs/source/grid_options_descriptions.rst +++ b/docs/source/grid_options_descriptions.rst @@ -1,7 +1,7 @@ Population grid code options ============================ The following chapter contains all grid code options, along with their descriptions -There are 1 options that are not described yet. +There are 2 options that are not described yet. Public options @@ -35,6 +35,8 @@ The following options are meant to be changed by the user. | **log_args_dir**: Directory to log the arguments to. Unused +| **log_dt**: No description available yet + | **log_file**: Log file for the population object. Unused | **log_runtime_systems**: Whether to log the runtime of the systems . Each systems run by the thread is logged to a file and is stored in the tmp_dir. (1 file per thread). Don't use this if you are planning to run a lot of systems. This is mostly for debugging and finding systems that take long to run. Integer, default = 0. if value is 1 then the systems are logged @@ -47,7 +49,7 @@ The following options are meant to be changed by the user. | **multiplicity_fraction_function**: Which multiplicity fraction function to use. 0: None, 1: Arenou 2010, 2: Rhagavan 2010, 3: M&S 2017 -| **parse_function**: Function that the user can provide to handle the output the binary_c. This function has to take the arguments (self, output). Its best not to return anything in this function, and just store stuff in the grid_options['results'] dictionary, or just output results to a file +| **parse_function**: Function that the user can provide to handle the output the binary_c. This function has to take the arguments (self, output). Its best not to return anything in this function, and just store stuff in the self.grid_results dictionary, or just output results to a file | **repeat**: Factor of how many times a system should be repeated. Consider the evolution splitting binary_c argument for supernovae kick repeating. diff --git a/docs/source/notebook_api_functionality.ipynb b/docs/source/notebook_api_functionality.ipynb index d81c31711bfc5d6de3159fd8958df96dd145ded0..8d454880c82dba172d33a95532c47bc95f24ff6a 100644 --- a/docs/source/notebook_api_functionality.ipynb +++ b/docs/source/notebook_api_functionality.ipynb @@ -15,7 +15,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "ded7eaf6-e1ba-46c2-9f6f-9ebcb14a264d", "metadata": {}, "outputs": [ @@ -30,37 +30,69 @@ "\n", "FUNCTIONS\n", " free_persistent_data_memaddr_and_return_json_output(...)\n", - " Frees the persistent_data memory and returns the json output\n", + " Frees the persistent_data memory and returns the json output.\n", + " \n", + " Arguments:\n", + " store capsule: capsule containing the memory adress of the persistent data object (contains the ensemble)\n", " \n", " free_store_memaddr(...)\n", - " Frees the store memaddr\n", + " Frees the store memaddr.\n", + " \n", + " Arguments:\n", + " store capsule: capsule containing the memory adress of the store object\n", " \n", " return_arglines(...)\n", " Return the default args for a binary_c system\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_help(...)\n", " Return the help info for a given parameter\n", + " \n", + " Arguments:\n", + " parameter: parameter name.\n", " \n", " return_help_all(...)\n", " Return an overview of all the parameters, their description, categorized in sections\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_maximum_mass_ratio_for_RLOF(...)\n", - " Returns a string containing the maximum mass ratio for which a binary system does not RLOF at zams. Optionally accepts a store_capsule. Please use the wrapper functions in utils for this except when you know what you're doing\n", + " Returns a string containing the maximum mass ratio for which a binary system does not RLOF at ZAMS. Please use the wrapper functions in utils for this except when you know what you're doing.\n", + " \n", + " Arguments:\n", + " argstring: argument string for binary_c\n", + " (opt) store_capsule: capsule containing memory adress for the store object.unction. Default = Null\n", " \n", " return_minimum_orbit_for_RLOF(...)\n", - " Returns a string containing the minimum orbit and separation for which a binary system does not RLOF at zams. Please use the wrapper functions in utils for this except when you know what you're doing\n", + " Returns a string containing the minimum orbit and separation for which a binary system does not RLOF at ZAMS. Please use the wrapper functions in utils for this except when you know what you're doing.\n", + " \n", + " Arguments:\n", + " argstring: argument string for binary_c\n", + " (opt) store_capsule: capsule containing memory adress for the store object.unction. Default = Null\n", " \n", " return_persistent_data_memaddr(...)\n", " Return the store memory adress that will be passed to run_population\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_store_memaddr(...)\n", " Return the store memory adress that will be passed to run_population\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " return_version_info(...)\n", " Return the version information of the used binary_c build\n", + " \n", + " Arguments:\n", + " No arguments.\n", " \n", " run_system(...)\n", - " Function to run a system. This is a general function that will be able to handle different kinds of situations: single system run with different settings, population run with different settings, etc. To avoid having too many functions doing slightly different things. \n", + " Function to run a system. This is a general function that will be able to handle different kinds of situations: single system run with different settings, population run with different settings, etc. To avoid having too many functions doing slightly different things.\n", " \n", " Arguments:\n", " argstring: argument string for binary_c\n", @@ -126,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 2, "id": "10a74d5a-a3d5-4543-a5bc-20d1fe885bb4", "metadata": {}, "outputs": [ @@ -134,8 +166,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "<capsule object \"STORE\" at 0x7f163859d0c0>\n", - "SINGLE_STAR_LIFETIME 10 27.7358\n", + "<capsule object \"STORE\" at 0x7fa6a45ed180>\n", + "SINGLE_STAR_LIFETIME 10 28.4838\n", "\n" ] } @@ -183,7 +215,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 3, "id": "318874f6-7acf-49bb-9786-299d4dffc0b3", "metadata": {}, "outputs": [ @@ -217,7 +249,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 4, "id": "d7e757ae-579c-42a2-a310-f0401b7800e8", "metadata": { "scrolled": true, @@ -291,6 +323,9 @@ "opacity_algorithm : Set the opacity algorithm. 0 = Paczynski, 1 = Ferguson/Opal. : (null)\n", "wind_mass_loss : Defines the algorithm used for stellar winds. 0 = none, 1 = Hurley et al. (2002), 2 = Schneider (2018). : 0\n", "gbwind : Wind prescription for first red giant branch stars. 0=Reimers (Hurley et al 2000/2002; choose gb_reimers_eta=0.5 for their mass loss rate), 1=Schroeder+Cuntz 2005 (set gb_reimers_eta=1.0 for their mass loss rate). : (null)\n", + "postagbwind : Apply special post-(A)GB prescription. Default is POSTAGB_WIND_USE_GIANT which means we just use whatever is prescribed on the giant branch. Other options include: POSTAGB_WIND_NONE = 1 (no wind on the post (A)GB), POSTAGB_WIND_KRTICKA2020 = 2 which uses Krticka, Kubát and Krticková (2020, A&A 635, A173). : (null)\n", + "Teff_postAGB_min : The minimum temperature for which we apply post-(A)GB winds. See also Teff_postAGB_max. (6000 K) : (null)\n", + "Teff_postAGB_max : The maximum temperature for which we apply post-(A)GB winds. See also Teff_postAGB_min. (120000 K) : (null)\n", "mattsson_Orich_tpagbwind : Experimental : turns on Mattsson's TPAGB wind when the star is oxygen rich. Requires MATTSSON_MASS_LOSS. : (null)\n", "magnetic_braking_factor : Multiplier for the magnetic braking angular momentum loss rate. : (null)\n", "magnetic_braking_gamma : gamma factor in Rappaport style magnetic braking expression. : (null)\n", @@ -310,7 +345,9 @@ "vw93_mira_shift : In the Vassiliadis and Wood (1993) AGB wind prescription, the wind loss rate depends on the Mira period plus this offset. Requires VW93_MIRA_SHIFT. : (null)\n", "vw93_multiplier : In the Vassiliadis and Wood (1993) AGB wind prescription, the wind loss rate is multiplied by this factor. Requires VW93_MULTIPLIER. : (null)\n", "tpagb_reimers_eta : TPAGB Reimers wind multiplication factor, cf. eta in Reimers' mass loss formula. (This multiplies the 4e-13 in Reimers' formula, or the 8e-14 in Schroeder and Cuntz.) Note that Reimers is not the default TPAGB wind prescription. See also tpagbwind. : (null)\n", + "Tout_Pringle_1992_multiplier : Multiplier for the Tout & Pringle (1992) magnetic wind. (0.0) : (null)\n", "artificial_mass_accretion_rate%d : Constant mass accretion rate for star <n>. : (null)\n", + "artificial_mass_accretion_rate_by_stellar_type%d : Constant mass accretion rate for stellar type <n>. : (null)\n", "artificial_angular_momentum_accretion_rate%d : Constant angular momentum accretion for star <n>. : (null)\n", "artificial_orbital_angular_momentum_accretion_rate : Constant angular momentum accretion rate on the orbit. : (null)\n", "artificial_accretion_start_time : Time at which artificial accretion stars. Ignored if <0 (default is -1). : (null)\n", @@ -318,8 +355,7 @@ "wr_wind : Massive-star (WR) wind prescription. 0 = Hurley et al 2000/2002, 1=Maeder and Meynet, 2=Nugis and Lamers, 3=John Eldridge's version of Vink's early-2000s wind (See Lynnette Dray's thesis, or John Eldridge's thesis) : (null)\n", "wr_wind_fac : Massive-star (WR) wind multiplication factor. : (null)\n", "wrwindfac : Massive-star (WR) wind multiplication factor. Synonymous with wr_wind_fac (which you should use instead). : (null)\n", - "BH_prescription : Black hole mass prescrition: relates the mass of a newly formed black hole to its progenitor's (CO) core mass. 0=Hurley et al 2000/2002, 1=Belczynski (early 2000s). : (null)\n", - "PPISN_prescription : (Pulsational) Pair-Instability Supernova prescription: Relates initial helium core mass of star to whether the star undergoes PPISN or PISN. Requires PPISN flag to be True (see binary_c_parameters.h). 0=no ppisn, 1=Farmer et al 2019. : Ignore\n", + "BH_prescription : Black hole mass prescrition: relates the mass of a newly formed black hole to its progenitor's (CO) core mass. BH_HURLEY2002 = 0 = Hurley et al 2000/2002, BH_BELCZYNSKI = 1 = Belczynski (early 2000s), BH_SPERA2015 = Spera+ 2015, BH_FRYER12_DELAYED = 3 = Fryer et al. (2012) delayed prescription, BH_FRYER12_RAPID = 4 = Fryer et al. (2012) rapid prescription, BH_FRYER12_STARTRACK = 5 = Fryer et al. (2012) startrack prescription. : (null)\n", "sn_kick_distribution_II : Set the distribution of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_ECAP : Set the distribution of speeds applied to the remnants of electron-capture supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_NS_NS : Set the distribution of speeds applied to kick neutron stars and black holes that survive a NS-NS merger. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", @@ -331,9 +367,6 @@ "sn_kick_distribution_BH_NS : Set the distribution of speeds applied to black holes formed by the merger of a neutron star and a black holes. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_IA_Hybrid_HeCOWD : Set the distribution of speeds applied to any survivor of a hybrid He-COWD SNIa explosion. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_distribution_IA_Hybrid_HeCOWD_subluminous : Set the distribution of speeds applied to any survivor of a subluminous hybrid He-COWD SNIa explosion. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_distribution_PPISN : Set the distribution of speeds applied to PPISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_distribution_PISN : Set the distribution of speeds applied to PISN supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_distribution_PHDIS : Set the distribution of speeds applied to PHDIS supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_II : Set the dispersion of speeds applied to kick type II core collapse supernova systems. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_ECAP : Set the dispersion of speeds applied to the remnants of electron-capture supernovae. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_NS_NS : Set the dispersion of speeds applied to kick neutron stars and black holes that survive a NS-NS merger. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", @@ -345,9 +378,6 @@ "sn_kick_dispersion_BH_NS : Set the dispersion of speeds applied to black holes formed by the merger of a neutron star and a black holes. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_IA_Hybrid_HeCOWD : Set the dispersion of speeds applied to the survivor of a SNIa explosion of a hybrid He-COWD. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_dispersion_IA_Hybrid_HeCOWD_subluminous : Set the dispersion of speeds applied to the survivor of a subluminous SNIa explosion of a hybrid He-COWD. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_dispersion_PPISN : Set the dispersion of speeds applied to the survivor of a PPISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_dispersion_PISN : Set the dispersion of speeds applied to the survivor of a PISN supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", - "sn_kick_dispersion_PHDIS : Set the dispersion of speeds applied to the survivor of a PHDIS supernova. 0=fixed, 1=maxwellian (hurley/BSE), 2=custom function (see monte_carlo_kicks.c). : (null)\n", "sn_kick_companion_IA_He : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia He supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_ELD : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia ELD (sub-Mch) supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_CHAND : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a Ia Mch supernova occurs. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", @@ -368,9 +398,6 @@ "sn_kick_companion_BH_NS : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the, kick on the companion when a black hole merges with a neutron star. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_Hybrid_HeCOWD : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a hybrid He-COWD type Ia explosion. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "sn_kick_companion_IA_Hybrid_HeCOWD_subluminous : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a subluminous hybrid He-COWD type Ia explosion. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", - "sn_kick_companion_PPISN : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PPISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", - "sn_kick_companion_PISN : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PISN supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", - "sn_kick_companion_PHDIS : Set the speed (if >=0) of, or the algothim (if <0) used to calculate the kick on the companion, if it survives, in a PHDIS supernova. 0 = none, 1 = Liu+2015, 2 = Wheeler+ 1975. : (null)\n", "wd_sigma : Set the speed at which white dwarfs are kicked when they form, in km/s. Default is zero (i.e. no kick). Requires WD_KICKS. : (null)\n", "wd_kick_direction : Set the direction of white dwarf kicks. 0 = random, 1 = up, 2 = forward, 3 = backward, 4 = inward, 5 = outward. Requires WD_KICKS. : (null)\n", "wd_kick_when : Decide when to kick a white dwarf. 0=at birth, 1=at first RLOF, 2=at given pulse number (see wd_kick_pulse_number), 3 at every pulse Requires WD_KICKS. : (null)\n", @@ -443,6 +470,11 @@ "HeWD_HeWD_ignition_mass : HeWD-HeWD mergers above this mass reignite helium. (0.3) : (null)\n", "wind_Nieuwenhuijzen_luminosity_lower_limit : Above this luminosity we activate the Nieuwenhuijzen and de Jager wind (4e3 Lsun). : (null)\n", "wind_LBV_luminosity_lower_limit : Above this luminosity we activate the LBV wind (6e5 Lsun). : (null)\n", + "colour%d : Sets colour %d (0 to NUM_ANSI_COLOURS-1) to the extended ANSI set colour you choose (1-255, 0 means ignore). The colour numbers are defined in src/logging/ansi_colours.h : (null)\n", + "apply_Darwin_Radau_correction : Apply Darwin-Radau correction to the moment of inertia to take rotation into account? : (null)\n", + "degenerate_core_merger_nucsyn : If TRUE, assume that in a degnerate core merger, energy is generated from nucleosynthesis of the whole core, and that this can disrupt the core. The BSE algorithm (Hurley et al. 2002) assumes this to be TRUE, but binary_c assumes FALSE by default. (FALSE) : (null)\n", + "degenerate_core_helium_merger_ignition : If TRUE, assume that when there is a degenerate helium core merger, the star reignites helium. This is required to make R-type carbon stars. (TRUE) : (null)\n", + "degenerate_core_merger_dredgeup_fraction : If non-zero, mix this fraction of the degenerate core during a merger.(0.0). : (null)\n", "\n", "############################################################\n", "##### Section Binary\n", @@ -709,7 +741,6 @@ "############################################################\n", "##### Section Output\n", "############################################################\n", - "david_logging_function : Function to choose which kind of information gets logged Requires DAVID. Choices are: 0= None, >0 for custom logging functions : Ignore\n", "cf_amanda_log : Enable logging to compare to Amanda's models. : (null)\n", "float_overflow_checks : Turn on to enable floating-point overflow checks at the end of each timestep, if they are available. 0=off, 1=warn (stderr) on failure, 2=exit on failure (0) : (null)\n", "save_pre_events_stardata : Enable this to save a copy of stardata to stardata->pre_events_stardata just before an event. : (null)\n", @@ -739,6 +770,7 @@ "escape_fraction : A parameter used in constructing galactic chemical evolution (GCE) models. If the stellar wind velocity exceeds this value, any chemical yield from the wind is ignored, i.e. assumed lost. (km/s) Requires NUCSYN_GCE_OUTFLOW_CHECKS. Default 0.0. See also escape_velocity. : (null)\n", "colour_log : If set to True, thelog is coloured with ANSI colour formatting. Requires FILE_LOG to be defined. : \n", "log_filename : Location of the output logging filename. If set to \"/dev/null\" then there is no logging. : \n", + "log_arrows : Add arrows to the output log to show whether values are increasing or decreasing. : \n", "stopfile : File which, when it exists, will stop the current binary_c repeat run. : \n", "stardata_dump_filename : Location of the stardata dump file. : \n", "stardata_load_filename : Location of the stardata file to load. : \n", @@ -763,8 +795,12 @@ "MINT_MS_rejuvenation : Turn on or off (hydrogen) main-sequence rejuvenation. : \n", "MINT_remesh : Turn on or off MINT's remeshing. : \n", "MINT_use_ZAMS_profiles : Use chemical profiles at the ZAMS if MINT_use_ZAMS_profiles is TRUE, otherwise set homogeneous abundances. (Default is TRUE, so we use the profiles if they are available.) : \n", + "MINT_fallback_to_test_data : If TRUE, use the MINT test_data directory as a fallback when data is unavailable. (FALSE) : \n", "MINT_disable_grid_load_warnings : Use this to explicitly disable MINT's warnings when loading a grid with, e.g., missing or too much data. : \n", "MINT_Kippenhahn : Turn on or off MINT's Kippenhahn diagrams. If 0, off, if 1, output star 1 (index 0), if 2 output star 2 (index 1). Default 0. : \n", + "MINT_nshells : Set the initial number of shells MINT uses in each star when doing nuclear burning. Note: remeshing can change this. If MINT_nshells is 0, shellular burning and other routines that require shells will not be available. (200) : \n", + "MINT_maximum_nshells : Set the maximum number of shells MINT uses in each star when doing nuclear burning. Note that this will be limited to MINT_HARD_MAX_NSHELLS. (1000) : \n", + "MINT_minimum_nshells : Set the minimum number of shells MINT uses in each star when doing nuclear burning. Note that this will be greater than or equal to MINT_HARD_MIN_NSHELLS, which is 0 by default. (0) : \n", "MINT_Kippenhahn_stellar_type : Stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for which Kippenhahn plot data should be output. : \n", "MINT_Kippenhahn_companion_stellar_type : Companion stellar type selector for Kippenhahn plots. Set to -1 to ignore, otherwise the stellar type number for the companion for which Kippenhahn plot data should be output. : \n", "MINT_nuclear_burning : Turn on or off MINT's nuclear burning algorithm. : \n", @@ -825,7 +861,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 5, "id": "3d29ca9d-ac66-4f9e-81cf-2edd14a98b79", "metadata": {}, "outputs": [ @@ -854,7 +890,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "e517f561-09c6-419d-ba89-d9cb61e6ebab", "metadata": {}, "outputs": [ @@ -887,7 +923,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 7, "id": "7da75a95-8831-4346-a584-e042ced75249", "metadata": {}, "outputs": [ diff --git a/docs/source/notebook_custom_logging.ipynb b/docs/source/notebook_custom_logging.ipynb index 05ffbccfc23f0b08e85abed0d467233385520a4b..84e41e6bcee06490f5b4dc61fb616cc213024aba 100644 --- a/docs/source/notebook_custom_logging.ipynb +++ b/docs/source/notebook_custom_logging.ipynb @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 1, "id": "696ecbb9-1efd-48f4-a57e-2cf6dfe416f1", "metadata": {}, "outputs": [], @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 2, "id": "236cf821-09ac-4237-9b8f-6e36d2edf446", "metadata": {}, "outputs": [ @@ -90,7 +90,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 3, "id": "feb423d5-5cc3-433c-9801-f8017abbc03a", "metadata": {}, "outputs": [ @@ -110,7 +110,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 4, "id": "2f5defbf-c623-49ed-a238-fba52a563a58", "metadata": {}, "outputs": [ @@ -155,7 +155,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 5, "id": "dcd74bbc-478b-43e4-b495-8c456e8d1d88", "metadata": {}, "outputs": [ @@ -195,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 6, "id": "77bd09b0-1a94-499d-97db-a1f991c67c12", "metadata": {}, "outputs": [ @@ -203,10 +203,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "EXAMPLE_ABOVE_MS 1.041660877905e+02 4.99198 4.99198 6.1357 6.1357 2 1\n", - "EXAMPLE_ABOVE_MS 1.041662558619e+02 4.99198 4.99198 6.14057 6.1357 2 2\n", - "EXAMPLE_ABOVE_MS 1.041662560111e+02 4.99198 4.99198 6.14057 6.14057 2 2\n", - "EXAMPLE_ABOVE_MS 1.041662564579e+02 4.99198 4.99198 6.14059 6.14057 2 2\n" + "EXAMPLE_ABOVE_MS 1.044142002936e+02 4.99194 4.99194 6.13567 6.13567 2 1\n", + "EXAMPLE_ABOVE_MS 1.044572277695e+02 4.99192 4.99194 7.51803 6.13567 2 2\n", + "EXAMPLE_ABOVE_MS 1.044654032097e+02 4.99192 4.99192 7.81395 7.51803 2 2\n", + "EXAMPLE_ABOVE_MS 1.045084306856e+02 4.99191 4.99192 9.57443 7.81395 2 2\n" ] } ], @@ -260,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 7, "id": "30142286-34ce-433e-82c8-565e2160ff5b", "metadata": {}, "outputs": [ @@ -336,7 +336,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 8, "id": "6f0edc65-a788-4706-a0c5-2ace030765ec", "metadata": {}, "outputs": [ @@ -344,8 +344,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "SINGLE_STAR_LIFETIME 10 27.7358\n", - "EXAMPLE_LOG_CO 2.773581245005e+01 1.33524 9.19314 1.72498e-05 730.446 13 5\n" + "SINGLE_STAR_LIFETIME 10 28.4838\n", + "EXAMPLE_LOG_CO 2.848380621869e+01 1.33469 9.1865 1.72498e-05 724.338 13 5\n" ] } ], @@ -395,7 +395,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 10, "id": "8f58fdf9-3e76-4c18-a1c5-eed0980d4133", "metadata": {}, "outputs": [ @@ -403,8 +403,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "EXAMPLE_MASSLOSS 9.878236827680e+00 1.61349 8.38063 20 13 1\n", - "EXAMPLE_SN 9.878236827680e+00 1.61349 8.38063 20 12 13 5 1 6.74037 4.92267 6.74037 0 0\n" + "EXAMPLE_MASSLOSS 1.050651207308e+01 1.59452 9.34213 20 13 1\n", + "EXAMPLE_SN 1.050651207308e+01 1.59452 9.34213 20 12 13 5 1 6.55458 4.71662 6.55458\n" ] } ], @@ -424,58 +424,27 @@ "{\n", " if (stardata->model.time < stardata->model.max_evolution_time)\n", " {\n", - " if(stardata->pre_events_stardata != NULL)\n", - " {\n", - " Printf(\"EXAMPLE_SN %30.12e \" // 1\n", - " \"%g %g %g %d \" // 2-5\n", - " \"%d %d %g %g \" // 6-9\n", - " \"%g %g %g %g\\\\n\", // 10-13\n", - "\n", - " // \n", - " stardata->model.time, // 1\n", - "\n", - " stardata->star[0].mass, //2\n", - " stardata->pre_events_stardata->star[0].mass, //3\n", - " stardata->common.zero_age.mass[0], //4\n", - " stardata->star[0].SN_type, //5\n", + " Printf(\"EXAMPLE_SN %30.12e \" // 1\n", + " \"%g %g %g %d \" // 2-5\n", + " \"%d %d %g %g \" // 6-9\n", + " \"%g %g\\\\n\", // 10-13\n", "\n", - " stardata->star[0].stellar_type, //6\n", - " stardata->pre_events_stardata->star[0].stellar_type, //7\n", - " stardata->model.probability, //8\n", - " stardata->pre_events_stardata->star[0].core_mass[ID_core(stardata->pre_events_stardata->star[0].stellar_type)], // 9\n", - "\n", - " stardata->pre_events_stardata->star[0].core_mass[CORE_CO], // 10\n", - " stardata->pre_events_stardata->star[0].core_mass[CORE_He], // 11\n", - " stardata->star[0].fallback, // 12\n", - " stardata->star[0].fallback_mass // 13\n", - " );\n", - " }\n", - " else\n", - " {\n", - " Printf(\"EXAMPLE_SN %30.12e \" // 1\n", - " \"%g %g %g %d \" // 2-5\n", - " \"%d %d %g %g \" // 6-9\n", - " \"%g %g %g %g\\\\n\", // 10-13\n", - "\n", - " // \n", - " stardata->model.time, // 1\n", + " // \n", + " stardata->model.time, // 1\n", "\n", - " stardata->star[0].mass, //2\n", - " stardata->previous_stardata->star[0].mass, //3\n", - " stardata->common.zero_age.mass[0], //4\n", - " stardata->star[0].SN_type, //5\n", + " stardata->star[0].mass, //2\n", + " stardata->previous_stardata->star[0].mass, //3\n", + " stardata->common.zero_age.mass[0], //4\n", + " stardata->star[0].SN_type, //5\n", "\n", - " stardata->star[0].stellar_type, //6\n", - " stardata->previous_stardata->star[0].stellar_type, //7\n", - " stardata->model.probability, //8\n", - " stardata->previous_stardata->star[0].core_mass[ID_core(stardata->previous_stardata->star[0].stellar_type)], // 9\n", + " stardata->star[0].stellar_type, //6\n", + " stardata->previous_stardata->star[0].stellar_type, //7\n", + " stardata->model.probability, //8\n", + " stardata->previous_stardata->star[0].core_mass[ID_core(stardata->previous_stardata->star[0].stellar_type)], // 9\n", "\n", - " stardata->previous_stardata->star[0].core_mass[CORE_CO], // 10\n", - " stardata->previous_stardata->star[0].core_mass[CORE_He], // 11\n", - " stardata->star[0].fallback, // 12\n", - " stardata->star[0].fallback_mass // 13\n", - " );\n", - " }\n", + " stardata->previous_stardata->star[0].core_mass[CORE_CO], // 10\n", + " stardata->previous_stardata->star[0].core_mass[CORE_He] // 11\n", + " );\n", " };\n", " /* Kill the simulation to save time */\n", " stardata->model.max_evolution_time = stardata->model.time - stardata->model.dtm;\n", @@ -491,6 +460,14 @@ "# print (abridged) output\n", "print(\"\\n\".join(output.splitlines()[-2:]))" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "484297c0-accb-4efc-a9c8-dbd2f32b89a6", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/docs/source/notebook_luminosity_function_binaries.ipynb b/docs/source/notebook_luminosity_function_binaries.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..fb64dbcc9754aa9dc823a41ae3c52223cb2a8d9a --- /dev/null +++ b/docs/source/notebook_luminosity_function_binaries.ipynb @@ -0,0 +1,839 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bbbaafbb-fd7d-4b73-a970-93506ba35d71", + "metadata": {}, + "source": [ + "# Zero-age stellar luminosity function in binaries\n", + "\n", + "In this notebook we compute the luminosity function of the zero-age main-sequence by running a population of binary stars using binary_c. \n", + "\n", + "Before you go through this notebook, you should look at notebook_luminosity_function.ipynb which is for the - conceptually more simple - single stars.\n", + "\n", + "We start by loading in some standard Python modules and the binary_c module.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bf6b8673-a2b5-4b50-ad1b-e90671f57470", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import math\n", + "from binarycpython.utils.grid import Population\n", + "\n", + "# help(Population) # Uncomment this line to see the public functions of this object" + ] + }, + { + "cell_type": "markdown", + "id": "f268eff3-4e08-4f6b-8b59-f22dba4d2074", + "metadata": {}, + "source": [ + "## Setting up the Population object\n", + "To set up and configure the population object we need to make a new instance of the `Population` object and configure it with the `.set()` function.\n", + "\n", + "In our case, we only need to set the maximum evolution time to something short, because we care only about zero-age main sequence stars which have, by definition, age zero." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "79ab50b7-591f-4883-af09-116d1835a751", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "adding: max_evolution_time=0.1 to BSE_options\n", + "verbosity is 1\n" + ] + } + ], + "source": [ + "# Create population object\n", + "population = Population()\n", + "\n", + "# If you want verbosity, set this before other things\n", + "population.set(verbosity=1)\n", + "\n", + "# Setting values can be done via .set(<parameter_name>=<value>)\n", + "# Values that are known to be binary_c_parameters are loaded into bse_options.\n", + "# Those that are present in the default grid_options are set in grid_options\n", + "# All other values that you set are put in a custom_options dict\n", + "population.set(\n", + " # binary_c physics options\n", + " max_evolution_time=0.1, # maximum stellar evolution time in Myr\n", + " )\n", + "\n", + "# We can access the options through \n", + "print(\"verbosity is\", population.grid_options['verbosity'])" + ] + }, + { + "cell_type": "markdown", + "id": "f9a65554-36ab-4a04-96ca-9f1422c307fd", + "metadata": {}, + "source": [ + "## Adding grid variables\n", + "The main purpose of the Population object is to handle the population synthesis side of running a set of stars. The main method to do this with binarycpython, as is the case with Perl binarygrid, is to use grid variables. These are loops over a predefined range of values, where a probability will be assigned to the systems based on the chosen probability distributions.\n", + "\n", + "Usually we use either 1 mass grid variable, or a trio of mass, mass ratio and period (other notebooks cover these examples). We can, however, also add grid sampling for e.g. eccentricity, metallicity or other parameters. \n", + "\n", + "To add a grid variable to the population object we use `population.add_grid_variable`" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "68c84521-9ae8-4020-af7a-5334173db969", + "metadata": {}, + "outputs": [], + "source": [ + "# help(population.add_grid_variable)" + ] + }, + { + "cell_type": "markdown", + "id": "bd75cebe-2152-4025-b680-dc020b80889b", + "metadata": {}, + "source": [ + "All the distribution functions that we can use are stored in the `binarycpython.utils.distribution_functions` or `binarycpython/utils/distribution_functions.py` on git. If you uncomment the help statement below you can see which functions are available now:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "048db541-3e92-4c5d-a25c-9c5a34b9c857", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "import binarycpython.utils.distribution_functions\n", + "# help(binarycpython.utils.distribution_functions)" + ] + }, + { + "cell_type": "markdown", + "id": "2a9104fc-4136-4e53-8604-f24ad52fbe56", + "metadata": {}, + "source": [ + "First let us set up some global variables that will be useful throughout. \n", + "* The resolution is the number of stars we simulate in our model population.\n", + "* The massrange is a list of the min and max masses\n", + "* The total_probability is the theoretical integral of a probability density function, i.e. 1.0.\n", + "* The binwidth sets the resolution of the final distribution. If set to 0.5, the bins in log*L* are 0.5dex wide." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "aba3fe4e-18f2-4bb9-8e5c-4c6007ab038b", + "metadata": {}, + "outputs": [], + "source": [ + "# Set resolution and mass range that we simulate\n", + "resolution = {\"M_1\": 40} # start with resolution = 10, and increase later if you want \"more accurate\" data\n", + "massrange = (0.07, 100.0) # we work with stars of mass 0.07 to 100 Msun\n", + "total_probability = 1.0 # theoretical integral of the mass probability density function over all masses \n", + "# distribution binwidths : \n", + "# (log10) luminosity distribution\n", + "binwidth = { 'luminosity' : 1.0 }" + ] + }, + { + "cell_type": "markdown", + "id": "1b3a007b-5c17-42a7-a981-7e268e6f545c", + "metadata": {}, + "source": [ + "The next cell contains an example of adding the mass grid variable, sampling the phase space in linear mass *M*_1." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "47979841-2c26-4b26-8945-603d013dc93a", + "metadata": {}, + "outputs": [], + "source": [ + "# Set up the binary grid in \"cubic\" M1 - M2=q*M1 - log10 period space\n", + "\n", + "population = Population()\n", + "\n", + "# resolution on each side of the cube, with more stars for the primary mass\n", + "nres = 10\n", + "resolution = {\"M_1\": 2*nres,\n", + " \"q\": nres,\n", + " \"per\": nres}\n", + "\n", + "massrange = [0.07,100]\n", + "logperrange = [0.15, 5.5]\n", + "\n", + "population.add_grid_variable(\n", + " name=\"lnm1\",\n", + " longname=\"Primary mass\",\n", + " valuerange=massrange,\n", + " resolution=\"{}\".format(resolution[\"M_1\"]),\n", + " spacingfunc=\"const(math.log({min}), math.log({max}), {res})\".format(min=massrange[0],max=massrange[1],res=resolution[\"M_1\"]),\n", + " precode=\"M_1=math.exp(lnm1)\",\n", + " probdist=\"three_part_powerlaw(M_1, 0.1, 0.5, 1.0, 150, -1.3, -2.3, -2.3)*M_1\",\n", + " dphasevol=\"dlnm1\",\n", + " parameter_name=\"M_1\",\n", + " condition=\"\", # Impose a condition on this grid variable. Mostly for a check for yourself\n", + ")\n", + "\n", + "# Mass ratio\n", + "population.add_grid_variable(\n", + " name=\"q\",\n", + " longname=\"Mass ratio\",\n", + " valuerange=[\"0.1/M_1\", 1],\n", + " resolution=\"{}\".format(resolution['q']),\n", + " spacingfunc=\"const({}/M_1, 1, {})\".format(massrange[0],resolution['q']),\n", + " probdist=\"flatsections(q, [{{'min': {}/M_1, 'max': 1.0, 'height': 1}}])\".format(massrange[0]),\n", + " dphasevol=\"dq\",\n", + " precode=\"M_2 = q * M_1\",\n", + " parameter_name=\"M_2\",\n", + " condition=\"\", # Impose a condition on this grid variable. Mostly for a check for yourself\n", + " )\n", + "\n", + "# Orbital period\n", + "population.add_grid_variable(\n", + " name=\"log10per\", # in days\n", + " longname=\"log10(Orbital_Period)\",\n", + " valuerange=[0.15, 5.5],\n", + " resolution=\"{}\".format(resolution[\"per\"]),\n", + " spacingfunc=\"const({}, {}, {})\".format(logperrange[0],logperrange[1],resolution[\"per\"]),\n", + " precode=\"\"\"orbital_period = 10.0 ** log10per\n", + "sep = calc_sep_from_period(M_1, M_2, orbital_period)\n", + "sep_min = calc_sep_from_period(M_1, M_2, 10**{})\n", + "sep_max = calc_sep_from_period(M_1, M_2, 10**{})\"\"\".format(logperrange[0],logperrange[1]),\n", + " probdist=\"sana12(M_1, M_2, sep, orbital_period, sep_min, sep_max, math.log10(10**{}), math.log10(10**{}), {})\".format(logperrange[0],logperrange[1],-0.55),\n", + " parameter_name=\"orbital_period\",\n", + " dphasevol=\"dlog10per\",\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "163f13ae-fec1-4ee8-b9d4-c1b75c19ff39", + "metadata": {}, + "source": [ + "## Setting logging and handling the output\n", + "By default, binary_c will not output anything (except for 'SINGLE STAR LIFETIME'). It is up to us to determine what will be printed. We can either do that by hardcoding the print statements into `binary_c` (see documentation binary_c) or we can use the custom logging functionality of binarycpython (see notebook `notebook_custom_logging.ipynb`), which is faster to set up and requires no recompilation of binary_c, but is somewhat more limited in its functionality. For our current purposes, it works perfectly well.\n", + "\n", + "After configuring what will be printed, we need to make a function to parse the output. This can be done by setting the parse_function parameter in the population object (see also notebook `notebook_individual_systems.ipynb`). \n", + "\n", + "In the code below we will set up both the custom logging and a parse function to handle that output." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0c986215-93b1-4e30-ad79-f7c397e9ff7d", + "metadata": {}, + "outputs": [], + "source": [ + "# Create custom logging statement\n", + "#\n", + "# we check that the model number is zero, i.e. we're on the first timestep (stars are born on the ZAMS)\n", + "# we make sure that the stellar type is <= MAIN_SEQUENCE, i.e. the star is a main-sequence star\n", + "# we also check that the time is 0.0 (this is not strictly required, but good to show how it is done)\n", + "#\n", + "# The \n", + "#\n", + "# The Printf statement does the outputting: note that the header string is ZERO_AGE_MAIN_SEQUENCE_STARn\n", + "#\n", + "# where:\n", + "#\n", + "# n = PRIMARY = 0 is star 0 (primary star)\n", + "# n = SECONDARY = 1 is star 1 (secondary star)\n", + "# n = UNRESOLVED = 2 is the unresolved system (both stars added)\n", + "\n", + "PRIMARY = 0\n", + "SECONDARY = 1\n", + "UNRESOLVED = 2\n", + "\n", + "custom_logging_statement = \"\"\"\n", + "// select ZAMS\n", + "if(stardata->model.model_number == 0 &&\n", + " stardata->model.time == 0)\n", + "{\n", + " // loop over the stars individually (equivalent to a resolved binary) \n", + " Foreach_star(star)\n", + " {\n", + " // select main-sequence stars\n", + " if(star->stellar_type <= MAIN_SEQUENCE)\n", + " {\n", + " /* Note that we use Printf - with a capital P! */\n", + " Printf(\"ZERO_AGE_MAIN_SEQUENCE_STAR%d %30.12e %g %g %g %g\\\\n\",\n", + " star->starnum,\n", + " stardata->model.time, // 1\n", + " stardata->common.zero_age.mass[0], // 2\n", + " star->mass, // 3\n", + " star->luminosity, // 4\n", + " stardata->model.probability // 5\n", + " );\n", + " }\n", + " }\n", + " \n", + " // unresolved MS-MS binary\n", + " if(stardata->star[0].stellar_type <= MAIN_SEQUENCE &&\n", + " stardata->star[1].stellar_type <= MAIN_SEQUENCE) \n", + " {\n", + " Printf(\"ZERO_AGE_MAIN_SEQUENCE_STAR%d %30.12e %g %g %g %g\\\\n\",\n", + " 2,\n", + " stardata->model.time, // 1\n", + " stardata->common.zero_age.mass[0] + stardata->common.zero_age.mass[1], // 2\n", + " stardata->star[0].mass + stardata->star[1].mass, // 3\n", + " stardata->star[0].luminosity + stardata->star[1].luminosity, // 4\n", + " stardata->model.probability // 5\n", + " );\n", + " }\n", + "}\n", + "\"\"\"\n", + "\n", + "population.set(\n", + " C_logging_code=custom_logging_statement\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "ae1f1f0c-1f8b-42d8-b051-cbf8c6b51514", + "metadata": {}, + "source": [ + "The parse function must now catch lines that start with \"ZERO_AGE_MAIN_SEQUENCE_STAR\" and process the associated data." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "fd197154-a8ce-4865-8929-008d3483101a", + "metadata": {}, + "outputs": [], + "source": [ + "# import the bin_data function so we can construct finite-resolution probability distributions\n", + "# import the datalinedict to make a dictionary from each line of data from binary_c\n", + "from binarycpython.utils.functions import bin_data,datalinedict\n", + "import re\n", + "\n", + "def parse_function(self, output):\n", + " \"\"\"\n", + " Example parse function\n", + " \"\"\"\n", + " \n", + " # list of the data items\n", + " parameters = [\"header\", \"time\", \"zams_mass\", \"mass\", \"luminosity\", \"probability\"]\n", + " \n", + " # Loop over the output.\n", + " for line in output.splitlines():\n", + " \n", + " # check if we match a ZERO_AGE_MAIN_SEQUENCE_STAR\n", + " match = re.search('ZERO_AGE_MAIN_SEQUENCE_STAR(\\d)',line) \n", + " if match:\n", + " nstar = match.group(1) \n", + " #print(\"matched star\",nstar)\n", + "\n", + " # obtain the line of data in dictionary form \n", + " linedata = datalinedict(line,parameters)\n", + "\n", + " # bin the log10(luminosity) to the nearest 0.1dex\n", + " binned_log_luminosity = bin_data(math.log10(linedata['luminosity']),\n", + " binwidth['luminosity'])\n", + " \n", + " # append the data to the results_dictionary \n", + " self.grid_results['luminosity distribution'][int(nstar)][binned_log_luminosity] += linedata['probability'] \n", + " \n", + " #print (self.grid_results)\n", + " \n", + " # verbose reporting\n", + " #print(\"parse out results_dictionary=\",self.grid_results)\n", + " \n", + "# Add the parsing function\n", + "population.set(\n", + " parse_function=parse_function,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "91509ce5-ffe7-4937-aa87-6d7baac9ac04", + "metadata": {}, + "source": [ + "## Evolving the grid\n", + "Now that we configured all the main parts of the population object, we can actually run the population! Doing this is straightforward: `population.evolve()`\n", + "\n", + "This will start up the processing of all the systems. We can control how many cores are used by settings `amt_cores`. By setting the `verbosity` of the population object to a higher value we can get a lot of verbose information about the run, but for now we will set it to 0.\n", + "\n", + "There are many grid_options that can lead to different behaviour of the evolution of the grid. Please do have a look at those: [grid options docs](https://ri0005.pages.surrey.ac.uk/binary_c-python/grid_options_descriptions.html), and try " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8ea376c1-1e92-45af-8cab-9d7fdca564eb", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "adding: amt_cores=4 to grid_options\n", + "Running the population now, this may take a little while...\n", + "Creating and loading custom logging functionality\n", + "Generating grid code\n", + "Generating grid code\n", + "Constructing/adding: lnm1\n", + "Constructing/adding: q\n", + "Constructing/adding: log10per\n", + "Saving grid code to grid_options\n", + "Writing grid code to /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Loading grid code function from /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Grid code loaded\n", + "Grid has handled 2000 stars\n", + "with a total probability of 0.6495098935846658\n", + "Total starcount for this run will be: 2000\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:14:08,077 DEBUG Process-2] --- Setting up processor: process-0[2021-09-10 15:14:08,080 DEBUG Process-3] --- Setting up processor: process-1[2021-09-10 15:14:08,086 DEBUG MainProcess] --- setting up the system_queue_filler now\n", + "\n", + "[2021-09-10 15:14:08,084 DEBUG Process-4] --- Setting up processor: process-2\n", + "\n", + "[2021-09-10 15:14:08,117 DEBUG Process-5] --- Setting up processor: process-3" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 1 started at 2021-09-10T15:14:08.119437.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff53810>Process 0 started at 2021-09-10T15:14:08.126435.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff539f0>\n", + "Process 2 started at 2021-09-10T15:14:08.138353.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff539f0>" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "Process 3 started at 2021-09-10T15:14:08.186492.\tUsing store memaddr <capsule object \"STORE\" at 0x7f351ff53810>\n", + "Generating grid code\n", + "Generating grid code\n", + "Constructing/adding: lnm1\n", + "Constructing/adding: q\n", + "Constructing/adding: log10per\n", + "Saving grid code to grid_options\n", + "Writing grid code to /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Loading grid code function from /tmp/binary_c_python/binary_c_grid_0fa295ee5c76444bace8fd0ee17a3e11.py\n", + "Grid code loaded\n", + "624/2000 31.2% complete 15:14:12 ETA= 11.1s tpr=8.05e-03 ETF=15:14:23 mem:800.5MB625/2000 31.2% complete 15:14:12 ETA= 11.1s tpr=8.04e-03 ETF=15:14:23 mem:800.5MB\n", + "626/2000 31.3% complete 15:14:12 ETA= 11.1s tpr=8.05e-03 ETF=15:14:23 mem:800.5MB\n", + "\n", + "713/2000 35.6% complete 15:14:17 ETA= 1.3m tpr=6.00e-02 ETF=15:15:34 mem:547.8MB\n", + "728/2000 36.4% complete 15:14:22 ETA= 7.1m tpr=3.37e-01 ETF=15:21:30 mem:548.1MB\n", + "743/2000 37.1% complete 15:14:27 ETA= 7.0m tpr=3.34e-01 ETF=15:21:26 mem:549.5MB\n", + "759/2000 38.0% complete 15:14:33 ETA= 7.7m tpr=3.73e-01 ETF=15:22:16 mem:550.5MB\n", + "774/2000 38.7% complete 15:14:38 ETA= 6.9m tpr=3.35e-01 ETF=15:21:29 mem:551.1MB\n", + "787/2000 39.4% complete 15:14:43 ETA= 7.8m tpr=3.88e-01 ETF=15:22:33 mem:551.1MB\n", + "799/2000 40.0% complete 15:14:48 ETA= 8.5m tpr=4.24e-01 ETF=15:23:17 mem:552.5MB\n", + "812/2000 40.6% complete 15:14:54 ETA= 8.4m tpr=4.23e-01 ETF=15:23:16 mem:554.8MB\n", + "830/2000 41.5% complete 15:14:59 ETA= 5.5m tpr=2.80e-01 ETF=15:20:26 mem:555.2MB\n", + "847/2000 42.4% complete 15:15:05 ETA= 6.8m tpr=3.52e-01 ETF=15:21:50 mem:555.2MB\n", + "864/2000 43.2% complete 15:15:10 ETA= 6.2m tpr=3.28e-01 ETF=15:21:23 mem:557.0MB\n", + "876/2000 43.8% complete 15:15:15 ETA= 8.2m tpr=4.38e-01 ETF=15:23:27 mem:559.7MB\n", + "887/2000 44.4% complete 15:15:21 ETA= 9.2m tpr=4.95e-01 ETF=15:24:32 mem:560.5MB\n", + "898/2000 44.9% complete 15:15:26 ETA= 9.2m tpr=4.99e-01 ETF=15:24:37 mem:560.5MB\n", + "908/2000 45.4% complete 15:15:32 ETA= 9.5m tpr=5.23e-01 ETF=15:25:03 mem:560.5MB\n", + "919/2000 46.0% complete 15:15:37 ETA= 8.3m tpr=4.60e-01 ETF=15:23:54 mem:560.9MB\n", + "934/2000 46.7% complete 15:15:42 ETA= 6.4m tpr=3.60e-01 ETF=15:22:06 mem:561.7MB\n", + "947/2000 47.4% complete 15:15:47 ETA= 7.2m tpr=4.08e-01 ETF=15:22:57 mem:561.7MB\n", + "956/2000 47.8% complete 15:15:53 ETA= 11.1m tpr=6.39e-01 ETF=15:27:01 mem:561.7MB\n", + "963/2000 48.1% complete 15:15:58 ETA= 12.6m tpr=7.30e-01 ETF=15:28:35 mem:561.7MB\n", + "969/2000 48.5% complete 15:16:04 ETA= 15.2m tpr=8.85e-01 ETF=15:31:16 mem:561.9MB\n", + "979/2000 49.0% complete 15:16:11 ETA= 11.9m tpr=7.01e-01 ETF=15:28:06 mem:562.0MB\n", + "988/2000 49.4% complete 15:16:16 ETA= 9.7m tpr=5.76e-01 ETF=15:25:59 mem:562.0MB\n", + "995/2000 49.8% complete 15:16:21 ETA= 12.3m tpr=7.37e-01 ETF=15:28:42 mem:562.2MB\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:16:25,175 DEBUG MainProcess] --- Signaling stop to processes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1003/2000 50.1% complete 15:16:26 ETA= 11.2m tpr=6.76e-01 ETF=15:27:40 mem:563.0MB\n", + "1015/2000 50.8% complete 15:16:32 ETA= 7.6m tpr=4.65e-01 ETF=15:24:10 mem:563.0MB\n", + "1025/2000 51.2% complete 15:16:37 ETA= 8.1m tpr=5.01e-01 ETF=15:24:45 mem:563.0MB\n", + "1033/2000 51.6% complete 15:16:42 ETA= 10.7m tpr=6.65e-01 ETF=15:27:26 mem:563.0MB\n", + "1040/2000 52.0% complete 15:16:47 ETA= 12.1m tpr=7.55e-01 ETF=15:28:52 mem:563.5MB\n", + "1048/2000 52.4% complete 15:16:53 ETA= 11.8m tpr=7.45e-01 ETF=15:28:42 mem:563.5MB\n", + "1057/2000 52.9% complete 15:16:59 ETA= 9.1m tpr=5.78e-01 ETF=15:26:03 mem:563.6MB\n", + "1062/2000 53.1% complete 15:17:04 ETA= 15.7m tpr=1.01e+00 ETF=15:32:47 mem:564.4MB\n", + "1069/2000 53.5% complete 15:17:09 ETA= 12.4m tpr=7.97e-01 ETF=15:29:31 mem:564.9MB\n", + "1077/2000 53.9% complete 15:17:15 ETA= 11.5m tpr=7.46e-01 ETF=15:28:44 mem:565.0MB\n", + "1085/2000 54.2% complete 15:17:20 ETA= 10.0m tpr=6.55e-01 ETF=15:27:20 mem:565.0MB\n", + "1091/2000 54.5% complete 15:17:26 ETA= 13.8m tpr=9.10e-01 ETF=15:31:13 mem:565.9MB\n", + "1099/2000 55.0% complete 15:17:32 ETA= 12.1m tpr=8.05e-01 ETF=15:29:37 mem:566.5MB\n", + "1114/2000 55.7% complete 15:17:37 ETA= 5.0m tpr=3.35e-01 ETF=15:22:34 mem:566.5MB\n", + "1126/2000 56.3% complete 15:17:43 ETA= 6.8m tpr=4.64e-01 ETF=15:24:29 mem:566.5MB\n", + "1134/2000 56.7% complete 15:17:48 ETA= 9.2m tpr=6.37e-01 ETF=15:27:00 mem:566.6MB\n", + "1139/2000 57.0% complete 15:17:54 ETA= 16.3m tpr=1.14e+00 ETF=15:34:13 mem:567.4MB\n", + "1148/2000 57.4% complete 15:17:59 ETA= 8.8m tpr=6.20e-01 ETF=15:26:47 mem:567.4MB\n", + "1156/2000 57.8% complete 15:18:05 ETA= 9.3m tpr=6.60e-01 ETF=15:27:22 mem:567.5MB\n", + "1162/2000 58.1% complete 15:18:11 ETA= 14.3m tpr=1.02e+00 ETF=15:32:28 mem:567.6MB\n", + "1168/2000 58.4% complete 15:18:17 ETA= 15.2m tpr=1.09e+00 ETF=15:33:27 mem:568.6MB\n", + "1177/2000 58.9% complete 15:18:23 ETA= 8.8m tpr=6.45e-01 ETF=15:27:14 mem:568.6MB\n", + "1181/2000 59.0% complete 15:18:28 ETA= 17.8m tpr=1.30e+00 ETF=15:36:16 mem:568.7MB\n", + "1187/2000 59.4% complete 15:18:34 ETA= 12.1m tpr=8.93e-01 ETF=15:30:40 mem:568.7MB\n", + "1194/2000 59.7% complete 15:18:39 ETA= 9.8m tpr=7.29e-01 ETF=15:28:26 mem:568.8MB\n", + "1202/2000 60.1% complete 15:18:44 ETA= 9.5m tpr=7.12e-01 ETF=15:28:12 mem:568.8MB\n", + "1219/2000 61.0% complete 15:18:51 ETA= 5.3m tpr=4.07e-01 ETF=15:24:09 mem:569.7MB\n", + "1228/2000 61.4% complete 15:18:57 ETA= 7.4m tpr=5.76e-01 ETF=15:26:21 mem:569.7MB\n", + "1234/2000 61.7% complete 15:19:02 ETA= 11.8m tpr=9.22e-01 ETF=15:30:48 mem:571.7MB1235/2000 61.8% complete 15:19:02 ETA= 10.1m tpr=7.92e-01 ETF=15:29:08 mem:571.7MB\n", + "\n", + "1243/2000 62.1% complete 15:19:07 ETA= 7.3m tpr=5.79e-01 ETF=15:26:26 mem:573.4MB\n", + "1251/2000 62.5% complete 15:19:13 ETA= 8.3m tpr=6.68e-01 ETF=15:27:33 mem:575.4MB\n", + "1260/2000 63.0% complete 15:19:19 ETA= 8.2m tpr=6.65e-01 ETF=15:27:31 mem:575.4MB\n", + "1268/2000 63.4% complete 15:19:24 ETA= 7.8m tpr=6.41e-01 ETF=15:27:13 mem:576.8MB\n", + "1276/2000 63.8% complete 15:19:29 ETA= 7.6m tpr=6.30e-01 ETF=15:27:05 mem:577.0MB\n", + "1282/2000 64.1% complete 15:19:34 ETA= 10.1m tpr=8.44e-01 ETF=15:29:40 mem:578.0MB\n", + "1289/2000 64.5% complete 15:19:40 ETA= 10.8m tpr=9.08e-01 ETF=15:30:26 mem:578.0MB\n", + "1295/2000 64.8% complete 15:19:46 ETA= 10.5m tpr=8.95e-01 ETF=15:30:16 mem:578.1MB\n", + "1309/2000 65.5% complete 15:19:51 ETA= 4.3m tpr=3.70e-01 ETF=15:24:06 mem:578.1MB\n", + "1323/2000 66.2% complete 15:19:58 ETA= 6.1m tpr=5.45e-01 ETF=15:26:07 mem:579.2MB\n", + "1332/2000 66.6% complete 15:20:03 ETA= 6.2m tpr=5.58e-01 ETF=15:26:16 mem:579.3MB\n", + "1338/2000 66.9% complete 15:20:09 ETA= 10.1m tpr=9.11e-01 ETF=15:30:12 mem:579.3MB\n", + "1346/2000 67.3% complete 15:20:18 ETA= 12.5m tpr=1.14e+00 ETF=15:32:46 mem:581.5MB\n", + "1355/2000 67.8% complete 15:20:25 ETA= 8.5m tpr=7.90e-01 ETF=15:28:54 mem:581.6MB\n", + "1359/2000 68.0% complete 15:20:30 ETA= 13.9m tpr=1.30e+00 ETF=15:34:26 mem:581.6MB\n", + "1366/2000 68.3% complete 15:20:38 ETA= 11.7m tpr=1.10e+00 ETF=15:32:18 mem:581.7MB\n", + "1376/2000 68.8% complete 15:20:44 ETA= 6.1m tpr=5.89e-01 ETF=15:26:51 mem:581.7MB\n", + "1384/2000 69.2% complete 15:20:49 ETA= 6.9m tpr=6.76e-01 ETF=15:27:46 mem:581.7MB\n", + "1393/2000 69.7% complete 15:20:55 ETA= 6.2m tpr=6.13e-01 ETF=15:27:07 mem:581.8MB1394/2000 69.7% complete 15:20:55 ETA= 5.6m tpr=5.52e-01 ETF=15:26:29 mem:581.8MB\n", + "\n", + "1423/2000 71.2% complete 15:21:00 ETA= 1.6m tpr=1.69e-01 ETF=15:22:37 mem:581.9MB\n", + "1435/2000 71.8% complete 15:21:07 ETA= 5.6m tpr=5.92e-01 ETF=15:26:42 mem:582.3MB\n", + "1443/2000 72.2% complete 15:21:12 ETA= 6.1m tpr=6.54e-01 ETF=15:27:17 mem:582.5MB\n", + "1445/2000 72.2% complete 15:21:18 ETA= 28.2m tpr=3.05e+00 ETF=15:49:28 mem:582.6MB\n", + "1448/2000 72.4% complete 15:21:25 ETA= 20.0m tpr=2.18e+00 ETF=15:41:27 mem:582.6MB\n", + "1454/2000 72.7% complete 15:21:31 ETA= 8.6m tpr=9.49e-01 ETF=15:30:09 mem:583.0MB\n", + "1455/2000 72.8% complete 15:21:37 ETA= 54.9m tpr=6.05e+00 ETF=16:16:32 mem:583.0MB\n", + "1459/2000 73.0% complete 15:21:43 ETA= 13.5m tpr=1.50e+00 ETF=15:35:12 mem:583.0MB\n", + "1465/2000 73.2% complete 15:21:48 ETA= 8.6m tpr=9.65e-01 ETF=15:30:25 mem:583.0MB\n", + "1474/2000 73.7% complete 15:21:54 ETA= 5.6m tpr=6.38e-01 ETF=15:27:30 mem:583.0MB\n", + "1482/2000 74.1% complete 15:21:59 ETA= 5.4m tpr=6.30e-01 ETF=15:27:26 mem:583.0MB\n", + "1485/2000 74.2% complete 15:22:04 ETA= 14.8m tpr=1.73e+00 ETF=15:36:54 mem:583.5MB\n", + "1487/2000 74.3% complete 15:22:10 ETA= 24.9m tpr=2.91e+00 ETF=15:47:02 mem:583.5MB\n", + "1496/2000 74.8% complete 15:22:16 ETA= 5.0m tpr=5.91e-01 ETF=15:27:13 mem:583.7MB\n", + "1509/2000 75.5% complete 15:22:21 ETA= 3.6m tpr=4.40e-01 ETF=15:25:57 mem:583.9MB\n", + "1523/2000 76.2% complete 15:22:27 ETA= 3.0m tpr=3.80e-01 ETF=15:25:28 mem:583.9MB\n", + "1531/2000 76.5% complete 15:22:33 ETA= 5.9m tpr=7.60e-01 ETF=15:28:29 mem:583.9MB\n", + "1537/2000 76.8% complete 15:22:38 ETA= 6.7m tpr=8.71e-01 ETF=15:29:21 mem:583.9MB\n", + "1545/2000 77.2% complete 15:22:44 ETA= 5.4m tpr=7.14e-01 ETF=15:28:08 mem:584.0MB\n", + "1555/2000 77.8% complete 15:22:49 ETA= 4.1m tpr=5.52e-01 ETF=15:26:55 mem:584.2MB\n", + "1564/2000 78.2% complete 15:22:54 ETA= 4.2m tpr=5.78e-01 ETF=15:27:06 mem:584.2MB\n", + "1574/2000 78.7% complete 15:23:00 ETA= 4.4m tpr=6.16e-01 ETF=15:27:23 mem:584.4MB\n", + "1584/2000 79.2% complete 15:23:07 ETA= 4.4m tpr=6.28e-01 ETF=15:27:28 mem:584.8MB\n", + "1594/2000 79.7% complete 15:23:12 ETA= 3.8m tpr=5.66e-01 ETF=15:27:02 mem:584.9MB\n", + "1607/2000 80.3% complete 15:23:17 ETA= 2.5m tpr=3.86e-01 ETF=15:25:49 mem:585.0MB\n", + "1618/2000 80.9% complete 15:23:24 ETA= 3.8m tpr=5.97e-01 ETF=15:27:12 mem:585.4MB\n", + "1628/2000 81.4% complete 15:23:29 ETA= 3.3m tpr=5.28e-01 ETF=15:26:46 mem:585.5MB\n", + "1635/2000 81.8% complete 15:23:34 ETA= 4.4m tpr=7.30e-01 ETF=15:28:01 mem:585.9MB\n", + "1645/2000 82.2% complete 15:23:40 ETA= 3.4m tpr=5.81e-01 ETF=15:27:06 mem:585.9MB\n", + "1655/2000 82.8% complete 15:23:47 ETA= 4.0m tpr=7.02e-01 ETF=15:27:49 mem:586.0MB1656/2000 82.8% complete 15:23:47 ETA= 3.7m tpr=6.39e-01 ETF=15:27:27 mem:586.0MB\n", + "\n", + "1664/2000 83.2% complete 15:23:54 ETA= 4.5m tpr=8.01e-01 ETF=15:28:23 mem:586.1MB\n", + "1674/2000 83.7% complete 15:24:02 ETA= 4.5m tpr=8.27e-01 ETF=15:28:31 mem:586.2MB\n", + "1684/2000 84.2% complete 15:24:07 ETA= 2.9m tpr=5.55e-01 ETF=15:27:03 mem:586.2MB\n", + "1691/2000 84.5% complete 15:24:13 ETA= 4.2m tpr=8.21e-01 ETF=15:28:27 mem:586.5MB\n", + "1699/2000 85.0% complete 15:24:19 ETA= 3.4m tpr=6.75e-01 ETF=15:27:42 mem:586.5MB\n", + "1713/2000 85.7% complete 15:24:24 ETA= 1.9m tpr=4.07e-01 ETF=15:26:21 mem:586.6MB\n", + "1725/2000 86.2% complete 15:24:31 ETA= 2.6m tpr=5.57e-01 ETF=15:27:04 mem:586.7MB\n", + "1735/2000 86.8% complete 15:24:38 ETA= 3.0m tpr=6.76e-01 ETF=15:27:37 mem:586.7MB\n", + "1745/2000 87.2% complete 15:24:44 ETA= 2.7m tpr=6.40e-01 ETF=15:27:27 mem:586.9MB\n", + "1755/2000 87.8% complete 15:24:51 ETA= 2.8m tpr=6.88e-01 ETF=15:27:40 mem:586.9MB\n", + "1763/2000 88.2% complete 15:24:56 ETA= 2.6m tpr=6.59e-01 ETF=15:27:32 mem:586.9MB\n", + "1767/2000 88.3% complete 15:25:02 ETA= 5.3m tpr=1.36e+00 ETF=15:30:18 mem:586.9MB\n", + "1776/2000 88.8% complete 15:25:09 ETA= 2.9m tpr=7.71e-01 ETF=15:28:01 mem:586.9MB\n", + "1785/2000 89.2% complete 15:25:14 ETA= 2.1m tpr=5.90e-01 ETF=15:27:21 mem:586.9MB\n", + "1793/2000 89.7% complete 15:25:19 ETA= 2.2m tpr=6.29e-01 ETF=15:27:29 mem:587.1MB\n", + "1801/2000 90.0% complete 15:25:24 ETA= 2.2m tpr=6.59e-01 ETF=15:27:35 mem:587.1MB\n", + "1812/2000 90.6% complete 15:25:29 ETA= 1.5m tpr=4.68e-01 ETF=15:26:57 mem:587.1MB\n", + "1822/2000 91.1% complete 15:25:35 ETA= 1.6m tpr=5.54e-01 ETF=15:27:14 mem:587.4MB\n", + "1830/2000 91.5% complete 15:25:41 ETA= 2.1m tpr=7.49e-01 ETF=15:27:48 mem:587.4MB\n", + "1839/2000 92.0% complete 15:25:47 ETA= 1.7m tpr=6.21e-01 ETF=15:27:27 mem:587.4MB\n", + "1847/2000 92.3% complete 15:25:52 ETA= 1.8m tpr=7.10e-01 ETF=15:27:41 mem:587.4MB\n", + "1855/2000 92.8% complete 15:25:59 ETA= 2.0m tpr=8.17e-01 ETF=15:27:57 mem:587.6MB\n", + "1864/2000 93.2% complete 15:26:05 ETA= 1.5m tpr=6.79e-01 ETF=15:27:37 mem:587.8MB\n", + "1873/2000 93.7% complete 15:26:10 ETA= 1.3m tpr=6.07e-01 ETF=15:27:27 mem:588.0MB\n", + "1884/2000 94.2% complete 15:26:16 ETA= 57.0s tpr=4.91e-01 ETF=15:27:13 mem:588.1MB\n", + "1895/2000 94.8% complete 15:26:21 ETA= 48.7s tpr=4.63e-01 ETF=15:27:09 mem:588.8MB\n", + "1907/2000 95.3% complete 15:26:27 ETA= 45.6s tpr=4.91e-01 ETF=15:27:12 mem:588.9MB\n", + "1916/2000 95.8% complete 15:26:33 ETA= 57.5s tpr=6.84e-01 ETF=15:27:30 mem:589.1MB\n", + "1926/2000 96.3% complete 15:26:39 ETA= 46.5s tpr=6.28e-01 ETF=15:27:26 mem:589.1MB\n", + "1936/2000 96.8% complete 15:26:46 ETA= 42.0s tpr=6.57e-01 ETF=15:27:28 mem:589.1MB\n", + "1946/2000 97.3% complete 15:26:53 ETA= 40.1s tpr=7.42e-01 ETF=15:27:33 mem:589.2MB\n", + "1956/2000 97.8% complete 15:26:59 ETA= 25.1s tpr=5.70e-01 ETF=15:27:24 mem:589.2MB\n", + "1966/2000 98.3% complete 15:27:04 ETA= 19.1s tpr=5.62e-01 ETF=15:27:24 mem:589.5MB\n", + "1976/2000 98.8% complete 15:27:10 ETA= 14.4s tpr=6.01e-01 ETF=15:27:25 mem:589.5MB\n", + "1987/2000 99.3% complete 15:27:16 ETA= 6.4s tpr=4.92e-01 ETF=15:27:22 mem:589.5MB\n", + "1998/2000 99.9% complete 15:27:21 ETA= 1.0s tpr=4.85e-01 ETF=15:27:22 mem:589.6MB\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,382 DEBUG Process-5] --- Process-3 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 3 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.117391, done at 2021-09-10T15:27:22.400722 (total: 794.283331s of which 792.6935975551605s interfacing with binary_c).\n", + "\tRan 499 systems with a total probability of 0.17005450973840136.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,435 DEBUG Process-5] --- Process-3 is finished.\n", + "[2021-09-10 15:27:22,480 DEBUG Process-3] --- Process-1 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 1 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.080367, done at 2021-09-10T15:27:22.505288 (total: 794.424921s of which 793.1943278312683s interfacing with binary_c).\n", + "\tRan 474 systems with a total probability of 0.15740832333567983.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,531 DEBUG Process-3] --- Process-1 is finished.\n", + "[2021-09-10 15:27:22,846 DEBUG Process-2] --- Process-0 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 0 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.077117, done at 2021-09-10T15:27:22.851971 (total: 794.774854s of which 793.4976091384888s interfacing with binary_c).\n", + "\tRan 507 systems with a total probability of 0.16018641159091498.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,872 DEBUG Process-2] --- Process-0 is finished.\n", + "[2021-09-10 15:27:22,976 DEBUG Process-4] --- Process-2 is finishing.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Process 2 finished:\n", + "\tgenerator started at 2021-09-10T15:14:08.084369, done at 2021-09-10T15:27:22.981706 (total: 794.897337s of which 793.4600214958191s interfacing with binary_c).\n", + "\tRan 520 systems with a total probability of 0.1618606489196724.\n", + "\tThis thread had 0 failing systems with a total probability of 0.\n", + "\tSkipped a total of 0 systems because they had 0 probability\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2021-09-10 15:27:22,986 DEBUG Process-4] --- Process-2 is finished.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Population-0fa295ee5c76444bace8fd0ee17a3e11 finished! The total probability was: 0.6495098935846686. It took a total of 795.1383104324341s to run 2000 systems on 4 cores\n", + "There were no errors found in this run.\n", + "Done population run!\n" + ] + } + ], + "source": [ + "# set number of threads\n", + "population.set(\n", + " # verbose output is not required \n", + " verbosity=1,\n", + " # set number of threads (i.e. number of CPU cores we use)\n", + " amt_cores=4,\n", + " )\n", + "\n", + "# Evolve the population - this is the slow, number-crunching step\n", + "print(\"Running the population now, this may take a little while...\")\n", + "analytics = population.evolve() \n", + "print(\"Done population run!\")\n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "markdown", + "id": "91ab45c7-7d31-4543-aee4-127ab58e891f", + "metadata": {}, + "source": [ + "After the run is complete, some technical report on the run is returned. I stored that in `analytics`. As we can see below, this dictionary is like a status report of the evolution. Useful for e.g. debugging." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e1f0464b-0424-4022-b34b-5b744bc2c59d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'population_name': '0fa295ee5c76444bace8fd0ee17a3e11', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 0.6495098935846686, 'total_count': 2000, 'start_timestamp': 1631283248.057525, 'end_timestamp': 1631284043.1958354, 'total_mass_run': 41112.220964392276, 'total_probability_weighted_mass_run': 0.6452116023479681, 'zero_prob_stars_skipped': 0}\n" + ] + } + ], + "source": [ + "print(analytics)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "05c6d132-abee-423e-b1a8-2039c8996fbc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[None]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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p9///vdq2bKlJKlFixbavn274VSIBLNnz1aPHj1Uq1YtJSQkaMiQIZoyZYrpWIggWVlZuuWWW+TxeOR2u9WkSRNt27bNdCxEmIKCAj3xxBO66qqrTEdBBPrkk080fPhw1a5dW263W0888YQ6dOhgOhYiSDAYVCgUUllZmQKBgAKBgLxer+lYMYMB0//YvHmz6tatqwceeEBnnXWWbrjhBrndbtOxEGFmzJih8vJyDR061HQURCCPx6Ozzz5bkhQKhTR+/HgNHDjQcCpEgl27dikrK6vycnZ2tnbu3GkwESJNs2bN1LFjR0nShg0b9NFHH6l///5mQyHi3HnnnbrxxhuVkpJiOgoi0MaNGxUMBnX55ZfrrLPO0muvvabU1FTTsRBBkpKS9Pvf/17Dhg1Tv379lJubq86dO5uOFTNcpgOY8vHHH+vBBx884rqGDRtq+fLluv7663X77bfrrbfe0i233KJXXnnFUErY2U89hxo3bqzi4mK99NJLZkIhohztOfTSSy/J5/PplltuUSAQ0JVXXmkoISJJOBz+0XWWZRlIgki3Zs0aXXnllbr55pvVqFEj03EQQd566y3VqVNHPXv21Lvvvms6DiJQMBjU/Pnz9corryghIUHXXHONJk6cqHPPPdd0NESIlStX6p133tGnn36q5ORk/elPf9K//vUv/fa3vzUdLSZY4Z/6jTRGbdq0Seecc44WLFgg6UB/s0ePHlq8eLHhZIgUb731lv75z38qMTFR0oEfcC1bttSrr76qpKQkw+kQKUpKSnT11VerVq1aeuyxx+TxeExHQgSYOHGi5s+fr/vvv1+S9I9//EPhcFjXXXed4WSIJAsWLNANN9yg2267TWeccYbpOIgwv/nNb7R79245nU7t379fpaWlGjlypG677TbT0RAh/va3v6m4uFjjxo2TJL366qtas2aN7r77brPBEDFeeOEF7d27VzfffLMk6bPPPtNrr72m5557znCy2EBF7n80aNBAOTk5lRvJffrpp2rTpo3hVIgk5513nqZPn65JkyZp0qRJkg6cYsBwCSfiz3/+sxo2bKgnn3yS4RKOW69evTRnzhzl5+errKxM06ZNU79+/UzHQgTZvn27rr32Wj322GMMl/CLvPjii/rggw80adIk3XDDDTrttNMYLuGEnHrqqZo1a5YKCwsVDAb15Zdf8noMJ6Rly5aaPXu2SktLFQ6HNXPmTLVr1850rJgRsxW5oxk/frzuuusuPfroo0pKStJDDz1kOhKAGLJ8+XLNmDFDTZs21ciRIyUd2Evn+eefNxsMtpeTk6Mbb7xRF198sfx+v0aPHq327dubjoUI8q9//UsVFRVH/O4zduxYnX/++QZTAYglHTp00G9/+1tdcMEF8vv96t27t0aNGmU6FiJInz59tHz5cp177rlyu91q166drrjiCtOxYgYVOQAAAAAAAJwUKnIAAAAAAAA4KQyYAAAAAAAAcFIYMAEAAAAAAOCkMGACAAAAAADASWHABAAAAAAAgJPCgAkAAAAAAAAnhQETAAAAAAAATgoDJgAAEPFOO+00zZ4923QMAACAmMWACQAAoIrl5+erRYsW2rlzp+koAAAANYIBEwAAQBV47LHH9OWXX0qSVq5cqfT0dOXk5BhOdcANN9yg1atXV17esmWLOnXq9Ivuq6SkRL/97W9VXl5eVfEAAEAUYMAEAACiyrp163TRRRepa9euOuOMMzRjxozKzy1btkwjR45Up06ddMMNN+gPf/iDnnjiiZN+zEWLFmnt2rXq27evJGnFihVq2bLlSd9vVfD5fNq4caOaN29eJfeXmJioM888U08++WSV3B8AAIgODJgAAEDU8Pv9uuqqq9S7d2/Nnj1b48aN05/+9CetX79ePp9P1113nc455xzNmzdPZ555pqZPn14lj/vUU09pzJgxlZftNGCaPXu2evbsWaX3OWzYME2ePFl79uyp0vsFAACRiwETAACIGosXL1ZpaamuuOIKeTwe9ezZU6eeeqo+/PBDLV68WIFAQBdffLHcbrcGDx6sdu3aVX5tUVGRRo8erU6dOh1RJ3v00Ud1wQUX6M9//rP8fv+PHrOwsFALFixQ7969K69buXKlWrVq9aPbvvHGG7rooosq/7Rv315Lliyp/PzYsWM1fvx4SQdqbC1atNDXX38t6cBKpG7dumnChAmSpOLiYl111VW66KKLNGbMGH3++ec/+T2ZMWOGBg4ceCLfxmPyer3q3LnzUR8TAADEHpfpAAAAAFVl165dql27thyOw++h1a1bVzt37tSuXbuUk5Mjy7IqP1enTp3Kj+Pi4vTcc8/pkUceqbxu5cqV2rlzp1577TU988wzmjp1qs4888wjHnPjxo3KysqSx+ORJFVUVOj7779X69atf5RvzJgxlSudZs6cqYkTJ6p9+/aSpO3btysnJ0fz5s2rvH3btm31ySefqEePHpozZ44aNmxY+blJkyapb9++uvDCCxUOh1VUVPSjxwuFQlq0aJHuvvvu4/r+HbJz5069/PLLCgQCCofDatWqlc4555wjbtOgQQN9//33J3S/AAAgerGCCQAARI3s7Gzt2LFDoVCo8rpDg5usrCzt3LlT4XD4iM8d4na7lZ6efsT9LVy4UH369JEk9e3bVwsXLvzRYzocDgWDwcrLq1evlsvlUl5e3lFz5ufn68knn9Q999xTed3UqVM1YsQINW7cWOvWrZMk5ebmatu2bQqHw/rkk080ePDgytt7vV4tWrRIe/bskWVZSklJ+dHjLF68WG3btpXT6Txqlh8KhUJ6//33deONN+rWW2/VbbfdpiZNmuizzz474nbBYPCE7hcAAEQ3BkwAACBqtG/fXnFxcXrhhRfk9/s1d+5czZw5U8OHD1fHjh3ldDo1YcIEBQIBTZ8+Xd99993P3l9hYaGSkpIkScnJydq/f/+PblO/fn3l5+eroqJC0oFVT02aNFEgEFBFRYUqKirk8/mO+Jq7775bv//9748YaM2aNUv9+vXTmWeeqSlTplRe36lTJ33zzTfKz89XZmZm5fVnn3228vLydPnll2vMmDFav379j7JNnz5dp59++nF85w5bsmSJRo4cKZfLpY8//lhbt25V+/btVVZWdsTttmzZ8rNDNAAAEFsYMAEAgKjh8Xj07LPP6osvvlCPHj10zz336JFHHlGTJk3k8Xj01FNP6e2331a3bt30/vvva8CAAZXVtp+SnJys4uJiSQf2aEpNTf3RbVJSUtSlS5fKvZJWrFihZcuWqX379pV/hg8fXnn79957T8nJyTrttNMqr9uxY4fWrFmjq6++Ws8888wRexsNHjxYDz74oE455ZQjHtftduuaa67RpEmTdMMNN+ipp576UbbZs2dXrsD6odLSUnXq1OmIP6tWrZLT6axcAfbss89q/vz5knTEaiWfz6dvv/32iH8HAAAQ29iDCQAARLyZM2dWftysWbPKjbB/qF27dpo0aVLl5fPOO0+nnnrqUe+3c+fOevHFFzVy5EjNmjVLnTt3/snbXXvttXr22WfVv39/3Xnnnbrzzjt/8nbbt2/XSy+99KN8U6ZM0a233qqhQ4dKOrDC6dCqp0aNGqlLly4aOnSoZs+eXfk1W7durdz7KSMj44jq3yETJ078yRz16tXTqlWrfvJzfr9fL7/8si655JLK79V33313xIDpgw8+0IgRI36ylgcAAGITAyYAABAz5s2bp7y8PKWlpWny5MlatWqV+vbtW/n53/3ud1qxYoW+//57jRkzRueee64yMjJ0wQUXqE6dOrrssst+8n47d+6svLw8ffHFF+rXr99RH/+f//ynCgsLdfXVV1ded80112jatGn6xz/+UXld9+7d9fHHH1deHjdu3I/ua/Xq1brxxhvl9XoVDoePOtQ6UW63W8OGDdPjjz9euZKpWbNmGj16tKQDp9d98MEHlafdAQAASJIV/qm3uwAAAKLQG2+8oSeffFJlZWWqV6+e/vjHP2rAgAGmYwEAAEQ8BkwAAAAAAAA4KWzyDQAAAAAAgJPCgAkAAAAAAAAnhQETAAAAAAAATgoDJgAAAAAAAJwUBkwAAAAAAAA4KQyYAAAAAAAAcFIYMAEAAAAAAOCkMGACAAAAAADASfl/6hNZaplFmREAAAAASUVORK5CYII=\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# make a plot of the luminosity distribution using Seaborn and Pandas\n", + "import seaborn as sns\n", + "import pandas as pd\n", + "from binarycpython.utils.functions import pad_output_distribution\n", + "\n", + "# set the figure size (for a Jupyter notebook in a web browser) \n", + "sns.set( rc = {'figure.figsize':(20,10)} )\n", + "\n", + "titles = { 0 : \"Primary\",\n", + " 1 : \"Secondary\",\n", + " 2 : \"Unresolved\" }\n", + "\n", + "# choose to plot the \n", + "# PRIMARY, SECONDARY or UNRESOLVED\n", + "nstar = UNRESOLVED\n", + "\n", + "plots = {}\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "for n in range(0,3):\n", + " pad_output_distribution(population.grid_results['luminosity distribution'][n],\n", + " binwidth['luminosity'])\n", + " plots[titles[n] + ' ZAMS luminosity distribution'] = population.grid_results['luminosity distribution'][n]\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict(plots)\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e7541ebf-fe9a-4fb0-a88e-bb318d06f9eb", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/source/notebook_luminosity_function_single.ipynb b/docs/source/notebook_luminosity_function_single.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..fb971b34a58887a38066f2dbb3d056ff4c5dc5b6 --- /dev/null +++ b/docs/source/notebook_luminosity_function_single.ipynb @@ -0,0 +1,716 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bbbaafbb-fd7d-4b73-a970-93506ba35d71", + "metadata": { + "tags": [] + }, + "source": [ + "# Example use case: Zero-age stellar luminosity function\n", + "\n", + "In this notebook we compute the luminosity function of the zero-age main-sequence by running a population of single stars using binary_c. \n", + "\n", + "We start by loading in some standard Python modules and the binary_c module.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "bf6b8673-a2b5-4b50-ad1b-e90671f57470", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import math\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from binarycpython.utils.functions import temp_dir\n", + "from binarycpython.utils.grid import Population\n", + "\n", + "TMP_DIR = temp_dir(\"notebooks\", \"notebook_luminosity\")\n", + "\n", + "# help(Population) # Uncomment this line to see the public functions of this object" + ] + }, + { + "cell_type": "markdown", + "id": "f268eff3-4e08-4f6b-8b59-f22dba4d2074", + "metadata": {}, + "source": [ + "## Setting up the Population object\n", + "To set up and configure the population object we need to make a new instance of the `Population` object and configure it with the `.set()` function.\n", + "\n", + "In our case, we only need to set the maximum evolution time to something short, because we care only about zero-age main sequence stars which have, by definition, age zero." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "79ab50b7-591f-4883-af09-116d1835a751", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "adding: tmp_dir=/tmp/binary_c_python/notebooks/notebook_luminosity to grid_options\n", + "adding: max_evolution_time=0.1 to BSE_options\n", + "verbosity is 1\n" + ] + } + ], + "source": [ + "# Create population object\n", + "population = Population()\n", + "\n", + "# If you want verbosity, set this before other things\n", + "population.set(verbosity=1)\n", + "\n", + "# Setting values can be done via .set(<parameter_name>=<value>)\n", + "# Values that are known to be binary_c_parameters are loaded into bse_options.\n", + "# Those that are present in the default grid_options are set in grid_options\n", + "# All other values that you set are put in a custom_options dict\n", + "population.set(\n", + " # binary_c physics options\n", + " max_evolution_time=0.1, # maximum stellar evolution time in Myr\n", + " tmp_dir=TMP_DIR,\n", + ")\n", + "\n", + "# We can access the options through \n", + "print(\"verbosity is\", population.grid_options['verbosity'])" + ] + }, + { + "cell_type": "markdown", + "id": "f9a65554-36ab-4a04-96ca-9f1422c307fd", + "metadata": {}, + "source": [ + "## Adding grid variables\n", + "The main purpose of the Population object is to handle the population synthesis side of running a set of stars. The main method to do this with binarycpython, as is the case with Perl binarygrid, is to use grid variables. These are loops over a predefined range of values, where a probability will be assigned to the systems based on the chosen probability distributions.\n", + "\n", + "Usually we use either 1 mass grid variable, or a trio of mass, mass ratio and period (other notebooks cover these examples). We can, however, also add grid sampling for e.g. eccentricity, metallicity or other parameters. \n", + "\n", + "To add a grid variable to the population object we use `population.add_grid_variable`" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "68c84521-9ae8-4020-af7a-5334173db969", + "metadata": {}, + "outputs": [], + "source": [ + "# help(population.add_grid_variable)" + ] + }, + { + "cell_type": "markdown", + "id": "bd75cebe-2152-4025-b680-dc020b80889b", + "metadata": {}, + "source": [ + "All the distribution functions that we can use are stored in the `binarycpython.utils.distribution_functions` or `binarycpython/utils/distribution_functions.py` on git. If you uncomment the help statement below you can see which functions are available now:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "048db541-3e92-4c5d-a25c-9c5a34b9c857", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "import binarycpython.utils.distribution_functions\n", + "# help(binarycpython.utils.distribution_functions)" + ] + }, + { + "cell_type": "markdown", + "id": "2a9104fc-4136-4e53-8604-f24ad52fbe56", + "metadata": {}, + "source": [ + "First let us set up some global variables that will be useful throughout. \n", + "* The resolution is the number of stars we simulate in our model population.\n", + "* The massrange is a list of the min and max masses\n", + "* The total_probability is the theoretical integral of a probability density function, i.e. 1.0.\n", + "* The binwidth sets the resolution of the final distribution. If set to 0.5, the bins in log*L* are 0.5dex wide." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aba3fe4e-18f2-4bb9-8e5c-4c6007ab038b", + "metadata": {}, + "outputs": [], + "source": [ + "# Set resolution and mass range that we simulate\n", + "resolution = {\"M_1\": 40} # start with resolution = 10, and increase later if you want \"more accurate\" data\n", + "massrange = (0.07, 100.0) # we work with stars of mass 0.07 to 100 Msun\n", + "total_probability = 1.0 # theoretical integral of the mass probability density function over all masses \n", + "# distribution binwidths : \n", + "# (log10) luminosity distribution\n", + "binwidth = { 'luminosity' : 0.5 }" + ] + }, + { + "cell_type": "markdown", + "id": "1b3a007b-5c17-42a7-a981-7e268e6f545c", + "metadata": {}, + "source": [ + "The next cell contains an example of adding the mass grid variable, sampling the phase space in linear mass *M*_1." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "47979841-2c26-4b26-8945-603d013dc93a", + "metadata": {}, + "outputs": [], + "source": [ + "# Mass\n", + "population = Population()\n", + "population.set(\n", + " tmp_dir=TMP_DIR,\n", + ")\n", + "population.add_grid_variable(\n", + " name=\"M_1\",\n", + " longname=\"Primary mass\",\n", + " valuerange=massrange,\n", + " resolution=\"{res}\".format(res = resolution[\"M_1\"]),\n", + " spacingfunc=\"const({min}, {max}, {res})\".format(min = massrange[0], max = massrange[1], res = resolution[\"M_1\"]),\n", + " probdist=\"{probtot}/({max} - {min})\".format(probtot = total_probability, min = massrange[0], max = massrange[1]), # dprob/dm1 : all stars are equally likely so this is 1.0 / (Mmax - Mmin)\n", + " dphasevol=\"dM_1\",\n", + " parameter_name=\"M_1\",\n", + " condition=\"\", # Impose a condition on this grid variable. Mostly for a check for yourself\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "163f13ae-fec1-4ee8-b9d4-c1b75c19ff39", + "metadata": {}, + "source": [ + "## Setting logging and handling the output\n", + "By default, binary_c will not output anything (except for 'SINGLE STAR LIFETIME'). It is up to us to determine what will be printed. We can either do that by hardcoding the print statements into `binary_c` (see documentation binary_c) or we can use the custom logging functionality of binarycpython (see notebook `notebook_custom_logging.ipynb`), which is faster to set up and requires no recompilation of binary_c, but is somewhat more limited in its functionality. For our current purposes, it works perfectly well.\n", + "\n", + "After configuring what will be printed, we need to make a function to parse the output. This can be done by setting the parse_function parameter in the population object (see also notebook `notebook_individual_systems.ipynb`). \n", + "\n", + "In the code below we will set up both the custom logging and a parse function to handle that output." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "0c986215-93b1-4e30-ad79-f7c397e9ff7d", + "metadata": {}, + "outputs": [], + "source": [ + "# Create custom logging statement\n", + "#\n", + "# we check that the model number is zero, i.e. we're on the first timestep (stars are born on the ZAMS)\n", + "# we make sure that the stellar type is <= MAIN_SEQUENCE, i.e. the star is a main-sequence star\n", + "# we also check that the time is 0.0 (this is not strictly required, but good to show how it is done)\n", + "#\n", + "# The Printf statement does the outputting: note that the header string is ZERO_AGE_MAIN_SEQUENCE_STAR\n", + "\n", + "custom_logging_statement = \"\"\"\n", + "if(stardata->model.model_number == 0 &&\n", + " stardata->star[0].stellar_type <= MAIN_SEQUENCE &&\n", + " stardata->model.time == 0)\n", + "{\n", + " /* Note that we use Printf - with a capital P! */\n", + " Printf(\"ZERO_AGE_MAIN_SEQUENCE_STAR %30.12e %g %g %g %g\\\\n\",\n", + " stardata->model.time, // 1\n", + " stardata->common.zero_age.mass[0], // 2\n", + " stardata->star[0].mass, // 3\n", + " stardata->star[0].luminosity, // 4\n", + " stardata->model.probability // 5\n", + " );\n", + "};\n", + "\"\"\"\n", + "\n", + "population.set(\n", + " C_logging_code=custom_logging_statement\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "ae1f1f0c-1f8b-42d8-b051-cbf8c6b51514", + "metadata": {}, + "source": [ + "The parse function must now catch lines that start with \"ZERO_AGE_MAIN_SEQUENCE_STAR\" and process the associated data." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "fd197154-a8ce-4865-8929-008d3483101a", + "metadata": {}, + "outputs": [], + "source": [ + "# import the bin_data function so we can construct finite-resolution probability distributions\n", + "# import the datalinedict to make a dictionary from each line of data from binary_c\n", + "from binarycpython.utils.functions import bin_data,datalinedict\n", + "\n", + "def parse_function(self, output):\n", + " \"\"\"\n", + " Example parse function\n", + " \"\"\"\n", + " \n", + " # list of the data items\n", + " parameters = [\"header\", \"time\", \"zams_mass\", \"mass\", \"luminosity\", \"probability\"]\n", + " \n", + " # Loop over the output.\n", + " for line in output.splitlines():\n", + " # obtain the line of data in dictionary form \n", + " linedata = datalinedict(line,parameters)\n", + " \n", + " # Check the header and act accordingly\n", + " if linedata['header'] == \"ZERO_AGE_MAIN_SEQUENCE_STAR\":\n", + " \n", + " # bin the log10(luminosity) to the nearest 0.1dex\n", + " binned_log_luminosity = bin_data(math.log10(linedata['luminosity']),\n", + " binwidth['luminosity'])\n", + " \n", + " # append the data to the results_dictionary \n", + " self.grid_results['luminosity distribution'][binned_log_luminosity] += linedata['probability'] \n", + " \n", + " #print (self.grid_results)\n", + " \n", + " # verbose reporting\n", + " #print(\"parse out results_dictionary=\",self.grid_results)\n", + " \n", + "# Add the parsing function\n", + "population.set(\n", + " parse_function=parse_function,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "91509ce5-ffe7-4937-aa87-6d7baac9ac04", + "metadata": {}, + "source": [ + "## Evolving the grid\n", + "Now that we configured all the main parts of the population object, we can actually run the population! Doing this is straightforward: `population.evolve()`\n", + "\n", + "This will start up the processing of all the systems. We can control how many cores are used by settings `amt_cores`. By setting the `verbosity` of the population object to a higher value we can get a lot of verbose information about the run, but for now we will set it to 0.\n", + "\n", + "There are many grid_options that can lead to different behaviour of the evolution of the grid. Please do have a look at those: [grid options docs](https://ri0005.pages.surrey.ac.uk/binary_c-python/grid_options_descriptions.html), and try " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8ea376c1-1e92-45af-8cab-9d7fdca564eb", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Grid has handled 40 stars\n", + "with a total probability of 1.0000000000000004\n", + "Total starcount for this run will be: 40\n", + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Population-08f8230453084e4ca6a2391d45ce658b finished! The total probability was: 1.0000000000000002. It took a total of 1.5262682437896729s to run 40 systems on 2 cores\n", + "There were no errors found in this run.\n", + "OrderedDict([('luminosity distribution', OrderedDict([(2.25, 0.025), (3.75, 0.05), (4.25, 0.05), (0.25, 0.025), (3.25, 0.025), (5.25, 0.2), (4.75, 0.1), (5.75, 0.39999999999999997), (6.25, 0.125)]))])\n" + ] + } + ], + "source": [ + "# set number of threads\n", + "population.set(\n", + " # verbose output is not required \n", + " verbosity=0,\n", + " # set number of threads (i.e. number of CPU cores we use)\n", + " amt_cores=2,\n", + " )\n", + "\n", + "# Evolve the population - this is the slow, number-crunching step\n", + "analytics = population.evolve() \n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "markdown", + "id": "91ab45c7-7d31-4543-aee4-127ab58e891f", + "metadata": {}, + "source": [ + "After the run is complete, some technical report on the run is returned. I stored that in `analytics`. As we can see below, this dictionary is like a status report of the evolution. Useful for e.g. debugging." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e1f0464b-0424-4022-b34b-5b744bc2c59d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'population_name': '08f8230453084e4ca6a2391d45ce658b', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 1.0000000000000002, 'total_count': 40, 'start_timestamp': 1631124829.303065, 'end_timestamp': 1631124830.8293333, 'total_mass_run': 2001.4, 'total_probability_weighted_mass_run': 50.035000000000004, 'zero_prob_stars_skipped': 0}\n" + ] + } + ], + "source": [ + "print(analytics)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "05c6d132-abee-423e-b1a8-2039c8996fbc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[None]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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n9eyZcs0atQovf3225o8eXLr4WwXExkZqZqaGkmfnZOpW7duF9wmKipKI0aMaD030sGDB7V//34NHjy49a+ZM2e23v7NN99UZGSkpk6d2nrZmTNnlJeXpwceeEC/+93vzjuX0YwZM/Tzn/9co0ePPu9xAwMD9c1vflNvvfWWHn74YT3//PMXtG3cuLH1lVf/qq6uTsOGDTvvr8OHD8vhcLS+8uuFF17Q9u3bJem8Vyk1NTVp165d5/0ZAACAf+OcSwAAwKutXr269e/T09NbT3r9r6699lq99dZbrR/feeedmjJlyiXvd/jw4XrxxRd16623av369Ro+fPhFb/fggw/qhRde0KRJk/TDH/5QP/zhDy96u9OnT+uvf/3rBX0ffPCBvv/97+uGG26Q9Nkrmz5/tVO/fv00YsQI3XDDDdq4cWPr55w8ebL1XE+xsbHnHe73ueXLl1+0IykpSYcPH77odc3Nzfrb3/6mL33pS61fq3379p03Lr3zzju6+eabL3ooHgAA8E+MSwAAwC9s3bpVycnJio6O1ooVK3T48GFNmDCh9fqvf/3rOnjwoI4ePaq5c+fq9ttvV2xsrBYsWKAePXroq1/96kXvd/jw4UpOTta6des0ceLESz7+73//e1VVVemBBx5oveyb3/ymPvroI/3P//xP62VZWVl6//33Wz9etGjRBfeVm5urRx55RMHBwbIs65KD1pUKDAzUjTfeqF/96letr2BKT0/XnDlzJH32LnXvvPNO67vaAQAASJLNutj/6gIAAPAxr776qp599lnV19crKSlJjz76qCZPnmw6CwAAwOsxLgEAAAAAAKDdOKE3AAAAAAAA2o1xCQAAAAAAAO3GuAQAAAAAAIB2Y1wCAAAAAABAuzEuAQAAAAAAoN0YlwAAAAAAANBujEsAAAAAAABoN8YlAAAAAAAAtNv/D2ltZ660RybEAAAAAElFTkSuQmCC\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# make a plot of the luminosity distribution using Seaborn and Pandas\n", + "import seaborn as sns\n", + "import pandas as pd\n", + "from binarycpython.utils.functions import pad_output_distribution\n", + "\n", + "# set the figure size (for a Jupyter notebook in a web browser) \n", + "sns.set( rc = {'figure.figsize':(20,10)} )\n", + "\n", + "# this saves a lot of typing! \n", + "ldist = population.grid_results['luminosity distribution']\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "pad_output_distribution(ldist,\n", + " binwidth['luminosity'])\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict({'ZAMS luminosity distribution' : ldist})\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")" + ] + }, + { + "cell_type": "markdown", + "id": "7d7b275e-be92-4d59-b44d-ef6f24023cc3", + "metadata": {}, + "source": [ + "Does this look like a reasonable stellar luminosity function to you? The implication is that the most likely stellar luminosity is 10<sup>5.8</sup> L<sub>☉</sub>! Clearly, this is not very realistic... let's see what went wrong." + ] + }, + { + "cell_type": "markdown", + "id": "44586e42-b7cb-4a55-be0a-330b98b20de4", + "metadata": {}, + "source": [ + "## " + ] + }, + { + "cell_type": "markdown", + "id": "e32c3bbf-390f-45da-ad9c-cc3e7c9449dc", + "metadata": {}, + "source": [ + "## ZAMS Luminosity distribution with the initial mass function\n", + "\n", + "In the previous example, all the stars in our grid had an equal weighting. This is very unlikely to be true in reality: indeed, we know that low mass stars are far more likely than high mass stars. So we now include an initial mass function as a three-part power law based on Kroupa (2001). Kroupa's distribution is a three-part power law: we have a function that does this for us (it's very common to use power laws in astrophysics).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "1f37d2c0-1108-4ab9-a309-20b1e6b6e3fd", + "metadata": {}, + "outputs": [], + "source": [ + "# Update the probability distribution to use the three-part power law IMF \n", + "population.update_grid_variable(\n", + " name=\"M_1\",\n", + " probdist=\"three_part_powerlaw(M_1, 0.1, 0.5, 1.0, 150, -1.3, -2.3, -2.3)\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "6f4463e8-1935-45f2-8c5f-e7b215f8dc47", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Grid has handled 40 stars\n", + "with a total probability of 0.2182216189410787\n", + "Total starcount for this run will be: 40\n", + "Generating grid code\n", + "Constructing/adding: M_1\n", + "Population-92de7c9221c54206ab4dd10e58e09a34 finished! The total probability was: 0.21822161894107872. It took a total of 1.5900418758392334s to run 40 systems on 2 cores\n", + "There were no errors found in this run.\n", + "OrderedDict([('luminosity distribution', OrderedDict([(2.25, 0.0164166), (3.25, 0.00515685), (0.25, 0.189097), (3.75, 0.0037453900000000004), (4.25, 0.0014346559999999999), (5.25, 0.0007493004), (4.75, 0.001171479), (5.75, 0.00039801020000000003), (6.25, 5.2369339999999996e-05)]))])\n" + ] + } + ], + "source": [ + "# Clean and re-evolve the population \n", + "population.clean()\n", + "analytics = population.evolve() \n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cfe45a9e-1121-43b6-b6b6-4de6f8946a18", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[None]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJgAAAJWCAYAAAAUZj1OAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABcnUlEQVR4nO3dd3SUZf7+8Wtm0gvpjQRIo0PovSNNiiDiBnXBsrqCsq6sK66CirroWlZ/lu/ay6oooIIIItIEhID03ksCBJIACYTQ0ub3R3TcCBjIk+SZSd6vczgn82QycyW5HTPX3M9nLHa73S4AAAAAAACgnKxmBwAAAAAAAIBro2ACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIZQMAEAAAAAAMAQCiYAAAAAAAAYQsEEAAAAAAAAQ9zMDlCZcnLOqrjYbnaMaickxE8nT+aZHQMuivUDo1hDMIo1BKNYQzCKNQSjWEMwqrxryGq1KCjI97Kfq9YFU3GxnYKpkvBzhRGsHxjFGoJRrCEYxRqCUawhGMUaglEVvYY4RQ4AAAAAAACGUDABAAAAAADAkGp9ihwAAAAAAFWpqKhQOTnHVViYX2n3kZVlVXFxcaXdPqq/staQm5uHgoLCZLNdfW1EwQQAAAAAQAXJyTkuLy8f+fpGymKxVMp9uLlZVVhIwYTy+701ZLfbdfZsrnJyjis0NOqqb5NT5AAAAAAAqCCFhfny9a1VaeUSUNksFot8fWtd8y48CiYAAAAAACoQ5RJcXXnWMAUTAAAAAAAADKFgAgAAAACgGtq8eaPuuOPWUv+6d2+v77+f57jOV19NV8+eHXXy5IlSX9u1a1v97W/jSh07deqUevTooPfff1uSlJGRoQkTxuv220dq1Kg/6PHH/6GcnOxLcrz//tuOrzHivffe0ooVywzfzi++/vpLff31l5KkZ599ShkZx8p1O+PG/VkbNqzTrl079K9/PXPF6x09mq7nnnu6zCxdu7a9pvtfsWK5pk379JLbqWoM+QYAAAAAoBpq0aKVPvroM8fl6dOnav78b9Wz53WOY99+O0ddu/bQ3Lmzdfvtfyr19YcPH1Zubq5q1aolSVq6dLH8/Ws5Pv/ii89qwICB6tt3gCTpk08+1IsvPqdnn32xUr6fu+8eU6G3N2zYCMfHGzas05133mPo9ho1aqJ//KPJFT+fkXFM6elHysxyrXbv3lkht2MUBRMAAAAAANXc5s0b9fHHH+idd/4rT09PSdK+fXuVm3taEyZM1KRJEzRq1J2yWn890alr1+768celGjToBkklBVP37j0dn8/OPqGLFy84Lt900x+0c+eO383RtWtbrVixTpI0b94cbdy4XhMnTtaIEUPUu3dfpaSskM1m07333q9p0z7VkSOHdf/9D+q66/pqypTJatWqjVq1aqPHHvu74uMTtGfPbgUHh+iZZ/6lWrUCtHLlj3r33Tdltxerdu1oPfzwYwoODtEbb/w/rV37k2w2q7p27aG77vqzY1eVh4enTpw4rocf/qvuvnuMpk2bqrfe+kCS9N13c7V9+1b9/e+POr6H/Px8Pf/8M9q1a6ciI2vr9OlTkkpKqg8+eEdvvPGOpk37VN99962sVosaN26qCRMm6tVXX9LRo+n697+fV69e1+nNN19TUVGx4uMTFBVVW5L0pz/dK0l6/vkp2rlzuwICAvXoo08oMjJS48b9WXfd9We1bt1Wx44d1V/+cq9efPFVzZ49U5IUGRnl2IX1pz/de8WfxYgRQ3T99YO0enWKzp+/oEmTnlKjRo2vei1dCQUTAAAAAACVYOXWY1qxpXynXf0ei0Xq0jxKXZpf3VvI5+Rka/LkiXrkkccVHR3jOD5v3jfq3buPGjVqLJvNpp9+SlGnTl0dn+/du48+/vgDDRp0g06ePCG7XQoJCXV8/t57x+nppx/X+++/ozZt2qljx87q3btvub+v0NAwffrpDD377FP69NOP9Nprb2nr1s167bV/67rrSt/uvn179eijT6hBg0aaOPFhLVjwna67rp9efPFZvfnm+4qKqq3PPvtYL7/8gsaNe1CrV6fo009n6OLFi3r++X/q4sWLjtsaNeoOzZ79lV588VVFRkbp//7vNaWnH1F0dIy++26u7r239KmCX345XZI0deqXOnz4kG6//ZZSny8sLNSnn36kr7+eL6vVqpdffl7Hj2fpr3/9uz744B099NAj2rBhnQ4fPqQvv5wrPz+/S04hbNWqtR55ZKJmzvxCr776kp577qXL/szi4uI1dOhwSdKgQTc4bicnJ/uyP4t//vN5SVJAQIDeffdjffnlNH3yyQeaMsX4rjNmMAEAAAAAUE0VFxdr8uRJ6tOnf6ndR4WFhVqwYL769OkvSerdu69jJ8wvmjVL0qFDacrLy9PSpYvVq1fvUp/v2LGzZs2ap0cemaTAwCD95z+vaeLEh8udtWPHzpKkiIhItWzZWm5uboqMjNKZM2cuuW5QULAaNGgkSYqPT1Rubq527Niuxo2bOnYD3XDDcK1fv1ahoWHy9PTU2LF3acaMz3TPPWMdu7h+y2Kx6PrrB+n77+cpIyND2dnZatq0WanrbNq0Xr16lRRederUVfPmSaU+7+bmpmbNknT33aP14YfvavjwmxUWFn7JfdWpU09+fn6XHPf09FS/ftdLkvr3v14bN67/3Z/b5VzpZ/GLX37Wv/zsKgI7mAAAAAAAqATXssvoWri5WVVYWHxV1/3ww3dVWFige++9v9TxlSt/1JkzuXrssZJCqLCwUDk52crKylR4eISkkrKlS5duWrFimZYt+0FPPfWcZs6cIUnKzT2tjz56Tw888JA6duysjh0764477tbQof2Vk5OjoKCgK2ay2+2yWCwqLCwsddzd3d3xsc1m+93vy8PD45LbtNuLLzlWVFQkNzc3vfPOR9q0aYNWrVqpMWPu1Ouvv3PF2x44cIgeeugv8vDw0IABAy9zDUup+7pc1uee+7e2b9+q1atT9NBDD+iJJy4d/n2lkstq/fX27PaSwkoq+X384rc/u9+60s/iFx4enqU+VxHYwQQAAAAAQDW0du1qzZnztZ566jlHSfGLefO+0T33jNWXX87Rl1/O0ddff6fmzVtozpyvS12vd+++mjnzC7m5uZcqjXx9/bRixXJ9991cx7H09CMKDg5xDAW/nMDAQB08uF92u10rViyvmG/0Z02aNNOOHVt17NhRSdI338xU69ZttGfPLo0b92e1aNFK48Y9qNjYeB06lFbqa202m6OAiYyMUlhYuL7++isNGDDokvtp27a9Fi78XsXFxcrIOKatW7eU+nxOTo5uu22E4uMTdffdY9SuXQft379XNptbqZLnSs6fP+d4t7xvv52ttm3bS5ICAkp+dpL0449LL5u9rJ9FZWIHEwAAAAAA1dAnn3ykoqIi/f3vD5Q63r17T23YsE6PPvpkqeMjR/5R//73v3THHXc7jjVt2lwnT57QDTcMK3Vdm82ml156Va+//oree+8teXl5KTQ0TM8///Lv7j4aM2acJkwYr+DgECUltXQMyK4IwcEhevjhiXrssb+roKBQkZGR+sc/nlBoaKiaNUvS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zY4DF/TFF184Hn+GDh2qNm3a6Omnn66Q23arkFtBtZeZmalXXnlFM2fOlIeHh0aOHKkOHTooMTHR7GhwIZs3b9akSZOUmppqdhS4oJSUFK1YsUKzZs2SxWLR3XffrYULF6pv375mR4OLWLNmjVavXq1vvvlGhYWFGjhwoHr06KH4+Hizo8GFrFq1SrNmzVLPnj3NjgIXZLfbdeDAAS1dulRubjwVw7U5fPiwnnzySX3xxRcKCQnR7bffrmXLlqlHjx5mR4MLufnmm3XzzTdLkvbu3av7779f48aNq5DbZgcTrkpKSoo6duyowMBA+fj4qH///po/f77ZseBiZsyYoSeffFLh4eFmR4ELCgsL0z/+8Q95eHjI3d1dCQkJOnr0qNmx4ELat2+vjz/+WG5ubjp58qSKiork4+Njdiy4kFOnTumVV17RmDFjzI4CF3XgwAFZLBbdc889uuGGG/Tpp5+aHQkuZOHChRo4cKAiIyPl7u6uV155RS1atDA7FlzY5MmTNX78eAUHB1fI7VGb46pkZWUpLCzMcTk8PFxbtmwxMRFc0ZQpU8yOABdWv359x8epqamaN2+epk2bZmIiuCJ3d3e99tpr+uCDDzRgwABFRESYHQku5IknntD48eN17Ngxs6PAReXm5qpTp06aPHmyLly4oNGjRysuLk5dunQxOxpcQFpamtzd3fWnP/1Jx48fV69evfTggw+aHQsuKiUlRRcuXND1119fYbfJDiZcFbvdfskxi8ViQhIANd3evXt111136ZFHHlFsbKzZceCCHnjgAa1atUrHjh3TjBkzzI4DF/HFF18oKipKnTp1MjsKXFirVq30wgsvyMfHR8HBwRoxYoSWLVtmdiy4iKKiIq1atUovvviiZsyYoa1bt2rWrFlmx4KLmjZtmu68884KvU0KJlyViIgInThxwnE5KyuL05wAVLn169frjjvu0EMPPaQbb7zR7DhwMfv379fOnTslSd7e3urXr592795tciq4innz5mnlypUaOnSoXnvtNS1ZskTPPvus2bHgYtatW6dVq1Y5LtvtdmYx4aqFhoaqU6dOCg4OlpeXl6677jrOKkG55Ofna+3aterdu3eF3i4FE65K586dtWrVKmVnZ+v8+fNasGCBunfvbnYsADXIsWPHdP/99+ull17SoEGDzI4DF3TkyBFNmjRJ+fn5ys/P1+LFi9WmTRuzY8FFfPjhh5o7d65mz56tBx54QL1799Zjjz1mdiy4mDNnzuiFF17QxYsXlZeXp1mzZvFmFbhqvXr10ooVK5Sbm6uioiL9+OOPatq0qdmx4IJ2796t2NjYCp9FSV2OqxIREaHx48dr9OjRKigo0IgRI5SUlGR2LAA1yPvvv6+LFy/qX//6l+PYyJEjdcstt5iYCq6kR48e2rx5s4YNGyabzaZ+/fpRVgKoUr169XI8DhUXF+vWW29Vq1atzI4FF9GiRQvdfffduvXWW1VQUKAuXbropptuMjsWXNDhw4cVGRlZ4bdrsV9uuA4AAAAAAABwlThFDgAAAAAAAIZQMAEAAAAAAMAQCiYAAAAAAAAYQsEEAAAAAAAAQyiYAAAAAAAAYAgFEwAAAAAAAAyhYAIAAAAAAIAhFEwAAMDl9e7dWykpKWbHAAAAqLEomAAAACpYdna2GjZsqMzMTLOjAAAAVAkKJgAAgArw0ksv6ccff5Qk7dq1S8HBwYqIiDA5VYkHHnhAe/bscVw+cuSIWrVqVa7bOnv2rO6++25duHChouIBAIBqgIIJAABUK/v379eoUaPUtm1bDRo0SIsXL3Z8bvv27Ro2bJhatWqlBx54QA8++KBeeeUVw/e5adMm7du3T926dZMk7dy5U40aNTJ8uxUhPz9faWlpatCgQYXcnq+vrwYPHqxXX321Qm4PAABUDxRMAACg2igoKNCYMWPUpUsXpaSkaNKkSfr73/+uAwcOKD8/X+PGjdONN96oNWvWaPDgwVq0aFGF3O/rr7+u5ORkx2VnKphSUlLUqVOnCr3N66+/XnPmzNGJEycq9HYBAIDromACAADVxubNm3Xu3Dn9+c9/loeHhzp16qRevXrp22+/1ebNm1VYWKjRo0fL3d1d/fr1U/PmzR1fe+bMGY0YMUKtWrUqdTrZiy++qFtvvVUPP/ywCgoKLrnP3NxcrV+/Xl26dHEc27Vrlxo3bnzJdadPn65Ro0Y5/iUlJWnLli2Oz48cOVJvvPGGpJLT2Bo2bKjVq1dLKtmJ1K5dO3366aeSpLy8PI0ZM0ajRo1ScnKyli1bdtmfyeLFi9WnT59r+TGWydPTU61bt77ifQIAgJrHzewAAAAAFSUrK0uRkZGyWn99Da127drKzMxUVlaWIiIiZLFYHJ+LiopyfOzl5aV33nlHL7zwguPYrl27lJmZqc8++0xvvvmmvv/+ew0ePLjUfaalpSksLEweHh6SpIsXL+rgwYNq0qTJJfmSk5MdO52WLFmiWbNmKSkpSZJ07NgxRUREaM2aNY7rN2vWTAsXLlTHjh21atUq1atXz/G52bNnq1u3brrttttkt9t15syZS+6vuLhYmzZt0uTJk6/q5/eLzMxMffzxxyosLJTdblfjxo114403lrpO3bp1dfDgwWu6XQAAUH2xgwkAAFQb4eHhysjIUHFxsePYL8VNWFiYMjMzZbfbS33uF+7u7goODi51exs2bFDXrl0lSd26ddOGDRsuuU+r1aqioiLH5T179sjNzU1xcXFXzJmdna1XX31VTz31lOPY999/ryFDhig+Pl779++XJEVHR+vo0aOy2+1auHCh+vXr57i+p6enNm3apBMnTshisahWrVqX3M/mzZvVrFkz2Wy2K2b5reLiYn3zzTcaP368Hn30UT322GNKSEjQ0qVLS12vqKjomm4XAABUbxRMAACg2khKSpKXl5fee+89FRQU6KefftKSJUs0cOBAtWzZUjabTZ9++qkKCwu1aNEibd269XdvLzc3V35+fpIkf39/nT59+pLr1KlTR9nZ2bp48aKkkl1PCQkJKiws1MWLF3Xx4kXl5+eX+prJkyfrr3/9a6lCa8WKFerevbsGDx6s+fPnO463atVKa9euVXZ2tkJDQx3Hhw4dqri4OP3pT39ScnKyDhw4cEm2RYsW6brrrruKn9yvtmzZomHDhsnNzU3fffed0tPTlZSUpPPnz5e63pEjR363RAMAADULBRMAAKg2PDw89NZbb2n58uXq2LGjnnrqKb3wwgtKSEiQh4eHXn/9dX355Zdq166dvvnmG/Xs2dNxatvl+Pv7Ky8vT1LJjKaAgIBLrlOrVi21adPGMStp586d2r59u5KSkhz/Bg4c6Lj+119/LX9/f/Xu3dtxLCMjQ3v37tXYsWP15ptvlppt1K9fPz333HNq3759qft1d3fXfffdp9mzZ+uBBx7Q66+/fkm2lJQUxw6s3zp37pxatWpV6t/u3btls9kcO8DeeustrVu3TpJK7VbKz8/Xxo0bS30PAACgZmMGEwAAcHlLlixxfFy/fn3HIOzfat68uWbPnu24fPPNN6tXr15XvN3WrVvrww8/1LBhw7RixQq1bt36ste7//779dZbb6lHjx564okn9MQTT1z2eseOHdNHH310Sb758+fr0Ucf1YABAySV7HD6ZddTbGys2rRpowEDBiglJcXxNenp6Y7ZTyEhIaVO/fvFrFmzLpsjJiZGu3fvvuznCgoK9PHHH+v22293/Ky2bt1aqmCaO3euhgwZctnT8gAAQM1EwQQAAGqMNWvWKC4uTkFBQZozZ452796tbt26OT5/zz33aOfOnTp48KCSk5M1fPhwhYSE6NZbb1VUVJTuuuuuy95u69atFRcXp+XLl6t79+5XvP+3335bubm5Gjt2rOPYfffdpwULFuj//u//HMc6dOig7777znF50qRJl9zWnj17NH78eHl6esput1+x1LpW7u7uuv766/Xvf//bsZOpfv36GjFihKSSd6+bO3eu493uAAAAJMliv9zLXQAAANXQ9OnT9eqrr+r8+fOKiYnRQw89pJ49e5odCwAAwOVRMAEAAAAAAMAQhnwDAAAAAADAEAomAAAAAAAAGELBBAAAAAAAAEMomAAAAAAAAGAIBRMAAAAAAAAMoWACAAAAAACAIRRMAAAAAAAAMISCCQAAAAAAAIb8fxzqA03KlXkqAAAAAElFTkSuQmCC\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot luminosity distribution\n", + "ldist = population.grid_results['luminosity distribution']\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "pad_output_distribution(ldist,\n", + " binwidth['luminosity'])\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict({'ZAMS luminosity distribution' : ldist})\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")" + ] + }, + { + "cell_type": "markdown", + "id": "0546f2f3-4732-4841-8ef3-565fbf6b9961", + "metadata": {}, + "source": [ + "This distribution is peaked at low luminosity, as one expects from observations, but the resolution is clearly not great because it's not smooth - it's spiky! \n", + "\n", + "If you noticed above, the total probability of the grid was about 0.2. Given that the total probability of a probability distribution function should be 1.0, this shows that our sampling is (very) poor. \n", + "\n", + "We could simply increase the resolution to compensate, but this is very CPU intensive and a complete waste of time and resources. Instead, let's try sampling the masses of the stars in a smarter way." + ] + }, + { + "cell_type": "markdown", + "id": "673031c9-7d80-45d4-b209-301c127d3edf", + "metadata": {}, + "source": [ + "# A better-sampled grid\n", + "\n", + "The IMF has many more low-mass stars than high-mass stars. So, instead of sampling M1 linearly, we can sample it in log space. \n", + "\n", + "To do this we first rename the mass grid variable so that it is clear we are working in (natural) logarithmic phase space." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "5956f746-e3b9-4912-b75f-8eb0af66d3f6", + "metadata": {}, + "outputs": [], + "source": [ + "# Rename the old variable (M_1) because we want it to be called lnM_1 now\n", + "population.rename_grid_variable(\"M_1\",\"lnM_1\")" + ] + }, + { + "cell_type": "markdown", + "id": "532f691c-c1f6-46cc-84f2-970ec1216e40", + "metadata": {}, + "source": [ + "Next, we change the spacing function so that it works in the log space. We also adapt the probability calculation so that it calculates dprob/dlnM = M * dprob/dM. Finally, we set the precode to compute M_1 because binary_c requires the actual mass, not the logarithm of the mass." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "108d470a-bb21-40b0-8387-2caa7ab0f923", + "metadata": {}, + "outputs": [], + "source": [ + "# update the sampling, note that the IMF is dprob/dM1, and the phase \n", + "# space is now sampled in lnM1, so we multiply by M_1 to \n", + "# because M * dprob/dM = dprob/dlnM\n", + "population.update_grid_variable(\n", + " name=\"lnM_1\",\n", + " spacingfunc=\"const(math.log({min}), math.log({max}), {res})\".format(min = massrange[0], max = massrange[1], res = resolution[\"M_1\"]),\n", + " probdist=\"three_part_powerlaw(M_1, 0.1, 0.5, 1.0, 150, -1.3, -2.3, -2.3)*M_1\",\n", + " dphasevol=\"dlnM_1\",\n", + " parameter_name=\"M_1\",\n", + " precode=\"M_1=math.exp(lnM_1)\",\n", + ")\n", + "# print(population.grid_options[\"_grid_variables\"]) # debugging" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "fb8db646-f3d0-4ccd-81ba-7fde23f29c79", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating grid code\n", + "Constructing/adding: lnM_1\n", + "Grid has handled 40 stars\n", + "with a total probability of 0.9956307907476224\n", + "Total starcount for this run will be: 40\n", + "Generating grid code\n", + "Constructing/adding: lnM_1\n", + "Population-83f80d829dbd418aa2bc745c99b71991 finished! The total probability was: 0.9956307907476224. It took a total of 0.9961590766906738s to run 40 systems on 2 cores\n", + "There were no errors found in this run.\n", + "OrderedDict([('luminosity distribution', OrderedDict([(0.25, 0.0212294), (2.75, 0.00321118), (-0.25, 0.0268827), (1.25, 0.0104553), (3.75, 0.00283037), (6.25, 7.34708e-05), (-0.75, 0.0771478), (0.75, 0.030004499999999996), (2.25, 0.00921541), (3.25, 0.0045385), (1.75, 0.014776889999999999), (4.25, 0.002380189), (4.75, 0.000869303), (5.25, 0.0007310379999999999), (5.75, 0.00036002859999999996), (-2.75, 0.1961345), (-1.75, 0.2181597), (-3.25, 0.0), (-2.25, 0.2568974), (-1.25, 0.11973310000000001)]))])\n" + ] + } + ], + "source": [ + "# Clean and re-evolve the population \n", + "population.clean()\n", + "analytics = population.evolve() \n", + "\n", + "# Show the results (debugging)\n", + "# print (population.grid_results)" + ] + }, + { + "cell_type": "markdown", + "id": "182b1094-5057-4ccf-bac6-9b0e560ad4f6", + "metadata": {}, + "source": [ + "You should see that the total probability is very close to 1.0, as you would expect for a well-sampled grid. The total will never be exactly 1.0, but that is because we are running a simulation, not a perfect copy of reality." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "68ee1e56-21e5-48f4-b74c-50e48685ae94", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJgAAAJWCAYAAAAUZj1OAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAB37ElEQVR4nOzdd3iV9f3/8dcZ2XtPstkhrLD3ElkyREGtA+vA0eHXqq1SRa221rb+2lpx1C3WVYaAKEtUlpAwE0YgJJCQkAGEEFbW+f2BpqUKAZJz7pOc5+O6uC7PneTcrxy8Q/LK5/O+TTabzSYAAAAAAADgCpmNDgAAAAAAAICWjYIJAAAAAAAATULBBAAAAAAAgCahYAIAAAAAAECTUDABAAAAAACgSSiYAAAAAAAA0CQUTAAAAAAAAGgSq9EB7OnYsZOqr7fZ9RwhIb46cqTKrucAnBnXAMB1AHANwNVxDcDVcQ24DrPZpKAgnx99W6sumOrrbXYvmL4/D+DKuAYArgOAawCujmsAro5rAGyRAwAAAAAAQJNQMAEAAAAAAKBJWvUWOQAAAAAAHKmurlbHjpWptrba6CgOU1pqVn19vdEx0IysVncFBYXJYrn02oiCCQAAAACAZnLsWJk8Pb3l4xMpk8lkdByHsFrNqq2lYGotbDabTp6s1LFjZQoNjbrkj2OLHAAAAAAAzaS2tlo+Pv4uUy6h9TGZTPLx8b/sVXgUTAAAAAAANCPKJbR0V/L/MAUTAAAAAAAAmoSCCQAAAACAVmjbti267bYbz/szeHBvffHFZw3v8+9/f6ihQ/vqyJHy8z524MB0/d//3X/esYqKCg0Z0kevv/6KJOnw4cN6+OEHdNNN1+vmm6/Xb3/7ax07dvQHOV5//ZWGj2mKf/7zZa1Z81WTn+d7CxZ8ogULPpEkPfvskzp8uPiKnuf+++/S5s0Z2r17p/7wh6cv+H5FRYf0+98/1WiWgQPTL+v8a9Z8rQ8+eO8Hz+NoDPkGAAAAAKAV6tq1u9566/2Gxx9+OFeff75EQ4eOaDi2ZMkiDRw4RIsXL9Stt/70vI8vKChQZWWl/P39JUmrV6+Un59/w9uff/5ZXX31WI0ZM1a1tfV699039fzzv9ezzz5vl8/njjtmNuvzTZo0teG/N2/O0IwZdzbp+Tp06KRf/7rTBd9++HCxDh0qbDTL5dqzZ1ezPE9TUTABAAAAANDKbdu2Re+884ZeffVteXh4SJL27durysrjevjhxzRr1sO6+eYZMpv/s9Fp4MDB+uab1Ro37hpJ5wqmwYOHNrz96NFynT17puHxtdder127dl40x8CB6VqzJkOS9Nlni7RlS6Yee2y2pk6doOHDR2ndujWyWCy6++779MEH76mwsED33fdLjRgxSs88M1vdu/dU9+499eijv1JSUrJycvYoODhETz/9B/n7B2jt2m/02mtzZLPVKzo6Rg899KiCg0P04ov/T5s2fSuLxayBA4fo9tvvalhV5e7uofLyMj300C90xx0z9cEHc/Xyy29IkpYuXazs7B361a9+0/A5VFdX67nnntbu3bsUGRmt48crJJ0rqd5441W9+OKr+uCD97R06RKZzSZ17NhZDz/8mP761z+pqOiQ/vzn5zRs2AjNmfM31dXVKykpWVFR0ZKkn/70bknSc889o127shUQEKjf/OZxRUZG6v7779Ltt9+lHj3SVVxcpJ/97G49//xftXDhPElSZGRUwyqsn/707gu+FlOnTtDo0WO1ceN6nT59RrNmPakOHTpe8v9LF0LBBAAAAACAHazdUaw1269s21VjBqZFaUCXS7uF/LFjRzV79mN65JHfKiYmtuH4Z599quHDR6pDh46yWCz69tt16tdvYMPbhw8fqXfeeUPjxl2jI0fKZbNJISGhDW+/++779dRTv9Xrr7+qnj17qW/f/ho+fNQVf06hoWF6772P9OyzT+q9997S3/72snbs2Ka//e3PGjHi/Ofdt2+vfvObx9WuXQc99thDWrZsqUaMuErPP/+s5sx5XVFR0Xr//Xf0l7/8Ufff/0tt2LBO7733kc6ePavnnvudzp492/BcN998mxYu/Leef/6vioyM0j/+8TcdOlSomJhYLV26WHffff5WwU8++VCSNHfuJyooOKhbb73hvLfX1tbqvffe0oIFn8tsNusvf3lOZWWl+sUvfqU33nhVDz74iDZvzlBBwUF98sli+fr6/mALYffuPfTII49p3ryP9de//km///2ffvQ1S0xM0sSJUyRJ48Zd0/A8x44d/dHX4ne/e06SFBAQoNdee0effPKB3n33DT3zTNNXnTGDCQAAAACAVqq+vl6zZ8/SyJGjz1t9VFtbq2XLPtfIkaMlScOHj2pYCfO91NQ0HTx4QFVVVVq9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hQsXasKECfzDApdQUlKiF154Qe+//74WLlyoDz/8UPv27TM6FuAw69at05o1azR//nwtWLBA2dnZWr58udGxAIdbv3695s+fb3QMwBAFBQV64okn9NJLL2nRokXauXOnvvrqK6NjwSAUTM3gD3/4g2677TajYwCGqK6u1i9+8Qt16NBBktS+fXsVFxcbnAqwv3Xr1qlv374KDAyUt7e3Ro8erc8//9zoWIDDhIWF6de//rXc3d3l5uam5ORkFRUVGR0LcKiKigq98MILmjlzptFRAEMsX75cY8eOVWRkpNzc3PTCCy+oa9euRseCQSiYmmjlypU6c+aMrr76aqOjAIZwd3fXxIkTJUn19fV68cUXNXLkSINTAfZXWlqqsLCwhsfh4eEqKSkxMBHgWG3btlW3bt0kSfn5+frss880ZMgQY0MBDvb444/rgQcekL+/v9FRAEMcOHBAdXV1+ulPf6prrrlG77//vgICAoyOBYNYjQ7QUixdulS///3vzzuWlJSkqqoqvfXWW8aEAhzsQtfBW2+9perqav36179WbW2t7r77boMSAo5js9l+cMxkMhmQBDDW3r17dffdd+uRRx5RQkKC0XEAh/n4448VFRWlfv36ad68eUbHAQxRV1enjIwMvfvuu/L29ta9996r+fPna8qUKUZHgwEomC7RmDFjNGbMmPOOffzxx3rllVd00003NRybOHGi5s6dK19fX0dHBOzux64DSTp58qTuueceBQYGas6cOXJzczMgHeBYERERysjIaHhcWlqq8PBwAxMBjpeZmamf//znevTRRzVu3Dij4wAO9dlnn6msrEwTJ07U8ePHderUKT377LN69NFHjY4GOExoaKj69eun4OBgSdKIESO0fft2CiYXZbL92K9gcUXat2+vPXv2GB0DcLh7771XISEheuqpp1jBAZdRUlKiG264QZ988om8vLw0ffp0Pf3000pLSzM6GuAQxcXFmjx5sl544QX169fP6DiAoebNm6eNGzfqD3/4g9FRAIfatm2bHnnkEX300Ufy8fHRfffdpxEjRui6664zOhoMwAomAE2yc+dOrVy5UikpKZo0aZKkc7NoXnvtNWODAXYWERGhBx54QLfccotqamo0depUyiW4lNdff11nz5497wfq6dOn64YbbjAwFQDAkbp27ao77rhDN954o2pqajRgwABde+21RseCQVjBBAAAAAAAgCbhLnIAAAAAAABoEgomAAAAAAAANAkFEwAAAAAAAJqEggkAAAAAAABNQsEEAAAAAACAJqFgAgAAAAAAQJNQMAEAAAAAAKBJKJgAAECLN3z4cK1bt87oGAAAAC6LggkAAKCZHT16VO3bt1dJSYnRUQAAAByCggkAAKAZ/OlPf9I333wjSdq9e7eCg4MVERFhcKpzfv7znysnJ6fhcWFhobp3735Fz3Xy5EndcccdOnPmTHPFAwAArQAFEwAAaFVyc3N18803Kz09XePGjdPKlSsb3padna1Jkyape/fu+vnPf65f/vKXeuGFF5p8zq1bt2rfvn0aNGiQJGnXrl3q0KFDk5+3OVRXV+vAgQNq165dszyfj4+Pxo8fr7/+9a/N8nwAAKB1oGACAACtRk1NjWbOnKkBAwZo3bp1mjVrln71q19p//79qq6u1v3336/Jkydr48aNGj9+vFasWNEs5/373/+uadOmNTx2poJp3bp16tevX7M+55gxY7Ro0SKVl5c36/MCAICWi4IJAAC0Gtu2bdOpU6d01113yd3dXf369dOwYcO0ZMkSbdu2TbW1tbrlllvk5uamq666Sl26dGn42BMnTmjq1Knq3r37edvJnn/+ed1444166KGHVFNT84NzVlZWKjMzUwMGDGg4tnv3bnXs2PEH7/vhhx/q5ptvbviTlpam7du3N7x9+vTpevHFFyWd28bWvn17bdiwQdK5lUi9evXSe++9J0mqqqrSzJkzdfPNN2vatGn66quvfvQ1WblypUaOHHk5L2OjPDw81KNHjwueEwAAuB6r0QEAAACaS2lpqSIjI2U2/+d3aNHR0SopKVFpaakiIiJkMpka3hYVFdXw356ennr11Vf1xz/+seHY7t27VVJSovfff19z5szRF198ofHjx593zgMHDigsLEzu7u6SpLNnzyovL0+dOnX6Qb5p06Y1rHRatWqV5s+fr7S0NElScXGxIiIitHHjxob3T01N1fLly9W3b1+tX79e8fHxDW9buHChBg0apJtuukk2m00nTpz4wfnq6+u1detWzZ49+5Jev++VlJTonXfeUW1trWw2mzp27KjJkyef9z5xcXHKy8u7rOcFAACtFyuYAABAqxEeHq7Dhw+rvr6+4dj3xU1YWJhKSkpks9nOe9v33NzcFBwcfN7zbd68WQMHDpQkDRo0SJs3b/7BOc1ms+rq6hoe5+TkyGq1KjEx8YI5jx49qr/+9a968sknG4598cUXmjBhgpKSkpSbmytJiomJUVFRkWw2m5YvX67/3979hTT1xnEc/8icduEWsm4EhcbYXY02Mb1xLgMxMRpSDLoRjC5cUIhXioy6EgQvRKQJQRHeCEFtDiYxhgwZ9Af6IyIrqJtGXYSQRGN/yt+FdH6szfjFLn6k7xcc2HnO9zznOefys+c8p6+vz6hvbGzUy5cv9fnzZ9XV1clqtVZc59WrVzpx4oRMJtO+Y/nVjx8/FI1GNTY2pomJCU1OTsrhcGhtba2s7vv373/ULwAAONgImAAAwIHhcrl05MgR3blzR8ViUU+ePFEymdTAwIBOnTolk8mkpaUllUolJRIJbWxs/La/nZ0dNTU1SZIsFou+fPlSUdPW1qbt7W3l83lJe7OeHA6HSqWS8vm88vm8CoVC2Tk3b97UjRs3ygKt9fV1eb1eDQ4OanV11Wh3u9169uyZtre3dezYMaP9woULstvtunLligKBgN69e1cxtkQiobNnz/6HJ/ev169fy+/3q76+XvF4XNlsVi6XS7lcrqzuw4cPvw3RAADA4ULABAAADoyGhgaFw2GlUil1dXXp1q1bmpmZkcPhUENDg+bn5/XgwQN1dHQoGo3K5/MZr7ZVY7FY9PXrV0l7azQdPXq0osZqtaq9vd1YK2lra0ubm5tyuVzGNjAwYNQ/evRIFotFvb29RtunT5/09u1bjY6O6vbt22VrG/X19Wl6elqnT58uu67ZbFYwGFQkEtH169c1Pz9fMbZ0Om3MwPrVt2/f5Ha7y7ZMJiOTyWTMAAuHw3r+/Lkklc1WKhQKevHiRdk9AACAw401mAAAwF8vmUwav51Op7EQ9q9OnjypSCRi7F+6dElnzpzZt1+Px6O7d+/K7/drfX1dHo+nat21a9cUDofV09OjUCikUChUte7jx4+6d+9exfhWV1c1MTGh/v5+SXsznH7Oejp+/Lja29vV39+vdDptnJPNZo21n2w2W9mrfz89fPiw6jhaW1uVyWSqHisWi7p//76Gh4eNZ7WxsVEWMMViMZ0/f77qa3kAAOBwImACAACHxtOnT2W329Xc3KyVlRVlMhl1d3cbx69evaqtrS29f/9egUBAQ0NDstlsunz5slpaWjQyMlK1X4/HI7vdrlQqJa/Xu+/1FxcXtbOzo9HRUaMtGAzq8ePHWlhYMNo6OzsVj8eN/ampqYq+3rx5o7GxMTU2Nmp3d3ffUOtPmc1mnTt3TrOzs8ZMJqfTqYsXL0ra+3pdLBYzvnYHAAAgSXW71f7uAgAAOICWl5c1NzenXC6n1tZWjY+Py+fz/d/DAgAA+OsRMAEAAAAAAKAmLPINAAAAAACAmhAwAQAAAAAAoCYETAAAAAAAAKgJARMAAAAAAABqQsAEAAAAAACAmhAwAQAAAAAAoCYETAAAAAAAAKgJARMAAAAAAABq8g/wlbD9p3152QAAAABJRU5ErkJggg==\n", + "text/plain": [ + "<Figure size 1440x720 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot luminosity distribution\n", + "ldist = population.grid_results['luminosity distribution']\n", + "\n", + "# pad the distribution with zeros where data is missing\n", + "pad_output_distribution(ldist,\n", + " binwidth['luminosity'])\n", + "\n", + "# make pandas dataframe from our sorted dictionary of data\n", + "plot_data = pd.DataFrame.from_dict({'ZAMS luminosity distribution' : ldist})\n", + "\n", + "# make the plot\n", + "p = sns.lineplot(data=plot_data)\n", + "p.set_xlabel(\"$\\log_{10}$ ($L_\\mathrm{ZAMS}$ / L$_{☉}$)\")\n", + "p.set_ylabel(\"Number of stars\")\n", + "p.set(yscale=\"log\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "31fe91bb-177d-4e4e-90cf-298a3f8a8b61", + "metadata": {}, + "source": [ + "Most stars are low mass red dwarfs, with small luminosities. Without the IMF weighting, our model population would have got this completely wrong! \n", + "\n", + "As you increase the resolution, you will see this curve becomes even smoother. The wiggles in the curve are (usually) sampling artefacts because the curve should monotonically brighten above about log(*L*/L<sub>☉</sub>)=-2. \n", + " \n", + "Remember you can play with the binwidth too. If you want a very accurate distribution you need a narrow binwidth, but then you'll also need high resolution (lots of stars) so lots of CPU time, hence cost, CO<sub>2</sub>, etc." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/source/notebook_population.ipynb b/docs/source/notebook_population.ipynb index 961a3b71a53f33b947392c6778cdddde7aca0349..f6f27ee4329b90d22651068ea0aca8d8756c5eb9 100644 --- a/docs/source/notebook_population.ipynb +++ b/docs/source/notebook_population.ipynb @@ -23,9 +23,12 @@ "outputs": [], "source": [ "import os\n", + "\n", "from binarycpython.utils.custom_logging_functions import temp_dir\n", "from binarycpython.utils.grid import Population\n", "\n", + "TMP_DIR = temp_dir(\"notebooks\", \"notebook_population\")\n", + "\n", "# help(Population) # Uncomment to see the public functions of this object" ] }, @@ -60,7 +63,8 @@ "adding: max_evolution_time=15000 to BSE_options\n", "adding: eccentricity=0.02 to BSE_options\n", "adding: amt_cores=2 to grid_options\n", - "<<<< Warning: Key does not match previously known parameter: adding: data_dir=/tmp/binary_c_python/example_python_population_result to custom_options >>>>\n", + "adding: tmp_dir=/tmp/binary_c_python/notebooks/notebook_population to grid_options\n", + "<<<< Warning: Key does not match previously known parameter: adding: data_dir=/tmp/binary_c_python/notebooks/notebook_population/example_python_population_result to custom_options >>>>\n", "<<<< Warning: Key does not match previously known parameter: adding: base_filename=example_pop.dat to custom_options >>>>\n", "1\n", "example_pop.dat\n", @@ -88,11 +92,12 @@ "\n", "\n", " # grid_options\n", - " amt_cores=2, # grid_options\n", + " amt_cores=2,\n", + " tmp_dir=TMP_DIR,\n", " \n", " # Custom options # TODO: need to be set in grid_options probably\n", " data_dir=os.path.join(\n", - " temp_dir(), \"example_python_population_result\"\n", + " TMP_DIR, \"example_python_population_result\"\n", " ), # custom_options\n", " base_filename=\"example_pop.dat\", # custom_options\n", ")\n", @@ -133,13 +138,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "Writing settings to /tmp/binary_c_python/example_python_population_result/example_pop_settings.json\n" + "Writing settings to /tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/example_pop_settings.json\n" ] }, { "data": { "text/plain": [ - "'/tmp/binary_c_python/example_python_population_result/example_pop_settings.json'" + "'/tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/example_pop_settings.json'" ] }, "execution_count": 3, @@ -181,7 +186,7 @@ "text": [ "Help on method add_grid_variable in module binarycpython.utils.grid:\n", "\n", - "add_grid_variable(name:str, longname:str, valuerange:Union[list, str], resolution:str, spacingfunc:str, probdist:str, dphasevol:Union[str, int], parameter_name:str, gridtype:str='edge', branchpoint:int=0, precode:Union[str, NoneType]=None, condition:Union[str, NoneType]=None) -> None method of binarycpython.utils.grid.Population instance\n", + "add_grid_variable(name:str, longname:str, valuerange:Union[list, str], resolution:str, spacingfunc:str, probdist:str, dphasevol:Union[str, int], parameter_name:str, gridtype:str='centred', branchpoint:int=0, precode:Union[str, NoneType]=None, condition:Union[str, NoneType]=None) -> None method of binarycpython.utils.grid.Population instance\n", " Function to add grid variables to the grid_options.\n", " \n", " The execution of the grid generation will be through a nested for loop.\n", @@ -199,25 +204,25 @@ " name:\n", " name of parameter. This is evaluated as a parameter and you can use it throughout\n", " the rest of the function\n", - " \n", + " \n", " Examples:\n", " name = 'lnm1'\n", " longname:\n", " Long name of parameter\n", - " \n", + " \n", " Examples:\n", " longname = 'Primary mass'\n", " range:\n", " Range of values to take. Does not get used really, the spacingfunction is used to\n", " get the values from\n", - " \n", + " \n", " Examples:\n", " range = [math.log(m_min), math.log(m_max)]\n", " resolution:\n", " Resolution of the sampled range (amount of samples).\n", " TODO: check if this is used anywhere\n", " \n", - " Examples: \n", + " Examples:\n", " resolution = resolution[\"M_1\"]\n", " spacingfunction:\n", " Function determining how the range is sampled. You can either use a real function,\n", @@ -230,12 +235,12 @@ " precode:\n", " Extra room for some code. This code will be evaluated within the loop of the\n", " sampling function (i.e. a value for lnm1 is chosen already)\n", - " \n", + " \n", " Examples:\n", " precode = 'M_1=math.exp(lnm1);'\n", " probdist:\n", " Function determining the probability that gets assigned to the sampled parameter\n", - " \n", + " \n", " Examples:\n", " probdist = 'Kroupa2001(M_1)*M_1'\n", " dphasevol:\n", @@ -249,7 +254,7 @@ " condition = 'self.grid_options['binary']==1'\n", " gridtype:\n", " Method on how the value range is sampled. Can be either 'edge' (steps starting at\n", - " the lower edge of the value range) or 'center'\n", + " the lower edge of the value range) or 'centred'\n", " (steps starting at lower edge + 0.5 * stepsize).\n", "\n" ] @@ -313,7 +318,7 @@ " \"dphasevol\": \"dlnm1\",\n", " \"parameter_name\": \"M_1\",\n", " \"condition\": \"\",\n", - " \"gridtype\": \"edge\",\n", + " \"gridtype\": \"centred\",\n", " \"branchpoint\": 0,\n", " \"grid_variable_number\": 0\n", "}\n" @@ -457,7 +462,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "adding: parse_function=<function parse_function at 0x7ff3bdf79620> to grid_options\n" + "adding: parse_function=<function parse_function at 0x7f531bc3b6a8> to grid_options\n" ] } ], @@ -536,25 +541,25 @@ "Generating grid code\n", "Constructing/adding: lnm1\n", "Grid has handled 20 stars\n", - "with a total probability of 0.05150046619238192\n", + "with a total probability of 0.044402888438054094\n", "Total starcount for this run will be: 20\n", - "EXAMPLE_COMPACT_OBJECT 2.867655467480e+01 1.33079 9.81391 0.00167028 13\n", "Generating grid code\n", "Constructing/adding: lnm1\n", - "EXAMPLE_COMPACT_OBJECT 1.931266944719e+01 1.3933 12.3177 0.00124307 13\n", - "EXAMPLE_COMPACT_OBJECT 4.439623364590e+01 1.38004 7.81906 0.00224431 13\n", - "EXAMPLE_COMPACT_OBJECT 1.364277535630e+01 1.47961 15.4603 0.000925128 13\n", - "EXAMPLE_COMPACT_OBJECT 1.017435498578e+01 1.59052 19.4046 0.000688507 13\n", - "EXAMPLE_COMPACT_OBJECT 8.294870923827e+00 1.7197 24.3552 0.000512406 13\n", - "EXAMPLE_COMPACT_OBJECT 6.802132608769e+00 1.84162 30.5689 0.000381347 13\n", - "EXAMPLE_COMPACT_OBJECT 5.723570798020e+00 1.99471 38.3678 0.00028381 13\n", - "EXAMPLE_COMPACT_OBJECT 4.933751523833e+00 2.15875 48.1564 0.000211219 13\n", - "EXAMPLE_COMPACT_OBJECT 4.337250536639e+00 2.35209 60.4424 0.000157195 14\n", - "EXAMPLE_COMPACT_OBJECT 3.862081089332e+00 2.56776 75.8628 0.000116989 14\n", - "EXAMPLE_COMPACT_OBJECT 3.449960890183e+00 2.80457 95.2174 8.70668e-05 14\n", - "EXAMPLE_COMPACT_OBJECT 3.172196856333e+00 3.05193 119.51 6.47976e-05 14\n", - "EXAMPLE_COMPACT_OBJECT 3.069627290216e+00 3.27563 150 4.82242e-05 14\n", - "Population-2a7732d03e594ef4b5dfe9051b41d9c0 finished! The total probability was: 0.05150046619238191. It took a total of 0.7797017097473145s to run 20 systems on 2 cores\n", + "EXAMPLE_COMPACT_OBJECT 4.139293101586e+01 1.29427 8.13626 0.00202467 13\n", + "EXAMPLE_COMPACT_OBJECT 2.802986496151e+01 1.33699 10.0967 0.00152924 13\n", + "EXAMPLE_COMPACT_OBJECT 1.963621764679e+01 1.39754 12.5294 0.00115504 13\n", + "EXAMPLE_COMPACT_OBJECT 1.427601421985e+01 1.47745 15.5483 0.000872405 13\n", + "EXAMPLE_COMPACT_OBJECT 1.094409257247e+01 1.57571 19.2947 0.00065893 13\n", + "EXAMPLE_COMPACT_OBJECT 9.181971798545e+00 1.68748 23.9436 0.000497691 13\n", + "EXAMPLE_COMPACT_OBJECT 7.905335716621e+00 1.77287 29.7128 0.000375908 13\n", + "EXAMPLE_COMPACT_OBJECT 7.451192744924e+00 1.81495 36.872 0.000283924 13\n", + "EXAMPLE_COMPACT_OBJECT 7.396133472739e+00 1.82088 45.7561 0.000214449 13\n", + "EXAMPLE_COMPACT_OBJECT 7.396675941641e+00 1.82123 56.7809 0.000161974 13\n", + "EXAMPLE_COMPACT_OBJECT 7.404641347602e+00 1.82074 70.4621 0.000122339 13\n", + "EXAMPLE_COMPACT_OBJECT 7.444217227690e+00 1.81636 87.4397 9.2403e-05 13\n", + "EXAMPLE_COMPACT_OBJECT 7.453317880232e+00 1.81536 108.508 6.97923e-05 13\n", + "EXAMPLE_COMPACT_OBJECT 7.450828476484e+00 1.81563 134.653 5.27143e-05 13\n", + "Population-f28b5f98d7ef40dcb17fc2481a6d3ced finished! The total probability was: 0.04440288843805411. It took a total of 2.785212755203247s to run 20 systems on 2 cores\n", "There were no errors found in this run.\n" ] } @@ -586,7 +591,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'population_name': '2a7732d03e594ef4b5dfe9051b41d9c0', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 0.05150046619238191, 'total_count': 20, 'start_timestamp': 1628444120.234709, 'end_timestamp': 1628444121.0144107, 'total_mass_run': 730.1048014407228, 'total_probability_weighted_mass_run': 0.2983275843337705, 'zero_prob_stars_skipped': 0}\n" + "{'population_name': 'f28b5f98d7ef40dcb17fc2481a6d3ced', 'evolution_type': 'grid', 'failed_count': 0, 'failed_prob': 0, 'failed_systems_error_codes': [], 'errors_exceeded': False, 'errors_found': False, 'total_probability': 0.04440288843805411, 'total_count': 20, 'start_timestamp': 1629459533.935186, 'end_timestamp': 1629459536.7203987, 'total_mass_run': 684.2544031669779, 'total_probability_weighted_mass_run': 0.28134439269236855, 'zero_prob_stars_skipped': 0}\n" ] } ], @@ -660,42 +665,22 @@ "Generating grid code\n", "Constructing/adding: lnm1\n", "Saving grid code to grid_options\n", - "Writing grid code to /tmp/binary_c_python/binary_c_grid_2a7732d03e594ef4b5dfe9051b41d9c0.py\n", - "Loading grid code function from /tmp/binary_c_python/binary_c_grid_2a7732d03e594ef4b5dfe9051b41d9c0.py\n", + "Writing grid code to /tmp/binary_c_python/notebooks/notebook_population/binary_c_grid_f28b5f98d7ef40dcb17fc2481a6d3ced.py\n", + "Loading grid code function from /tmp/binary_c_python/notebooks/notebook_population/binary_c_grid_f28b5f98d7ef40dcb17fc2481a6d3ced.py\n", "Grid code loaded\n", - "Writing binary_c calls to /tmp/binary_c_python/example_python_population_result/binary_c_calls.txt\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", - "_calculate_multiplicity_fraction: Chosen not to use any multiplicity fraction.\n", + "Writing binary_c calls to /tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/binary_c_calls.txt\n", "Grid has handled 20 stars\n", - "with a total probability of 0.05150046619238192\n", - "/tmp/binary_c_python/example_python_population_result/binary_c_calls.txt\n", - "binary_c M_1 2.0 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.013208238029791246\n", - "binary_c M_1 2.5102526289471614 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.009829948023831718\n", - "binary_c M_1 3.1506841305680684 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.0073157281034221516\n", - "binary_c M_1 3.9545065608702976 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.22723621650191106 probability 0.005444573822104362\n" + "with a total probability of 0.044402888438054094\n", + "/tmp/binary_c_python/notebooks/notebook_population/example_python_population_result/binary_c_calls.txt\n", + "binary_c M_1 2.227955577093495 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.010905083645619543\n", + "binary_c M_1 2.7647737053496777 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.008236638755149857\n", + "binary_c M_1 3.4309362899259503 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.006221155214163634\n", + "binary_c M_1 4.257608426597089 eccentricity 0.02 max_evolution_time 15000 orbital_period 45000000080 phasevol 0.21587440567681548 probability 0.004698855121516278\n" ] } ], "source": [ - "example_pop.set(verbosity=10)\n", + "example_pop.set(verbosity=1)\n", "calls_filename = example_pop.write_binary_c_calls_to_file()\n", "print(calls_filename)\n", "\n", @@ -725,39 +710,34 @@ "Generating grid code\n", "Constructing/adding: lnm1\n", "Grid has handled 20 stars\n", - "with a total probability of 0.05150046619238192\n", + "with a total probability of 0.044402888438054094\n", "Total starcount for this run will be: 20\n", "Generating grid code\n", "Constructing/adding: lnm1\n", - "Population-3680f3882c0a449c944462abffea2447 finished! The total probability was: 0.05150046619238191. It took a total of 0.6246354579925537s to run 20 systems on 2 cores\n", + "Population-e45c25448b32440cb7e220f4a3562907 finished! The total probability was: 0.04440288843805411. It took a total of 1.9539172649383545s to run 20 systems on 2 cores\n", "There were no errors found in this run.\n", "\n", "\n", "time mass zams_mass probability radius stellar_type\n", - "2.867655467480e+01 1.33079 9.81391 0.00167028 1.72498e-05 13\n", - "1.931266944719e+01 1.3933 12.3177 0.00124307 1.72498e-05 13\n", - "4.439623364590e+01 1.38004 7.81906 0.00224431 1.72498e-05 13\n", - "1.364277535630e+01 1.47961 15.4603 0.000925128 1.72498e-05 13\n", - "1.017435498578e+01 1.59052 19.4046 0.000688507 1.72498e-05 13\n", - "8.294870923827e+00 1.7197 24.3552 0.000512406 1.72498e-05 13\n", - "6.802132608769e+00 1.84162 30.5689 0.000381347 1.72498e-05 13\n", - "5.723570798020e+00 1.99471 38.3678 0.00028381 1.72498e-05 13\n", - "4.933751523833e+00 2.15875 48.1564 0.000211219 1.72498e-05 13\n", - "4.337250536639e+00 2.35209 60.4424 0.000157195 9.97286e-06 14\n", - "3.862081089332e+00 2.56776 75.8628 0.000116989 1.08873e-05 14\n", - "3.449960890183e+00 2.80457 95.2174 8.70668e-05 1.18914e-05 14\n", - "3.172196856333e+00 3.05193 119.51 6.47976e-05 1.29402e-05 14\n", - "3.069627290216e+00 3.27563 150 4.82242e-05 1.38887e-05 14\n", + "4.139293101586e+01 1.29427 8.13626 0.00202467 1.72498e-05 13\n", + "2.802986496151e+01 1.33699 10.0967 0.00152924 1.72498e-05 13\n", + "1.963621764679e+01 1.39754 12.5294 0.00115504 1.72498e-05 13\n", + "1.427601421985e+01 1.47745 15.5483 0.000872405 1.72498e-05 13\n", + "1.094409257247e+01 1.57571 19.2947 0.00065893 1.72498e-05 13\n", + "9.181971798545e+00 1.68748 23.9436 0.000497691 1.72498e-05 13\n", + "7.905335716621e+00 1.77287 29.7128 0.000375908 1.72498e-05 13\n", + "7.451192744924e+00 1.81495 36.872 0.000283924 1.72498e-05 13\n", + "7.396133472739e+00 1.82088 45.7561 0.000214449 1.72498e-05 13\n", + "7.396675941641e+00 1.82123 56.7809 0.000161974 1.72498e-05 13\n", + "7.404641347602e+00 1.82074 70.4621 0.000122339 1.72498e-05 13\n", + "7.444217227690e+00 1.81636 87.4397 9.2403e-05 1.72498e-05 13\n", + "7.453317880232e+00 1.81536 108.508 6.97923e-05 1.72498e-05 13\n", + "7.450828476484e+00 1.81563 134.653 5.27143e-05 1.72498e-05 13\n", "\n" ] } ], "source": [ - "import os\n", - "\n", - "from binarycpython.utils.grid import Population\n", - "from binarycpython.utils.custom_logging_functions import temp_dir\n", - "\n", "def parse_function(self, output):\n", " \"\"\"\n", " Example parsing function\n", @@ -817,11 +797,12 @@ " eccentricity=0.02, # bse_options\n", " \n", " # grid_options\n", - " amt_cores=2, # grid_options\n", + " amt_cores=2,\n", + " tmp_dir=TMP_DIR,\n", "\n", " # Custom options: the data directory and the output filename\n", " data_dir=os.path.join(\n", - " temp_dir(), \"example_python_population_result\"\n", + " TMP_DIR, \"example_python_population_result\"\n", " ), # custom_options\n", " base_filename=\"example_pop.dat\", # custom_options\n", ")\n", @@ -876,15 +857,15 @@ "example_pop.export_all_info()\n", "\n", "# remove the result file if it exists\n", - "if os.path.isfile(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\")):\n", - " os.remove(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"))\n", + "if os.path.isfile(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\")):\n", + " os.remove(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"))\n", "\n", "\n", "# Evolve the population\n", "example_pop.evolve()\n", "\n", "# \n", - "with open(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", + "with open(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", " output = f.read()\n", "print(\"\\n\")\n", "print(output)" @@ -912,96 +893,39 @@ "Constructing/adding: lnm1\n", "Constructing/adding: q\n", "Constructing/adding: log10per\n", - "Grid has handled 125 stars\n", - "with a total probability of 0.0862478164626921\n", - "Total starcount for this run will be: 125\n", + "Grid has handled 27 stars\n", + "with a total probability of 0.024868380796643753\n", + "Total starcount for this run will be: 27\n", "Generating grid code\n", "Constructing/adding: lnm1\n", "Constructing/adding: q\n", "Constructing/adding: log10per\n", - "Population-d20a4c74d20a43b881c0c9e5def5f76c finished! The total probability was: 0.08624781646269201. It took a total of 8.561265707015991s to run 125 systems on 2 cores\n", + "Population-05128ef4c5fe4274a0356c3e99e2f2d2 finished! The total probability was: 0.024868380796643757. It took a total of 9.792905807495117s to run 27 systems on 2 cores\n", "There were no errors found in this run.\n", "\n", "\n", "time mass_1 zams_mass_1 mass_2 zams_mass_2 stellar_type_1 prev_stellar_type_1 stellar_type_2 prev_stellar_type_2 metallicity probability\n", - "8.863377990313e+01 1.29444 5.88566 0 2.99283 13 5 15 15 0.02 0.000627913\n", - "1.146421815741e+02 0 5.88566 1.33062 4.43925 15 15 13 5 0.02 0.000627913\n", - "7.222715508467e+01 1.34922 5.88566 0 5.88566 13 5 15 15 0.02 0.000627913\n", - "1.350021848285e+01 1.48488 17.3205 0 0.1 13 5 15 15 0.02 0.000154349\n", - "1.171108213270e+01 1.53113 17.3205 0 0.1 13 5 15 15 0.02 0.000154349\n", - "1.171086983243e+01 1.53177 17.3205 0 0.1 13 9 15 15 0.02 0.000154349\n", - "1.170770599495e+01 1.53176 17.3205 0 4.40513 13 5 15 15 0.02 0.000172877\n", - "1.230407246199e+01 1.59499 17.3205 0 4.40513 13 5 15 15 0.02 0.000610573\n", - "1.108751340926e+01 1.70319 17.3205 0 8.71025 13 4 15 15 0.02 0.000610573\n", - "1.941017702765e+01 1.34903 17.3205 1.65097 8.71025 13 13 13 5 0.02 0.000172877\n", - "1.980988739731e+01 1.36979 17.3205 1.60808 8.71025 13 13 13 5 0.02 0.000121486\n", - "3.571858031651e+01 1.53174 17.3205 1.30504 8.71025 13 13 13 5 0.02 8.42148e-05\n", - "3.459153942631e+01 1.53176 17.3205 1.31004 8.71025 13 13 13 5 0.02 9.8162e-05\n", - "1.687368550125e+01 1.34937 17.3205 1.73856 13.0154 13 13 13 8 0.02 0.000172877\n", - "1.194842917007e+01 1.78096 17.3205 0 13.0154 13 8 15 15 0.02 0.000610573\n", - "1.733614170983e+01 1.53184 17.3205 1.42375 13.0154 13 13 13 5 0.02 9.8162e-05\n", - "1.723547465714e+01 1.38403 17.3205 1.71288 13.0154 13 13 13 8 0.02 0.000121486\n", - "1.764340254985e+01 1.53174 17.3205 1.41264 13.0154 13 13 13 5 0.02 8.42148e-05\n", - "1.170425790780e+01 1.52963 17.3205 0 17.3205 13 5 15 15 0.02 0.000172877\n", - "8.922967341481e+00 1.85486 17.3205 0 17.3205 13 8 15 15 0.02 0.000610573\n", - "1.232906623449e+01 1.41074 17.3205 1.34281 17.3205 13 13 13 8 0.02 0.000121486\n", - "1.170775828562e+01 1.53183 17.3205 1.53183 17.3205 13 5 13 5 0.02 9.8162e-05\n", - "1.170770422321e+01 1.53175 17.3205 1.53175 17.3205 13 5 13 5 0.02 8.42148e-05\n", - "5.075844624794e+00 2.12303 50.9713 0 0.1 13 8 15 15 0.02 3.79411e-05\n", - "4.766606588165e+00 2.20484 50.9713 0 0.1 14 8 15 15 0.02 3.79411e-05\n", - "4.768305081494e+00 2.18838 50.9713 0 0.1 13 8 15 15 0.02 3.79411e-05\n", - "4.458869865939e+00 2.29864 50.9713 0 12.8178 14 8 15 15 0.02 0.000150087\n", - "1.806014211040e+01 2.10446 50.9713 1.40749 12.8178 13 13 13 5 0.02 2.9863e-05\n", - "4.797342083485e+00 2.10328 50.9713 0 12.8178 13 13 15 1 0.02 4.24954e-05\n", - "1.721374713429e+01 2.21673 50.9713 1.42212 12.8178 14 14 13 5 0.02 2.41295e-05\n", - "4.055645404546e+00 2.47276 50.9713 0 25.5357 14 7 15 15 0.02 0.000150087\n", - "1.806123543037e+01 2.21893 50.9713 1.40745 12.8178 14 14 13 5 0.02 2.07011e-05\n", - "8.117519147635e+00 2.10433 50.9713 2.21473 25.5357 13 13 14 8 0.02 4.24954e-05\n", - "8.315554923168e+00 2.15343 50.9713 2.08519 25.5357 13 13 13 8 0.02 2.9863e-05\n", - "7.917420996633e+00 2.21892 50.9713 1.7431 25.5357 14 14 13 8 0.02 2.07011e-05\n", - "7.693213405973e+00 2.21805 50.9713 1.78384 25.5357 14 14 13 8 0.02 2.41295e-05\n", - "3.753837732894e+00 2.62517 50.9713 0 38.2535 14 7 15 15 0.02 0.000150087\n", - "7.087296558990e+00 2.10417 50.9713 2.40935 38.2535 13 13 14 8 0.02 4.24954e-05\n", - "7.007109286263e+00 2.15854 50.9713 2.28672 38.2535 13 13 14 8 0.02 2.9863e-05\n", - "5.653200958306e+00 2.21878 50.9713 2.0587 38.2535 14 14 13 8 0.02 2.41295e-05\n", - "5.733794947644e+00 2.21892 50.9713 1.99255 38.2535 14 14 13 8 0.02 2.07011e-05\n", - "3.513216011269e+00 2.76647 50.9713 0 50.9713 14 7 15 15 0.02 0.000150087\n", - "4.750574783854e+00 2.27442 50.9713 0 50.9713 14 8 15 15 0.02 4.24954e-05\n", - "7.278384712062e+00 1.29678 50.9713 2.09216 50.9713 13 8 13 13 0.02 2.9863e-05\n", - "4.765996194699e+00 2.20787 50.9713 2.20787 50.9713 14 8 14 8 0.02 2.07011e-05\n", - "4.765535914728e+00 2.21331 50.9713 2.21331 50.9713 14 8 14 8 0.02 2.41295e-05\n", - "3.104706358826e+00 3.17639 150 0 0.1 14 7 15 15 0.02 9.32641e-06\n", - "3.069363482023e+00 3.27572 150 0 0.1 14 7 15 15 0.02 9.32641e-06\n", - "3.047074050271e+00 3.3836 150 0 37.575 14 7 15 15 0.02 3.68933e-05\n", - "5.974759306305e+00 3.23604 150 2.53922 37.575 14 14 14 7 0.02 1.04459e-05\n", - "6.074084349384e+00 3.30145 150 2.13876 37.575 14 14 13 8 0.02 7.34071e-06\n", - "5.733865371895e+00 3.29994 150 2.00498 37.575 14 14 13 8 0.02 5.93135e-06\n", - "3.027099358410e+00 3.53631 150 0 75.05 14 7 15 15 0.02 3.68933e-05\n", - "5.807147339697e+00 3.30197 150 1.9791 37.575 14 14 13 8 0.02 5.08861e-06\n", - "4.862942347290e+00 3.25294 150 2.97823 75.05 14 14 14 7 0.02 1.04459e-05\n", - "4.556479830908e+00 3.29942 150 2.73221 75.05 14 14 14 7 0.02 7.34071e-06\n", - "3.853070305680e+00 3.29977 150 2.62486 75.05 14 14 14 7 0.02 5.93135e-06\n", - "3.881529045940e+00 3.30149 150 2.55924 75.05 14 14 14 7 0.02 5.08861e-06\n", - "3.015033359333e+00 3.64419 150 0 112.525 14 7 15 15 0.02 3.68933e-05\n", - "4.126828648362e+00 3.32047 150 0 112.525 14 14 15 3 0.02 1.04459e-05\n", - "3.990017992944e+00 3.3032 150 2.94027 112.525 14 14 14 7 0.02 7.34071e-06\n", - "3.206771867883e+00 3.07671 150 3.11282 112.525 14 14 14 7 0.02 5.93135e-06\n", - "3.006827156705e+00 3.72638 150 0 150 14 7 15 15 0.02 3.68933e-05\n", - "3.218786094847e+00 3.30337 150 3.01344 112.525 14 14 14 7 0.02 5.08861e-06\n", - "4.527722847382e+00 1.42238 150 0 150 13 5 15 15 0.02 1.04459e-05\n", - "3.069567332611e+00 3.27804 150 3.27804 150 14 7 14 7 0.02 5.93135e-06\n", - "5.726405299909e+00 1.29746 150 3.22759 150 13 8 14 14 0.02 7.34071e-06\n", - "3.069626478211e+00 3.27565 150 3.27565 150 14 7 14 7 0.02 5.08861e-06\n", + "1.219029061236e+01 1.60007 17.3205 0 2.97008 13 5 15 15 0.02 0.000498487\n", + "1.935920346899e+01 1.29448 17.3205 0 8.71025 13 13 15 2 0.02 0.000498487\n", + "2.123795595728e+01 1.30902 17.3205 1.58519 8.71025 13 13 13 5 0.02 0.000287968\n", + "3.579099761269e+01 1.52414 17.3205 1.30642 8.71025 13 13 13 5 0.02 0.000220016\n", + "1.674063083432e+01 1.29457 17.3205 0 14.4504 13 13 15 2 0.02 0.000498487\n", + "1.779197348711e+01 1.3228 17.3205 1.71196 14.4504 13 13 13 8 0.02 0.000287968\n", + "1.548740826516e+01 1.52415 17.3205 1.45407 14.4504 13 13 13 5 0.02 0.000220016\n", + "1.772169325356e+01 1.81957 73.0434 1.46573 12.2572 13 13 13 5 0.02 4.43422e-05\n", + "1.367065500196e+01 1.66003 73.0434 1.79487 12.2572 13 13 13 8 0.02 7.67586e-05\n", + "2.021960493499e+01 1.82061 73.0434 1.39205 12.2572 13 13 13 5 0.02 3.38788e-05\n", + "9.012246630357e+00 1.81529 73.0434 0 36.5717 13 8 15 15 0.02 7.67586e-05\n", + "7.462779538274e+00 1.82255 73.0434 1.81499 36.5717 13 13 13 8 0.02 3.38788e-05\n", + "1.030499912298e+01 1.80592 73.0434 1.81066 36.5717 13 13 13 8 0.02 4.43422e-05\n", + "4.227002356107e+00 2.43719 73.0434 0 60.8862 14 14 15 1 0.02 7.67586e-05\n", + "7.396288708628e+00 1.8216 73.0434 1.8216 60.8862 13 8 13 8 0.02 3.38788e-05\n", + "7.394728392218e+00 1.80919 73.0434 1.79091 60.8862 13 13 13 8 0.02 4.43422e-05\n", "\n" ] } ], "source": [ - "import os\n", - "\n", - "from binarycpython.utils.grid import Population\n", - "from binarycpython.utils.custom_logging_functions import temp_dir\n", - "\n", "def parse_function(self, output):\n", " \"\"\"\n", " Example parsing function\n", @@ -1067,10 +991,11 @@ " \n", " # grid_options\n", " amt_cores=2, # grid_options\n", + " tmp_dir=TMP_DIR,\n", "\n", " # Custom options: the data directory and the output filename\n", " data_dir=os.path.join(\n", - " temp_dir(), \"example_python_population_result\"\n", + " TMP_DIR, \"example_python_population_result\"\n", " ), # custom_options\n", " base_filename=\"example_pop.dat\", # custom_options\n", ")\n", @@ -1168,14 +1093,14 @@ "example_pop.export_all_info()\n", "\n", "# remove the result file if it exists\n", - "if os.path.isfile(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\")):\n", - " os.remove(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"))\n", + "if os.path.isfile(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\")):\n", + " os.remove(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"))\n", "\n", "# Evolve the population\n", "example_pop.evolve()\n", "\n", "# \n", - "with open(os.path.join(temp_dir(), \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", + "with open(os.path.join(TMP_DIR, \"example_python_population_result\", \"example_pop.dat\"), 'r') as f:\n", " output = f.read()\n", "print(\"\\n\")\n", "print(output)" @@ -1184,7 +1109,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -1198,7 +1123,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.5" + "version": "3.6.4" } }, "nbformat": 4, diff --git a/examples/notebook_api_functionality.ipynb b/examples/notebook_api_functionality.ipynb index 8d454880c82dba172d33a95532c47bc95f24ff6a..020d2dc7cdb1ae9f1214d42e3351b571ff0c943d 100644 --- a/examples/notebook_api_functionality.ipynb +++ b/examples/notebook_api_functionality.ipynb @@ -5,7 +5,7 @@ "id": "cb9d00f5-9613-471e-a4bb-6181311bf73b", "metadata": {}, "source": [ - "# Using the API functionality of binarycpython\n", + "# Tutorial: Using the API functionality of binary_c-python\n", "This notebook shows how to use the API functions that interface with binary_c. It usually is better to use wrapper functions that internally use these API functions, because most of the output here is very raw\n", "\n", "Binarycpython uses the Python-C extension framework to interface Python with C. The sourcecode for this is contained in `src/binary_c_python.c`, and the functions are available via `from binarycpython import _binary_c_bindings`.\n", diff --git a/examples/notebook_custom_logging.ipynb b/examples/notebook_custom_logging.ipynb index 84e41e6bcee06490f5b4dc61fb616cc213024aba..bfdf2a5c8fe238aec50d8f69c74d11b06491eb5f 100644 --- a/examples/notebook_custom_logging.ipynb +++ b/examples/notebook_custom_logging.ipynb @@ -5,7 +5,7 @@ "id": "879b596b-d70c-4f90-b668-563b4ad93ffc", "metadata": {}, "source": [ - "# Using custom logging routines with binarycpython\n", + "# Tutorial: Using custom logging routines with binary_c-python\n", "In this notebook you'll learn how to use the custom logging functionality" ] }, diff --git a/examples/notebook_extra_features.ipynb b/examples/notebook_extra_features.ipynb index b1a9ddb030195e6aaf0da2cf08eecc67684672a6..076b4098e7c588a68fb91cfe6175c3ee4e36ea78 100644 --- a/examples/notebook_extra_features.ipynb +++ b/examples/notebook_extra_features.ipynb @@ -5,7 +5,7 @@ "id": "d5c04b77-f0be-4b33-8c03-c72eb846527c", "metadata": {}, "source": [ - "# Extra features and functionality of binarycpython\n", + "# Tutorial: Extra features and functionality of binary_c-python\n", "In this notebook we'll go over some of the extra features and functionality that was not covered in the other notebooks.\n", "\n", "Within the module `binarycpython.utils.functions` there are many functions that can be useful when using binarycpython. We can see which functions are in there, again by using the `help()`" diff --git a/examples/notebook_individual_systems.ipynb b/examples/notebook_individual_systems.ipynb index 21d49016f3b2826d6f9d5ec87a1f6d8bb18df7af..e6451e76238c7d7ed9f4a539a83103cb596987be 100644 --- a/examples/notebook_individual_systems.ipynb +++ b/examples/notebook_individual_systems.ipynb @@ -5,7 +5,7 @@ "id": "a544d28c-c2e1-4c6a-b55b-8caec440743f", "metadata": {}, "source": [ - "# Running individual systems with binarycpython\n", + "# Tutorial: Running individual systems with binary_c-python\n", "This notebook will show you how to run single systems and analyze their results.\n", "\n", "It can be useful to have some functions to quickly run a single system to e.g. inspect what evolutionary steps a specific system goes through, to plot the mass loss evolution of a single star, etc. " diff --git a/examples/notebook_luminosity_function_binaries.ipynb b/examples/notebook_luminosity_function_binaries.ipynb index fb64dbcc9754aa9dc823a41ae3c52223cb2a8d9a..47a96d0934935dc5ab09f12823878ff0f228495d 100644 --- a/examples/notebook_luminosity_function_binaries.ipynb +++ b/examples/notebook_luminosity_function_binaries.ipynb @@ -5,7 +5,7 @@ "id": "bbbaafbb-fd7d-4b73-a970-93506ba35d71", "metadata": {}, "source": [ - "# Zero-age stellar luminosity function in binaries\n", + "# Example use case: Zero-age stellar luminosity function in binaries\n", "\n", "In this notebook we compute the luminosity function of the zero-age main-sequence by running a population of binary stars using binary_c. \n", "\n", @@ -805,14 +805,6 @@ "p.set_ylabel(\"Number of stars\")\n", "p.set(yscale=\"log\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e7541ebf-fe9a-4fb0-a88e-bb318d06f9eb", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/notebook_luminosity_function_single.ipynb b/examples/notebook_luminosity_function_single.ipynb index fb971b34a58887a38066f2dbb3d056ff4c5dc5b6..5980adf6d26bbc67f3eed90f5b2709d6574249cd 100644 --- a/examples/notebook_luminosity_function_single.ipynb +++ b/examples/notebook_luminosity_function_single.ipynb @@ -430,14 +430,6 @@ "Does this look like a reasonable stellar luminosity function to you? The implication is that the most likely stellar luminosity is 10<sup>5.8</sup> L<sub>☉</sub>! Clearly, this is not very realistic... let's see what went wrong." ] }, - { - "cell_type": "markdown", - "id": "44586e42-b7cb-4a55-be0a-330b98b20de4", - "metadata": {}, - "source": [ - "## " - ] - }, { "cell_type": "markdown", "id": "e32c3bbf-390f-45da-ad9c-cc3e7c9449dc", @@ -554,9 +546,11 @@ { "cell_type": "markdown", "id": "673031c9-7d80-45d4-b209-301c127d3edf", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ - "# A better-sampled grid\n", + "## A better-sampled grid\n", "\n", "The IMF has many more low-mass stars than high-mass stars. So, instead of sampling M1 linearly, we can sample it in log space. \n", "\n", diff --git a/examples/notebook_population.ipynb b/examples/notebook_population.ipynb index f6f27ee4329b90d22651068ea0aca8d8756c5eb9..fff337533f9b9004ab9c66da8433444fab13511b 100644 --- a/examples/notebook_population.ipynb +++ b/examples/notebook_population.ipynb @@ -7,7 +7,7 @@ "tags": [] }, "source": [ - "# Running populations with binarycpython\n", + "# Tutorial: Running populations with binary_c-python\n", "This notebook will show you how to evolve a population of stars\n", "\n", "Much of the code in the binarycpython package is written to evolve a population of stars through the Population object, rather than running a single system. Let's go through the functionality of this object step by step and set up some example populations. \n",