178 lines
32 KiB
XML
178 lines
32 KiB
XML
|
|
<?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="direct__lu__umfpack_8cpp" kind="file" language="C++">
|
||
|
|
<compoundname>direct_lu_umfpack.cpp</compoundname>
|
||
|
|
<includes refid="direct__lu_8hpp" local="yes">direct_lu.hpp</includes>
|
||
|
|
<includes local="no">algorithm</includes>
|
||
|
|
<includes local="no">vector</includes>
|
||
|
|
<includes local="no">umfpack.h</includes>
|
||
|
|
<incdepgraph>
|
||
|
|
<node id="2">
|
||
|
|
<label>direct_lu.hpp</label>
|
||
|
|
<link refid="direct__lu_8hpp"/>
|
||
|
|
<childnode refid="3" relation="include">
|
||
|
|
</childnode>
|
||
|
|
</node>
|
||
|
|
<node id="1">
|
||
|
|
<label>src/lib/serif/backend/mfem/solver/preconditioner/inverse/direct_lu_umfpack.cpp</label>
|
||
|
|
<link refid="direct__lu__umfpack_8cpp"/>
|
||
|
|
<childnode refid="2" relation="include">
|
||
|
|
</childnode>
|
||
|
|
<childnode refid="4" relation="include">
|
||
|
|
</childnode>
|
||
|
|
<childnode refid="5" relation="include">
|
||
|
|
</childnode>
|
||
|
|
<childnode refid="6" relation="include">
|
||
|
|
</childnode>
|
||
|
|
</node>
|
||
|
|
<node id="4">
|
||
|
|
<label>algorithm</label>
|
||
|
|
</node>
|
||
|
|
<node id="3">
|
||
|
|
<label>memory</label>
|
||
|
|
</node>
|
||
|
|
<node id="6">
|
||
|
|
<label>umfpack.h</label>
|
||
|
|
</node>
|
||
|
|
<node id="5">
|
||
|
|
<label>vector</label>
|
||
|
|
</node>
|
||
|
|
</incdepgraph>
|
||
|
|
<innerclass refid="structserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_pattern_1_1_state" prot="public">serif::solver::preconditioner::backend::mfem::detail::DirectLUPattern::State</innerclass>
|
||
|
|
<innerclass refid="structserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_1_1_state" prot="public">serif::solver::preconditioner::backend::mfem::detail::DirectLU::State</innerclass>
|
||
|
|
<innernamespace refid="namespaceserif">serif</innernamespace>
|
||
|
|
<innernamespace refid="namespaceserif_1_1solver">serif::solver</innernamespace>
|
||
|
|
<innernamespace refid="namespaceserif_1_1solver_1_1preconditioner">serif::solver::preconditioner</innernamespace>
|
||
|
|
<innernamespace refid="namespaceserif_1_1solver_1_1preconditioner_1_1backend">serif::solver::preconditioner::backend</innernamespace>
|
||
|
|
<innernamespace refid="namespaceserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem">serif::solver::preconditioner::backend::mfem</innernamespace>
|
||
|
|
<innernamespace refid="namespaceserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail">serif::solver::preconditioner::backend::mfem::detail</innernamespace>
|
||
|
|
<briefdescription>
|
||
|
|
</briefdescription>
|
||
|
|
<detaileddescription>
|
||
|
|
</detaileddescription>
|
||
|
|
<programlisting>
|
||
|
|
<codeline lineno="1"><highlight class="comment">//<sp/>sparse_direct=umfpack:<sp/>SuiteSparse<sp/>UMFPACK,<sp/>the<sp/>portable<sp/>backend<sp/>(Linux,<sp/>macOS,<sp/>Windows).</highlight><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="2"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>"<ref refid="direct__lu_8hpp" kindref="compound">direct_lu.hpp</ref>"</highlight><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="3"><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="4"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/><algorithm></highlight><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="5"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/><vector></highlight><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="6"><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="7"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/><umfpack.h></highlight><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="8"><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="9"><highlight class="normal"></highlight><highlight class="keyword">namespace<sp/></highlight><highlight class="normal"><ref refid="namespaceserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail" kindref="compound">serif::solver::preconditioner::backend::mfem::detail</ref></highlight></codeline>
|
||
|
|
<codeline lineno="10"><highlight class="normal">{</highlight></codeline>
|
||
|
|
<codeline lineno="11"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">struct<sp/></highlight><highlight class="normal"><ref refid="structserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_pattern_1_1_state" kindref="compound">DirectLUPattern::State</ref></highlight></codeline>
|
||
|
|
<codeline lineno="12"><highlight class="normal"><sp/><sp/><sp/><sp/>{</highlight></codeline>
|
||
|
|
<codeline lineno="13"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/><ref refid="structserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_pattern_1_1_state_1a0f5be4d158fe03e5052761bdc093bccc" kindref="member">size</ref>{0};</highlight></codeline>
|
||
|
|
<codeline lineno="14"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector<int><sp/><ref refid="structserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_pattern_1_1_state_1ac197e1cde112c0243a8a7dcc6ebf85bb" kindref="member">column_starts</ref>;<sp/><sp/></highlight><highlight class="comment">//<sp/>UMFPACK's<sp/>int<sp/>interface;<sp/>MFEM<sp/>indices<sp/>are<sp/>int</highlight><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="15"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector<int><sp/><ref refid="structserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_pattern_1_1_state_1ab2f3eae2ee1f05b8a639874e55f78050" kindref="member">row_indices</ref>;</highlight></codeline>
|
||
|
|
<codeline lineno="16"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector<double><sp/><ref refid="structserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_pattern_1_1_state_1a333ed9d6520364d4ea9f959c673faeb4" kindref="member">control</ref><sp/>=<sp/>std::vector<double>(UMFPACK_CONTROL);</highlight></codeline>
|
||
|
|
<codeline lineno="17"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal">*<sp/><ref refid="structserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_pattern_1_1_state_1a2508d40a17f1f5a504ff20d3313591aa" kindref="member">symbolic</ref>{</highlight><highlight class="keyword">nullptr</highlight><highlight class="normal">};</highlight></codeline>
|
||
|
|
<codeline lineno="18"><highlight class="normal"><sp/><sp/><sp/><sp/>};</highlight></codeline>
|
||
|
|
<codeline lineno="19"><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="20"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">struct<sp/></highlight><highlight class="normal"><ref refid="structserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_1_1_state" kindref="compound">DirectLU::State</ref></highlight></codeline>
|
||
|
|
<codeline lineno="21"><highlight class="normal"><sp/><sp/><sp/><sp/>{</highlight></codeline>
|
||
|
|
<codeline lineno="22"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::shared_ptr<const<sp/>DirectLUPattern><sp/><ref refid="structserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_1_1_state_1afc0742e7b854cbfb87e4094c45ecb0c7" kindref="member">pattern</ref>;</highlight></codeline>
|
||
|
|
<codeline lineno="23"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector<double><sp/><ref refid="structserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_1_1_state_1aab405a770efa90e2bcd0894b6c2f6174" kindref="member">values</ref>;</highlight></codeline>
|
||
|
|
<codeline lineno="24"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal">*<sp/><ref refid="structserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_1_1_state_1a887edfcc1fa4a50274041e899f9148be" kindref="member">numeric</ref>{</highlight><highlight class="keyword">nullptr</highlight><highlight class="normal">};</highlight></codeline>
|
||
|
|
<codeline lineno="25"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">mutable</highlight><highlight class="normal"><sp/>std::vector<double><sp/><ref refid="structserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_1_1_state_1accdd61551bc66f8fc7b8d8c3b6873805" kindref="member">right</ref>;</highlight></codeline>
|
||
|
|
<codeline lineno="26"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">mutable</highlight><highlight class="normal"><sp/>std::vector<int><sp/><ref refid="structserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_1_1_state_1abd1d42bd5544efa90e5ffc1871311058" kindref="member">integer_workspace</ref>;</highlight></codeline>
|
||
|
|
<codeline lineno="27"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">mutable</highlight><highlight class="normal"><sp/>std::vector<double><sp/><ref refid="structserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_1_1_state_1a2a9b63f16955d210d27da49913db4e9d" kindref="member">workspace</ref>;</highlight></codeline>
|
||
|
|
<codeline lineno="28"><highlight class="normal"><sp/><sp/><sp/><sp/>};</highlight></codeline>
|
||
|
|
<codeline lineno="29"><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="30"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal">*<sp/><ref refid="namespaceserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1a97b4f86072adcca456c16c02e3e5b555" kindref="member">direct_lu_backend</ref>()<sp/>noexcept<sp/>{<sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/></highlight><highlight class="stringliteral">"umfpack"</highlight><highlight class="normal">;<sp/>}</highlight></codeline>
|
||
|
|
<codeline lineno="31"><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="32"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/><ref refid="namespaceserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1aa819cbc100505f678b3685e0e4527fc3" kindref="member">direct_lu_available</ref>()<sp/>noexcept<sp/>{<sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">true</highlight><highlight class="normal">;<sp/>}</highlight></codeline>
|
||
|
|
<codeline lineno="33"><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="34"><highlight class="normal"><sp/><sp/><sp/><sp/>std::shared_ptr<const<sp/>DirectLUPattern><sp/><ref refid="classserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_pattern_1aeb21a738066ddd45052855e709fcdf10" kindref="member">DirectLUPattern::analyze</ref>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>size,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">long</highlight><highlight class="normal">*<sp/>column_starts,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal">*<sp/>row_indices,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal">*<sp/>values,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal">&<sp/>status)</highlight></codeline>
|
||
|
|
<codeline lineno="35"><highlight class="normal"><sp/><sp/><sp/><sp/>{</highlight></codeline>
|
||
|
|
<codeline lineno="36"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal"><sp/>state<sp/>=<sp/>std::make_unique<State>();</highlight></codeline>
|
||
|
|
<codeline lineno="37"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>state->size<sp/>=<sp/>size;</highlight></codeline>
|
||
|
|
<codeline lineno="38"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>state->column_starts.assign(column_starts,<sp/>column_starts<sp/>+<sp/>size<sp/>+<sp/>1);</highlight></codeline>
|
||
|
|
<codeline lineno="39"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>state->row_indices.assign(row_indices,<sp/>row_indices<sp/>+<sp/>column_starts[size]);</highlight></codeline>
|
||
|
|
<codeline lineno="40"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>umfpack_di_defaults(state->control.data());</highlight></codeline>
|
||
|
|
<codeline lineno="41"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>The<sp/>preconditioner<sp/>needs<sp/>no<sp/>iterative<sp/>refinement;<sp/>FGMRES<sp/>corrects<sp/>the<sp/>outer<sp/>solution.</highlight><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="42"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>state->control[UMFPACK_IRSTEP]<sp/>=<sp/>0.0;</highlight></codeline>
|
||
|
|
<codeline lineno="43"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>METIS:<sp/>on<sp/>the<sp/>benchmark<sp/>potential<sp/>block<sp/>it<sp/>leaves<sp/>20%<sp/>less<sp/>fill<sp/>than<sp/>the<sp/>default<sp/>ordering<sp/>(11.2M<sp/>vs<sp/>14.0M</highlight><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="44"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>entries)<sp/>and<sp/>factors<sp/>slightly<sp/>faster.<sp/>SuiteSparse<sp/>builds<sp/>without<sp/>METIS<sp/>reject<sp/>it,<sp/>so<sp/>retry<sp/>with<sp/>the<sp/>default.</highlight><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="45"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>state->control[UMFPACK_ORDERING]<sp/>=<sp/>UMFPACK_ORDERING_METIS;</highlight></codeline>
|
||
|
|
<codeline lineno="46"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector<double><sp/>info(UMFPACK_INFO);</highlight></codeline>
|
||
|
|
<codeline lineno="47"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>status<sp/>=<sp/>umfpack_di_symbolic(size,<sp/>size,<sp/>state->column_starts.data(),<sp/>state->row_indices.data(),<sp/>values,</highlight></codeline>
|
||
|
|
<codeline lineno="48"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>&state->symbolic,<sp/>state->control.data(),<sp/>info.data());</highlight></codeline>
|
||
|
|
<codeline lineno="49"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(status<sp/>!=<sp/>UMFPACK_OK)<sp/>{</highlight></codeline>
|
||
|
|
<codeline lineno="50"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>umfpack_di_defaults(state->control.data());</highlight></codeline>
|
||
|
|
<codeline lineno="51"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>state->control[UMFPACK_IRSTEP]<sp/>=<sp/>0.0;</highlight></codeline>
|
||
|
|
<codeline lineno="52"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>status<sp/>=<sp/>umfpack_di_symbolic(size,<sp/>size,<sp/>state->column_starts.data(),<sp/>state->row_indices.data(),<sp/>values,</highlight></codeline>
|
||
|
|
<codeline lineno="53"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>&state->symbolic,<sp/>state->control.data(),<sp/>info.data());</highlight></codeline>
|
||
|
|
<codeline lineno="54"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
|
||
|
|
<codeline lineno="55"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(status<sp/>!=<sp/>UMFPACK_OK)<sp/>{<sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">nullptr</highlight><highlight class="normal">;<sp/>}</highlight></codeline>
|
||
|
|
<codeline lineno="56"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>std::shared_ptr<const<sp/>DirectLUPattern>(</highlight><highlight class="keyword">new</highlight><highlight class="normal"><sp/><ref refid="classserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_pattern_1a5a556bee2b8a2ba94d1d61ea9cc10520" kindref="member">DirectLUPattern</ref>(std::move(state)));</highlight></codeline>
|
||
|
|
<codeline lineno="57"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
|
||
|
|
<codeline lineno="58"><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="59"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="classserif_1_1solver_1_1preconditioner_1_1backend_1_1mfem_1_1detail_1_1_direct_l_u_pattern_1a5a556bee2b8a2ba94d1d61ea9cc10520" kindref="member">DirectLUPattern::DirectLUPattern</ref>(std::unique_ptr<State><sp/>state)<sp/>:<sp/>m_state(std::move(state))<sp/>{}</highlight></codeline>
|
||
|
|
<codeline lineno="60"><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="61"><highlight class="normal"><sp/><sp/><sp/><sp/>DirectLUPattern::~DirectLUPattern()</highlight></codeline>
|
||
|
|
<codeline lineno="62"><highlight class="normal"><sp/><sp/><sp/><sp/>{</highlight></codeline>
|
||
|
|
<codeline lineno="63"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(m_state<sp/>&&<sp/>m_state->symbolic)<sp/>{<sp/>umfpack_di_free_symbolic(&m_state->symbolic);<sp/>}</highlight></codeline>
|
||
|
|
<codeline lineno="64"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
|
||
|
|
<codeline lineno="65"><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="66"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>DirectLUPattern::matches(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>size,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">long</highlight><highlight class="normal">*<sp/>column_starts,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal">*<sp/>row_indices)</highlight><highlight class="keyword"><sp/>const</highlight></codeline>
|
||
|
|
<codeline lineno="67"><highlight class="keyword"><sp/><sp/><sp/><sp/></highlight><highlight class="normal">{</highlight></codeline>
|
||
|
|
<codeline lineno="68"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>size<sp/>==<sp/>m_state->size<sp/>&&<sp/>std::equal(m_state->column_starts.begin(),<sp/>m_state->column_starts.end(),<sp/>column_starts)<sp/>&&</highlight></codeline>
|
||
|
|
<codeline lineno="69"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::equal(m_state->row_indices.begin(),<sp/>m_state->row_indices.end(),<sp/>row_indices);</highlight></codeline>
|
||
|
|
<codeline lineno="70"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
|
||
|
|
<codeline lineno="71"><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="72"><highlight class="normal"><sp/><sp/><sp/><sp/>std::unique_ptr<DirectLU><sp/>DirectLU::factor(std::shared_ptr<const<sp/>DirectLUPattern><sp/>pattern,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal">*<sp/>values,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal">&<sp/>status)</highlight></codeline>
|
||
|
|
<codeline lineno="73"><highlight class="normal"><sp/><sp/><sp/><sp/>{</highlight></codeline>
|
||
|
|
<codeline lineno="74"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&<sp/>shape<sp/>=<sp/>*pattern->m_state;</highlight></codeline>
|
||
|
|
<codeline lineno="75"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal"><sp/>state<sp/>=<sp/>std::make_unique<State>();</highlight></codeline>
|
||
|
|
<codeline lineno="76"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>state->values.assign(values,<sp/>values<sp/>+<sp/>shape.column_starts[</highlight><highlight class="keyword">static_cast<</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">></highlight><highlight class="normal">(shape.size)]);</highlight></codeline>
|
||
|
|
<codeline lineno="77"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>state->right.resize(</highlight><highlight class="keyword">static_cast<</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">></highlight><highlight class="normal">(shape.size));</highlight></codeline>
|
||
|
|
<codeline lineno="78"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>state->integer_workspace.resize(</highlight><highlight class="keyword">static_cast<</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">></highlight><highlight class="normal">(shape.size));</highlight></codeline>
|
||
|
|
<codeline lineno="79"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>state->workspace.resize(5<sp/>*<sp/></highlight><highlight class="keyword">static_cast<</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">></highlight><highlight class="normal">(shape.size));<sp/><sp/></highlight><highlight class="comment">//<sp/>wsolve<sp/>without<sp/>iterative<sp/>refinement</highlight><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="80"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector<double><sp/>info(UMFPACK_INFO);</highlight></codeline>
|
||
|
|
<codeline lineno="81"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>umfpack_di_numeric<sp/>reads<sp/>the<sp/>symbolic<sp/>object<sp/>without<sp/>modifying<sp/>it.</highlight><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="82"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>status<sp/>=<sp/>umfpack_di_numeric(shape.column_starts.data(),<sp/>shape.row_indices.data(),<sp/>state->values.data(),<sp/>shape.symbolic,</highlight></codeline>
|
||
|
|
<codeline lineno="83"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>&state->numeric,<sp/>shape.control.data(),<sp/>info.data());</highlight></codeline>
|
||
|
|
<codeline lineno="84"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(status<sp/>!=<sp/>UMFPACK_OK)</highlight></codeline>
|
||
|
|
<codeline lineno="85"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
|
||
|
|
<codeline lineno="86"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>umfpack_di_free_numeric(&state->numeric);</highlight></codeline>
|
||
|
|
<codeline lineno="87"><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><highlight class="keyword">nullptr</highlight><highlight class="normal">;</highlight></codeline>
|
||
|
|
<codeline lineno="88"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
|
||
|
|
<codeline lineno="89"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>state->pattern<sp/>=<sp/>std::move(pattern);</highlight></codeline>
|
||
|
|
<codeline lineno="90"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>std::unique_ptr<DirectLU>(</highlight><highlight class="keyword">new</highlight><highlight class="normal"><sp/>DirectLU(std::move(state)));</highlight></codeline>
|
||
|
|
<codeline lineno="91"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
|
||
|
|
<codeline lineno="92"><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="93"><highlight class="normal"><sp/><sp/><sp/><sp/>DirectLU::DirectLU(std::unique_ptr<State><sp/>state)<sp/>:<sp/>m_state(std::move(state))<sp/>{}</highlight></codeline>
|
||
|
|
<codeline lineno="94"><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="95"><highlight class="normal"><sp/><sp/><sp/><sp/>DirectLU::~DirectLU()</highlight></codeline>
|
||
|
|
<codeline lineno="96"><highlight class="normal"><sp/><sp/><sp/><sp/>{</highlight></codeline>
|
||
|
|
<codeline lineno="97"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(m_state<sp/>&&<sp/>m_state->numeric)<sp/>{<sp/>umfpack_di_free_numeric(&m_state->numeric);<sp/>}</highlight></codeline>
|
||
|
|
<codeline lineno="98"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
|
||
|
|
<codeline lineno="99"><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="100"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>DirectLU::solve(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal">*<sp/>right,<sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal">*<sp/>solution)</highlight><highlight class="keyword"><sp/>const</highlight></codeline>
|
||
|
|
<codeline lineno="101"><highlight class="keyword"><sp/><sp/><sp/><sp/></highlight><highlight class="normal">{</highlight></codeline>
|
||
|
|
<codeline lineno="102"><highlight class="normal"><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/>shape<sp/>=<sp/>*m_state->pattern->m_state;</highlight></codeline>
|
||
|
|
<codeline lineno="103"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::copy(right,<sp/>right<sp/>+<sp/>shape.size,<sp/>m_state->right.begin());</highlight></codeline>
|
||
|
|
<codeline lineno="104"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector<double><sp/>info(UMFPACK_INFO);</highlight></codeline>
|
||
|
|
<codeline lineno="105"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>umfpack_di_wsolve(UMFPACK_A,<sp/>shape.column_starts.data(),<sp/>shape.row_indices.data(),<sp/>m_state->values.data(),<sp/>solution,</highlight></codeline>
|
||
|
|
<codeline lineno="106"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>m_state->right.data(),<sp/>m_state->numeric,<sp/>shape.control.data(),<sp/>info.data(),<sp/>m_state->integer_workspace.data(),</highlight></codeline>
|
||
|
|
<codeline lineno="107"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>m_state->workspace.data());</highlight></codeline>
|
||
|
|
<codeline lineno="108"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
|
||
|
|
<codeline lineno="109"><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="110"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>UMFPACK<sp/>has<sp/>no<sp/>multiple<sp/>right-hand-side<sp/>solve.</highlight><highlight class="normal"></highlight></codeline>
|
||
|
|
<codeline lineno="111"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>DirectLU::solve_many(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>count,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal">*<sp/>right,<sp/></highlight><highlight class="keywordtype">double</highlight><highlight class="normal">*<sp/>solution)</highlight><highlight class="keyword"><sp/>const</highlight></codeline>
|
||
|
|
<codeline lineno="112"><highlight class="keyword"><sp/><sp/><sp/><sp/></highlight><highlight class="normal">{</highlight></codeline>
|
||
|
|
<codeline lineno="113"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>std::size_t<sp/>size<sp/>=<sp/></highlight><highlight class="keyword">static_cast<</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">></highlight><highlight class="normal">(m_state->pattern->m_state->size);</highlight></codeline>
|
||
|
|
<codeline lineno="114"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector<double><sp/>copy(right,<sp/>right<sp/>+<sp/>size<sp/>*<sp/></highlight><highlight class="keyword">static_cast<</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">></highlight><highlight class="normal">(count));</highlight></codeline>
|
||
|
|
<codeline lineno="115"><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/>column<sp/>=<sp/>0;<sp/>column<sp/><<sp/>count;<sp/>++column)</highlight></codeline>
|
||
|
|
<codeline lineno="116"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
|
||
|
|
<codeline lineno="117"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespaceserif_1_1solver_1_1linear_1_1backend_1_1mfem_1a048c6be0b47ff070d1ce8165ed857051" kindref="member">solve</ref>(copy.data()<sp/>+<sp/>size<sp/>*<sp/></highlight><highlight class="keyword">static_cast<</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">></highlight><highlight class="normal">(column),<sp/>solution<sp/>+<sp/>size<sp/>*<sp/></highlight><highlight class="keyword">static_cast<</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">></highlight><highlight class="normal">(column));</highlight></codeline>
|
||
|
|
<codeline lineno="118"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
|
||
|
|
<codeline lineno="119"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
|
||
|
|
<codeline lineno="120"><highlight class="normal">}<sp/></highlight><highlight class="comment">//<sp/>namespace<sp/>serif::solver::preconditioner::backend::mfem::detail</highlight><highlight class="normal"></highlight></codeline>
|
||
|
|
</programlisting>
|
||
|
|
<location file="src/lib/serif/backend/mfem/solver/preconditioner/inverse/direct_lu_umfpack.cpp"/>
|
||
|
|
</compounddef>
|
||
|
|
</doxygen>
|