Files
GridFire/docs/html/solver_8cpp_source.html

667 lines
127 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.13.2"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>GridFire: src/network/lib/solver/solver.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
<link href="doxygen-awesome-sidebar-only.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">GridFire<span id="projectnumber">&#160;0.0.1a</span>
</div>
<div id="projectbrief">General Purpose Nuclear Network</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.13.2 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() { codefold.init(0); });
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function(){initNavTree('solver_8cpp_source.html',''); initResizable(true); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">solver.cpp</div></div>
</div><!--header-->
<div class="contents">
<a href="solver_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="preprocessor">#include &quot;<a class="code" href="solver_8h.html">gridfire/solver/solver.h</a>&quot;</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="preprocessor">#include &quot;<a class="code" href="engine__graph_8h.html">gridfire/engine/engine_graph.h</a>&quot;</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="preprocessor">#include &quot;<a class="code" href="network_8h.html">gridfire/network.h</a>&quot;</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span> </div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="preprocessor">#include &quot;<a class="code" href="logging_8h.html">gridfire/utils/logging.h</a>&quot;</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span> </div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="preprocessor">#include &quot;fourdst/composition/atomicSpecies.h&quot;</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="preprocessor">#include &quot;fourdst/composition/composition.h&quot;</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="preprocessor">#include &quot;fourdst/config/config.h&quot;</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span> </div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="preprocessor">#include &quot;Eigen/Dense&quot;</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#include &quot;unsupported/Eigen/NonLinearOptimization&quot;</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> </div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include &lt;boost/numeric/odeint.hpp&gt;</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;unordered_map&gt;</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#include &lt;string&gt;</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include &lt;stdexcept&gt;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#include &lt;iomanip&gt;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> </div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#include &quot;quill/LogMacros.h&quot;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> </div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacegridfire_1_1solver.html">gridfire::solver</a> {</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
<div class="foldopen" id="foldopen00026" data-start="{" data-end="}">
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"><a class="line" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a53b5496db7fed6f345dca39656bf9c0e"> 26</a></span> <a class="code hl_struct" href="structgridfire_1_1_net_out.html">NetOut</a> <a class="code hl_function" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a53b5496db7fed6f345dca39656bf9c0e">QSENetworkSolver::evaluate</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structgridfire_1_1_net_in.html">NetIn</a> &amp;netIn) {</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> <span class="comment">// --- Use the policy to decide whether to update the view ---</span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a35f1f6ede393f15c8bb8862f3f1c3b07">shouldUpdateView</a>(netIn)) {</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> LOG_DEBUG(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;Solver update policy triggered, network view updating...&quot;</span>);</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> <a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.update(netIn);</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> LOG_DEBUG(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;Network view updated!&quot;</span>);</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> </div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a3c9d46c8f5c519854cd65309a588772f">m_lastSeenConditions</a> = netIn;</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#ab07e68fd418ab058f890502d191b3f18">m_isViewInitialized</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> }</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.generateJacobianMatrix(netIn.<a class="code hl_function" href="structgridfire_1_1_net_in.html#a47781e8d5503e3b4f12d669e2cbcfb65">MolarAbundance</a>(), netIn.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a5be0f5195a5cd1dd177b9fc5ab83a7be">temperature</a> / 1e9, netIn.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a06f0dff9f8927b7cf2da3004c8fa1577">density</a>);</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> <span class="keyword">using </span>state_type = boost::numeric::ublas::vector&lt;double&gt;;</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> <span class="keyword">using namespace </span>boost::numeric::odeint;</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> </div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> <a class="code hl_struct" href="structgridfire_1_1_net_out.html">NetOut</a> postIgnition = <a class="code hl_function" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#abaa567001df0007b714f474febae408b">initializeNetworkWithShortIgnition</a>(netIn);</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> </div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> <span class="keyword">constexpr</span> <span class="keywordtype">double</span> abundance_floor = 1.0e-30;</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> std::vector&lt;double&gt;Y_sanitized_initial;</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> Y_sanitized_initial.reserve(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.getNetworkSpecies().size());</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> </div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> LOG_DEBUG(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;Sanitizing initial abundances with a floor of {:0.3E}...&quot;</span>, abundance_floor);</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; species : <a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.getNetworkSpecies()) {</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> <span class="keywordtype">double</span> molar_abundance = 0.0;</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> <span class="keywordflow">if</span> (postIgnition.<a class="code hl_variable" href="structgridfire_1_1_net_out.html#a073529511ae0e52f868b47cce0e8ac0a">composition</a>.contains(species)) {</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> molar_abundance = postIgnition.<a class="code hl_variable" href="structgridfire_1_1_net_out.html#a073529511ae0e52f868b47cce0e8ac0a">composition</a>.getMolarAbundance(std::string(species.name()));</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> }</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> </div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> <span class="keywordflow">if</span> (molar_abundance &lt; abundance_floor) {</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> molar_abundance = abundance_floor;</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> }</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> Y_sanitized_initial.push_back(molar_abundance);</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> }</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <span class="keyword">const</span> <span class="keywordtype">double</span> T9 = netIn.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a5be0f5195a5cd1dd177b9fc5ab83a7be">temperature</a> / 1e9; <span class="comment">// Convert temperature from Kelvin to T9 (T9 = T / 1e9)</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <span class="keyword">const</span> <span class="keywordtype">double</span> rho = netIn.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a06f0dff9f8927b7cf2da3004c8fa1577">density</a>; <span class="comment">// Density in g/cm^3</span></div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> </div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="keyword">const</span> <span class="keyword">auto</span> indices = <a class="code hl_function" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a5d81ee5bfcfd5e77fe52201ba9e63719">packSpeciesTypeIndexVectors</a>(Y_sanitized_initial, T9, rho);</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> Eigen::VectorXd Y_QSE;</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> Y_QSE = <a class="code hl_function" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a00d112f6087f6e3a93f4d40a519308d2">calculateSteadyStateAbundances</a>(Y_sanitized_initial, T9, rho, indices);</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> LOG_DEBUG(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;QSE Abundances: {}&quot;</span>, [*<span class="keyword">this</span>](<span class="keyword">const</span> <a class="code hl_struct" href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html">dynamicQSESpeciesIndices</a>&amp; indices, <span class="keyword">const</span> Eigen::VectorXd&amp; Y_QSE) -&gt; std::string {</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> std::stringstream ss;</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> ss &lt;&lt; std::scientific &lt;&lt; std::setprecision(5);</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; indices.<a class="code hl_variable" href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html#a7d4ba82d9e60a4914938ebebecaab4a2">QSESpeciesIndices</a>.size(); ++i) {</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> ss &lt;&lt; std::string(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.getNetworkSpecies()[indices.<a class="code hl_variable" href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html#a7d4ba82d9e60a4914938ebebecaab4a2">QSESpeciesIndices</a>[i]].name()) + <span class="stringliteral">&quot;: &quot;</span>;</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> ss &lt;&lt; Y_QSE(i);</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="keywordflow">if</span> (i &lt; indices.<a class="code hl_variable" href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html#a7d4ba82d9e60a4914938ebebecaab4a2">QSESpeciesIndices</a>.size() - 2) {</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> ss &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>;</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (i == indices.<a class="code hl_variable" href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html#a7d4ba82d9e60a4914938ebebecaab4a2">QSESpeciesIndices</a>.size() - 2) {</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> ss &lt;&lt; <span class="stringliteral">&quot;, and &quot;</span>;</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> }</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> </div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> }</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keywordflow">return</span> ss.str();</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> }(indices, Y_QSE));</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error&amp; e) {</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> LOG_ERROR(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;Failed to calculate steady state abundances. Aborting QSE evaluation.&quot;</span>);</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>-&gt;flush_log();</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;Failed to calculate steady state abundances: &quot;</span> + std::string(e.what()));</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> }</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> </div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> state_type YDynamic_ublas(indices.dynamicSpeciesIndices.size() + 1);</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; indices.dynamicSpeciesIndices.size(); ++i) {</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> YDynamic_ublas(i) = Y_sanitized_initial[indices.dynamicSpeciesIndices[i]];</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> }</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> YDynamic_ublas(indices.dynamicSpeciesIndices.size()) = 0.0; <span class="comment">// Placeholder for specific energy rate</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> </div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <span class="keyword">const</span> <a class="code hl_struct" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html">RHSFunctor</a> rhs_functor(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>, indices.dynamicSpeciesIndices, indices.QSESpeciesIndices, Y_QSE, T9, rho);</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <span class="keyword">const</span> <span class="keyword">auto</span> stepper = make_controlled&lt;runge_kutta_dopri5&lt;state_type&gt;&gt;(1.0e-8, 1.0e-8);</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> </div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="keywordtype">size_t</span> stepCount = integrate_adaptive(</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> stepper,</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> rhs_functor,</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> YDynamic_ublas,</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> 0.0, <span class="comment">// Start time</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> netIn.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a0a8d820cfeaa92ee31f253795c57e0d1">tMax</a>,</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> netIn.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a4e556f7bb18f46654b3445476734076a">dt0</a></div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> );</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> </div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> std::vector&lt;double&gt; YFinal = Y_sanitized_initial;</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt;indices.dynamicSpeciesIndices.size(); ++i) {</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> YFinal[indices.dynamicSpeciesIndices[i]] = YDynamic_ublas(i);</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> }</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; indices.QSESpeciesIndices.size(); ++i) {</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> YFinal[indices.QSESpeciesIndices[i]] = Y_QSE(i);</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> }</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> </div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> <span class="keyword">const</span> <span class="keywordtype">double</span> finalSpecificEnergyRate = YDynamic_ublas(indices.dynamicSpeciesIndices.size());</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> </div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <span class="comment">// --- Marshal output variables ---</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> std::vector&lt;std::string&gt; speciesNames(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.getNetworkSpecies().size());</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> std::vector&lt;double&gt; finalMassFractions(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.getNetworkSpecies().size());</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> <span class="keywordtype">double</span> massFractionSum = 0.0;</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> </div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; speciesNames.size(); ++i) {</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> <span class="keyword">const</span> <span class="keyword">auto</span>&amp; species = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.getNetworkSpecies()[i];</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> speciesNames[i] = species.name();</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> finalMassFractions[i] = YFinal[i] * species.mass(); <span class="comment">// Convert from molar abundance to mass fraction</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> massFractionSum += finalMassFractions[i];</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> }</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; mf : finalMassFractions) {</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> mf /= massFractionSum; <span class="comment">// Normalize to get mass fractions</span></div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> }</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> </div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> fourdst::composition::Composition outputComposition(speciesNames, finalMassFractions);</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> <a class="code hl_struct" href="structgridfire_1_1_net_out.html">NetOut</a> netOut;</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> netOut.<a class="code hl_variable" href="structgridfire_1_1_net_out.html#a073529511ae0e52f868b47cce0e8ac0a">composition</a> = outputComposition;</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> netOut.<a class="code hl_variable" href="structgridfire_1_1_net_out.html#a43d5a861708992c949f616aa2a035ec6">energy</a> = finalSpecificEnergyRate; <span class="comment">// Specific energy rate</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> netOut.<a class="code hl_variable" href="structgridfire_1_1_net_out.html#a51c16703132cf739ec2fd89eae7badd6">num_steps</a> = stepCount;</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> <span class="keywordflow">return</span> netOut;</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> }</div>
</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> </div>
<div class="foldopen" id="foldopen00137" data-start="{" data-end="}">
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"><a class="line" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a5d81ee5bfcfd5e77fe52201ba9e63719"> 137</a></span> <a class="code hl_struct" href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html">dynamicQSESpeciesIndices</a> <a class="code hl_function" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a5d81ee5bfcfd5e77fe52201ba9e63719">QSENetworkSolver::packSpeciesTypeIndexVectors</a>(</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> <span class="keyword">const</span> std::vector&lt;double&gt;&amp; Y,</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="keyword">const</span> <span class="keywordtype">double</span> T9,</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <span class="keyword">const</span> <span class="keywordtype">double</span> rho</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> )<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="keyword">constexpr</span> <span class="keywordtype">double</span> timescaleCutoff = 1.0e-5;</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <span class="keyword">constexpr</span> <span class="keywordtype">double</span> abundanceCutoff = 1.0e-15;</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> </div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> LOG_INFO(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;Partitioning species using T9={:0.2f} and ρ={:0.2e}&quot;</span>, T9, rho);</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> LOG_INFO(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;Timescale Cutoff: {:.1e} s, Abundance Cutoff: {:.1e}&quot;</span>, timescaleCutoff, abundanceCutoff);</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> </div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> std::vector&lt;size_t&gt;dynamicSpeciesIndices; <span class="comment">// Slow species that are not in QSE</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> std::vector&lt;size_t&gt;QSESpeciesIndices; <span class="comment">// Fast species that are in QSE</span></div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> </div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> std::unordered_map&lt;fourdst::atomic::Species, double&gt; speciesTimescale = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.getSpeciesTimescales(Y, T9, rho);</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> </div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; <a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.getNetworkSpecies().size(); ++i) {</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <span class="keyword">const</span> <span class="keyword">auto</span>&amp; species = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.getNetworkSpecies()[i];</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="keyword">const</span> <span class="keywordtype">double</span> network_timescale = speciesTimescale.at(species);</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keyword">const</span> <span class="keywordtype">double</span> abundance = Y[i];</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> </div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <span class="keywordtype">double</span> decay_timescale = std::numeric_limits&lt;double&gt;::infinity();</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> <span class="keyword">const</span> <span class="keywordtype">double</span> half_life = species.halfLife();</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> <span class="keywordflow">if</span> (half_life &gt; 0 &amp;&amp; !std::isinf(half_life)) {</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> <span class="keyword">constexpr</span> <span class="keywordtype">double</span> LN2 = 0.69314718056;</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> decay_timescale = half_life / LN2;</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> }</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> </div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> <span class="keyword">const</span> <span class="keywordtype">double</span> final_timescale = std::min(network_timescale, decay_timescale);</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> </div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> <span class="keywordflow">if</span> (std::isinf(final_timescale) || abundance &lt; abundanceCutoff || final_timescale &lt;= timescaleCutoff) {</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> QSESpeciesIndices.push_back(i);</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> dynamicSpeciesIndices.push_back(i);</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> }</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> }</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> LOG_INFO(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;Partitioning complete. Dynamical species: {}, QSE species: {}.&quot;</span>, dynamicSpeciesIndices.size(), QSESpeciesIndices.size());</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> LOG_INFO(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;Dynamic species: {}&quot;</span>, [dynamicSpeciesIndices](<span class="keyword">const</span> <a class="code hl_class" href="classgridfire_1_1_dynamic_engine.html">DynamicEngine</a>&amp; engine_wrapper) -&gt; std::string {</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> std::string result;</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> <span class="keywordtype">int</span> count = 0;</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; i : dynamicSpeciesIndices) {</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> result += std::string(engine_wrapper.<a class="code hl_function" href="classgridfire_1_1_engine.html#a020e1b493d6964cafdad08fde697ceb3">getNetworkSpecies</a>()[i].name());</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> <span class="keywordflow">if</span> (count &lt; dynamicSpeciesIndices.size() - 2) {</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> result += <span class="stringliteral">&quot;, &quot;</span>;</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (count == dynamicSpeciesIndices.size() - 2) {</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> result += <span class="stringliteral">&quot; and &quot;</span>;</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> }</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> count++;</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> }</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> }(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>));</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> LOG_INFO(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;QSE species: {}&quot;</span>, [QSESpeciesIndices](<span class="keyword">const</span> <a class="code hl_class" href="classgridfire_1_1_dynamic_engine.html">DynamicEngine</a>&amp; engine_wrapper) -&gt; std::string {</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> std::string result;</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> <span class="keywordtype">int</span> count = 0;</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; i : QSESpeciesIndices) {</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> result += std::string(engine_wrapper.<a class="code hl_function" href="classgridfire_1_1_engine.html#a020e1b493d6964cafdad08fde697ceb3">getNetworkSpecies</a>()[i].name());</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> <span class="keywordflow">if</span> (count &lt; QSESpeciesIndices.size() - 2) {</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> result += <span class="stringliteral">&quot;, &quot;</span>;</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (count == QSESpeciesIndices.size() - 2) {</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> result += <span class="stringliteral">&quot; and &quot;</span>;</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> }</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> count++;</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> }</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> }(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>));</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="keywordflow">return</span> {dynamicSpeciesIndices, QSESpeciesIndices};</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> }</div>
</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> </div>
<div class="foldopen" id="foldopen00205" data-start="{" data-end="}">
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"><a class="line" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a00d112f6087f6e3a93f4d40a519308d2"> 205</a></span> Eigen::VectorXd <a class="code hl_function" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a00d112f6087f6e3a93f4d40a519308d2">QSENetworkSolver::calculateSteadyStateAbundances</a>(</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> <span class="keyword">const</span> std::vector&lt;double&gt; &amp;Y,</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> <span class="keyword">const</span> <span class="keywordtype">double</span> T9,</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> <span class="keyword">const</span> <span class="keywordtype">double</span> rho,</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <span class="keyword">const</span> <a class="code hl_struct" href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html">dynamicQSESpeciesIndices</a> &amp;indices</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> )<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> LOG_TRACE_L1(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;Calculating steady state abundances for QSE species...&quot;</span>);</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> </div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> <span class="keywordflow">if</span> (indices.<a class="code hl_variable" href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html#a7d4ba82d9e60a4914938ebebecaab4a2">QSESpeciesIndices</a>.empty()) {</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> LOG_DEBUG(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;No QSE species to solve for.&quot;</span>);</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> <span class="keywordflow">return</span> Eigen::VectorXd(0);</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> }</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> <span class="comment">// Use the EigenFunctor with Eigen&#39;s nonlinear solver</span></div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> <a class="code hl_struct" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_eigen_functor.html">EigenFunctor&lt;double&gt;</a> functor(</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> <a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>,</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> Y,</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> indices.<a class="code hl_variable" href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html#ac6e0419abdd3c78b32e34c16c0543157">dynamicSpeciesIndices</a>,</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> indices.<a class="code hl_variable" href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html#a7d4ba82d9e60a4914938ebebecaab4a2">QSESpeciesIndices</a>,</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> T9,</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> rho</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> );</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> </div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> Eigen::VectorXd v_qse_log_initial(indices.<a class="code hl_variable" href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html#a7d4ba82d9e60a4914938ebebecaab4a2">QSESpeciesIndices</a>.size());</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; indices.<a class="code hl_variable" href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html#a7d4ba82d9e60a4914938ebebecaab4a2">QSESpeciesIndices</a>.size(); ++i) {</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> v_qse_log_initial(i) = std::log(std::max(Y[indices.<a class="code hl_variable" href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html#a7d4ba82d9e60a4914938ebebecaab4a2">QSESpeciesIndices</a>[i]], 1e-99));</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> }</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> </div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> <span class="keyword">const</span> <span class="keyword">static</span> std::unordered_map&lt;Eigen::LevenbergMarquardtSpace::Status, const char*&gt; statusMessages = {</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> {Eigen::LevenbergMarquardtSpace::NotStarted, <span class="stringliteral">&quot;Not started&quot;</span>},</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> {Eigen::LevenbergMarquardtSpace::Running, <span class="stringliteral">&quot;Running&quot;</span>},</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> {Eigen::LevenbergMarquardtSpace::ImproperInputParameters, <span class="stringliteral">&quot;Improper input parameters&quot;</span>},</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> {Eigen::LevenbergMarquardtSpace::RelativeReductionTooSmall, <span class="stringliteral">&quot;Relative reduction too small&quot;</span>},</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> {Eigen::LevenbergMarquardtSpace::RelativeErrorTooSmall, <span class="stringliteral">&quot;Relative error too small&quot;</span>},</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> {Eigen::LevenbergMarquardtSpace::RelativeErrorAndReductionTooSmall, <span class="stringliteral">&quot;Relative error and reduction too small&quot;</span>},</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> {Eigen::LevenbergMarquardtSpace::CosinusTooSmall, <span class="stringliteral">&quot;Cosine too small&quot;</span>},</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> {Eigen::LevenbergMarquardtSpace::TooManyFunctionEvaluation, <span class="stringliteral">&quot;Too many function evaluations&quot;</span>},</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> {Eigen::LevenbergMarquardtSpace::FtolTooSmall, <span class="stringliteral">&quot;Function tolerance too small&quot;</span>},</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> {Eigen::LevenbergMarquardtSpace::XtolTooSmall, <span class="stringliteral">&quot;X tolerance too small&quot;</span>},</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> {Eigen::LevenbergMarquardtSpace::GtolTooSmall, <span class="stringliteral">&quot;Gradient tolerance too small&quot;</span>},</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> {Eigen::LevenbergMarquardtSpace::UserAsked, <span class="stringliteral">&quot;User asked to stop&quot;</span>}</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> };</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> </div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> Eigen::LevenbergMarquardt lm(functor);</div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> <span class="keyword">const</span> Eigen::LevenbergMarquardtSpace::Status info = lm.minimize(v_qse_log_initial);</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> </div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> <span class="keywordflow">if</span> (info &lt;= 0 || info &gt;= 4) {</div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> LOG_ERROR(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;QSE species minimization failed with status: {} ({})&quot;</span>,</div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(info), statusMessages.at(info));</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> <span class="keywordflow">throw</span> std::runtime_error(</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> <span class="stringliteral">&quot;QSE species minimization failed with status: &quot;</span> + std::to_string(<span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(info)) +</div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> <span class="stringliteral">&quot; (&quot;</span> + std::string(statusMessages.at(info)) + <span class="stringliteral">&quot;)&quot;</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> );</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> }</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> LOG_DEBUG(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;QSE species minimization completed successfully with status: {} ({})&quot;</span>,</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(info), statusMessages.at(info));</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> <span class="keywordflow">return</span> v_qse_log_initial.array().exp();</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> </div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> }</div>
</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> </div>
<div class="foldopen" id="foldopen00264" data-start="{" data-end="}">
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"><a class="line" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#abaa567001df0007b714f474febae408b"> 264</a></span> <a class="code hl_struct" href="structgridfire_1_1_net_out.html">NetOut</a> <a class="code hl_function" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#abaa567001df0007b714f474febae408b">QSENetworkSolver::initializeNetworkWithShortIgnition</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structgridfire_1_1_net_in.html">NetIn</a> &amp;netIn)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> <span class="keyword">const</span> <span class="keyword">auto</span> ignitionTemperature = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a7d19b6e50db34d38c81afec76bbedee1">m_config</a>.get&lt;<span class="keywordtype">double</span>&gt;(</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> <span class="stringliteral">&quot;gridfire:solver:QSE:ignition:temperature&quot;</span>,</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> 2e8</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> ); <span class="comment">// 0.2 GK</span></div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> <span class="keyword">const</span> <span class="keyword">auto</span> ignitionDensity = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a7d19b6e50db34d38c81afec76bbedee1">m_config</a>.get&lt;<span class="keywordtype">double</span>&gt;(</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> <span class="stringliteral">&quot;gridfire:solver:QSE:ignition:density&quot;</span>,</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> 1e6</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> ); <span class="comment">// 1e6 g/cm^3</span></div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> <span class="keyword">const</span> <span class="keyword">auto</span> ignitionTime = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a7d19b6e50db34d38c81afec76bbedee1">m_config</a>.get&lt;<span class="keywordtype">double</span>&gt;(</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> <span class="stringliteral">&quot;gridfire:solver:QSE:ignition:tMax&quot;</span>,</div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> 1e-7</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> ); <span class="comment">// 0.1 μs</span></div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> <span class="keyword">const</span> <span class="keyword">auto</span> ignitionStepSize = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a7d19b6e50db34d38c81afec76bbedee1">m_config</a>.get&lt;<span class="keywordtype">double</span>&gt;(</div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> <span class="stringliteral">&quot;gridfire:solver:QSE:ignition:dt0&quot;</span>,</div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> 1e-15</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> ); <span class="comment">// 1e-15 seconds</span></div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> </div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> LOG_INFO(</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>,</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> <span class="stringliteral">&quot;Igniting network with T={:&lt;5.3E}, ρ={:&lt;5.3E}, tMax={:&lt;5.3E}, dt0={:&lt;5.3E}...&quot;</span>,</div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> ignitionTemperature,</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> ignitionDensity,</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> ignitionTime,</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> ignitionStepSize</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> );</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> </div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> <a class="code hl_struct" href="structgridfire_1_1_net_in.html">NetIn</a> preIgnition = netIn;</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> preIgnition.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a5be0f5195a5cd1dd177b9fc5ab83a7be">temperature</a> = ignitionTemperature;</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> preIgnition.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a06f0dff9f8927b7cf2da3004c8fa1577">density</a> = ignitionDensity;</div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> preIgnition.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a0a8d820cfeaa92ee31f253795c57e0d1">tMax</a> = ignitionTime;</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> preIgnition.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a4e556f7bb18f46654b3445476734076a">dt0</a> = ignitionStepSize;</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> </div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> <span class="keyword">const</span> <span class="keyword">auto</span> prevScreeningModel = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.getScreeningModel();</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> LOG_DEBUG(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;Setting screening model to BARE for high temperature and density ignition.&quot;</span>);</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> <a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.setScreeningModel(<a class="code hl_enumvalue" href="namespacegridfire_1_1screening.html#aa82aafbc4f8c28d0a75b60798e3a7d25ad80b95b1abb9c8659fa4cc9d3d29bb71">screening::ScreeningType::BARE</a>);</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> <a class="code hl_class" href="classgridfire_1_1solver_1_1_direct_network_solver.html">DirectNetworkSolver</a> ignitionSolver(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>);</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span> <a class="code hl_struct" href="structgridfire_1_1_net_out.html">NetOut</a> postIgnition = ignitionSolver.<a class="code hl_function" href="classgridfire_1_1solver_1_1_direct_network_solver.html#a0e8a4b8ef656e0b084d11bea982e412a">evaluate</a>(preIgnition);</div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> LOG_INFO(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;Network ignition completed in {} steps.&quot;</span>, postIgnition.<a class="code hl_variable" href="structgridfire_1_1_net_out.html#a51c16703132cf739ec2fd89eae7badd6">num_steps</a>);</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> <a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.setScreeningModel(prevScreeningModel);</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> LOG_DEBUG(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;Restoring previous screening model: {}&quot;</span>, <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(prevScreeningModel));</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> <span class="keywordflow">return</span> postIgnition;</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> }</div>
</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> </div>
<div class="foldopen" id="foldopen00308" data-start="{" data-end="}">
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"><a class="line" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a35f1f6ede393f15c8bb8862f3f1c3b07"> 308</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a35f1f6ede393f15c8bb8862f3f1c3b07">QSENetworkSolver::shouldUpdateView</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structgridfire_1_1_net_in.html">NetIn</a> &amp;conditions)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> <span class="comment">// Policy 1: If the view has never been initialized, we must update.</span></div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> <span class="keywordflow">if</span> (!<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#ab07e68fd418ab058f890502d191b3f18">m_isViewInitialized</a>) {</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> }</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> </div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> <span class="comment">// Policy 2: Check for significant relative change in temperature.</span></div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> <span class="comment">// Reaction rates are exponentially sensitive to temperature, so we use a tight threshold.</span></div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> <span class="keyword">const</span> <span class="keywordtype">double</span> temp_threshold = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a7d19b6e50db34d38c81afec76bbedee1">m_config</a>.get&lt;<span class="keywordtype">double</span>&gt;(<span class="stringliteral">&quot;gridfire:solver:policy:temp_threshold&quot;</span>, 0.05); <span class="comment">// 5%</span></div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> <span class="keyword">const</span> <span class="keywordtype">double</span> temp_relative_change = std::abs(conditions.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a5be0f5195a5cd1dd177b9fc5ab83a7be">temperature</a> - <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a3c9d46c8f5c519854cd65309a588772f">m_lastSeenConditions</a>.temperature) / <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a3c9d46c8f5c519854cd65309a588772f">m_lastSeenConditions</a>.temperature;</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> <span class="keywordflow">if</span> (temp_relative_change &gt; temp_threshold) {</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> LOG_DEBUG(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;Temperature changed by {:.1f}%, triggering view update.&quot;</span>, temp_relative_change * 100);</div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> }</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> </div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> <span class="comment">// Policy 3: Check for significant relative change in density.</span></div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> <span class="keyword">const</span> <span class="keywordtype">double</span> rho_threshold = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a7d19b6e50db34d38c81afec76bbedee1">m_config</a>.get&lt;<span class="keywordtype">double</span>&gt;(<span class="stringliteral">&quot;gridfire:solver:policy:rho_threshold&quot;</span>, 0.10); <span class="comment">// 10%</span></div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> <span class="keyword">const</span> <span class="keywordtype">double</span> rho_relative_change = std::abs(conditions.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a06f0dff9f8927b7cf2da3004c8fa1577">density</a> - <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a3c9d46c8f5c519854cd65309a588772f">m_lastSeenConditions</a>.density) / <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a3c9d46c8f5c519854cd65309a588772f">m_lastSeenConditions</a>.density;</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> <span class="keywordflow">if</span> (rho_relative_change &gt; rho_threshold) {</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> LOG_DEBUG(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;Density changed by {:.1f}%, triggering view update.&quot;</span>, rho_relative_change * 100);</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> }</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> </div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> <span class="comment">// Policy 4: Check for fuel depletion.</span></div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> <span class="comment">// If a primary fuel source changes significantly, the network structure may change.</span></div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> <span class="keyword">const</span> <span class="keywordtype">double</span> fuel_threshold = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a7d19b6e50db34d38c81afec76bbedee1">m_config</a>.get&lt;<span class="keywordtype">double</span>&gt;(<span class="stringliteral">&quot;gridfire:solver:policy:fuel_threshold&quot;</span>, 0.15); <span class="comment">// 15%</span></div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> </div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> <span class="comment">// Example: Check hydrogen abundance</span></div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> <span class="keyword">const</span> <span class="keywordtype">double</span> h1_old = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a3c9d46c8f5c519854cd65309a588772f">m_lastSeenConditions</a>.composition.getMassFraction(<span class="stringliteral">&quot;H-1&quot;</span>);</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> <span class="keyword">const</span> <span class="keywordtype">double</span> h1_new = conditions.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a13058f4929e72c1187abbebcddb8aed1">composition</a>.getMassFraction(<span class="stringliteral">&quot;H-1&quot;</span>);</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> <span class="keywordflow">if</span> (h1_old &gt; 1e-12) { <span class="comment">// Avoid division by zero</span></div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> <span class="keyword">const</span> <span class="keywordtype">double</span> h1_relative_change = std::abs(h1_new - h1_old) / h1_old;</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> <span class="keywordflow">if</span> (h1_relative_change &gt; fuel_threshold) {</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> LOG_DEBUG(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">m_logger</a>, <span class="stringliteral">&quot;H-1 mass fraction changed by {:.1f}%, triggering view update.&quot;</span>, h1_relative_change * 100);</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> }</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> }</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> </div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> <span class="comment">// If none of the above conditions are met, the current view is still good enough.</span></div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> }</div>
</div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> </div>
<div class="foldopen" id="foldopen00350" data-start="{" data-end="}">
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"><a class="line" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#ae0b6362d9c0a14e69c7a47233db6a86a"> 350</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#ae0b6362d9c0a14e69c7a47233db6a86a">QSENetworkSolver::RHSFunctor::operator()</a>(</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> <span class="keyword">const</span> boost::numeric::ublas::vector&lt;double&gt; &amp;YDynamic,</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> boost::numeric::ublas::vector&lt;double&gt; &amp;dYdtDynamic,</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> <span class="keywordtype">double</span> t</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> )<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> <span class="comment">// --- Populate the slow / dynamic species vector ---</span></div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> std::vector&lt;double&gt; YFull(<a class="code hl_variable" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a0d8d28a6559cfed5e7cd683523d49b2c">m_engine</a>.getNetworkSpecies().size());</div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; <a class="code hl_variable" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a3ac1ef529627d21f7d1ad718dc87f7f9">m_dynamicSpeciesIndices</a>.size(); ++i) {</div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> YFull[<a class="code hl_variable" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a3ac1ef529627d21f7d1ad718dc87f7f9">m_dynamicSpeciesIndices</a>[i]] = YDynamic(i);</div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> }</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> </div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> <span class="comment">// --- Populate the QSE species vector ---</span></div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; <a class="code hl_variable" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a6be7259897a47ce480b289144b06e269">m_QSESpeciesIndices</a>.size(); ++i) {</div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span> YFull[<a class="code hl_variable" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a6be7259897a47ce480b289144b06e269">m_QSESpeciesIndices</a>[i]] = <a class="code hl_variable" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a02c23ef20d616bf5a591a274b66cd75a">m_Y_QSE</a>(i);</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> }</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> </div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> <span class="keyword">auto</span> [full_dYdt, specificEnergyRate] = <a class="code hl_variable" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a0d8d28a6559cfed5e7cd683523d49b2c">m_engine</a>.calculateRHSAndEnergy(YFull, <a class="code hl_variable" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a35026100163c7cc6fdb4c2e4d988b8cb">m_T9</a>, <a class="code hl_variable" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#adc0f8e655af42f414dcb220a7224f261">m_rho</a>);</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> </div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> dYdtDynamic.resize(<a class="code hl_variable" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a3ac1ef529627d21f7d1ad718dc87f7f9">m_dynamicSpeciesIndices</a>.size() + 1);</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; <a class="code hl_variable" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a3ac1ef529627d21f7d1ad718dc87f7f9">m_dynamicSpeciesIndices</a>.size(); ++i) {</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span> dYdtDynamic(i) = full_dYdt[<a class="code hl_variable" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a3ac1ef529627d21f7d1ad718dc87f7f9">m_dynamicSpeciesIndices</a>[i]];</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span> }</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span> dYdtDynamic[<a class="code hl_variable" href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a3ac1ef529627d21f7d1ad718dc87f7f9">m_dynamicSpeciesIndices</a>.size()] = specificEnergyRate;</div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span> }</div>
</div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span> </div>
<div class="foldopen" id="foldopen00375" data-start="{" data-end="}">
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"><a class="line" href="classgridfire_1_1solver_1_1_direct_network_solver.html#a0e8a4b8ef656e0b084d11bea982e412a"> 375</a></span> <a class="code hl_struct" href="structgridfire_1_1_net_out.html">NetOut</a> <a class="code hl_function" href="classgridfire_1_1solver_1_1_direct_network_solver.html#a0e8a4b8ef656e0b084d11bea982e412a">DirectNetworkSolver::evaluate</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structgridfire_1_1_net_in.html">NetIn</a> &amp;netIn) {</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span> <span class="keyword">namespace </span>ublas = boost::numeric::ublas;</div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> <span class="keyword">namespace </span>odeint = boost::numeric::odeint;</div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> <span class="keyword">using </span>fourdst::composition::Composition;</div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> </div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> </div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> <span class="keyword">const</span> <span class="keywordtype">double</span> T9 = netIn.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a5be0f5195a5cd1dd177b9fc5ab83a7be">temperature</a> / 1e9; <span class="comment">// Convert temperature from Kelvin to T9 (T9 = T / 1e9)</span></div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> numSpecies = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.getNetworkSpecies().size();</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> </div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> <span class="keyword">const</span> <span class="keyword">auto</span> absTol = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_direct_network_solver.html#a0d1b52d06b0521e7c556d75cd8d2ffe6">m_config</a>.get&lt;<span class="keywordtype">double</span>&gt;(<span class="stringliteral">&quot;gridfire:solver:DirectNetworkSolver:absTol&quot;</span>, 1.0e-8);</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> <span class="keyword">const</span> <span class="keyword">auto</span> relTol = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_direct_network_solver.html#a0d1b52d06b0521e7c556d75cd8d2ffe6">m_config</a>.get&lt;<span class="keywordtype">double</span>&gt;(<span class="stringliteral">&quot;gridfire:solver:DirectNetworkSolver:relTol&quot;</span>, 1.0e-8);</div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> </div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> <span class="keywordtype">size_t</span> stepCount = 0;</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> </div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> <a class="code hl_struct" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor.html">RHSFunctor</a> rhsFunctor(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>, T9, netIn.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a06f0dff9f8927b7cf2da3004c8fa1577">density</a>);</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> <a class="code hl_struct" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor.html">JacobianFunctor</a> jacobianFunctor(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>, T9, netIn.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a06f0dff9f8927b7cf2da3004c8fa1577">density</a>);</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span> </div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span> ublas::vector&lt;double&gt; Y(numSpecies + 1);</div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span> </div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; numSpecies; ++i) {</div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span> <span class="keyword">const</span> <span class="keyword">auto</span>&amp; species = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.getNetworkSpecies()[i];</div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span> Y(i) = netIn.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a13058f4929e72c1187abbebcddb8aed1">composition</a>.getMolarAbundance(std::string(species.name()));</div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error) {</div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span> LOG_DEBUG(<a class="code hl_variable" href="classgridfire_1_1solver_1_1_direct_network_solver.html#a093aa89fd23c2fe03266e286871c7079">m_logger</a>, <span class="stringliteral">&quot;Species &#39;{}&#39; not found in composition. Setting abundance to 0.0.&quot;</span>, species.name());</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span> Y(i) = 0.0;</div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span> }</div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span> }</div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span> Y(numSpecies) = 0.0;</div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> </div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> <span class="keyword">const</span> <span class="keyword">auto</span> stepper = odeint::make_controlled&lt;odeint::rosenbrock4&lt;double&gt;&gt;(absTol, relTol);</div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> stepCount = odeint::integrate_adaptive(</div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> stepper,</div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> std::make_pair(rhsFunctor, jacobianFunctor),</div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span> Y,</div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span> 0.0,</div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span> netIn.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a0a8d820cfeaa92ee31f253795c57e0d1">tMax</a>,</div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> netIn.<a class="code hl_variable" href="structgridfire_1_1_net_in.html#a4e556f7bb18f46654b3445476734076a">dt0</a></div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> );</div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> </div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> std::vector&lt;double&gt; finalMassFractions(numSpecies);</div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; numSpecies; ++i) {</div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> <span class="keyword">const</span> <span class="keywordtype">double</span> molarMass = <a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.getNetworkSpecies()[i].mass();</div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> finalMassFractions[i] = Y(i) * molarMass; <span class="comment">// Convert from molar abundance to mass fraction</span></div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> <span class="keywordflow">if</span> (finalMassFractions[i] &lt; <a class="code hl_variable" href="namespacegridfire.html#a96c062f94713921e5d7568ecedcdcb06">MIN_ABUNDANCE_THRESHOLD</a>) {</div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span> finalMassFractions[i] = 0.0;</div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span> }</div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span> }</div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span> </div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> std::vector&lt;std::string&gt; speciesNames;</div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span> speciesNames.reserve(numSpecies);</div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"> 426</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; species : <a class="code hl_variable" href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a>.getNetworkSpecies()) {</div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span> speciesNames.push_back(std::string(species.name()));</div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span> }</div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> </div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> Composition outputComposition(speciesNames);</div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> outputComposition.setMassFraction(speciesNames, finalMassFractions);</div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> outputComposition.finalize(<span class="keyword">true</span>);</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> </div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span> <a class="code hl_struct" href="structgridfire_1_1_net_out.html">NetOut</a> netOut;</div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span> netOut.<a class="code hl_variable" href="structgridfire_1_1_net_out.html#a073529511ae0e52f868b47cce0e8ac0a">composition</a> = std::move(outputComposition);</div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> netOut.<a class="code hl_variable" href="structgridfire_1_1_net_out.html#a43d5a861708992c949f616aa2a035ec6">energy</a> = Y(numSpecies); <span class="comment">// Specific energy rate</span></div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> netOut.<a class="code hl_variable" href="structgridfire_1_1_net_out.html#a51c16703132cf739ec2fd89eae7badd6">num_steps</a> = stepCount;</div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> </div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> <span class="keywordflow">return</span> netOut;</div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span> }</div>
</div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> </div>
<div class="foldopen" id="foldopen00442" data-start="{" data-end="}">
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"><a class="line" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor.html#a3a7542b6c6b4c86b6fe53f54d7232919"> 442</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor.html#a3a7542b6c6b4c86b6fe53f54d7232919">DirectNetworkSolver::RHSFunctor::operator()</a>(</div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span> <span class="keyword">const</span> boost::numeric::ublas::vector&lt;double&gt; &amp;Y,</div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"> 444</span> boost::numeric::ublas::vector&lt;double&gt; &amp;dYdt,</div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span> <span class="keywordtype">double</span> t</div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span> )<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</span> <span class="keyword">const</span> std::vector&lt;double&gt; y(Y.begin(), <a class="code hl_variable" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor.html#ac4a1af03d2a4fbc5cc2407b8a6833147">m_numSpecies</a> + Y.begin());</div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span> </div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span> <span class="comment">// std::string timescales = utils::formatNuclearTimescaleLogString(</span></div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span> <span class="comment">// m_engine,</span></div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> <span class="comment">// y,</span></div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> <span class="comment">// m_T9,</span></div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> <span class="comment">// m_rho</span></div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> <span class="comment">// );</span></div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> <span class="comment">// LOG_TRACE_L2(m_logger, &quot;{}&quot;, timescales);</span></div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> </div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> <span class="keyword">auto</span> [dydt, eps] = <a class="code hl_variable" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor.html#a04f8c84e46e6fbd0977e50fda4829d1a">m_engine</a>.calculateRHSAndEnergy(y, <a class="code hl_variable" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor.html#a082844f1eae0609e66620575210e8823">m_T9</a>, <a class="code hl_variable" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor.html#a7d4f7f04c4ee6f0b519194f87aa265e7">m_rho</a>);</div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> dYdt.resize(<a class="code hl_variable" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor.html#ac4a1af03d2a4fbc5cc2407b8a6833147">m_numSpecies</a> + 1);</div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> std::ranges::copy(dydt, dYdt.begin());</div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> dYdt(<a class="code hl_variable" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor.html#ac4a1af03d2a4fbc5cc2407b8a6833147">m_numSpecies</a>) = eps;</div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> }</div>
</div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> </div>
<div class="foldopen" id="foldopen00463" data-start="{" data-end="}">
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"><a class="line" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor.html#ad4fc0b406218aa2f567f5c61a4eda3c9"> 463</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor.html#ad4fc0b406218aa2f567f5c61a4eda3c9">DirectNetworkSolver::JacobianFunctor::operator()</a>(</div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> <span class="keyword">const</span> boost::numeric::ublas::vector&lt;double&gt; &amp;Y,</div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> boost::numeric::ublas::matrix&lt;double&gt; &amp;J,</div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> <span class="keywordtype">double</span> t,</div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> boost::numeric::ublas::vector&lt;double&gt; &amp;dfdt</div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span> )<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> J.resize(<a class="code hl_variable" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor.html#a3f624142212b5e6ff65f5706953fe353">m_numSpecies</a>+1, <a class="code hl_variable" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor.html#a3f624142212b5e6ff65f5706953fe353">m_numSpecies</a>+1);</div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> J.clear();</div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; <a class="code hl_variable" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor.html#a3f624142212b5e6ff65f5706953fe353">m_numSpecies</a>; ++i) {</div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; <a class="code hl_variable" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor.html#a3f624142212b5e6ff65f5706953fe353">m_numSpecies</a>; ++j) {</div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> J(i, j) = <a class="code hl_variable" href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor.html#a56f8b2b222fb2a7dac190ead0babfdd0">m_engine</a>.getJacobianMatrixEntry(i, j);</div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span> }</div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> }</div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> }</div>
</div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span>}</div>
<div class="ttc" id="aclassgridfire_1_1_dynamic_engine_html"><div class="ttname"><a href="classgridfire_1_1_dynamic_engine.html">gridfire::DynamicEngine</a></div><div class="ttdoc">Abstract class for engines supporting Jacobian and stoichiometry operations.</div><div class="ttdef"><b>Definition</b> <a href="engine__abstract_8h_source.html#l00121">engine_abstract.h:121</a></div></div>
<div class="ttc" id="aclassgridfire_1_1_engine_html_a020e1b493d6964cafdad08fde697ceb3"><div class="ttname"><a href="classgridfire_1_1_engine.html#a020e1b493d6964cafdad08fde697ceb3">gridfire::Engine::getNetworkSpecies</a></div><div class="ttdeci">virtual const std::vector&lt; fourdst::atomic::Species &gt; &amp; getNetworkSpecies() const =0</div><div class="ttdoc">Get the list of species in the network.</div></div>
<div class="ttc" id="aclassgridfire_1_1solver_1_1_direct_network_solver_html"><div class="ttname"><a href="classgridfire_1_1solver_1_1_direct_network_solver.html">gridfire::solver::DirectNetworkSolver</a></div><div class="ttdoc">A network solver that directly integrates the reaction network ODEs.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00386">solver.h:386</a></div></div>
<div class="ttc" id="aclassgridfire_1_1solver_1_1_direct_network_solver_html_a093aa89fd23c2fe03266e286871c7079"><div class="ttname"><a href="classgridfire_1_1solver_1_1_direct_network_solver.html#a093aa89fd23c2fe03266e286871c7079">gridfire::solver::DirectNetworkSolver::m_logger</a></div><div class="ttdeci">quill::Logger * m_logger</div><div class="ttdoc">Logger instance.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00491">solver.h:491</a></div></div>
<div class="ttc" id="aclassgridfire_1_1solver_1_1_direct_network_solver_html_a0d1b52d06b0521e7c556d75cd8d2ffe6"><div class="ttname"><a href="classgridfire_1_1solver_1_1_direct_network_solver.html#a0d1b52d06b0521e7c556d75cd8d2ffe6">gridfire::solver::DirectNetworkSolver::m_config</a></div><div class="ttdeci">fourdst::config::Config &amp; m_config</div><div class="ttdoc">Configuration instance.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00492">solver.h:492</a></div></div>
<div class="ttc" id="aclassgridfire_1_1solver_1_1_direct_network_solver_html_a0e8a4b8ef656e0b084d11bea982e412a"><div class="ttname"><a href="classgridfire_1_1solver_1_1_direct_network_solver.html#a0e8a4b8ef656e0b084d11bea982e412a">gridfire::solver::DirectNetworkSolver::evaluate</a></div><div class="ttdeci">NetOut evaluate(const NetIn &amp;netIn) override</div><div class="ttdoc">Evaluates the network for a given timestep using direct integration.</div><div class="ttdef"><b>Definition</b> <a href="#l00375">solver.cpp:375</a></div></div>
<div class="ttc" id="aclassgridfire_1_1solver_1_1_network_solver_strategy_html_a724924d94eaf82b67d9988a55c3261e8"><div class="ttname"><a href="classgridfire_1_1solver_1_1_network_solver_strategy.html#a724924d94eaf82b67d9988a55c3261e8">gridfire::solver::NetworkSolverStrategy&lt; DynamicEngine &gt;::m_engine</a></div><div class="ttdeci">DynamicEngine &amp; m_engine</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00063">solver.h:63</a></div></div>
<div class="ttc" id="aclassgridfire_1_1solver_1_1_q_s_e_network_solver_html_a00d112f6087f6e3a93f4d40a519308d2"><div class="ttname"><a href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a00d112f6087f6e3a93f4d40a519308d2">gridfire::solver::QSENetworkSolver::calculateSteadyStateAbundances</a></div><div class="ttdeci">Eigen::VectorXd calculateSteadyStateAbundances(const std::vector&lt; double &gt; &amp;Y, const double T9, const double rho, const dynamicQSESpeciesIndices &amp;indices) const</div><div class="ttdoc">Calculates the steady-state abundances of the QSE species.</div><div class="ttdef"><b>Definition</b> <a href="#l00205">solver.cpp:205</a></div></div>
<div class="ttc" id="aclassgridfire_1_1solver_1_1_q_s_e_network_solver_html_a35f1f6ede393f15c8bb8862f3f1c3b07"><div class="ttname"><a href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a35f1f6ede393f15c8bb8862f3f1c3b07">gridfire::solver::QSENetworkSolver::shouldUpdateView</a></div><div class="ttdeci">bool shouldUpdateView(const NetIn &amp;conditions) const</div><div class="ttdoc">Determines whether the adaptive engine view should be updated.</div><div class="ttdef"><b>Definition</b> <a href="#l00308">solver.cpp:308</a></div></div>
<div class="ttc" id="aclassgridfire_1_1solver_1_1_q_s_e_network_solver_html_a3c9d46c8f5c519854cd65309a588772f"><div class="ttname"><a href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a3c9d46c8f5c519854cd65309a588772f">gridfire::solver::QSENetworkSolver::m_lastSeenConditions</a></div><div class="ttdeci">NetIn m_lastSeenConditions</div><div class="ttdoc">The last seen input conditions.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00373">solver.h:373</a></div></div>
<div class="ttc" id="aclassgridfire_1_1solver_1_1_q_s_e_network_solver_html_a428b49fa7878559665363de06f1a44a7"><div class="ttname"><a href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a428b49fa7878559665363de06f1a44a7">gridfire::solver::QSENetworkSolver::m_logger</a></div><div class="ttdeci">quill::Logger * m_logger</div><div class="ttdoc">Logger instance.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00369">solver.h:369</a></div></div>
<div class="ttc" id="aclassgridfire_1_1solver_1_1_q_s_e_network_solver_html_a53b5496db7fed6f345dca39656bf9c0e"><div class="ttname"><a href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a53b5496db7fed6f345dca39656bf9c0e">gridfire::solver::QSENetworkSolver::evaluate</a></div><div class="ttdeci">NetOut evaluate(const NetIn &amp;netIn) override</div><div class="ttdoc">Evaluates the network for a given timestep using the QSE approach.</div><div class="ttdef"><b>Definition</b> <a href="#l00026">solver.cpp:26</a></div></div>
<div class="ttc" id="aclassgridfire_1_1solver_1_1_q_s_e_network_solver_html_a5d81ee5bfcfd5e77fe52201ba9e63719"><div class="ttname"><a href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a5d81ee5bfcfd5e77fe52201ba9e63719">gridfire::solver::QSENetworkSolver::packSpeciesTypeIndexVectors</a></div><div class="ttdeci">dynamicQSESpeciesIndices packSpeciesTypeIndexVectors(const std::vector&lt; double &gt; &amp;Y, const double T9, const double rho) const</div><div class="ttdoc">Packs the species indices into vectors based on their type (dynamic or QSE).</div><div class="ttdef"><b>Definition</b> <a href="#l00137">solver.cpp:137</a></div></div>
<div class="ttc" id="aclassgridfire_1_1solver_1_1_q_s_e_network_solver_html_a7d19b6e50db34d38c81afec76bbedee1"><div class="ttname"><a href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#a7d19b6e50db34d38c81afec76bbedee1">gridfire::solver::QSENetworkSolver::m_config</a></div><div class="ttdeci">fourdst::config::Config &amp; m_config</div><div class="ttdoc">Configuration instance.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00370">solver.h:370</a></div></div>
<div class="ttc" id="aclassgridfire_1_1solver_1_1_q_s_e_network_solver_html_ab07e68fd418ab058f890502d191b3f18"><div class="ttname"><a href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#ab07e68fd418ab058f890502d191b3f18">gridfire::solver::QSENetworkSolver::m_isViewInitialized</a></div><div class="ttdeci">bool m_isViewInitialized</div><div class="ttdoc">Flag indicating whether the adaptive engine view has been initialized.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00372">solver.h:372</a></div></div>
<div class="ttc" id="aclassgridfire_1_1solver_1_1_q_s_e_network_solver_html_abaa567001df0007b714f474febae408b"><div class="ttname"><a href="classgridfire_1_1solver_1_1_q_s_e_network_solver.html#abaa567001df0007b714f474febae408b">gridfire::solver::QSENetworkSolver::initializeNetworkWithShortIgnition</a></div><div class="ttdeci">NetOut initializeNetworkWithShortIgnition(const NetIn &amp;netIn) const</div><div class="ttdoc">Initializes the network with a short ignition phase.</div><div class="ttdef"><b>Definition</b> <a href="#l00264">solver.cpp:264</a></div></div>
<div class="ttc" id="aengine__graph_8h_html"><div class="ttname"><a href="engine__graph_8h.html">engine_graph.h</a></div></div>
<div class="ttc" id="alogging_8h_html"><div class="ttname"><a href="logging_8h.html">logging.h</a></div></div>
<div class="ttc" id="anamespacegridfire_1_1screening_html_aa82aafbc4f8c28d0a75b60798e3a7d25ad80b95b1abb9c8659fa4cc9d3d29bb71"><div class="ttname"><a href="namespacegridfire_1_1screening.html#aa82aafbc4f8c28d0a75b60798e3a7d25ad80b95b1abb9c8659fa4cc9d3d29bb71">gridfire::screening::ScreeningType::BARE</a></div><div class="ttdeci">@ BARE</div><div class="ttdoc">No screening applied. The screening factor is always 1.0.</div><div class="ttdef"><b>Definition</b> <a href="screening__types_8h_source.html#l00016">screening_types.h:16</a></div></div>
<div class="ttc" id="anamespacegridfire_1_1solver_html"><div class="ttname"><a href="namespacegridfire_1_1solver.html">gridfire::solver</a></div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00017">solver.h:17</a></div></div>
<div class="ttc" id="anamespacegridfire_html_a96c062f94713921e5d7568ecedcdcb06"><div class="ttname"><a href="namespacegridfire.html#a96c062f94713921e5d7568ecedcdcb06">gridfire::MIN_ABUNDANCE_THRESHOLD</a></div><div class="ttdeci">static constexpr double MIN_ABUNDANCE_THRESHOLD</div><div class="ttdoc">Minimum abundance threshold below which species are ignored.</div><div class="ttdef"><b>Definition</b> <a href="engine__graph_8h_source.html#l00056">engine_graph.h:56</a></div></div>
<div class="ttc" id="anetwork_8h_html"><div class="ttname"><a href="network_8h.html">network.h</a></div></div>
<div class="ttc" id="asolver_8h_html"><div class="ttname"><a href="solver_8h.html">solver.h</a></div></div>
<div class="ttc" id="astructgridfire_1_1_net_in_html"><div class="ttname"><a href="structgridfire_1_1_net_in.html">gridfire::NetIn</a></div><div class="ttdef"><b>Definition</b> <a href="network_8h_source.html#l00053">network.h:53</a></div></div>
<div class="ttc" id="astructgridfire_1_1_net_in_html_a06f0dff9f8927b7cf2da3004c8fa1577"><div class="ttname"><a href="structgridfire_1_1_net_in.html#a06f0dff9f8927b7cf2da3004c8fa1577">gridfire::NetIn::density</a></div><div class="ttdeci">double density</div><div class="ttdoc">Density in g/cm^3.</div><div class="ttdef"><b>Definition</b> <a href="network_8h_source.html#l00058">network.h:58</a></div></div>
<div class="ttc" id="astructgridfire_1_1_net_in_html_a0a8d820cfeaa92ee31f253795c57e0d1"><div class="ttname"><a href="structgridfire_1_1_net_in.html#a0a8d820cfeaa92ee31f253795c57e0d1">gridfire::NetIn::tMax</a></div><div class="ttdeci">double tMax</div><div class="ttdoc">Maximum time.</div><div class="ttdef"><b>Definition</b> <a href="network_8h_source.html#l00055">network.h:55</a></div></div>
<div class="ttc" id="astructgridfire_1_1_net_in_html_a13058f4929e72c1187abbebcddb8aed1"><div class="ttname"><a href="structgridfire_1_1_net_in.html#a13058f4929e72c1187abbebcddb8aed1">gridfire::NetIn::composition</a></div><div class="ttdeci">fourdst::composition::Composition composition</div><div class="ttdoc">Composition of the network.</div><div class="ttdef"><b>Definition</b> <a href="network_8h_source.html#l00054">network.h:54</a></div></div>
<div class="ttc" id="astructgridfire_1_1_net_in_html_a47781e8d5503e3b4f12d669e2cbcfb65"><div class="ttname"><a href="structgridfire_1_1_net_in.html#a47781e8d5503e3b4f12d669e2cbcfb65">gridfire::NetIn::MolarAbundance</a></div><div class="ttdeci">std::vector&lt; double &gt; MolarAbundance() const</div><div class="ttdef"><b>Definition</b> <a href="network_8cpp_source.html#l00030">network.cpp:30</a></div></div>
<div class="ttc" id="astructgridfire_1_1_net_in_html_a4e556f7bb18f46654b3445476734076a"><div class="ttname"><a href="structgridfire_1_1_net_in.html#a4e556f7bb18f46654b3445476734076a">gridfire::NetIn::dt0</a></div><div class="ttdeci">double dt0</div><div class="ttdoc">Initial time step.</div><div class="ttdef"><b>Definition</b> <a href="network_8h_source.html#l00056">network.h:56</a></div></div>
<div class="ttc" id="astructgridfire_1_1_net_in_html_a5be0f5195a5cd1dd177b9fc5ab83a7be"><div class="ttname"><a href="structgridfire_1_1_net_in.html#a5be0f5195a5cd1dd177b9fc5ab83a7be">gridfire::NetIn::temperature</a></div><div class="ttdeci">double temperature</div><div class="ttdoc">Temperature in Kelvin.</div><div class="ttdef"><b>Definition</b> <a href="network_8h_source.html#l00057">network.h:57</a></div></div>
<div class="ttc" id="astructgridfire_1_1_net_out_html"><div class="ttname"><a href="structgridfire_1_1_net_out.html">gridfire::NetOut</a></div><div class="ttdef"><b>Definition</b> <a href="network_8h_source.html#l00065">network.h:65</a></div></div>
<div class="ttc" id="astructgridfire_1_1_net_out_html_a073529511ae0e52f868b47cce0e8ac0a"><div class="ttname"><a href="structgridfire_1_1_net_out.html#a073529511ae0e52f868b47cce0e8ac0a">gridfire::NetOut::composition</a></div><div class="ttdeci">fourdst::composition::Composition composition</div><div class="ttdoc">Composition of the network after evaluation.</div><div class="ttdef"><b>Definition</b> <a href="network_8h_source.html#l00066">network.h:66</a></div></div>
<div class="ttc" id="astructgridfire_1_1_net_out_html_a43d5a861708992c949f616aa2a035ec6"><div class="ttname"><a href="structgridfire_1_1_net_out.html#a43d5a861708992c949f616aa2a035ec6">gridfire::NetOut::energy</a></div><div class="ttdeci">double energy</div><div class="ttdoc">Energy in ergs after evaluation.</div><div class="ttdef"><b>Definition</b> <a href="network_8h_source.html#l00068">network.h:68</a></div></div>
<div class="ttc" id="astructgridfire_1_1_net_out_html_a51c16703132cf739ec2fd89eae7badd6"><div class="ttname"><a href="structgridfire_1_1_net_out.html#a51c16703132cf739ec2fd89eae7badd6">gridfire::NetOut::num_steps</a></div><div class="ttdeci">int num_steps</div><div class="ttdoc">Number of steps taken in the evaluation.</div><div class="ttdef"><b>Definition</b> <a href="network_8h_source.html#l00067">network.h:67</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor_html"><div class="ttname"><a href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor.html">gridfire::solver::DirectNetworkSolver::JacobianFunctor</a></div><div class="ttdoc">Functor for calculating the Jacobian matrix.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00452">solver.h:452</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor_html_a3f624142212b5e6ff65f5706953fe353"><div class="ttname"><a href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor.html#a3f624142212b5e6ff65f5706953fe353">gridfire::solver::DirectNetworkSolver::JacobianFunctor::m_numSpecies</a></div><div class="ttdeci">const size_t m_numSpecies</div><div class="ttdoc">The number of species in the network.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00456">solver.h:456</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor_html_a56f8b2b222fb2a7dac190ead0babfdd0"><div class="ttname"><a href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor.html#a56f8b2b222fb2a7dac190ead0babfdd0">gridfire::solver::DirectNetworkSolver::JacobianFunctor::m_engine</a></div><div class="ttdeci">DynamicEngine &amp; m_engine</div><div class="ttdoc">The engine used to evaluate the network.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00453">solver.h:453</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor_html_ad4fc0b406218aa2f567f5c61a4eda3c9"><div class="ttname"><a href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_jacobian_functor.html#ad4fc0b406218aa2f567f5c61a4eda3c9">gridfire::solver::DirectNetworkSolver::JacobianFunctor::operator()</a></div><div class="ttdeci">void operator()(const boost::numeric::ublas::vector&lt; double &gt; &amp;Y, boost::numeric::ublas::matrix&lt; double &gt; &amp;J, double t, boost::numeric::ublas::vector&lt; double &gt; &amp;dfdt) const</div><div class="ttdoc">Calculates the Jacobian matrix.</div><div class="ttdef"><b>Definition</b> <a href="#l00463">solver.cpp:463</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor_html"><div class="ttname"><a href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor.html">gridfire::solver::DirectNetworkSolver::RHSFunctor</a></div><div class="ttdoc">Functor for calculating the right-hand side of the ODEs.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00409">solver.h:409</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor_html_a04f8c84e46e6fbd0977e50fda4829d1a"><div class="ttname"><a href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor.html#a04f8c84e46e6fbd0977e50fda4829d1a">gridfire::solver::DirectNetworkSolver::RHSFunctor::m_engine</a></div><div class="ttdeci">DynamicEngine &amp; m_engine</div><div class="ttdoc">The engine used to evaluate the network.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00410">solver.h:410</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor_html_a082844f1eae0609e66620575210e8823"><div class="ttname"><a href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor.html#a082844f1eae0609e66620575210e8823">gridfire::solver::DirectNetworkSolver::RHSFunctor::m_T9</a></div><div class="ttdeci">const double m_T9</div><div class="ttdoc">Temperature in units of 10^9 K.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00411">solver.h:411</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor_html_a3a7542b6c6b4c86b6fe53f54d7232919"><div class="ttname"><a href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor.html#a3a7542b6c6b4c86b6fe53f54d7232919">gridfire::solver::DirectNetworkSolver::RHSFunctor::operator()</a></div><div class="ttdeci">void operator()(const boost::numeric::ublas::vector&lt; double &gt; &amp;Y, boost::numeric::ublas::vector&lt; double &gt; &amp;dYdt, double t) const</div><div class="ttdoc">Calculates the time derivatives of the species abundances.</div><div class="ttdef"><b>Definition</b> <a href="#l00442">solver.cpp:442</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor_html_a7d4f7f04c4ee6f0b519194f87aa265e7"><div class="ttname"><a href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor.html#a7d4f7f04c4ee6f0b519194f87aa265e7">gridfire::solver::DirectNetworkSolver::RHSFunctor::m_rho</a></div><div class="ttdeci">const double m_rho</div><div class="ttdoc">Density in g/cm^3.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00412">solver.h:412</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor_html_ac4a1af03d2a4fbc5cc2407b8a6833147"><div class="ttname"><a href="structgridfire_1_1solver_1_1_direct_network_solver_1_1_r_h_s_functor.html#ac4a1af03d2a4fbc5cc2407b8a6833147">gridfire::solver::DirectNetworkSolver::RHSFunctor::m_numSpecies</a></div><div class="ttdeci">const size_t m_numSpecies</div><div class="ttdoc">The number of species in the network.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00413">solver.h:413</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_eigen_functor_html"><div class="ttname"><a href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_eigen_functor.html">gridfire::solver::QSENetworkSolver::EigenFunctor</a></div><div class="ttdoc">Functor for calculating the residual and Jacobian for the QSE species using Eigen.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00309">solver.h:309</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor_html"><div class="ttname"><a href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html">gridfire::solver::QSENetworkSolver::RHSFunctor</a></div><div class="ttdoc">Functor for calculating the right-hand side of the ODEs for the dynamic species.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00201">solver.h:201</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor_html_a02c23ef20d616bf5a591a274b66cd75a"><div class="ttname"><a href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a02c23ef20d616bf5a591a274b66cd75a">gridfire::solver::QSENetworkSolver::RHSFunctor::m_Y_QSE</a></div><div class="ttdeci">const Eigen::VectorXd &amp; m_Y_QSE</div><div class="ttdoc">Steady-state abundances of the QSE species.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00205">solver.h:205</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor_html_a0d8d28a6559cfed5e7cd683523d49b2c"><div class="ttname"><a href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a0d8d28a6559cfed5e7cd683523d49b2c">gridfire::solver::QSENetworkSolver::RHSFunctor::m_engine</a></div><div class="ttdeci">DynamicEngine &amp; m_engine</div><div class="ttdoc">The engine used to evaluate the network.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00202">solver.h:202</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor_html_a35026100163c7cc6fdb4c2e4d988b8cb"><div class="ttname"><a href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a35026100163c7cc6fdb4c2e4d988b8cb">gridfire::solver::QSENetworkSolver::RHSFunctor::m_T9</a></div><div class="ttdeci">const double m_T9</div><div class="ttdoc">Temperature in units of 10^9 K.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00206">solver.h:206</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor_html_a3ac1ef529627d21f7d1ad718dc87f7f9"><div class="ttname"><a href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a3ac1ef529627d21f7d1ad718dc87f7f9">gridfire::solver::QSENetworkSolver::RHSFunctor::m_dynamicSpeciesIndices</a></div><div class="ttdeci">const std::vector&lt; size_t &gt; &amp; m_dynamicSpeciesIndices</div><div class="ttdoc">Indices of the dynamic species.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00203">solver.h:203</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor_html_a6be7259897a47ce480b289144b06e269"><div class="ttname"><a href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#a6be7259897a47ce480b289144b06e269">gridfire::solver::QSENetworkSolver::RHSFunctor::m_QSESpeciesIndices</a></div><div class="ttdeci">const std::vector&lt; size_t &gt; &amp; m_QSESpeciesIndices</div><div class="ttdoc">Indices of the QSE species.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00204">solver.h:204</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor_html_adc0f8e655af42f414dcb220a7224f261"><div class="ttname"><a href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#adc0f8e655af42f414dcb220a7224f261">gridfire::solver::QSENetworkSolver::RHSFunctor::m_rho</a></div><div class="ttdeci">const double m_rho</div><div class="ttdoc">Density in g/cm^3.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00207">solver.h:207</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor_html_ae0b6362d9c0a14e69c7a47233db6a86a"><div class="ttname"><a href="structgridfire_1_1solver_1_1_q_s_e_network_solver_1_1_r_h_s_functor.html#ae0b6362d9c0a14e69c7a47233db6a86a">gridfire::solver::QSENetworkSolver::RHSFunctor::operator()</a></div><div class="ttdeci">void operator()(const boost::numeric::ublas::vector&lt; double &gt; &amp;YDynamic, boost::numeric::ublas::vector&lt; double &gt; &amp;dYdtDynamic, double t) const</div><div class="ttdoc">Calculates the time derivatives of the dynamic species.</div><div class="ttdef"><b>Definition</b> <a href="#l00350">solver.cpp:350</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1dynamic_q_s_e_species_indices_html"><div class="ttname"><a href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html">gridfire::solver::dynamicQSESpeciesIndices</a></div><div class="ttdoc">Structure to hold indices of dynamic and QSE species.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00027">solver.h:27</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1dynamic_q_s_e_species_indices_html_a7d4ba82d9e60a4914938ebebecaab4a2"><div class="ttname"><a href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html#a7d4ba82d9e60a4914938ebebecaab4a2">gridfire::solver::dynamicQSESpeciesIndices::QSESpeciesIndices</a></div><div class="ttdeci">std::vector&lt; size_t &gt; QSESpeciesIndices</div><div class="ttdoc">Indices of fast species that are in QSE.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00029">solver.h:29</a></div></div>
<div class="ttc" id="astructgridfire_1_1solver_1_1dynamic_q_s_e_species_indices_html_ac6e0419abdd3c78b32e34c16c0543157"><div class="ttname"><a href="structgridfire_1_1solver_1_1dynamic_q_s_e_species_indices.html#ac6e0419abdd3c78b32e34c16c0543157">gridfire::solver::dynamicQSESpeciesIndices::dynamicSpeciesIndices</a></div><div class="ttdeci">std::vector&lt; size_t &gt; dynamicSpeciesIndices</div><div class="ttdoc">Indices of slow species that are not in QSE.</div><div class="ttdef"><b>Definition</b> <a href="solver_8h_source.html#l00028">solver.h:28</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_fc4c7f03e1a69a98c370fae55a743828.html">network</a></li><li class="navelem"><a class="el" href="dir_a7655658c851688eff9381235a9676f0.html">lib</a></li><li class="navelem"><a class="el" href="dir_93d547a749bb04fb4b43758550ab11b5.html">solver</a></li><li class="navelem"><a class="el" href="solver_8cpp.html">solver.cpp</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.13.2 </li>
</ul>
</div>
</body>
</html>