Skip to content

Commit

Permalink
deploy: 13ce0eb
Browse files Browse the repository at this point in the history
  • Loading branch information
simongravelle committed Aug 28, 2024
1 parent cf25153 commit bf786ee
Show file tree
Hide file tree
Showing 3 changed files with 124 additions and 12 deletions.
79 changes: 73 additions & 6 deletions _sources/chapters/chapter5.rst.txt
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ All quantities are re-dimensionalized before getting outputed.
import logging
# Function to set up the logger
def setup_logger(folder_name):
def setup_logger(folder_name, overwrite=False):
# Create a custom logger
logger = logging.getLogger('simulation_logger')
logger.setLevel(logging.INFO)
Expand All @@ -59,7 +59,10 @@ All quantities are re-dimensionalized before getting outputed.
# Create handlers for console and file
console_handler = logging.StreamHandler() # To log to the terminal
log_file_path = os.path.join(folder_name, 'simulation.log')
file_handler = logging.FileHandler(log_file_path) # To log to a file
# Use 'w' mode to overwrite the log file if overwrite is True, else use 'a' mode to append
file_mode = 'w' if overwrite else 'a'
file_handler = logging.FileHandler(log_file_path, mode=file_mode) # To log to a file
# Create formatters and add them to the handlers
formatter = logging.Formatter('%(message)s')
Expand All @@ -74,8 +77,8 @@ All quantities are re-dimensionalized before getting outputed.
def log_simulation_data(code):
# Setup the logger with the folder name
logger = setup_logger(code.data_folder)
# Setup the logger with the folder name, overwriting the log if code.step is 0
logger = setup_logger(code.data_folder, overwrite=(code.step == 0))
# Logging the simulation data
if code.thermo_period is not None:
Expand Down Expand Up @@ -227,7 +230,7 @@ files were indeed created without the *Outputs/* folder:
.. label:: end_test_5a_class

I addition to the files getting created, information must be printed in the terminal
during the similation:
during the simulation:

.. code-block:: bw
Expand All @@ -236,4 +239,68 @@ during the similation:
25 -1.08 1.81
50 -1.11 1.42
75 -1.22 3.77
100 -2.10 1.28
100 -2.10 1.28
The data from the *simulation.log* can be used to generate plots using softwares
line XmGrace, GnuPlot, or Python/Pyplot. For the later, one can use a simple data
reader to import the data from *Outputs/simulation.log* into Python. Copy the
following lines in a file named *reader.py*:

.. label:: start_reader_class

.. code-block:: python
import csv
def import_data(file_path):
"""
Imports a data file with a variable number of columns into a list
of numerical arrays. The first line (header) is read as a string.
Parameters:
- file_path (str): Path to the data file.
Returns:
- header (str): The header line as a string.
- data (list of lists): List where each sublist contains the numeric values of a row.
"""
data = []
header = ""
with open(file_path, mode='r') as file:
# Read the header as a string
header = file.readline().strip()
# Use csv.reader to process the remaining lines
reader = csv.reader(file, delimiter=' ')
for row in reader:
# Filter out empty fields resulting from multiple spaces
filtered_row = [float(value) for value in row if value]
data.append(filtered_row)
return header, data
.. label:: end_reader_class

The *import_data* function from *reader.py* can simply be used as follows:

.. label:: start_test_5b_class

from reader import import_data

file_path = "Outputs/simulation.log"
header, data = import_data(file_path)

print(header)
for row in data:
print(row)

.. label:: end_test_5b_class

Which must return:

.. code-block:: bw
step Epot MaxF
[0.0, 9.48, 1049.12]
[25.0, -2.12, 1.22]
[50.0, -2.19, 2.85]
[75.0, -2.64, 0.99]
[100.0, -2.64, 0.51]
55 changes: 50 additions & 5 deletions chapters/chapter5.html
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ <h2>Create logger<a class="headerlink" href="#create-logger" title="Link to this
<span class="kn">import</span> <span class="nn">logging</span>

<span class="c1"># Function to set up the logger</span>
<span class="k">def</span> <span class="nf">setup_logger</span><span class="p">(</span><span class="n">folder_name</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">setup_logger</span><span class="p">(</span><span class="n">folder_name</span><span class="p">,</span> <span class="n">overwrite</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="c1"># Create a custom logger</span>
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;simulation_logger&#39;</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">INFO</span><span class="p">)</span>
Expand All @@ -303,7 +303,10 @@ <h2>Create logger<a class="headerlink" href="#create-logger" title="Link to this
<span class="c1"># Create handlers for console and file</span>
<span class="n">console_handler</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">StreamHandler</span><span class="p">()</span> <span class="c1"># To log to the terminal</span>
<span class="n">log_file_path</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">folder_name</span><span class="p">,</span> <span class="s1">&#39;simulation.log&#39;</span><span class="p">)</span>
<span class="n">file_handler</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">FileHandler</span><span class="p">(</span><span class="n">log_file_path</span><span class="p">)</span> <span class="c1"># To log to a file</span>

<span class="c1"># Use &#39;w&#39; mode to overwrite the log file if overwrite is True, else use &#39;a&#39; mode to append</span>
<span class="n">file_mode</span> <span class="o">=</span> <span class="s1">&#39;w&#39;</span> <span class="k">if</span> <span class="n">overwrite</span> <span class="k">else</span> <span class="s1">&#39;a&#39;</span>
<span class="n">file_handler</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">FileHandler</span><span class="p">(</span><span class="n">log_file_path</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="n">file_mode</span><span class="p">)</span> <span class="c1"># To log to a file</span>

<span class="c1"># Create formatters and add them to the handlers</span>
<span class="n">formatter</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">Formatter</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%(message)s</span><span class="s1">&#39;</span><span class="p">)</span>
Expand All @@ -318,8 +321,8 @@ <h2>Create logger<a class="headerlink" href="#create-logger" title="Link to this

<span class="k">def</span> <span class="nf">log_simulation_data</span><span class="p">(</span><span class="n">code</span><span class="p">):</span>

<span class="c1"># Setup the logger with the folder name</span>
<span class="n">logger</span> <span class="o">=</span> <span class="n">setup_logger</span><span class="p">(</span><span class="n">code</span><span class="o">.</span><span class="n">data_folder</span><span class="p">)</span>
<span class="c1"># Setup the logger with the folder name, overwriting the log if code.step is 0</span>
<span class="n">logger</span> <span class="o">=</span> <span class="n">setup_logger</span><span class="p">(</span><span class="n">code</span><span class="o">.</span><span class="n">data_folder</span><span class="p">,</span> <span class="n">overwrite</span><span class="o">=</span><span class="p">(</span><span class="n">code</span><span class="o">.</span><span class="n">step</span> <span class="o">==</span> <span class="mi">0</span><span class="p">))</span>

<span class="c1"># Logging the simulation data</span>
<span class="k">if</span> <span class="n">code</span><span class="o">.</span><span class="n">thermo_period</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
Expand Down Expand Up @@ -446,7 +449,7 @@ <h2>Test the code<a class="headerlink" href="#test-the-code" title="Link to this
</pre></div>
</div>
<p>I addition to the files getting created, information must be printed in the terminal
during the similation:</p>
during the simulation:</p>
<div class="highlight-bw notranslate"><div class="highlight"><pre><span></span>step Epot MaxF
0 -0.17 1.93
25 -1.08 1.81
Expand All @@ -455,6 +458,48 @@ <h2>Test the code<a class="headerlink" href="#test-the-code" title="Link to this
100 -2.10 1.28
</pre></div>
</div>
<p>The data from the <em>simulation.log</em> can be used to generate plots using softwares
line XmGrace, GnuPlot, or Python/Pyplot. For the later, one can use a simple data
reader to import the data from <em>Outputs/simulation.log</em> into Python. Copy the
following lines in a file named <em>reader.py</em>:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">csv</span>

<span class="k">def</span> <span class="nf">import_data</span><span class="p">(</span><span class="n">file_path</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Imports a data file with a variable number of columns into a list</span>
<span class="sd"> of numerical arrays. The first line (header) is read as a string.</span>

<span class="sd"> Parameters:</span>
<span class="sd"> - file_path (str): Path to the data file.</span>

<span class="sd"> Returns:</span>
<span class="sd"> - header (str): The header line as a string.</span>
<span class="sd"> - data (list of lists): List where each sublist contains the numeric values of a row.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">data</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">header</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
<span class="c1"># Read the header as a string</span>
<span class="n">header</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="c1"># Use csv.reader to process the remaining lines</span>
<span class="n">reader</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">reader</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="n">delimiter</span><span class="o">=</span><span class="s1">&#39; &#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">reader</span><span class="p">:</span>
<span class="c1"># Filter out empty fields resulting from multiple spaces</span>
<span class="n">filtered_row</span> <span class="o">=</span> <span class="p">[</span><span class="nb">float</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">row</span> <span class="k">if</span> <span class="n">value</span><span class="p">]</span>
<span class="n">data</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">filtered_row</span><span class="p">)</span>
<span class="k">return</span> <span class="n">header</span><span class="p">,</span> <span class="n">data</span>
</pre></div>
</div>
<p>The <em>import_data</em> function from <em>reader.py</em> can simply be used as follows:</p>
<p>Which must return:</p>
<div class="highlight-bw notranslate"><div class="highlight"><pre><span></span>step Epot MaxF
[0.0, 9.48, 1049.12]
[25.0, -2.12, 1.22]
[50.0, -2.19, 2.85]
[75.0, -2.64, 0.99]
[100.0, -2.64, 0.51]
</pre></div>
</div>
</section>
</section>

Expand Down
Loading

0 comments on commit bf786ee

Please sign in to comment.