Merge pull request #1 from tboudreaux/feature/kelvin

Generation of vacuum regions
This commit is contained in:
2026-03-20 13:05:33 -04:00
committed by GitHub
92 changed files with 1592 additions and 306 deletions

View File

@@ -48,7 +48,7 @@ PROJECT_NAME = stroid
# could be handy for archiving the generated documentation or if some version
# control system is used.
PROJECT_NUMBER = v0.1.0
PROJECT_NUMBER = v0.2.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewers a

View File

@@ -2,9 +2,14 @@
core_steepness = 1.0
flattening = 0.0
include_external_domain = false
inf_bdr_id = 2
order = 3
r_core = 1.5
r_infinity = 6.0
r_instability = 1e-14
r_star = 5.0
refinement_levels = 4
surface_bdr_id = 1
core_id = 1
envelope_id = 2
vacuum_id = 3

View File

@@ -2,9 +2,14 @@
core_steepness = 1.0
flattening = 0.0
include_external_domain = true
inf_bdr_id = 2
order = 3
r_core = 1.5
r_infinity = 6.0
r_instability = 1e-14
r_star = 5.0
refinement_levels = 4
surface_bdr_id = 1
core_id = 1
envelope_id = 2
vacuum_id = 3

View File

@@ -0,0 +1,16 @@
[main]
core_steepness = 1.0
flattening = 0.0
include_external_domain = true
inf_bdr_id = 2
order = 3
r_core = 1.5
r_infinity = 6.0
r_instability = 1e-14
r_star = 5.0
refinement_levels = 1
surface_bdr_id = 1
core_id = 1
envelope_id = 2
vacuum_id = 3

View File

@@ -2,9 +2,14 @@
core_steepness = 1.0
flattening = 0.2
include_external_domain = false
inf_bdr_id = 2
order = 3
r_core = 1.5
r_infinity = 6.0
r_instability = 1e-14
r_star = 5.0
refinement_levels = 4
surface_bdr_id = 1
core_id = 1
envelope_id = 2
vacuum_id = 3

View File

@@ -0,0 +1,16 @@
[main]
core_steepness = 1.0
flattening = 0.0
include_external_domain = false
inf_bdr_id = 2
order = 3
r_core = 1.5
r_infinity = 6.0
r_instability = 1e-14
r_star = 5.0
refinement_levels = 2
surface_bdr_id = 1
core_id = 1
envelope_id = 2
vacuum_id = 3

View File

@@ -0,0 +1,16 @@
[main]
refinement_levels = 2
order = 3
include_external_domain = false
r_core = 1.5
r_star = 5.0
flattening = 0.08
r_infinity = 6.0
r_instability = 1e-14
core_steepness = 1.0
surface_bdr_id = 1
inf_bdr_id = 2
core_id = 1
envelope_id = 2
vacuum_id = 3

View File

@@ -0,0 +1,16 @@
[main]
refinement_levels = 2
order = 3
include_external_domain = false
r_core = 1.5
r_star = 5.0
flattening = 0.0
r_infinity = 6.0
r_instability = 1e-14
core_steepness = 1.0
surface_bdr_id = 1
inf_bdr_id = 2
core_id = 1
envelope_id = 2
vacuum_id = 3

View File

@@ -0,0 +1,16 @@
[main]
refinement_levels = 2
order = 3
include_external_domain = true
r_core = 1.5
r_star = 5.0
flattening = 0.0
r_infinity = 6.0
r_instability = 1e-14
core_steepness = 1.0
surface_bdr_id = 1
inf_bdr_id = 2
core_id = 1
envelope_id = 2
vacuum_id = 3

View File

@@ -0,0 +1,16 @@
[main]
refinement_levels = 2
order = 3
include_external_domain = true
r_core = 1.5
r_star = 5.0
flattening = 0.08
r_infinity = 6.0
r_instability = 1e-14
core_steepness = 1.0
surface_bdr_id = 1
inf_bdr_id = 2
core_id = 1
envelope_id = 2
vacuum_id = 3

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>
@@ -111,10 +111,11 @@ $(function(){initNavTree('curvilinear_8cpp.html',''); initResizable(true); });
<code>#include &quot;<a class="el" href="mapping_8h.html">stroid/topology/mapping.h</a>&quot;</code><br />
<code>#include &lt;iostream&gt;</code><br />
<code>#include &lt;memory&gt;</code><br />
<code>#include &lt;sys/proc.h&gt;</code><br />
</div><div class="textblock"><div class="dynheader">
Include dependency graph for curvilinear.cpp:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="curvilinear_8cpp__incl.svg" width="575" height="184"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div>
<div class="center"><div class="zoom"><iframe scrolling="no" frameborder="0" src="curvilinear_8cpp__incl.svg" width="100%" height="438"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div></div>
</div>
</div><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>

View File

@@ -1,20 +1,22 @@
<map id="src/lib/topology/curvilinear.cpp" name="src/lib/topology/curvilinear.cpp">
<area shape="rect" id="Node000001" title=" " alt="" coords="271,5,467,31"/>
<area shape="rect" id="Node000002" href="$curvilinear_8h.html" title=" " alt="" coords="9,79,188,105"/>
<area shape="poly" id="edge1_Node000001_Node000002" title=" " alt="" coords="324,34,160,77,159,72,322,29"/>
<area shape="rect" id="Node000006" href="$mapping_8h.html" title=" " alt="" coords="212,79,382,105"/>
<area shape="poly" id="edge5_Node000001_Node000006" title=" " alt="" coords="359,33,322,70,318,66,355,29"/>
<area shape="rect" id="Node000007" title=" " alt="" coords="407,79,478,105"/>
<area shape="poly" id="edge9_Node000001_Node000007" title=" " alt="" coords="383,29,421,66,417,70,379,33"/>
<area shape="rect" id="Node000008" title=" " alt="" coords="502,79,570,105"/>
<area shape="poly" id="edge10_Node000001_Node000008" title=" " alt="" coords="398,29,494,70,492,75,396,34"/>
<area shape="rect" id="Node000001" title=" " alt="" coords="348,5,544,31"/>
<area shape="rect" id="Node000002" href="$curvilinear_8h.html" title=" " alt="" coords="207,79,387,105"/>
<area shape="poly" id="edge1_Node000001_Node000002" title=" " alt="" coords="424,31,337,74,335,69,418,32"/>
<area shape="rect" id="Node000006" href="$mapping_8h.html" title=" " alt="" coords="13,79,184,105"/>
<area shape="poly" id="edge5_Node000001_Node000006" title=" " alt="" coords="386,34,173,78,172,73,388,29"/>
<area shape="rect" id="Node000007" title=" " alt="" coords="411,79,482,105"/>
<area shape="poly" id="edge9_Node000001_Node000007" title=" " alt="" coords="448,29,449,65,444,62,445,33"/>
<area shape="rect" id="Node000008" title=" " alt="" coords="506,79,574,105"/>
<area shape="poly" id="edge10_Node000001_Node000008" title=" " alt="" coords="463,29,515,70,509,69,461,34"/>
<area shape="rect" id="Node000009" title=" " alt="" coords="598,79,681,105"/>
<area shape="poly" id="edge11_Node000001_Node000009" title=" " alt="" coords="479,29,595,73,590,73,479,34"/>
<area shape="rect" id="Node000003" title=" " alt="" coords="5,153,85,178"/>
<area shape="poly" id="edge2_Node000002_Node000003" title=" " alt="" coords="92,106,65,142,61,138,87,103"/>
<area shape="poly" id="edge2_Node000002_Node000003" title=" " alt="" coords="255,108,100,151,99,146,254,103"/>
<area shape="rect" id="Node000004" href="$config_8h.html" title=" " alt="" coords="108,153,251,178"/>
<area shape="poly" id="edge3_Node000002_Node000004" title=" " alt="" coords="114,103,156,140,153,144,110,107"/>
<area shape="poly" id="edge3_Node000002_Node000004" title=" " alt="" coords="280,105,214,147,211,142,275,106"/>
<area shape="rect" id="Node000005" title=" " alt="" coords="275,153,426,178"/>
<area shape="poly" id="edge4_Node000002_Node000005" title=" " alt="" coords="142,103,294,145,292,151,140,108"/>
<area shape="poly" id="edge6_Node000006_Node000003" title=" " alt="" coords="255,108,100,151,99,146,254,103"/>
<area shape="poly" id="edge7_Node000006_Node000004" title=" " alt="" coords="278,107,214,147,211,142,276,103"/>
<area shape="poly" id="edge8_Node000006_Node000005" title=" " alt="" coords="308,103,334,138,330,142,304,106"/>
<area shape="poly" id="edge4_Node000002_Node000005" title=" " alt="" coords="307,102,335,141,330,139,305,107"/>
<area shape="poly" id="edge6_Node000006_Node000003" title=" " alt="" coords="92,104,65,142,61,138,87,106"/>
<area shape="poly" id="edge7_Node000006_Node000004" title=" " alt="" coords="113,103,157,142,152,143,111,108"/>
<area shape="poly" id="edge8_Node000006_Node000005" title=" " alt="" coords="141,103,295,146,291,150,141,108"/>
</map>

View File

@@ -1 +1 @@
b8eef4875e081be998fbcbc84a3978b1
6950d4e2891a4c4f47ed638d27c5bf68

View File

@@ -1,13 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 13.0.1 (20250615.1724)
<!-- Generated by graphviz version 14.1.2 (20260124.0452)
-->
<!-- Title: src/lib/topology/curvilinear.cpp Pages: 1 -->
<svg width="431pt" height="138pt"
viewBox="0.00 0.00 431.00 138.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!--zoomable 138 -->
<svg id="main" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve">
<svg id="main" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" onload="init(evt)">
<style type="text/css"><![CDATA[
.node, .edge {opacity: 0.7;}
@@ -15,16 +14,53 @@
.edge:hover path { stroke: red; }
.edge:hover polygon { stroke: red; fill: red; }
]]></style>
<defs>
<circle id="rim" cx="0" cy="0" r="7"/>
<circle id="rim2" cx="0" cy="0" r="3.5"/>
<g id="zoomPlus">
<use xlink:href="#rim" fill="#404040"><set attributeName="fill" to="#808080" begin="zoomplus.mouseover" end="zoomplus.mouseout"/></use>
<path d="M-4,0h8M0,-4v8" fill="none" stroke="white" stroke-width="1.5" pointer-events="none"/>
</g>
<g id="zoomMin">
<use xlink:href="#rim" fill="#404040"><set attributeName="fill" to="#808080" begin="zoomminus.mouseover" end="zoomminus.mouseout"/></use>
<path d="M-4,0h8" fill="none" stroke="white" stroke-width="1.5" pointer-events="none"/>
</g>
<g id="arrowUp" transform="translate(30 24)">
<use xlink:href="#rim"/>
<path pointer-events="none" fill="none" stroke="white" stroke-width="1.5" d="M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5"/>
</g>
<g id="arrowRight" transform="rotate(90) translate(36 -43)">
<use xlink:href="#rim"/>
<path pointer-events="none" fill="none" stroke="white" stroke-width="1.5" d="M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5"/>
</g>
<g id="arrowDown" transform="rotate(180) translate(-30 -48)">
<use xlink:href="#rim"/>
<path pointer-events="none" fill="none" stroke="white" stroke-width="1.5" d="M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5"/>
</g>
<g id="arrowLeft" transform="rotate(270) translate(-36 17)">
<use xlink:href="#rim"/>
<path pointer-events="none" fill="none" stroke="white" stroke-width="1.5" d="M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5"/>
</g>
<g id="resetDef">
<use xlink:href="#rim2" fill="#404040"><set attributeName="fill" to="#808080" begin="reset.mouseover" end="reset.mouseout"/></use>
</g>
</defs>
<script type="application/ecmascript">
var viewWidth = 515;
var viewHeight = 138;
var sectionId = 'dynsection-0';
</script>
<script type="application/ecmascript" xlink:href="svg.min.js"/>
<svg id="graph" class="graph">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 133.75)">
<g id="viewport">
<title>src/lib/topology/curvilinear.cpp</title>
<!-- Node1 -->
<g id="Node000001" class="node">
<title>Node1</title>
<g id="a_Node000001"><a xlink:title=" ">
<polygon fill="#999999" stroke="#666666" points="346.38,-129.75 199.12,-129.75 199.12,-110.5 346.38,-110.5 346.38,-129.75"/>
<text xml:space="preserve" text-anchor="middle" x="272.75" y="-116.25" font-family="Helvetica,sans-Serif" font-size="10.00">src/lib/topology/curvilinear.cpp</text>
<polygon fill="#999999" stroke="#666666" points="404.38,-129.75 257.12,-129.75 257.12,-110.5 404.38,-110.5 404.38,-129.75"/>
<text xml:space="preserve" text-anchor="middle" x="330.75" y="-116.25" font-family="Helvetica,sans-Serif" font-size="10.00">src/lib/topology/curvilinear.cpp</text>
</a>
</g>
</g>
@@ -32,8 +68,8 @@
<g id="Node000002" class="node">
<title>Node2</title>
<g id="a_Node000002"><a xlink:href="curvilinear_8h.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="#666666" points="137,-74.5 2.5,-74.5 2.5,-55.25 137,-55.25 137,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="69.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">stroid/topology/curvilinear.h</text>
<polygon fill="white" stroke="#666666" points="286,-74.5 151.5,-74.5 151.5,-55.25 286,-55.25 286,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="218.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">stroid/topology/curvilinear.h</text>
</a>
</g>
</g>
@@ -41,8 +77,8 @@
<g id="edge1_Node000001_Node000002" class="edge">
<title>Node1&#45;&gt;Node2</title>
<g id="a_edge1_Node000001_Node000002"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M238.31,-110.09C204.48,-101.22 152.66,-87.62 115.41,-77.85"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="116.38,-74.49 105.82,-75.34 114.6,-81.26 116.38,-74.49"/>
<path fill="none" stroke="#63b8ff" d="M311.75,-110.09C294.29,-101.79 268.15,-89.36 248.03,-79.79"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="249.74,-76.74 239.21,-75.6 246.74,-83.06 249.74,-76.74"/>
</a>
</g>
</g>
@@ -50,8 +86,8 @@
<g id="Node000006" class="node">
<title>Node6</title>
<g id="a_Node000006"><a xlink:href="mapping_8h.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="#666666" points="282.62,-74.5 154.88,-74.5 154.88,-55.25 282.62,-55.25 282.62,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="218.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">stroid/topology/mapping.h</text>
<polygon fill="white" stroke="#666666" points="133.62,-74.5 5.88,-74.5 5.88,-55.25 133.62,-55.25 133.62,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="69.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">stroid/topology/mapping.h</text>
</a>
</g>
</g>
@@ -59,8 +95,8 @@
<g id="edge5_Node000001_Node000006" class="edge">
<title>Node1&#45;&gt;Node6</title>
<g id="a_edge5_Node000001_Node000006"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M263.83,-110.33C256.3,-102.9 245.28,-92.04 236.02,-82.91"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="238.52,-80.45 228.94,-75.92 233.6,-85.44 238.52,-80.45"/>
<path fill="none" stroke="#63b8ff" d="M286.18,-110.03C241.7,-100.96 173.24,-86.99 125.26,-77.2"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="126.12,-73.8 115.62,-75.23 124.72,-80.66 126.12,-73.8"/>
</a>
</g>
</g>
@@ -68,8 +104,8 @@
<g id="Node000007" class="node">
<title>Node7</title>
<g id="a_Node000007"><a xlink:title=" ">
<polygon fill="#e0e0e0" stroke="#999999" points="354.5,-74.5 301,-74.5 301,-55.25 354.5,-55.25 354.5,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="327.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">iostream</text>
<polygon fill="#e0e0e0" stroke="#999999" points="357.5,-74.5 304,-74.5 304,-55.25 357.5,-55.25 357.5,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="330.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">iostream</text>
</a>
</g>
</g>
@@ -77,8 +113,8 @@
<g id="edge9_Node000001_Node000007" class="edge">
<title>Node1&#45;&gt;Node7</title>
<g id="a_edge9_Node000001_Node000007"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M281.83,-110.33C289.59,-102.82 300.96,-91.81 310.45,-82.63"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="312.63,-85.38 317.38,-75.91 307.76,-80.35 312.63,-85.38"/>
<path fill="none" stroke="#63b8ff" d="M330.75,-110.33C330.75,-103.82 330.75,-94.67 330.75,-86.37"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="334.25,-86.37 330.75,-76.37 327.25,-86.37 334.25,-86.37"/>
</a>
</g>
</g>
@@ -86,8 +122,8 @@
<g id="Node000008" class="node">
<title>Node8</title>
<g id="a_Node000008"><a xlink:title=" ">
<polygon fill="#e0e0e0" stroke="#999999" points="423.38,-74.5 372.12,-74.5 372.12,-55.25 423.38,-55.25 423.38,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="397.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">memory</text>
<polygon fill="#e0e0e0" stroke="#999999" points="426.38,-74.5 375.12,-74.5 375.12,-55.25 426.38,-55.25 426.38,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="400.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">memory</text>
</a>
</g>
</g>
@@ -95,8 +131,26 @@
<g id="edge10_Node000001_Node000008" class="edge">
<title>Node1&#45;&gt;Node8</title>
<g id="a_edge10_Node000001_Node000008"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M293.95,-110.09C313.71,-101.68 343.42,-89.02 366,-79.4"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="367.22,-82.68 375.05,-75.55 364.48,-76.24 367.22,-82.68"/>
<path fill="none" stroke="#63b8ff" d="M342.62,-110.09C352.84,-102.32 367.82,-90.92 380.01,-81.65"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="382.01,-84.53 387.85,-75.69 377.77,-78.96 382.01,-84.53"/>
</a>
</g>
</g>
<!-- Node9 -->
<g id="Node000009" class="node">
<title>Node9</title>
<g id="a_Node000009"><a xlink:title=" ">
<polygon fill="#e0e0e0" stroke="#999999" points="506.62,-74.5 444.88,-74.5 444.88,-55.25 506.62,-55.25 506.62,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="475.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">sys/proc.h</text>
</a>
</g>
</g>
<!-- Node1&#45;&gt;Node9 -->
<g id="edge11_Node000001_Node000009" class="edge">
<title>Node1&#45;&gt;Node9</title>
<g id="a_edge11_Node000001_Node000009"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M355.35,-110.09C378.68,-101.52 413.99,-88.56 440.35,-78.88"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="441.43,-82.21 449.61,-75.47 439.02,-75.64 441.43,-82.21"/>
</a>
</g>
</g>
@@ -113,8 +167,8 @@
<g id="edge2_Node000002_Node000003" class="edge">
<title>Node2&#45;&gt;Node3</title>
<g id="a_edge2_Node000002_Node000003"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M63.14,-55.08C57.79,-47.96 50.07,-37.68 43.4,-28.8"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="46.21,-26.71 37.41,-20.82 40.62,-30.92 46.21,-26.71"/>
<path fill="none" stroke="#63b8ff" d="M186.69,-54.84C154.66,-45.82 105.32,-31.92 70.53,-22.11"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="71.81,-18.84 61.24,-19.5 69.91,-25.58 71.81,-18.84"/>
</a>
</g>
</g>
@@ -131,8 +185,8 @@
<g id="edge3_Node000002_Node000004" class="edge">
<title>Node2&#45;&gt;Node4</title>
<g id="a_edge3_Node000002_Node000004"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M80.1,-54.84C88.83,-47.22 101.54,-36.12 112.05,-26.95"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="114.18,-29.73 119.41,-20.52 109.58,-24.46 114.18,-29.73"/>
<path fill="none" stroke="#63b8ff" d="M203.82,-54.84C190.55,-46.81 170.88,-34.91 155.3,-25.48"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="157.41,-22.67 147.05,-20.49 153.79,-28.66 157.41,-22.67"/>
</a>
</g>
</g>
@@ -149,8 +203,8 @@
<g id="edge4_Node000002_Node000005" class="edge">
<title>Node2&#45;&gt;Node5</title>
<g id="a_edge4_Node000002_Node000005"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M101.81,-54.84C133.17,-46.01 181.14,-32.49 215.79,-22.73"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="216.4,-26.19 225.07,-20.11 214.5,-19.46 216.4,-26.19"/>
<path fill="none" stroke="#63b8ff" d="M225.36,-55.08C230.71,-47.96 238.43,-37.68 245.1,-28.8"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="247.88,-30.92 251.09,-20.82 242.29,-26.71 247.88,-30.92"/>
</a>
</g>
</g>
@@ -158,8 +212,8 @@
<g id="edge6_Node000006_Node000003" class="edge">
<title>Node6&#45;&gt;Node3</title>
<g id="a_edge6_Node000006_Node000003"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M186.69,-54.84C154.66,-45.82 105.32,-31.92 70.53,-22.11"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="71.81,-18.84 61.24,-19.5 69.91,-25.58 71.81,-18.84"/>
<path fill="none" stroke="#63b8ff" d="M63.14,-55.08C57.79,-47.96 50.07,-37.68 43.4,-28.8"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="46.21,-26.71 37.41,-20.82 40.62,-30.92 46.21,-26.71"/>
</a>
</g>
</g>
@@ -167,8 +221,8 @@
<g id="edge7_Node000006_Node000004" class="edge">
<title>Node6&#45;&gt;Node4</title>
<g id="a_edge7_Node000006_Node000004"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M203.82,-54.84C190.55,-46.81 170.88,-34.91 155.3,-25.48"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="157.41,-22.67 147.05,-20.49 153.79,-28.66 157.41,-22.67"/>
<path fill="none" stroke="#63b8ff" d="M80.1,-54.84C88.83,-47.22 101.54,-36.12 112.05,-26.95"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="114.18,-29.73 119.41,-20.52 109.58,-24.46 114.18,-29.73"/>
</a>
</g>
</g>
@@ -176,13 +230,34 @@
<g id="edge8_Node000006_Node000005" class="edge">
<title>Node6&#45;&gt;Node5</title>
<g id="a_edge8_Node000006_Node000005"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M225.36,-55.08C230.71,-47.96 238.43,-37.68 245.1,-28.8"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="247.88,-30.92 251.09,-20.82 242.29,-26.71 247.88,-30.92"/>
<path fill="none" stroke="#63b8ff" d="M101.81,-54.84C133.17,-46.01 181.14,-32.49 215.79,-22.73"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="216.4,-26.19 225.07,-20.11 214.5,-19.46 216.4,-26.19"/>
</a>
</g>
</g>
</g>
</svg>
<g id="navigator" transform="translate(0 0)" fill="#404254">
<rect fill="#f2f5e9" fill-opacity="0.5" stroke="#606060" stroke-width=".5" x="0" y="0" width="60" height="60"/>
<use id="zoomplus" xlink:href="#zoomPlus" x="17" y="9" onmousedown="handleZoom(evt,'in')"/>
<use id="zoomminus" xlink:href="#zoomMin" x="42" y="9" onmousedown="handleZoom(evt,'out')"/>
<use id="reset" xlink:href="#resetDef" x="30" y="36" onmousedown="handleReset()"/>
<use id="arrowup" xlink:href="#arrowUp" x="0" y="0" onmousedown="handlePan(0,-1)"/>
<use id="arrowright" xlink:href="#arrowRight" x="0" y="0" onmousedown="handlePan(1,0)"/>
<use id="arrowdown" xlink:href="#arrowDown" x="0" y="0" onmousedown="handlePan(0,1)"/>
<use id="arrowleft" xlink:href="#arrowLeft" x="0" y="0" onmousedown="handlePan(-1,0)"/>
</g>
<svg viewBox="0 0 15 15" width="100%" height="30px" preserveAspectRatio="xMaxYMin meet">
<g id="arrow_out" transform="scale(0.3 0.3)">
<a xlink:href="curvilinear_8cpp__incl_org.svg" target="_base">
<rect id="button" ry="5" rx="5" y="6" x="6" height="38" width="38"
fill="#f2f5e9" fill-opacity="0.5" stroke="#606060" stroke-width="1.0"/>
<path id="arrow"
d="M 11.500037,31.436501 C 11.940474,20.09759 22.043105,11.32322 32.158766,21.979434 L 37.068811,17.246167 C 37.068811,17.246167 37.088388,32 37.088388,32 L 22.160133,31.978069 C 22.160133,31.978069 26.997745,27.140456 26.997745,27.140456 C 18.528582,18.264221 13.291696,25.230495 11.500037,31.436501 z"
style="fill:#404040;"/>
</a>
</g>
</svg>
<style type='text/css'>

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1,19 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 13.0.1 (20250615.1724)
<!-- Generated by graphviz version 14.1.2 (20260124.0452)
-->
<!-- Title: src/lib/topology/curvilinear.cpp Pages: 1 -->
<svg width="431pt" height="138pt"
viewBox="0.00 0.00 431.00 138.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<svg width="515pt" height="138pt"
viewBox="0.00 0.00 515.00 138.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 133.75)">
<title>src/lib/topology/curvilinear.cpp</title>
<!-- Node1 -->
<g id="Node000001" class="node">
<title>Node1</title>
<g id="a_Node000001"><a xlink:title=" ">
<polygon fill="#999999" stroke="#666666" points="346.38,-129.75 199.12,-129.75 199.12,-110.5 346.38,-110.5 346.38,-129.75"/>
<text xml:space="preserve" text-anchor="middle" x="272.75" y="-116.25" font-family="Helvetica,sans-Serif" font-size="10.00">src/lib/topology/curvilinear.cpp</text>
<polygon fill="#999999" stroke="#666666" points="404.38,-129.75 257.12,-129.75 257.12,-110.5 404.38,-110.5 404.38,-129.75"/>
<text xml:space="preserve" text-anchor="middle" x="330.75" y="-116.25" font-family="Helvetica,sans-Serif" font-size="10.00">src/lib/topology/curvilinear.cpp</text>
</a>
</g>
</g>
@@ -21,8 +21,8 @@
<g id="Node000002" class="node">
<title>Node2</title>
<g id="a_Node000002"><a xlink:href="curvilinear_8h.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="#666666" points="137,-74.5 2.5,-74.5 2.5,-55.25 137,-55.25 137,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="69.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">stroid/topology/curvilinear.h</text>
<polygon fill="white" stroke="#666666" points="286,-74.5 151.5,-74.5 151.5,-55.25 286,-55.25 286,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="218.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">stroid/topology/curvilinear.h</text>
</a>
</g>
</g>
@@ -30,8 +30,8 @@
<g id="edge1_Node000001_Node000002" class="edge">
<title>Node1&#45;&gt;Node2</title>
<g id="a_edge1_Node000001_Node000002"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M238.31,-110.09C204.48,-101.22 152.66,-87.62 115.41,-77.85"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="116.38,-74.49 105.82,-75.34 114.6,-81.26 116.38,-74.49"/>
<path fill="none" stroke="#63b8ff" d="M311.75,-110.09C294.29,-101.79 268.15,-89.36 248.03,-79.79"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="249.74,-76.74 239.21,-75.6 246.74,-83.06 249.74,-76.74"/>
</a>
</g>
</g>
@@ -39,8 +39,8 @@
<g id="Node000006" class="node">
<title>Node6</title>
<g id="a_Node000006"><a xlink:href="mapping_8h.html" target="_top" xlink:title=" ">
<polygon fill="white" stroke="#666666" points="282.62,-74.5 154.88,-74.5 154.88,-55.25 282.62,-55.25 282.62,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="218.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">stroid/topology/mapping.h</text>
<polygon fill="white" stroke="#666666" points="133.62,-74.5 5.88,-74.5 5.88,-55.25 133.62,-55.25 133.62,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="69.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">stroid/topology/mapping.h</text>
</a>
</g>
</g>
@@ -48,8 +48,8 @@
<g id="edge5_Node000001_Node000006" class="edge">
<title>Node1&#45;&gt;Node6</title>
<g id="a_edge5_Node000001_Node000006"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M263.83,-110.33C256.3,-102.9 245.28,-92.04 236.02,-82.91"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="238.52,-80.45 228.94,-75.92 233.6,-85.44 238.52,-80.45"/>
<path fill="none" stroke="#63b8ff" d="M286.18,-110.03C241.7,-100.96 173.24,-86.99 125.26,-77.2"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="126.12,-73.8 115.62,-75.23 124.72,-80.66 126.12,-73.8"/>
</a>
</g>
</g>
@@ -57,8 +57,8 @@
<g id="Node000007" class="node">
<title>Node7</title>
<g id="a_Node000007"><a xlink:title=" ">
<polygon fill="#e0e0e0" stroke="#999999" points="354.5,-74.5 301,-74.5 301,-55.25 354.5,-55.25 354.5,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="327.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">iostream</text>
<polygon fill="#e0e0e0" stroke="#999999" points="357.5,-74.5 304,-74.5 304,-55.25 357.5,-55.25 357.5,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="330.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">iostream</text>
</a>
</g>
</g>
@@ -66,8 +66,8 @@
<g id="edge9_Node000001_Node000007" class="edge">
<title>Node1&#45;&gt;Node7</title>
<g id="a_edge9_Node000001_Node000007"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M281.83,-110.33C289.59,-102.82 300.96,-91.81 310.45,-82.63"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="312.63,-85.38 317.38,-75.91 307.76,-80.35 312.63,-85.38"/>
<path fill="none" stroke="#63b8ff" d="M330.75,-110.33C330.75,-103.82 330.75,-94.67 330.75,-86.37"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="334.25,-86.37 330.75,-76.37 327.25,-86.37 334.25,-86.37"/>
</a>
</g>
</g>
@@ -75,8 +75,8 @@
<g id="Node000008" class="node">
<title>Node8</title>
<g id="a_Node000008"><a xlink:title=" ">
<polygon fill="#e0e0e0" stroke="#999999" points="423.38,-74.5 372.12,-74.5 372.12,-55.25 423.38,-55.25 423.38,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="397.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">memory</text>
<polygon fill="#e0e0e0" stroke="#999999" points="426.38,-74.5 375.12,-74.5 375.12,-55.25 426.38,-55.25 426.38,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="400.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">memory</text>
</a>
</g>
</g>
@@ -84,8 +84,26 @@
<g id="edge10_Node000001_Node000008" class="edge">
<title>Node1&#45;&gt;Node8</title>
<g id="a_edge10_Node000001_Node000008"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M293.95,-110.09C313.71,-101.68 343.42,-89.02 366,-79.4"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="367.22,-82.68 375.05,-75.55 364.48,-76.24 367.22,-82.68"/>
<path fill="none" stroke="#63b8ff" d="M342.62,-110.09C352.84,-102.32 367.82,-90.92 380.01,-81.65"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="382.01,-84.53 387.85,-75.69 377.77,-78.96 382.01,-84.53"/>
</a>
</g>
</g>
<!-- Node9 -->
<g id="Node000009" class="node">
<title>Node9</title>
<g id="a_Node000009"><a xlink:title=" ">
<polygon fill="#e0e0e0" stroke="#999999" points="506.62,-74.5 444.88,-74.5 444.88,-55.25 506.62,-55.25 506.62,-74.5"/>
<text xml:space="preserve" text-anchor="middle" x="475.75" y="-61" font-family="Helvetica,sans-Serif" font-size="10.00">sys/proc.h</text>
</a>
</g>
</g>
<!-- Node1&#45;&gt;Node9 -->
<g id="edge11_Node000001_Node000009" class="edge">
<title>Node1&#45;&gt;Node9</title>
<g id="a_edge11_Node000001_Node000009"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M355.35,-110.09C378.68,-101.52 413.99,-88.56 440.35,-78.88"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="441.43,-82.21 449.61,-75.47 439.02,-75.64 441.43,-82.21"/>
</a>
</g>
</g>
@@ -102,8 +120,8 @@
<g id="edge2_Node000002_Node000003" class="edge">
<title>Node2&#45;&gt;Node3</title>
<g id="a_edge2_Node000002_Node000003"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M63.14,-55.08C57.79,-47.96 50.07,-37.68 43.4,-28.8"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="46.21,-26.71 37.41,-20.82 40.62,-30.92 46.21,-26.71"/>
<path fill="none" stroke="#63b8ff" d="M186.69,-54.84C154.66,-45.82 105.32,-31.92 70.53,-22.11"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="71.81,-18.84 61.24,-19.5 69.91,-25.58 71.81,-18.84"/>
</a>
</g>
</g>
@@ -120,8 +138,8 @@
<g id="edge3_Node000002_Node000004" class="edge">
<title>Node2&#45;&gt;Node4</title>
<g id="a_edge3_Node000002_Node000004"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M80.1,-54.84C88.83,-47.22 101.54,-36.12 112.05,-26.95"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="114.18,-29.73 119.41,-20.52 109.58,-24.46 114.18,-29.73"/>
<path fill="none" stroke="#63b8ff" d="M203.82,-54.84C190.55,-46.81 170.88,-34.91 155.3,-25.48"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="157.41,-22.67 147.05,-20.49 153.79,-28.66 157.41,-22.67"/>
</a>
</g>
</g>
@@ -138,8 +156,8 @@
<g id="edge4_Node000002_Node000005" class="edge">
<title>Node2&#45;&gt;Node5</title>
<g id="a_edge4_Node000002_Node000005"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M101.81,-54.84C133.17,-46.01 181.14,-32.49 215.79,-22.73"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="216.4,-26.19 225.07,-20.11 214.5,-19.46 216.4,-26.19"/>
<path fill="none" stroke="#63b8ff" d="M225.36,-55.08C230.71,-47.96 238.43,-37.68 245.1,-28.8"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="247.88,-30.92 251.09,-20.82 242.29,-26.71 247.88,-30.92"/>
</a>
</g>
</g>
@@ -147,8 +165,8 @@
<g id="edge6_Node000006_Node000003" class="edge">
<title>Node6&#45;&gt;Node3</title>
<g id="a_edge6_Node000006_Node000003"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M186.69,-54.84C154.66,-45.82 105.32,-31.92 70.53,-22.11"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="71.81,-18.84 61.24,-19.5 69.91,-25.58 71.81,-18.84"/>
<path fill="none" stroke="#63b8ff" d="M63.14,-55.08C57.79,-47.96 50.07,-37.68 43.4,-28.8"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="46.21,-26.71 37.41,-20.82 40.62,-30.92 46.21,-26.71"/>
</a>
</g>
</g>
@@ -156,8 +174,8 @@
<g id="edge7_Node000006_Node000004" class="edge">
<title>Node6&#45;&gt;Node4</title>
<g id="a_edge7_Node000006_Node000004"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M203.82,-54.84C190.55,-46.81 170.88,-34.91 155.3,-25.48"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="157.41,-22.67 147.05,-20.49 153.79,-28.66 157.41,-22.67"/>
<path fill="none" stroke="#63b8ff" d="M80.1,-54.84C88.83,-47.22 101.54,-36.12 112.05,-26.95"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="114.18,-29.73 119.41,-20.52 109.58,-24.46 114.18,-29.73"/>
</a>
</g>
</g>
@@ -165,8 +183,8 @@
<g id="edge8_Node000006_Node000005" class="edge">
<title>Node6&#45;&gt;Node5</title>
<g id="a_edge8_Node000006_Node000005"><a xlink:title=" ">
<path fill="none" stroke="#63b8ff" d="M225.36,-55.08C230.71,-47.96 238.43,-37.68 245.1,-28.8"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="247.88,-30.92 251.09,-20.82 242.29,-26.71 247.88,-30.92"/>
<path fill="none" stroke="#63b8ff" d="M101.81,-54.84C133.17,-46.01 181.14,-32.49 215.79,-22.73"/>
<polygon fill="#63b8ff" stroke="#63b8ff" points="216.4,-26.19 225.07,-20.11 214.5,-19.46 216.4,-26.19"/>
</a>
</g>
</g>

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -83,12 +83,17 @@
<a href="structstroid_1_1config_1_1_mesh_config-members.html"/>
<a href="structstroid_1_1config_1_1_mesh_config.html"/>
<a href="structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368"/>
<a href="structstroid_1_1config_1_1_mesh_config.html#a2faa5aa1fef84ebbda30590d3fb2799b"/>
<a href="structstroid_1_1config_1_1_mesh_config.html#a33f25ff277aa8834065e04ccb9cdbdda"/>
<a href="structstroid_1_1config_1_1_mesh_config.html#a36c7b05405691393d381086a27ea36ad"/>
<a href="structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05"/>
<a href="structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877"/>
<a href="structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7"/>
<a href="structstroid_1_1config_1_1_mesh_config.html#a64cb00c8cba27267279a52207a4b5be0"/>
<a href="structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd"/>
<a href="structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981"/>
<a href="structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb"/>
<a href="structstroid_1_1config_1_1_mesh_config.html#ac99aa48fe3e71e2ef57b09d48cacfef8"/>
<a href="structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d"/>
<a href="structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584"/>
<a href="topology_8cpp.html"/>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>
@@ -102,15 +102,20 @@ $(function(){initNavTree('functions.html',''); initResizable(true); });
<div class="contents">
<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div><ul>
<li>core_id&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a2faa5aa1fef84ebbda30590d3fb2799b">stroid::config::MeshConfig</a></li>
<li>core_steepness&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d">stroid::config::MeshConfig</a></li>
<li>envelope_id&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#ac99aa48fe3e71e2ef57b09d48cacfef8">stroid::config::MeshConfig</a></li>
<li>flattening&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584">stroid::config::MeshConfig</a></li>
<li>include_external_domain&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368">stroid::config::MeshConfig</a></li>
<li>inf_bdr_id&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a64cb00c8cba27267279a52207a4b5be0">stroid::config::MeshConfig</a></li>
<li>order&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd">stroid::config::MeshConfig</a></li>
<li>r_core&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7">stroid::config::MeshConfig</a></li>
<li>r_infinity&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb">stroid::config::MeshConfig</a></li>
<li>r_instability&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877">stroid::config::MeshConfig</a></li>
<li>r_star&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05">stroid::config::MeshConfig</a></li>
<li>refinement_levels&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981">stroid::config::MeshConfig</a></li>
<li>surface_bdr_id&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a33f25ff277aa8834065e04ccb9cdbdda">stroid::config::MeshConfig</a></li>
<li>vacuum_id&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a36c7b05405691393d381086a27ea36ad">stroid::config::MeshConfig</a></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>
@@ -102,15 +102,20 @@ $(function(){initNavTree('functions_vars.html',''); initResizable(true); });
<div class="contents">
<div class="textblock">Here is a list of all variables with links to the classes they belong to:</div><ul>
<li>core_id&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a2faa5aa1fef84ebbda30590d3fb2799b">stroid::config::MeshConfig</a></li>
<li>core_steepness&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d">stroid::config::MeshConfig</a></li>
<li>envelope_id&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#ac99aa48fe3e71e2ef57b09d48cacfef8">stroid::config::MeshConfig</a></li>
<li>flattening&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584">stroid::config::MeshConfig</a></li>
<li>include_external_domain&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368">stroid::config::MeshConfig</a></li>
<li>inf_bdr_id&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a64cb00c8cba27267279a52207a4b5be0">stroid::config::MeshConfig</a></li>
<li>order&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd">stroid::config::MeshConfig</a></li>
<li>r_core&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7">stroid::config::MeshConfig</a></li>
<li>r_infinity&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb">stroid::config::MeshConfig</a></li>
<li>r_instability&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877">stroid::config::MeshConfig</a></li>
<li>r_star&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05">stroid::config::MeshConfig</a></li>
<li>refinement_levels&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981">stroid::config::MeshConfig</a></li>
<li>surface_bdr_id&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a33f25ff277aa8834065e04ccb9cdbdda">stroid::config::MeshConfig</a></li>
<li>vacuum_id&#160;:&#160;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a36c7b05405691393d381086a27ea36ad">stroid::config::MeshConfig</a></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>
@@ -150,15 +150,20 @@ Running</h2>
Configuration File</h2>
<p>Stroid uses a TOML configuration file to specify the parameters for mesh generation. An example configuration file is found below</p>
<div class="fragment"><div class="line">[main]</div>
<div class="line">core_steepness = 1.0</div>
<div class="line">flattening = 0.0</div>
<div class="line">include_external_domain = false</div>
<div class="line">refinement_levels = 2</div>
<div class="line">order = 3</div>
<div class="line">include_external_domain = true</div>
<div class="line">r_core = 1.5</div>
<div class="line">r_star = 5.0</div>
<div class="line">flattening = 0.08</div>
<div class="line">r_infinity = 6.0</div>
<div class="line">r_instability = 1e-14</div>
<div class="line">r_star = 5.0</div>
<div class="line">refinement_levels = 4</div>
<div class="line">core_steepness = 1.0</div>
<div class="line">surface_bdr_id = 1</div>
<div class="line">inf_bdr_id = 2</div>
<div class="line">core_id = 1</div>
<div class="line">envelope_id = 2</div>
<div class="line">vacuum_id = 3</div>
</div><!-- fragment --><table class="markdownTable">
<tr class="markdownTableHead">
<th class="markdownTableHeadNone">Parameter </th><th class="markdownTableHeadNone">Description </th><th class="markdownTableHeadNone">Default </th></tr>
@@ -167,7 +172,7 @@ Configuration File</h2>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone">order </td><td class="markdownTableBodyNone">The polynomial order of the finite elements in the mesh </td><td class="markdownTableBodyNone">3 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone">include_external_domain </td><td class="markdownTableBodyNone">Whether to include an external domain extending to r_infinity </td><td class="markdownTableBodyNone">false </td></tr>
<td class="markdownTableBodyNone">include_external_domain </td><td class="markdownTableBodyNone">Whether to include an external domain extending to r_infinity </td><td class="markdownTableBodyNone">true </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone">r_core </td><td class="markdownTableBodyNone">The radius of the core region of the star </td><td class="markdownTableBodyNone">1.5 </td></tr>
<tr class="markdownTableRowOdd">
@@ -179,7 +184,17 @@ Configuration File</h2>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone">r_instability </td><td class="markdownTableBodyNone">The radius at which no transformations are applied to the initial topology (to avoid singularities) </td><td class="markdownTableBodyNone">1e-14 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone">core_steepness </td><td class="markdownTableBodyNone">The steepness of the transition between the core and envelope regions of the star </td><td class="markdownTableBodyNone">1.0 </td></tr>
<td class="markdownTableBodyNone">core_steepness </td><td class="markdownTableBodyNone">The steepness of the transition between the core and envelope regions of the star </td><td class="markdownTableBodyNone">1.0 </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone">surface_bdr_id </td><td class="markdownTableBodyNone">The boundary ID to assign to the surface of the star </td><td class="markdownTableBodyNone">1 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone">inf_bdr_id </td><td class="markdownTableBodyNone">The boundary ID to assign to the outer boundary of the external domain (if included) </td><td class="markdownTableBodyNone">2 </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone">core_id </td><td class="markdownTableBodyNone">The material ID to assign to the core region of the star </td><td class="markdownTableBodyNone">1 </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone">envelope_id </td><td class="markdownTableBodyNone">The material ID to assign to the envelope region of the star </td><td class="markdownTableBodyNone">2 </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone">vacuum_id </td><td class="markdownTableBodyNone">The material ID to assign to the vacuum region of the star (if included) </td><td class="markdownTableBodyNone">3 </td></tr>
</table>
<p>If no configuration file is provided, stroid will use the default parameters listed above. Further, configuration files need only include parameters that differ from the defaults, any parameters not specified will use the default values.</p>
<h2><a class="anchor" id="autotoc_md7"></a>
@@ -211,9 +226,9 @@ C++ Interface</h2>
<div class="ttc" id="amesh_8h_html"><div class="ttname"><a href="mesh_8h.html">mesh.h</a></div></div>
<div class="ttc" id="anamespacestroid_1_1_i_o_html_a496f5c16eaffda5922a0b96c1f525dab"><div class="ttname"><a href="namespacestroid_1_1_i_o.html#a496f5c16eaffda5922a0b96c1f525dab">stroid::IO::ViewMesh</a></div><div class="ttdeci">void ViewMesh(mfem::Mesh &amp;mesh, const std::string &amp;title, VISUALIZATION_MODE mode, const std::string &amp;vishost, int visport)</div><div class="ttdoc">Stream a mesh to a running GLVis server for interactive viewing.</div><div class="ttdef"><b>Definition</b> mesh.cpp:25</div></div>
<div class="ttc" id="anamespacestroid_1_1_i_o_html_ad4048304d8a0c7075d2b2a6e465d0b6eaee96e14c2b71bd59252006289ba464cf"><div class="ttname"><a href="namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eaee96e14c2b71bd59252006289ba464cf">stroid::IO::VISUALIZATION_MODE::BOUNDARY_ELEMENT_ID</a></div><div class="ttdeci">@ BOUNDARY_ELEMENT_ID</div><div class="ttdoc">Color boundary-adjacent elements by boundary attribute/ID.</div><div class="ttdef"><b>Definition</b> mesh.h:15</div></div>
<div class="ttc" id="anamespacestroid_1_1topology_html_a5907aa2e639cda703d48d177abc37caf"><div class="ttname"><a href="namespacestroid_1_1topology.html#a5907aa2e639cda703d48d177abc37caf">stroid::topology::PromoteToHighOrder</a></div><div class="ttdeci">void PromoteToHighOrder(mfem::Mesh &amp;mesh, const fourdst::config::Config&lt; config::MeshConfig &gt; &amp;config)</div><div class="ttdoc">Promote a mesh to high-order by attaching an H1 nodal finite element space.</div><div class="ttdef"><b>Definition</b> curvilinear.cpp:8</div></div>
<div class="ttc" id="anamespacestroid_1_1topology_html_a62774bcba7ea1a485892dcd4bed6425b"><div class="ttname"><a href="namespacestroid_1_1topology.html#a62774bcba7ea1a485892dcd4bed6425b">stroid::topology::Finalize</a></div><div class="ttdeci">void Finalize(mfem::Mesh &amp;mesh, const fourdst::config::Config&lt; config::MeshConfig &gt; &amp;config)</div><div class="ttdoc">Finalize topology, validate orientation, and apply uniform refinement.</div><div class="ttdef"><b>Definition</b> topology.cpp:59</div></div>
<div class="ttc" id="anamespacestroid_1_1topology_html_a836ed13e5bac63e7952c3ce4e5532e78"><div class="ttname"><a href="namespacestroid_1_1topology.html#a836ed13e5bac63e7952c3ce4e5532e78">stroid::topology::ProjectMesh</a></div><div class="ttdeci">void ProjectMesh(mfem::Mesh &amp;mesh, const fourdst::config::Config&lt; config::MeshConfig &gt; &amp;config)</div><div class="ttdoc">Project high-order mesh nodes using the configured curvilinear mapping.</div><div class="ttdef"><b>Definition</b> curvilinear.cpp:14</div></div>
<div class="ttc" id="anamespacestroid_1_1topology_html_a5907aa2e639cda703d48d177abc37caf"><div class="ttname"><a href="namespacestroid_1_1topology.html#a5907aa2e639cda703d48d177abc37caf">stroid::topology::PromoteToHighOrder</a></div><div class="ttdeci">void PromoteToHighOrder(mfem::Mesh &amp;mesh, const fourdst::config::Config&lt; config::MeshConfig &gt; &amp;config)</div><div class="ttdoc">Promote a mesh to high-order by attaching an H1 nodal finite element space.</div><div class="ttdef"><b>Definition</b> curvilinear.cpp:9</div></div>
<div class="ttc" id="anamespacestroid_1_1topology_html_a62774bcba7ea1a485892dcd4bed6425b"><div class="ttname"><a href="namespacestroid_1_1topology.html#a62774bcba7ea1a485892dcd4bed6425b">stroid::topology::Finalize</a></div><div class="ttdeci">void Finalize(mfem::Mesh &amp;mesh, const fourdst::config::Config&lt; config::MeshConfig &gt; &amp;config)</div><div class="ttdoc">Finalize topology, validate orientation, and apply uniform refinement.</div><div class="ttdef"><b>Definition</b> topology.cpp:90</div></div>
<div class="ttc" id="anamespacestroid_1_1topology_html_a836ed13e5bac63e7952c3ce4e5532e78"><div class="ttname"><a href="namespacestroid_1_1topology.html#a836ed13e5bac63e7952c3ce4e5532e78">stroid::topology::ProjectMesh</a></div><div class="ttdeci">void ProjectMesh(mfem::Mesh &amp;mesh, const fourdst::config::Config&lt; config::MeshConfig &gt; &amp;config)</div><div class="ttdoc">Project high-order mesh nodes using the configured curvilinear mapping.</div><div class="ttdef"><b>Definition</b> curvilinear.cpp:15</div></div>
<div class="ttc" id="anamespacestroid_1_1topology_html_abc0d8a1fb8e9c5ac0e259e4c93db7892"><div class="ttname"><a href="namespacestroid_1_1topology.html#abc0d8a1fb8e9c5ac0e259e4c93db7892">stroid::topology::BuildSkeleton</a></div><div class="ttdeci">std::unique_ptr&lt; mfem::Mesh &gt; BuildSkeleton(const fourdst::config::Config&lt; config::MeshConfig &gt; &amp;config)</div><div class="ttdoc">Build the initial multi-block mesh topology for the star model.</div><div class="ttdef"><b>Definition</b> topology.cpp:10</div></div>
<div class="ttc" id="atopology_8h_html"><div class="ttname"><a href="topology_8h.html">topology.h</a></div></div>
</div><!-- fragment --><h1><a class="anchor" id="autotoc_md8"></a>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>
@@ -131,9 +131,6 @@ Functions</h2></td></tr>
<tr class="memitem:a7fbf58c40c03bc751d53f4a3273744fc" id="r_a7fbf58c40c03bc751d53f4a3273744fc"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacestroid_1_1topology.html#a7fbf58c40c03bc751d53f4a3273744fc">stroid::topology::ApplySpheroidal</a> (mfem::Vector &amp;pos, const fourdst::config::Config&lt; <a class="el" href="structstroid_1_1config_1_1_mesh_config.html">config::MeshConfig</a> &gt; &amp;config)</td></tr>
<tr class="memdesc:a7fbf58c40c03bc751d53f4a3273744fc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Apply spheroidal flattening along the Z axis. <br /></td></tr>
<tr class="separator:a7fbf58c40c03bc751d53f4a3273744fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a59c54a10f726d323f8506b4a2edd7467" id="r_a59c54a10f726d323f8506b4a2edd7467"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacestroid_1_1topology.html#a59c54a10f726d323f8506b4a2edd7467">stroid::topology::ApplyKelvin</a> (mfem::Vector &amp;pos, const fourdst::config::Config&lt; <a class="el" href="structstroid_1_1config_1_1_mesh_config.html">config::MeshConfig</a> &gt; &amp;config)</td></tr>
<tr class="memdesc:a59c54a10f726d323f8506b4a2edd7467"><td class="mdescLeft">&#160;</td><td class="mdescRight">Apply Kelvin transform outside the stellar radius. <br /></td></tr>
<tr class="separator:a59c54a10f726d323f8506b4a2edd7467"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a394e33bdfafdaccd6edfaae0642d3456" id="r_a394e33bdfafdaccd6edfaae0642d3456"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacestroid_1_1topology.html#a394e33bdfafdaccd6edfaae0642d3456">stroid::topology::TransformPoint</a> (mfem::Vector &amp;pos, const fourdst::config::Config&lt; <a class="el" href="structstroid_1_1config_1_1_mesh_config.html">config::MeshConfig</a> &gt; &amp;config, int attribute_id)</td></tr>
<tr class="memdesc:a394e33bdfafdaccd6edfaae0642d3456"><td class="mdescLeft">&#160;</td><td class="mdescRight">Map a point from the initial block topology to the curvilinear domain. <br /></td></tr>
<tr class="separator:a394e33bdfafdaccd6edfaae0642d3456"><td class="memSeparator" colspan="2">&#160;</td></tr>

View File

@@ -1,7 +1,6 @@
var mapping_8cpp =
[
[ "stroid::topology::ApplyEquiangular", "namespacestroid_1_1topology.html#a03f0b29ccf7d427a175de9ff75824b7c", null ],
[ "stroid::topology::ApplyKelvin", "namespacestroid_1_1topology.html#a59c54a10f726d323f8506b4a2edd7467", null ],
[ "stroid::topology::ApplySpheroidal", "namespacestroid_1_1topology.html#a7fbf58c40c03bc751d53f4a3273744fc", null ],
[ "stroid::topology::TransformPoint", "namespacestroid_1_1topology.html#a394e33bdfafdaccd6edfaae0642d3456", null ]
];

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -67,24 +67,34 @@ var NAVTREEINDEX0 =
"pages.html":[],
"structstroid_1_1config_1_1_mesh_config.html":[3,0,0,0,0],
"structstroid_1_1config_1_1_mesh_config.html":[4,0,0,0,0],
"structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368":[3,0,0,0,0,2],
"structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368":[4,0,0,0,0,2],
"structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05":[3,0,0,0,0,7],
"structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05":[4,0,0,0,0,7],
"structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877":[3,0,0,0,0,6],
"structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877":[4,0,0,0,0,6],
"structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7":[3,0,0,0,0,4],
"structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7":[4,0,0,0,0,4],
"structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd":[3,0,0,0,0,3],
"structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd":[4,0,0,0,0,3],
"structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981":[3,0,0,0,0,8],
"structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981":[4,0,0,0,0,8],
"structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb":[3,0,0,0,0,5],
"structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb":[4,0,0,0,0,5],
"structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d":[3,0,0,0,0,0],
"structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d":[4,0,0,0,0,0],
"structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584":[3,0,0,0,0,1],
"structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584":[4,0,0,0,0,1],
"structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368":[3,0,0,0,0,4],
"structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368":[4,0,0,0,0,4],
"structstroid_1_1config_1_1_mesh_config.html#a2faa5aa1fef84ebbda30590d3fb2799b":[3,0,0,0,0,0],
"structstroid_1_1config_1_1_mesh_config.html#a2faa5aa1fef84ebbda30590d3fb2799b":[4,0,0,0,0,0],
"structstroid_1_1config_1_1_mesh_config.html#a33f25ff277aa8834065e04ccb9cdbdda":[3,0,0,0,0,12],
"structstroid_1_1config_1_1_mesh_config.html#a33f25ff277aa8834065e04ccb9cdbdda":[4,0,0,0,0,12],
"structstroid_1_1config_1_1_mesh_config.html#a36c7b05405691393d381086a27ea36ad":[3,0,0,0,0,13],
"structstroid_1_1config_1_1_mesh_config.html#a36c7b05405691393d381086a27ea36ad":[4,0,0,0,0,13],
"structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05":[3,0,0,0,0,10],
"structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05":[4,0,0,0,0,10],
"structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877":[3,0,0,0,0,9],
"structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877":[4,0,0,0,0,9],
"structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7":[3,0,0,0,0,7],
"structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7":[4,0,0,0,0,7],
"structstroid_1_1config_1_1_mesh_config.html#a64cb00c8cba27267279a52207a4b5be0":[3,0,0,0,0,5],
"structstroid_1_1config_1_1_mesh_config.html#a64cb00c8cba27267279a52207a4b5be0":[4,0,0,0,0,5],
"structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd":[3,0,0,0,0,6],
"structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd":[4,0,0,0,0,6],
"structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981":[3,0,0,0,0,11],
"structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981":[4,0,0,0,0,11],
"structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb":[3,0,0,0,0,8],
"structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb":[4,0,0,0,0,8],
"structstroid_1_1config_1_1_mesh_config.html#ac99aa48fe3e71e2ef57b09d48cacfef8":[3,0,0,0,0,2],
"structstroid_1_1config_1_1_mesh_config.html#ac99aa48fe3e71e2ef57b09d48cacfef8":[4,0,0,0,0,2],
"structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d":[3,0,0,0,0,1],
"structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d":[4,0,0,0,0,1],
"structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584":[3,0,0,0,0,3],
"structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584":[4,0,0,0,0,3],
"topology_8cpp.html":[5,0,1,1,1,2],
"topology_8h.html":[5,0,1,0,0,2,2]
};

View File

@@ -3,7 +3,8 @@ var searchData=
['c_20interface_0',['C++ Interface',['../index.html#autotoc_md7',1,'']]],
['config_2eh_1',['config.h',['../config_8h.html',1,'']]],
['configuration_20file_2',['Configuration File',['../index.html#autotoc_md6',1,'']]],
['core_5fsteepness_3',['core_steepness',['../structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d',1,'stroid::config::MeshConfig']]],
['curvilinear_2ecpp_4',['curvilinear.cpp',['../curvilinear_8cpp.html',1,'']]],
['curvilinear_2eh_5',['curvilinear.h',['../curvilinear_8h.html',1,'']]]
['core_5fid_3',['core_id',['../structstroid_1_1config_1_1_mesh_config.html#a2faa5aa1fef84ebbda30590d3fb2799b',1,'stroid::config::MeshConfig']]],
['core_5fsteepness_4',['core_steepness',['../structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d',1,'stroid::config::MeshConfig']]],
['curvilinear_2ecpp_5',['curvilinear.cpp',['../curvilinear_8cpp.html',1,'']]],
['curvilinear_2eh_6',['curvilinear.h',['../curvilinear_8h.html',1,'']]]
];

View File

@@ -1,4 +1,5 @@
var searchData=
[
['element_5fid_0',['ELEMENT_ID',['../namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eac31a2fe3e97d218a154c1947b43d6bbf',1,'stroid::IO']]]
['element_5fid_0',['ELEMENT_ID',['../namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eac31a2fe3e97d218a154c1947b43d6bbf',1,'stroid::IO']]],
['envelope_5fid_1',['envelope_id',['../structstroid_1_1config_1_1_mesh_config.html#ac99aa48fe3e71e2ef57b09d48cacfef8',1,'stroid::config::MeshConfig']]]
];

View File

@@ -1,6 +1,7 @@
var searchData=
[
['include_5fexternal_5fdomain_0',['include_external_domain',['../structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368',1,'stroid::config::MeshConfig']]],
['installing_1',['Building and Installing',['../index.html#autotoc_md2',1,'']]],
['interface_2',['C++ Interface',['../index.html#autotoc_md7',1,'']]]
['inf_5fbdr_5fid_1',['inf_bdr_id',['../structstroid_1_1config_1_1_mesh_config.html#a64cb00c8cba27267279a52207a4b5be0',1,'stroid::config::MeshConfig']]],
['installing_2',['Building and Installing',['../index.html#autotoc_md2',1,'']]],
['interface_3',['C++ Interface',['../index.html#autotoc_md7',1,'']]]
];

View File

@@ -8,5 +8,6 @@ var searchData=
['stroid_3a_3aconfig_5',['config',['../namespacestroid_1_1config.html',1,'stroid']]],
['stroid_3a_3aio_6',['IO',['../namespacestroid_1_1_i_o.html',1,'stroid']]],
['stroid_3a_3atopology_7',['topology',['../namespacestroid_1_1topology.html',1,'stroid']]],
['stroid_3a_3autils_8',['utils',['../namespacestroid_1_1utils.html',1,'stroid']]]
['stroid_3a_3autils_8',['utils',['../namespacestroid_1_1utils.html',1,'stroid']]],
['surface_5fbdr_5fid_9',['surface_bdr_id',['../structstroid_1_1config_1_1_mesh_config.html#a33f25ff277aa8834065e04ccb9cdbdda',1,'stroid::config::MeshConfig']]]
];

View File

@@ -5,7 +5,7 @@ var indexSectionsWithContent =
2: "s",
3: "clmt",
4: "abfmpstv",
5: "cfior",
5: "cefiorsv",
6: "v",
7: "ben",
8: "s"

View File

@@ -1,4 +1,5 @@
var searchData=
[
['core_5fsteepness_0',['core_steepness',['../structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d',1,'stroid::config::MeshConfig']]]
['core_5fid_0',['core_id',['../structstroid_1_1config_1_1_mesh_config.html#a2faa5aa1fef84ebbda30590d3fb2799b',1,'stroid::config::MeshConfig']]],
['core_5fsteepness_1',['core_steepness',['../structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d',1,'stroid::config::MeshConfig']]]
];

View File

@@ -1,4 +1,4 @@
var searchData=
[
['flattening_0',['flattening',['../structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584',1,'stroid::config::MeshConfig']]]
['envelope_5fid_0',['envelope_id',['../structstroid_1_1config_1_1_mesh_config.html#ac99aa48fe3e71e2ef57b09d48cacfef8',1,'stroid::config::MeshConfig']]]
];

View File

@@ -1,4 +1,4 @@
var searchData=
[
['include_5fexternal_5fdomain_0',['include_external_domain',['../structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368',1,'stroid::config::MeshConfig']]]
['flattening_0',['flattening',['../structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584',1,'stroid::config::MeshConfig']]]
];

View File

@@ -1,4 +1,5 @@
var searchData=
[
['order_0',['order',['../structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd',1,'stroid::config::MeshConfig']]]
['include_5fexternal_5fdomain_0',['include_external_domain',['../structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368',1,'stroid::config::MeshConfig']]],
['inf_5fbdr_5fid_1',['inf_bdr_id',['../structstroid_1_1config_1_1_mesh_config.html#a64cb00c8cba27267279a52207a4b5be0',1,'stroid::config::MeshConfig']]]
];

View File

@@ -1,8 +1,4 @@
var searchData=
[
['r_5fcore_0',['r_core',['../structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7',1,'stroid::config::MeshConfig']]],
['r_5finfinity_1',['r_infinity',['../structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb',1,'stroid::config::MeshConfig']]],
['r_5finstability_2',['r_instability',['../structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877',1,'stroid::config::MeshConfig']]],
['r_5fstar_3',['r_star',['../structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05',1,'stroid::config::MeshConfig']]],
['refinement_5flevels_4',['refinement_levels',['../structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981',1,'stroid::config::MeshConfig']]]
['order_0',['order',['../structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd',1,'stroid::config::MeshConfig']]]
];

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>
@@ -107,15 +107,20 @@ $(function(){initNavTree('structstroid_1_1config_1_1_mesh_config.html',''); init
<p>This is the complete list of members for <a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a>, including all inherited members.</p>
<table class="directory">
<tr class="even"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d">core_steepness</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a2faa5aa1fef84ebbda30590d3fb2799b">core_id</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d">core_steepness</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#ac99aa48fe3e71e2ef57b09d48cacfef8">envelope_id</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584">flattening</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368">include_external_domain</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd">order</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7">r_core</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb">r_infinity</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877">r_instability</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05">r_star</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981">refinement_levels</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a64cb00c8cba27267279a52207a4b5be0">inf_bdr_id</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd">order</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7">r_core</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb">r_infinity</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877">r_instability</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05">r_star</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981">refinement_levels</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a33f25ff277aa8834065e04ccb9cdbdda">surface_bdr_id</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html#a36c7b05405691393d381086a27ea36ad">vacuum_id</a></td><td class="entry"><a class="el" href="structstroid_1_1config_1_1_mesh_config.html">stroid::config::MeshConfig</a></td><td class="entry"></td></tr>
</table></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>
@@ -116,37 +116,73 @@ $(function(){initNavTree('structstroid_1_1config_1_1_mesh_config.html',''); init
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
Public Attributes</h2></td></tr>
<tr class="memitem:a8cafcbebf64ae251517118eb152de981" id="r_a8cafcbebf64ae251517118eb152de981"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a8cafcbebf64ae251517118eb152de981">refinement_levels</a> = 4</td></tr>
<tr class="memdesc:a8cafcbebf64ae251517118eb152de981"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of uniform refinement passes applied after topology creation. @toml [main].refinement_levels. <br /></td></tr>
<tr class="memdesc:a8cafcbebf64ae251517118eb152de981"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of uniform refinement passes applied after topology creation. <br /></td></tr>
<tr class="separator:a8cafcbebf64ae251517118eb152de981"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a860e78f1906acb0c3aa08d55f94de3fd" id="r_a860e78f1906acb0c3aa08d55f94de3fd"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a860e78f1906acb0c3aa08d55f94de3fd">order</a> = 3</td></tr>
<tr class="memdesc:a860e78f1906acb0c3aa08d55f94de3fd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Polynomial order for high-order elements. @toml [main].order. <br /></td></tr>
<tr class="memdesc:a860e78f1906acb0c3aa08d55f94de3fd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Polynomial order for high-order elements. <br /></td></tr>
<tr class="separator:a860e78f1906acb0c3aa08d55f94de3fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a062652781f4f3ea0b7ca8764362a7368" id="r_a062652781f4f3ea0b7ca8764362a7368"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a062652781f4f3ea0b7ca8764362a7368">include_external_domain</a> = false</td></tr>
<tr class="memitem:a062652781f4f3ea0b7ca8764362a7368" id="r_a062652781f4f3ea0b7ca8764362a7368"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a062652781f4f3ea0b7ca8764362a7368">include_external_domain</a> = true</td></tr>
<tr class="memdesc:a062652781f4f3ea0b7ca8764362a7368"><td class="mdescLeft">&#160;</td><td class="mdescRight">Whether to include an external domain extending to <code>r_infinity</code>. <br /></td></tr>
<tr class="separator:a062652781f4f3ea0b7ca8764362a7368"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5c68a895f73dc82a38a8daac22a83ad7" id="r_a5c68a895f73dc82a38a8daac22a83ad7"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a5c68a895f73dc82a38a8daac22a83ad7">r_core</a> = 1.5</td></tr>
<tr class="memdesc:a5c68a895f73dc82a38a8daac22a83ad7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Radius of the stellar core region. @toml [main].r_core. <br /></td></tr>
<tr class="memdesc:a5c68a895f73dc82a38a8daac22a83ad7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Radius of the stellar core region. <br /></td></tr>
<tr class="separator:a5c68a895f73dc82a38a8daac22a83ad7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3fe80a30990d484dcc39b6f9a0befc05" id="r_a3fe80a30990d484dcc39b6f9a0befc05"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a3fe80a30990d484dcc39b6f9a0befc05">r_star</a> = 5.0</td></tr>
<tr class="memdesc:a3fe80a30990d484dcc39b6f9a0befc05"><td class="mdescLeft">&#160;</td><td class="mdescRight">Radius of the stellar surface. @toml [main].r_star. <br /></td></tr>
<tr class="memdesc:a3fe80a30990d484dcc39b6f9a0befc05"><td class="mdescLeft">&#160;</td><td class="mdescRight">Radius of the stellar surface. <br /></td></tr>
<tr class="separator:a3fe80a30990d484dcc39b6f9a0befc05"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:affad4638b0ae7b710f2b2db992f6f584" id="r_affad4638b0ae7b710f2b2db992f6f584"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#affad4638b0ae7b710f2b2db992f6f584">flattening</a> = 0</td></tr>
<tr class="memdesc:affad4638b0ae7b710f2b2db992f6f584"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flattening factor for spheroidal shaping (0 = spherical, &gt;0 = oblate). @toml [main].flattening. <br /></td></tr>
<tr class="memdesc:affad4638b0ae7b710f2b2db992f6f584"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flattening factor for spheroidal shaping (0 = spherical, &gt;0 = oblate). <br /></td></tr>
<tr class="separator:affad4638b0ae7b710f2b2db992f6f584"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac7546899ebbfe191ea3a8bf2403b31eb" id="r_ac7546899ebbfe191ea3a8bf2403b31eb"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ac7546899ebbfe191ea3a8bf2403b31eb">r_infinity</a> = 6.0</td></tr>
<tr class="memdesc:ac7546899ebbfe191ea3a8bf2403b31eb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Outer radius of the external domain when enabled. @toml [main].r_infinity. <br /></td></tr>
<tr class="memdesc:ac7546899ebbfe191ea3a8bf2403b31eb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Outer radius of the external domain when enabled. <br /></td></tr>
<tr class="separator:ac7546899ebbfe191ea3a8bf2403b31eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4da6d99ff7ba24d2f917e1fd98ddd877" id="r_a4da6d99ff7ba24d2f917e1fd98ddd877"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a4da6d99ff7ba24d2f917e1fd98ddd877">r_instability</a> = 1e-14</td></tr>
<tr class="memdesc:a4da6d99ff7ba24d2f917e1fd98ddd877"><td class="mdescLeft">&#160;</td><td class="mdescRight">Radius inside which transformations are skipped to avoid singularities. @toml [main].r_instability. <br /></td></tr>
<tr class="memdesc:a4da6d99ff7ba24d2f917e1fd98ddd877"><td class="mdescLeft">&#160;</td><td class="mdescRight">Radius inside which transformations are skipped to avoid singularities. <br /></td></tr>
<tr class="separator:a4da6d99ff7ba24d2f917e1fd98ddd877"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aed32864839b149c94842801b6413d94d" id="r_aed32864839b149c94842801b6413d94d"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#aed32864839b149c94842801b6413d94d">core_steepness</a> = 1.0</td></tr>
<tr class="memdesc:aed32864839b149c94842801b6413d94d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls the smoothness/steepness of the core-to-envelope transition. @toml [main].core_steepness. <br /></td></tr>
<tr class="memdesc:aed32864839b149c94842801b6413d94d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Controls the smoothness/steepness of the core-to-envelope transition. <br /></td></tr>
<tr class="separator:aed32864839b149c94842801b6413d94d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a33f25ff277aa8834065e04ccb9cdbdda" id="r_a33f25ff277aa8834065e04ccb9cdbdda"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a33f25ff277aa8834065e04ccb9cdbdda">surface_bdr_id</a> = 1</td></tr>
<tr class="memdesc:a33f25ff277aa8834065e04ccb9cdbdda"><td class="mdescLeft">&#160;</td><td class="mdescRight">Boundary attribute id for stellar surface. <br /></td></tr>
<tr class="separator:a33f25ff277aa8834065e04ccb9cdbdda"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a64cb00c8cba27267279a52207a4b5be0" id="r_a64cb00c8cba27267279a52207a4b5be0"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a64cb00c8cba27267279a52207a4b5be0">inf_bdr_id</a> = 2</td></tr>
<tr class="memdesc:a64cb00c8cba27267279a52207a4b5be0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Boundary attribute id for infinity in kelvin mapping. <br /></td></tr>
<tr class="separator:a64cb00c8cba27267279a52207a4b5be0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2faa5aa1fef84ebbda30590d3fb2799b" id="r_a2faa5aa1fef84ebbda30590d3fb2799b"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a2faa5aa1fef84ebbda30590d3fb2799b">core_id</a> = 1</td></tr>
<tr class="memdesc:a2faa5aa1fef84ebbda30590d3fb2799b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Material attribute id for the core region. <br /></td></tr>
<tr class="separator:a2faa5aa1fef84ebbda30590d3fb2799b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac99aa48fe3e71e2ef57b09d48cacfef8" id="r_ac99aa48fe3e71e2ef57b09d48cacfef8"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ac99aa48fe3e71e2ef57b09d48cacfef8">envelope_id</a> = 2</td></tr>
<tr class="memdesc:ac99aa48fe3e71e2ef57b09d48cacfef8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Material attribute id for the envelope region. <br /></td></tr>
<tr class="separator:ac99aa48fe3e71e2ef57b09d48cacfef8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a36c7b05405691393d381086a27ea36ad" id="r_a36c7b05405691393d381086a27ea36ad"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#a36c7b05405691393d381086a27ea36ad">vacuum_id</a> = 3</td></tr>
<tr class="memdesc:a36c7b05405691393d381086a27ea36ad"><td class="mdescLeft">&#160;</td><td class="mdescRight">Material attribute id for the external domain (if enabled) <br /></td></tr>
<tr class="separator:a36c7b05405691393d381086a27ea36ad"><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>Configuration parameters for stroid mesh generation. </p>
<p>These values are typically loaded via <code>fourdst::config::Config&lt;<a class="el" href="structstroid_1_1config_1_1_mesh_config.html" title="Configuration parameters for stroid mesh generation.">stroid::config::MeshConfig</a>&gt;</code> from a TOML file. The README shows the expected TOML layout under the <code>[main]</code> table. Unspecified keys use the defaults defined here. </p>
</div><h2 class="groupheader">Member Data Documentation</h2>
<a id="a2faa5aa1fef84ebbda30590d3fb2799b" name="a2faa5aa1fef84ebbda30590d3fb2799b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2faa5aa1fef84ebbda30590d3fb2799b">&#9670;&#160;</a></span>core_id</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">size_t stroid::config::MeshConfig::core_id = 1</td>
</tr>
</table>
</div><div class="memdoc">
<p>Material attribute id for the core region. </p>
<h1><a class="anchor" id="toml"></a>
toml</h1>
<ul>
<li>[main].core_id </li>
</ul>
</div>
</div>
<a id="aed32864839b149c94842801b6413d94d" name="aed32864839b149c94842801b6413d94d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aed32864839b149c94842801b6413d94d">&#9670;&#160;</a></span>core_steepness</h2>
@@ -159,7 +195,33 @@ Public Attributes</h2></td></tr>
</table>
</div><div class="memdoc">
<p>Controls the smoothness/steepness of the core-to-envelope transition. @toml [main].core_steepness. </p>
<p>Controls the smoothness/steepness of the core-to-envelope transition. </p>
<h1><a class="anchor" id="toml"></a>
toml</h1>
<ul>
<li>[main].core_steepness </li>
</ul>
</div>
</div>
<a id="ac99aa48fe3e71e2ef57b09d48cacfef8" name="ac99aa48fe3e71e2ef57b09d48cacfef8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac99aa48fe3e71e2ef57b09d48cacfef8">&#9670;&#160;</a></span>envelope_id</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">size_t stroid::config::MeshConfig::envelope_id = 2</td>
</tr>
</table>
</div><div class="memdoc">
<p>Material attribute id for the envelope region. </p>
<h1><a class="anchor" id="toml"></a>
toml</h1>
<ul>
<li>[main].envelope_id </li>
</ul>
</div>
</div>
@@ -175,7 +237,12 @@ Public Attributes</h2></td></tr>
</table>
</div><div class="memdoc">
<p>Flattening factor for spheroidal shaping (0 = spherical, &gt;0 = oblate). @toml [main].flattening. </p>
<p>Flattening factor for spheroidal shaping (0 = spherical, &gt;0 = oblate). </p>
<h1><a class="anchor" id="toml"></a>
toml</h1>
<ul>
<li>[main].flattening </li>
</ul>
</div>
</div>
@@ -186,13 +253,38 @@ Public Attributes</h2></td></tr>
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool stroid::config::MeshConfig::include_external_domain = false</td>
<td class="memname">bool stroid::config::MeshConfig::include_external_domain = true</td>
</tr>
</table>
</div><div class="memdoc">
<p>Whether to include an external domain extending to <code>r_infinity</code>. </p>
<p>Currently this flag does not affect mesh generation. @toml [main].include_external_domain </p>
<h1><a class="anchor" id="toml"></a>
toml</h1>
<ul>
<li>[main].include_external_domain </li>
</ul>
</div>
</div>
<a id="a64cb00c8cba27267279a52207a4b5be0" name="a64cb00c8cba27267279a52207a4b5be0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a64cb00c8cba27267279a52207a4b5be0">&#9670;&#160;</a></span>inf_bdr_id</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">size_t stroid::config::MeshConfig::inf_bdr_id = 2</td>
</tr>
</table>
</div><div class="memdoc">
<p>Boundary attribute id for infinity in kelvin mapping. </p>
<h1><a class="anchor" id="toml"></a>
toml</h1>
<ul>
<li>[main].inf_bdr_id </li>
</ul>
</div>
</div>
@@ -208,7 +300,12 @@ Public Attributes</h2></td></tr>
</table>
</div><div class="memdoc">
<p>Polynomial order for high-order elements. @toml [main].order. </p>
<p>Polynomial order for high-order elements. </p>
<h1><a class="anchor" id="toml"></a>
toml</h1>
<ul>
<li>[main].order </li>
</ul>
</div>
</div>
@@ -224,7 +321,12 @@ Public Attributes</h2></td></tr>
</table>
</div><div class="memdoc">
<p>Radius of the stellar core region. @toml [main].r_core. </p>
<p>Radius of the stellar core region. </p>
<h1><a class="anchor" id="toml"></a>
toml</h1>
<ul>
<li>[main].r_core </li>
</ul>
</div>
</div>
@@ -240,7 +342,12 @@ Public Attributes</h2></td></tr>
</table>
</div><div class="memdoc">
<p>Outer radius of the external domain when enabled. @toml [main].r_infinity. </p>
<p>Outer radius of the external domain when enabled. </p>
<h1><a class="anchor" id="toml"></a>
toml</h1>
<ul>
<li>[main].r_infinity </li>
</ul>
</div>
</div>
@@ -256,7 +363,12 @@ Public Attributes</h2></td></tr>
</table>
</div><div class="memdoc">
<p>Radius inside which transformations are skipped to avoid singularities. @toml [main].r_instability. </p>
<p>Radius inside which transformations are skipped to avoid singularities. </p>
<h1><a class="anchor" id="toml"></a>
toml</h1>
<ul>
<li>[main].r_instability </li>
</ul>
</div>
</div>
@@ -272,7 +384,12 @@ Public Attributes</h2></td></tr>
</table>
</div><div class="memdoc">
<p>Radius of the stellar surface. @toml [main].r_star. </p>
<p>Radius of the stellar surface. </p>
<h1><a class="anchor" id="toml"></a>
toml</h1>
<ul>
<li>[main].r_star </li>
</ul>
</div>
</div>
@@ -288,7 +405,54 @@ Public Attributes</h2></td></tr>
</table>
</div><div class="memdoc">
<p>Number of uniform refinement passes applied after topology creation. @toml [main].refinement_levels. </p>
<p>Number of uniform refinement passes applied after topology creation. </p>
<h1><a class="anchor" id="toml"></a>
toml</h1>
<ul>
<li>[main].refinement_levels </li>
</ul>
</div>
</div>
<a id="a33f25ff277aa8834065e04ccb9cdbdda" name="a33f25ff277aa8834065e04ccb9cdbdda"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a33f25ff277aa8834065e04ccb9cdbdda">&#9670;&#160;</a></span>surface_bdr_id</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">size_t stroid::config::MeshConfig::surface_bdr_id = 1</td>
</tr>
</table>
</div><div class="memdoc">
<p>Boundary attribute id for stellar surface. </p>
<h1><a class="anchor" id="toml"></a>
toml</h1>
<ul>
<li>[main].surface_bdr_id </li>
</ul>
</div>
</div>
<a id="a36c7b05405691393d381086a27ea36ad" name="a36c7b05405691393d381086a27ea36ad"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a36c7b05405691393d381086a27ea36ad">&#9670;&#160;</a></span>vacuum_id</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">size_t stroid::config::MeshConfig::vacuum_id = 3</td>
</tr>
</table>
</div><div class="memdoc">
<p>Material attribute id for the external domain (if enabled) </p>
<h1><a class="anchor" id="toml"></a>
toml</h1>
<ul>
<li>[main].vacuum_id </li>
</ul>
</div>
</div>

View File

@@ -1,12 +1,17 @@
var structstroid_1_1config_1_1_mesh_config =
[
[ "core_id", "structstroid_1_1config_1_1_mesh_config.html#a2faa5aa1fef84ebbda30590d3fb2799b", null ],
[ "core_steepness", "structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d", null ],
[ "envelope_id", "structstroid_1_1config_1_1_mesh_config.html#ac99aa48fe3e71e2ef57b09d48cacfef8", null ],
[ "flattening", "structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584", null ],
[ "include_external_domain", "structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368", null ],
[ "inf_bdr_id", "structstroid_1_1config_1_1_mesh_config.html#a64cb00c8cba27267279a52207a4b5be0", null ],
[ "order", "structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd", null ],
[ "r_core", "structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7", null ],
[ "r_infinity", "structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb", null ],
[ "r_instability", "structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877", null ],
[ "r_star", "structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05", null ],
[ "refinement_levels", "structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981", null ]
[ "refinement_levels", "structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981", null ],
[ "surface_bdr_id", "structstroid_1_1config_1_1_mesh_config.html#a33f25ff277aa8834065e04ccb9cdbdda", null ],
[ "vacuum_id", "structstroid_1_1config_1_1_mesh_config.html#a36c7b05405691393d381086a27ea36ad", null ]
];

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -31,7 +31,7 @@
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="Logo.png"/></td>
<td id="projectalign">
<div id="projectname">stroid<span id="projectnumber">&#160;v0.1.0</span>
<div id="projectname">stroid<span id="projectnumber">&#160;v0.2.0</span>
</div>
<div id="projectbrief">Multi-block curvilinear mesh generation</div>
</td>

View File

@@ -77,15 +77,20 @@ file is found below
```toml
[main]
core_steepness = 1.0
flattening = 0.0
include_external_domain = false
refinement_levels = 2
order = 3
include_external_domain = true
r_core = 1.5
r_star = 5.0
flattening = 0.08
r_infinity = 6.0
r_instability = 1e-14
r_star = 5.0
refinement_levels = 4
core_steepness = 1.0
surface_bdr_id = 1
inf_bdr_id = 2
core_id = 1
envelope_id = 2
vacuum_id = 3
```
<!-- Table of what these parameters do -->
@@ -93,13 +98,18 @@ refinement_levels = 4
|-------------------------|-----------------------------------------------------------------------------------------------------|---------|
| refinement_levels | Number of uniform refinement levels to apply to the mesh after generation | 4 |
| order | The polynomial order of the finite elements in the mesh | 3 |
| include_external_domain | Whether to include an external domain extending to r_infinity | false |
| include_external_domain | Whether to include an external domain extending to r_infinity | true |
| r_core | The radius of the core region of the star | 1.5 |
| r_star | The radius of the star | 5.0 |
| flattening | The flattening factor of the star (0 for spherical, >0 for oblate) | 0 |
| r_infinity | The outer radius of the external domain (if included) | 6.0 |
| r_instability | The radius at which no transformations are applied to the initial topology (to avoid singularities) | 1e-14 |
| core_steepness | The steepness of the transition between the core and envelope regions of the star | 1.0 |
| surface_bdr_id | The boundary ID to assign to the surface of the star | 1 |
| inf_bdr_id | The boundary ID to assign to the outer boundary of the external domain (if included) | 2 |
| core_id | The material ID to assign to the core region of the star | 1 |
| envelope_id | The material ID to assign to the envelope region of the star | 2 |
| vacuum_id | The material ID to assign to the vacuum region of the star (if included) | 3 |
If no configuration file is provided, stroid will use the default parameters listed above. Further, configuration files

View File

@@ -1,4 +1,4 @@
project('stroid', 'cpp', meson_version : '>= 1.3.0', version : 'v0.1.0', default_options : ['cpp_std=c++23'])
project('stroid', 'cpp', meson_version : '>= 1.3.0', version : 'v0.2.0', default_options : ['cpp_std=c++23'])
subdir('build-check')

View File

@@ -78,15 +78,20 @@ file is found below
```toml
[main]
core_steepness = 1.0
flattening = 0.0
include_external_domain = false
refinement_levels = 2
order = 3
include_external_domain = true
r_core = 1.5
r_star = 5.0
flattening = 0.08
r_infinity = 6.0
r_instability = 1e-14
r_star = 5.0
refinement_levels = 4
core_steepness = 1.0
surface_bdr_id = 1
inf_bdr_id = 2
core_id = 1
envelope_id = 2
vacuum_id = 3
```
<!-- Table of what these parameters do -->
@@ -94,13 +99,18 @@ refinement_levels = 4
|-------------------------|-----------------------------------------------------------------------------------------------------|---------|
| refinement_levels | Number of uniform refinement levels to apply to the mesh after generation | 4 |
| order | The polynomial order of the finite elements in the mesh | 3 |
| include_external_domain | Whether to include an external domain extending to r_infinity | false |
| include_external_domain | Whether to include an external domain extending to r_infinity | true |
| r_core | The radius of the core region of the star | 1.5 |
| r_star | The radius of the star | 5.0 |
| flattening | The flattening factor of the star (0 for spherical, >0 for oblate) | 0 |
| r_infinity | The outer radius of the external domain (if included) | 6.0 |
| r_instability | The radius at which no transformations are applied to the initial topology (to avoid singularities) | 1e-14 |
| core_steepness | The steepness of the transition between the core and envelope regions of the star | 1.0 |
| surface_bdr_id | The boundary ID to assign to the surface of the star | 1 |
| inf_bdr_id | The boundary ID to assign to the outer boundary of the external domain (if included) | 2 |
| core_id | The material ID to assign to the core region of the star | 1 |
| envelope_id | The material ID to assign to the envelope region of the star | 2 |
| vacuum_id | The material ID to assign to the vacuum region of the star (if included) | 3 |
If no configuration file is provided, stroid will use the default parameters listed above. Further, configuration files

View File

@@ -12,52 +12,95 @@ namespace stroid::config {
struct MeshConfig {
/**
* @brief Number of uniform refinement passes applied after topology creation.
* @toml [main].refinement_levels
* @section toml
* - [main].refinement_levels
*/
int refinement_levels = 4;
/**
* @brief Polynomial order for high-order elements.
* @toml [main].order
* @section toml
* - [main].order
*/
int order = 3;
/**
* @brief Whether to include an external domain extending to `r_infinity`.
* @details Currently this flag does not affect mesh generation.
* @toml [main].include_external_domain
* @section toml
* - [main].include_external_domain
*/
bool include_external_domain = false;
bool include_external_domain = true;
/**
* @brief Radius of the stellar core region.
* @toml [main].r_core
* @section toml
* - [main].r_core
*/
double r_core = 1.5;
/**
* @brief Radius of the stellar surface.
* @toml [main].r_star
* @section toml
* - [main].r_star
*/
double r_star = 5.0;
/**
* @brief Flattening factor for spheroidal shaping (0 = spherical, >0 = oblate).
* @toml [main].flattening
* @section toml
* - [main].flattening
*/
double flattening = 0;
/**
* @brief Outer radius of the external domain when enabled.
* @toml [main].r_infinity
* @section toml
* - [main].r_infinity
*/
double r_infinity = 6.0;
/**
* @brief Radius inside which transformations are skipped to avoid singularities.
* @toml [main].r_instability
* @section toml
* - [main].r_instability
*/
double r_instability = 1e-14;
/**
* @brief Controls the smoothness/steepness of the core-to-envelope transition.
* @toml [main].core_steepness
* @section toml
* - [main].core_steepness
*/
double core_steepness = 1.0;
/**
* @brief Boundary attribute id for stellar surface
* @section toml
* - [main].surface_bdr_id
*/
size_t surface_bdr_id = 1;
/**
* @brief Boundary attribute id for infinity in kelvin mapping
* @section toml
* - [main].inf_bdr_id
*/
size_t inf_bdr_id = 2;
/**
* @brief Material attribute id for the core region
* @section toml
* - [main].core_id
*/
size_t core_id = 1;
/**
* @brief Material attribute id for the envelope region
* @section toml
* - [main].envelope_id
*/
size_t envelope_id = 2;
/**
* @brief Material attribute id for the external domain (if enabled)
* @section toml
* - [main].vacuum_id
*/
size_t vacuum_id = 3;
};
}

View File

@@ -3,6 +3,7 @@
#include <iostream>
#include <memory>
#include <sys/proc.h>
namespace stroid::topology {
void PromoteToHighOrder(mfem::Mesh &mesh, const fourdst::config::Config<config::MeshConfig> &config) {
@@ -22,20 +23,48 @@ namespace stroid::topology {
const int vDim = fes->GetVDim();
const int nDofs = fes->GetNDofs();
const int nElem = mesh.GetNE();
std::vector<bool> processed(nDofs, false);
mfem::Array<int> vdofs;
mfem::Vector pos(vDim);
for (int i = 0; i < nDofs; ++i) {
for (int d = 0; d < vDim; ++d) {
pos(d) = nodes(fes->DofToVDof(i, d));
}
for (int elemID = 0; elemID < nElem; ++elemID) {
const int attrID = mesh.GetAttribute(elemID);
fes->GetElementVDofs(elemID, vdofs);
TransformPoint(pos, config, 0);
for (int dofID = 0; dofID < vdofs.Size(); ++dofID) {
const int vDof = vdofs[dofID];
const int scalar_dof = (fes->GetOrdering() == mfem::Ordering::byNODES) ? vDof / vDim : vDof % nDofs;
for (int d = 0; d < vDim; ++d) {
nodes(fes->DofToVDof(i, d)) = pos(d);
if (processed[scalar_dof]) {
continue; // Skip already processed dofs. This avoids doing multiple transformations of a node if it was already transformed by a neighbor
}
for (int d = 0; d < vDim; ++d) {
pos(d) = nodes(fes->DofToVDof(scalar_dof, d));
}
TransformPoint(pos, config, attrID);
for (int d = 0; d < vDim; ++d) {
nodes(fes->DofToVDof(scalar_dof, d)) = pos(d);
}
processed[scalar_dof] = true;
}
}
// for (int i = 0; i < nDofs; ++i) {
// for (int d = 0; d < vDim; ++d) {
// pos(d) = nodes(fes->DofToVDof(i, d));
// }
//
// TransformPoint(pos, config, 0);
//
// for (int d = 0; d < vDim; ++d) {
// nodes(fes->DofToVDof(i, d)) = pos(d);
// }
// }
}
}

View File

@@ -32,20 +32,6 @@ namespace stroid::topology {
pos(2) *= (1.0 - config->flattening);
}
void ApplyKelvin(mfem::Vector &pos, const fourdst::config::Config<config::MeshConfig> &config) {
const double r = pos.Norml2();
if (r <= config->r_star) {
return;
}
double xi = (r - config->r_star) / (config->r_infinity - config->r_star);
xi = std::min(0.999, std::max(0.0, xi)); // Clamp xi to [0, 0.999]
const double r_new = config->r_star + xi / (1.0 - xi);
const double scale = r_new / r;
pos *= scale;
}
void TransformPoint(mfem::Vector &pos, const fourdst::config::Config<config::MeshConfig> &config, int attribute_id) {
double l_inf = 0.0;
for (int i = 0; i < pos.Size(); ++i) {
@@ -82,9 +68,6 @@ namespace stroid::topology {
ApplySpheroidal(pos, config);
return;
}
if (l_inf <= config->r_star) {
const double xi = (l_inf - config->r_core) / (config->r_star - config->r_core);
const double r_phys = config->r_core + xi * (config->r_star - config->r_core);
@@ -97,7 +80,6 @@ namespace stroid::topology {
pos = unit_dir;
pos *= l_inf;
ApplyKelvin(pos, config);
ApplySpheroidal(pos, config);
}
}

View File

@@ -10,7 +10,7 @@ namespace stroid::topology {
std::unique_ptr<mfem::Mesh> BuildSkeleton(const fourdst::config::Config<config::MeshConfig> & config) {
int nVert = config->include_external_domain ? 24 : 16;
int nElem = config->include_external_domain ? 13 : 7;
int nBev = 6;
int nBev = config->include_external_domain ? 12 : 6;
auto mesh = std::make_unique<mfem::Mesh>(3, nVert, nElem, nBev, 3);
@@ -28,9 +28,9 @@ namespace stroid::topology {
}
const int core_v[8] = {0, 1, 3, 2, 4, 5, 7, 6};
mesh->AddHex(core_v, 1);
mesh->AddHex(core_v, config->core_id);
int shells[6][8] = {
std::vector<std::array<int, 8>> stellar_shells = {
{8, 9, 11, 10, 0, 1, 3, 2},
{4, 5, 7, 6, 12, 13, 15, 14}, // +Z face
{0, 1, 5, 4, 8, 9, 13, 12}, // -Y face
@@ -38,9 +38,25 @@ namespace stroid::topology {
{1, 3, 7, 5, 9, 11, 15, 13}, // +X face
{0, 4, 6, 2, 8, 12, 14, 10} // -X face
};
for (const auto & shell : shells) mesh->AddHex(shell, 2);
for (const auto & shell : stellar_shells) {
mesh->AddHex(shell.data(), config->envelope_id);
}
const int bdr_quads[6][4] = {
if (config->include_external_domain) {
std::vector<std::array<int, 8>> vacuum_shells;
vacuum_shells.push_back({8, 9, 13, 12, 16, 17, 21, 20});
vacuum_shells.push_back({9, 11, 15, 13, 17, 19, 23, 21});
vacuum_shells.push_back({11, 10, 14, 15, 19, 18, 22, 23});
vacuum_shells.push_back({10, 8, 12, 14, 18, 16, 20, 22});
vacuum_shells.push_back({12, 13, 15, 14, 20, 21, 23, 22});
vacuum_shells.push_back({10, 11, 9, 8, 18, 19, 17, 16});
for (const auto & shell : vacuum_shells) {
mesh->AddHex(shell.data(), config->vacuum_id);
}
}
const int surface_bdr_quads[6][4] = {
{12, 13, 15, 14},
{13, 9, 11, 15},
{9, 8, 10, 11},
@@ -49,8 +65,23 @@ namespace stroid::topology {
{14, 15, 11, 10}
};
for (const auto& bdr: bdr_quads) {
mesh->AddBdrQuad(bdr, 1);
for (const auto& bdr: surface_bdr_quads) {
mesh->AddBdrQuad(bdr, config->surface_bdr_id);
}
if (config->include_external_domain) {
const int inf_bdr_quads[6][4] = {
{16, 17, 21, 20},
{17, 19, 23, 21},
{19, 18, 22, 23},
{18, 16, 20, 22},
{18, 19, 17, 16},
{20, 21, 23, 22}
};
for (const auto& bdr: inf_bdr_quads) {
mesh->AddBdrQuad(bdr, config->inf_bdr_id);
}
}
return mesh;

View File

@@ -4,8 +4,6 @@
namespace stroid::utils {
void MarkFlippedElements(mfem::Mesh& mesh) {
size_t total_flipped = 0;
size_t total_elements = mesh.GetNE();
for (int i = 0; i < mesh.GetNE(); i++) {
mfem::ElementTransformation *T = mesh.GetElementTransformation(i);
@@ -22,17 +20,11 @@ namespace stroid::utils {
if (is_flipped) {
mesh.SetAttribute(i, 999);
total_flipped++;
}
}
std::println("Marked {}/{} elements as flipped.", total_flipped, total_elements);
}
void MarkFlippedBoundaryElements(mfem::Mesh& mesh) {
size_t total_flipped = 0;
size_t total_boundary_elements = mesh.GetNBE();
for (int i = 0; i < mesh.GetNBE(); i++) {
mfem::ElementTransformation *T = mesh.GetBdrElementTransformation(i);
const mfem::IntegrationRule &ir = mfem::IntRules.Get(T->GetGeometryType(), 2 * T->Order());
@@ -56,9 +48,7 @@ namespace stroid::utils {
if (is_flipped) {
mesh.SetBdrAttribute(i, 500);
total_flipped++;
}
}
std::println("Marked {}/{} boundary elements as flipped.", total_flipped, total_boundary_elements);
}
}

View File

@@ -27,3 +27,5 @@ foreach test_file : test_sources
test_exe,
env: ['MESON_SOURCE_ROOT=' + meson.project_source_root(), 'MESON_BUILD_ROOT=' + meson.project_build_root()])
endforeach
subdir('sandbox')

View File

@@ -0,0 +1,15 @@
[main]
core_steepness = 1.0
flattening = 0.0
include_external_domain = true
inf_bdr_id = 2
order = 3
r_core = 1.5
r_infinity = 10.0
r_instability = 1e-14
r_star = 5.0
refinement_levels = 2
surface_bdr_id = 1
core_id = 1
envelope_id = 2
vacuum_id = 3

View File

@@ -0,0 +1 @@
executable('sandbox_test', 'sandbox_test.cpp', dependencies: [stroid_dep])

View File

@@ -0,0 +1,37 @@
#include "fourdst/config/config.h"
#include "stroid/config/config.h"
#include "stroid/IO/mesh.h"
#include "stroid/topology/curvilinear.h"
#include "stroid/topology/mapping.h"
#include "stroid/topology/topology.h"
#include "mfem.hpp"
#include <print>
struct SandboxConfig {
std::string host = "localhost";
int port = 19916;
bool visualize = true;
};
using MeshConfig = fourdst::config::Config<stroid::config::MeshConfig>;
using UserConfig = fourdst::config::Config<SandboxConfig>;
int main() {
MeshConfig mesh_cfg;
mesh_cfg.load("default.toml");
UserConfig user_cfg;
std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(mesh_cfg);
stroid::topology::Finalize(*mesh, mesh_cfg);
stroid::topology::PromoteToHighOrder(*mesh, mesh_cfg);
stroid::topology::ProjectMesh(*mesh, mesh_cfg);
stroid::IO::ViewMesh(*mesh, "Sandbox Mesh", stroid::IO::VISUALIZATION_MODE::ELEMENT_ID, user_cfg->host, user_cfg->port);
return 0;
}

View File

@@ -6,11 +6,17 @@
#include "stroid/topology/curvilinear.h"
#include "stroid/topology/mapping.h"
#include "stroid/topology/topology.h"
#include "stroid/utils/mesh_utils.h"
#include <cmath>
#include <filesystem>
#include <cstdlib>
#include <string>
#include <map>
#include <set>
#include <algorithm>
#include <array>
#include <limits>
namespace {
@@ -21,7 +27,7 @@ using Config = fourdst::config::Config<stroid::config::MeshConfig>;
std::filesystem::path GetSourceRoot() {
if (const char* env = std::getenv("MESON_SOURCE_ROOT")) {
return std::filesystem::path(env);
return {env};
}
return std::filesystem::current_path();
}
@@ -51,6 +57,182 @@ bool IsFiniteMeshNodes(const mfem::Mesh& mesh) {
return true;
}
std::map<int, int> CountVolumeAttributes(const mfem::Mesh& mesh) {
std::map<int, int> counts;
for (int i = 0; i < mesh.GetNE(); ++i) {
counts[mesh.GetAttribute(i)]++;
}
return counts;
}
std::map<int, int> CountBoundaryAttributes(const mfem::Mesh& mesh) {
std::map<int, int> counts;
for (int i = 0; i < mesh.GetNBE(); ++i) {
counts[mesh.GetBdrAttribute(i)]++;
}
return counts;
}
mfem::Vector TransformCopy(const mfem::Vector& in, const Config& cfg, int attribute_id = 0) {
mfem::Vector out = in;
stroid::topology::TransformPoint(out, cfg, attribute_id);
return out;
}
double IntegrateElementVolume(const mfem::Mesh& mesh, int element_id) {
mfem::ElementTransformation* T = const_cast<mfem::Mesh&>(mesh).GetElementTransformation(element_id);
const int order = std::max(2, 2 * T->Order() + 2);
const mfem::IntegrationRule& ir = mfem::IntRules.Get(T->GetGeometryType(), order);
double volume = 0.0;
for (int j = 0; j < ir.GetNPoints(); ++j) {
const mfem::IntegrationPoint& ip = ir.IntPoint(j);
T->SetIntPoint(&ip);
volume += ip.weight * std::abs(T->Weight());
}
return volume;
}
double ComputeMeshVolume(const mfem::Mesh& mesh) {
double volume = 0.0;
for (int i = 0; i < mesh.GetNE(); ++i) {
volume += IntegrateElementVolume(mesh, i);
}
return volume;
}
double ComputeMeshVolumeForAttributes(const mfem::Mesh& mesh, const std::set<int>& attributes) {
double volume = 0.0;
for (int i = 0; i < mesh.GetNE(); ++i) {
if (!attributes.contains(mesh.GetAttribute(i))) {
continue;
}
volume += IntegrateElementVolume(mesh, i);
}
return volume;
}
std::unique_ptr<mfem::Mesh> BuildProjectedMesh(const Config& cfg) {
std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
stroid::topology::Finalize(*mesh, cfg);
stroid::topology::PromoteToHighOrder(*mesh, cfg);
stroid::topology::ProjectMesh(*mesh, cfg);
return mesh;
}
double ComputeStellarVolumeWithDomainLFIntegrator(mfem::Mesh& mesh, const Config& cfg) {
const int mesh_max_attr = mesh.attributes.Size() > 0 ? mesh.attributes.Max() : 0;
const int cfg_max_attr = static_cast<int>(std::max({cfg->core_id, cfg->envelope_id, cfg->vacuum_id}));
const int coeff_size = std::max(1, std::max(mesh_max_attr, cfg_max_attr));
mfem::Vector attr_coeff(coeff_size);
attr_coeff = 0.0;
attr_coeff(static_cast<int>(cfg->core_id) - 1) = 1.0;
attr_coeff(static_cast<int>(cfg->envelope_id) - 1) = 1.0;
mfem::PWConstCoefficient stellar_coeff(attr_coeff);
mfem::L2_FECollection fec(0, mesh.Dimension());
mfem::FiniteElementSpace fes(&mesh, &fec);
mfem::LinearForm lf(&fes);
lf.AddDomainIntegrator(new mfem::DomainLFIntegrator(stellar_coeff));
lf.Assemble();
return lf.Sum();
}
double ColumnNorm2(const mfem::DenseMatrix& J, int col) {
double n2 = 0.0;
for (int r = 0; r < J.Height(); ++r) {
n2 += J(r, col) * J(r, col);
}
return std::sqrt(n2);
}
double ComputeHexEdgeRatio(const mfem::Mesh& mesh, int elem_id) {
static constexpr std::array<std::array<int, 2>, 12> edges = {{
{{0, 1}}, {{1, 2}}, {{2, 3}}, {{3, 0}},
{{4, 5}}, {{5, 6}}, {{6, 7}}, {{7, 4}},
{{0, 4}}, {{1, 5}}, {{2, 6}}, {{3, 7}}
}};
const mfem::Element* e = mesh.GetElement(elem_id);
if (e->GetNVertices() != 8) {
return 1.0;
}
const int* v = e->GetVertices();
double min_edge = std::numeric_limits<double>::infinity();
double max_edge = 0.0;
for (const auto& [a, b] : edges) {
const double* pa = mesh.GetVertex(v[a]);
const double* pb = mesh.GetVertex(v[b]);
const double dx = pa[0] - pb[0];
const double dy = pa[1] - pb[1];
const double dz = pa[2] - pb[2];
const double len = std::sqrt(dx * dx + dy * dy + dz * dz);
min_edge = std::min(min_edge, len);
max_edge = std::max(max_edge, len);
}
if (min_edge <= 0.0 || !std::isfinite(min_edge)) {
return std::numeric_limits<double>::infinity();
}
return max_edge / min_edge;
}
struct ConditioningStats {
double min_det = std::numeric_limits<double>::infinity();
double max_det = 0.0;
double min_scaled_jac = std::numeric_limits<double>::infinity();
double max_stretch_ratio = 0.0;
double max_edge_ratio = 0.0;
int samples = 0;
};
ConditioningStats CollectConditioningStats(const mfem::Mesh& mesh, const std::set<int>& attrs) {
ConditioningStats stats;
for (int i = 0; i < mesh.GetNE(); ++i) {
if (!attrs.empty() && !attrs.contains(mesh.GetAttribute(i))) {
continue;
}
stats.max_edge_ratio = std::max(stats.max_edge_ratio, ComputeHexEdgeRatio(mesh, i));
mfem::ElementTransformation* T = const_cast<mfem::Mesh&>(mesh).GetElementTransformation(i);
const int order = std::max(2, 2 * T->Order() + 2);
const mfem::IntegrationRule& ir = mfem::IntRules.Get(T->GetGeometryType(), order);
for (int j = 0; j < ir.GetNPoints(); ++j) {
const mfem::IntegrationPoint& ip = ir.IntPoint(j);
T->SetIntPoint(&ip);
const mfem::DenseMatrix& J = T->Jacobian();
const double det = T->Weight();
const double abs_det = std::abs(det);
const double c0 = ColumnNorm2(J, 0);
const double c1 = ColumnNorm2(J, 1);
const double c2 = ColumnNorm2(J, 2);
const double denom = c0 * c1 * c2;
const double scaled_jac = (denom > 0.0) ? (abs_det / denom) : 0.0;
const double cmax = std::max({c0, c1, c2});
const double cmin = std::max(1e-16, std::min({c0, c1, c2}));
const double stretch_ratio = cmax / cmin;
stats.min_det = std::min(stats.min_det, det);
stats.max_det = std::max(stats.max_det, abs_det);
stats.min_scaled_jac = std::min(stats.min_scaled_jac, scaled_jac);
stats.max_stretch_ratio = std::max(stats.max_stretch_ratio, stretch_ratio);
stats.samples++;
}
}
return stats;
}
} // namespace
/**
@@ -58,18 +240,80 @@ bool IsFiniteMeshNodes(const mfem::Mesh& mesh) {
*/
class stroidTest : public ::testing::Test {};
/**
* @brief Verifies the baseline block topology cardinalities in the no-vacuum case.
* @details
* Rationale: this is the fastest canary for accidental edits in block construction order,
* vertex indexing, or boundary-face assembly.
* Method: build the default skeleton and assert exact counts (3D, 16 vertices, 7 hexes, 6 bdr quads).
* If this fails: inspect `stroid::topology::BuildSkeleton` in `src/lib/topology/topology.cpp`,
* especially `add_box`, `stellar_shells`, and `surface_bdr_quads`, plus ID defaults in
* `src/include/stroid/config/config.h`.
*/
TEST_F(stroidTest, BuildSkeleton_DefaultCounts) {
const Config cfg;
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
ASSERT_NE(mesh, nullptr);
EXPECT_EQ(mesh->Dimension(), 3);
EXPECT_EQ(mesh->GetNV(), 16);
EXPECT_EQ(mesh->GetNE(), 7);
EXPECT_EQ(mesh->GetNBE(), 6);
EXPECT_EQ(mesh->GetNV(), 24);
EXPECT_EQ(mesh->GetNE(), 13);
EXPECT_EQ(mesh->GetNBE(), 12);
}
/**
* @brief Verifies topology cardinalities when the external vacuum domain is enabled.
* @details
* Rationale: external-domain regressions usually surface first as wrong element/boundary counts.
* Method: load `configs/test_external_domain.toml`, build skeleton, assert exact counts (24, 13, 12).
* If this fails: inspect vacuum block creation and infinity boundary insertion in
* `src/lib/topology/topology.cpp` (`vacuum_shells`, `inf_bdr_quads`) and config parsing path.
*/
TEST_F(stroidTest, BuildSkeleton_ExternalDomainCounts) {
const Config cfg = LoadConfigFromRepo("configs/test_external_domain.toml");
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
ASSERT_NE(mesh, nullptr);
EXPECT_EQ(mesh->Dimension(), 3);
EXPECT_EQ(mesh->GetNV(), 24);
EXPECT_EQ(mesh->GetNE(), 13);
EXPECT_EQ(mesh->GetNBE(), 12);
}
/**
* @brief Confirms attribute bookkeeping for core/envelope/vacuum and surface/infinity boundaries.
* @details
* Rationale: physics coupling depends on stable material and boundary IDs, not just geometry.
* Method: count attributes immediately after skeleton build and assert expected multiplicities.
* If this fails: inspect element insertion attribute arguments in `BuildSkeleton` and verify
* `core_id`, `envelope_id`, `vacuum_id`, `surface_bdr_id`, `inf_bdr_id` in config fixtures.
*/
TEST_F(stroidTest, BuildSkeleton_ExternalDomainAttributes) {
const Config cfg = LoadConfigFromRepo("configs/test_external_domain.toml");
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
ASSERT_NE(mesh, nullptr);
const auto volume_attr_counts = CountVolumeAttributes(*mesh);
EXPECT_EQ(volume_attr_counts.at(static_cast<int>(cfg->core_id)), 1);
EXPECT_EQ(volume_attr_counts.at(static_cast<int>(cfg->envelope_id)), 6);
EXPECT_EQ(volume_attr_counts.at(static_cast<int>(cfg->vacuum_id)), 6);
const auto boundary_attr_counts = CountBoundaryAttributes(*mesh);
EXPECT_EQ(boundary_attr_counts.at(static_cast<int>(cfg->surface_bdr_id)), 6);
EXPECT_EQ(boundary_attr_counts.at(static_cast<int>(cfg->inf_bdr_id)), 6);
}
/**
* @brief Ensures `Finalize` performs refinement and preserves conforming topology.
* @details
* Rationale: `Finalize` is the topology gate before high-order projection; nonconforming output here
* contaminates every downstream stage.
* Method: compare element count pre/post finalize and assert `mesh.Conforming()`.
* If this fails: inspect `stroid::topology::Finalize` in `src/lib/topology/topology.cpp`
* (`FinalizeTopology`, orientation checks, `UniformRefinement` loop).
*/
TEST_F(stroidTest, Finalize_RefinementIncreasesElements) {
const Config cfg;
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
@@ -81,6 +325,117 @@ TEST_F(stroidTest, Finalize_RefinementIncreasesElements) {
EXPECT_TRUE(mesh->Conforming());
}
/**
* @brief Checks exact 3D uniform-refinement scaling for default topology.
* @details
* Rationale: each hexahedron should split into 8; this catches subtle refine-loop regressions.
* Method: run with fixed `refinement_levels=2` config and assert `NE_final = NE_initial * 8^2`.
* If this fails: inspect refine-loop count and any topology-side early exits in `Finalize`.
*/
TEST_F(stroidTest, Finalize_DefaultRefinementScalesHexCountByEightPowerL) {
const Config cfg = LoadConfigFromRepo("configs/test_refinement_l2.toml");
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
const int initial_elements = mesh->GetNE();
stroid::topology::Finalize(*mesh, cfg);
const int expected = initial_elements * 8 * 8;
EXPECT_EQ(mesh->GetNE(), expected);
}
/**
* @brief Checks exact 3D uniform-refinement scaling for external-domain topology.
* @details
* Rationale: refinement behavior must be independent of whether vacuum blocks are present.
* Method: use fixed `refinement_levels=1` external config and assert `NE_final = NE_initial * 8`.
* If this fails: inspect `Finalize` and verify external-domain elements are not excluded from refinement.
*/
TEST_F(stroidTest, Finalize_ExternalDomainRefinementScalesHexCountByEightPowerL) {
const Config cfg = LoadConfigFromRepo("configs/test_external_domain_refinement_l1.toml");
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
const int initial_elements = mesh->GetNE();
stroid::topology::Finalize(*mesh, cfg);
const int expected = initial_elements * 8;
EXPECT_EQ(mesh->GetNE(), expected);
}
/**
* @brief Validates conformance + attribute presence after refining external-domain meshes.
* @details
* Rationale: refinement must not silently drop regions or boundaries in multi-material meshes.
* Method: finalize external mesh, check conforming status, growth in `NE`, and nonzero counts for expected IDs.
* If this fails: inspect `Finalize` orientation/refinement calls and any attribute mutation side effects.
*/
TEST_F(stroidTest, Finalize_ExternalDomainConformingAndRefined) {
const Config cfg = LoadConfigFromRepo("configs/test_external_domain.toml");
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
const int initial_elements = mesh->GetNE();
stroid::topology::Finalize(*mesh, cfg);
EXPECT_TRUE(mesh->Conforming());
EXPECT_GT(mesh->GetNE(), initial_elements);
const auto volume_attr_counts = CountVolumeAttributes(*mesh);
EXPECT_GT(volume_attr_counts.at(static_cast<int>(cfg->core_id)), 0);
EXPECT_GT(volume_attr_counts.at(static_cast<int>(cfg->envelope_id)), 0);
EXPECT_GT(volume_attr_counts.at(static_cast<int>(cfg->vacuum_id)), 0);
const auto boundary_attr_counts = CountBoundaryAttributes(*mesh);
EXPECT_GT(boundary_attr_counts.at(static_cast<int>(cfg->surface_bdr_id)), 0);
EXPECT_GT(boundary_attr_counts.at(static_cast<int>(cfg->inf_bdr_id)), 0);
}
/**
* @brief Enforces strict attribute set invariants after finalize.
* @details
* Rationale: presence checks alone can miss rogue IDs introduced by buggy attribute rewrites.
* Method: assert post-finalize volume/boundary attribute keys exactly match expected sets.
* If this fails: inspect all calls to `SetAttribute` / `SetBdrAttribute` in topology + utility code,
* notably `src/lib/topology/topology.cpp` and `src/lib/utils/mesh_utils.cpp`.
*/
TEST_F(stroidTest, Finalize_ExternalDomainKeepsOnlyExpectedMaterialAndBoundaryIDs) {
const Config cfg = LoadConfigFromRepo("configs/test_external_domain.toml");
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
stroid::topology::Finalize(*mesh, cfg);
const auto volume_attr_counts = CountVolumeAttributes(*mesh);
const std::set<int> expected_volume_ids = {
static_cast<int>(cfg->core_id),
static_cast<int>(cfg->envelope_id),
static_cast<int>(cfg->vacuum_id)
};
for (const auto& [attr, count] : volume_attr_counts) {
EXPECT_TRUE(expected_volume_ids.contains(attr));
EXPECT_GT(count, 0);
}
EXPECT_EQ(volume_attr_counts.size(), expected_volume_ids.size());
const auto boundary_attr_counts = CountBoundaryAttributes(*mesh);
const std::set<int> expected_boundary_ids = {
static_cast<int>(cfg->surface_bdr_id),
static_cast<int>(cfg->inf_bdr_id)
};
for (const auto& [attr, count] : boundary_attr_counts) {
EXPECT_TRUE(expected_boundary_ids.contains(attr));
EXPECT_GT(count, 0);
}
EXPECT_EQ(boundary_attr_counts.size(), expected_boundary_ids.size());
}
/**
* @brief Verifies high-order promotion actually attaches nodal data.
* @details
* Rationale: projection and most quality metrics are node-based; missing nodes means pipeline misuse.
* Method: finalize then promote, assert nodes exist and are finite.
* If this fails: inspect `stroid::topology::PromoteToHighOrder` in
* `src/lib/topology/curvilinear.cpp` (`H1_FECollection`, `SetNodalFESpace`).
*/
TEST_F(stroidTest, PromoteToHighOrder_SetsNodes) {
const Config cfg;
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
@@ -92,6 +447,14 @@ TEST_F(stroidTest, PromoteToHighOrder_SetsNodes) {
EXPECT_TRUE(IsFiniteMeshNodes(*mesh));
}
/**
* @brief Confirms projection does not produce NaN/Inf nodal coordinates.
* @details
* Rationale: finite nodes are the minimum numerical sanity condition for any downstream solver.
* Method: run full pre-projection pipeline, project once, assert all node components are finite.
* If this fails: inspect `ProjectMesh` and mapping functions in
* `src/lib/topology/curvilinear.cpp` and `src/lib/topology/mapping.cpp`.
*/
TEST_F(stroidTest, ProjectMesh_ProducesFiniteNodes) {
const Config cfg;
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
@@ -103,6 +466,13 @@ TEST_F(stroidTest, ProjectMesh_ProducesFiniteNodes) {
EXPECT_TRUE(IsFiniteMeshNodes(*mesh));
}
/**
* @brief Unit-checks equiangular mapping against closed-form tangent expression.
* @details
* Rationale: this catches formula or branch edits before they propagate into mesh-wide projection.
* Method: transform a known point and compare against explicit `tan(pi/4 * ratio)` expectations.
* If this fails: inspect `ApplyEquiangular` in `src/lib/topology/mapping.cpp`, especially dominant-axis logic.
*/
TEST_F(stroidTest, ApplyEquiangular_BasicTransform) {
mfem::Vector pos(3);
pos(0) = 1.0;
@@ -117,6 +487,14 @@ TEST_F(stroidTest, ApplyEquiangular_BasicTransform) {
EXPECT_NEAR(pos(2), expected_z, 1e-12);
}
/**
* @brief Verifies spheroidal flattening scales only the z component as configured.
* @details
* Rationale: flattening is intentionally simple and should remain easy to reason about.
* Method: load flattening config, apply transform to z-axis point, check exact expected z.
* If this fails: inspect `ApplySpheroidal` in `src/lib/topology/mapping.cpp` and fixture values in
* `configs/test_flattening.toml`.
*/
TEST_F(stroidTest, ApplySpheroidal_FlattensZ) {
const Config cfg = LoadConfigFromRepo("configs/test_flattening.toml");
@@ -130,21 +508,14 @@ TEST_F(stroidTest, ApplySpheroidal_FlattensZ) {
EXPECT_NEAR(pos(2), 8.0, 1e-12);
}
TEST_F(stroidTest, ApplyKelvin_ExpandsOutsideStar) {
const Config cfg;
mfem::Vector pos(3);
pos(0) = 5.5;
pos(1) = 0.0;
pos(2) = 0.0;
stroid::topology::ApplyKelvin(pos, cfg);
EXPECT_NEAR(pos(0), 6.0, 1e-12);
EXPECT_NEAR(pos(1), 0.0, 1e-12);
EXPECT_NEAR(pos(2), 0.0, 1e-12);
}
/**
* @brief Ensures axis-aligned points inside the core stay unchanged in this mapping regime.
* @details
* Rationale: axis points are symmetry anchors; any drift here is usually a serious branch regression.
* Method: map `(1,0,0)` with default config and assert identity.
* If this fails: inspect `TransformPoint` core-zone blend path and instability guard in
* `src/lib/topology/mapping.cpp`.
*/
TEST_F(stroidTest, TransformPoint_AxisInsideCore_NoChange) {
const Config cfg;
@@ -160,6 +531,13 @@ TEST_F(stroidTest, TransformPoint_AxisInsideCore_NoChange) {
EXPECT_NEAR(pos(2), 0.0, 1e-12);
}
/**
* @brief Ensures axis-aligned envelope points remain unchanged under default spherical setup.
* @details
* Rationale: this verifies envelope branch consistency and avoids silent radial drift.
* Method: map `(3,0,0)` and assert identity under default parameters.
* If this fails: inspect `TransformPoint` envelope branch and normalized-direction reconstruction logic.
*/
TEST_F(stroidTest, TransformPoint_AxisEnvelope_NoChange) {
const Config cfg;
@@ -175,21 +553,92 @@ TEST_F(stroidTest, TransformPoint_AxisEnvelope_NoChange) {
EXPECT_NEAR(pos(2), 0.0, 1e-12);
}
TEST_F(stroidTest, TransformPoint_AxisOutsideStar_KelvinExpands) {
/**
* @brief Checks continuity near `r_core` and `r_star` transition surfaces.
* @details
* Rationale: discontinuities at interfaces destabilize high-order interpolation and integration.
* Method: evaluate points at `r*(1±eps)` and assert mapped separation stays small in L2 norm.
* If this fails: inspect transition formulas in `TransformPoint` (core blend, envelope mapping)
* and any recent edits to `core_steepness` handling.
*/
TEST_F(stroidTest, TransformPoint_IsContinuousAcrossCoreAndStarInterfaces) {
const Config cfg;
constexpr double eps = 1e-6;
mfem::Vector pos(3);
pos(0) = 5.5;
pos(1) = 0.0;
pos(2) = 0.0;
mfem::Vector dir(3);
dir(0) = 1.0;
dir(1) = 0.6;
dir(2) = -0.4;
stroid::topology::TransformPoint(pos, cfg, 0);
mfem::Vector near_core_left = dir;
near_core_left *= cfg->r_core * (1.0 - eps);
mfem::Vector near_core_right = dir;
near_core_right *= cfg->r_core * (1.0 + eps);
EXPECT_NEAR(pos(0), 6.0, 1e-12);
EXPECT_NEAR(pos(1), 0.0, 1e-12);
EXPECT_NEAR(pos(2), 0.0, 1e-12);
const mfem::Vector core_left_mapped = TransformCopy(near_core_left, cfg);
const mfem::Vector core_right_mapped = TransformCopy(near_core_right, cfg);
mfem::Vector diff = core_left_mapped;
diff -= core_right_mapped;
EXPECT_LT(diff.Norml2(), 1e-3);
mfem::Vector near_star_left = dir;
near_star_left *= cfg->r_star * (1.0 - eps);
mfem::Vector near_star_right = dir;
near_star_right *= cfg->r_star * (1.0 + eps);
const mfem::Vector star_left_mapped = TransformCopy(near_star_left, cfg);
const mfem::Vector star_right_mapped = TransformCopy(near_star_right, cfg);
diff = star_left_mapped;
diff -= star_right_mapped;
EXPECT_LT(diff.Norml2(), 1e-3);
}
/**
* @brief Verifies expected sign and axis-permutation symmetry in the spherical case.
* @details
* Rationale: symmetry violations usually indicate branch asymmetry bugs in mapping logic.
* Method: compare mapped values for original, sign-flipped, and axis-swapped points.
* If this fails: inspect dominant-axis branching in `ApplyEquiangular` and normalization flow in
* `TransformPoint`.
*/
TEST_F(stroidTest, TransformPoint_RespectsSignAndAxisPermutationSymmetryWithoutFlattening) {
const Config cfg;
mfem::Vector p(3);
p(0) = 4.0;
p(1) = 2.0;
p(2) = 1.0;
mfem::Vector p_neg = p;
p_neg *= -1.0;
mfem::Vector p_swapped(3);
p_swapped(0) = p(1);
p_swapped(1) = p(0);
p_swapped(2) = p(2);
const mfem::Vector mapped = TransformCopy(p, cfg);
const mfem::Vector mapped_neg = TransformCopy(p_neg, cfg);
const mfem::Vector mapped_swapped = TransformCopy(p_swapped, cfg);
EXPECT_NEAR(mapped_neg(0), -mapped(0), 1e-12);
EXPECT_NEAR(mapped_neg(1), -mapped(1), 1e-12);
EXPECT_NEAR(mapped_neg(2), -mapped(2), 1e-12);
EXPECT_NEAR(mapped_swapped(0), mapped(1), 1e-12);
EXPECT_NEAR(mapped_swapped(1), mapped(0), 1e-12);
EXPECT_NEAR(mapped_swapped(2), mapped(2), 1e-12);
}
/**
* @brief Smoke-tests mesh serialization to MFEM format.
* @details
* Rationale: I/O regressions are easy to miss during geometry-focused development.
* Method: write a finalized mesh to temp storage and assert file exists and is non-empty.
* If this fails: inspect `stroid::IO::SaveMesh` in `src/lib/IO/mesh.cpp` and local filesystem perms.
*/
TEST_F(stroidTest, SaveMesh_WritesFile) {
const Config cfg;
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
@@ -207,6 +656,14 @@ TEST_F(stroidTest, SaveMesh_WritesFile) {
std::filesystem::remove(mesh_path, ec);
}
/**
* @brief End-to-end baseline pipeline test for the default domain.
* @details
* Rationale: validates the canonical operation order used by both library examples and CLI.
* Method: execute full pipeline and assert non-empty, nodal, finite output mesh.
* If this fails: check call-order assumptions and recent edits in
* `src/lib/topology/topology.cpp` / `src/lib/topology/curvilinear.cpp`.
*/
TEST_F(stroidTest, EndToEnd_BuildFinalizePromoteProject) {
const Config cfg;
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
@@ -218,3 +675,215 @@ TEST_F(stroidTest, EndToEnd_BuildFinalizePromoteProject) {
EXPECT_NE(mesh->GetNodes(), nullptr);
EXPECT_TRUE(IsFiniteMeshNodes(*mesh));
}
/**
* @brief End-to-end pipeline test for external-domain meshes.
* @details
* Rationale: confirms the same pipeline remains valid when vacuum blocks are included.
* Method: run full external-domain pipeline and assert conforming + finite nodal output.
* If this fails: inspect external-domain topology assembly and projection loops over mixed attributes.
*/
TEST_F(stroidTest, EndToEnd_ExternalDomainBuildFinalizePromoteProject) {
const Config cfg = LoadConfigFromRepo("configs/test_external_domain.toml");
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
stroid::topology::Finalize(*mesh, cfg);
stroid::topology::PromoteToHighOrder(*mesh, cfg);
stroid::topology::ProjectMesh(*mesh, cfg);
EXPECT_TRUE(mesh->Conforming());
EXPECT_GT(mesh->GetNE(), 0);
EXPECT_NE(mesh->GetNodes(), nullptr);
EXPECT_TRUE(IsFiniteMeshNodes(*mesh));
}
/**
* @brief Verifies stellar volume invariance with respect to adding a vacuum shell.
* @details
* Rationale: the vacuum region should extend domain extent, not alter stellar mass volume.
* Method: integrate core+envelope volume in both configs and compare relative difference.
* If this fails: inspect attribute-filtered volume helpers in this file and mapping/topology changes
* that may leak starside nodes into vacuum geometry.
*/
TEST_F(stroidTest, Volume_StellarDomainMatchesWithAndWithoutExternalDomain) {
const Config no_external_cfg = LoadConfigFromRepo("configs/test_volume_no_external.toml");
const Config with_external_cfg = LoadConfigFromRepo("configs/test_volume_with_external.toml");
const std::unique_ptr<mfem::Mesh> no_external_mesh = stroid::topology::BuildSkeleton(no_external_cfg);
stroid::topology::Finalize(*no_external_mesh, no_external_cfg);
stroid::topology::PromoteToHighOrder(*no_external_mesh, no_external_cfg);
stroid::topology::ProjectMesh(*no_external_mesh, no_external_cfg);
const std::unique_ptr<mfem::Mesh> with_external_mesh = stroid::topology::BuildSkeleton(with_external_cfg);
stroid::topology::Finalize(*with_external_mesh, with_external_cfg);
stroid::topology::PromoteToHighOrder(*with_external_mesh, with_external_cfg);
stroid::topology::ProjectMesh(*with_external_mesh, with_external_cfg);
const std::set<int> stellar_attrs_no_external = {
static_cast<int>(no_external_cfg->core_id),
static_cast<int>(no_external_cfg->envelope_id)
};
const std::set<int> stellar_attrs_with_external = {
static_cast<int>(with_external_cfg->core_id),
static_cast<int>(with_external_cfg->envelope_id)
};
const double stellar_volume_no_external = ComputeMeshVolumeForAttributes(*no_external_mesh, stellar_attrs_no_external);
const double stellar_volume_with_external = ComputeMeshVolumeForAttributes(*with_external_mesh, stellar_attrs_with_external);
const double rel_diff = std::abs(stellar_volume_with_external - stellar_volume_no_external) /
std::max(stellar_volume_with_external, stellar_volume_no_external);
EXPECT_LT(rel_diff, 5e-3);
}
/**
* @brief Confirms total volume decomposition into stellar + vacuum components.
* @details
* Rationale: this explicitly checks that vacuum exclusion logic is doing real work, not a no-op.
* Method: on external mesh, compute total, stellar-only, and vacuum-only volumes and enforce
* additive consistency.
* If this fails: inspect `ComputeMeshVolume*` helpers and region attribute IDs in config fixtures.
*/
TEST_F(stroidTest, Volume_ExternalMeshExcludesVacuumWhenRequested) {
const Config cfg = LoadConfigFromRepo("configs/test_volume_with_external.toml");
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
stroid::topology::Finalize(*mesh, cfg);
stroid::topology::PromoteToHighOrder(*mesh, cfg);
stroid::topology::ProjectMesh(*mesh, cfg);
const std::set<int> stellar_attrs = {
static_cast<int>(cfg->core_id),
static_cast<int>(cfg->envelope_id)
};
const std::set<int> vacuum_attr = {static_cast<int>(cfg->vacuum_id)};
const double total_volume = ComputeMeshVolume(*mesh);
const double stellar_volume = ComputeMeshVolumeForAttributes(*mesh, stellar_attrs);
const double vacuum_volume = ComputeMeshVolumeForAttributes(*mesh, vacuum_attr);
EXPECT_GT(vacuum_volume, 0.0);
EXPECT_GT(total_volume, stellar_volume);
EXPECT_NEAR(total_volume, stellar_volume + vacuum_volume, total_volume * 1e-9 + 1e-12);
}
/**
* @brief Compares direct Jacobian-based stellar volume to analytic sphere volume.
* @details
* Rationale: anchors numerical integration against a closed-form reference in the spherical limit.
* Method: integrate core+envelope using element transformations, compare to `4/3*pi*r_star^3`.
* If this fails: inspect mapping spherical path (`flattening=0`) and quadrature order in
* `IntegrateElementVolume`.
*/
TEST_F(stroidTest, Volume_SphericalStellarDomainMatchesAnalyticSphere) {
const Config cfg = LoadConfigFromRepo("configs/test_volume_spherical_no_external.toml");
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
stroid::topology::Finalize(*mesh, cfg);
stroid::topology::PromoteToHighOrder(*mesh, cfg);
stroid::topology::ProjectMesh(*mesh, cfg);
const std::set<int> stellar_attrs = {
static_cast<int>(cfg->core_id),
static_cast<int>(cfg->envelope_id)
};
const double measured_volume = ComputeMeshVolumeForAttributes(*mesh, stellar_attrs);
const double analytic_volume = 4.0 / 3.0 * kPi * std::pow(cfg->r_star, 3.0);
const double rel_err = std::abs(measured_volume - analytic_volume) / analytic_volume;
EXPECT_LT(rel_err, 1e-2);
}
/**
* @brief Repeats spherical analytic-volume check via MFEM `DomainLFIntegrator`.
* @details
* Rationale: independent integration machinery lowers the risk of helper-specific false confidence.
* Method: build attribute-weighted `PWConstCoefficient` (core+envelope=1, vacuum=0), assemble
* domain linear form, and compare against analytic sphere volume.
* If this fails: inspect coefficient indexing (attr-1 convention), `ComputeStellarVolumeWithDomainLFIntegrator`,
* and MFEM assembly setup in this test file.
*/
TEST_F(stroidTest, Volume_SphericalStellarDomainDomainLFIntegratorMatchesAnalyticSphere) {
const Config cfg = LoadConfigFromRepo("configs/test_volume_spherical_with_external.toml");
std::unique_ptr<mfem::Mesh> mesh = BuildProjectedMesh(cfg);
const double measured_volume = ComputeStellarVolumeWithDomainLFIntegrator(*mesh, cfg);
const double analytic_volume = 4.0 / 3.0 * kPi * std::pow(cfg->r_star, 3.0);
const double rel_err = std::abs(measured_volume - analytic_volume) / analytic_volume;
EXPECT_LT(rel_err, 1e-2);
}
/**
* @brief Enforces baseline conditioning bounds for the default projected mesh.
* @details
* Rationale: this guards against silent degradation in element quality that may still pass finiteness checks.
* Method: sample Jacobian stats over quadrature points and assert positivity + distortion/stretch bounds.
* If this fails: inspect mapping formulas in `src/lib/topology/mapping.cpp` and any changes to
* refinement/order config used by `configs/test_volume_spherical_no_external.toml`.
*/
TEST_F(stroidTest, Conditioning_DefaultMeshHasPositiveJacobiansAndReasonableShape) {
const Config cfg = LoadConfigFromRepo("configs/test_volume_spherical_no_external.toml");
const std::unique_ptr<mfem::Mesh> mesh = BuildProjectedMesh(cfg);
const ConditioningStats stats = CollectConditioningStats(*mesh, {});
ASSERT_GT(stats.samples, 0);
EXPECT_GT(stats.min_det, 1e-10);
EXPECT_LT(stats.max_det / stats.min_det, 1e6);
EXPECT_GT(stats.min_scaled_jac, 2e-2);
EXPECT_LT(stats.max_stretch_ratio, 50.0);
EXPECT_LT(stats.max_edge_ratio, 50.0);
}
/**
* @brief Applies Jacobian conditioning checks independently to core, envelope, and vacuum regions.
* @details
* Rationale: global stats can hide localized failures; region-level checks make regressions diagnosable.
* Method: collect conditioning statistics per attribute and enforce positive Jacobians + scaled-Jacobian floors.
* If this fails: inspect region-specific mapping behavior in `TransformPoint` and verify attribute
* assignment in `BuildSkeleton`.
*/
TEST_F(stroidTest, Conditioning_ExternalMeshPerRegionHasPositiveJacobians) {
const Config cfg = LoadConfigFromRepo("configs/test_volume_spherical_with_external.toml");
const std::unique_ptr<mfem::Mesh> mesh = BuildProjectedMesh(cfg);
const ConditioningStats core_stats = CollectConditioningStats(*mesh, {static_cast<int>(cfg->core_id)});
const ConditioningStats envelope_stats = CollectConditioningStats(*mesh, {static_cast<int>(cfg->envelope_id)});
const ConditioningStats vacuum_stats = CollectConditioningStats(*mesh, {static_cast<int>(cfg->vacuum_id)});
ASSERT_GT(core_stats.samples, 0);
ASSERT_GT(envelope_stats.samples, 0);
ASSERT_GT(vacuum_stats.samples, 0);
EXPECT_GT(core_stats.min_det, 1e-10);
EXPECT_GT(envelope_stats.min_det, 1e-10);
EXPECT_GT(vacuum_stats.min_det, 1e-10);
EXPECT_GT(core_stats.min_scaled_jac, 2e-2);
EXPECT_GT(envelope_stats.min_scaled_jac, 2e-2);
EXPECT_GT(vacuum_stats.min_scaled_jac, 1e-3);
}
/**
* @brief Validates orientation quality via flipped-element and flipped-boundary markers.
* @details
* Rationale: this is a direct orientation sanity check using project utilities already used for debugging.
* Method: run `MarkFlippedElements`/`MarkFlippedBoundaryElements` and assert sentinel attrs are absent.
* If this fails: inspect Jacobian sign behavior and boundary normal orientation code in
* `src/lib/utils/mesh_utils.cpp`, then trace upstream mapping changes.
*/
TEST_F(stroidTest, Conditioning_DefaultMeshHasNoFlippedElementsOrBoundaryFaces) {
const Config cfg = LoadConfigFromRepo("configs/test_volume_spherical_no_external.toml");
std::unique_ptr<mfem::Mesh> mesh = BuildProjectedMesh(cfg);
stroid::utils::MarkFlippedElements(*mesh);
stroid::utils::MarkFlippedBoundaryElements(*mesh);
const auto volume_attr_counts = CountVolumeAttributes(*mesh);
const auto boundary_attr_counts = CountBoundaryAttributes(*mesh);
EXPECT_FALSE(volume_attr_counts.contains(999));
EXPECT_FALSE(boundary_attr_counts.contains(500));
}

View File

@@ -0,0 +1,46 @@
import matplotlib.pyplot as plt
class Box:
def __init__(self, scale, vc="red", ec="blue", offset=0):
self.scale = scale
self.offset = offset
self.verticies = [[scale, -scale, -scale], [scale, scale, -scale], [-scale, -scale, -scale], [-scale, scale, -scale], [scale, -scale, scale], [scale, scale, scale], [-scale, -scale, scale], [-scale, scale, scale]]
self.edges = [[0, 1], [0, 2], [0, 4], [1, 3], [1, 5], [3, 7], [3, 2], [2, 6], [4, 5], [4, 6], [5, 7], [7, 6]]
self.edge_color = ec
self.vertex_color = vc
def plot(self, ax, vlabel=True, elabel=False):
for vertID, vert in enumerate(self.verticies):
ax.scatter(vert[0], vert[1], vert[2], c=self.vertex_color)
if vlabel:
ax.text(vert[0], vert[1], vert[2], f"{self.offset + vertID}", fontsize=25)
for edge in self.edges:
ax.plot([self.verticies[edge[0]][0], self.verticies[edge[1]][0]], [self.verticies[edge[0]][1], self.verticies[edge[1]][1]], [self.verticies[edge[0]][2], self.verticies[edge[1]][2]], color=self.edge_color)
class Wedge:
def __init__(self, A, B, ec="green"):
self.A = A
self.B = B
self.edge_color = ec
def plot(self, ax):
for vA, vB in zip(self.A.verticies, self.B.verticies):
ax.plot([vA[0], vB[0]], [vA[1], vB[1]], [vA[2], vB[2]], color=self.edge_color)
def main():
core = Box(0.5)
envelope = Box(2, offset=8)
star = Wedge(core, envelope)
infinity = Box(5, offset=16)
vacuum = Wedge(envelope, infinity)
fig, ax = plt.subplots(1, 1, figsize=(10, 10), subplot_kw={"projection": "3d"})
core.plot(ax)
envelope.plot(ax)
star.plot(ax)
infinity.plot(ax)
vacuum.plot(ax)
ax.view_init(30, 30)
plt.show()
if __name__ == "__main__":
main()

View File

@@ -112,11 +112,13 @@ int main(int argc, char** argv) {
info->add_flag_callback("-v,--version", []() {
std::println("Stroid Version {}", stroid::version::toString());
exit(0);
}, "Display stroid version information");
info->add_flag_callback("-d,--default", [&cfg]() {
cfg.save("default.toml");
std::println("Default configuration saved to default.toml");
exit(0);
}, "Save the default configuration to default.toml");
try {