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.