Files
MeanField_SERiF/docs/xml/kelvin_8cpp.xml

533 lines
70 KiB
XML
Raw Permalink Normal View History

<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.13.2" xml:lang="en-US">
<compounddef id="kelvin_8cpp" kind="file" language="C++">
<compoundname>kelvin.cpp</compoundname>
<includes local="no">cmath</includes>
<includes refid="backend_2mfem_2shared_2finite_8hpp" local="yes">serif/backend/mfem/shared/finite.hpp</includes>
<includes refid="backend_2mfem_2mapping_2compactification_2kelvin_8hpp" local="yes">serif/backend/mfem/mapping/compactification/kelvin.hpp</includes>
<includes refid="utils_2user__options_2mapping_2compactification_2kelvin_8hpp" local="yes">serif/utils/user_options/mapping/compactification/kelvin.hpp</includes>
<includes refid="errors_8hpp" local="yes">serif/utils/error/errors.hpp</includes>
<incdepgraph>
<node id="19">
<label>serif/backend/mfem/mapping/compactification/compactification.hpp</label>
<link refid="compactification_8hpp"/>
<childnode refid="11" relation="include">
</childnode>
<childnode refid="20" relation="include">
</childnode>
<childnode refid="12" relation="include">
</childnode>
<childnode refid="21" relation="include">
</childnode>
<childnode refid="22" relation="include">
</childnode>
</node>
<node id="21">
<label>serif/backend/mfem/mapping/compactification/input_result.hpp</label>
<link refid="input__result_8hpp"/>
<childnode refid="8" relation="include">
</childnode>
<childnode refid="9" relation="include">
</childnode>
</node>
<node id="10">
<label>serif/backend/mfem/mapping/compactification/kelvin.hpp</label>
<link refid="backend_2mfem_2mapping_2compactification_2kelvin_8hpp"/>
<childnode refid="11" relation="include">
</childnode>
<childnode refid="8" relation="include">
</childnode>
<childnode refid="12" relation="include">
</childnode>
<childnode refid="19" relation="include">
</childnode>
<childnode refid="23" relation="include">
</childnode>
</node>
<node id="22">
<label>serif/backend/mfem/mapping/compactification/variation.hpp</label>
<link refid="compactification_2variation_8hpp"/>
<childnode refid="8" relation="include">
</childnode>
<childnode refid="9" relation="include">
</childnode>
</node>
<node id="12">
<label>serif/backend/mfem/mapping/status.hpp</label>
<link refid="status_8hpp"/>
<childnode refid="13" relation="include">
</childnode>
<childnode refid="14" relation="include">
</childnode>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="16" relation="include">
</childnode>
<childnode refid="17" relation="include">
</childnode>
</node>
<node id="3">
<label>serif/backend/mfem/shared/finite.hpp</label>
<link refid="backend_2mfem_2shared_2finite_8hpp"/>
<childnode refid="4" relation="include">
</childnode>
<childnode refid="8" relation="include">
</childnode>
<childnode refid="9" relation="include">
</childnode>
</node>
<node id="17">
<label>serif/meta/enums.hpp</label>
<link refid="enums_8hpp"/>
<childnode refid="13" relation="include">
</childnode>
<childnode refid="7" relation="include">
</childnode>
<childnode refid="18" relation="include">
</childnode>
</node>
<node id="4">
<label>serif/utils/checks/finite.hpp</label>
<link refid="utils_2checks_2finite_8hpp"/>
<childnode refid="2" relation="include">
</childnode>
<childnode refid="5" relation="include">
</childnode>
</node>
<node id="16">
<label>serif/utils/error/codes.hpp</label>
<link refid="codes_8hpp"/>
<childnode refid="14" relation="include">
</childnode>
<childnode refid="17" relation="include">
</childnode>
</node>
<node id="24">
<label>serif/utils/error/errors.hpp</label>
<link refid="errors_8hpp"/>
<childnode refid="11" relation="include">
</childnode>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="27" relation="include">
</childnode>
<childnode refid="14" relation="include">
</childnode>
<childnode refid="28" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="30" relation="include">
</childnode>
<childnode refid="33" relation="include">
</childnode>
<childnode refid="16" relation="include">
</childnode>
<childnode refid="35" relation="include">
</childnode>
</node>
<node id="33">
<label>serif/utils/misc/concepts/exceptions.hpp</label>
<link refid="utils_2misc_2concepts_2exceptions_8hpp"/>
<childnode refid="34" relation="include">
</childnode>
<childnode refid="7" relation="include">
</childnode>
<childnode refid="5" relation="include">
</childnode>
</node>
<node id="5">
<label>serif/utils/misc/concepts/numeric.hpp</label>
<link refid="numeric_8hpp"/>
<childnode refid="6" relation="include">
</childnode>
<childnode refid="7" relation="include">
</childnode>
</node>
<node id="30">
<label>serif/utils/misc/terminal/colors.hpp</label>
<link refid="colors_8hpp"/>
<childnode refid="11" relation="include">
</childnode>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="31" relation="include">
</childnode>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="32" relation="include">
</childnode>
</node>
<node id="35">
<label>serif/utils/types/strings.hpp</label>
<link refid="types_2strings_8hpp"/>
<childnode refid="28" relation="include">
</childnode>
<childnode refid="36" relation="include">
</childnode>
<childnode refid="11" relation="include">
</childnode>
</node>
<node id="23">
<label>serif/utils/user_options/mapping/compactification/kelvin.hpp</label>
<link refid="utils_2user__options_2mapping_2compactification_2kelvin_8hpp"/>
</node>
<node id="1">
<label>src/lib/serif/backend/mfem/mapping/compactification/kelvin.cpp</label>
<link refid="kelvin_8cpp"/>
<childnode refid="2" relation="include">
</childnode>
<childnode refid="3" relation="include">
</childnode>
<childnode refid="10" relation="include">
</childnode>
<childnode refid="23" relation="include">
</childnode>
<childnode refid="24" relation="include">
</childnode>
</node>
<node id="28">
<label>algorithm</label>
</node>
<node id="2">
<label>cmath</label>
</node>
<node id="6">
<label>concepts</label>
</node>
<node id="14">
<label>cstdint</label>
</node>
<node id="26">
<label>cstdio</label>
</node>
<node id="31">
<label>cstdlib</label>
</node>
<node id="34">
<label>exception</label>
</node>
<node id="25">
<label>format</label>
</node>
<node id="36">
<label>iostream</label>
</node>
<node id="18">
<label>magic_enum/magic_enum_all.hpp</label>
</node>
<node id="20">
<label>memory</label>
</node>
<node id="9">
<label>mfem/linalg/densemat.hpp</label>
</node>
<node id="8">
<label>mfem/linalg/vector.hpp</label>
</node>
<node id="27">
<label>string</label>
</node>
<node id="11">
<label>string_view</label>
</node>
<node id="7">
<label>type_traits</label>
</node>
<node id="32">
<label>unistd.h</label>
</node>
<node id="13">
<label>unordered_map</label>
</node>
<node id="15">
<label>utility</label>
</node>
<node id="29">
<label>version</label>
</node>
</incdepgraph>
<innernamespace refid="namespaceserif">serif</innernamespace>
<innernamespace refid="namespaceserif_1_1mapping">serif::mapping</innernamespace>
<innernamespace refid="namespaceserif_1_1mapping_1_1compactification">serif::mapping::compactification</innernamespace>
<briefdescription>
</briefdescription>
<detaileddescription>
</detaileddescription>
<programlisting>
<codeline lineno="1"><highlight class="preprocessor">#include<sp/>&lt;cmath&gt;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="2"><highlight class="normal"></highlight></codeline>
<codeline lineno="3"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="backend_2mfem_2shared_2finite_8hpp" kindref="compound">serif/backend/mfem/shared/finite.hpp</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="4"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="backend_2mfem_2mapping_2compactification_2kelvin_8hpp" kindref="compound">serif/backend/mfem/mapping/compactification/kelvin.hpp</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="5"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="utils_2user__options_2mapping_2compactification_2kelvin_8hpp" kindref="compound">serif/utils/user_options/mapping/compactification/kelvin.hpp</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="6"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="errors_8hpp" kindref="compound">serif/utils/error/errors.hpp</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="7"><highlight class="normal"></highlight></codeline>
<codeline lineno="8"><highlight class="normal"></highlight><highlight class="keyword">namespace<sp/></highlight><highlight class="normal"><ref refid="namespaceserif_1_1mapping_1_1compactification" kindref="compound">serif::mapping::compactification</ref><sp/>{</highlight></codeline>
<codeline lineno="9"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">using<sp/>namespace<sp/></highlight><highlight class="normal">serif::utils::user_options;</highlight></codeline>
<codeline lineno="10"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">using<sp/>namespace<sp/></highlight><highlight class="normal">serif::utils::errors;</highlight></codeline>
<codeline lineno="11"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">using<sp/>namespace<sp/></highlight><highlight class="normal">serif::utils::checks;</highlight></codeline>
<codeline lineno="12"><highlight class="normal"></highlight></codeline>
<codeline lineno="13"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="classserif_1_1mapping_1_1compactification_1_1_kelvin_compactification_1a7f4fe052b888212c89eb61b77f559169" kindref="member">KelvinCompactification::KelvinCompactification</ref>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="structserif_1_1utils_1_1user__options_1_1_kelvin_compactification_options" kindref="compound">KelvinCompactificationOptions</ref>&amp;<sp/>options)<sp/>:<sp/>m_options(options)<sp/>{</highlight></codeline>
<codeline lineno="14"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(!std::isfinite(m_options.r_star_ref))<sp/>{</highlight></codeline>
<codeline lineno="15"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>serif_error&lt;std::invalid_argument,<sp/>SERiFErrorCode::NON_FINITE_MAPPING_INPUT&gt;(</highlight><highlight class="stringliteral">&quot;Kelvin<sp/>compactification<sp/>requires<sp/>a<sp/>finite<sp/>reference<sp/>stellar<sp/>radius.<sp/>Received<sp/>{}<sp/>&quot;</highlight><highlight class="normal">,<sp/>m_options.r_star_ref);</highlight></codeline>
<codeline lineno="16"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="17"><highlight class="normal"></highlight></codeline>
<codeline lineno="18"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>if<sp/>(!std::isfinite(m_options.r_inf_ref))<sp/>{</highlight></codeline>
<codeline lineno="19"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>serif_error&lt;std::invalid_argument,<sp/>SERiFErrorCode::NON_FINITE_MAPPING_INPUT&gt;(</highlight><highlight class="stringliteral">&quot;Kelvin<sp/>compactification<sp/>requires<sp/>a<sp/>finite<sp/>reference<sp/>infinity<sp/>radius.<sp/>Received<sp/>{}<sp/>&quot;</highlight><highlight class="normal">,<sp/>m_options.r_star_ref);</highlight></codeline>
<codeline lineno="20"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="21"><highlight class="normal"></highlight></codeline>
<codeline lineno="22"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>if<sp/>(m_options.r_star_ref<sp/>&lt;=<sp/>0<sp/>||<sp/>m_options.r_inf_ref<sp/>&lt;=<sp/>m_options.r_star_ref)</highlight></codeline>
<codeline lineno="23"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="24"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>serif_error&lt;std::invalid_argument,<sp/>SERiFErrorCode::IMPROPERLY_ORDERED_REFERENCE_RADII&gt;(</highlight><highlight class="stringliteral">&quot;Kelvin<sp/>compactification<sp/>requires<sp/>0<sp/>&lt;<sp/>r_star_ref<sp/>&lt;<sp/>r_inf_ref.<sp/>Got<sp/>r_star_ref={}<sp/>and<sp/>r_inf_ref={}&quot;</highlight><highlight class="normal">,<sp/>m_options.r_star_ref,<sp/>m_options.r_inf_ref);</highlight></codeline>
<codeline lineno="25"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="26"><highlight class="normal"></highlight></codeline>
<codeline lineno="27"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>if<sp/>(!std::isfinite(m_options.coordinate_tolerance)<sp/>||<sp/>m_options.coordinate_tolerance<sp/>&lt;<sp/>0.0<sp/>||<sp/>m_options.coordinate_tolerance<sp/>&gt;=<sp/>1.0)</highlight></codeline>
<codeline lineno="28"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="29"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>serif_error&lt;std::invalid_argument,<sp/>SERiFErrorCode::INVALID_COORDINATE_TOLERANCE&gt;(</highlight><highlight class="stringliteral">&quot;Kelvin<sp/>compactification<sp/>coordinate<sp/>tolerance<sp/>must<sp/>be<sp/>finite<sp/>and<sp/>on<sp/>[0,<sp/>1).<sp/>Received:<sp/>{}&quot;</highlight><highlight class="normal">,<sp/>m_options.coordinate_tolerance);</highlight></codeline>
<codeline lineno="30"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="31"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="32"><highlight class="normal"></highlight></codeline>
<codeline lineno="33"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>KelvinCompactification::is_affine_in_displacement()<sp/>const<sp/>noexcept<sp/>{</highlight></codeline>
<codeline lineno="34"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">true</highlight><highlight class="normal">;<sp/></highlight><highlight class="comment">//<sp/>Always<sp/>true<sp/>for<sp/>kelvin<sp/>compactification</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="35"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="36"><highlight class="normal"></highlight></codeline>
<codeline lineno="37"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespaceserif_1_1mapping_1a4d8ed5ebf76c79667efd6777f3ee3b97" kindref="member">MappingStatus</ref><sp/>KelvinCompactification::evaluate(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>ExteriorMapInput&amp;<sp/>input,<sp/>ExteriorMapResult&amp;<sp/>result)</highlight><highlight class="keyword"><sp/>const<sp/></highlight><highlight class="normal">{</highlight></codeline>
<codeline lineno="38"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>dimension<sp/>=<sp/>input.reference_position.Size();</highlight></codeline>
<codeline lineno="39"><highlight class="normal"></highlight></codeline>
<codeline lineno="40"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(dimension<sp/>&lt;=<sp/>0<sp/>||<sp/>input.displaced_position.Size()<sp/>!=<sp/>dimension<sp/>||<sp/>input.compactification_coordinate_gradient.Size()<sp/>!=<sp/>dimension)<sp/>{</highlight></codeline>
<codeline lineno="41"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::INVALID_DIMENSION;</highlight></codeline>
<codeline lineno="42"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="43"><highlight class="normal"></highlight></codeline>
<codeline lineno="44"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(input.displacement_jacobian.Height()<sp/>!=<sp/>dimension<sp/>||<sp/>input.displacement_jacobian.Width()<sp/>!=<sp/>dimension)<sp/>{</highlight></codeline>
<codeline lineno="45"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::INVALID_DIMENSION;</highlight></codeline>
<codeline lineno="46"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="47"><highlight class="normal"></highlight></codeline>
<codeline lineno="48"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>reference_pos_is_finite<sp/>=<sp/><ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(input.reference_position);</highlight></codeline>
<codeline lineno="49"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>displaced_pos_is_finite<sp/>=<sp/><ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(input.displaced_position);</highlight></codeline>
<codeline lineno="50"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>coord_grad_is_finite<sp/>=<sp/><ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(input.compactification_coordinate_gradient);</highlight></codeline>
<codeline lineno="51"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>displacement_jacobian_is_finite<sp/>=<sp/><ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(input.displacement_jacobian);</highlight></codeline>
<codeline lineno="52"><highlight class="normal"></highlight></codeline>
<codeline lineno="53"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(!(reference_pos_is_finite<sp/>&amp;&amp;<sp/>displaced_pos_is_finite<sp/>&amp;&amp;<sp/>coord_grad_is_finite<sp/>&amp;&amp;<sp/>displacement_jacobian_is_finite))<sp/>{</highlight></codeline>
<codeline lineno="54"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::NON_FINITE_MAPPING_INPUT;</highlight></codeline>
<codeline lineno="55"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="56"><highlight class="normal"></highlight></codeline>
<codeline lineno="57"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>RadialFactors<sp/>factors{};</highlight></codeline>
<codeline lineno="58"><highlight class="normal"></highlight></codeline>
<codeline lineno="59"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>The<sp/>key<sp/>radial<sp/>factors<sp/>we<sp/>use<sp/>are<sp/>the<sp/>scale<sp/>(which<sp/>stretches<sp/>the<sp/>finite<sp/>computational<sp/>domain<sp/>into<sp/>the<sp/>infinite<sp/>physical<sp/>domain)<sp/>and<sp/>the<sp/>scale<sp/>derivative<sp/>(which<sp/>is<sp/>used<sp/>to<sp/>compute<sp/>the<sp/>mapping<sp/>jacobian)</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="60"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="namespaceserif_1_1mapping_1a4d8ed5ebf76c79667efd6777f3ee3b97" kindref="member">MappingStatus</ref><sp/>factor_status<sp/>=<sp/>compute_radial_factors(input.compactification_coordinate,<sp/>factors);</highlight></codeline>
<codeline lineno="61"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(factor_status<sp/>!=<sp/>MappingStatus::VALID)<sp/>{</highlight></codeline>
<codeline lineno="62"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>factor_status;</highlight></codeline>
<codeline lineno="63"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="64"><highlight class="normal"></highlight></codeline>
<codeline lineno="65"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>result.physical_position.SetSize(dimension);</highlight></codeline>
<codeline lineno="66"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>result.mapping_jacobian.SetSize(dimension,<sp/>dimension);</highlight></codeline>
<codeline lineno="67"><highlight class="normal"></highlight></codeline>
<codeline lineno="68"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(</highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>i<sp/>=<sp/>0;<sp/>i<sp/>&lt;<sp/>dimension;<sp/>++i)<sp/>{</highlight></codeline>
<codeline lineno="69"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Note<sp/>how<sp/>the<sp/>physical<sp/>position<sp/>is<sp/>just<sp/>the<sp/>product<sp/>of<sp/>the<sp/>displaced<sp/>position<sp/>and<sp/>the<sp/>scale<sp/>factor.</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="70"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>result.physical_position(i)<sp/>=<sp/>factors.scale<sp/>*<sp/>input.displaced_position(i);</highlight></codeline>
<codeline lineno="71"><highlight class="normal"></highlight></codeline>
<codeline lineno="72"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>The<sp/>mapping<sp/>jacobian<sp/>comes<sp/>from<sp/>trivial<sp/>application<sp/>of<sp/>the<sp/>product<sp/>rule</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="73"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>recall:<sp/>r_i<sp/>=<sp/>scale<sp/>*<sp/>x_i<sp/>where<sp/>r<sp/>is<sp/>the<sp/>physical<sp/>position<sp/>and<sp/>x<sp/>is<sp/>the<sp/>displaced<sp/>position.</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="74"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>then<sp/>we<sp/>can<sp/>differentiate<sp/>wrt.<sp/>X_j<sp/>holding<sp/>nothing<sp/>fixed.<sp/>Note<sp/>the<sp/>capital<sp/>X<sp/>here,<sp/>this<sp/>is<sp/>the<sp/>mesh<sp/>coordinate<sp/>not<sp/>the<sp/>displaced<sp/>position.</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="75"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Lets<sp/>call<sp/>this<sp/>jacobian<sp/>F</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="76"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>F<sp/>=<sp/>\frac{\partial<sp/>r_i}{\partial<sp/>X_{j}}</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="77"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>F<sp/>then<sp/>tells<sp/>us<sp/>how<sp/>the<sp/>physical<sp/>position<sp/>changes<sp/>as<sp/>we<sp/>move<sp/>along<sp/>mesh<sp/>coordinates</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="78"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Lets<sp/>then<sp/>apply<sp/>this<sp/>to<sp/>the<sp/>function<sp/>we<sp/>have<sp/>for<sp/>the<sp/>kelvin<sp/>compactification</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="79"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>F<sp/>=<sp/>scale<sp/>*<sp/>\frac{\partial<sp/>x_i}{\partial<sp/>X_j}<sp/>+<sp/>x_i<sp/>*<sp/>\frac{\partial<sp/>scale}{\partial<sp/>X_j}</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="80"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Below<sp/>you<sp/>can<sp/>see<sp/>the<sp/>displacement<sp/>jacobian<sp/>(\frac{\partial<sp/>x_i}{\partial<sp/>X_j})<sp/>and<sp/>the<sp/>scale<sp/>derivative<sp/>(\frac{\partial<sp/>scale}{\partial<sp/>X_j})<sp/>being<sp/>applied<sp/>to<sp/>compute<sp/>the<sp/>mapping<sp/>jacobian.</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="81"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(</highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>j<sp/>=<sp/>0;<sp/>j<sp/>&lt;<sp/>dimension;<sp/>++j)<sp/>{</highlight></codeline>
<codeline lineno="82"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>scale_gradient<sp/>=<sp/>factors.scale_derivative<sp/>*<sp/>input.compactification_coordinate_gradient(j);</highlight></codeline>
<codeline lineno="83"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>result.mapping_jacobian(i,<sp/>j)<sp/>=<sp/>factors.scale<sp/>*<sp/>input.displacement_jacobian(i,<sp/>j)<sp/>+<sp/>input.displaced_position(i)<sp/>*<sp/>scale_gradient;</highlight></codeline>
<codeline lineno="84"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="85"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="86"><highlight class="normal"></highlight></codeline>
<codeline lineno="87"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(!<ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(result.physical_position)<sp/>||<sp/>!<ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(result.mapping_jacobian))<sp/>{</highlight></codeline>
<codeline lineno="88"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::NON_FINITE_MAPPING_RESULT;</highlight></codeline>
<codeline lineno="89"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="90"><highlight class="normal"></highlight></codeline>
<codeline lineno="91"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>mapping_determinant<sp/>=<sp/>result.mapping_jacobian.Det();</highlight></codeline>
<codeline lineno="92"><highlight class="normal"></highlight></codeline>
<codeline lineno="93"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(!std::isfinite(mapping_determinant))<sp/>{</highlight></codeline>
<codeline lineno="94"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::NON_FINITE_MAPPING_RESULT;</highlight></codeline>
<codeline lineno="95"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="96"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(mapping_determinant<sp/>&lt;=<sp/>0.0)<sp/>{</highlight></codeline>
<codeline lineno="97"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::NON_POSITIVE_DETERMINATE;</highlight></codeline>
<codeline lineno="98"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="99"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::VALID;</highlight></codeline>
<codeline lineno="100"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="101"><highlight class="normal"></highlight></codeline>
<codeline lineno="102"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespaceserif_1_1mapping_1a4d8ed5ebf76c79667efd6777f3ee3b97" kindref="member">MappingStatus</ref><sp/>KelvinCompactification::evaluate_variation(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>ExteriorMapInput&amp;<sp/>input,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>ExteriorMapResult&amp;<sp/>result,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>ExteriorMapDirection&amp;<sp/>direction,<sp/>ExteriorMapVariation&amp;<sp/>variation)</highlight><highlight class="keyword"><sp/>const<sp/></highlight><highlight class="normal">{</highlight></codeline>
<codeline lineno="103"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>dimension<sp/>=<sp/>input.reference_position.Size();</highlight></codeline>
<codeline lineno="104"><highlight class="normal"></highlight></codeline>
<codeline lineno="105"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(dimension<sp/>&lt;=<sp/>0<sp/>||<sp/>input.displaced_position.Size()<sp/>!=<sp/>dimension<sp/>||<sp/>input.compactification_coordinate_gradient.Size()<sp/>!=<sp/>dimension)<sp/>{</highlight></codeline>
<codeline lineno="106"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::INVALID_DIMENSION;</highlight></codeline>
<codeline lineno="107"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="108"><highlight class="normal"></highlight></codeline>
<codeline lineno="109"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(input.displacement_jacobian.Height()<sp/>!=<sp/>dimension<sp/>||<sp/>input.displacement_jacobian.Width()<sp/>!=<sp/>dimension)<sp/>{</highlight></codeline>
<codeline lineno="110"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::INVALID_DIMENSION;</highlight></codeline>
<codeline lineno="111"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="112"><highlight class="normal"></highlight></codeline>
<codeline lineno="113"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(result.physical_position.Size()<sp/>!=<sp/>dimension<sp/>||<sp/>result.mapping_jacobian.Height()<sp/>!=<sp/>dimension<sp/>||<sp/>result.mapping_jacobian.Width()<sp/>!=<sp/>dimension)<sp/>{</highlight></codeline>
<codeline lineno="114"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::INVALID_DIMENSION;</highlight></codeline>
<codeline lineno="115"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="116"><highlight class="normal"></highlight></codeline>
<codeline lineno="117"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(direction.displaced_position_variation.Size()<sp/>!=<sp/>dimension<sp/>||<sp/>direction.displacement_jacobian_variation.Height()<sp/>!=<sp/>dimension<sp/>||<sp/>direction.displacement_jacobian_variation.Width()<sp/>!=<sp/>dimension)<sp/>{</highlight></codeline>
<codeline lineno="118"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::INVALID_DIMENSION;</highlight></codeline>
<codeline lineno="119"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="120"><highlight class="normal"></highlight></codeline>
<codeline lineno="121"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>reference_position_is_finite<sp/>=<sp/><ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(input.reference_position);</highlight></codeline>
<codeline lineno="122"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>displaced_position_is_finite<sp/>=<sp/><ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(input.displaced_position);</highlight></codeline>
<codeline lineno="123"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>compactification_coord_grad_is_finite<sp/>=<sp/><ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(input.compactification_coordinate_gradient);</highlight></codeline>
<codeline lineno="124"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>displacement_jacobian_is_finite<sp/>=<sp/><ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(input.displacement_jacobian);</highlight></codeline>
<codeline lineno="125"><highlight class="normal"></highlight></codeline>
<codeline lineno="126"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(!(reference_position_is_finite<sp/>&amp;&amp;<sp/>displaced_position_is_finite<sp/>&amp;&amp;<sp/>compactification_coord_grad_is_finite<sp/>&amp;&amp;<sp/>displacement_jacobian_is_finite))<sp/>{</highlight></codeline>
<codeline lineno="127"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::NON_FINITE_MAPPING_INPUT;</highlight></codeline>
<codeline lineno="128"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="129"><highlight class="normal"></highlight></codeline>
<codeline lineno="130"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>result_physical_position_is_finite<sp/>=<sp/><ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(result.physical_position);</highlight></codeline>
<codeline lineno="131"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>result_mapping_jacobian_is_finite<sp/>=<sp/><ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(result.mapping_jacobian);</highlight></codeline>
<codeline lineno="132"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>direction_displaced_position_is_finite<sp/>=<sp/><ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(direction.displaced_position_variation);</highlight></codeline>
<codeline lineno="133"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>direction_displacement_jacobian_is_finite<sp/>=<sp/><ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(direction.displacement_jacobian_variation);</highlight></codeline>
<codeline lineno="134"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(!(result_physical_position_is_finite<sp/>&amp;&amp;<sp/>result_mapping_jacobian_is_finite<sp/>&amp;&amp;<sp/>direction_displaced_position_is_finite<sp/>&amp;&amp;<sp/>direction_displacement_jacobian_is_finite))<sp/>{</highlight></codeline>
<codeline lineno="135"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::NON_FINITE_MAPPING_INPUT;<sp/></highlight><highlight class="comment">//<sp/>Note<sp/>we<sp/>are<sp/>checking<sp/>a<sp/>parameter<sp/>called<sp/>result<sp/>here;<sp/>however,<sp/>this<sp/>is<sp/>the<sp/>result<sp/>from<sp/>an<sp/>evaluate<sp/>call,<sp/>it<sp/>is<sp/>an<sp/>input<sp/>to<sp/>this<sp/>function.</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="136"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="137"><highlight class="normal"></highlight></codeline>
<codeline lineno="138"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>RadialFactors<sp/>factors{};</highlight></codeline>
<codeline lineno="139"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="namespaceserif_1_1mapping_1a4d8ed5ebf76c79667efd6777f3ee3b97" kindref="member">MappingStatus</ref><sp/>factor_status<sp/>=<sp/>compute_radial_factors(input.compactification_coordinate,<sp/>factors);</highlight></codeline>
<codeline lineno="140"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(factor_status<sp/>!=<sp/>MappingStatus::VALID)<sp/>{</highlight></codeline>
<codeline lineno="141"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>factor_status;</highlight></codeline>
<codeline lineno="142"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="143"><highlight class="normal"></highlight></codeline>
<codeline lineno="144"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>variation.physical_position_variation.SetSize(dimension);</highlight></codeline>
<codeline lineno="145"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>variation.mapping_jacobian_variation.SetSize(dimension,<sp/>dimension);</highlight></codeline>
<codeline lineno="146"><highlight class="normal"></highlight></codeline>
<codeline lineno="147"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(</highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>i<sp/>=<sp/>0;<sp/>i<sp/>&lt;<sp/>dimension;<sp/>++i)<sp/>{</highlight></codeline>
<codeline lineno="148"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>variation.physical_position_variation(i)<sp/>=<sp/>factors.scale<sp/>*<sp/>direction.displaced_position_variation(i);</highlight></codeline>
<codeline lineno="149"><highlight class="normal"></highlight></codeline>
<codeline lineno="150"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(</highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>j<sp/>=<sp/>0;<sp/>j<sp/>&lt;<sp/>dimension;<sp/>++j)<sp/>{</highlight></codeline>
<codeline lineno="151"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>scale_gradient<sp/>=<sp/>factors.scale_derivative<sp/>*<sp/>input.compactification_coordinate_gradient(j);</highlight></codeline>
<codeline lineno="152"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>variation.mapping_jacobian_variation(i,<sp/>j)<sp/>=<sp/>factors.scale<sp/>*<sp/>direction.displacement_jacobian_variation(i,<sp/>j)<sp/>+<sp/>direction.displaced_position_variation(i)<sp/>*<sp/>scale_gradient;</highlight></codeline>
<codeline lineno="153"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="154"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="155"><highlight class="normal"></highlight></codeline>
<codeline lineno="156"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(!<ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(variation.physical_position_variation)<sp/>||<sp/>!<ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(variation.mapping_jacobian_variation))<sp/>{</highlight></codeline>
<codeline lineno="157"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::NON_FINITE_MAPPING_RESULT;</highlight></codeline>
<codeline lineno="158"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="159"><highlight class="normal"></highlight></codeline>
<codeline lineno="160"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::VALID;</highlight></codeline>
<codeline lineno="161"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="162"><highlight class="normal"></highlight></codeline>
<codeline lineno="163"><highlight class="normal"><sp/><sp/><sp/><sp/>[[nodiscard]]<sp/>std::string_view<sp/>KelvinCompactification::get_name()<sp/>const<sp/>noexcept<sp/>{</highlight></codeline>
<codeline lineno="164"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>m_name;</highlight></codeline>
<codeline lineno="165"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="166"><highlight class="normal"></highlight></codeline>
<codeline lineno="167"><highlight class="normal"><sp/><sp/><sp/><sp/>[[nodiscard]]<sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>KelvinCompactification::get_reference_stellar_radius()<sp/>const<sp/>noexcept<sp/>{</highlight></codeline>
<codeline lineno="168"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>m_options.r_star_ref;</highlight></codeline>
<codeline lineno="169"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="170"><highlight class="normal"></highlight></codeline>
<codeline lineno="171"><highlight class="normal"><sp/><sp/><sp/><sp/>[[nodiscard]]<sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>KelvinCompactification::get_reference_infinity_radius()<sp/>const<sp/>noexcept<sp/>{</highlight></codeline>
<codeline lineno="172"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>m_options.r_inf_ref;</highlight></codeline>
<codeline lineno="173"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="174"><highlight class="normal"></highlight></codeline>
<codeline lineno="175"><highlight class="normal"><sp/><sp/><sp/><sp/>[[nodiscard]]<sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>KelvinCompactification::get_coordinate_tolerance()<sp/>const<sp/>noexcept<sp/>{</highlight></codeline>
<codeline lineno="176"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>m_options.coordinate_tolerance;</highlight></codeline>
<codeline lineno="177"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="178"><highlight class="normal"></highlight></codeline>
<codeline lineno="179"><highlight class="normal"><sp/><sp/><sp/><sp/>[[nodiscard]]<sp/><ref refid="namespaceserif_1_1mapping_1a4d8ed5ebf76c79667efd6777f3ee3b97" kindref="member">MappingStatus</ref><sp/>KelvinCompactification::evaluate_jacobian_variation_factors(</highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>compactification_coordinate,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>mfem::Vector&amp;<sp/>coordinateGradient,<sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal">&amp;<sp/>scale,<sp/>mfem::Vector&amp;<sp/>scaleGradient)</highlight><highlight class="keyword"><sp/>const<sp/></highlight><highlight class="normal">{</highlight></codeline>
<codeline lineno="180"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(coordinateGradient.Size()<sp/>&lt;=<sp/>0)<sp/>{</highlight></codeline>
<codeline lineno="181"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::INVALID_DIMENSION;</highlight></codeline>
<codeline lineno="182"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="183"><highlight class="normal"></highlight></codeline>
<codeline lineno="184"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(!<ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(coordinateGradient))<sp/>{</highlight></codeline>
<codeline lineno="185"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::NON_FINITE_MAPPING_INPUT;</highlight></codeline>
<codeline lineno="186"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="187"><highlight class="normal"></highlight></codeline>
<codeline lineno="188"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>RadialFactors<sp/>factors{};</highlight></codeline>
<codeline lineno="189"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="namespaceserif_1_1mapping_1a4d8ed5ebf76c79667efd6777f3ee3b97" kindref="member">MappingStatus</ref><sp/>status<sp/>=<sp/>compute_radial_factors(compactification_coordinate,<sp/>factors);</highlight></codeline>
<codeline lineno="190"><highlight class="normal"></highlight></codeline>
<codeline lineno="191"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(status<sp/>!=<sp/>MappingStatus::VALID)<sp/>{</highlight></codeline>
<codeline lineno="192"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>status;</highlight></codeline>
<codeline lineno="193"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="194"><highlight class="normal"></highlight></codeline>
<codeline lineno="195"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>scale<sp/>=<sp/>factors.scale;</highlight></codeline>
<codeline lineno="196"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>scaleGradient<sp/>=<sp/>coordinateGradient;</highlight></codeline>
<codeline lineno="197"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>scaleGradient<sp/>*=<sp/>factors.scale_derivative;</highlight></codeline>
<codeline lineno="198"><highlight class="normal"></highlight></codeline>
<codeline lineno="199"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(!<ref refid="namespaceserif_1_1utils_1_1checks_1a4eb8e1d2bdd4bdae0242814f9018537e" kindref="member">is_finite</ref>(scaleGradient))<sp/>{</highlight></codeline>
<codeline lineno="200"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::NON_FINITE_MAPPING_RESULT;</highlight></codeline>
<codeline lineno="201"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="202"><highlight class="normal"></highlight></codeline>
<codeline lineno="203"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::VALID;</highlight></codeline>
<codeline lineno="204"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="205"><highlight class="normal"></highlight></codeline>
<codeline lineno="206"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespaceserif_1_1mapping_1a4d8ed5ebf76c79667efd6777f3ee3b97" kindref="member">MappingStatus</ref><sp/>KelvinCompactification::compute_radial_factors(</highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>compactification_coordinate,<sp/>RadialFactors&amp;<sp/>radial_factors)</highlight><highlight class="keyword"><sp/>const<sp/></highlight><highlight class="normal">{</highlight></codeline>
<codeline lineno="207"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(!std::isfinite(compactification_coordinate))<sp/>{</highlight></codeline>
<codeline lineno="208"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::NON_FINITE_MAPPING_INPUT;</highlight></codeline>
<codeline lineno="209"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="210"><highlight class="normal"></highlight></codeline>
<codeline lineno="211"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>tolerance<sp/>=<sp/>m_options.coordinate_tolerance;</highlight></codeline>
<codeline lineno="212"><highlight class="normal"></highlight></codeline>
<codeline lineno="213"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(compactification_coordinate<sp/>&lt;<sp/>-tolerance<sp/>||<sp/>compactification_coordinate<sp/>&gt;<sp/>1.0<sp/>+<sp/>tolerance)<sp/>{</highlight></codeline>
<codeline lineno="214"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::OUTSIDE_REFERENCE_DOMAIN;</highlight></codeline>
<codeline lineno="215"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="216"><highlight class="normal"></highlight></codeline>
<codeline lineno="217"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>coordinate<sp/>=<sp/>compactification_coordinate;</highlight></codeline>
<codeline lineno="218"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(coordinate<sp/>&lt;<sp/>0.0)<sp/>{</highlight></codeline>
<codeline lineno="219"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>coordinate<sp/>=<sp/>0.0;<sp/></highlight><highlight class="comment">//<sp/>Not<sp/>sure<sp/>this<sp/>is<sp/>the<sp/>best<sp/>behavior<sp/>here...</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="220"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="221"><highlight class="normal"></highlight></codeline>
<codeline lineno="222"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(coordinate<sp/>&gt;=<sp/>1.0<sp/>-<sp/>tolerance)<sp/>{</highlight></codeline>
<codeline lineno="223"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::AT_COMPACTIFIED_INFINITY;</highlight></codeline>
<codeline lineno="224"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="225"><highlight class="normal"></highlight></codeline>
<codeline lineno="226"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Here<sp/>we<sp/>need<sp/>to<sp/>do<sp/>some<sp/>transformations<sp/>from<sp/>the<sp/>options<sp/>defined<sp/>on<sp/>the<sp/>mesh<sp/>to<sp/>useful<sp/>computational<sp/>coordinates</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="227"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>r_inf_ref<sp/>is<sp/>the<sp/>computational<sp/>/<sp/>reference<sp/>radius<sp/>of<sp/>the<sp/>infinity<sp/>surface<sp/>(the<sp/>edge<sp/>of<sp/>the<sp/>entire<sp/>domain)<sp/>and<sp/>r_star_ref<sp/>is<sp/>the<sp/>radius<sp/>of<sp/>the<sp/>spherical</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="228"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>stellar<sp/>model<sp/>inscribed<sp/>within.<sp/>Therefore<sp/>radial<sp/>extent<sp/>is<sp/>the<sp/>computational<sp/>radial<sp/>distance<sp/>between<sp/>the<sp/>stellar<sp/>surface<sp/>and<sp/>the<sp/>infinity<sp/>surface.</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="229"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Note<sp/>that<sp/>this<sp/>is<sp/>separate<sp/>from<sp/>the<sp/>parameterize<sp/>compactification<sp/>coordinate.</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="230"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>radial_extent<sp/>=<sp/>m_options.r_inf_ref<sp/>-<sp/>m_options.r_star_ref;</highlight></codeline>
<codeline lineno="231"><highlight class="normal"></highlight></codeline>
<codeline lineno="232"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>This<sp/>places<sp/>us<sp/>at<sp/>the<sp/>correct<sp/>spot<sp/>in<sp/>computational<sp/>space<sp/>given<sp/>the<sp/>current<sp/>compactification<sp/>coordinate.<sp/>Say<sp/>you<sp/>have<sp/>compactification<sp/>=<sp/>0.5,</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="233"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>an<sp/>r_star_ref<sp/>of<sp/>2<sp/>and<sp/>a<sp/>radial<sp/>extent<sp/>of<sp/>3,<sp/>this<sp/>this<sp/>will<sp/>place<sp/>you<sp/>at<sp/>2<sp/>+<sp/>0.5<sp/>*<sp/>3<sp/>=<sp/>3.5<sp/>in<sp/>computational<sp/>space,<sp/>which<sp/>is<sp/>half<sp/>way<sp/>between<sp/>the<sp/>stellar<sp/>surface<sp/>and<sp/>the<sp/>infinity<sp/>surface.</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="234"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>computational_radius<sp/>=<sp/>m_options.r_star_ref<sp/>+<sp/>coordinate<sp/>*<sp/>radial_extent;</highlight></codeline>
<codeline lineno="235"><highlight class="normal"></highlight></codeline>
<codeline lineno="236"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(!std::isfinite(computational_radius)<sp/>||<sp/>computational_radius<sp/>&lt;=<sp/>0.0)<sp/>{</highlight></codeline>
<codeline lineno="237"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::INVALID_REFERENCE_RADIUS;</highlight></codeline>
<codeline lineno="238"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="239"><highlight class="normal"></highlight></codeline>
<codeline lineno="240"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Invert<sp/>the<sp/>exterior<sp/>coordinate<sp/>so<sp/>it<sp/>runs<sp/>from<sp/>0<sp/>at<sp/>the<sp/>star<sp/>to<sp/>1<sp/>at<sp/>compactified<sp/>infinity</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="241"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>one_minus_coordinate<sp/>=<sp/>1.0<sp/>-<sp/>coordinate;</highlight></codeline>
<codeline lineno="242"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>denominator<sp/>=<sp/>computational_radius<sp/>*<sp/>one_minus_coordinate;</highlight></codeline>
<codeline lineno="243"><highlight class="normal"></highlight></codeline>
<codeline lineno="244"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(!std::isfinite(denominator)<sp/>||<sp/>denominator<sp/>&lt;=<sp/>0.0)<sp/>{</highlight></codeline>
<codeline lineno="245"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::NON_FINITE_MAPPING_RESULT;</highlight></codeline>
<codeline lineno="246"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="247"><highlight class="normal"></highlight></codeline>
<codeline lineno="248"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>The<sp/>scale<sp/>here<sp/>is<sp/>the<sp/>factor<sp/>which<sp/>stretches<sp/>the<sp/>finite<sp/>computational<sp/>domain<sp/>into<sp/>the<sp/>infinite<sp/>physical<sp/>domain.<sp/>Properties<sp/>we<sp/>need<sp/>this<sp/>to<sp/>have</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="249"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>include<sp/>that<sp/>it<sp/>should<sp/>go<sp/>to<sp/>1<sp/>at<sp/>the<sp/>stellar<sp/>surface<sp/>and<sp/>go<sp/>to<sp/>infinity<sp/>at<sp/>the<sp/>compactified<sp/>infinity.</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="250"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Mathematically<sp/>this<sp/>is<sp/>scale<sp/>=<sp/>|r|/|x|<sp/>where<sp/>r<sp/>is<sp/>the<sp/>physical<sp/>radius<sp/>and<sp/>x<sp/>is<sp/>the<sp/>computational<sp/>radius.</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="251"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Put<sp/>another<sp/>way,<sp/>scale<sp/>is<sp/>the<sp/>ratio<sp/>of<sp/>the<sp/>target<sp/>physical<sp/>radius<sp/>for<sp/>the<sp/>current<sp/>compactification<sp/>coordinate</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="252"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>to<sp/>the<sp/>current<sp/>mesh<sp/>radius.</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="253"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>scale<sp/>=<sp/>m_options.r_star_ref<sp/>/<sp/>denominator;</highlight></codeline>
<codeline lineno="254"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal"><sp/>scale_derivative<sp/>=<sp/>scale<sp/>*<sp/>(1.0<sp/>/<sp/>one_minus_coordinate<sp/>-<sp/>radial_extent<sp/>/<sp/>computational_radius);</highlight></codeline>
<codeline lineno="255"><highlight class="normal"></highlight></codeline>
<codeline lineno="256"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(!std::isfinite(scale)<sp/>||<sp/>!std::isfinite(scale_derivative))<sp/>{</highlight></codeline>
<codeline lineno="257"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::NON_FINITE_MAPPING_RESULT;</highlight></codeline>
<codeline lineno="258"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="259"><highlight class="normal"></highlight></codeline>
<codeline lineno="260"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>radial_factors.compactification_coordinate<sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>=<sp/>coordinate;</highlight></codeline>
<codeline lineno="261"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>radial_factors.computational_radius<sp/>=<sp/>computational_radius;</highlight></codeline>
<codeline lineno="262"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>radial_factors.scale<sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>=<sp/>scale;</highlight></codeline>
<codeline lineno="263"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>radial_factors.scale_derivative<sp/><sp/><sp/><sp/><sp/>=<sp/>scale_derivative;</highlight></codeline>
<codeline lineno="264"><highlight class="normal"></highlight></codeline>
<codeline lineno="265"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>MappingStatus::VALID;</highlight></codeline>
<codeline lineno="266"><highlight class="normal"></highlight></codeline>
<codeline lineno="267"><highlight class="normal"></highlight></codeline>
<codeline lineno="268"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="269"><highlight class="normal">}</highlight></codeline>
</programlisting>
<location file="src/lib/serif/backend/mfem/mapping/compactification/kelvin.cpp"/>
</compounddef>
</doxygen>