<!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>Examples — 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 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="Example of population script" href="population_example.html" /> <link rel="prev" title="Examples" href="examples.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="examples.html">Examples</a><ul class="current"> <li class="toctree-l2 current"><a class="current reference internal" href="#">Examples</a></li> <li class="toctree-l2"><a class="reference internal" href="population_example.html">Example of population script</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="examples.html">Examples</a> »</li> <li>Examples</li> <li class="wy-breadcrumbs-aside"> <a href="_sources/general_examples.rst.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"> <div class="section" id="examples"> <h1>Examples<a class="headerlink" href="#examples" title="Permalink to this headline">ΒΆ</a></h1> <p>The source code of the general examples.</p> <div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/python3</span> <span class="kn">import</span> <span class="nn">os</span> <span class="kn">import</span> <span class="nn">sys</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">from</span> <span class="nn">binarycpython.utils.functions</span> <span class="kn">import</span> <span class="n">example_parse_output</span> <span class="kn">from</span> <span class="nn">binarycpython.utils.custom_logging_functions</span> <span class="kn">import</span> <span class="p">(</span> <span class="n">autogen_C_logging_code</span><span class="p">,</span> <span class="n">binary_c_log_code</span><span class="p">,</span> <span class="n">create_and_load_logging_function</span><span class="p">,</span> <span class="p">)</span> <span class="kn">from</span> <span class="nn">binarycpython.utils.run_system_wrapper</span> <span class="kn">import</span> <span class="n">run_system</span> <span class="sd">"""</span> <span class="sd">Very basic scripts to run a binary system and print the output.</span> <span class="sd">Use these as inspiration/base.</span> <span class="sd">"""</span> <span class="k">def</span> <span class="nf">run_example_binary</span><span class="p">():</span> <span class="sd">"""</span> <span class="sd"> Function to run a binary system. Very basic approach which directly adresses the run_system(..) python-c wrapper function.</span> <span class="sd"> """</span> <span class="n">m1</span> <span class="o">=</span> <span class="mf">15.0</span> <span class="c1"># Msun</span> <span class="n">m2</span> <span class="o">=</span> <span class="mf">14.0</span> <span class="c1"># Msun</span> <span class="n">separation</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># 0 = ignored, use period</span> <span class="n">orbital_period</span> <span class="o">=</span> <span class="mf">4530.0</span> <span class="c1"># days</span> <span class="n">eccentricity</span> <span class="o">=</span> <span class="mf">0.0</span> <span class="n">metallicity</span> <span class="o">=</span> <span class="mf">0.02</span> <span class="n">max_evolution_time</span> <span class="o">=</span> <span class="mi">15000</span> <span class="c1"># Myr. You need to include this argument.</span> <span class="c1">#</span> <span class="n">argstring</span> <span class="o">=</span> <span class="s2">"binary_c M_1 </span><span class="si">{m1}</span><span class="s2"> M_2 </span><span class="si">{m2}</span><span class="s2"> separation </span><span class="si">{separation}</span><span class="s2"> orbital_period </span><span class="si">{orbital_period}</span><span class="s2"> </span><span class="se">\</span> <span class="s2"> eccentricity </span><span class="si">{eccentricity}</span><span class="s2"> metallicity </span><span class="si">{metallicity}</span><span class="s2"> </span><span class="se">\</span> <span class="s2"> max_evolution_time </span><span class="si">{max_evolution_time}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> <span class="n">m1</span><span class="o">=</span><span class="n">m1</span><span class="p">,</span> <span class="n">m2</span><span class="o">=</span><span class="n">m2</span><span class="p">,</span> <span class="n">separation</span><span class="o">=</span><span class="n">separation</span><span class="p">,</span> <span class="n">orbital_period</span><span class="o">=</span><span class="n">orbital_period</span><span class="p">,</span> <span class="n">eccentricity</span><span class="o">=</span><span class="n">eccentricity</span><span class="p">,</span> <span class="n">metallicity</span><span class="o">=</span><span class="n">metallicity</span><span class="p">,</span> <span class="n">max_evolution_time</span><span class="o">=</span><span class="n">max_evolution_time</span><span class="p">,</span> <span class="p">)</span> <span class="n">output</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="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">output</span><span class="p">)</span> <span class="n">run_example_binary</span><span class="p">()</span> <span class="k">def</span> <span class="nf">run_example_binary_with_run_system</span><span class="p">():</span> <span class="sd">"""</span> <span class="sd"> This function serves as an example on the function run_system and parse_output.</span> <span class="sd"> There is more functionality with this method and several tasks are done behind the scene.</span> <span class="sd"> Requires pandas, numpy to run.</span> <span class="sd"> run_system: mostly just makes passing arguments to the function easier. It also loads all the necessary defaults in the background</span> <span class="sd"> parse_output: Takes the raw output of binary_c and selects those lines that start with the given header.</span> <span class="sd"> Note, if you dont use the custom_logging functionality binary_c should be configured to have output that starts with that given header</span> <span class="sd"> The parsing of the output only works correctly if either all of the values are described inline like `mass=<number>' or none of them are.</span> <span class="sd"> """</span> <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="c1"># Run system. all arguments can be given as optional arguments.</span> <span class="n">output</span> <span class="o">=</span> <span class="n">run_system</span><span class="p">(</span><span class="n">M_1</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">M_2</span><span class="o">=</span><span class="mi">20</span><span class="p">,</span> <span class="n">separation</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">orbital_period</span><span class="o">=</span><span class="mi">100000000000</span><span class="p">)</span> <span class="c1"># print(output)</span> <span class="c1"># Catch results that start with a given header. (Mind that binary_c has to be configured to print them if your not using a custom logging function)</span> <span class="n">result_example_header_1</span> <span class="o">=</span> <span class="n">example_parse_output</span><span class="p">(</span> <span class="n">output</span><span class="p">,</span> <span class="n">selected_header</span><span class="o">=</span><span class="s2">"example_header_1"</span> <span class="p">)</span> <span class="n">result_example_header_2</span> <span class="o">=</span> <span class="n">example_parse_output</span><span class="p">(</span> <span class="n">output</span><span class="p">,</span> <span class="n">selected_header</span><span class="o">=</span><span class="s2">"example_header_2"</span> <span class="p">)</span> <span class="c1"># print(result_example_header_1)</span> <span class="c1">#### Now do whatever you want with it:</span> <span class="c1"># Put it in numpy arrays</span> <span class="c1"># t_res = np.asarray(result_example_header['t'], dtype=np.float64, order='C')</span> <span class="c1"># m_res = np.asarray(result_example_header['mass'], dtype=np.float64, order='C')</span> <span class="c1"># Or put them into a pandas array</span> <span class="c1"># Cast the data into a dataframe.</span> <span class="c1"># This example automatically catches the column names because the binary_c output line is constructed as 'example_header_1 time=<number>..'</span> <span class="nb">print</span><span class="p">(</span><span class="n">result_example_header_1</span><span class="p">)</span> <span class="n">df</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">result_example_header_1</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">df</span><span class="p">)</span> <span class="c1"># This example has column headers which are numbered, but we can override that with custom headers.</span> <span class="n">df2</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">result_example_header_2</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span> <span class="n">df2</span><span class="o">.</span><span class="n">columns</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"time"</span><span class="p">,</span> <span class="s2">"mass_1"</span><span class="p">,</span> <span class="s2">"mass_2"</span><span class="p">,</span> <span class="s2">"st1"</span><span class="p">,</span> <span class="s2">"st2"</span><span class="p">,</span> <span class="s2">"sep"</span><span class="p">,</span> <span class="s2">"ecc"</span><span class="p">]</span> <span class="nb">print</span><span class="p">(</span><span class="n">df2</span><span class="p">)</span> <span class="c1"># print(df)</span> <span class="c1"># sliced_df = df[df.t < 1000] # Cut off late parts of evolution</span> <span class="c1"># print(sliced_df[["t","m1"]])</span> <span class="c1"># Some routine to plot.</span> <span class="c1"># run_example_binary_with_run_system()</span> <span class="k">def</span> <span class="nf">run_example_custom_logging_autogenerated</span><span class="p">():</span> <span class="sd">"""</span> <span class="sd"> This is an example function for the autogeneration of logging codes that binary_c uses.</span> <span class="sd"> """</span> <span class="c1"># generate logging lines</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="p">{</span> <span class="s2">"MY_STELLAR_DATA"</span><span class="p">:</span> <span class="p">[</span><span class="s2">"model.time"</span><span class="p">,</span> <span class="s2">"star[0].mass"</span><span class="p">],</span> <span class="s2">"my_sss2"</span><span class="p">:</span> <span class="p">[</span><span class="s2">"model.time"</span><span class="p">,</span> <span class="s2">"star[1].mass"</span><span class="p">],</span> <span class="p">}</span> <span class="p">)</span> <span class="c1"># Generate 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="c1"># Generate library and get memaddr</span> <span class="n">func_memaddr</span><span class="p">,</span> <span class="n">shared_lib_filename</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="c1">#</span> <span class="n">m1</span> <span class="o">=</span> <span class="mf">15.0</span> <span class="c1"># Msun</span> <span class="n">m2</span> <span class="o">=</span> <span class="mf">14.0</span> <span class="c1"># Msun</span> <span class="n">separation</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># 0 = ignored, use period</span> <span class="n">orbital_period</span> <span class="o">=</span> <span class="mf">4530.0</span> <span class="c1"># days</span> <span class="n">eccentricity</span> <span class="o">=</span> <span class="mf">0.0</span> <span class="n">metallicity</span> <span class="o">=</span> <span class="mf">0.02</span> <span class="n">max_evolution_time</span> <span class="o">=</span> <span class="mi">15000</span> <span class="n">argstring</span> <span class="o">=</span> <span class="s2">"binary_c M_1 </span><span class="si">{0:g}</span><span class="s2"> M_2 </span><span class="si">{1:g}</span><span class="s2"> separation </span><span class="si">{2:g}</span><span class="s2"> orbital_period </span><span class="si">{3:g}</span><span class="s2"> eccentricity </span><span class="si">{4:g}</span><span class="s2"> metallicity </span><span class="si">{5:g}</span><span class="s2"> max_evolution_time </span><span class="si">{6:g}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> <span class="n">m1</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">separation</span><span class="p">,</span> <span class="n">orbital_period</span><span class="p">,</span> <span class="n">eccentricity</span><span class="p">,</span> <span class="n">metallicity</span><span class="p">,</span> <span class="n">max_evolution_time</span><span class="p">,</span> <span class="p">)</span> <span class="n">output</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="p">,</span> <span class="n">custom_logging_func_memaddr</span><span class="o">=</span><span class="n">func_memaddr</span> <span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">output</span><span class="p">)</span> <span class="c1"># run_example_custom_logging_autogenerated()</span> <span class="k">def</span> <span class="nf">run_example_binary_with_custom_logging</span><span class="p">():</span> <span class="sd">"""</span> <span class="sd"> Function that will use a automatically generated piece of logging code. Compile it, load it</span> <span class="sd"> into memory and run a binary system. See run_system on how several things are done in the background here.</span> <span class="sd"> """</span> <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> <span class="c1"># generate logging lines. Here you can choose whatever you want to have logged, and with what header</span> <span class="c1"># this generates working print statements</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="p">{</span> <span class="s2">"MY_STELLAR_DATA"</span><span class="p">:</span> <span class="p">[</span><span class="s2">"model.time"</span><span class="p">,</span> <span class="s2">"star[0].mass"</span><span class="p">],</span> <span class="p">}</span> <span class="p">)</span> <span class="c1"># OR</span> <span class="c1"># You can also decide to `write` your own logging_line, which allows you to write a more complex logging statement with conditionals.</span> <span class="n">logging_line</span> <span class="o">=</span> <span class="s1">'Printf("MY_STELLAR_DATA time=</span><span class="si">%g</span><span class="s1"> mass=</span><span class="si">%g</span><span class="se">\\</span><span class="s1">n", stardata->model.time, stardata->star[0].mass)'</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="c1"># Run system. all arguments can be given as optional arguments. the custom_logging_code is one of them and will be processed automatically.</span> <span class="n">output</span> <span class="o">=</span> <span class="n">run_system</span><span class="p">(</span> <span class="n">M_1</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">metallicity</span><span class="o">=</span><span class="mf">0.002</span><span class="p">,</span> <span class="n">M_2</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span> <span class="n">separation</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">orbital_period</span><span class="o">=</span><span class="mi">100000000000</span><span class="p">,</span> <span class="n">custom_logging_code</span><span class="o">=</span><span class="n">custom_logging_code</span><span class="p">,</span> <span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">output</span><span class="p">)</span> <span class="c1"># Catch results that start with a given header. (Mind that binary_c has to be configured to print them if your not using a custom logging function)</span> <span class="c1"># DOESNT WORK YET if you have the line autogenerated.</span> <span class="n">result_example_header</span> <span class="o">=</span> <span class="n">parse_output</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="s2">"MY_STELLAR_DATA"</span><span class="p">)</span> <span class="c1"># Cast the data into a dataframe.</span> <span class="n">df</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">result_example_header</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span> <span class="c1"># Do whatever you like with the dataframe.</span> <span class="nb">print</span><span class="p">(</span><span class="n">df</span><span class="p">)</span> <span class="c1"># run_example_binary_with_custom_logging()</span> <span class="k">def</span> <span class="nf">run_example_binary_with_writing_logfile</span><span class="p">():</span> <span class="sd">"""</span> <span class="sd"> Same as above but when giving the log_filename argument the log filename will be written</span> <span class="sd"> """</span> <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</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">tempfile</span> <span class="c1"># Run system. all arguments can be given as optional arguments.</span> <span class="n">output</span> <span class="o">=</span> <span class="n">run_system</span><span class="p">(</span> <span class="n">M_1</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">M_2</span><span class="o">=</span><span class="mi">20</span><span class="p">,</span> <span class="n">separation</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">orbital_period</span><span class="o">=</span><span class="mi">100000000000</span><span class="p">,</span> <span class="n">log_filename</span><span class="o">=</span><span class="n">tempfile</span><span class="o">.</span><span class="n">gettempdir</span><span class="p">()</span> <span class="o">+</span> <span class="s2">"/test_log.txt"</span><span class="p">,</span> <span class="p">)</span> <span class="n">run_example_binary_with_writing_logfile</span><span class="p">()</span> </pre></div> </td></tr></table></div> </div> </div> </div> <footer> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> <a href="population_example.html" class="btn btn-neutral float-right" title="Example of population script" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> <a href="examples.html" class="btn btn-neutral float-left" title="Examples" 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: development_version/2.1.7 git revision 1b4c6f9cc7be3ad0a2d3770500d30d610bf35d8f url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c-python/-/tree/development_version/2.1.7">git url</a>. <br><br> Using binary_c with bit branch branch_david: git revision: "6044:20210720:d1ed5b6c1" url: <a href="https://gitlab.eps.surrey.ac.uk/ri0005/binary_c/-/tree/branch_david">git url</a>. </footer> </div> </div> </section> </div> <script type="text/javascript"> jQuery(function () { SphinxRtdTheme.Navigation.enable(true); }); </script> </body> </html>