Files
MeanField_SERiF/docs/xml/system__selection_8cpp.xml

1795 lines
138 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="system__selection_8cpp" kind="file" language="C++">
<compoundname>system_selection.cpp</compoundname>
<includes refid="system__data_8hpp" local="yes">system_data.hpp</includes>
<includes refid="volume__field__block_8hpp" local="yes">serif/backend/mfem/operators/volume_field_block.hpp</includes>
<includes local="no">algorithm</includes>
<includes local="no">limits</includes>
<includes local="no">utility</includes>
<includes refid="errors_8hpp" local="yes">serif/utils/error/errors.hpp</includes>
<incdepgraph>
<node id="122">
<label>serif/backend/mfem/discretization/basis_evaluation.hpp</label>
<link refid="basis__evaluation_8hpp"/>
<childnode refid="4" relation="include">
</childnode>
<childnode refid="23" relation="include">
</childnode>
<childnode refid="76" relation="include">
</childnode>
<childnode refid="123" relation="include">
</childnode>
</node>
<node id="151">
<label>serif/backend/mfem/discretization/coefficient_tracking.hpp</label>
<link refid="coefficient__tracking_8hpp"/>
<childnode refid="14" relation="include">
</childnode>
<childnode refid="73" relation="include">
</childnode>
</node>
<node id="20">
<label>serif/backend/mfem/discretization/dof_map.hpp</label>
<link refid="dof__map_8hpp"/>
<childnode refid="21" relation="include">
</childnode>
<childnode refid="5" relation="include">
</childnode>
<childnode refid="4" relation="include">
</childnode>
<childnode refid="22" relation="include">
</childnode>
<childnode refid="63" relation="include">
</childnode>
<childnode refid="64" relation="include">
</childnode>
<childnode refid="65" relation="include">
</childnode>
<childnode refid="50" relation="include">
</childnode>
<childnode refid="66" relation="include">
</childnode>
</node>
<node id="16">
<label>serif/backend/mfem/discretization/element_coordinates.hpp</label>
<link refid="element__coordinates_8hpp"/>
<childnode refid="17" relation="include">
</childnode>
<childnode refid="18" relation="include">
</childnode>
<childnode refid="19" relation="include">
</childnode>
<childnode refid="20" relation="include">
</childnode>
</node>
<node id="139">
<label>serif/backend/mfem/discretization/quadrature/concepts.hpp</label>
<link refid="backend_2mfem_2discretization_2quadrature_2concepts_8hpp"/>
<childnode refid="76" relation="include">
</childnode>
</node>
<node id="140">
<label>serif/backend/mfem/discretization/quadrature/configure.hpp</label>
<link refid="configure_8hpp"/>
<childnode refid="76" relation="include">
</childnode>
<childnode refid="139" relation="include">
</childnode>
</node>
<node id="128">
<label>serif/backend/mfem/discretization/quadrature/mfem_resolver.hpp</label>
<link refid="mfem__resolver_8hpp"/>
<childnode refid="6" relation="include">
</childnode>
<childnode refid="36" relation="include">
</childnode>
<childnode refid="38" relation="include">
</childnode>
<childnode refid="18" relation="include">
</childnode>
<childnode refid="76" relation="include">
</childnode>
<childnode refid="129" relation="include">
</childnode>
<childnode refid="135" relation="include">
</childnode>
<childnode refid="40" relation="include">
</childnode>
<childnode refid="136" relation="include">
</childnode>
<childnode refid="137" relation="include">
</childnode>
<childnode refid="139" relation="include">
</childnode>
<childnode refid="140" relation="include">
</childnode>
<childnode refid="141" relation="include">
</childnode>
<childnode refid="142" relation="include">
</childnode>
</node>
<node id="141">
<label>serif/backend/mfem/discretization/quadrature/mfem_static_order.hpp</label>
<link refid="mfem__static__order_8hpp"/>
<childnode refid="99" relation="include">
</childnode>
<childnode refid="134" relation="include">
</childnode>
<childnode refid="132" relation="include">
</childnode>
<childnode refid="46" relation="include">
</childnode>
<childnode refid="135" relation="include">
</childnode>
</node>
<node id="135">
<label>serif/backend/mfem/discretization/quadrature/order.hpp</label>
<link refid="backend_2mfem_2discretization_2quadrature_2order_8hpp"/>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="35" relation="include">
</childnode>
<childnode refid="98" relation="include">
</childnode>
<childnode refid="134" relation="include">
</childnode>
<childnode refid="50" relation="include">
</childnode>
</node>
<node id="22">
<label>serif/backend/mfem/discretization/reconstruction.hpp</label>
<link refid="reconstruction_8hpp"/>
<childnode refid="4" relation="include">
</childnode>
<childnode refid="7" relation="include">
</childnode>
<childnode refid="23" relation="include">
</childnode>
<childnode refid="24" relation="include">
</childnode>
<childnode refid="49" relation="include">
</childnode>
</node>
<node id="123">
<label>serif/backend/mfem/discretization/tensor_basis.hpp</label>
<link refid="tensor__basis_8hpp"/>
<childnode refid="14" relation="include">
</childnode>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="21" relation="include">
</childnode>
<childnode refid="124" relation="include">
</childnode>
<childnode refid="4" relation="include">
</childnode>
<childnode refid="7" relation="include">
</childnode>
<childnode refid="17" relation="include">
</childnode>
<childnode refid="125" relation="include">
</childnode>
<childnode refid="126" relation="include">
</childnode>
<childnode refid="50" relation="include">
</childnode>
<childnode refid="22" relation="include">
</childnode>
</node>
<node id="97">
<label>serif/backend/mfem/discretization/term_binding.hpp</label>
<link refid="term__binding_8hpp"/>
<childnode refid="14" relation="include">
</childnode>
<childnode refid="98" relation="include">
</childnode>
<childnode refid="100" relation="include">
</childnode>
<childnode refid="20" relation="include">
</childnode>
<childnode refid="50" relation="include">
</childnode>
</node>
<node id="88">
<label>serif/backend/mfem/discretization/term_coefficients.hpp</label>
<link refid="term__coefficients_8hpp"/>
<childnode refid="89" relation="include">
</childnode>
<childnode refid="97" relation="include">
</childnode>
</node>
<node id="79">
<label>serif/backend/mfem/mapping/compactification/compactification.hpp</label>
<link refid="compactification_8hpp"/>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="4" relation="include">
</childnode>
<childnode refid="78" relation="include">
</childnode>
<childnode refid="80" relation="include">
</childnode>
<childnode refid="81" relation="include">
</childnode>
</node>
<node id="80">
<label>serif/backend/mfem/mapping/compactification/input_result.hpp</label>
<link refid="input__result_8hpp"/>
<childnode refid="73" relation="include">
</childnode>
<childnode refid="74" relation="include">
</childnode>
</node>
<node id="77">
<label>serif/backend/mfem/mapping/compactification/kelvin.hpp</label>
<link refid="backend_2mfem_2mapping_2compactification_2kelvin_8hpp"/>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="73" relation="include">
</childnode>
<childnode refid="78" relation="include">
</childnode>
<childnode refid="79" relation="include">
</childnode>
<childnode refid="82" relation="include">
</childnode>
</node>
<node id="81">
<label>serif/backend/mfem/mapping/compactification/variation.hpp</label>
<link refid="compactification_2variation_8hpp"/>
<childnode refid="73" relation="include">
</childnode>
<childnode refid="74" relation="include">
</childnode>
</node>
<node id="83">
<label>serif/backend/mfem/mapping/context.hpp</label>
<link refid="context_8hpp"/>
<childnode refid="74" relation="include">
</childnode>
<childnode refid="73" relation="include">
</childnode>
</node>
<node id="84">
<label>serif/backend/mfem/mapping/data.hpp</label>
<link refid="data_8hpp"/>
<childnode refid="23" relation="include">
</childnode>
<childnode refid="64" relation="include">
</childnode>
<childnode refid="73" relation="include">
</childnode>
<childnode refid="74" relation="include">
</childnode>
<childnode refid="85" relation="include">
</childnode>
<childnode refid="53" relation="include">
</childnode>
<childnode refid="77" relation="include">
</childnode>
<childnode refid="83" relation="include">
</childnode>
<childnode refid="84" relation="include">
</childnode>
</node>
<node id="71">
<label>serif/backend/mfem/mapping/domain_mapper.hpp</label>
<link refid="backend_2mfem_2mapping_2domain__mapper_8hpp"/>
<childnode refid="72" relation="include">
</childnode>
<childnode refid="4" relation="include">
</childnode>
<childnode refid="73" relation="include">
</childnode>
<childnode refid="74" relation="include">
</childnode>
<childnode refid="75" relation="include">
</childnode>
<childnode refid="76" relation="include">
</childnode>
<childnode refid="77" relation="include">
</childnode>
<childnode refid="83" relation="include">
</childnode>
<childnode refid="84" relation="include">
</childnode>
<childnode refid="86" relation="include">
</childnode>
<childnode refid="87" relation="include">
</childnode>
</node>
<node id="78">
<label>serif/backend/mfem/mapping/status.hpp</label>
<link refid="status_8hpp"/>
<childnode refid="38" relation="include">
</childnode>
<childnode refid="53" relation="include">
</childnode>
<childnode refid="17" relation="include">
</childnode>
<childnode refid="60" relation="include">
</childnode>
<childnode refid="37" relation="include">
</childnode>
</node>
<node id="154">
<label>serif/backend/mfem/mapping/transformations.hpp</label>
<link refid="transformations_8hpp"/>
<childnode refid="86" relation="include">
</childnode>
<childnode refid="83" relation="include">
</childnode>
</node>
<node id="86">
<label>serif/backend/mfem/mapping/variation.hpp</label>
<link refid="variation_8hpp"/>
<childnode refid="74" relation="include">
</childnode>
<childnode refid="73" relation="include">
</childnode>
</node>
<node id="121">
<label>serif/backend/mfem/mapping/volume_cache.hpp</label>
<link refid="volume__cache_8hpp"/>
<childnode refid="74" relation="include">
</childnode>
<childnode refid="83" relation="include">
</childnode>
<childnode refid="7" relation="include">
</childnode>
</node>
<node id="3">
<label>serif/backend/mfem/model/system.hpp</label>
<link refid="system_8hpp"/>
<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="8" relation="include">
</childnode>
</node>
<node id="8">
<label>serif/backend/mfem/operators/actions.hpp</label>
<link refid="backend_2mfem_2operators_2actions_8hpp"/>
<childnode refid="9" relation="include">
</childnode>
<childnode refid="6" relation="include">
</childnode>
<childnode refid="7" relation="include">
</childnode>
<childnode refid="10" relation="include">
</childnode>
</node>
<node id="120">
<label>serif/backend/mfem/operators/element_data.hpp</label>
<link refid="element__data_8hpp"/>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="4" relation="include">
</childnode>
<childnode refid="7" relation="include">
</childnode>
<childnode refid="76" relation="include">
</childnode>
<childnode refid="121" relation="include">
</childnode>
<childnode refid="84" relation="include">
</childnode>
<childnode refid="122" relation="include">
</childnode>
</node>
<node id="152">
<label>serif/backend/mfem/operators/element_evaluation.hpp</label>
<link refid="element__evaluation_8hpp"/>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="21" relation="include">
</childnode>
<childnode refid="6" relation="include">
</childnode>
<childnode refid="66" relation="include">
</childnode>
<childnode refid="153" relation="include">
</childnode>
<childnode refid="120" relation="include">
</childnode>
<childnode refid="150" relation="include">
</childnode>
<childnode refid="143" relation="include">
</childnode>
</node>
<node id="156">
<label>serif/backend/mfem/operators/element_transpose.hpp</label>
<link refid="element__transpose_8hpp"/>
<childnode refid="152" relation="include">
</childnode>
</node>
<node id="10">
<label>serif/backend/mfem/operators/linearized_block.hpp</label>
<link refid="backend_2mfem_2operators_2linearized__block_8hpp"/>
<childnode refid="9" relation="include">
</childnode>
<childnode refid="4" relation="include">
</childnode>
<childnode refid="7" relation="include">
</childnode>
<childnode refid="11" relation="include">
</childnode>
<childnode refid="12" relation="include">
</childnode>
</node>
<node id="153">
<label>serif/backend/mfem/operators/operand_evaluation.hpp</label>
<link refid="operand__evaluation_8hpp"/>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="63" relation="include">
</childnode>
<childnode refid="17" relation="include">
</childnode>
<childnode refid="23" relation="include">
</childnode>
<childnode refid="75" relation="include">
</childnode>
<childnode refid="145" relation="include">
</childnode>
<childnode refid="122" relation="include">
</childnode>
<childnode refid="20" relation="include">
</childnode>
<childnode refid="154" relation="include">
</childnode>
<childnode refid="50" relation="include">
</childnode>
<childnode refid="155" relation="include">
</childnode>
</node>
<node id="127">
<label>serif/backend/mfem/operators/quadrature.hpp</label>
<link refid="quadrature_8hpp"/>
<childnode refid="14" relation="include">
</childnode>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="124" relation="include">
</childnode>
<childnode refid="75" relation="include">
</childnode>
<childnode refid="23" relation="include">
</childnode>
<childnode refid="128" relation="include">
</childnode>
<childnode refid="143" relation="include">
</childnode>
</node>
<node id="67">
<label>serif/backend/mfem/operators/volume_application.hpp</label>
<link refid="volume__application_8hpp"/>
<childnode refid="14" relation="include">
</childnode>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="9" relation="include">
</childnode>
<childnode refid="6" relation="include">
</childnode>
<childnode refid="31" relation="include">
</childnode>
<childnode refid="7" relation="include">
</childnode>
<childnode refid="68" relation="include">
</childnode>
<childnode refid="152" relation="include">
</childnode>
<childnode refid="156" relation="include">
</childnode>
<childnode refid="157" relation="include">
</childnode>
</node>
<node id="69">
<label>serif/backend/mfem/operators/volume_data.hpp</label>
<link refid="volume__data_8hpp"/>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="4" relation="include">
</childnode>
<childnode refid="7" relation="include">
</childnode>
<childnode refid="70" relation="include">
</childnode>
<childnode refid="71" relation="include">
</childnode>
<childnode refid="88" relation="include">
</childnode>
<childnode refid="120" relation="include">
</childnode>
<childnode refid="127" relation="include">
</childnode>
<childnode refid="150" relation="include">
</childnode>
</node>
<node id="13">
<label>serif/backend/mfem/operators/volume_field_block.hpp</label>
<link refid="volume__field__block_8hpp"/>
<childnode refid="14" relation="include">
</childnode>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="9" relation="include">
</childnode>
<childnode refid="4" relation="include">
</childnode>
<childnode refid="7" relation="include">
</childnode>
<childnode refid="16" relation="include">
</childnode>
<childnode refid="10" relation="include">
</childnode>
<childnode refid="67" relation="include">
</childnode>
<childnode refid="157" relation="include">
</childnode>
</node>
<node id="68">
<label>serif/backend/mfem/operators/volume_inputs.hpp</label>
<link refid="volume__inputs_8hpp"/>
<childnode refid="69" relation="include">
</childnode>
<childnode refid="151" relation="include">
</childnode>
</node>
<node id="150">
<label>serif/backend/mfem/operators/workspace.hpp</label>
<link refid="backend_2mfem_2operators_2workspace_8hpp"/>
<childnode refid="7" relation="include">
</childnode>
<childnode refid="84" relation="include">
</childnode>
<childnode refid="86" relation="include">
</childnode>
<childnode refid="122" relation="include">
</childnode>
</node>
<node id="157">
<label>serif/backend/mfem/shared/parallel.hpp</label>
<link refid="parallel_8hpp"/>
<childnode refid="59" relation="include">
</childnode>
<childnode refid="7" relation="include">
</childnode>
</node>
<node id="27">
<label>serif/dimensions/dimensions.hpp</label>
<link refid="dimensions_8hpp"/>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="28" relation="include">
</childnode>
</node>
<node id="28">
<label>serif/dimensions/quantities.hpp</label>
<link refid="quantities_8hpp"/>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="30" relation="include">
</childnode>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="31" relation="include">
</childnode>
<childnode refid="32" relation="include">
</childnode>
<childnode refid="33" relation="include">
</childnode>
</node>
<node id="34">
<label>serif/discretization/blocks/base.hpp</label>
<link refid="base_8hpp"/>
</node>
<node id="99">
<label>serif/discretization/blocks/concepts.hpp</label>
<link refid="discretization_2blocks_2concepts_8hpp"/>
<childnode refid="24" relation="include">
</childnode>
</node>
<node id="24">
<label>serif/discretization/blocks/fields.hpp</label>
<link refid="fields_8hpp"/>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="27" relation="include">
</childnode>
<childnode refid="34" relation="include">
</childnode>
<childnode refid="35" relation="include">
</childnode>
<childnode refid="40" relation="include">
</childnode>
<childnode refid="45" relation="include">
</childnode>
<childnode refid="46" relation="include">
</childnode>
<childnode refid="47" relation="include">
</childnode>
</node>
<node id="131">
<label>serif/discretization/blocks/runtime.hpp</label>
<link refid="discretization_2blocks_2runtime_8hpp"/>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="99" relation="include">
</childnode>
</node>
<node id="98">
<label>serif/discretization/blocks/traits.hpp</label>
<link refid="discretization_2blocks_2traits_8hpp"/>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="99" relation="include">
</childnode>
</node>
<node id="40">
<label>serif/discretization/domain/concepts.hpp</label>
<link refid="discretization_2domain_2concepts_8hpp"/>
<childnode refid="41" relation="include">
</childnode>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="6" relation="include">
</childnode>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="36" relation="include">
</childnode>
<childnode refid="42" relation="include">
</childnode>
<childnode refid="43" relation="include">
</childnode>
<childnode refid="32" relation="include">
</childnode>
<childnode refid="44" relation="include">
</childnode>
</node>
<node id="108">
<label>serif/discretization/domain/ids/boundary.hpp</label>
<link refid="ids_2boundary_8hpp"/>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="40" relation="include">
</childnode>
</node>
<node id="107">
<label>serif/discretization/domain/ids/concepts.hpp</label>
<link refid="discretization_2domain_2ids_2concepts_8hpp"/>
<childnode refid="108" relation="include">
</childnode>
<childnode refid="109" relation="include">
</childnode>
</node>
<node id="109">
<label>serif/discretization/domain/ids/domain.hpp</label>
<link refid="domain_8hpp"/>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="40" relation="include">
</childnode>
</node>
<node id="103">
<label>serif/discretization/domain/ids/lists/concepts.hpp</label>
<link refid="discretization_2domain_2ids_2lists_2concepts_8hpp"/>
<childnode refid="104" relation="include">
</childnode>
</node>
<node id="105">
<label>serif/discretization/domain/ids/lists/lists.hpp</label>
<link refid="lists_8hpp"/>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="41" relation="include">
</childnode>
<childnode refid="106" relation="include">
</childnode>
<childnode refid="44" relation="include">
</childnode>
</node>
<node id="104">
<label>serif/discretization/domain/ids/lists/traits.hpp</label>
<link refid="discretization_2domain_2ids_2lists_2traits_8hpp"/>
<childnode refid="105" relation="include">
</childnode>
</node>
<node id="106">
<label>serif/discretization/domain/ids/validation/concepts.hpp</label>
<link refid="discretization_2domain_2ids_2validation_2concepts_8hpp"/>
<childnode refid="107" relation="include">
</childnode>
<childnode refid="110" relation="include">
</childnode>
<childnode refid="111" relation="include">
</childnode>
</node>
<node id="110">
<label>serif/discretization/domain/ids/validation/unique_ids.hpp</label>
<link refid="unique__ids_8hpp"/>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="44" relation="include">
</childnode>
</node>
<node id="45">
<label>serif/discretization/domain/physical_domains.hpp</label>
<link refid="physical__domains_8hpp"/>
<childnode refid="43" relation="include">
</childnode>
<childnode refid="40" relation="include">
</childnode>
</node>
<node id="115">
<label>serif/discretization/domain/relation/concepts.hpp</label>
<link refid="discretization_2domain_2relation_2concepts_8hpp"/>
<childnode refid="116" relation="include">
</childnode>
<childnode refid="32" relation="include">
</childnode>
</node>
<node id="112">
<label>serif/discretization/domain/relation/lists/concepts.hpp</label>
<link refid="discretization_2domain_2relation_2lists_2concepts_8hpp"/>
<childnode refid="113" relation="include">
</childnode>
</node>
<node id="114">
<label>serif/discretization/domain/relation/lists/relation_list.hpp</label>
<link refid="relation__list_8hpp"/>
<childnode refid="41" relation="include">
</childnode>
<childnode refid="115" relation="include">
</childnode>
<childnode refid="44" relation="include">
</childnode>
</node>
<node id="113">
<label>serif/discretization/domain/relation/lists/traits.hpp</label>
<link refid="discretization_2domain_2relation_2lists_2traits_8hpp"/>
<childnode refid="114" relation="include">
</childnode>
</node>
<node id="116">
<label>serif/discretization/domain/relation/relations.hpp</label>
<link refid="discretization_2domain_2relation_2relations_8hpp"/>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="40" relation="include">
</childnode>
<childnode refid="33" relation="include">
</childnode>
<childnode refid="44" relation="include">
</childnode>
</node>
<node id="117">
<label>serif/discretization/domain/relation/validation/concepts.hpp</label>
<link refid="discretization_2domain_2relation_2validation_2concepts_8hpp"/>
<childnode refid="118" relation="include">
</childnode>
</node>
<node id="118">
<label>serif/discretization/domain/relation/validation/validation.hpp</label>
<link refid="discretization_2domain_2relation_2validation_2validation_8hpp"/>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="40" relation="include">
</childnode>
<childnode refid="103" relation="include">
</childnode>
<childnode refid="115" relation="include">
</childnode>
<childnode refid="112" relation="include">
</childnode>
<childnode refid="114" relation="include">
</childnode>
<childnode refid="119" relation="include">
</childnode>
</node>
<node id="119">
<label>serif/discretization/domain/resolver.hpp</label>
<link refid="resolver_8hpp"/>
<childnode refid="40" relation="include">
</childnode>
<childnode refid="103" relation="include">
</childnode>
<childnode refid="105" relation="include">
</childnode>
</node>
<node id="100">
<label>serif/discretization/domain/schema/concepts.hpp</label>
<link refid="discretization_2domain_2schema_2concepts_8hpp"/>
<childnode refid="101" relation="include">
</childnode>
</node>
<node id="102">
<label>serif/discretization/domain/schema/domain_schema.hpp</label>
<link refid="domain__schema_8hpp"/>
<childnode refid="41" relation="include">
</childnode>
<childnode refid="40" relation="include">
</childnode>
<childnode refid="103" relation="include">
</childnode>
<childnode refid="112" relation="include">
</childnode>
<childnode refid="117" relation="include">
</childnode>
<childnode refid="119" relation="include">
</childnode>
</node>
<node id="101">
<label>serif/discretization/domain/schema/traits.hpp</label>
<link refid="discretization_2domain_2schema_2traits_8hpp"/>
<childnode refid="102" relation="include">
</childnode>
</node>
<node id="43">
<label>serif/discretization/domain/types.hpp</label>
<link refid="discretization_2domain_2types_8hpp"/>
<childnode refid="26" relation="include">
</childnode>
</node>
<node id="132">
<label>serif/discretization/forms/concept.hpp</label>
<link refid="concept_8hpp"/>
<childnode refid="133" relation="include">
</childnode>
</node>
<node id="138">
<label>serif/discretization/forms/form_traits.hpp</label>
<link refid="form__traits_8hpp"/>
<childnode refid="132" relation="include">
</childnode>
<childnode refid="133" relation="include">
</childnode>
</node>
<node id="133">
<label>serif/discretization/forms/forms.hpp</label>
<link refid="forms_8hpp"/>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="99" relation="include">
</childnode>
<childnode refid="134" relation="include">
</childnode>
<childnode refid="46" relation="include">
</childnode>
<childnode refid="47" relation="include">
</childnode>
</node>
<node id="134">
<label>serif/discretization/forms/operands.hpp</label>
<link refid="operands_8hpp"/>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="99" relation="include">
</childnode>
</node>
<node id="130">
<label>serif/discretization/forms/runtime.hpp</label>
<link refid="discretization_2forms_2runtime_8hpp"/>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="36" relation="include">
</childnode>
<childnode refid="131" relation="include">
</childnode>
<childnode refid="132" relation="include">
</childnode>
</node>
<node id="149">
<label>serif/discretization/forms/value.hpp</label>
<link refid="value_8hpp"/>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="98" relation="include">
</childnode>
<childnode refid="134" relation="include">
</childnode>
</node>
<node id="35">
<label>serif/discretization/functional_space/space.hpp</label>
<link refid="space_8hpp"/>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="36" relation="include">
</childnode>
<childnode refid="37" relation="include">
</childnode>
</node>
<node id="136">
<label>serif/discretization/quadrature/policy.hpp</label>
<link refid="policy_8hpp"/>
<childnode refid="137" relation="include">
</childnode>
<childnode refid="129" relation="include">
</childnode>
</node>
<node id="137">
<label>serif/discretization/quadrature/query.hpp</label>
<link refid="query_8hpp"/>
<childnode refid="36" relation="include">
</childnode>
<childnode refid="52" relation="include">
</childnode>
<childnode refid="129" relation="include">
</childnode>
<childnode refid="45" relation="include">
</childnode>
<childnode refid="138" relation="include">
</childnode>
<childnode refid="130" relation="include">
</childnode>
</node>
<node id="129">
<label>serif/discretization/quadrature/rules.hpp</label>
<link refid="rules_8hpp"/>
<childnode refid="5" relation="include">
</childnode>
<childnode refid="52" relation="include">
</childnode>
<childnode refid="7" relation="include">
</childnode>
<childnode refid="36" relation="include">
</childnode>
<childnode refid="17" relation="include">
</childnode>
<childnode refid="130" relation="include">
</childnode>
</node>
<node id="49">
<label>serif/discretization/reconstruction/surface_power.hpp</label>
<link refid="surface__power_8hpp"/>
<childnode refid="21" relation="include">
</childnode>
<childnode refid="6" relation="include">
</childnode>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="45" relation="include">
</childnode>
<childnode refid="50" relation="include">
</childnode>
</node>
<node id="146">
<label>serif/equations/concepts.hpp</label>
<link refid="equations_2concepts_8hpp"/>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="147" relation="include">
</childnode>
<childnode refid="148" relation="include">
</childnode>
</node>
<node id="147">
<label>serif/equations/contributions.hpp</label>
<link refid="equations_2contributions_8hpp"/>
<childnode refid="31" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="17" relation="include">
</childnode>
<childnode refid="98" relation="include">
</childnode>
<childnode refid="134" relation="include">
</childnode>
</node>
<node id="148">
<label>serif/equations/point.hpp</label>
<link refid="point_8hpp"/>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="41" relation="include">
</childnode>
<childnode refid="31" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="149" relation="include">
</childnode>
<childnode refid="46" relation="include">
</childnode>
</node>
<node id="37">
<label>serif/meta/enums.hpp</label>
<link refid="enums_8hpp"/>
<childnode refid="38" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="39" relation="include">
</childnode>
</node>
<node id="47">
<label>serif/meta/names.hpp</label>
<link refid="names_8hpp"/>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="48" relation="include">
</childnode>
</node>
<node id="145">
<label>serif/operators/concepts.hpp</label>
<link refid="operators_2concepts_8hpp"/>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="98" relation="include">
</childnode>
<childnode refid="35" relation="include">
</childnode>
<childnode refid="146" relation="include">
</childnode>
</node>
<node id="143">
<label>serif/operators/plan.hpp</label>
<link refid="operators_2plan_8hpp"/>
<childnode refid="31" relation="include">
</childnode>
<childnode refid="144" relation="include">
</childnode>
<childnode refid="133" relation="include">
</childnode>
<childnode refid="145" relation="include">
</childnode>
</node>
<node id="94">
<label>serif/utils/dependencies/binding.hpp</label>
<link refid="utils_2dependencies_2binding_8hpp"/>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="95" relation="include">
</childnode>
</node>
<node id="89">
<label>serif/utils/dependencies/dependency_context.hpp</label>
<link refid="dependency__context_8hpp"/>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="31" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="17" relation="include">
</childnode>
<childnode refid="90" relation="include">
</childnode>
<childnode refid="92" relation="include">
</childnode>
<childnode refid="96" relation="include">
</childnode>
</node>
<node id="92">
<label>serif/utils/dependencies/detail/type_lists.hpp</label>
<link refid="type__lists_8hpp"/>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="41" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="93" relation="include">
</childnode>
</node>
<node id="93">
<label>serif/utils/dependencies/key_list.hpp</label>
<link refid="key__list_8hpp"/>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="94" relation="include">
</childnode>
<childnode refid="95" relation="include">
</childnode>
<childnode refid="46" relation="include">
</childnode>
</node>
<node id="144">
<label>serif/utils/dependencies/key_list_operations.hpp</label>
<link refid="key__list__operations_8hpp"/>
<childnode refid="41" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="92" relation="include">
</childnode>
</node>
<node id="90">
<label>serif/utils/dependencies/resource.hpp</label>
<link refid="resource_8hpp"/>
<childnode refid="9" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="17" relation="include">
</childnode>
<childnode refid="91" relation="include">
</childnode>
</node>
<node id="91">
<label>serif/utils/dependencies/snapshot.hpp</label>
<link refid="snapshot_8hpp"/>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="9" relation="include">
</childnode>
<childnode refid="4" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="17" relation="include">
</childnode>
</node>
<node id="60">
<label>serif/utils/error/codes.hpp</label>
<link refid="codes_8hpp"/>
<childnode refid="53" relation="include">
</childnode>
<childnode refid="37" relation="include">
</childnode>
</node>
<node id="50">
<label>serif/utils/error/errors.hpp</label>
<link refid="errors_8hpp"/>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="36" relation="include">
</childnode>
<childnode refid="51" relation="include">
</childnode>
<childnode refid="52" relation="include">
</childnode>
<childnode refid="53" relation="include">
</childnode>
<childnode refid="14" relation="include">
</childnode>
<childnode refid="54" relation="include">
</childnode>
<childnode refid="55" relation="include">
</childnode>
<childnode refid="58" relation="include">
</childnode>
<childnode refid="60" relation="include">
</childnode>
<childnode refid="61" relation="include">
</childnode>
</node>
<node id="66">
<label>serif/utils/error/nonfinite.hpp</label>
<link refid="nonfinite_8hpp"/>
<childnode refid="63" relation="include">
</childnode>
</node>
<node id="142">
<label>serif/utils/format/strings.hpp</label>
<link refid="format_2strings_8hpp"/>
<childnode refid="52" relation="include">
</childnode>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="6" relation="include">
</childnode>
<childnode refid="36" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
</node>
<node id="155">
<label>serif/utils/misc/compensated_sum.hpp</label>
<link refid="compensated__sum_8hpp"/>
<childnode refid="21" relation="include">
</childnode>
</node>
<node id="96">
<label>serif/utils/misc/concepts/concat.hpp</label>
<link refid="concat_8hpp"/>
<childnode refid="46" relation="include">
</childnode>
</node>
<node id="58">
<label>serif/utils/misc/concepts/exceptions.hpp</label>
<link refid="utils_2misc_2concepts_2exceptions_8hpp"/>
<childnode refid="59" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
<childnode refid="33" relation="include">
</childnode>
</node>
<node id="33">
<label>serif/utils/misc/concepts/numeric.hpp</label>
<link refid="numeric_8hpp"/>
<childnode refid="15" relation="include">
</childnode>
<childnode refid="29" relation="include">
</childnode>
</node>
<node id="111">
<label>serif/utils/misc/concepts/type_uniqueness.hpp</label>
<link refid="concepts_2type__uniqueness_8hpp"/>
<childnode refid="95" relation="include">
</childnode>
</node>
<node id="32">
<label>serif/utils/misc/std_helper/cleaning.hpp</label>
<link refid="cleaning_8hpp"/>
<childnode refid="29" relation="include">
</childnode>
</node>
<node id="44">
<label>serif/utils/misc/std_helper/variadic_cleaning.hpp</label>
<link refid="variadic__cleaning_8hpp"/>
<childnode refid="41" relation="include">
</childnode>
</node>
<node id="55">
<label>serif/utils/misc/terminal/colors.hpp</label>
<link refid="colors_8hpp"/>
<childnode refid="26" relation="include">
</childnode>
<childnode refid="51" relation="include">
</childnode>
<childnode refid="56" relation="include">
</childnode>
<childnode refid="17" relation="include">
</childnode>
<childnode refid="57" relation="include">
</childnode>
</node>
<node id="95">
<label>serif/utils/misc/traits/type_uniqueness.hpp</label>
<link refid="traits_2type__uniqueness_8hpp"/>
<childnode refid="25" relation="include">
</childnode>
<childnode refid="32" relation="include">
</childnode>
</node>
<node id="61">
<label>serif/utils/types/strings.hpp</label>
<link refid="types_2strings_8hpp"/>
<childnode refid="14" relation="include">
</childnode>
<childnode refid="62" relation="include">
</childnode>
<childnode refid="26" relation="include">
</childnode>
</node>
<node id="46">
<label>serif/utils/types/type_list.hpp</label>
<link refid="type__list_8hpp"/>
</node>
<node id="82">
<label>serif/utils/user_options/mapping/compactification/kelvin.hpp</label>
<link refid="utils_2user__options_2mapping_2compactification_2kelvin_8hpp"/>
</node>
<node id="87">
<label>serif/utils/user_options/mapping/domain_mapper.hpp</label>
<link refid="utils_2user__options_2mapping_2domain__mapper_8hpp"/>
</node>
<node id="2">
<label>system_data.hpp</label>
<link refid="system__data_8hpp"/>
<childnode refid="3" relation="include">
</childnode>
</node>
<node id="1">
<label>src/lib/serif/backend/mfem/model/system_selection.cpp</label>
<link refid="system__selection_8cpp"/>
<childnode refid="2" relation="include">
</childnode>
<childnode refid="13" relation="include">
</childnode>
<childnode refid="14" relation="include">
</childnode>
<childnode refid="124" relation="include">
</childnode>
<childnode refid="17" relation="include">
</childnode>
<childnode refid="50" relation="include">
</childnode>
</node>
<node id="14">
<label>algorithm</label>
</node>
<node id="25">
<label>array</label>
</node>
<node id="21">
<label>cmath</label>
</node>
<node id="30">
<label>compare</label>
</node>
<node id="15">
<label>concepts</label>
</node>
<node id="41">
<label>cstddef</label>
</node>
<node id="53">
<label>cstdint</label>
</node>
<node id="51">
<label>cstdio</label>
</node>
<node id="56">
<label>cstdlib</label>
</node>
<node id="59">
<label>exception</label>
</node>
<node id="72">
<label>expected</label>
</node>
<node id="36">
<label>format</label>
</node>
<node id="9">
<label>functional</label>
</node>
<node id="62">
<label>iostream</label>
</node>
<node id="124">
<label>limits</label>
</node>
<node id="39">
<label>magic_enum/magic_enum_all.hpp</label>
</node>
<node id="4">
<label>memory</label>
</node>
<node id="19">
<label>mfem/fem/doftrans.hpp</label>
</node>
<node id="75">
<label>mfem/fem/eltrans.hpp</label>
</node>
<node id="23">
<label>mfem/fem/fe/fe_base.hpp</label>
</node>
<node id="125">
<label>mfem/fem/fe/fe_h1.hpp</label>
</node>
<node id="126">
<label>mfem/fem/fe/fe_l2.hpp</label>
</node>
<node id="64">
<label>mfem/fem/fespace.hpp</label>
</node>
<node id="18">
<label>mfem/fem/geom.hpp</label>
</node>
<node id="70">
<label>mfem/fem/gridfunc.hpp</label>
</node>
<node id="76">
<label>mfem/fem/intrules.hpp</label>
</node>
<node id="65">
<label>mfem/fem/pfespace.hpp</label>
</node>
<node id="74">
<label>mfem/linalg/densemat.hpp</label>
</node>
<node id="11">
<label>mfem/linalg/operator.hpp</label>
</node>
<node id="12">
<label>mfem/linalg/sparsemat.hpp</label>
</node>
<node id="73">
<label>mfem/linalg/vector.hpp</label>
</node>
<node id="85">
<label>mfem/mesh/mesh.hpp</label>
</node>
<node id="48">
<label>nameof.hpp</label>
</node>
<node id="42">
<label>numeric</label>
</node>
<node id="5">
<label>optional</label>
</node>
<node id="6">
<label>span</label>
</node>
<node id="63">
<label>stdexcept</label>
</node>
<node id="52">
<label>string</label>
</node>
<node id="26">
<label>string_view</label>
</node>
<node id="31">
<label>tuple</label>
</node>
<node id="29">
<label>type_traits</label>
</node>
<node id="57">
<label>unistd.h</label>
</node>
<node id="38">
<label>unordered_map</label>
</node>
<node id="17">
<label>utility</label>
</node>
<node id="7">
<label>vector</label>
</node>
<node id="54">
<label>version</label>
</node>
</incdepgraph>
<innernamespace refid="namespaceserif">serif</innernamespace>
<innernamespace refid="namespaceserif_1_1model">serif::model</innernamespace>
<innernamespace refid="namespaceserif_1_1model_1_1backend">serif::model::backend</innernamespace>
<innernamespace refid="namespaceserif_1_1model_1_1backend_1_1mfem">serif::model::backend::mfem</innernamespace>
<innernamespace refid="namespaceserif_1_1model_1_1backend_1_1mfem_1_1detail">serif::model::backend::mfem::detail</innernamespace>
<briefdescription>
</briefdescription>
<detaileddescription>
</detaileddescription>
<programlisting>
<codeline lineno="1"><highlight class="preprocessor">#include<sp/>&quot;<ref refid="system__data_8hpp" kindref="compound">system_data.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/>&quot;<ref refid="volume__field__block_8hpp" kindref="compound">serif/backend/mfem/operators/volume_field_block.hpp</ref>&quot;</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/>&lt;algorithm&gt;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="6"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&lt;limits&gt;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="7"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&lt;utility&gt;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="8"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="errors_8hpp" kindref="compound">serif/utils/error/errors.hpp</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="9"><highlight class="normal"></highlight></codeline>
<codeline lineno="10"><highlight class="normal"></highlight><highlight class="keyword">namespace<sp/></highlight><highlight class="normal"><ref refid="namespaceserif_1_1model_1_1backend_1_1mfem_1_1detail" kindref="compound">serif::model::backend::mfem::detail</ref><sp/>{</highlight></codeline>
<codeline lineno="11"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">namespace<sp/></highlight><highlight class="normal">{</highlight></codeline>
<codeline lineno="13"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">struct<sp/></highlight><highlight class="normal">SelectedRange<sp/>{</highlight></codeline>
<codeline lineno="14"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>source;</highlight></codeline>
<codeline lineno="15"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>destination;</highlight></codeline>
<codeline lineno="16"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>size;</highlight></codeline>
<codeline lineno="17"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>};</highlight></codeline>
<codeline lineno="18"><highlight class="normal"></highlight></codeline>
<codeline lineno="20"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">struct<sp/></highlight><highlight class="normal">SelectedContribution<sp/>{</highlight></codeline>
<codeline lineno="21"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>LinearizedBlock<sp/>block;</highlight></codeline>
<codeline lineno="22"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;std::pair&lt;int,<sp/>int&gt;&gt;<sp/>rows;</highlight></codeline>
<codeline lineno="23"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;SelectedRange&gt;<sp/>columns;</highlight></codeline>
<codeline lineno="24"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>};</highlight></codeline>
<codeline lineno="25"><highlight class="normal"></highlight></codeline>
<codeline lineno="27"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">struct<sp/></highlight><highlight class="normal">Selection<sp/>{</highlight></codeline>
<codeline lineno="28"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::shared_ptr&lt;const<sp/>SystemData&gt;<sp/>data;</highlight></codeline>
<codeline lineno="29"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;SelectedContribution&gt;<sp/>contributions;</highlight></codeline>
<codeline lineno="30"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>rows;</highlight></codeline>
<codeline lineno="31"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>columns;</highlight></codeline>
<codeline lineno="32"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>};</highlight></codeline>
<codeline lineno="33"><highlight class="normal"></highlight></codeline>
<codeline lineno="35"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>[[nodiscard]]<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/><ref refid="namespaceserif_1_1solver_1_1preconditioner_1_1computations_1a0b5442f7837137f112bc8a5d80956b78" kindref="member">selected_size</ref>(std::span&lt;const<sp/>CoordinateRange&gt;<sp/>ranges,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>extent)<sp/>{</highlight></codeline>
<codeline lineno="36"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>size<sp/>=<sp/>0;</highlight></codeline>
<codeline lineno="37"><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="keyword">const</highlight><highlight class="normal"><sp/>CoordinateRange<sp/>range<sp/>:<sp/>ranges)<sp/>{</highlight></codeline>
<codeline lineno="38"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespaceserif_1_1model_1_1backend_1_1mfem_1_1detail_1a5b76f27e7b1faf0a58e9cb8d1902782a" kindref="member">validate_range</ref>(range.offset,<sp/>range.size,<sp/>extent);</highlight></codeline>
<codeline lineno="39"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespaceserif_1_1utils_1_1errors_1a7fefa3a63ca7895a875f2672026df02d" kindref="member">utils::errors::serif_ensure&lt;utils::errors::SERiFErrorCode::INVALID_DOF_COUNT&gt;</ref>(range.size<sp/>&lt;=<sp/>std::numeric_limits&lt;int&gt;::max()<sp/>-<sp/>size,</highlight></codeline>
<codeline lineno="40"><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="stringliteral">&quot;Selected<sp/>model<sp/>coordinates<sp/>exceed<sp/>MFEM&apos;s<sp/>integer<sp/>index<sp/>range.<sp/>Select<sp/>fewer<sp/>equation<sp/>or<sp/>state<sp/>coordinates.&quot;</highlight><highlight class="normal">);</highlight></codeline>
<codeline lineno="41"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>size<sp/>+=<sp/>range.size;</highlight></codeline>
<codeline lineno="42"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="43"><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/>size;</highlight></codeline>
<codeline lineno="44"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="45"><highlight class="normal"></highlight></codeline>
<codeline lineno="47"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>[[nodiscard]]<sp/>std::vector&lt;SelectedRange&gt;<sp/>selected_ranges(std::span&lt;const<sp/>CoordinateRange&gt;<sp/>ranges,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>source_offset,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>size)<sp/>{</highlight></codeline>
<codeline lineno="48"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;SelectedRange&gt;<sp/>result;</highlight></codeline>
<codeline lineno="49"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>destination<sp/>=<sp/>0;</highlight></codeline>
<codeline lineno="50"><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="keyword">const</highlight><highlight class="normal"><sp/>CoordinateRange<sp/>range<sp/>:<sp/>ranges)<sp/>{</highlight></codeline>
<codeline lineno="51"><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/>first<sp/>=<sp/>std::max(source_offset,<sp/>range.offset);</highlight></codeline>
<codeline lineno="52"><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/>end<sp/>=<sp/>std::min(source_offset<sp/>+<sp/>size,<sp/>range.offset<sp/>+<sp/>range.size);</highlight></codeline>
<codeline lineno="53"><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/>(first<sp/>&lt;<sp/>end)<sp/>{</highlight></codeline>
<codeline lineno="54"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>result.push_back({first<sp/>-<sp/>source_offset,<sp/>destination<sp/>+<sp/>first<sp/>-<sp/>range.offset,<sp/>end<sp/>-<sp/>first});</highlight></codeline>
<codeline lineno="55"><highlight class="normal"><sp/><sp/><sp/><sp/><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/>destination<sp/>+=<sp/>range.size;</highlight></codeline>
<codeline lineno="57"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="58"><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/>result;</highlight></codeline>
<codeline lineno="59"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="60"><highlight class="normal"></highlight></codeline>
<codeline lineno="62"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>add_selection(Selection&amp;<sp/>selection,<sp/>LinearizedBlock<sp/>block,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>source_column,<sp/>std::span&lt;const<sp/>CoordinateRange&gt;<sp/>columns,<sp/>std::vector&lt;std::pair&lt;int,<sp/>int&gt;&gt;<sp/>rows)<sp/>{</highlight></codeline>
<codeline lineno="63"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal"><sp/>selected_columns<sp/>=<sp/>selected_ranges(columns,<sp/>source_column,<sp/>block.action()-&gt;Width());</highlight></codeline>
<codeline lineno="64"><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/>(!rows.empty()<sp/>&amp;&amp;<sp/>!selected_columns.empty())<sp/>{</highlight></codeline>
<codeline lineno="65"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>selection.contributions.push_back({std::move(block),<sp/>std::move(rows),<sp/>std::move(selected_columns)});</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/>}</highlight></codeline>
<codeline lineno="68"><highlight class="normal"></highlight></codeline>
<codeline lineno="70"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>[[nodiscard]]<sp/>std::shared_ptr&lt;const<sp/>Selection&gt;<sp/>make_selection(std::shared_ptr&lt;const<sp/>SystemData&gt;<sp/>data,<sp/>std::span&lt;const<sp/>CoordinateRange&gt;<sp/>rows,<sp/>std::span&lt;const<sp/>CoordinateRange&gt;<sp/>columns,<sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>complete_action)<sp/>{</highlight></codeline>
<codeline lineno="71"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal"><sp/>selection<sp/>=<sp/>std::make_shared&lt;Selection&gt;(Selection{data,<sp/>{},<sp/><ref refid="namespaceserif_1_1solver_1_1preconditioner_1_1computations_1a0b5442f7837137f112bc8a5d80956b78" kindref="member">selected_size</ref>(rows,<sp/>data-&gt;rows),<sp/><ref refid="namespaceserif_1_1solver_1_1preconditioner_1_1computations_1a0b5442f7837137f112bc8a5d80956b78" kindref="member">selected_size</ref>(columns,<sp/>data-&gt;columns)});</highlight></codeline>
<codeline lineno="72"><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">&amp;<sp/>contributions<sp/>=<sp/>complete_action<sp/>&amp;&amp;<sp/>selection-&gt;data-&gt;complete_actions<sp/>?<sp/>*selection-&gt;data-&gt;complete_actions<sp/>:<sp/>selection-&gt;data-&gt;jacobian;</highlight></codeline>
<codeline lineno="73"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>contribution<sp/>:<sp/>contributions)<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/>std::vector&lt;std::pair&lt;int,<sp/>int&gt;&gt;<sp/>selected_rows;</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><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>SelectedRange<sp/>range<sp/>:<sp/>selected_ranges(rows,<sp/>contribution.row_offset,<sp/>contribution.block.action()-&gt;Height()))<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/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(</highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>index<sp/>=<sp/>0;<sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref><sp/>&lt;<sp/>range.size;<sp/>++<ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>)<sp/>{</highlight></codeline>
<codeline lineno="77"><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">if</highlight><highlight class="normal"><sp/>(!selection-&gt;data-&gt;replaced_rows[contribution.row_offset<sp/>+<sp/>range.source<sp/>+<sp/>index])<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/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>selected_rows.emplace_back(range.source<sp/>+<sp/>index,<sp/>range.destination<sp/>+<sp/>index);</highlight></codeline>
<codeline lineno="79"><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="80"><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="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/>add_selection(*selection,<sp/>contribution.block,<sp/>contribution.column_offset,<sp/>columns,<sp/>std::move(selected_rows));</highlight></codeline>
<codeline lineno="83"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="84"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>replacement<sp/>:<sp/>selection-&gt;data-&gt;replacements)<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/>std::vector&lt;std::pair&lt;int,<sp/>int&gt;&gt;<sp/>selected_rows;</highlight></codeline>
<codeline lineno="86"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>destination<sp/>=<sp/>0;</highlight></codeline>
<codeline lineno="87"><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="keyword">const</highlight><highlight class="normal"><sp/>CoordinateRange<sp/>range<sp/>:<sp/>rows)<sp/>{</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/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(std::size_t<sp/>index<sp/>=<sp/>0;<sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref><sp/>&lt;<sp/>replacement.selected_rows.size();<sp/>++<ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>)<sp/>{</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/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>row<sp/>=<sp/>replacement.selected_rows[<ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>];</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/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(row<sp/>&gt;=<sp/>range.offset<sp/>&amp;&amp;<sp/>row<sp/>&lt;<sp/>range.offset<sp/>+<sp/>range.size)<sp/>{</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/>selected_rows.emplace_back(</highlight><highlight class="keyword">static_cast&lt;</highlight><highlight class="keywordtype">int</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(index),<sp/>destination<sp/>+<sp/>row<sp/>-<sp/>range.offset);</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/><sp/><sp/><sp/><sp/>destination<sp/>+=<sp/>range.size;</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></codeline>
<codeline lineno="96"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>contribution<sp/>:<sp/>replacement.jacobian)<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/>add_selection(*selection,<sp/>contribution.block,<sp/>contribution.column_offset,<sp/>columns,<sp/>selected_rows);</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/>}</highlight></codeline>
<codeline lineno="100"><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/>selection;</highlight></codeline>
<codeline lineno="101"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="102"><highlight class="normal"></highlight></codeline>
<codeline lineno="104"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>apply_selection(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>Selection&amp;<sp/>selection,<sp/>const<sp/>::mfem::Vector&amp;<sp/>input,<sp/>::mfem::Vector&amp;<sp/>output,<sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>transpose,<sp/>::mfem::Vector&amp;<sp/>direction,<sp/>::mfem::Vector&amp;<sp/>result)<sp/>{</highlight></codeline>
<codeline lineno="105"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>contribution<sp/>:<sp/>selection.contributions)<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/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>action<sp/>=<sp/>contribution.block.action();</highlight></codeline>
<codeline lineno="107"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>direction.SetSize(transpose<sp/>?<sp/>action-&gt;Height()<sp/>:<sp/>action-&gt;Width());</highlight></codeline>
<codeline lineno="108"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>result.SetSize(transpose<sp/>?<sp/>action-&gt;Width()<sp/>:<sp/>action-&gt;Height());</highlight></codeline>
<codeline lineno="109"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>direction<sp/>=<sp/>0.0;</highlight></codeline>
<codeline lineno="110"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>result<sp/>=<sp/>0.0;</highlight></codeline>
<codeline lineno="111"><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/>(transpose)<sp/>{</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/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal"><sp/>[source,<sp/>destination]<sp/>:<sp/>contribution.rows)<sp/>{</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/><sp/><sp/><sp/><sp/>direction[source]<sp/>+=<sp/>input[destination];</highlight></codeline>
<codeline lineno="114"><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="115"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>action-&gt;MultTranspose(direction,<sp/>result);</highlight></codeline>
<codeline lineno="116"><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_1utils_1_1errors_1a7fefa3a63ca7895a875f2672026df02d" kindref="member">utils::errors::serif_ensure&lt;utils::errors::SERiFErrorCode::MATRIX_SHAPE_ERROR&gt;</ref>(result.Size()<sp/>==<sp/>action-&gt;Width(),<sp/></highlight><highlight class="stringliteral">&quot;A<sp/>selected<sp/>model<sp/>transpose<sp/>changed<sp/>its<sp/>declared<sp/>output<sp/>size.&quot;</highlight><highlight class="normal">);</highlight></codeline>
<codeline lineno="117"><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="keyword">const</highlight><highlight class="normal"><sp/>SelectedRange<sp/>range<sp/>:<sp/>contribution.columns)<sp/>{</highlight></codeline>
<codeline lineno="118"><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/>index<sp/>=<sp/>0;<sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref><sp/>&lt;<sp/>range.size;<sp/>++<ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>)<sp/>{</highlight></codeline>
<codeline lineno="119"><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/>output[range.destination<sp/>+<sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>]<sp/>+=<sp/>result[range.source<sp/>+<sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>];</highlight></codeline>
<codeline lineno="120"><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="121"><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="122"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="123"><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"><sp/>{</highlight></codeline>
<codeline lineno="124"><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="keyword">const</highlight><highlight class="normal"><sp/>SelectedRange<sp/>range<sp/>:<sp/>contribution.columns)<sp/>{</highlight></codeline>
<codeline lineno="125"><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/>index<sp/>=<sp/>0;<sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref><sp/>&lt;<sp/>range.size;<sp/>++<ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>)<sp/>{</highlight></codeline>
<codeline lineno="126"><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/>direction[range.source<sp/>+<sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>]<sp/>+=<sp/>input[range.destination<sp/>+<sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>];</highlight></codeline>
<codeline lineno="127"><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="128"><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="129"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>action-&gt;Mult(direction,<sp/>result);</highlight></codeline>
<codeline lineno="130"><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_1utils_1_1errors_1a7fefa3a63ca7895a875f2672026df02d" kindref="member">utils::errors::serif_ensure&lt;utils::errors::SERiFErrorCode::MATRIX_SHAPE_ERROR&gt;</ref>(result.Size()<sp/>==<sp/>action-&gt;Height(),<sp/></highlight><highlight class="stringliteral">&quot;A<sp/>selected<sp/>model<sp/>action<sp/>changed<sp/>its<sp/>declared<sp/>output<sp/>size.&quot;</highlight><highlight class="normal">);</highlight></codeline>
<codeline lineno="131"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal"><sp/>[source,<sp/>destination]<sp/>:<sp/>contribution.rows)<sp/>{</highlight></codeline>
<codeline lineno="132"><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/>output[destination]<sp/>+=<sp/>result[source];</highlight></codeline>
<codeline lineno="133"><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="134"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="135"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="136"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="137"><highlight class="normal"></highlight></codeline>
<codeline lineno="143"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>apply_selection_many(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>Selection&amp;<sp/>selection,<sp/>std::span&lt;const<sp/>::mfem::Vector*<sp/>const&gt;<sp/>inputs,<sp/>std::span&lt;::mfem::Vector*<sp/>const&gt;<sp/>outputs,<sp/>std::vector&lt;::mfem::Vector&gt;&amp;<sp/>directions,<sp/>std::vector&lt;::mfem::Vector&gt;&amp;<sp/>results)<sp/>{</highlight></codeline>
<codeline lineno="144"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>directions.resize(inputs.size());</highlight></codeline>
<codeline lineno="145"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>results.resize(inputs.size());</highlight></codeline>
<codeline lineno="146"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;const<sp/>::mfem::Vector*&gt;<sp/>active_directions;</highlight></codeline>
<codeline lineno="147"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;::mfem::Vector*&gt;<sp/>active_results;</highlight></codeline>
<codeline lineno="148"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;std::size_t&gt;<sp/>active;</highlight></codeline>
<codeline lineno="149"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>contribution<sp/>:<sp/>selection.contributions)<sp/>{</highlight></codeline>
<codeline lineno="150"><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="keyword">auto</highlight><highlight class="normal">&amp;<sp/>action<sp/>=<sp/>contribution.block.action();</highlight></codeline>
<codeline lineno="151"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>active.clear();</highlight></codeline>
<codeline lineno="152"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>active_directions.clear();</highlight></codeline>
<codeline lineno="153"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>active_results.clear();</highlight></codeline>
<codeline lineno="154"><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/>(std::size_t<sp/>k<sp/>=<sp/>0;<sp/>k<sp/>&lt;<sp/>inputs.size();<sp/>++k)<sp/>{</highlight></codeline>
<codeline lineno="155"><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="keyword">auto</highlight><highlight class="normal">&amp;<sp/>direction<sp/>=<sp/>directions[k];</highlight></codeline>
<codeline lineno="156"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>direction.SetSize(action-&gt;Width());</highlight></codeline>
<codeline lineno="157"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>direction<sp/>=<sp/>0.0;</highlight></codeline>
<codeline lineno="158"><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="keywordtype">bool</highlight><highlight class="normal"><sp/>nonzero<sp/>=<sp/></highlight><highlight class="keyword">false</highlight><highlight class="normal">;</highlight></codeline>
<codeline lineno="159"><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="keyword">const</highlight><highlight class="normal"><sp/>SelectedRange<sp/>range<sp/>:<sp/>contribution.columns)<sp/>{</highlight></codeline>
<codeline lineno="160"><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/>index<sp/>=<sp/>0;<sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref><sp/>&lt;<sp/>range.size;<sp/>++<ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>)<sp/>{</highlight></codeline>
<codeline lineno="161"><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/>direction[range.source<sp/>+<sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>]<sp/>+=<sp/>(*inputs[k])[range.destination<sp/>+<sp/>index];</highlight></codeline>
<codeline lineno="162"><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/>nonzero<sp/>=<sp/>nonzero<sp/>||<sp/>direction[range.source<sp/>+<sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>]<sp/>!=<sp/>0.0;</highlight></codeline>
<codeline lineno="163"><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="164"><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="165"><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">if</highlight><highlight class="normal"><sp/>(nonzero)<sp/>{</highlight></codeline>
<codeline lineno="166"><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/>results[k].SetSize(action-&gt;Height());</highlight></codeline>
<codeline lineno="167"><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/>results[k]<sp/>=<sp/>0.0;</highlight></codeline>
<codeline lineno="168"><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/>active.push_back(k);</highlight></codeline>
<codeline lineno="169"><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/>active_directions.push_back(&amp;direction);</highlight></codeline>
<codeline lineno="170"><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/>active_results.push_back(&amp;results[k]);</highlight></codeline>
<codeline lineno="171"><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="172"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="173"><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/>(active.empty())<sp/>{</highlight></codeline>
<codeline lineno="174"><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">continue</highlight><highlight class="normal">;</highlight></codeline>
<codeline lineno="175"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="176"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1a4c162ddfd57ca8b33e4f55537f0269ac" kindref="member">operators::backend::mfem::apply_many</ref>(*action,<sp/>active_directions,<sp/>active_results);</highlight></codeline>
<codeline lineno="177"><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="keyword">const</highlight><highlight class="normal"><sp/>std::size_t<sp/>k<sp/>:<sp/>active)<sp/>{</highlight></codeline>
<codeline lineno="178"><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_1utils_1_1errors_1a7fefa3a63ca7895a875f2672026df02d" kindref="member">utils::errors::serif_ensure&lt;utils::errors::SERiFErrorCode::MATRIX_SHAPE_ERROR&gt;</ref>(results[k].Size()<sp/>==<sp/>action-&gt;Height(),<sp/></highlight><highlight class="stringliteral">&quot;A<sp/>selected<sp/>model<sp/>action<sp/>changed<sp/>its<sp/>declared<sp/>output<sp/>size.&quot;</highlight><highlight class="normal">);</highlight></codeline>
<codeline lineno="179"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal"><sp/>[source,<sp/>destination]<sp/>:<sp/>contribution.rows)<sp/>{</highlight></codeline>
<codeline lineno="180"><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/>(*outputs[k])[destination]<sp/>+=<sp/>results[k][source];</highlight></codeline>
<codeline lineno="181"><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="182"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="183"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="184"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="185"><highlight class="normal"></highlight></codeline>
<codeline lineno="193"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>[[nodiscard]]<sp/>std::shared_ptr&lt;const<sp/>::mfem::SparseMatrix&gt;<sp/>assemble_selection(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>Selection&amp;<sp/>selection)<sp/>{</highlight></codeline>
<codeline lineno="194"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;std::shared_ptr&lt;const<sp/>::mfem::SparseMatrix&gt;&gt;<sp/>matrices;</highlight></codeline>
<codeline lineno="195"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>matrices.reserve(selection.contributions.size());</highlight></codeline>
<codeline lineno="196"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>contribution<sp/>:<sp/>selection.contributions)<sp/>{<sp/>matrices.push_back(<ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ae93623d73baa33d63a7bc8c2ee93b042" kindref="member">checked_assembly</ref>(contribution.block));<sp/>}</highlight></codeline>
<codeline lineno="197"><highlight class="normal"></highlight></codeline>
<codeline lineno="198"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Destination<sp/>row<sp/>-&gt;<sp/>(contribution,<sp/>source<sp/>row)<sp/>in<sp/>insertion<sp/>order.</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="199"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;int&gt;<sp/>offsets(</highlight><highlight class="keyword">static_cast&lt;</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(selection.rows)<sp/>+<sp/>1,<sp/>0);</highlight></codeline>
<codeline lineno="200"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>contribution<sp/>:<sp/>selection.contributions)<sp/>{</highlight></codeline>
<codeline lineno="201"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal"><sp/>[source,<sp/>destination]<sp/>:<sp/>contribution.rows)<sp/>{<sp/>++offsets[</highlight><highlight class="keyword">static_cast&lt;</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(destination)<sp/>+<sp/>1];<sp/>}</highlight></codeline>
<codeline lineno="202"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="203"><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/>row<sp/>=<sp/>0;<sp/>row<sp/>&lt;<sp/>selection.rows;<sp/>++row)<sp/>{<sp/>offsets[row<sp/>+<sp/>1]<sp/>+=<sp/>offsets[row];<sp/>}</highlight></codeline>
<codeline lineno="204"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;std::pair&lt;int,<sp/>int&gt;&gt;<sp/>incidence(</highlight><highlight class="keyword">static_cast&lt;</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(offsets.back()));</highlight></codeline>
<codeline lineno="205"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline lineno="206"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;int&gt;<sp/>cursor(offsets.begin(),<sp/>offsets.end()<sp/>-<sp/>1);</highlight></codeline>
<codeline lineno="207"><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/>index<sp/>=<sp/>0;<sp/>index<sp/>&lt;<sp/>static_cast&lt;int&gt;(selection.contributions.size());<sp/>++<ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>)<sp/>{</highlight></codeline>
<codeline lineno="208"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal"><sp/>[source,<sp/>destination]<sp/>:<sp/>selection.contributions[</highlight><highlight class="keyword">static_cast&lt;</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(index)].rows)<sp/>{</highlight></codeline>
<codeline lineno="209"><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/>incidence[</highlight><highlight class="keyword">static_cast&lt;</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(cursor[</highlight><highlight class="keyword">static_cast&lt;</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(destination)]++)]<sp/>=<sp/>{<ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>,<sp/>source};</highlight></codeline>
<codeline lineno="210"><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="211"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="212"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="213"><highlight class="normal"></highlight></codeline>
<codeline lineno="214"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">struct<sp/></highlight><highlight class="normal">RowScratch<sp/>{</highlight></codeline>
<codeline lineno="215"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;int&gt;<sp/>slot_of_column;</highlight></codeline>
<codeline lineno="216"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;int&gt;<sp/>columns;</highlight></codeline>
<codeline lineno="217"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;double&gt;<sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1adf1d7a29193c8b8a6cd17745686a04d8" kindref="member">values</ref>;</highlight></codeline>
<codeline lineno="218"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>};</highlight></codeline>
<codeline lineno="219"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;std::vector&lt;int&gt;&gt;<sp/>row_columns(</highlight><highlight class="keyword">static_cast&lt;</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(selection.rows));</highlight></codeline>
<codeline lineno="220"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;std::vector&lt;double&gt;&gt;<sp/>row_values(</highlight><highlight class="keyword">static_cast&lt;</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(selection.rows));</highlight></codeline>
<codeline lineno="221"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;RowScratch&gt;<sp/>scratch(</highlight><highlight class="keyword">static_cast&lt;</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(<ref refid="namespaceserif_1_1utils_1_1parallel_1a845c655da35a46d0be87880f0e4fa2d9" kindref="member">utils::parallel::worker_count</ref>()));</highlight></codeline>
<codeline lineno="222"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespaceserif_1_1utils_1_1parallel_1a453320d288c9e42300bdc59ee8dccd2d" kindref="member">utils::parallel::for_each_index</ref>(selection.rows,<sp/>[&amp;](</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>row,<sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>worker)<sp/>{</highlight></codeline>
<codeline lineno="223"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>RowScratch&amp;<sp/>local<sp/>=<sp/>scratch[static_cast&lt;std::size_t&gt;(worker)];</highlight></codeline>
<codeline lineno="224"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>local.slot_of_column.resize(static_cast&lt;std::size_t&gt;(selection.columns),<sp/>-1);</highlight></codeline>
<codeline lineno="225"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>local.columns.clear();</highlight></codeline>
<codeline lineno="226"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>local.values.clear();</highlight></codeline>
<codeline lineno="227"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>for<sp/>(int<sp/>entry<sp/>=<sp/>offsets[row];<sp/>entry<sp/>&lt;<sp/>offsets[row<sp/>+<sp/>1];<sp/>++entry)<sp/>{</highlight></codeline>
<codeline lineno="228"><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/>auto<sp/>[index,<sp/>source]<sp/>=<sp/>incidence[static_cast&lt;std::size_t&gt;(entry)];</highlight></codeline>
<codeline lineno="229"><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/>auto&amp;<sp/>matrix<sp/>=<sp/>*matrices[static_cast&lt;std::size_t&gt;(index)];</highlight></codeline>
<codeline lineno="230"><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/>auto&amp;<sp/>ranges<sp/>=<sp/>selection.contributions[static_cast&lt;std::size_t&gt;(index)].columns;</highlight></codeline>
<codeline lineno="231"><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/>int*<sp/>columns<sp/>=<sp/>matrix.GetRowColumns(source);</highlight></codeline>
<codeline lineno="232"><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/>double*<sp/>values<sp/>=<sp/>matrix.GetRowEntries(source);</highlight></codeline>
<codeline lineno="233"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>for<sp/>(int<sp/>k<sp/>=<sp/>0;<sp/>k<sp/>&lt;<sp/>matrix.RowSize(source);<sp/>++k)<sp/>{</highlight></codeline>
<codeline lineno="234"><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/>for<sp/>(const<sp/>SelectedRange<sp/>range<sp/>:<sp/>ranges)<sp/>{</highlight></codeline>
<codeline lineno="235"><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/>const<sp/>int<sp/>column<sp/>=<sp/>columns[k]<sp/>-<sp/>range.source;</highlight></codeline>
<codeline lineno="236"><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/>if<sp/>(column<sp/>&gt;=<sp/>0<sp/>&amp;&amp;<sp/>column<sp/>&lt;<sp/>range.size)<sp/>{</highlight></codeline>
<codeline lineno="237"><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/>int&amp;<sp/>slot<sp/>=<sp/>local.slot_of_column[static_cast&lt;std::size_t&gt;(range.destination<sp/>+<sp/>column)];</highlight></codeline>
<codeline lineno="238"><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/>if<sp/>(slot<sp/>&lt;<sp/>0)<sp/>{</highlight></codeline>
<codeline lineno="239"><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/><sp/><sp/><sp/><sp/>slot<sp/>=<sp/>static_cast&lt;int&gt;(local.columns.size());</highlight></codeline>
<codeline lineno="240"><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/><sp/><sp/><sp/><sp/>local.columns.push_back(range.destination<sp/>+<sp/>column);</highlight></codeline>
<codeline lineno="241"><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/><sp/><sp/><sp/><sp/>local.values.push_back(0.0);</highlight></codeline>
<codeline lineno="242"><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/>}</highlight></codeline>
<codeline lineno="243"><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/>local.values[static_cast&lt;std::size_t&gt;(slot)]<sp/>+=<sp/>values[k];</highlight></codeline>
<codeline lineno="244"><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="245"><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="246"><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="247"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="248"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>columns<sp/>=<sp/>row_columns[</highlight><highlight class="keyword">static_cast&lt;</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(row)];</highlight></codeline>
<codeline lineno="249"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>values<sp/>=<sp/>row_values[</highlight><highlight class="keyword">static_cast&lt;</highlight><highlight class="normal">std::size_t</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(row)];</highlight></codeline>
<codeline lineno="250"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>for<sp/>(std::size_t<sp/>slot<sp/>=<sp/>local.columns.size();<sp/>slot--<sp/>&gt;<sp/>0;)<sp/>{</highlight></codeline>
<codeline lineno="251"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>local.slot_of_column[static_cast&lt;std::size_t&gt;(local.columns[slot])]<sp/>=<sp/>-1;</highlight></codeline>
<codeline lineno="252"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>if<sp/>(local.values[slot]<sp/>==<sp/>0.0)<sp/>{<sp/>continue;<sp/>}</highlight></codeline>
<codeline lineno="253"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>columns.push_back(local.columns[slot]);</highlight></codeline>
<codeline lineno="254"><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_1operators_1_1backend_1_1mfem_1adf1d7a29193c8b8a6cd17745686a04d8" kindref="member">values</ref>.push_back(local.values[slot]);</highlight></codeline>
<codeline lineno="255"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="256"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>});</highlight></codeline>
<codeline lineno="257"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1_1detail_1ae7dfb772f1834905d73ff43cfa43c710" kindref="member">operators::backend::mfem::detail::make_csr</ref>(row_columns,<sp/>row_values,<sp/>selection.rows,<sp/>selection.columns);</highlight></codeline>
<codeline lineno="258"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="259"><highlight class="normal"></highlight></codeline>
<codeline lineno="261"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>[[nodiscard]]<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>diagonal_column(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>SelectedContribution&amp;<sp/>contribution,<sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>row)<sp/>{</highlight></codeline>
<codeline lineno="262"><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="keyword">const</highlight><highlight class="normal"><sp/>SelectedRange<sp/>range<sp/>:<sp/>contribution.columns)<sp/>{</highlight></codeline>
<codeline lineno="263"><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/>(row<sp/>&gt;=<sp/>range.destination<sp/>&amp;&amp;<sp/>row<sp/>&lt;<sp/>range.destination<sp/>+<sp/>range.size)<sp/>{</highlight></codeline>
<codeline lineno="264"><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/>range.source<sp/>+<sp/>row<sp/>-<sp/>range.destination;</highlight></codeline>
<codeline lineno="265"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="266"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="267"><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/>-1;</highlight></codeline>
<codeline lineno="268"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="269"><highlight class="normal"></highlight></codeline>
<codeline lineno="271"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>[[nodiscard]]<sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>uses_child_diagonal(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>SelectedContribution&amp;<sp/>contribution)<sp/>{</highlight></codeline>
<codeline lineno="272"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal"><sp/>[source,<sp/>destination]<sp/>:<sp/>contribution.rows)<sp/>{</highlight></codeline>
<codeline lineno="273"><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/>column<sp/>=<sp/>diagonal_column(contribution,<sp/>destination);</highlight></codeline>
<codeline lineno="274"><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/>(column<sp/>&gt;=<sp/>0<sp/>&amp;&amp;<sp/>source<sp/>!=<sp/>column)<sp/>{</highlight></codeline>
<codeline lineno="275"><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/></highlight><highlight class="keyword">false</highlight><highlight class="normal">;</highlight></codeline>
<codeline lineno="276"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="277"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="278"><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/>contribution.block.action()-&gt;Height()<sp/>==<sp/>contribution.block.action()-&gt;Width()<sp/>&amp;&amp;<sp/>contribution.block.has_diagonal();</highlight></codeline>
<codeline lineno="279"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="280"><highlight class="normal"></highlight></codeline>
<codeline lineno="282"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>[[nodiscard]]<sp/>std::vector&lt;double&gt;<sp/>selection_diagonal(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>Selection&amp;<sp/>selection)<sp/>{</highlight></codeline>
<codeline lineno="283"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>std::vector&lt;double&gt;<sp/>result(selection.rows,<sp/>0.0);</highlight></codeline>
<codeline lineno="284"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>contribution<sp/>:<sp/>selection.contributions)<sp/>{</highlight></codeline>
<codeline lineno="285"><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/>(uses_child_diagonal(contribution))<sp/>{</highlight></codeline>
<codeline lineno="286"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal"><sp/>diagonal<sp/>=<sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1a5ef0b3193bc6ca1e337d8ed922960680" kindref="member">checked_diagonal</ref>(contribution.block);</highlight></codeline>
<codeline lineno="287"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal"><sp/>[source,<sp/>destination]<sp/>:<sp/>contribution.rows)<sp/>{</highlight></codeline>
<codeline lineno="288"><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">if</highlight><highlight class="normal"><sp/>(diagonal_column(contribution,<sp/>destination)<sp/>&gt;=<sp/>0)<sp/>{</highlight></codeline>
<codeline lineno="289"><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/>result[destination]<sp/>+=<sp/>diagonal[source];</highlight></codeline>
<codeline lineno="290"><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="291"><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="292"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="293"><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"><sp/>{</highlight></codeline>
<codeline lineno="294"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal"><sp/>matrix<sp/>=<sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ae93623d73baa33d63a7bc8c2ee93b042" kindref="member">checked_assembly</ref>(contribution.block);</highlight></codeline>
<codeline lineno="295"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal"><sp/>[source,<sp/>destination]<sp/>:<sp/>contribution.rows)<sp/>{</highlight></codeline>
<codeline lineno="296"><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="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>column<sp/>=<sp/>diagonal_column(contribution,<sp/>destination);</highlight></codeline>
<codeline lineno="297"><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">if</highlight><highlight class="normal"><sp/>(column<sp/>&gt;=<sp/>0)<sp/>{</highlight></codeline>
<codeline lineno="298"><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/>index<sp/>=<sp/>0;<sp/><ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref><sp/>&lt;<sp/>matrix-&gt;RowSize(source);<sp/>++<ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>)<sp/>{</highlight></codeline>
<codeline lineno="299"><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/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(matrix-&gt;GetRowColumns(source)[index]<sp/>==<sp/>column)<sp/>{</highlight></codeline>
<codeline lineno="300"><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/><sp/><sp/><sp/><sp/>result[destination]<sp/>+=<sp/>matrix-&gt;GetRowEntries(source)[<ref refid="namespaceserif_1_1operators_1_1backend_1_1mfem_1ab297c6eedd8df878b6af2135b05e4616" kindref="member">index</ref>];</highlight></codeline>
<codeline lineno="301"><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/>}</highlight></codeline>
<codeline lineno="302"><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="303"><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="304"><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="305"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="306"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="307"><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/>result;</highlight></codeline>
<codeline lineno="308"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="309"><highlight class="normal"><sp/><sp/><sp/><sp/>}<sp/></highlight><highlight class="comment">//<sp/>namespace</highlight><highlight class="normal"></highlight></codeline>
<codeline lineno="310"><highlight class="normal"></highlight></codeline>
<codeline lineno="311"><highlight class="normal"><sp/><sp/><sp/><sp/>LinearizedBlock<sp/><ref refid="namespaceserif_1_1model_1_1backend_1_1mfem_1_1detail_1affbdf92e6e39f55e18d532d4d2f3e011" kindref="member">select_block</ref>(std::shared_ptr&lt;const<sp/>SystemData&gt;<sp/>data,<sp/>std::span&lt;const<sp/>CoordinateRange&gt;<sp/>rows,<sp/>std::span&lt;const<sp/>CoordinateRange&gt;<sp/>columns,<sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>complete_action)<sp/>{</highlight></codeline>
<codeline lineno="312"><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/>selection<sp/>=<sp/>make_selection(data,<sp/>rows,<sp/>columns,<sp/>complete_action);</highlight></codeline>
<codeline lineno="313"><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/>metadata<sp/>=<sp/>complete_action<sp/>&amp;&amp;<sp/>data-&gt;complete_actions<sp/>?<sp/>make_selection(std::move(data),<sp/>rows,<sp/>columns,<sp/></highlight><highlight class="keyword">false</highlight><highlight class="normal">)<sp/>:<sp/>selection;</highlight></codeline>
<codeline lineno="314"><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/>action<sp/>=<sp/>operators::backend::mfem::linearized_action(selection-&gt;rows,<sp/>selection-&gt;columns,<sp/>[selection,<sp/>direction<sp/>=<sp/>::mfem::Vector{},<sp/>result<sp/>=<sp/>::mfem::Vector{}](</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>input,<sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>output)<sp/></highlight><highlight class="keyword">mutable</highlight><highlight class="normal"><sp/>{</highlight></codeline>
<codeline lineno="315"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>apply_selection(*selection,<sp/>input,<sp/>output,<sp/>false,<sp/>direction,<sp/>result);</highlight></codeline>
<codeline lineno="316"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>},<sp/>[selection,<sp/>direction<sp/>=<sp/>::mfem::Vector{},<sp/>result<sp/>=<sp/>::mfem::Vector{}](</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>input,<sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>output)<sp/></highlight><highlight class="keyword">mutable</highlight><highlight class="normal"><sp/>{</highlight></codeline>
<codeline lineno="317"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>apply_selection(*selection,<sp/>input,<sp/>output,<sp/>true,<sp/>direction,<sp/>result);</highlight></codeline>
<codeline lineno="318"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>},<sp/>[selection,<sp/>directions<sp/>=<sp/>std::vector&lt;::mfem::Vector&gt;{},<sp/>results<sp/>=<sp/>std::vector&lt;::mfem::Vector&gt;{}](std::span&lt;const<sp/>::mfem::Vector*<sp/>const&gt;<sp/>inputs,<sp/>std::span&lt;::mfem::Vector*<sp/>const&gt;<sp/>outputs)<sp/></highlight><highlight class="keyword">mutable</highlight><highlight class="normal"><sp/>{</highlight></codeline>
<codeline lineno="319"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>apply_selection_many(*selection,<sp/>inputs,<sp/>outputs,<sp/>directions,<sp/>results);</highlight></codeline>
<codeline lineno="320"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>directions<sp/>=<sp/>{};</highlight></codeline>
<codeline lineno="321"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>results<sp/>=<sp/>{};</highlight></codeline>
<codeline lineno="322"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>});</highlight></codeline>
<codeline lineno="323"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>LinearizedBlock::Diagonal<sp/>diagonal;</highlight></codeline>
<codeline lineno="324"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>LinearizedBlock::Assembly<sp/>assembly;</highlight></codeline>
<codeline lineno="325"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(selection-&gt;rows<sp/>==<sp/>selection-&gt;columns<sp/>&amp;&amp;<sp/>std::ranges::all_of(metadata-&gt;contributions,<sp/>[](</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>entry)<sp/>{</highlight></codeline>
<codeline lineno="326"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>return<sp/>uses_child_diagonal(entry)<sp/>||<sp/>entry.block.has_assembly();</highlight></codeline>
<codeline lineno="327"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}))<sp/>{</highlight></codeline>
<codeline lineno="328"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>diagonal<sp/>=<sp/>[metadata]()<sp/>{</highlight></codeline>
<codeline lineno="329"><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/>selection_diagonal(*metadata);</highlight></codeline>
<codeline lineno="330"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>};</highlight></codeline>
<codeline lineno="331"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="332"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(std::ranges::all_of(metadata-&gt;contributions,<sp/>[](</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">auto</highlight><highlight class="normal">&amp;<sp/>entry)<sp/>{</highlight></codeline>
<codeline lineno="333"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>return<sp/>entry.block.has_assembly();</highlight></codeline>
<codeline lineno="334"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}))<sp/>{</highlight></codeline>
<codeline lineno="335"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>assembly<sp/>=<sp/>[metadata]()<sp/>{</highlight></codeline>
<codeline lineno="336"><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/>assemble_selection(*metadata);</highlight></codeline>
<codeline lineno="337"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>};</highlight></codeline>
<codeline lineno="338"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="339"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>LinearizedBlock(action.action(),<sp/>std::move(diagonal),<sp/>std::move(assembly));</highlight></codeline>
<codeline lineno="340"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline lineno="341"><highlight class="normal">}<sp/></highlight><highlight class="comment">//<sp/>namespace<sp/>serif::model::backend::mfem::detail</highlight><highlight class="normal"></highlight></codeline>
</programlisting>
<location file="src/lib/serif/backend/mfem/model/system_selection.cpp"/>
</compounddef>
</doxygen>