7#include "kernel/adjacency/adjactor.hpp"
8#include "kernel/adjacency/base.hpp"
9#include "kernel/adjacency/graph.hpp"
10#include "kernel/geometry/adaptive_mesh.hpp"
11#include "kernel/geometry/adaptive_mesh_layer.hpp"
13#include <kernel/lafem/dense_vector.hpp>
14#include <kernel/lafem/dense_vector_blocked.hpp>
15#include <kernel/lafem/vector_mirror.hpp>
16#include <kernel/global/gate.hpp>
17#include <kernel/global/transfer.hpp>
18#include <kernel/assembly/symbolic_assembler.hpp>
19#include <kernel/assembly/grid_transfer.hpp>
21namespace FEAT::Control::Asm
61 template<
typename DomainLevel_,
typename SpaceLambda_,
typename Transfer_,
typename Muxer_,
typename Gate_>
62 void asm_transfer_adaptive_scalar(
63 const Domain::VirtualLevel<DomainLevel_>& virt_lvl_f,
64 const Domain::VirtualLevel<DomainLevel_>& virt_lvl_c,
65 const String& cubature,
bool trunc,
bool shrink,
66 SpaceLambda_&& space_lambda, Transfer_& transfer,
const Muxer_& muxer,
const Gate_& gate_f,
const Gate_& gate_c)
68 using DataType =
typename Transfer_::DataType;
69 using IndexType =
typename Transfer_::IndexType;
70 using ScalarVectorType = LAFEM::DenseVector<DataType, IndexType>;
73 const DomainLevel_& level_f = *virt_lvl_f;
74 const DomainLevel_& level_c = virt_lvl_c.is_child() ? virt_lvl_c.level_c() : *virt_lvl_c;
77 const auto& space_f = *space_lambda(level_f);
78 const auto& space_c = *space_lambda(level_c);
81 auto& loc_prol = transfer.get_mat_prol();
82 auto& loc_rest = transfer.get_mat_rest();
83 auto& loc_trunc = transfer.get_mat_trunc();
88 if(level_c.mesh_layer && level_f.mesh_layer)
91 Geometry::AdaptiveChildMapping<typename DomainLevel_::AdaptiveMeshLayerType> c2f_mapping(*level_c.mesh_layer, *level_f.mesh_layer);
94 else if(!level_c.mesh_layer && level_f.mesh_layer)
97 Geometry::FoundationAdaptiveAdjactor<typename DomainLevel_::AdaptiveMeshType> foundation_to_adaptive(level_f.mesh_layer->adaptive_mesh());
98 typename DomainLevel_::AdaptiveMeshLayerType layer_zero(level_f.mesh_layer->adaptive_mesh_ptr(),
Geometry::Layer{0});
99 Geometry::AdaptiveChildMapping<typename DomainLevel_::AdaptiveMeshLayerType> zero_to_one(layer_zero, *level_f.mesh_layer);
101 Adjacency::CompositeAdjactor adj(foundation_to_adaptive, zero_to_one);
115 auto loc_vec_weight_p = loc_prol.create_vector_l();
116 auto loc_vec_weight_t = loc_prol.create_vector_r();
120 loc_vec_weight_p.format();
121 loc_vec_weight_t.format();
125 loc_trunc.transpose(loc_prol);
128 if(level_c.mesh_layer && level_f.mesh_layer)
131 Geometry::AdaptiveChildMapping<typename DomainLevel_::AdaptiveMeshLayerType> c2f_mapping(*level_c.mesh_layer, *level_f.mesh_layer);
141 else if(!level_c.mesh_layer && level_f.mesh_layer)
144 Geometry::FoundationAdaptiveAdjactor<typename DomainLevel_::AdaptiveMeshType> foundation_to_adaptive(level_f.mesh_layer->adaptive_mesh());
145 typename DomainLevel_::AdaptiveMeshLayerType layer_zero(level_f.mesh_layer->adaptive_mesh_ptr(),
Geometry::Layer{0});
146 Geometry::AdaptiveChildMapping<typename DomainLevel_::AdaptiveMeshLayerType> zero_to_one(layer_zero, *level_f.mesh_layer);
148 Adjacency::CompositeAdjactor adj(foundation_to_adaptive, zero_to_one);
165 gate_f.sync_0(loc_vec_weight_p);
168 loc_vec_weight_p.component_invert(loc_vec_weight_p);
171 loc_prol.scale_rows(loc_prol, loc_vec_weight_p);
175 loc_prol.shrink(DataType(1E-3) * loc_prol.max_abs_element());
178 loc_rest = loc_prol.transpose();
190 if(!virt_lvl_c.is_child())
194 gate_c.sync_0(loc_vec_weight_t);
196 else if(virt_lvl_c.is_parent())
205 ScalarVectorType loc_tmp(gate_c.get_freqs().size());
208 muxer.join(loc_vec_weight_t, loc_tmp);
211 gate_c.sync_0(loc_tmp);
214 muxer.split(loc_vec_weight_t, loc_tmp);
222 muxer.join_send(loc_vec_weight_t);
226 muxer.split_recv(loc_vec_weight_t);
230 loc_vec_weight_t.component_invert(loc_vec_weight_t);
233 loc_trunc.scale_rows(loc_trunc, loc_vec_weight_t);
237 loc_trunc.shrink(DataType(1E-3) * loc_trunc.max_abs_element());
#define XASSERT(expr)
Assertion macro definition.
static int assemble_intermesh_transfer(Matrix_ &matrix, Vector_ &vector, const TargetSpace_ &space_target, const SourceSpace_ &space_source, const Target2SourceAdjactor_ &trg2src, const String &cubature_name)
Assembles a generic inter-mesh transfer matrix and its corresponding weight vector.
static void assemble_truncation(Matrix_ &matrix, Vector_ &vector, const FineSpace_ &fine_space, const CoarseSpace_ &coarse_space, const String &cubature_name)
Assembles a truncation matrix and its corresponding weight vector.
static void assemble_prolongation(Matrix_ &matrix, Vector_ &vector, const FineSpace_ &fine_space, const CoarseSpace_ &coarse_space, const String &cubature_name)
Assembles a prolongation matrix and its corresponding weight vector.
static void assemble_matrix_intermesh(MatrixType_ &matrix, const TestSpace_ &test_space, const TrialSpace_ &trial_space, const Trial2TestAdjactor_ &trial2test_adjactor)
Assembles a matrix structure from a test-trial-mesh pair defined on different meshes.
static void assemble_matrix_2lvl(MatrixType_ &matrix, const FineSpace_ &fine_space, const CoarseSpace_ &coarse_space)
Assembles a 2-level matrix structure from a fine-coarse-space pair.
@ transpose
Render-Transpose mode.
Intern::Layer Layer
Re-export of layer type.