Files
MeanField_SERiF/docs/xml/geometry__inspection_8cpp.xml

709 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="geometry__inspection_8cpp" kind="file" language="C++">
<compoundname>geometry_inspection.cpp</compoundname>
<includes refid="backend_2mfem_2geometry__inspection_8hpp" local="yes">serif/geometry/deformation/backend/mfem/geometry_inspection.hpp</includes>
<includes local="no">algorithm</includes>
<includes local="yes">mfem/fem/gridfunc.hpp</includes>
<includes local="yes">mfem/fem/pfespace.hpp</includes>
<includes refid="tensor__basis_8hpp" local="yes">serif/discretization/backend/mfem/tensor_basis.hpp</includes>
<includes refid="mapping_2domain__mapper_8hpp" local="yes">serif/mapping/domain_mapper.hpp</includes>
<includes refid="checks_2finite_8hpp" local="yes">serif/utils/checks/finite.hpp</includes>
<includes refid="invertible_8hpp" local="yes">serif/utils/checks/invertible.hpp</includes>
<incdepgraph>
<node id="26">
<label>serif/discretization/backend/mfem/tensor_basis.hpp</label>
<link refid="tensor__basis_8hpp"/>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="27" relation="include">
</childnode>
<childnode refid="8" relation="include">
</childnode>
<childnode refid="10" relation="include">
</childnode>
<childnode refid="13" relation="include">
</childnode>
<childnode refid="11" relation="include">
</childnode>
<childnode refid="5" relation="include">
</childnode>
<childnode refid="28" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="30" relation="include">
</childnode>
<childnode refid="31" relation="include">
</childnode>
</node>
<node id="14">
<label>serif/geometry/deformation/actions.hpp</label>
<link refid="geometry_2deformation_2actions_8hpp"/>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="16" relation="include">
</childnode>
<childnode refid="4" relation="include">
</childnode>
<childnode refid="17" relation="include">
</childnode>
<childnode refid="19" relation="include">
</childnode>
<childnode refid="22" relation="include">
</childnode>
<childnode refid="23" relation="include">
</childnode>
</node>
<node id="2">
<label>serif/geometry/deformation/backend/mfem/geometry_inspection.hpp</label>
<link refid="backend_2mfem_2geometry__inspection_8hpp"/>
<childnode refid="3" relation="include">
</childnode>
<childnode refid="4" relation="include">
</childnode>
<childnode refid="5" relation="include">
</childnode>
<childnode refid="6" relation="include">
</childnode>
<childnode refid="7" relation="include">
</childnode>
<childnode refid="12" relation="include">
</childnode>
</node>
<node id="19">
<label>serif/geometry/deformation/detail/action_storage.hpp</label>
<link refid="action__storage_8hpp"/>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="8" relation="include">
</childnode>
<childnode refid="20" relation="include">
</childnode>
<childnode refid="21" relation="include">
</childnode>
<childnode refid="4" relation="include">
</childnode>
<childnode refid="17" relation="include">
</childnode>
</node>
<node id="17">
<label>serif/geometry/deformation/failure.hpp</label>
<link refid="geometry_2deformation_2failure_8hpp"/>
<childnode refid="3" relation="include">
</childnode>
<childnode refid="18" relation="include">
</childnode>
</node>
<node id="7">
<label>serif/geometry/deformation/geometry_inspection.hpp</label>
<link refid="geometry__inspection_8hpp"/>
<childnode refid="8" relation="include">
</childnode>
<childnode refid="9" relation="include">
</childnode>
<childnode refid="10" relation="include">
</childnode>
<childnode refid="11" relation="include">
</childnode>
</node>
<node id="12">
<label>serif/geometry/deformation/linearization.hpp</label>
<link refid="deformation_2linearization_8hpp"/>
<childnode refid="13" relation="include">
</childnode>
<childnode refid="11" relation="include">
</childnode>
<childnode refid="14" relation="include">
</childnode>
</node>
<node id="22">
<label>serif/geometry/deformation/spaces.hpp</label>
<link refid="spaces_8hpp"/>
</node>
<node id="23">
<label>serif/geometry/deformation/workspace.hpp</label>
<link refid="geometry_2deformation_2workspace_8hpp"/>
</node>
<node id="57">
<label>serif/mapping/compactification/compactification.hpp</label>
<link refid="compactification_8hpp"/>
<childnode refid="32" relation="include">
</childnode>
<childnode refid="13" relation="include">
</childnode>
<childnode refid="56" relation="include">
</childnode>
<childnode refid="58" relation="include">
</childnode>
<childnode refid="59" relation="include">
</childnode>
</node>
<node id="58">
<label>serif/mapping/compactification/input_result.hpp</label>
<link refid="input__result_8hpp"/>
<childnode refid="51" relation="include">
</childnode>
<childnode refid="52" relation="include">
</childnode>
</node>
<node id="55">
<label>serif/mapping/compactification/kelvin.hpp</label>
<link refid="mapping_2compactification_2kelvin_8hpp"/>
<childnode refid="32" relation="include">
</childnode>
<childnode refid="51" relation="include">
</childnode>
<childnode refid="56" relation="include">
</childnode>
<childnode refid="57" relation="include">
</childnode>
<childnode refid="60" relation="include">
</childnode>
</node>
<node id="59">
<label>serif/mapping/compactification/variation.hpp</label>
<link refid="compactification_2variation_8hpp"/>
<childnode refid="51" relation="include">
</childnode>
<childnode refid="52" relation="include">
</childnode>
</node>
<node id="61">
<label>serif/mapping/context.hpp</label>
<link refid="context_8hpp"/>
<childnode refid="52" relation="include">
</childnode>
<childnode refid="51" relation="include">
</childnode>
</node>
<node id="62">
<label>serif/mapping/data.hpp</label>
<link refid="data_8hpp"/>
<childnode refid="63" relation="include">
</childnode>
<childnode refid="6" relation="include">
</childnode>
<childnode refid="51" relation="include">
</childnode>
<childnode refid="52" relation="include">
</childnode>
<childnode refid="64" relation="include">
</childnode>
<childnode refid="35" relation="include">
</childnode>
<childnode refid="65" relation="include">
</childnode>
<childnode refid="66" relation="include">
</childnode>
<childnode refid="55" relation="include">
</childnode>
<childnode refid="61" relation="include">
</childnode>
<childnode refid="62" relation="include">
</childnode>
</node>
<node id="50">
<label>serif/mapping/domain_mapper.hpp</label>
<link refid="mapping_2domain__mapper_8hpp"/>
<childnode refid="35" relation="include">
</childnode>
<childnode refid="13" relation="include">
</childnode>
<childnode refid="51" relation="include">
</childnode>
<childnode refid="52" relation="include">
</childnode>
<childnode refid="53" relation="include">
</childnode>
<childnode refid="54" relation="include">
</childnode>
<childnode refid="55" relation="include">
</childnode>
<childnode refid="61" relation="include">
</childnode>
<childnode refid="62" relation="include">
</childnode>
<childnode refid="67" relation="include">
</childnode>
<childnode refid="68" relation="include">
</childnode>
</node>
<node id="56">
<label>serif/mapping/status.hpp</label>
<link refid="status_8hpp"/>
<childnode refid="46" relation="include">
</childnode>
<childnode refid="35" relation="include">
</childnode>
<childnode refid="5" relation="include">
</childnode>
<childnode refid="44" relation="include">
</childnode>
<childnode refid="45" relation="include">
</childnode>
</node>
<node id="67">
<label>serif/mapping/variation.hpp</label>
<link refid="variation_8hpp"/>
<childnode refid="52" relation="include">
</childnode>
<childnode refid="51" relation="include">
</childnode>
</node>
<node id="45">
<label>serif/meta/enums.hpp</label>
<link refid="enums_8hpp"/>
<childnode refid="46" relation="include">
</childnode>
<childnode refid="42" relation="include">
</childnode>
<childnode refid="47" relation="include">
</childnode>
</node>
<node id="69">
<label>serif/utils/checks/finite.hpp</label>
<link refid="checks_2finite_8hpp"/>
<childnode refid="8" relation="include">
</childnode>
<childnode refid="51" relation="include">
</childnode>
<childnode refid="52" relation="include">
</childnode>
<childnode refid="43" relation="include">
</childnode>
</node>
<node id="70">
<label>serif/utils/checks/invertible.hpp</label>
<link refid="invertible_8hpp"/>
<childnode refid="69" relation="include">
</childnode>
</node>
<node id="44">
<label>serif/utils/error/codes.hpp</label>
<link refid="codes_8hpp"/>
<childnode refid="35" relation="include">
</childnode>
<childnode refid="45" relation="include">
</childnode>
</node>
<node id="31">
<label>serif/utils/error/errors.hpp</label>
<link refid="errors_8hpp"/>
<childnode refid="32" relation="include">
</childnode>
<childnode refid="33" relation="include">
</childnode>
<childnode refid="34" relation="include">
</childnode>
<childnode refid="18" relation="include">
</childnode>
<childnode refid="35" relation="include">
</childnode>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="36" relation="include">
</childnode>
<childnode refid="37" relation="include">
</childnode>
<childnode refid="40" relation="include">
</childnode>
<childnode refid="44" relation="include">
</childnode>
<childnode refid="48" relation="include">
</childnode>
</node>
<node id="40">
<label>serif/utils/misc/concepts/exceptions.hpp</label>
<link refid="utils_2misc_2concepts_2exceptions_8hpp"/>
<childnode refid="41" relation="include">
</childnode>
<childnode refid="42" relation="include">
</childnode>
<childnode refid="18" relation="include">
</childnode>
<childnode refid="43" relation="include">
</childnode>
</node>
<node id="43">
<label>serif/utils/misc/concepts/numeric.hpp</label>
<link refid="numeric_8hpp"/>
<childnode refid="16" relation="include">
</childnode>
<childnode refid="42" relation="include">
</childnode>
</node>
<node id="37">
<label>serif/utils/misc/terminal/colors.hpp</label>
<link refid="colors_8hpp"/>
<childnode refid="32" relation="include">
</childnode>
<childnode refid="34" relation="include">
</childnode>
<childnode refid="38" relation="include">
</childnode>
<childnode refid="5" relation="include">
</childnode>
<childnode refid="39" relation="include">
</childnode>
</node>
<node id="48">
<label>serif/utils/types/strings.hpp</label>
<link refid="types_2strings_8hpp"/>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="49" relation="include">
</childnode>
<childnode refid="32" relation="include">
</childnode>
</node>
<node id="60">
<label>serif/utils/user_options/mapping/compactification/kelvin.hpp</label>
<link refid="utils_2user__options_2mapping_2compactification_2kelvin_8hpp"/>
</node>
<node id="68">
<label>serif/utils/user_options/mapping/domain_mapper.hpp</label>
<link refid="utils_2user__options_2mapping_2domain__mapper_8hpp"/>
</node>
<node id="1">
<label>src/lib/serif/geometry/deformation/backend/mfem/geometry_inspection.cpp</label>
<link refid="geometry__inspection_8cpp"/>
<childnode refid="2" relation="include">
</childnode>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="24" relation="include">
</childnode>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="50" relation="include">
</childnode>
<childnode refid="69" relation="include">
</childnode>
<childnode refid="70" relation="include">
</childnode>
</node>
<node id="15">
<label>algorithm</label>
</node>
<node id="27">
<label>array</label>
</node>
<node id="8">
<label>cmath</label>
</node>
<node id="16">
<label>concepts</label>
</node>
<node id="9">
<label>cstddef</label>
</node>
<node id="35">
<label>cstdint</label>
</node>
<node id="34">
<label>cstdio</label>
</node>
<node id="38">
<label>cstdlib</label>
</node>
<node id="41">
<label>exception</label>
</node>
<node id="3">
<label>expected</label>
</node>
<node id="33">
<label>format</label>
</node>
<node id="20">
<label>functional</label>
</node>
<node id="21">
<label>initializer_list</label>
</node>
<node id="49">
<label>iostream</label>
</node>
<node id="10">
<label>limits</label>
</node>
<node id="47">
<label>magic_enum/magic_enum_all.hpp</label>
</node>
<node id="65">
<label>map</label>
</node>
<node id="13">
<label>memory</label>
</node>
<node id="53">
<label>mfem/fem/eltrans.hpp</label>
</node>
<node id="63">
<label>mfem/fem/fe/fe_base.hpp</label>
</node>
<node id="28">
<label>mfem/fem/fe/fe_h1.hpp</label>
</node>
<node id="29">
<label>mfem/fem/fe/fe_l2.hpp</label>
</node>
<node id="30">
<label>mfem/fem/fe/fe_rt.hpp</label>
</node>
<node id="6">
<label>mfem/fem/fespace.hpp</label>
</node>
<node id="24">
<label>mfem/fem/gridfunc.hpp</label>
</node>
<node id="54">
<label>mfem/fem/intrules.hpp</label>
</node>
<node id="25">
<label>mfem/fem/pfespace.hpp</label>
</node>
<node id="52">
<label>mfem/linalg/densemat.hpp</label>
</node>
<node id="51">
<label>mfem/linalg/vector.hpp</label>
</node>
<node id="64">
<label>mfem/mesh/mesh.hpp</label>
</node>
<node id="4">
<label>span</label>
</node>
<node id="18">
<label>string</label>
</node>
<node id="32">
<label>string_view</label>
</node>
<node id="66">
<label>tuple</label>
</node>
<node id="42">
<label>type_traits</label>
</node>
<node id="39">
<label>unistd.h</label>
</node>
<node id="46">
<label>unordered_map</label>
</node>
<node id="5">
<label>utility</label>
</node>
<node id="11">
<label>vector</label>
</node>
<node id="36">
<label>version</label>
</node>
</incdepgraph>
<innernamespace refid="namespaceserif">serif</innernamespace>
<innernamespace refid="namespaceserif_1_1geometry">serif::geometry</innernamespace>
<innernamespace refid="namespaceserif_1_1geometry_1_1deformation">serif::geometry::deformation</innernamespace>
<innernamespace refid="namespaceserif_1_1geometry_1_1deformation_1_1backend">serif::geometry::deformation::backend</innernamespace>
<innernamespace refid="namespaceserif_1_1geometry_1_1deformation_1_1backend_1_1mfem">serif::geometry::deformation::backend::mfem</innernamespace>
<briefdescription>
</briefdescription>
<detaileddescription>
</detaileddescription>
<programlisting>
<codeline lineno="1"><highlight class="preprocessor">#include<sp/>&quot;<ref refid="backend_2mfem_2geometry__inspection_8hpp" kindref="compound">serif/geometry/deformation/backend/mfem/geometry_inspection.hpp</ref>&quot;</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/>&lt;algorithm&gt;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="4"><highlight class="normal"></highlight></codeline>
<codeline lineno="5"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;mfem/fem/gridfunc.hpp&quot;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="6"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;mfem/fem/pfespace.hpp&quot;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="7"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="tensor__basis_8hpp" kindref="compound">serif/discretization/backend/mfem/tensor_basis.hpp</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="8"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="mapping_2domain__mapper_8hpp" kindref="compound">serif/mapping/domain_mapper.hpp</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="9"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="checks_2finite_8hpp" kindref="compound">serif/utils/checks/finite.hpp</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="10"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="invertible_8hpp" kindref="compound">serif/utils/checks/invertible.hpp</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="11"><highlight class="normal"></highlight></codeline>
<codeline lineno="12"><highlight class="normal"></highlight><highlight class="keyword">namespace<sp/></highlight><highlight class="normal"><ref refid="namespaceserif_1_1geometry_1_1deformation_1_1backend_1_1mfem" kindref="compound">serif::geometry::deformation::backend::mfem</ref></highlight></codeline>
<codeline lineno="13"><highlight class="normal">{</highlight></codeline>
<codeline lineno="14"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">namespace</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="15"><highlight class="normal"><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="17"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>[[nodiscard]]<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1a08306ee593c172f4877facc061e98f97" kindref="member">DeformationStatus</ref><sp/>validate_inspection_space(const<sp/>::mfem::FiniteElementSpace&amp;<sp/>space)</highlight></codeline>
<codeline lineno="18"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="19"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>const<sp/>::mfem::Mesh*<sp/>mesh<sp/>=<sp/>space.GetMesh();</highlight></codeline>
<codeline lineno="20"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(mesh<sp/>==<sp/></highlight><highlight class="keyword">nullptr</highlight><highlight class="normal"><sp/>||<sp/>space.FEColl()<sp/>==<sp/></highlight><highlight class="keyword">nullptr</highlight><highlight class="normal"><sp/>||<sp/>mesh-&gt;GetNE()<sp/>==<sp/>0<sp/>||<sp/>mesh-&gt;Dimension()<sp/>!=<sp/>mesh-&gt;SpaceDimension()<sp/>||<sp/>mesh-&gt;SpaceDimension()<sp/>&lt;<sp/>1<sp/>||<sp/>mesh-&gt;SpaceDimension()<sp/>&gt;<sp/>3<sp/>||<sp/>space.GetVDim()<sp/>!=<sp/>mesh-&gt;SpaceDimension()<sp/>||<sp/>space.GetTrueVSize()<sp/>&lt;=<sp/>0<sp/>||<sp/>space.GetTrueVSize()<sp/>%<sp/>space.GetVDim()<sp/>!=<sp/>0<sp/>||<sp/>(space.GetOrdering()<sp/>!=<sp/>::mfem::Ordering::byNODES<sp/>&amp;&amp;<sp/>space.GetOrdering()<sp/>!=<sp/>::mfem::Ordering::byVDIM))</highlight></codeline>
<codeline lineno="21"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="22"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>std::unexpected(DeformationFailure{.reason<sp/>=<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1abff36c0dd3d8b9c916a2e928ab69a871ad73416fa06a45d748a7c8d4349054cbb" kindref="member">DeformationFailureReason::incompatible_discretization</ref>,<sp/>.message<sp/>=<sp/></highlight><highlight class="stringliteral">&quot;Geometry<sp/>inspection<sp/>requires<sp/>a<sp/>nonempty<sp/>spatial<sp/>displacement<sp/>space<sp/>on<sp/>a<sp/>volume<sp/>mesh<sp/>in<sp/>one<sp/>to<sp/>three<sp/>dimensions.&quot;</highlight><highlight class="normal">});</highlight></codeline>
<codeline lineno="23"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="24"><highlight class="normal"></highlight><highlight class="preprocessor">#ifdef<sp/>MFEM_USE_MPI</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="25"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(</highlight><highlight class="keyword">dynamic_cast&lt;</highlight><highlight class="keyword">const<sp/></highlight><highlight class="normal">::mfem::ParFiniteElementSpace*</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(&amp;space)<sp/>!=<sp/></highlight><highlight class="keyword">nullptr</highlight><highlight class="normal">)</highlight></codeline>
<codeline lineno="26"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="27"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>std::unexpected(DeformationFailure{.reason<sp/>=<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1abff36c0dd3d8b9c916a2e928ab69a871ad73416fa06a45d748a7c8d4349054cbb" kindref="member">DeformationFailureReason::incompatible_discretization</ref>,<sp/>.message<sp/>=<sp/></highlight><highlight class="stringliteral">&quot;Deformation<sp/>geometry<sp/>inspection<sp/>currently<sp/>requires<sp/>a<sp/>serial<sp/>finite-element<sp/>space.&quot;</highlight><highlight class="normal">});</highlight></codeline>
<codeline lineno="28"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="29"><highlight class="normal"></highlight><highlight class="preprocessor">#endif</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="30"><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/>element<sp/>=<sp/>0;<sp/>element<sp/>&lt;<sp/>mesh-&gt;GetNE();<sp/>++element)</highlight></codeline>
<codeline lineno="31"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="32"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>const<sp/>::mfem::FiniteElement*<sp/>finite_element<sp/>=<sp/>space.GetFE(element);</highlight></codeline>
<codeline lineno="33"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(finite_element<sp/>==<sp/></highlight><highlight class="keyword">nullptr</highlight><highlight class="normal"><sp/>||<sp/>finite_element-&gt;GetDof()<sp/>&lt;=<sp/>0<sp/>||<sp/>finite_element-&gt;GetDim()<sp/>!=<sp/>mesh-&gt;Dimension()<sp/>||<sp/>finite_element-&gt;GetRangeType()<sp/>!=<sp/>::mfem::FiniteElement::SCALAR<sp/>||<sp/>finite_element-&gt;GetMapType()<sp/>!=<sp/>::mfem::FiniteElement::VALUE<sp/>||<sp/>finite_element-&gt;GetDerivType()<sp/>!=<sp/>::mfem::FiniteElement::GRAD)</highlight></codeline>
<codeline lineno="34"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="35"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>std::unexpected(DeformationFailure{.reason<sp/>=<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1abff36c0dd3d8b9c916a2e928ab69a871ad73416fa06a45d748a7c8d4349054cbb" kindref="member">DeformationFailureReason::incompatible_discretization</ref>,<sp/>.message<sp/>=<sp/></highlight><highlight class="stringliteral">&quot;Deformation<sp/>inspection<sp/>requires<sp/>scalar<sp/>value-mapped<sp/>basis<sp/>copies<sp/>with<sp/>spatial<sp/>gradients.&quot;</highlight><highlight class="normal">,<sp/>.element<sp/>=<sp/>element});</highlight></codeline>
<codeline lineno="36"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="37"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="38"><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/>{};</highlight></codeline>
<codeline lineno="39"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="40"><highlight class="normal"></highlight></codeline>
<codeline lineno="42"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>[[nodiscard]]<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1a08306ee593c172f4877facc061e98f97" kindref="member">DeformationStatus</ref><sp/>inspect_element(const<sp/>::mfem::FiniteElementSpace&amp;<sp/>space,<sp/>const<sp/>::mfem::GridFunction&amp;<sp/>field,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>element,<sp/>discretization::backend::mfem::TensorBasisCache&amp;<sp/>basis_cache,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>mapping::DomainMapper*<sp/>reference_geometry,<sp/>discretization::backend::mfem::TensorWorkspace&amp;<sp/>workspace,<sp/>::mfem::Vector&amp;<sp/>samples,<sp/>::mfem::DenseMatrix&amp;<sp/>gradient,<sp/>DeformationGeometryReport&amp;<sp/>report)</highlight></codeline>
<codeline lineno="43"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="44"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>::mfem::ElementTransformation*<sp/>transformation<sp/>=<sp/>space.GetMesh()-&gt;GetElementTransformation(element);</highlight></codeline>
<codeline lineno="45"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(transformation<sp/>==<sp/></highlight><highlight class="keyword">nullptr</highlight><highlight class="normal">)</highlight></codeline>
<codeline lineno="46"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="47"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>std::unexpected(DeformationFailure{.reason<sp/>=<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1abff36c0dd3d8b9c916a2e928ab69a871a146816aaee11d5a21b09baac60c9812e" kindref="member">DeformationFailureReason::invalid_geometry</ref>,<sp/>.message<sp/>=<sp/></highlight><highlight class="stringliteral">&quot;Geometry<sp/>inspection<sp/>requires<sp/>an<sp/>element<sp/>transformation.&quot;</highlight><highlight class="normal">,<sp/>.element<sp/>=<sp/>element});</highlight></codeline>
<codeline lineno="48"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="49"><highlight class="normal"><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">int</highlight><highlight class="normal"><sp/>dimension<sp/>=<sp/>space.GetVDim();</highlight></codeline>
<codeline lineno="50"><highlight class="normal"><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">int</highlight><highlight class="normal"><sp/>degree<sp/>=<sp/>space.GetFE(element)-&gt;GetOrder();</highlight></codeline>
<codeline lineno="51"><highlight class="normal"><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">int</highlight><highlight class="normal"><sp/>order<sp/>=<sp/>std::max(degree<sp/>+<sp/>2,<sp/>2<sp/>*<sp/>dimension<sp/>*<sp/>degree);</highlight></codeline>
<codeline lineno="52"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>const<sp/>::mfem::IntegrationRule&amp;<sp/>rule<sp/>=<sp/>::mfem::IntRules.Get(transformation-&gt;GetGeometryType(),<sp/>order);</highlight></codeline>
<codeline lineno="53"><highlight class="normal"><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="keyword">auto</highlight><highlight class="normal"><sp/>basis<sp/>=<sp/>dimension<sp/>==<sp/>3<sp/>?<sp/>basis_cache.get(*space.GetFE(element),<sp/>rule,<sp/><ref refid="namespaceserif_1_1discretization_1_1backend_1_1mfem_1af75f98db90618153ea4ca169945733f7ae2b6dfb8a5c48206992d8310d176c37c" kindref="member">discretization::backend::mfem::ReferenceOperation::gradient</ref>,<sp/>dimension)<sp/>:<sp/></highlight><highlight class="keyword">nullptr</highlight><highlight class="normal">;</highlight></codeline>
<codeline lineno="54"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(basis)</highlight></codeline>
<codeline lineno="55"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="56"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>::mfem::Array&lt;int&gt;<sp/>dofs;</highlight></codeline>
<codeline lineno="57"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>const<sp/>::mfem::DofTransformation*<sp/>dof_transformation<sp/>=<sp/>space.GetElementVDofs(element,<sp/>dofs);</highlight></codeline>
<codeline lineno="58"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>::mfem::Vector<sp/>coefficients;</highlight></codeline>
<codeline lineno="59"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>field.GetSubVector(dofs,<sp/>coefficients);</highlight></codeline>
<codeline lineno="60"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(dof_transformation<sp/>!=<sp/></highlight><highlight class="keyword">nullptr</highlight><highlight class="normal">)</highlight></codeline>
<codeline lineno="61"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="62"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>dof_transformation-&gt;InvTransformPrimal(coefficients);</highlight></codeline>
<codeline lineno="63"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="64"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>MFEM&apos;s<sp/>element<sp/>VDofs<sp/>are<sp/>grouped<sp/>by<sp/>component<sp/>for<sp/>either<sp/>global<sp/>ordering.</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="65"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>basis-&gt;apply(coefficients,<sp/>samples,<sp/>workspace);</highlight></codeline>
<codeline lineno="66"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="67"><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/>point<sp/>=<sp/>0;<sp/>point<sp/>&lt;<sp/>rule.GetNPoints();<sp/>++point)</highlight></codeline>
<codeline lineno="68"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="69"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>transformation-&gt;SetIntPoint(&amp;rule.IntPoint(point));</highlight></codeline>
<codeline lineno="70"><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/>mapping::DMFixedMeshGeometry*<sp/>fixed_geometry<sp/>=<sp/>basis<sp/>&amp;&amp;<sp/>reference_geometry<sp/>!=<sp/></highlight><highlight class="keyword">nullptr</highlight><highlight class="normal"><sp/>?<sp/>reference_geometry-&gt;get_fixed_mesh_geometry(*transformation,<sp/>rule.IntPoint(point))<sp/>:<sp/></highlight><highlight class="keyword">nullptr</highlight><highlight class="normal">;</highlight></codeline>
<codeline lineno="71"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>const<sp/>::mfem::DenseMatrix&amp;<sp/>reference_jacobian<sp/>=<sp/>fixed_geometry<sp/>!=<sp/></highlight><highlight class="keyword">nullptr</highlight><highlight class="normal"><sp/>?<sp/>fixed_geometry-&gt;jacobian<sp/>:<sp/>transformation-&gt;Jacobian();</highlight></codeline>
<codeline lineno="72"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><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">utils::checks::is_finite</ref>(reference_jacobian))</highlight></codeline>
<codeline lineno="73"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="74"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>std::unexpected(DeformationFailure{.reason<sp/>=<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1abff36c0dd3d8b9c916a2e928ab69a871a4013d0a2d04acba5257678a15922a094" kindref="member">DeformationFailureReason::non_finite</ref>,<sp/>.message<sp/>=<sp/></highlight><highlight class="stringliteral">&quot;A<sp/>reference<sp/>mesh<sp/>Jacobian<sp/>is<sp/>not<sp/>finite<sp/>at<sp/>a<sp/>deformation<sp/>inspection<sp/>point.&quot;</highlight><highlight class="normal">,<sp/>.element<sp/>=<sp/>element,<sp/>.point<sp/>=<sp/>point});</highlight></codeline>
<codeline lineno="75"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="76"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><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_1a3471cc276b4a977cff023828197af29e" kindref="member">utils::checks::has_stable_inverse</ref>(reference_jacobian))</highlight></codeline>
<codeline lineno="77"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="78"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>std::unexpected(DeformationFailure{.reason<sp/>=<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1abff36c0dd3d8b9c916a2e928ab69a871a146816aaee11d5a21b09baac60c9812e" kindref="member">DeformationFailureReason::invalid_geometry</ref>,<sp/>.message<sp/>=<sp/></highlight><highlight class="stringliteral">&quot;A<sp/>reference<sp/>mesh<sp/>Jacobian<sp/>is<sp/>singular,<sp/>nonfinite,<sp/>or<sp/>too<sp/>ill-conditioned<sp/>for<sp/>reliable<sp/>inversion.&quot;</highlight><highlight class="normal">,<sp/>.element<sp/>=<sp/>element,<sp/>.point<sp/>=<sp/>point});</highlight></codeline>
<codeline lineno="79"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="80"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(basis)</highlight></codeline>
<codeline lineno="81"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><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/><sp/><sp/><sp/><sp/>const<sp/>::mfem::DenseMatrix&amp;<sp/><ref refid="namespaceserif_1_1solver_1_1preconditioner_1_1computations_1a4e68f4ddc06181dc9077cb41a6c795d5" kindref="member">inverse</ref><sp/>=<sp/>fixed_geometry<sp/>!=<sp/></highlight><highlight class="keyword">nullptr</highlight><highlight class="normal"><sp/>?<sp/>fixed_geometry-&gt;inverse_jacobian<sp/>:<sp/>transformation-&gt;InverseJacobian();</highlight></codeline>
<codeline lineno="83"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><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/>component<sp/>=<sp/>0;<sp/><ref refid="namespaceserif_1_1discretization_1_1forms_1aa4daa912e2157d80dc731a6ce2349dfe" kindref="member">component</ref><sp/>&lt;<sp/>dimension;<sp/>++<ref refid="namespaceserif_1_1discretization_1_1forms_1aa4daa912e2157d80dc731a6ce2349dfe" kindref="member">component</ref>)</highlight></codeline>
<codeline lineno="84"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><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/><sp/><sp/><sp/><sp/><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/>axis<sp/>=<sp/>0;<sp/>axis<sp/>&lt;<sp/>dimension;<sp/>++axis)</highlight></codeline>
<codeline lineno="86"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="87"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespaceserif_1_1discretization_1_1backend_1_1mfem_1af75f98db90618153ea4ca169945733f7ae2b6dfb8a5c48206992d8310d176c37c" kindref="member">gradient</ref>(component,<sp/>axis)<sp/>=<sp/>0.0;</highlight></codeline>
<codeline lineno="88"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><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/>reference_axis<sp/>=<sp/>0;<sp/>reference_axis<sp/>&lt;<sp/>dimension;<sp/>++reference_axis)</highlight></codeline>
<codeline lineno="89"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="90"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespaceserif_1_1discretization_1_1backend_1_1mfem_1af75f98db90618153ea4ca169945733f7ae2b6dfb8a5c48206992d8310d176c37c" kindref="member">gradient</ref>(component,<sp/>axis)<sp/>+=<sp/>samples[9<sp/>*<sp/>point<sp/>+<sp/>3<sp/>*<sp/><ref refid="namespaceserif_1_1discretization_1_1forms_1aa4daa912e2157d80dc731a6ce2349dfe" kindref="member">component</ref><sp/>+<sp/>reference_axis]<sp/>*<sp/><ref refid="namespaceserif_1_1solver_1_1preconditioner_1_1computations_1a4e68f4ddc06181dc9077cb41a6c795d5" kindref="member">inverse</ref>(reference_axis,<sp/>axis);</highlight></codeline>
<codeline lineno="91"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="92"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="93"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="94"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="95"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">else</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="96"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="97"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>field.GetVectorGradient(*transformation,<sp/>gradient);</highlight></codeline>
<codeline lineno="98"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="99"><highlight class="normal"><sp/><sp/><sp/><sp/><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/>component<sp/>=<sp/>0;<sp/><ref refid="namespaceserif_1_1discretization_1_1forms_1aa4daa912e2157d80dc731a6ce2349dfe" kindref="member">component</ref><sp/>&lt;<sp/>dimension;<sp/>++<ref refid="namespaceserif_1_1discretization_1_1forms_1aa4daa912e2157d80dc731a6ce2349dfe" kindref="member">component</ref>)</highlight></codeline>
<codeline lineno="100"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="101"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespaceserif_1_1discretization_1_1backend_1_1mfem_1af75f98db90618153ea4ca169945733f7ae2b6dfb8a5c48206992d8310d176c37c" kindref="member">gradient</ref>(component,<sp/>component)<sp/>+=<sp/>1.0;</highlight></codeline>
<codeline lineno="102"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="103"><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/>determinant<sp/>=<sp/><ref refid="namespaceserif_1_1discretization_1_1backend_1_1mfem_1af75f98db90618153ea4ca169945733f7ae2b6dfb8a5c48206992d8310d176c37c" kindref="member">gradient</ref>.Det();</highlight></codeline>
<codeline lineno="104"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><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">utils::checks::is_finite</ref>(gradient)<sp/>||<sp/>!std::isfinite(determinant))</highlight></codeline>
<codeline lineno="105"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="106"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>std::unexpected(DeformationFailure{.reason<sp/>=<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1abff36c0dd3d8b9c916a2e928ab69a871a4013d0a2d04acba5257678a15922a094" kindref="member">DeformationFailureReason::non_finite</ref>,<sp/>.message<sp/>=<sp/></highlight><highlight class="stringliteral">&quot;The<sp/>computational<sp/>deformation<sp/>Jacobian<sp/>is<sp/>not<sp/>finite.&quot;</highlight><highlight class="normal">,<sp/>.element<sp/>=<sp/>element,<sp/>.point<sp/>=<sp/>point});</highlight></codeline>
<codeline lineno="107"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="108"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>++report.sampled_point_count;</highlight></codeline>
<codeline lineno="109"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(determinant<sp/>&lt;<sp/>report.minimum_jacobian_determinant)</highlight></codeline>
<codeline lineno="110"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="111"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>report.minimum_jacobian_determinant<sp/>=<sp/>determinant;</highlight></codeline>
<codeline lineno="112"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>report.minimum_element<sp/>=<sp/>element;</highlight></codeline>
<codeline lineno="113"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>report.minimum_point<sp/>=<sp/>point;</highlight></codeline>
<codeline lineno="114"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="115"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="116"><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/>{};</highlight></codeline>
<codeline lineno="117"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="118"><highlight class="normal"><sp/><sp/><sp/><sp/>}<sp/></highlight><highlight class="comment">//<sp/>namespace</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="119"><highlight class="normal"></highlight></codeline>
<codeline lineno="120"><highlight class="normal"><sp/><sp/><sp/><sp/>std::expected&lt;DeformationGeometryReport,<sp/>DeformationFailure&gt;<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1_1backend_1_1mfem_1aef20e8c17f47349faa80aa0b85575842" kindref="member">inspect_deformation_geometry</ref>(const<sp/>::mfem::FiniteElementSpace&amp;<sp/>displacement_space,<sp/>const<sp/>::mfem::Vector&amp;<sp/>displacement)</highlight></codeline>
<codeline lineno="121"><highlight class="normal"><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="122"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>discretization::backend::mfem::TensorBasisCache<sp/>basis_cache;</highlight></codeline>
<codeline lineno="123"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1_1backend_1_1mfem_1aef20e8c17f47349faa80aa0b85575842" kindref="member">inspect_deformation_geometry</ref>(displacement_space,<sp/>displacement,<sp/>basis_cache);</highlight></codeline>
<codeline lineno="124"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="125"><highlight class="normal"></highlight></codeline>
<codeline lineno="126"><highlight class="normal"><sp/><sp/><sp/><sp/>std::expected&lt;DeformationGeometryReport,<sp/>DeformationFailure&gt;<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1_1backend_1_1mfem_1aef20e8c17f47349faa80aa0b85575842" kindref="member">inspect_deformation_geometry</ref>(const<sp/>::mfem::FiniteElementSpace&amp;<sp/>displacement_space,<sp/>const<sp/>::mfem::Vector&amp;<sp/>displacement,<sp/>discretization::backend::mfem::TensorBasisCache&amp;<sp/>basis_cache,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>mapping::DomainMapper*<sp/>reference_geometry)</highlight></codeline>
<codeline lineno="127"><highlight class="normal"><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="128"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1a08306ee593c172f4877facc061e98f97" kindref="member">DeformationStatus</ref><sp/>status<sp/>=<sp/>validate_inspection_space(displacement_space);<sp/>!status)</highlight></codeline>
<codeline lineno="129"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="130"><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/>std::unexpected(status.error());</highlight></codeline>
<codeline lineno="131"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="132"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1a08306ee593c172f4877facc061e98f97" kindref="member">DeformationStatus</ref><sp/>status<sp/>=<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1a371fc6cc353f2df9f7752d802c2155da" kindref="member">validate_deformation_values</ref>(std::span&lt;const<sp/>double&gt;(displacement.GetData(),<sp/>displacement.Size()),<sp/>displacement_space.GetTrueVSize());<sp/>!status)</highlight></codeline>
<codeline lineno="133"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="134"><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/>std::unexpected(status.error());</highlight></codeline>
<codeline lineno="135"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="136"><highlight class="normal"></highlight></codeline>
<codeline lineno="137"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>MFEM<sp/>requires<sp/>a<sp/>mutable<sp/>space<sp/>pointer<sp/>for<sp/>a<sp/>GridFunction,<sp/>although<sp/>these<sp/>operations<sp/>only<sp/>write<sp/>its<sp/>owned<sp/>coefficients.</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="138"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>::mfem::GridFunction<sp/>field(</highlight><highlight class="keyword">const_cast&lt;</highlight><highlight class="normal">::mfem::FiniteElementSpace*</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(&amp;displacement_space));</highlight></codeline>
<codeline lineno="139"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>field.SetFromTrueDofs(displacement);</highlight></codeline>
<codeline lineno="140"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>discretization::backend::mfem::TensorWorkspace<sp/>workspace;</highlight></codeline>
<codeline lineno="141"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>::mfem::Vector<sp/>samples;</highlight></codeline>
<codeline lineno="142"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>::mfem::DenseMatrix<sp/><ref refid="namespaceserif_1_1discretization_1_1backend_1_1mfem_1af75f98db90618153ea4ca169945733f7ae2b6dfb8a5c48206992d8310d176c37c" kindref="member">gradient</ref>(displacement_space.GetVDim());</highlight></codeline>
<codeline lineno="143"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>DeformationGeometryReport<sp/>report;</highlight></codeline>
<codeline lineno="144"><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/>element<sp/>=<sp/>0;<sp/>element<sp/>&lt;<sp/>displacement_space.GetNE();<sp/>++element)</highlight></codeline>
<codeline lineno="145"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="146"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1a08306ee593c172f4877facc061e98f97" kindref="member">DeformationStatus</ref><sp/>status<sp/>=<sp/>inspect_element(displacement_space,<sp/>field,<sp/>element,<sp/>basis_cache,<sp/>reference_geometry,<sp/>workspace,<sp/>samples,<sp/>gradient,<sp/>report);<sp/>!status)</highlight></codeline>
<codeline lineno="147"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="148"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>std::unexpected(status.error());</highlight></codeline>
<codeline lineno="149"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="150"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="151"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>report;</highlight></codeline>
<codeline lineno="152"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="153"><highlight class="normal"></highlight></codeline>
<codeline lineno="154"><highlight class="normal"><sp/><sp/><sp/><sp/>std::expected&lt;DeformationGeometryReport,<sp/>DeformationFailure&gt;<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1_1backend_1_1mfem_1aef20e8c17f47349faa80aa0b85575842" kindref="member">inspect_deformation_geometry</ref>(const<sp/>::mfem::FiniteElementSpace&amp;<sp/>displacement_space,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>std::span&lt;const<sp/>double&gt;<sp/>displacement,<sp/>const<sp/>::mfem::Ordering::Type<sp/>coefficient_ordering)</highlight></codeline>
<codeline lineno="155"><highlight class="normal"><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="156"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>discretization::backend::mfem::TensorBasisCache<sp/>basis_cache;</highlight></codeline>
<codeline lineno="157"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1_1backend_1_1mfem_1aef20e8c17f47349faa80aa0b85575842" kindref="member">inspect_deformation_geometry</ref>(displacement_space,<sp/>displacement,<sp/>coefficient_ordering,<sp/>basis_cache);</highlight></codeline>
<codeline lineno="158"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="159"><highlight class="normal"></highlight></codeline>
<codeline lineno="160"><highlight class="normal"><sp/><sp/><sp/><sp/>std::expected&lt;DeformationGeometryReport,<sp/>DeformationFailure&gt;<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1_1backend_1_1mfem_1aef20e8c17f47349faa80aa0b85575842" kindref="member">inspect_deformation_geometry</ref>(const<sp/>::mfem::FiniteElementSpace&amp;<sp/>displacement_space,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>std::span&lt;const<sp/>double&gt;<sp/>displacement,<sp/>const<sp/>::mfem::Ordering::Type<sp/>coefficient_ordering,<sp/>discretization::backend::mfem::TensorBasisCache&amp;<sp/>basis_cache,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>mapping::DomainMapper*<sp/>reference_geometry)</highlight></codeline>
<codeline lineno="161"><highlight class="normal"><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="162"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1a08306ee593c172f4877facc061e98f97" kindref="member">DeformationStatus</ref><sp/>status<sp/>=<sp/>validate_inspection_space(displacement_space);<sp/>!status)</highlight></codeline>
<codeline lineno="163"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="164"><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/>std::unexpected(status.error());</highlight></codeline>
<codeline lineno="165"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="166"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(coefficient_ordering<sp/>!=<sp/>::mfem::Ordering::byNODES<sp/>&amp;&amp;<sp/>coefficient_ordering<sp/>!=<sp/>::mfem::Ordering::byVDIM)</highlight></codeline>
<codeline lineno="167"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="168"><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/>std::unexpected(DeformationFailure{.reason<sp/>=<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1abff36c0dd3d8b9c916a2e928ab69a871a9cc57114b319994e90322314a00521d4" kindref="member">DeformationFailureReason::invalid_configuration</ref>,<sp/>.message<sp/>=<sp/></highlight><highlight class="stringliteral">&quot;Deformation<sp/>inspection<sp/>requires<sp/>byNODES<sp/>or<sp/>byVDIM<sp/>coefficient<sp/>ordering.&quot;</highlight><highlight class="normal">});</highlight></codeline>
<codeline lineno="169"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="170"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1a08306ee593c172f4877facc061e98f97" kindref="member">DeformationStatus</ref><sp/>status<sp/>=<sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1a371fc6cc353f2df9f7752d802c2155da" kindref="member">validate_deformation_values</ref>(displacement,<sp/>displacement_space.GetTrueVSize());<sp/>!status)</highlight></codeline>
<codeline lineno="171"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="172"><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/>std::unexpected(status.error());</highlight></codeline>
<codeline lineno="173"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="174"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>::mfem::Vector<sp/>native_displacement(displacement_space.GetTrueVSize());</highlight></codeline>
<codeline lineno="175"><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/>displacement_space.GetVDim();</highlight></codeline>
<codeline lineno="176"><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/>scalar_nodes<sp/>=<sp/>native_displacement.Size()<sp/>/<sp/>dimension;</highlight></codeline>
<codeline lineno="177"><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/>component<sp/>=<sp/>0;<sp/><ref refid="namespaceserif_1_1discretization_1_1forms_1aa4daa912e2157d80dc731a6ce2349dfe" kindref="member">component</ref><sp/>&lt;<sp/>dimension;<sp/>++<ref refid="namespaceserif_1_1discretization_1_1forms_1aa4daa912e2157d80dc731a6ce2349dfe" kindref="member">component</ref>)</highlight></codeline>
<codeline lineno="178"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="179"><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/>node<sp/>=<sp/>0;<sp/>node<sp/>&lt;<sp/>scalar_nodes;<sp/>++node)</highlight></codeline>
<codeline lineno="180"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="181"><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">int</highlight><highlight class="normal"><sp/>input<sp/>=<sp/>coefficient_ordering<sp/>==<sp/>::mfem::Ordering::byNODES<sp/>?<sp/>node<sp/>+<sp/>scalar_nodes<sp/>*<sp/><ref refid="namespaceserif_1_1discretization_1_1forms_1aa4daa912e2157d80dc731a6ce2349dfe" kindref="member">component</ref><sp/>:<sp/><ref refid="namespaceserif_1_1discretization_1_1forms_1aa4daa912e2157d80dc731a6ce2349dfe" kindref="member">component</ref><sp/>+<sp/>dimension<sp/>*<sp/>node;</highlight></codeline>
<codeline lineno="182"><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">int</highlight><highlight class="normal"><sp/>output<sp/>=<sp/>displacement_space.GetOrdering()<sp/>==<sp/>::mfem::Ordering::byNODES<sp/>?<sp/>node<sp/>+<sp/>scalar_nodes<sp/>*<sp/><ref refid="namespaceserif_1_1discretization_1_1forms_1aa4daa912e2157d80dc731a6ce2349dfe" kindref="member">component</ref><sp/>:<sp/><ref refid="namespaceserif_1_1discretization_1_1forms_1aa4daa912e2157d80dc731a6ce2349dfe" kindref="member">component</ref><sp/>+<sp/>dimension<sp/>*<sp/>node;</highlight></codeline>
<codeline lineno="183"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>native_displacement[output]<sp/>=<sp/>displacement[input];</highlight></codeline>
<codeline lineno="184"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="185"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="186"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/><ref refid="namespaceserif_1_1geometry_1_1deformation_1_1backend_1_1mfem_1aef20e8c17f47349faa80aa0b85575842" kindref="member">inspect_deformation_geometry</ref>(displacement_space,<sp/>native_displacement,<sp/>basis_cache,<sp/>reference_geometry);</highlight></codeline>
<codeline lineno="187"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="188"><highlight class="normal">}<sp/></highlight><highlight class="comment">//<sp/>namespace<sp/>serif::geometry::deformation::backend::mfem</highlight><highlight class="normal"></highlight></codeline>
</programlisting>
<location file="src/lib/serif/geometry/deformation/backend/mfem/geometry_inspection.cpp"/>
</compounddef>
</doxygen>