11#include <kernel/util/dist.hpp> 
   12#include <kernel/geometry/mesh_node.hpp> 
   13#include <kernel/assembly/unit_filter_assembler.hpp> 
   14#include <kernel/lafem/dense_vector.hpp> 
   15#include <kernel/lafem/dense_vector_blocked.hpp> 
   16#include <kernel/lafem/sparse_matrix_csr.hpp> 
   17#include <kernel/lafem/sparse_matrix_bcsr.hpp> 
   18#include <kernel/lafem/unit_filter.hpp> 
   19#include <kernel/lafem/unit_filter_blocked.hpp> 
   20#include <kernel/global/matrix.hpp> 
   61    template<
typename MeshType_>
 
   68      static constexpr int shape_dim = MeshType::shape_dim;
 
  196        const std::size_t num_halos = halo_map.size();
 
  198        static constexpr std::size_t dim1(
shape_dim + 1);
 
  201        std::vector<std::array<std::vector<int>, dim1>> send_bufs, recv_bufs;
 
  202        send_bufs.resize(num_halos);
 
  203        recv_bufs.resize(num_halos);
 
  207        send_reqs.
reserve(num_halos*dim1);
 
  208        recv_reqs.
reserve(num_halos*dim1);
 
  211        auto it = halo_map.begin();
 
  212        for(
Index h(0); h < num_halos; ++h, ++it)
 
  215          for(std::size_t d(0); d < dim1; ++d)
 
  226            send_bufs[h][d].resize(n);
 
  227            recv_bufs[h][d].resize(n);
 
  228            int* sbuf = send_bufs[h][d].data();
 
  231            recv_reqs.
push_back(comm.
irecv(recv_bufs[h][d].data(), n, it->first));
 
  234            for(
Index i(0); i < n; ++i)
 
  246        it = halo_map.begin();
 
  247        for(
Index h(0); h < num_halos; ++h, ++it)
 
  250          for(std::size_t d(0); d < dim1; ++d)
 
  260            int* rbuf = recv_bufs[h][d].data();
 
  263            for(
Index i(0); i < n; ++i)
 
  286          Index c0(0u), c1(0u);
 
  365      template<
typename DT_, 
typename IT_, 
typename Space_>
 
  367        const DT_ val_outside = DT_(0), 
const DT_ val_inside = DT_(1), 
const DT_ val_intface = DT_(1))
 const 
  378        filter_i.get_filter_vector().format(val_intface);
 
  379        filter_o.get_filter_vector().format(val_inside);
 
  381        vector.
format(val_outside);
 
  395      template<
typename DT_, 
typename IT_, 
typename Space_>
 
  399        this->_unit_asm_inside->assemble(filter, space);
 
  411      template<
typename DT_, 
typename IT_, 
typename Space_, 
int dim_>
 
  415        this->_unit_asm_inside->assemble(filter, space);
 
  439      template<
typename DT_, 
typename IT_, 
typename Space_>
 
  444        this->_unit_asm_interface->assemble(filter, space);
 
  447          filter.get_filter_vector().format(DT_(1));
 
  454          filter.get_filter_vector().format(diag_a.max_abs_element() / diag_m.max_abs_element());
 
  479      template<
typename DT_, 
typename IT_, 
typename Space_, 
int bh_, 
int bw_>
 
  484        this->_unit_asm_interface->assemble(filter, space);
 
  487          filter.get_filter_vector().format(DT_(1));
 
  490          auto diag_a = matrix_a.create_vector_l();
 
  491          auto diag_m = matrix_m.create_vector_l();
 
  494          filter.get_filter_vector().format(diag_a.max_abs_element() / diag_m.max_abs_element());
 
  515      template<
typename DT_, 
typename IT_, 
typename Space_, 
typename Mirror_>
 
  521        this->_unit_asm_interface->assemble(filter, space);
 
  524          filter.get_filter_vector().format(DT_(1));
 
  527          auto diag_a = matrix_a.create_vector_l();
 
  528          auto diag_m = matrix_m.create_vector_l();
 
  529          matrix_a.extract_diag(diag_a, 
true);
 
  530          matrix_m.extract_diag(diag_m, 
true);
 
  531          filter.get_filter_vector().format(diag_a.max_abs_element() / diag_m.max_abs_element());
 
  552      template<
typename DT_, 
typename IT_, 
typename Space_, 
typename Mirror_, 
int bh_, 
int bw_>
 
  558        this->_unit_asm_interface->assemble(filter, space);
 
  561          filter.get_filter_vector().format(DT_(1));
 
  564          auto diag_a = matrix_a.create_vector_l();
 
  565          auto diag_m = matrix_m.create_vector_l();
 
  566          matrix_a.extract_diag(diag_a, 
true);
 
  567          matrix_m.extract_diag(diag_m, 
true);
 
  568          filter.get_filter_vector().format(diag_a.max_abs_element() / diag_m.max_abs_element());
 
  576        std::vector<int>& mask = 
_fbm_masks.at(std::size_t(dim));
 
  578        for(
Index i(0); i < n; ++i)
 
  579          mask.at(target_set[i]) |= 3;
 
  585        const std::vector<int>& mask = 
_fbm_masks.at(std::size_t(dim));
 
  587        for(
Index i(0), k(0); i < mask.size(); ++i)
 
  589          if(mask[i] == mask_value)
 
  598      template<
typename Shape_>
 
  601        XASSERT(Shape_::dimension >= dim);
 
  602        typedef typename Shape::FaceTraits<Shape_, Shape_::dimension - 1>::ShapeType FacetType;
 
  603        if(Shape_::dimension == dim)
 
  604          return tsh.template get_target_set<Shape_::dimension>();
 
  606          return _get_target_set(
static_cast<const Geometry::TargetSetHolder<FacetType>&
>(tsh), dim);
 
  613        return tsh.template get_target_set<0>();
 
  617      template<
typename Shape_>
 
  620        XASSERT(Shape_::dimension >= dim);
 
  621        typedef typename Shape::FaceTraits<Shape_, Shape_::dimension - 1>::ShapeType FacetType;
 
  622        if(Shape_::dimension == dim)
 
  623          return tsh.template get_target_set<Shape_::dimension>();
 
  625          return _get_target_set(
static_cast<Geometry::TargetSetHolder<FacetType>&
>(tsh), dim);
 
  632        return tsh.template get_target_set<0>();
 
  658        for(
Index i(0); i < n; ++i)
 
  661          int bit1 = (shape_mask[i] >> 1) & 1;
 
  662          for(
int j(0); j < m; ++j)
 
  663            bit1 &= (face_mask[faces_at_shape(i,j)] & 1);
 
  664          shape_mask[i] = (shape_mask[i] & 1) | (bit1 << 1);
 
  669      template<
typename Shape_, 
int face_dim_, std::
size_t n_>
 
  670      static void _process_masks(std::array<std::vector<int>, n_>& masks, 
const Geometry::IndexSetWrapper<Shape_, face_dim_>& idx_wrapper)
 
  672        _process_masks(masks, 
static_cast<const Geometry::IndexSetWrapper<Shape_, face_dim_-1
>&>(idx_wrapper));
 
  673        _process_mask(masks.at(Shape_::dimension), masks.at(std::size_t(face_dim_)), idx_wrapper.template get_index_set<face_dim_>());
 
  677      template<
typename Shape_, std::
size_t n_>
 
  678      static void _process_masks(std::array<std::vector<int>, n_>& masks, 
const Geometry::IndexSetWrapper<Shape_, 0>& idx_wrapper)
 
  680        _process_mask(masks.at(Shape_::dimension), masks.front(), idx_wrapper.template get_index_set<0>());
 
  684      template<
typename Shape_, std::
size_t n_>
 
  685      static void _process_shapes(std::array<std::vector<int>, n_>& masks, 
const Geometry::IndexSetHolder<Shape_>& idx_holder)
 
  687        typedef typename Shape::FaceTraits<Shape_, Shape_::dimension-1>::ShapeType FacetType;
 
  688        _process_shapes(masks, 
static_cast<const Geometry::IndexSetHolder<FacetType>&
>(idx_holder));
 
  689        _process_masks(masks, idx_holder.template get_index_set_wrapper<Shape_::dimension>());
 
  693      template<std::
size_t n_>
 
  694      static void _process_shapes(std::array<std::vector<int>, n_>&, 
const Geometry::IndexSetHolder<Shape::Vertex>&)
 
#define XASSERT(expr)
Assertion macro definition.
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Stokes Fictitious Boundary Method assembler class.
virtual ~StokesFBMAssembler()
virtual destructor
const Assembly::UnitFilterAssembler< MeshType > & get_unit_asm_inside() const
Returns a reference to the internal unit-filter assembler inside the FBM region.
static void _process_masks(std::array< std::vector< int >, n_ > &masks, const Geometry::IndexSetWrapper< Shape_, face_dim_ > &idx_wrapper)
auxiliary function: process masks for all face dimensions for a given shape
const std::vector< int > & get_fbm_mask_vector(int dim) const
Returns a reference to an internal FBM mask vector.
void _add_fbm_target_set(const Geometry::TargetSet &target_set, int dim)
auxiliary function: add a target set to the FBM mask vector
static const Geometry::TargetSet & _get_target_set(const Geometry::TargetSetHolder< Shape::Vertex > &tsh, int dim)
auxiliary function: get a target set from a target set holder (recursion end overload)
void assemble_characteristic_vector(LAFEM::DenseVector< DT_, IT_ > &vector, const Space_ &space, const DT_ val_outside=DT_(0), const DT_ val_inside=DT_(1), const DT_ val_intface=DT_(1)) const
Assembles a characteristic vector on the FBM region.
void assemble_interface_filter(LAFEM::UnitFilter< DT_, IT_ > &filter, const Space_ &space, const LAFEM::SparseMatrixCSR< DT_, IT_ > &matrix_a, const LAFEM::SparseMatrixCSR< DT_, IT_ > &matrix_m, bool no_scale=false) const
Assembles a UnitFilter on the FBM interface (non-parallel version)
void assemble_interface_filter(LAFEM::UnitFilterBlocked< DT_, IT_, bh_ > &filter, const Space_ &space, const Global::Matrix< LAFEM::SparseMatrixBCSR< DT_, IT_, bh_, bw_ >, Mirror_, Mirror_ > &matrix_a, const Global::Matrix< LAFEM::SparseMatrixBCSR< DT_, IT_, bh_, bw_ >, Mirror_, Mirror_ > &matrix_m, bool no_scale=false) const
Assembles a UnitFilterBlocked on the FBM interface (parallel version)
std::unique_ptr< Geometry::MeshPart< MeshType > > _fbm_meshpart_interface
the meshpart representing the FBM interface region
std::array< std::vector< int >, shape_dim+1 > _fbm_masks
Array of FBM mask vectors.
static Geometry::TargetSet & _get_target_set(Geometry::TargetSetHolder< Shape::Vertex > &tsh, int dim)
auxiliary function: get a target set from a target set holder (recursion end overload)
static const Geometry::TargetSet & _get_target_set(const Geometry::TargetSetHolder< Shape_ > &tsh, int dim)
auxiliary function: get a target set from a target set holder
bool _compiled
already compiled?
void add_fbm_meshpart(const Geometry::MeshPart< MeshType > &fbm_part)
Adds a FBM mesh-part to the assembler.
StokesFBMAssembler(const MeshType &mesh_)
Constructor.
static void _process_shapes(std::array< std::vector< int >, n_ > &masks, const Geometry::IndexSetHolder< Shape_ > &idx_holder)
auxiliary function: process masks shape dimensions
const Geometry::MeshPart< MeshType > & get_meshpart_inside() const
Returns a reference to the mesh-part representing the FBM inside region.
const Geometry::MeshPart< MeshType > & get_meshpart_interface() const
Returns a reference to the mesh-part representing the FBM interface.
void clear()
Clears the assembler.
void _build_tbm_target_set(Geometry::TargetSet &target_set, int dim, int mask_value)
auxiliary function: build target set from mask vector
static constexpr int shape_dim
our shape dimension
void assemble_interface_filter(LAFEM::UnitFilter< DT_, IT_ > &filter, const Space_ &space, const Global::Matrix< LAFEM::SparseMatrixCSR< DT_, IT_ >, Mirror_, Mirror_ > &matrix_a, const Global::Matrix< LAFEM::SparseMatrixCSR< DT_, IT_ >, Mirror_, Mirror_ > &matrix_m, bool no_scale=false) const
Assembles a UnitFilter on the FBM interface (parallel version)
void assemble_interface_filter(LAFEM::UnitFilterBlocked< DT_, IT_, bh_ > &filter, const Space_ &space, const LAFEM::SparseMatrixBCSR< DT_, IT_, bh_, bw_ > &matrix_a, const LAFEM::SparseMatrixBCSR< DT_, IT_, bh_, bw_ > &matrix_m, bool no_scale=false) const
Assembles a UnitFilterBlocked on the FBM interface (non-parallel version)
static Geometry::TargetSet & _get_target_set(Geometry::TargetSetHolder< Shape_ > &tsh, int dim)
auxiliary function: get a target set from a target set holder
MeshType_ MeshType
our mesh type
static void _process_masks(std::array< std::vector< int >, n_ > &masks, const Geometry::IndexSetWrapper< Shape_, 0 > &idx_wrapper)
auxiliary function: process masks for all face dimensions for a given shape (recursion end)
std::unique_ptr< Assembly::UnitFilterAssembler< MeshType_ > > _unit_asm_inside
unit-filter assembler on inside mesh-part
static void _process_shapes(std::array< std::vector< int >, n_ > &, const Geometry::IndexSetHolder< Shape::Vertex > &)
auxiliary function: process masks shape dimensions (recursion end)
static void _process_mask(std::vector< int > &shape_mask, const std::vector< int > &face_mask, const Geometry::IndexSet< m_ > &faces_at_shape)
Auxiliary function: update bit 1 of the mask vector for a shape based on a bit 0 of its face mask vec...
void compile()
Compiles the assembler.
void sync(const Geometry::RootMeshNode< MeshType > &mesh_node, const Dist::Comm &comm)
Synchronizes the assembler over all processes in a parallel simulation.
std::unique_ptr< Geometry::MeshPart< MeshType > > _fbm_meshpart_inside
the meshpart representing the FBM inside region
const MeshType & _mesh
a reference to our mesh object
std::unique_ptr< Assembly::UnitFilterAssembler< MeshType_ > > _unit_asm_interface
unit-filter assembler on interface mesh-part
void assemble_inside_filter(LAFEM::UnitFilter< DT_, IT_ > &filter, const Space_ &space) const
Assembles a UnitFilter inside the FBM region.
const Assembly::UnitFilterAssembler< MeshType > & get_unit_asm_interface() const
Returns a reference to the internal unit-filter assembler on the FBM interface.
void assemble_inside_filter(LAFEM::UnitFilterBlocked< DT_, IT_, dim_ > &filter, const Space_ &space) const
Assembles a UnitFilterBlocked inside the FBM region.
Unit-Filter assembly class template.
Request irecv(void *buffer, std::size_t count, const Datatype &datatype, int source, int tag=0) const
Nonblocking Receive.
Request isend(const void *buffer, std::size_t count, const Datatype &datatype, int dest, int tag=0) const
Nonblocking Send.
Communication Request vector class.
void push_back(Request &&request)
Inserts a new request at the end of the request vector.
void reserve(std::size_t size_)
Reserves sufficient space for a specified number of requests.
void wait_all()
Blocks until all active requests are fulfilled.
Conformal Index-Set class template.
Index get_index_bound() const
Returns the index bound.
Index get_num_entities() const
Returns the number of entities.
int get_num_indices() const
Returns the number of indices per entity.
Class template for partial meshes.
Root mesh node class template.
const std::map< int, std::unique_ptr< MeshPartType > > & get_halo_map() const
Index get_num_entities() const
Returns the number of entities.
Global Matrix wrapper class template.
bool empty() const
Checks whether the container is empty.
void format(DT_ value=DT_(0))
Reset all elements of the container to a given value or zero if missing.
Dense data vector class template.
CSR based blocked sparse matrix.
void extract_diag(VectorTypeL &diag, DenseVector< IT_, IT_ > &diag_indices) const
extract main diagonal vector from matrix
VectorTypeL create_vector_l() const
Returns a new compatible L-Vector.
void extract_diag(VectorTypeL &diag, DenseVector< IT_, IT_ > &diag_indices) const
extract main diagonal vector from matrix
Unit Filter Blocked class template.
Unit Filter class template.
void filter_sol(DenseVector< DT_, IT_ > &vector) const
Applies the filter onto the solution vector.
std::uint64_t Index
Index data type.
Face traits tag struct template.