Files
GridFire/docs/html/classgridfire_1_1solver_1_1CVODESolverStrategy.html

1505 lines
84 KiB
HTML
Raw Permalink Normal View History

<!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.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>GridFire: gridfire::solver::CVODESolverStrategy Class Reference</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>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.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;v0.7.1_rc2</span>
</div>
<div id="projectbrief">General Purpose Nuclear Network</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<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" 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');
$(document).ready(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 */
$(document).ready(function(){initNavTree('classgridfire_1_1solver_1_1CVODESolverStrategy.html',''); initResizable(); });
/* @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="summary">
<a href="#nested-classes">Classes</a> &#124;
<a href="#pub-types">Public Types</a> &#124;
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="#pri-methods">Private Member Functions</a> &#124;
<a href="#pri-static-methods">Static Private Member Functions</a> &#124;
<a href="#pri-attribs">Private Attributes</a> &#124;
<a href="classgridfire_1_1solver_1_1CVODESolverStrategy-members.html">List of all members</a> </div>
<div class="headertitle"><div class="title">gridfire::solver::CVODESolverStrategy Class Reference<span class="mlabels"><span class="mlabel">final</span></span></div></div>
</div><!--header-->
<div class="contents">
<p>Stiff ODE integrator backed by SUNDIALS CVODE (BDF) for network + energy.
<a href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#details">More...</a></p>
<p><code>#include &lt;CVODE_solver_strategy.h&gt;</code></p>
<div class="dynheader">
Inheritance diagram for gridfire::solver::CVODESolverStrategy:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classgridfire_1_1solver_1_1CVODESolverStrategy__inherit__graph.svg" width="242" height="124"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
<center><span class="legend">[<a target="top" href="graph_legend.html">legend</a>]</span></center></div>
<div class="dynheader">
Collaboration diagram for gridfire::solver::CVODESolverStrategy:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classgridfire_1_1solver_1_1CVODESolverStrategy__coll__graph.svg" width="242" height="124"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
<center><span class="legend">[<a target="top" href="graph_legend.html">legend</a>]</span></center></div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structgridfire_1_1solver_1_1CVODESolverStrategy_1_1CVODERHSOutputData.html">CVODERHSOutputData</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structgridfire_1_1solver_1_1CVODESolverStrategy_1_1CVODEUserData.html">CVODEUserData</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A helper struct to pass C++ context to C-style CVODE callbacks. <a href="structgridfire_1_1solver_1_1CVODESolverStrategy_1_1CVODEUserData.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structgridfire_1_1solver_1_1CVODESolverStrategy_1_1TimestepContext.html">TimestepContext</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Immutable view of the current integration state passed to callbacks. <a href="structgridfire_1_1solver_1_1CVODESolverStrategy_1_1TimestepContext.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-types" name="pub-types"></a>
Public Types</h2></td></tr>
<tr class="memitem:a89c537c2f34ba3e202374304b7e5990a" id="r_a89c537c2f34ba3e202374304b7e5990a"><td class="memItemLeft" align="right" valign="top">using&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a89c537c2f34ba3e202374304b7e5990a">TimestepCallback</a> = std::function&lt; void(const <a class="el" href="structgridfire_1_1solver_1_1CVODESolverStrategy_1_1TimestepContext.html">TimestepContext</a> &amp;context)&gt;</td></tr>
<tr class="memdesc:a89c537c2f34ba3e202374304b7e5990a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Type alias for a timestep callback function. <br /></td></tr>
<tr class="separator:a89c537c2f34ba3e202374304b7e5990a"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a8beeb102d8e459cd133cd1bd5fb7e135" id="r_a8beeb102d8e459cd133cd1bd5fb7e135"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a8beeb102d8e459cd133cd1bd5fb7e135">CVODESolverStrategy</a> (<a class="el" href="classgridfire_1_1engine_1_1DynamicEngine.html">engine::DynamicEngine</a> &amp;engine)</td></tr>
<tr class="memdesc:a8beeb102d8e459cd133cd1bd5fb7e135"><td class="mdescLeft">&#160;</td><td class="mdescRight">Construct the CVODE strategy and create a SUNDIALS context. <br /></td></tr>
<tr class="separator:a8beeb102d8e459cd133cd1bd5fb7e135"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aca2d01a907c3bb828f9f99ad05506578" id="r_aca2d01a907c3bb828f9f99ad05506578"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#aca2d01a907c3bb828f9f99ad05506578">~CVODESolverStrategy</a> () override</td></tr>
<tr class="memdesc:aca2d01a907c3bb828f9f99ad05506578"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destructor: cleans CVODE/SUNDIALS resources and frees SUNContext. <br /></td></tr>
<tr class="separator:aca2d01a907c3bb828f9f99ad05506578"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2fa56a2e7a63d31d2afa895a5e4fe827" id="r_a2fa56a2e7a63d31d2afa895a5e4fe827"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a2fa56a2e7a63d31d2afa895a5e4fe827">CVODESolverStrategy</a> (const <a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">CVODESolverStrategy</a> &amp;)=delete</td></tr>
<tr class="separator:a2fa56a2e7a63d31d2afa895a5e4fe827"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af500df838024c82724eaf7fe1cb9b8e8" id="r_af500df838024c82724eaf7fe1cb9b8e8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">CVODESolverStrategy</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#af500df838024c82724eaf7fe1cb9b8e8">operator=</a> (const <a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">CVODESolverStrategy</a> &amp;)=delete</td></tr>
<tr class="separator:af500df838024c82724eaf7fe1cb9b8e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1f007d68e808ba61f8425d0487432c0d" id="r_a1f007d68e808ba61f8425d0487432c0d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a1f007d68e808ba61f8425d0487432c0d">CVODESolverStrategy</a> (<a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">CVODESolverStrategy</a> &amp;&amp;)=delete</td></tr>
<tr class="separator:a1f007d68e808ba61f8425d0487432c0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad26879fafcee9ecb21cc7c5ac0db1692" id="r_ad26879fafcee9ecb21cc7c5ac0db1692"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">CVODESolverStrategy</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#ad26879fafcee9ecb21cc7c5ac0db1692">operator=</a> (<a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">CVODESolverStrategy</a> &amp;&amp;)=delete</td></tr>
<tr class="separator:ad26879fafcee9ecb21cc7c5ac0db1692"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab8224d205ea3a28d9c723631c2f00b53" id="r_ab8224d205ea3a28d9c723631c2f00b53"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structgridfire_1_1NetOut.html">NetOut</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#ab8224d205ea3a28d9c723631c2f00b53">evaluate</a> (const <a class="el" href="structgridfire_1_1NetIn.html">NetIn</a> &amp;netIn) override</td></tr>
<tr class="memdesc:ab8224d205ea3a28d9c723631c2f00b53"><td class="mdescLeft">&#160;</td><td class="mdescRight">Integrate from t=0 to netIn.tMax and return final composition and energy. <br /></td></tr>
<tr class="separator:ab8224d205ea3a28d9c723631c2f00b53"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a167e44c002243314aa58c84715490804" id="r_a167e44c002243314aa58c84715490804"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structgridfire_1_1NetOut.html">NetOut</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a167e44c002243314aa58c84715490804">evaluate</a> (const <a class="el" href="structgridfire_1_1NetIn.html">NetIn</a> &amp;netIn, bool displayTrigger)</td></tr>
<tr class="memdesc:a167e44c002243314aa58c84715490804"><td class="mdescLeft">&#160;</td><td class="mdescRight">Call to evaluate which will let the user control if the trigger reasoning is displayed. <br /></td></tr>
<tr class="separator:a167e44c002243314aa58c84715490804"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a77638ef3d2279009e5a57bbd3f0eb63b" id="r_a77638ef3d2279009e5a57bbd3f0eb63b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a77638ef3d2279009e5a57bbd3f0eb63b">set_callback</a> (const std::any &amp;callback) override</td></tr>
<tr class="memdesc:a77638ef3d2279009e5a57bbd3f0eb63b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Install a timestep callback. <br /></td></tr>
<tr class="separator:a77638ef3d2279009e5a57bbd3f0eb63b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a87b7b39e2a15cc30b118c8e6fda9a1a6" id="r_a87b7b39e2a15cc30b118c8e6fda9a1a6"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a87b7b39e2a15cc30b118c8e6fda9a1a6">get_stdout_logging_enabled</a> () const</td></tr>
<tr class="memdesc:a87b7b39e2a15cc30b118c8e6fda9a1a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Whether per-step logs are printed to stdout and CVode is stepped with CV_ONE_STEP. <br /></td></tr>
<tr class="separator:a87b7b39e2a15cc30b118c8e6fda9a1a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a9857665a1198e24aac6add02afc6e306" id="r_a9857665a1198e24aac6add02afc6e306"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a9857665a1198e24aac6add02afc6e306">set_stdout_logging_enabled</a> (bool logging_enabled)</td></tr>
<tr class="memdesc:a9857665a1198e24aac6add02afc6e306"><td class="mdescLeft">&#160;</td><td class="mdescRight">Enable/disable per-step stdout logging. <br /></td></tr>
<tr class="separator:a9857665a1198e24aac6add02afc6e306"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aed8907852f77c15bb40d5a8e8f8af9b2" id="r_aed8907852f77c15bb40d5a8e8f8af9b2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#aed8907852f77c15bb40d5a8e8f8af9b2">set_absTol</a> (double absTol)</td></tr>
<tr class="separator:aed8907852f77c15bb40d5a8e8f8af9b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6444290be523ad9fa91fa57c1dd4b6a2" id="r_a6444290be523ad9fa91fa57c1dd4b6a2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a6444290be523ad9fa91fa57c1dd4b6a2">set_relTol</a> (double relTol)</td></tr>
<tr class="separator:a6444290be523ad9fa91fa57c1dd4b6a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae98bbc854c88cf4aecf93a9204958a4c" id="r_ae98bbc854c88cf4aecf93a9204958a4c"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#ae98bbc854c88cf4aecf93a9204958a4c">get_absTol</a> () const</td></tr>
<tr class="separator:ae98bbc854c88cf4aecf93a9204958a4c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a103273e838ea10f71a11705046f1f951" id="r_a103273e838ea10f71a11705046f1f951"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a103273e838ea10f71a11705046f1f951">get_relTol</a> () const</td></tr>
<tr class="separator:a103273e838ea10f71a11705046f1f951"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5dfb7a2ce0008d41dee4aa596a4e1ce4" id="r_a5dfb7a2ce0008d41dee4aa596a4e1ce4"><td class="memItemLeft" align="right" valign="top">std::vector&lt; std::tuple&lt; std::string, std::string &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a5dfb7a2ce0008d41dee4aa596a4e1ce4">describe_callback_context</a> () const override</td></tr>
<tr class="memdesc:a5dfb7a2ce0008d41dee4aa596a4e1ce4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Schema of fields exposed to the timestep callback context. <br /></td></tr>
<tr class="separator:a5dfb7a2ce0008d41dee4aa596a4e1ce4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="inherit_header pub_methods_classgridfire_1_1solver_1_1NetworkSolverStrategy"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classgridfire_1_1solver_1_1NetworkSolverStrategy')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classgridfire_1_1solver_1_1NetworkSolverStrategy.html">gridfire::solver::NetworkSolverStrategy&lt; EngineT &gt;</a></td></tr>
<tr class="memitem:a01cbbec0eb5c3a60f50da38cdaf66505 inherit pub_methods_classgridfire_1_1solver_1_1NetworkSolverStrategy" id="r_a01cbbec0eb5c3a60f50da38cdaf66505"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1NetworkSolverStrategy.html#a01cbbec0eb5c3a60f50da38cdaf66505">NetworkSolverStrategy</a> (EngineT &amp;engine)</td></tr>
<tr class="memdesc:a01cbbec0eb5c3a60f50da38cdaf66505 inherit pub_methods_classgridfire_1_1solver_1_1NetworkSolverStrategy"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor for the <a class="el" href="classgridfire_1_1solver_1_1NetworkSolverStrategy.html" title="Abstract base class for network solver strategies.">NetworkSolverStrategy</a>. <br /></td></tr>
<tr class="separator:a01cbbec0eb5c3a60f50da38cdaf66505 inherit pub_methods_classgridfire_1_1solver_1_1NetworkSolverStrategy"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1693dc93f63599c89587d729aca8e318 inherit pub_methods_classgridfire_1_1solver_1_1NetworkSolverStrategy" id="r_a1693dc93f63599c89587d729aca8e318"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1NetworkSolverStrategy.html#a1693dc93f63599c89587d729aca8e318">~NetworkSolverStrategy</a> ()=default</td></tr>
<tr class="memdesc:a1693dc93f63599c89587d729aca8e318 inherit pub_methods_classgridfire_1_1solver_1_1NetworkSolverStrategy"><td class="mdescLeft">&#160;</td><td class="mdescRight">Virtual destructor. <br /></td></tr>
<tr class="separator:a1693dc93f63599c89587d729aca8e318 inherit pub_methods_classgridfire_1_1solver_1_1NetworkSolverStrategy"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pri-methods" name="pri-methods"></a>
Private Member Functions</h2></td></tr>
<tr class="memitem:a460c2d19b468769770ec14e52684c0c8" id="r_a460c2d19b468769770ec14e52684c0c8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structgridfire_1_1solver_1_1CVODESolverStrategy_1_1CVODERHSOutputData.html">CVODERHSOutputData</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a460c2d19b468769770ec14e52684c0c8">calculate_rhs</a> (sunrealtype t, N_Vector y, N_Vector ydot, const <a class="el" href="structgridfire_1_1solver_1_1CVODESolverStrategy_1_1CVODEUserData.html">CVODEUserData</a> *data) const</td></tr>
<tr class="memdesc:a460c2d19b468769770ec14e52684c0c8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compute RHS into ydot at time t from the engine and current state y. <br /></td></tr>
<tr class="separator:a460c2d19b468769770ec14e52684c0c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afc6c55237df4af240c4c842305085d91" id="r_afc6c55237df4af240c4c842305085d91"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#afc6c55237df4af240c4c842305085d91">initialize_cvode_integration_resources</a> (uint64_t N, size_t numSpecies, double current_time, const fourdst::composition::Composition &amp;composition, double absTol, double relTol, double accumulatedEnergy)</td></tr>
<tr class="memdesc:afc6c55237df4af240c4c842305085d91"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocate and initialize CVODE vectors, linear algebra, tolerances, and constraints. <br /></td></tr>
<tr class="separator:afc6c55237df4af240c4c842305085d91"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7f6786780137de1a136e081c537a9667" id="r_a7f6786780137de1a136e081c537a9667"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a7f6786780137de1a136e081c537a9667">cleanup_cvode_resources</a> (bool memFree)</td></tr>
<tr class="memdesc:a7f6786780137de1a136e081c537a9667"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroy CVODE vectors/linear algebra and optionally the CVODE memory block. <br /></td></tr>
<tr class="separator:a7f6786780137de1a136e081c537a9667"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a91966d110ca6225af60b633af5521cb4" id="r_a91966d110ca6225af60b633af5521cb4"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a91966d110ca6225af60b633af5521cb4">set_detailed_step_logging</a> (bool enabled)</td></tr>
<tr class="separator:a91966d110ca6225af60b633af5521cb4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a351744e5fcb06ddaf8507358481cfb1e" id="r_a351744e5fcb06ddaf8507358481cfb1e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a351744e5fcb06ddaf8507358481cfb1e">log_step_diagnostics</a> (const <a class="el" href="structgridfire_1_1solver_1_1CVODESolverStrategy_1_1CVODEUserData.html">CVODEUserData</a> &amp;user_data, bool displayJacobianStiffness, bool displaySpeciesBalance, bool to_file, std::optional&lt; std::string &gt; filename) const</td></tr>
<tr class="memdesc:a351744e5fcb06ddaf8507358481cfb1e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compute and print per-component error ratios; run diagnostic helpers. <br /></td></tr>
<tr class="separator:a351744e5fcb06ddaf8507358481cfb1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pri-static-methods" name="pri-static-methods"></a>
Static Private Member Functions</h2></td></tr>
<tr class="memitem:a14c620ef75749c8ef3dfdb84132e5620" id="r_a14c620ef75749c8ef3dfdb84132e5620"><td class="memItemLeft" align="right" valign="top">static int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a14c620ef75749c8ef3dfdb84132e5620">cvode_rhs_wrapper</a> (sunrealtype t, N_Vector y, N_Vector ydot, void *user_data)</td></tr>
<tr class="memdesc:a14c620ef75749c8ef3dfdb84132e5620"><td class="mdescLeft">&#160;</td><td class="mdescRight">CVODE RHS C-wrapper that delegates to calculate_rhs and captures exceptions. <br /></td></tr>
<tr class="separator:a14c620ef75749c8ef3dfdb84132e5620"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae13fc9c21f595edbee1c9b7debaa61b3" id="r_ae13fc9c21f595edbee1c9b7debaa61b3"><td class="memItemLeft" align="right" valign="top">static int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#ae13fc9c21f595edbee1c9b7debaa61b3">cvode_jac_wrapper</a> (sunrealtype t, N_Vector y, N_Vector ydot, SUNMatrix J, void *user_data, N_Vector tmp1, N_Vector tmp2, N_Vector tmp3)</td></tr>
<tr class="memdesc:ae13fc9c21f595edbee1c9b7debaa61b3"><td class="mdescLeft">&#160;</td><td class="mdescRight">CVODE dense Jacobian C-wrapper that fills SUNDenseMatrix using the engine. <br /></td></tr>
<tr class="separator:ae13fc9c21f595edbee1c9b7debaa61b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pri-attribs" name="pri-attribs"></a>
Private Attributes</h2></td></tr>
<tr class="memitem:a202fe9e6499aac5f6813e036ee4ed2d5" id="r_a202fe9e6499aac5f6813e036ee4ed2d5"><td class="memItemLeft" align="right" valign="top">fourdst::config::Config &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a202fe9e6499aac5f6813e036ee4ed2d5">m_config</a> = fourdst::config::Config::getInstance()</td></tr>
<tr class="separator:a202fe9e6499aac5f6813e036ee4ed2d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5867eb99b00815b8b4f710cb48904dbe" id="r_a5867eb99b00815b8b4f710cb48904dbe"><td class="memItemLeft" align="right" valign="top">quill::Logger *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a5867eb99b00815b8b4f710cb48904dbe">m_logger</a> = fourdst::logging::LogManager::getInstance().getLogger(&quot;log&quot;)</td></tr>
<tr class="separator:a5867eb99b00815b8b4f710cb48904dbe"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac57a4f62d95d769c379470e680e6882d" id="r_ac57a4f62d95d769c379470e680e6882d"><td class="memItemLeft" align="right" valign="top">SUNContext&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#ac57a4f62d95d769c379470e680e6882d">m_sun_ctx</a> = nullptr</td></tr>
<tr class="memdesc:ac57a4f62d95d769c379470e680e6882d"><td class="mdescLeft">&#160;</td><td class="mdescRight">SUNDIALS context (lifetime of the solver). <br /></td></tr>
<tr class="separator:ac57a4f62d95d769c379470e680e6882d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab5a8fa55e36685cac50c1dbdd8dbfa57" id="r_ab5a8fa55e36685cac50c1dbdd8dbfa57"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#ab5a8fa55e36685cac50c1dbdd8dbfa57">m_cvode_mem</a> = nullptr</td></tr>
<tr class="memdesc:ab5a8fa55e36685cac50c1dbdd8dbfa57"><td class="mdescLeft">&#160;</td><td class="mdescRight">CVODE memory block. <br /></td></tr>
<tr class="separator:ab5a8fa55e36685cac50c1dbdd8dbfa57"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aae19c1ec467051404a7bf1d4c7066c22" id="r_aae19c1ec467051404a7bf1d4c7066c22"><td class="memItemLeft" align="right" valign="top">N_Vector&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#aae19c1ec467051404a7bf1d4c7066c22">m_Y</a> = nullptr</td></tr>
<tr class="memdesc:aae19c1ec467051404a7bf1d4c7066c22"><td class="mdescLeft">&#160;</td><td class="mdescRight">CVODE state vector (species + energy accumulator). <br /></td></tr>
<tr class="separator:aae19c1ec467051404a7bf1d4c7066c22"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0717afcde6fdb71b12490bbcadb5fdb4" id="r_a0717afcde6fdb71b12490bbcadb5fdb4"><td class="memItemLeft" align="right" valign="top">N_Vector&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a0717afcde6fdb71b12490bbcadb5fdb4">m_YErr</a> = nullptr</td></tr>
<tr class="memdesc:a0717afcde6fdb71b12490bbcadb5fdb4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Estimated local errors. <br /></td></tr>
<tr class="separator:a0717afcde6fdb71b12490bbcadb5fdb4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afd1053d0827512b6831ee15f14488c20" id="r_afd1053d0827512b6831ee15f14488c20"><td class="memItemLeft" align="right" valign="top">SUNMatrix&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#afd1053d0827512b6831ee15f14488c20">m_J</a> = nullptr</td></tr>
<tr class="memdesc:afd1053d0827512b6831ee15f14488c20"><td class="mdescLeft">&#160;</td><td class="mdescRight">Dense Jacobian matrix. <br /></td></tr>
<tr class="separator:afd1053d0827512b6831ee15f14488c20"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af4a2f003a4c4c06b4b72840f2d445f81" id="r_af4a2f003a4c4c06b4b72840f2d445f81"><td class="memItemLeft" align="right" valign="top">SUNLinearSolver&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#af4a2f003a4c4c06b4b72840f2d445f81">m_LS</a> = nullptr</td></tr>
<tr class="memdesc:af4a2f003a4c4c06b4b72840f2d445f81"><td class="mdescLeft">&#160;</td><td class="mdescRight">Dense linear solver. <br /></td></tr>
<tr class="separator:af4a2f003a4c4c06b4b72840f2d445f81"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa8fb7a0b39e6bb7b97a4a98422f06482" id="r_aa8fb7a0b39e6bb7b97a4a98422f06482"><td class="memItemLeft" align="right" valign="top">std::optional&lt; <a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a89c537c2f34ba3e202374304b7e5990a">TimestepCallback</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#aa8fb7a0b39e6bb7b97a4a98422f06482">m_callback</a></td></tr>
<tr class="memdesc:aa8fb7a0b39e6bb7b97a4a98422f06482"><td class="mdescLeft">&#160;</td><td class="mdescRight">Optional per-step callback. <br /></td></tr>
<tr class="separator:aa8fb7a0b39e6bb7b97a4a98422f06482"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab7495898e893640670f49308a105658f" id="r_ab7495898e893640670f49308a105658f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#ab7495898e893640670f49308a105658f">m_num_steps</a> = 0</td></tr>
<tr class="memdesc:ab7495898e893640670f49308a105658f"><td class="mdescLeft">&#160;</td><td class="mdescRight">CVODE step counter (used for diagnostics and triggers). <br /></td></tr>
<tr class="separator:ab7495898e893640670f49308a105658f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af3e470b5a6f982c107785c64b169a992" id="r_af3e470b5a6f982c107785c64b169a992"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#af3e470b5a6f982c107785c64b169a992">m_stdout_logging_enabled</a> = true</td></tr>
<tr class="memdesc:af3e470b5a6f982c107785c64b169a992"><td class="mdescLeft">&#160;</td><td class="mdescRight">If true, print per-step logs and use CV_ONE_STEP. <br /></td></tr>
<tr class="separator:af3e470b5a6f982c107785c64b169a992"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a50d8f309ca897fa83b16db0a1701b339" id="r_a50d8f309ca897fa83b16db0a1701b339"><td class="memItemLeft" align="right" valign="top">N_Vector&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a50d8f309ca897fa83b16db0a1701b339">m_constraints</a> = nullptr</td></tr>
<tr class="memdesc:a50d8f309ca897fa83b16db0a1701b339"><td class="mdescLeft">&#160;</td><td class="mdescRight">CVODE constraints vector (&gt;= 0 for species entries). <br /></td></tr>
<tr class="separator:a50d8f309ca897fa83b16db0a1701b339"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a421360b9908ea3e1d7c60a3fb51a2f75" id="r_a421360b9908ea3e1d7c60a3fb51a2f75"><td class="memItemLeft" align="right" valign="top">std::optional&lt; double &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a421360b9908ea3e1d7c60a3fb51a2f75">m_absTol</a></td></tr>
<tr class="memdesc:a421360b9908ea3e1d7c60a3fb51a2f75"><td class="mdescLeft">&#160;</td><td class="mdescRight">User-specified absolute tolerance. <br /></td></tr>
<tr class="separator:a421360b9908ea3e1d7c60a3fb51a2f75"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4f482b5e68023df9b7522b29dc79c764" id="r_a4f482b5e68023df9b7522b29dc79c764"><td class="memItemLeft" align="right" valign="top">std::optional&lt; double &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a4f482b5e68023df9b7522b29dc79c764">m_relTol</a></td></tr>
<tr class="memdesc:a4f482b5e68023df9b7522b29dc79c764"><td class="mdescLeft">&#160;</td><td class="mdescRight">User-specified relative tolerance. <br /></td></tr>
<tr class="separator:a4f482b5e68023df9b7522b29dc79c764"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6aed67c333c914551aee9b88fa0af584" id="r_a6aed67c333c914551aee9b88fa0af584"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a6aed67c333c914551aee9b88fa0af584">m_detailed_step_logging</a> = false</td></tr>
<tr class="memdesc:a6aed67c333c914551aee9b88fa0af584"><td class="mdescLeft">&#160;</td><td class="mdescRight">If true, log detailed step diagnostics (error ratios, Jacobian, species balance). <br /></td></tr>
<tr class="separator:a6aed67c333c914551aee9b88fa0af584"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="inherited" name="inherited"></a>
Additional Inherited Members</h2></td></tr>
<tr class="inherit_header pro_attribs_classgridfire_1_1solver_1_1NetworkSolverStrategy"><td colspan="2" onclick="javascript:toggleInherit('pro_attribs_classgridfire_1_1solver_1_1NetworkSolverStrategy')"><img src="closed.png" alt="-"/>&#160;Protected Attributes inherited from <a class="el" href="classgridfire_1_1solver_1_1NetworkSolverStrategy.html">gridfire::solver::NetworkSolverStrategy&lt; EngineT &gt;</a></td></tr>
<tr class="memitem:a724924d94eaf82b67d9988a55c3261e8 inherit pro_attribs_classgridfire_1_1solver_1_1NetworkSolverStrategy" id="r_a724924d94eaf82b67d9988a55c3261e8"><td class="memItemLeft" align="right" valign="top">EngineT &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classgridfire_1_1solver_1_1NetworkSolverStrategy.html#a724924d94eaf82b67d9988a55c3261e8">m_engine</a></td></tr>
<tr class="memdesc:a724924d94eaf82b67d9988a55c3261e8 inherit pro_attribs_classgridfire_1_1solver_1_1NetworkSolverStrategy"><td class="mdescLeft">&#160;</td><td class="mdescRight">The engine used by this solver strategy. <br /></td></tr>
<tr class="separator:a724924d94eaf82b67d9988a55c3261e8 inherit pro_attribs_classgridfire_1_1solver_1_1NetworkSolverStrategy"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Stiff ODE integrator backed by SUNDIALS CVODE (BDF) for network + energy. </p>
<p>Integrates the nuclear network abundances along with a final accumulator entry for specific energy using CVODE's BDF method and a dense linear solver. The state vector layout is: [y_0, y_1, ..., y_{N-1}, eps], where eps is the accumulated specific energy (erg/g).</p>
<p>Implementation summary:</p><ul>
<li>Creates a SUNContext and CVODE memory; initializes the state from a Composition.</li>
<li>Enforces non-negativity on species via CVodeSetConstraints (&gt;= 0 for all species slots).</li>
<li>Uses a user-provided DynamicEngine to compute RHS and to fill the dense Jacobian.</li>
<li>The Jacobian is assembled column-major into a SUNDenseMatrix; the energy row/column is currently set to zero (decoupled from abundances in the linearization).</li>
<li>An internal trigger can rebuild the engine/network; when triggered, CVODE resources are torn down and recreated with the new network size, preserving the energy accumulator.</li>
<li>The CVODE RHS wrapper captures exceptions::StaleEngineTrigger from the engine evaluation path as recoverable (return code 1) and stores a copy in user-data for the driver loop.</li>
</ul>
<dl class="section user"><dt>Example</dt><dd><div class="fragment"><div class="line"><span class="keyword">using </span><a class="code hl_class" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">gridfire::solver::CVODESolverStrategy</a>;</div>
<div class="line"><span class="keyword">using </span>gridfire::solver::NetIn;</div>
<div class="line"> </div>
<div class="line"><a class="code hl_class" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">CVODESolverStrategy</a> solver(engine);</div>
<div class="line"><a class="code hl_struct" href="structgridfire_1_1NetIn.html">NetIn</a> in;</div>
<div class="line">in.<a class="code hl_variable" href="structgridfire_1_1NetIn.html#a5be0f5195a5cd1dd177b9fc5ab83a7be">temperature</a> = 1.0e9; <span class="comment">// K</span></div>
<div class="line">in.<a class="code hl_variable" href="structgridfire_1_1NetIn.html#a06f0dff9f8927b7cf2da3004c8fa1577">density</a> = 1.0e6; <span class="comment">// g/cm^3</span></div>
<div class="line">in.<a class="code hl_variable" href="structgridfire_1_1NetIn.html#a0a8d820cfeaa92ee31f253795c57e0d1">tMax</a> = 1.0; <span class="comment">// s</span></div>
<div class="line">in.<a class="code hl_variable" href="structgridfire_1_1NetIn.html#a13058f4929e72c1187abbebcddb8aed1">composition</a> = initialComposition;</div>
<div class="line"><span class="keyword">auto</span> out = solver.evaluate(in);</div>
<div class="line">std::cout &lt;&lt; <span class="stringliteral">&quot;Final energy: &quot;</span> &lt;&lt; out.energy &lt;&lt; <span class="stringliteral">&quot; erg/g\n&quot;</span>;</div>
<div class="ttc" id="aclassgridfire_1_1solver_1_1CVODESolverStrategy_html"><div class="ttname"><a href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">gridfire::solver::CVODESolverStrategy</a></div><div class="ttdoc">Stiff ODE integrator backed by SUNDIALS CVODE (BDF) for network + energy.</div><div class="ttdef"><b>Definition</b> CVODE_solver_strategy.h:81</div></div>
<div class="ttc" id="astructgridfire_1_1NetIn_html"><div class="ttname"><a href="structgridfire_1_1NetIn.html">gridfire::NetIn</a></div><div class="ttdef"><b>Definition</b> types.h:27</div></div>
<div class="ttc" id="astructgridfire_1_1NetIn_html_a06f0dff9f8927b7cf2da3004c8fa1577"><div class="ttname"><a href="structgridfire_1_1NetIn.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> types.h:32</div></div>
<div class="ttc" id="astructgridfire_1_1NetIn_html_a0a8d820cfeaa92ee31f253795c57e0d1"><div class="ttname"><a href="structgridfire_1_1NetIn.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> types.h:29</div></div>
<div class="ttc" id="astructgridfire_1_1NetIn_html_a13058f4929e72c1187abbebcddb8aed1"><div class="ttname"><a href="structgridfire_1_1NetIn.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> types.h:28</div></div>
<div class="ttc" id="astructgridfire_1_1NetIn_html_a5be0f5195a5cd1dd177b9fc5ab83a7be"><div class="ttname"><a href="structgridfire_1_1NetIn.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> types.h:31</div></div>
</div><!-- fragment --> </dd></dl>
</div><h2 class="groupheader">Member Typedef Documentation</h2>
<a id="a89c537c2f34ba3e202374304b7e5990a" name="a89c537c2f34ba3e202374304b7e5990a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a89c537c2f34ba3e202374304b7e5990a">&#9670;&#160;</a></span>TimestepCallback</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">using <a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a89c537c2f34ba3e202374304b7e5990a">gridfire::solver::CVODESolverStrategy::TimestepCallback</a> = std::function&lt;void(const <a class="el" href="structgridfire_1_1solver_1_1CVODESolverStrategy_1_1TimestepContext.html">TimestepContext</a>&amp; context)&gt;</td>
</tr>
</table>
</div><div class="memdoc">
<p>Type alias for a timestep callback function. </p>
</div>
</div>
<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="a8beeb102d8e459cd133cd1bd5fb7e135" name="a8beeb102d8e459cd133cd1bd5fb7e135"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8beeb102d8e459cd133cd1bd5fb7e135">&#9670;&#160;</a></span>CVODESolverStrategy() <span class="overload">[1/3]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">gridfire::solver::CVODESolverStrategy::CVODESolverStrategy </td>
<td>(</td>
<td class="paramtype"><a class="el" href="classgridfire_1_1engine_1_1DynamicEngine.html">engine::DynamicEngine</a> &amp;&#160;</td>
<td class="paramname"><em>engine</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">explicit</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Construct the CVODE strategy and create a SUNDIALS context. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">engine</td><td>DynamicEngine used for RHS/Jacobian evaluation and network access. </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">std::runtime_error</td><td>If SUNContext_Create fails. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="aca2d01a907c3bb828f9f99ad05506578" name="aca2d01a907c3bb828f9f99ad05506578"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aca2d01a907c3bb828f9f99ad05506578">&#9670;&#160;</a></span>~CVODESolverStrategy()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">gridfire::solver::CVODESolverStrategy::~CVODESolverStrategy </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Destructor: cleans CVODE/SUNDIALS resources and frees SUNContext. </p>
</div>
</div>
<a id="a2fa56a2e7a63d31d2afa895a5e4fe827" name="a2fa56a2e7a63d31d2afa895a5e4fe827"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2fa56a2e7a63d31d2afa895a5e4fe827">&#9670;&#160;</a></span>CVODESolverStrategy() <span class="overload">[2/3]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">gridfire::solver::CVODESolverStrategy::CVODESolverStrategy </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">CVODESolverStrategy</a> &amp;&#160;</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">delete</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<a id="a1f007d68e808ba61f8425d0487432c0d" name="a1f007d68e808ba61f8425d0487432c0d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1f007d68e808ba61f8425d0487432c0d">&#9670;&#160;</a></span>CVODESolverStrategy() <span class="overload">[3/3]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">gridfire::solver::CVODESolverStrategy::CVODESolverStrategy </td>
<td>(</td>
<td class="paramtype"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">CVODESolverStrategy</a> &amp;&amp;&#160;</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">delete</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="a460c2d19b468769770ec14e52684c0c8" name="a460c2d19b468769770ec14e52684c0c8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a460c2d19b468769770ec14e52684c0c8">&#9670;&#160;</a></span>calculate_rhs()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structgridfire_1_1solver_1_1CVODESolverStrategy_1_1CVODERHSOutputData.html">CVODESolverStrategy::CVODERHSOutputData</a> gridfire::solver::CVODESolverStrategy::calculate_rhs </td>
<td>(</td>
<td class="paramtype">sunrealtype&#160;</td>
<td class="paramname"><em>t</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">N_Vector&#160;</td>
<td class="paramname"><em>y</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">N_Vector&#160;</td>
<td class="paramname"><em>ydot</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="structgridfire_1_1solver_1_1CVODESolverStrategy_1_1CVODEUserData.html">CVODEUserData</a> *&#160;</td>
<td class="paramname"><em>data</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Compute RHS into ydot at time t from the engine and current state y. </p>
<p>Converts the CVODE state to a Composition (mass fractions) and calls engine.calculateRHSAndEnergy(T9, rho). Negative small abundances are clamped to zero before constructing Composition. On stale engine, throws exceptions::StaleEngineTrigger. </p>
</div>
</div>
<a id="a7f6786780137de1a136e081c537a9667" name="a7f6786780137de1a136e081c537a9667"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7f6786780137de1a136e081c537a9667">&#9670;&#160;</a></span>cleanup_cvode_resources()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void gridfire::solver::CVODESolverStrategy::cleanup_cvode_resources </td>
<td>(</td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>memFree</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Destroy CVODE vectors/linear algebra and optionally the CVODE memory block. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">memFree</td><td>If true, also calls CVodeFree on m_cvode_mem. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="ae13fc9c21f595edbee1c9b7debaa61b3" name="ae13fc9c21f595edbee1c9b7debaa61b3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae13fc9c21f595edbee1c9b7debaa61b3">&#9670;&#160;</a></span>cvode_jac_wrapper()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">int gridfire::solver::CVODESolverStrategy::cvode_jac_wrapper </td>
<td>(</td>
<td class="paramtype">sunrealtype&#160;</td>
<td class="paramname"><em>t</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">N_Vector&#160;</td>
<td class="paramname"><em>y</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">N_Vector&#160;</td>
<td class="paramname"><em>ydot</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">SUNMatrix&#160;</td>
<td class="paramname"><em>J</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">void *&#160;</td>
<td class="paramname"><em>user_data</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">N_Vector&#160;</td>
<td class="paramname"><em>tmp1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">N_Vector&#160;</td>
<td class="paramname"><em>tmp2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">N_Vector&#160;</td>
<td class="paramname"><em>tmp3</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>CVODE dense Jacobian C-wrapper that fills SUNDenseMatrix using the engine. </p>
<p>Assembles J(i,j) = d(f_i)/d(y_j) for all species using engine-&gt;getJacobianMatrixEntry, then zeros the last row and column corresponding to the energy variable. </p>
</div>
</div>
<a id="a14c620ef75749c8ef3dfdb84132e5620" name="a14c620ef75749c8ef3dfdb84132e5620"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a14c620ef75749c8ef3dfdb84132e5620">&#9670;&#160;</a></span>cvode_rhs_wrapper()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">int gridfire::solver::CVODESolverStrategy::cvode_rhs_wrapper </td>
<td>(</td>
<td class="paramtype">sunrealtype&#160;</td>
<td class="paramname"><em>t</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">N_Vector&#160;</td>
<td class="paramname"><em>y</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">N_Vector&#160;</td>
<td class="paramname"><em>ydot</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">void *&#160;</td>
<td class="paramname"><em>user_data</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>CVODE RHS C-wrapper that delegates to calculate_rhs and captures exceptions. </p>
<dl class="section return"><dt>Returns</dt><dd>0 on success; 1 on recoverable StaleEngineTrigger; -1 on other failures. </dd></dl>
</div>
</div>
<a id="a5dfb7a2ce0008d41dee4aa596a4e1ce4" name="a5dfb7a2ce0008d41dee4aa596a4e1ce4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5dfb7a2ce0008d41dee4aa596a4e1ce4">&#9670;&#160;</a></span>describe_callback_context()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">std::vector&lt; std::tuple&lt; std::string, std::string &gt; &gt; gridfire::solver::CVODESolverStrategy::describe_callback_context </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Schema of fields exposed to the timestep callback context. </p>
<p>Implements <a class="el" href="classgridfire_1_1solver_1_1NetworkSolverStrategy.html#ae09169769774f17df8701c42a64ed656">gridfire::solver::NetworkSolverStrategy&lt; EngineT &gt;</a>.</p>
</div>
</div>
<a id="ab8224d205ea3a28d9c723631c2f00b53" name="ab8224d205ea3a28d9c723631c2f00b53"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab8224d205ea3a28d9c723631c2f00b53">&#9670;&#160;</a></span>evaluate() <span class="overload">[1/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structgridfire_1_1NetOut.html">NetOut</a> gridfire::solver::CVODESolverStrategy::evaluate </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="structgridfire_1_1NetIn.html">NetIn</a> &amp;&#160;</td>
<td class="paramname"><em>netIn</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Integrate from t=0 to netIn.tMax and return final composition and energy. </p>
<p>Implementation summary:</p><ul>
<li>Converts temperature to T9, initializes CVODE memory and state (size = numSpecies + 1).</li>
<li>Repeatedly calls CVode in single-step or normal mode depending on stdout logging.</li>
<li>Wraps RHS to capture exceptions::StaleEngineTrigger as a recoverable step failure; if present after a step, it is rethrown for upstream handling.</li>
<li>Prints/collects diagnostics per step (step size, energy, solver iterations).</li>
<li>On trigger activation, rebuilds CVODE resources to reflect a changed network and reinitialized the state using the latest engine composition, preserving energy.</li>
<li>At the end, converts molar abundances to mass fractions and assembles <a class="el" href="structgridfire_1_1NetOut.html">NetOut</a>, including derivatives of energy w.r.t. T and rho from the engine.</li>
</ul>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">netIn</td><td>Inputs: temperature [K], density [g cm^-3], tMax [s], composition. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd><a class="el" href="structgridfire_1_1NetOut.html">NetOut</a> containing final Composition, accumulated energy [erg/g], step count, and dEps/dT, dEps/dRho. </dd></dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">std::runtime_error</td><td>If any CVODE or SUNDIALS call fails (negative return codes), or if internal consistency checks fail during engine updates. </td></tr>
<tr><td class="paramname">exceptions::StaleEngineTrigger</td><td>Propagated if the engine signals a stale state during RHS evaluation (captured in the wrapper then rethrown here). </td></tr>
</table>
</dd>
</dl>
<p>Implements <a class="el" href="classgridfire_1_1solver_1_1NetworkSolverStrategy.html#ace539b0482db171845ff1bd38d76b70f">gridfire::solver::NetworkSolverStrategy&lt; EngineT &gt;</a>.</p>
</div>
</div>
<a id="a167e44c002243314aa58c84715490804" name="a167e44c002243314aa58c84715490804"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a167e44c002243314aa58c84715490804">&#9670;&#160;</a></span>evaluate() <span class="overload">[2/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structgridfire_1_1NetOut.html">NetOut</a> gridfire::solver::CVODESolverStrategy::evaluate </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="structgridfire_1_1NetIn.html">NetIn</a> &amp;&#160;</td>
<td class="paramname"><em>netIn</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>displayTrigger</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Call to evaluate which will let the user control if the trigger reasoning is displayed. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">netIn</td><td>Inputs: temperature [K], density [g cm^-3], tMax [s], composition. </td></tr>
<tr><td class="paramname">displayTrigger</td><td>Boolean flag to control if trigger reasoning is displayed </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd><a class="el" href="structgridfire_1_1NetOut.html">NetOut</a> containing final Composition, accumulated energy [erg/g], step count, and dEps/dT, dEps/dRho. </dd></dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">std::runtime_error</td><td>If any CVODE or SUNDIALS call fails (negative return codes), or if internal consistency checks fail during engine updates. </td></tr>
<tr><td class="paramname">exceptions::StaleEngineTrigger</td><td>Propagated if the engine signals a stale state during RHS evaluation (captured in the wrapper then rethrown here). </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="ae98bbc854c88cf4aecf93a9204958a4c" name="ae98bbc854c88cf4aecf93a9204958a4c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae98bbc854c88cf4aecf93a9204958a4c">&#9670;&#160;</a></span>get_absTol()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double gridfire::solver::CVODESolverStrategy::get_absTol </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<a id="a103273e838ea10f71a11705046f1f951" name="a103273e838ea10f71a11705046f1f951"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a103273e838ea10f71a11705046f1f951">&#9670;&#160;</a></span>get_relTol()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double gridfire::solver::CVODESolverStrategy::get_relTol </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<a id="a87b7b39e2a15cc30b118c8e6fda9a1a6" name="a87b7b39e2a15cc30b118c8e6fda9a1a6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a87b7b39e2a15cc30b118c8e6fda9a1a6">&#9670;&#160;</a></span>get_stdout_logging_enabled()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool gridfire::solver::CVODESolverStrategy::get_stdout_logging_enabled </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</div><div class="memdoc">
<p>Whether per-step logs are printed to stdout and CVode is stepped with CV_ONE_STEP. </p>
</div>
</div>
<a id="afc6c55237df4af240c4c842305085d91" name="afc6c55237df4af240c4c842305085d91"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afc6c55237df4af240c4c842305085d91">&#9670;&#160;</a></span>initialize_cvode_integration_resources()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void gridfire::solver::CVODESolverStrategy::initialize_cvode_integration_resources </td>
<td>(</td>
<td class="paramtype">uint64_t&#160;</td>
<td class="paramname"><em>N</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">size_t&#160;</td>
<td class="paramname"><em>numSpecies</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>current_time</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const fourdst::composition::Composition &amp;&#160;</td>
<td class="paramname"><em>composition</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>absTol</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>relTol</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>accumulatedEnergy</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Allocate and initialize CVODE vectors, linear algebra, tolerances, and constraints. </p>
<p>State vector m_Y is sized to N (numSpecies + 1). Species slots are initialized from Composition molar abundances when present, otherwise a tiny positive value; the last slot is set to accumulatedEnergy. Sets scalar tolerances, non-negativity constraints for species, maximum step size, creates a dense matrix and dense linear solver, and registers the Jacobian. </p>
</div>
</div>
<a id="a351744e5fcb06ddaf8507358481cfb1e" name="a351744e5fcb06ddaf8507358481cfb1e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a351744e5fcb06ddaf8507358481cfb1e">&#9670;&#160;</a></span>log_step_diagnostics()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void gridfire::solver::CVODESolverStrategy::log_step_diagnostics </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="structgridfire_1_1solver_1_1CVODESolverStrategy_1_1CVODEUserData.html">CVODEUserData</a> &amp;&#160;</td>
<td class="paramname"><em>user_data</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>displayJacobianStiffness</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>displaySpeciesBalance</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>to_file</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">std::optional&lt; std::string &gt;&#160;</td>
<td class="paramname"><em>filename</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Compute and print per-component error ratios; run diagnostic helpers. </p>
<p>Gathers CVODE's estimated local errors, converts the state to a Composition, and prints a sorted table of species with the highest error ratios; then invokes diagnostic routines to inspect Jacobian stiffness and species balance. </p>
</div>
</div>
<a id="af500df838024c82724eaf7fe1cb9b8e8" name="af500df838024c82724eaf7fe1cb9b8e8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af500df838024c82724eaf7fe1cb9b8e8">&#9670;&#160;</a></span>operator=() <span class="overload">[1/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">CVODESolverStrategy</a> &amp; gridfire::solver::CVODESolverStrategy::operator= </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">CVODESolverStrategy</a> &amp;&#160;</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">delete</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<a id="ad26879fafcee9ecb21cc7c5ac0db1692" name="ad26879fafcee9ecb21cc7c5ac0db1692"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad26879fafcee9ecb21cc7c5ac0db1692">&#9670;&#160;</a></span>operator=() <span class="overload">[2/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">CVODESolverStrategy</a> &amp; gridfire::solver::CVODESolverStrategy::operator= </td>
<td>(</td>
<td class="paramtype"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">CVODESolverStrategy</a> &amp;&amp;&#160;</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">delete</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<a id="aed8907852f77c15bb40d5a8e8f8af9b2" name="aed8907852f77c15bb40d5a8e8f8af9b2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aed8907852f77c15bb40d5a8e8f8af9b2">&#9670;&#160;</a></span>set_absTol()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void gridfire::solver::CVODESolverStrategy::set_absTol </td>
<td>(</td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>absTol</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<a id="a77638ef3d2279009e5a57bbd3f0eb63b" name="a77638ef3d2279009e5a57bbd3f0eb63b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a77638ef3d2279009e5a57bbd3f0eb63b">&#9670;&#160;</a></span>set_callback()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void gridfire::solver::CVODESolverStrategy::set_callback </td>
<td>(</td>
<td class="paramtype">const std::any &amp;&#160;</td>
<td class="paramname"><em>callback</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Install a timestep callback. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">callback</td><td>std::any containing TimestepCallback (std::function&lt;void(const TimestepContext&amp;)&gt;). </td></tr>
</table>
</dd>
</dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">std::bad_any_cast</td><td>If callback is not of the expected type. </td></tr>
</table>
</dd>
</dl>
<p>Implements <a class="el" href="classgridfire_1_1solver_1_1NetworkSolverStrategy.html#a4d97ee85933d5e5f90d4194bb021a1dc">gridfire::solver::NetworkSolverStrategy&lt; EngineT &gt;</a>.</p>
</div>
</div>
<a id="a91966d110ca6225af60b633af5521cb4" name="a91966d110ca6225af60b633af5521cb4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a91966d110ca6225af60b633af5521cb4">&#9670;&#160;</a></span>set_detailed_step_logging()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void gridfire::solver::CVODESolverStrategy::set_detailed_step_logging </td>
<td>(</td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>enabled</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<a id="a6444290be523ad9fa91fa57c1dd4b6a2" name="a6444290be523ad9fa91fa57c1dd4b6a2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6444290be523ad9fa91fa57c1dd4b6a2">&#9670;&#160;</a></span>set_relTol()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void gridfire::solver::CVODESolverStrategy::set_relTol </td>
<td>(</td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>relTol</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<a id="a9857665a1198e24aac6add02afc6e306" name="a9857665a1198e24aac6add02afc6e306"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9857665a1198e24aac6add02afc6e306">&#9670;&#160;</a></span>set_stdout_logging_enabled()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void gridfire::solver::CVODESolverStrategy::set_stdout_logging_enabled </td>
<td>(</td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>logging_enabled</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Enable/disable per-step stdout logging. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">logging_enabled</td><td>Flag to control if a timestep summary is written to standard output or not </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<h2 class="groupheader">Member Data Documentation</h2>
<a id="a421360b9908ea3e1d7c60a3fb51a2f75" name="a421360b9908ea3e1d7c60a3fb51a2f75"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a421360b9908ea3e1d7c60a3fb51a2f75">&#9670;&#160;</a></span>m_absTol</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">std::optional&lt;double&gt; gridfire::solver::CVODESolverStrategy::m_absTol</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>User-specified absolute tolerance. </p>
</div>
</div>
<a id="aa8fb7a0b39e6bb7b97a4a98422f06482" name="aa8fb7a0b39e6bb7b97a4a98422f06482"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa8fb7a0b39e6bb7b97a4a98422f06482">&#9670;&#160;</a></span>m_callback</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">std::optional&lt;<a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html#a89c537c2f34ba3e202374304b7e5990a">TimestepCallback</a>&gt; gridfire::solver::CVODESolverStrategy::m_callback</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Optional per-step callback. </p>
</div>
</div>
<a id="a202fe9e6499aac5f6813e036ee4ed2d5" name="a202fe9e6499aac5f6813e036ee4ed2d5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a202fe9e6499aac5f6813e036ee4ed2d5">&#9670;&#160;</a></span>m_config</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">fourdst::config::Config&amp; gridfire::solver::CVODESolverStrategy::m_config = fourdst::config::Config::getInstance()</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<a id="a50d8f309ca897fa83b16db0a1701b339" name="a50d8f309ca897fa83b16db0a1701b339"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a50d8f309ca897fa83b16db0a1701b339">&#9670;&#160;</a></span>m_constraints</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">N_Vector gridfire::solver::CVODESolverStrategy::m_constraints = nullptr</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>CVODE constraints vector (&gt;= 0 for species entries). </p>
</div>
</div>
<a id="ab5a8fa55e36685cac50c1dbdd8dbfa57" name="ab5a8fa55e36685cac50c1dbdd8dbfa57"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab5a8fa55e36685cac50c1dbdd8dbfa57">&#9670;&#160;</a></span>m_cvode_mem</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void* gridfire::solver::CVODESolverStrategy::m_cvode_mem = nullptr</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>CVODE memory block. </p>
</div>
</div>
<a id="a6aed67c333c914551aee9b88fa0af584" name="a6aed67c333c914551aee9b88fa0af584"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6aed67c333c914551aee9b88fa0af584">&#9670;&#160;</a></span>m_detailed_step_logging</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">bool gridfire::solver::CVODESolverStrategy::m_detailed_step_logging = false</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>If true, log detailed step diagnostics (error ratios, Jacobian, species balance). </p>
</div>
</div>
<a id="afd1053d0827512b6831ee15f14488c20" name="afd1053d0827512b6831ee15f14488c20"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afd1053d0827512b6831ee15f14488c20">&#9670;&#160;</a></span>m_J</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">SUNMatrix gridfire::solver::CVODESolverStrategy::m_J = nullptr</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Dense Jacobian matrix. </p>
</div>
</div>
<a id="a5867eb99b00815b8b4f710cb48904dbe" name="a5867eb99b00815b8b4f710cb48904dbe"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5867eb99b00815b8b4f710cb48904dbe">&#9670;&#160;</a></span>m_logger</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">quill::Logger* gridfire::solver::CVODESolverStrategy::m_logger = fourdst::logging::LogManager::getInstance().getLogger(&quot;log&quot;)</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<a id="af4a2f003a4c4c06b4b72840f2d445f81" name="af4a2f003a4c4c06b4b72840f2d445f81"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af4a2f003a4c4c06b4b72840f2d445f81">&#9670;&#160;</a></span>m_LS</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">SUNLinearSolver gridfire::solver::CVODESolverStrategy::m_LS = nullptr</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Dense linear solver. </p>
</div>
</div>
<a id="ab7495898e893640670f49308a105658f" name="ab7495898e893640670f49308a105658f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab7495898e893640670f49308a105658f">&#9670;&#160;</a></span>m_num_steps</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">int gridfire::solver::CVODESolverStrategy::m_num_steps = 0</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>CVODE step counter (used for diagnostics and triggers). </p>
</div>
</div>
<a id="a4f482b5e68023df9b7522b29dc79c764" name="a4f482b5e68023df9b7522b29dc79c764"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4f482b5e68023df9b7522b29dc79c764">&#9670;&#160;</a></span>m_relTol</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">std::optional&lt;double&gt; gridfire::solver::CVODESolverStrategy::m_relTol</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>User-specified relative tolerance. </p>
</div>
</div>
<a id="af3e470b5a6f982c107785c64b169a992" name="af3e470b5a6f982c107785c64b169a992"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af3e470b5a6f982c107785c64b169a992">&#9670;&#160;</a></span>m_stdout_logging_enabled</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">bool gridfire::solver::CVODESolverStrategy::m_stdout_logging_enabled = true</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>If true, print per-step logs and use CV_ONE_STEP. </p>
</div>
</div>
<a id="ac57a4f62d95d769c379470e680e6882d" name="ac57a4f62d95d769c379470e680e6882d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac57a4f62d95d769c379470e680e6882d">&#9670;&#160;</a></span>m_sun_ctx</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">SUNContext gridfire::solver::CVODESolverStrategy::m_sun_ctx = nullptr</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>SUNDIALS context (lifetime of the solver). </p>
</div>
</div>
<a id="aae19c1ec467051404a7bf1d4c7066c22" name="aae19c1ec467051404a7bf1d4c7066c22"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aae19c1ec467051404a7bf1d4c7066c22">&#9670;&#160;</a></span>m_Y</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">N_Vector gridfire::solver::CVODESolverStrategy::m_Y = nullptr</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>CVODE state vector (species + energy accumulator). </p>
</div>
</div>
<a id="a0717afcde6fdb71b12490bbcadb5fdb4" name="a0717afcde6fdb71b12490bbcadb5fdb4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0717afcde6fdb71b12490bbcadb5fdb4">&#9670;&#160;</a></span>m_YErr</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">N_Vector gridfire::solver::CVODESolverStrategy::m_YErr = nullptr</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Estimated local errors. </p>
</div>
</div>
<hr/>The documentation for this class was generated from the following files:<ul>
<li>src/include/gridfire/solver/strategies/<a class="el" href="CVODE__solver__strategy_8h.html">CVODE_solver_strategy.h</a></li>
<li>src/lib/solver/strategies/<a class="el" href="CVODE__solver__strategy_8cpp.html">CVODE_solver_strategy.cpp</a></li>
</ul>
</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="namespacegridfire.html">gridfire</a></li><li class="navelem"><a class="el" href="namespacegridfire_1_1solver.html">solver</a></li><li class="navelem"><a class="el" href="classgridfire_1_1solver_1_1CVODESolverStrategy.html">CVODESolverStrategy</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.9.8 </li>
</ul>
</div>
</body>
</html>