9#include <kernel/lafem/dense_vector.hpp>
10#include <kernel/lafem/dense_vector_blocked.hpp>
11#include <kernel/lafem/vector_mirror.hpp>
12#include <kernel/global/splitter.hpp>
13#include <kernel/assembly/mirror_assembler.hpp>
15#include <control/domain/domain_control.hpp>
16#include <control/asm/muxer_asm.hpp>
45 template<
typename DomainLevel_,
typename SpaceLambda_,
typename BaseSplitter_>
46 void asm_splitter(
const Domain::VirtualLevel<DomainLevel_>& virt_lvl,
47 SpaceLambda_&& space_lambda, BaseSplitter_& base_splitter)
49 typedef typename BaseSplitter_::LocalVectorType VectorType;
50 typedef typename BaseSplitter_::MirrorType MirrorType;
53 const auto& layer = virt_lvl.layer();
56 if(layer.comm().size() <= 1)
60 XASSERTM(virt_lvl.has_base(),
"cannot assemble base splitter because level has no base");
63 if(layer.comm().rank() == 0)
65 const DomainLevel_& level_b = virt_lvl.level_b();
68 base_splitter.set_base_vector_template(VectorType(space_lambda(level_b)->get_num_dofs()));
71 for(
int i(0); i < layer.comm().size(); ++i)
73 const auto* patch = level_b.find_patch_part(i);
75 MirrorType patch_mirror;
77 base_splitter.push_patch(std::move(patch_mirror));
82 const DomainLevel_& level = virt_lvl.level();
84 Index num_dofs = space_lambda(level)->get_num_dofs();
87 base_splitter.set_root(layer.comm_ptr(), 0, MirrorType::make_identity(num_dofs));
90 base_splitter.compile(VectorType(num_dofs));
116 template<
typename SysSplitter_,
typename Splitter0_,
typename Splitter1_>
117 void build_splitter_tuple(SysSplitter_& splitter_sys,
const typename SysSplitter_::LocalVectorType& tmpl_vec,
const Splitter0_& splitter_0,
const Splitter1_& splitter_1)
120 typename SysSplitter_::MuxerType sys_muxer;
121 build_muxer_tuple(sys_muxer, tmpl_vec, splitter_0.get_muxer(), splitter_1.get_muxer());
124 typename SysSplitter_::LocalVectorType base_vector_tmpl;
129 splitter_sys = SysSplitter_(std::move(sys_muxer), std::move(base_vector_tmpl));
158 template<
typename SysSplitter_,
typename Splitter0_,
typename Splitter1_,
typename Splitter2_>
159 void build_splitter_tuple(SysSplitter_& splitter_sys,
const typename SysSplitter_::LocalVectorType& tmpl_vec,
160 const Splitter0_& splitter_0,
const Splitter1_& splitter_1,
const Splitter2_& splitter_2)
163 typename SysSplitter_::MuxerType sys_muxer;
164 build_muxer_tuple(sys_muxer, tmpl_vec, splitter_0.get_muxer(), splitter_1.get_muxer());
167 typename SysSplitter_::LocalVectorType base_vector_tmpl;
173 splitter_sys = SysSplitter_(std::move(sys_muxer), std::move(base_vector_tmpl));
#define XASSERT(expr)
Assertion macro definition.
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
static void assemble_mirror(LAFEM::VectorMirror< DataType_, IndexType_ > &vec_mirror, const Space_ &space, const MeshPart_ &mesh_part)
Assembles a VectorMirror from a space and a mesh-part.
std::uint64_t Index
Index data type.