282 lines
22 KiB
HTML
282 lines
22 KiB
HTML
<!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">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
<meta name="generator" content="Doxygen 1.8.16"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>EPANET: Usage</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="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" />
|
|
</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 style="height: 56px;">
|
|
<td id="projectalign" style="padding-left: 0.5em;">
|
|
<div id="projectname">EPANET
|
|
 <span id="projectnumber">2.2.0</span>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<!-- end header part -->
|
|
<!-- Generated by Doxygen 1.8.16 -->
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|
/* @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:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
$(function() {
|
|
initMenu('',true,false,'search.php','Search');
|
|
$(document).ready(function() { init_search(); });
|
|
});
|
|
/* @license-end */</script>
|
|
<div id="main-nav"></div>
|
|
<!-- 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">
|
|
<iframe src="javascript:void(0)" frameborder="0"
|
|
name="MSearchResults" id="MSearchResults">
|
|
</iframe>
|
|
</div>
|
|
|
|
</div><!-- top -->
|
|
<div class="PageDoc"><div class="header">
|
|
<div class="headertitle">
|
|
<div class="title">Usage </div> </div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<div class="textblock"><p>The following topics briefly describe how to accomplish some basic tasks using the OWA-EPANET Toolkit in C/C++ code. See the <a class="el" href="_toolkit_examples.html">Examples</a> topic for code listings of complete applications of the Toolkit.</p>
|
|
<h1><a class="anchor" id="CreateProject"></a>
|
|
Creating a Project</h1>
|
|
<p>Before any use is made of the Toolkit, a project and its handle must be created. After all processing is completed the project should be deleted. See the code snippet below:</p>
|
|
<div class="fragment"><div class="line">EN_Project ph; <span class="comment">// a project handle</span></div>
|
|
<div class="line">EN_createproject(&ph);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="comment">// Call functions that perform desired analysis</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line">EN_deleteproject(ph);</div>
|
|
</div><!-- fragment --><h1><a class="anchor" id="DetectingErrors"></a>
|
|
Detecting Error Conditions</h1>
|
|
<p>All of the Toolkit functions return an error/warning code. A 0 indicates that the function ran successfully. A number greater than 0 but less than 100 indicates that a warning condition was generated while a number higher than 100 indicates that the function failed.</p>
|
|
<p>The meaning of specific error and warning codes are listed in the <a class="el" href="group___error_codes.html">Error Codes</a> and <a class="el" href="group___warning_codes.html">Warning Codes</a> sections of this guide. The Toolkit function EN_geterror can be used to obtain the text of a specific error/warning code. The following example uses a macro named <code>ERRCODE</code> along with a variable named <code>errcode</code> to execute Toolkit commands only if no fatal errors have already been detected:</p>
|
|
<div class="fragment"><div class="line"><span class="preprocessor">#define ERRCODE(x) (errcode = ((errcode > 100) ? (errcode) : (x)))</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="keywordtype">void</span> runHydraulics(EN_Project ph, <span class="keywordtype">char</span> *inputFile, <span class="keywordtype">char</span> *reportFile)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> <span class="keywordtype">int</span> errcode = 0;</div>
|
|
<div class="line"> <span class="keywordtype">char</span> errmsg[EN_MAXMSG + 1];</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> ERRCODE(EN_open(ph, inputFile, reportFile, <span class="stringliteral">""</span>));</div>
|
|
<div class="line"> ERRCODE(EN_solveH(ph));</div>
|
|
<div class="line"> ERRCODE(EN_saveH(ph));</div>
|
|
<div class="line"> ERRCODE(EN_report(ph));</div>
|
|
<div class="line"> EN_geterror(ph, errcode, errmsg);</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (errcode) printf(<span class="stringliteral">"\n%s\n"</span>, errmsg);</div>
|
|
<div class="line">}</div>
|
|
</div><!-- fragment --><h1><a class="anchor" id="NetworkData"></a>
|
|
Providing Network Data</h1>
|
|
<p>Once a project is created there are two ways in which it can be populated with data. The first is to use the EN_open function to load an EPANET-formatted <a class="el" href="_inp_file.html">Input File</a> that provides a description of the network to be analyzed. This function should be called immediately after a project is created. It takes as arguments the name of the input file to open and the names of a report file and a binary output file, both of which are optional. Here is a code sample showing this approach:</p>
|
|
<div class="fragment"><div class="line">EN_Project ph;</div>
|
|
<div class="line"><span class="keywordtype">int</span> errcode;</div>
|
|
<div class="line">EN_createproject(&ph);</div>
|
|
<div class="line">errcode = EN_open(ph, <span class="stringliteral">"net1.inp"</span>, <span class="stringliteral">"net1.rpt"</span>, <span class="stringliteral">""</span>);</div>
|
|
<div class="line"><span class="keywordflow">if</span> (errcode == 0)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> <span class="comment">// Call functions that perform desired analysis</span></div>
|
|
<div class="line">}</div>
|
|
<div class="line">EN_deleteproject(ph);</div>
|
|
</div><!-- fragment --><p>After an input file has been loaded in this fashion the resulting network can have objects added or deleted, and their properties set using the various Toolkit functions .</p>
|
|
<p>The second method for supplying network data to a project is to use the Toolkit's functions to add objects and to set their properties via code. In this case the EN_init function should be called immediately after creating a project, passing in the names of a report and binary output files (both optional) as well as the choices of flow units and head loss formulas to use. After that the various <b>EN_add</b> functions, such as EN_addnode, EN_addlink, EN_addpattern, EN_addcontrol, etc., can be called to add new objects to the network. Here is a partial example of constructing a network from code:</p>
|
|
<div class="fragment"><div class="line"><span class="keywordtype">int</span> index;</div>
|
|
<div class="line">EN_Project ph;</div>
|
|
<div class="line">EN_createproject(&ph);</div>
|
|
<div class="line">EN_init(ph, <span class="stringliteral">"net1.rpt"</span>, <span class="stringliteral">""</span>, EN_GPM, EN_HW);</div>
|
|
<div class="line">EN_addnode(ph, <span class="stringliteral">"J1"</span>, EN_JUNCTION, &index);</div>
|
|
<div class="line">EN_addnode(ph, <span class="stringliteral">"J2"</span>, EN_JUNCTION, &index);</div>
|
|
<div class="line">EN_addlink(ph, <span class="stringliteral">"P1"</span>, EN_PIPE, <span class="stringliteral">"J1"</span>, <span class="stringliteral">"J2"</span>, &index);</div>
|
|
<div class="line"><span class="comment">// additional function calls to complete building the network</span></div>
|
|
</div><!-- fragment --><p>See the <a class="el" href="_example2.html">Network Building Example</a> for a more complete example. The labels used to name objects cannot contain spaces, semi-colons, or double quotes nor exceed EN_MAXID characters in length. While adding objects their properties can be set as described in the next section. Attemtping to change a network's structure by adding or deleting nodes and links while the Toolkit's hydraulic or water quality solvers are open will result in an error condition.</p>
|
|
<h1><a class="anchor" id="Properties"></a>
|
|
Setting Object Properties</h1>
|
|
<p>The Toolkit contains several functions for retrieving and setting the properties of a network's objects and its analysis options. The names of retrieval functions all begin with <b>EN_get</b> (e.g., EN_getnodevalue, EN_getoption, etc.) while the functions used for setting parameter values begin with <b>EN_set</b> (e.g., EN_setnodevalue, EN_setoption, etc.).</p>
|
|
<p>Most of these functions use an index number to refer to a specific network component (such as a node, link, time pattern or data curve). This number is simply the position of the component in the list of all components of similar type (e.g., node 10 is the tenth node, starting from 1, in the network) and is not the same as the ID label assigned to the component. A series of functions exist to determine a component's index number given its ID label (see EN_getnodeindex, EN_getlinkindex, EN_getpatternindex, and EN_getcurveindex). Likewise, functions exist to retrieve a component's ID label given its index number (see EN_getlinkid, EN_getnodeid, EN_getpatternid, and EN_getcurveid). The EN_getcount function can be used to determine the number of different components in the network. Be aware that a component's index can change as elements are added or deleted from the network. The EN_addnode and EN_addlink functions return the index of the newly added node or link as a convenience for immediately setting their properties.</p>
|
|
<p>The code below is an example of using the property retrieval and setting functions. It changes all links with diameter of 10 inches to 12 inches.</p>
|
|
<div class="fragment"><div class="line"><span class="keywordtype">void</span> changeDiameters(EN_Project ph)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> <span class="keywordtype">int</span> i, nLinks;</div>
|
|
<div class="line"> <span class="keywordtype">double</span> diam;</div>
|
|
<div class="line"> EN_getcount(ph, EN_LINKCOUNT, &nLinks);</div>
|
|
<div class="line"> <span class="keywordflow">for</span> (i = 1; i <= nLinks; i++)</div>
|
|
<div class="line"> {</div>
|
|
<div class="line"> EN_getlinkvalue(ph, i, EN_DIAMETER, &diam);</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (diam == 10) EN_setlinkvalue(ph, i, EN_DIAMETER, 12);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
</div><!-- fragment --><h1><a class="anchor" id="hydraulics"></a>
|
|
Computing Hydraulics</h1>
|
|
<p>There are two ways to use the Toolkit to run a hydraulic analysis:</p><ol type="1">
|
|
<li>Use the EN_solveH function to run a complete extended period analysis, without having access to intermediate results.</li>
|
|
<li>Use the EN_openH - EN_initH - EN_runH - EN_nextH - EN_closeH series of functions to step through the simulation one hydraulic time step at a time.</li>
|
|
</ol>
|
|
<p>Method 1 is useful if you only want to run a single hydraulic analysis, perhaps to provide input to a water quality analysis. With this method hydraulic results are always saved to an intermediate hydraulics file at every time step.</p>
|
|
<p>Method 2 must be used if you need to access results between time steps or if you wish to run many analyses efficiently. To accomplish the latter, you would make only one call to <b>EN_openH</b> to begin the process, then make successive calls to <b>EN_initH - EN_runH - EN_nextH</b> to perform each analysis, and finally call <b>EN_closeH</b> to close down the hydraulics system. An example of this is shown below (calls to <b>EN_nextH</b> are not needed because we are only making a single period analysis in this example).</p>
|
|
<div class="fragment"><div class="line"><span class="keywordtype">void</span> runHydraulics(EN_Project ph, <span class="keywordtype">int</span> nRuns)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> <span class="keywordtype">int</span> i;</div>
|
|
<div class="line"> <span class="keywordtype">long</span> t;</div>
|
|
<div class="line"> EN_openH(ph);</div>
|
|
<div class="line"> <span class="keywordflow">for</span> (i = 1; i <= nRuns; i++)</div>
|
|
<div class="line"> {</div>
|
|
<div class="line"> <span class="comment">// user-supplied function to set parameters</span></div>
|
|
<div class="line"> setparams(ph, i);</div>
|
|
<div class="line"> <span class="comment">// initialize hydraulics; don't save them to file</span></div>
|
|
<div class="line"> EN_initH(ph, EN_NOSAVE);</div>
|
|
<div class="line"> <span class="comment">// solve hydraulics</span></div>
|
|
<div class="line"> EN_runH(ph, &t);</div>
|
|
<div class="line"> <span class="comment">// user-supplied function to process results</span></div>
|
|
<div class="line"> getresults(ph, i);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> EN_closeH(ph);</div>
|
|
<div class="line">}</div>
|
|
</div><!-- fragment --><h1><a class="anchor" id="quality"></a>
|
|
Computing Water Quality</h1>
|
|
<p>As with a hydraulic analysis, there are two ways to carry out a water quality analysis:</p>
|
|
<ol type="1">
|
|
<li>Use the EN_solveQ function to run a complete extended period analysis, without having access to intermediate results. A complete set of hydraulic results must have been generated either from running a hydraulic analysis or from importing a saved hydraulics file from a previous run.</li>
|
|
<li>Use the EN_openQ - EN_initQ - EN_runQ - EN_nextQ - EN_closeQ series of functions to step through the simulation one hydraulic time step at a time. (Replacing EN_nextQ with EN_stepQ will step through one water quality time step at a time.)</li>
|
|
</ol>
|
|
<p>The second option can either be carried out after a hydraulic analysis has been run or simultaneously as hydraulics are being computed. Example code for these two alternatives is shown below:</p>
|
|
<div class="fragment"><div class="line"><span class="keywordtype">int</span> runSequentialQuality(EN_Project ph)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> <span class="keywordtype">int</span> err;</div>
|
|
<div class="line"> <span class="keywordtype">long</span> t, tStep;</div>
|
|
<div class="line"> err = EN_solveH(ph);</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (err > 100) <span class="keywordflow">return</span> err;</div>
|
|
<div class="line"> EN_openQ(ph);</div>
|
|
<div class="line"> EN_initQ(ph, EN_NOSAVE);</div>
|
|
<div class="line"> <span class="keywordflow">do</span> {</div>
|
|
<div class="line"> EN_runQ(ph, &t);</div>
|
|
<div class="line"> <span class="comment">// Access quality results for time t here</span></div>
|
|
<div class="line"> EN_nextQ(ph, &tStep);</div>
|
|
<div class="line"> } <span class="keywordflow">while</span> (tStep > 0);</div>
|
|
<div class="line"> EN_closeQ(ph);</div>
|
|
<div class="line"> <span class="keywordflow">return</span> 0;</div>
|
|
<div class="line">}</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="keywordtype">int</span> runConcurrentQuality(EN_Project ph)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> <span class="keywordtype">int</span> err = 0;</div>
|
|
<div class="line"> <span class="keywordtype">long</span> t, tStep;</div>
|
|
<div class="line"> EN_openH(ph);</div>
|
|
<div class="line"> EN_initH(ph, EN_NOSAVE);</div>
|
|
<div class="line"> EN_openQ(ph);</div>
|
|
<div class="line"> EN_initQ(ph, EN_NOSAVE);</div>
|
|
<div class="line"> <span class="keywordflow">do</span> {</div>
|
|
<div class="line"> err = EN_runH(ph, &t);</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (err > 100) <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> EN_runQ(ph, &t);</div>
|
|
<div class="line"> <span class="comment">// Access hydraulic & quality results for time t here</span></div>
|
|
<div class="line"> EN_nextH(ph, &tStep);</div>
|
|
<div class="line"> EN_nextQ(ph, &tStep);</div>
|
|
<div class="line"> } <span class="keywordflow">while</span> (tStep > 0);</div>
|
|
<div class="line"> EN_closeH(ph);</div>
|
|
<div class="line"> EN_closeQ(ph);</div>
|
|
<div class="line"> <span class="keywordflow">return</span> err;</div>
|
|
<div class="line">}</div>
|
|
</div><!-- fragment --><h1><a class="anchor" id="results"></a>
|
|
Retrieving Computed Results</h1>
|
|
<p>The EN_getnodevalue and EN_getlinkvalue functions can also be used to retrieve the results of hydraulic and water quality simulations. The computed parameters (and their Toolkit codes) that can be retrieved are as follows: </p><table class="markdownTable">
|
|
<tr class="markdownTableHead">
|
|
<th class="markdownTableHeadNone">For Nodes: </th><th class="markdownTableHeadNone">For Links: </th></tr>
|
|
<tr class="markdownTableRowOdd">
|
|
<td class="markdownTableBodyNone"><b>EN_DEMAND</b> (demand) </td><td class="markdownTableBodyNone"><b>EN_FLOW</b> (flow rate) </td></tr>
|
|
<tr class="markdownTableRowEven">
|
|
<td class="markdownTableBodyNone"><b>EN_DEMANDDEFICIT</b> (demand deficit) </td><td class="markdownTableBodyNone"><b>EN_VELOCITY</b> (flow velocity) </td></tr>
|
|
<tr class="markdownTableRowOdd">
|
|
<td class="markdownTableBodyNone"><b>EN_HEAD</b> (hydraulic head) </td><td class="markdownTableBodyNone"><b>EN_HEADLOSS</b> (head loss) </td></tr>
|
|
<tr class="markdownTableRowEven">
|
|
<td class="markdownTableBodyNone"><b>EN_PRESSURE</b> (pressure) </td><td class="markdownTableBodyNone"><b>EN_STATUS</b> (link status) </td></tr>
|
|
<tr class="markdownTableRowOdd">
|
|
<td class="markdownTableBodyNone"><b>EN_TANKLEVEL</b> (tank water level) </td><td class="markdownTableBodyNone"><b>EN_SETTING</b> (pump speed or valve setting) </td></tr>
|
|
<tr class="markdownTableRowEven">
|
|
<td class="markdownTableBodyNone"><b>EN_TANKVOLUME</b> (tank water volume) </td><td class="markdownTableBodyNone"><b>EN_ENERGY</b> (pump energy usage) </td></tr>
|
|
<tr class="markdownTableRowOdd">
|
|
<td class="markdownTableBodyNone"><b>EN_QUALITY</b> (water quality) </td><td class="markdownTableBodyNone"><b>EN_PUMP_EFFIC</b> (pump efficiency) </td></tr>
|
|
<tr class="markdownTableRowEven">
|
|
<td class="markdownTableBodyNone"><b>EN_SOURCEMASS</b> (source mass inflow) </td><td class="markdownTableBodyNone"></td></tr>
|
|
</table>
|
|
<p>The following code shows how to retrieve the pressure at each node of a network after each time step of a hydraulic analysis (<code>writetofile</code> is a user-defined function that will write a record to a file): </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> getPressures(EN_Project ph)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> <span class="keywordtype">int</span> i, numNodes;</div>
|
|
<div class="line"> <span class="keywordtype">long</span> t, tStep;</div>
|
|
<div class="line"> <span class="keywordtype">double</span> p;</div>
|
|
<div class="line"> <span class="keywordtype">char</span> <span class="keywordtype">id</span>[EN_MAXID + 1];</div>
|
|
<div class="line"> EN_getcount(ph, EN_NODECOUNT, &numNodes);</div>
|
|
<div class="line"> EN_openH(ph);</div>
|
|
<div class="line"> EN_initH(ph, EN_NOSAVE);</div>
|
|
<div class="line"> <span class="keywordflow">do</span> {</div>
|
|
<div class="line"> EN_runH(ph, &t);</div>
|
|
<div class="line"> <span class="keywordflow">for</span> (i = 1; i <= NumNodes; i++) {</div>
|
|
<div class="line"> EN_getnodevalue(ph, i, EN_PRESSURE, &p);</div>
|
|
<div class="line"> EN_getnodeid(ph, i, <span class="keywordtype">id</span>);</div>
|
|
<div class="line"> writetofile(t, <span class="keywordtype">id</span>, p);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> EN_nextH(&tStep);</div>
|
|
<div class="line"> } <span class="keywordflow">while</span> (tStep > 0);</div>
|
|
<div class="line"> EN_closeH(ph);</div>
|
|
<div class="line">}</div>
|
|
</div><!-- fragment --><h1><a class="anchor" id="report"></a>
|
|
Producing a Report</h1>
|
|
<p>The Toolkit has some built-in capabilities to produce formatted output results saved to a file. More specialized reporting needs can always be handled by writing custom code.</p>
|
|
<p>The EN_setreport function is used to define the format of a report while the EN_report function actually writes the report. The latter should be called only after a hydraulic or water quality analysis has been made. An example of creating a report that lists all nodes where the pressure variation over the duration of the simulation exceeds 20 psi is shown below:</p>
|
|
<div class="fragment"><div class="line"><span class="keywordtype">void</span> reportPressureVariation(EN_Project ph)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> <span class="comment">// Compute ranges (max - min)</span></div>
|
|
<div class="line"> EN_settimeparam(ph, EN_STATISTIC, EN_RANGE);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">// Solve and save hydraulics</span></div>
|
|
<div class="line"> EN_solveH(ph);</div>
|
|
<div class="line"> EN_saveH(ph);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">// Define contents of the report</span></div>
|
|
<div class="line"> EN_resetreport(ph);</div>
|
|
<div class="line"> EN_setreport(ph, <span class="stringliteral">"FILE myfile.rpt"</span>);</div>
|
|
<div class="line"> EN_setreport(ph, <span class="stringliteral">"NODES ALL"</span>);</div>
|
|
<div class="line"> EN_setreport(ph, <span class="stringliteral">"PRESSURE PRECISION 1"</span>);</div>
|
|
<div class="line"> EN_setreport(ph, <span class="stringliteral">"PRESSURE ABOVE 20"</span>);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">// Write the report to file</span></div>
|
|
<div class="line"> EN_report(ph);</div>
|
|
<div class="line">}</div>
|
|
</div><!-- fragment --> </div></div><!-- contents -->
|
|
</div><!-- PageDoc -->
|
|
<!-- start footer part -->
|
|
<hr class="footer"/><address class="footer"><small>
|
|
Generated by  <a href="http://www.doxygen.org/index.html">
|
|
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
</a> 1.8.16
|
|
</small></address>
|
|
</body>
|
|
</html>
|