FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
scalar_basic.hpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#pragma once
7
9#include <kernel/util/dist.hpp>
10#include <kernel/cubature/dynamic_factory.hpp>
11#include <kernel/lafem/dense_vector.hpp>
12#include <kernel/lafem/sparse_matrix_csr.hpp>
13#include <kernel/lafem/unit_filter.hpp>
14#include <kernel/lafem/mean_filter.hpp>
15#include <kernel/lafem/none_filter.hpp>
16#include <kernel/lafem/filter_chain.hpp>
17#include <kernel/lafem/filter_sequence.hpp>
18#include <kernel/lafem/vector_mirror.hpp>
19#include <kernel/lafem/transfer.hpp>
20#include <kernel/global/gate.hpp>
21#include <kernel/global/muxer.hpp>
22#include <kernel/global/vector.hpp>
23#include <kernel/global/matrix.hpp>
24#include <kernel/global/transfer.hpp>
25#include <kernel/global/splitter.hpp>
26#include <kernel/global/filter.hpp>
27#include <kernel/global/mean_filter.hpp>
28#include <kernel/assembly/common_operators.hpp>
29#include <kernel/assembly/symbolic_assembler.hpp>
30#include <kernel/assembly/domain_assembler_basic_jobs.hpp>
31#include <kernel/assembly/bilinear_operator_assembler.hpp>
32#include <kernel/assembly/grid_transfer.hpp>
33#include <kernel/assembly/mirror_assembler.hpp>
34#include <kernel/assembly/mean_filter_assembler.hpp>
35#include <kernel/assembly/unit_filter_assembler.hpp>
36#include <kernel/analytic/lambda_function.hpp>
37#include <kernel/solver/base.hpp>
38#include <kernel/solver/iterative.hpp>
39#include <kernel/util/property_map.hpp>
40#include <kernel/voxel_assembly/poisson_assembler.hpp>
41
42#include <control/domain/domain_control.hpp>
43#include <control/asm/gate_asm.hpp>
44#include <control/asm/muxer_asm.hpp>
45#include <control/asm/splitter_asm.hpp>
46#include <control/asm/transfer_asm.hpp>
47#include <control/asm/transfer_voxel_asm.hpp>
48#include <control/asm/mean_filter_asm.hpp>
49#include <control/asm/unit_filter_asm.hpp>
50
51#include <deque>
52
53namespace FEAT
54{
55 namespace Control
56 {
57 template<
58 typename DataType_ = Real,
59 typename IndexType_ = Index,
60 typename ScalarMatrix_ = LAFEM::SparseMatrixCSR<DataType_, IndexType_>,
61 typename TransferMatrix_ = LAFEM::SparseMatrixCSR<DataType_, IndexType_> >
63 {
64 public:
65 static_assert(std::is_same<DataType_, typename ScalarMatrix_::DataType>::value, "DataType mismatch!");
66 static_assert(std::is_same<IndexType_, typename ScalarMatrix_::IndexType>::value, "IndexType mismatch!");
67
68 // basic types
69 typedef DataType_ DataType;
70 typedef IndexType_ IndexType;
71
73 typedef ScalarMatrix_ LocalScalarMatrix;
74
76 typedef ScalarMatrix_ LocalSystemMatrix;
77
79 typedef TransferMatrix_ LocalSystemTransferMatrix;
80
82 typedef typename LocalSystemMatrix::VectorTypeR LocalSystemVector;
83
86
89
92
95
98
101
104
107
108 /* ***************************************************************************************** */
109
112
115
118
121
124
129 {
130 }
131
132 // no copies, no problems
134 ScalarBasicSystemLevel& operator=(const ScalarBasicSystemLevel&) = delete;
135
137 {
138 }
139
141 std::size_t bytes() const
142 {
143 return this->gate_sys.bytes() + this->coarse_muxer_sys.bytes() + this->base_splitter_sys.bytes()
144 + this->transfer_sys.bytes() + this->matrix_sys.local().bytes();
145 }
146
147 template<typename D_, typename I_, typename SM_>
148 void convert(const ScalarBasicSystemLevel<D_, I_, SM_> & other)
149 {
150 gate_sys.convert(other.gate_sys);
151 coarse_muxer_sys.convert(other.coarse_muxer_sys);
152 base_splitter_sys.convert(other.base_splitter_sys);
153 matrix_sys.convert(&gate_sys, &gate_sys, other.matrix_sys);
154 transfer_sys.convert(&coarse_muxer_sys, other.transfer_sys);
155 }
156
157 template<typename DomainLevel_, typename SpaceType_>
158 void assemble_gate(const Domain::VirtualLevel<DomainLevel_>& virt_dom_lvl, const SpaceType_& space)
159 {
160 Asm::asm_gate(virt_dom_lvl, space, this->gate_sys, true);
161 }
162
163 template<typename DomainLevel_>
164 void assemble_gate(const Domain::VirtualLevel<DomainLevel_>& virt_dom_lvl)
165 {
166 Asm::asm_gate(virt_dom_lvl, virt_dom_lvl->space, this->gate_sys, true);
167 }
168
169 template<typename DomainLevel_>
170 void assemble_coarse_muxer(const Domain::VirtualLevel<DomainLevel_>& virt_lvl_coarse)
171 {
172 Asm::asm_muxer(virt_lvl_coarse, [](const DomainLevel_& dl){return &dl.space;}, this->coarse_muxer_sys);
173 }
174
175 template<typename DomainLevel_>
176 void assemble_base_splitter(const Domain::VirtualLevel<DomainLevel_>& virt_lvl)
177 {
178 Asm::asm_splitter(virt_lvl, [](const DomainLevel_& dl){return &dl.space;}, this->base_splitter_sys);
179 }
180
181 template<typename DomainLevel_>
182 void assemble_transfer(
183 const ScalarBasicSystemLevel& sys_lvl_coarse,
184 const Domain::VirtualLevel<DomainLevel_>& virt_lvl_fine,
185 const Domain::VirtualLevel<DomainLevel_>& virt_lvl_coarse,
186 const String& cubature, bool trunc = false, bool shrink = true)
187 {
188 Asm::asm_transfer_scalar(virt_lvl_fine, virt_lvl_coarse, cubature, trunc, shrink,
189 [](const DomainLevel_& dl) {return &dl.space;},
190 this->transfer_sys.local(), this->coarse_muxer_sys, this->gate_sys, sys_lvl_coarse.gate_sys);
191
192 this->transfer_sys.compile();
193 }
194
195 template<typename DomainLevel_>
196 void assemble_transfer(
197 const Domain::VirtualLevel<DomainLevel_>& virt_lvl_fine,
198 const Domain::VirtualLevel<DomainLevel_>& virt_lvl_coarse,
199 const String& cubature, bool trunc = false, bool shrink = true)
200 {
201 // if the coarse level is a parent, then we need the coarse system level
202 XASSERT(!virt_lvl_coarse.is_parent());
203
204 Asm::asm_transfer_scalar(virt_lvl_fine, virt_lvl_coarse, cubature, trunc, shrink,
205 [](const DomainLevel_& dl) {return &dl.space;},
206 this->transfer_sys.local(), this->coarse_muxer_sys, this->gate_sys, this->gate_sys);
207
208 this->transfer_sys.compile();
209 }
210
211 template<typename DomainLevel_>
212 void assemble_transfer_voxel(
213 const ScalarBasicSystemLevel& sys_lvl_coarse,
214 const Domain::VirtualLevel<Domain::VoxelDomainLevelWrapper<DomainLevel_>>& virt_lvl_fine,
215 const Domain::VirtualLevel<Domain::VoxelDomainLevelWrapper<DomainLevel_>>& virt_lvl_coarse,
216 const String& cubature, bool trunc = false, bool shrink = true)
217 {
218 Asm::asm_transfer_voxel_scalar(virt_lvl_fine, virt_lvl_coarse, cubature, trunc, shrink,
219 [](const DomainLevel_& dl) {return &dl.space;},
220 this->transfer_sys.local(), this->coarse_muxer_sys, this->gate_sys, sys_lvl_coarse.gate_sys);
221
222 this->transfer_sys.compile();
223 }
224
225 template<typename DomainLevel_>
226 void assemble_transfer_voxel(
227 const Domain::VirtualLevel<Domain::VoxelDomainLevelWrapper<DomainLevel_>>& virt_lvl_fine,
228 const Domain::VirtualLevel<Domain::VoxelDomainLevelWrapper<DomainLevel_>>& virt_lvl_coarse,
229 const String& cubature, bool trunc = false, bool shrink = true)
230 {
231 // if the coarse level is a parent, then we need the coarse system level
232 XASSERT(!virt_lvl_coarse.is_parent());
233
234 Asm::asm_transfer_voxel_scalar(virt_lvl_fine, virt_lvl_coarse, cubature, trunc, shrink,
235 [](const DomainLevel_& dl) {return &dl.space;},
236 this->transfer_sys.local(), this->coarse_muxer_sys, this->gate_sys, this->gate_sys);
237
238 this->transfer_sys.compile();
239 }
240
241 template<typename Space_, typename Cubature_>
242 void assemble_laplace_matrix(const Space_& space, const Cubature_& cubature, const DataType nu = DataType(1))
243 {
244 // get local matrix
245 auto& loc_matrix = this->matrix_sys.local();
246
247 // assemble structure?
248 if(loc_matrix.empty())
249 {
251 }
252
253 // format and assemble Laplace
254 loc_matrix.format();
255 Assembly::Common::LaplaceOperator laplace_op;
256 Assembly::BilinearOperatorAssembler::assemble_matrix1(loc_matrix, laplace_op, space, cubature, nu);
257 }
258
259 template<typename Trafo_, typename Space_>
260 void assemble_laplace_matrix(Assembly::DomainAssembler<Trafo_>& dom_asm, const Space_& space, const String& cubature, const DataType nu = DataType(1))
261 {
262 // get local matrix
263 auto& loc_matrix = this->matrix_sys.local();
264
265 // assemble structure?
266 if(loc_matrix.empty())
267 {
269 }
270
271 // format and assemble Laplace
272 loc_matrix.format();
273 Assembly::Common::LaplaceOperator laplace_op;
274 Assembly::assemble_bilinear_operator_matrix_1(dom_asm, loc_matrix, laplace_op, space, cubature, nu);
275 }
276
277 template<typename Space_>
278 void assemble_laplace_voxel_based(const Adjacency::Coloring& coloring, const Space_& space, const String& cubature, const DataType nu = DataType(1))
279 {
280 // get local matrix
281 auto& loc_matrix = this->matrix_sys.local();
282
283 // assemble structure?
284 if(loc_matrix.empty())
285 {
287 }
288
289 // format and assemble Laplace
290 loc_matrix.format();
291 VoxelAssembly::VoxelPoissonAssembler<Space_, DataType, IndexType> voxel_assembler(space, coloring);
292 voxel_assembler.assemble_matrix1(loc_matrix, space, Cubature::DynamicFactory(cubature), nu);
293 }
294
295 template<typename Space_>
296 void symbolic_assembly_std1(const Space_& space)
297 {
298 // get local matrix
299 auto& loc_matrix = this->matrix_sys.local();
300
301 ASSERTM(loc_matrix.empty(), "Called symbolic assembly on non empty matrix");
302 // assemble structure?
304
305 }
306 }; // class ScalarBasicSystemLevel<...>
307
308 template<
309 typename DataType_ = Real,
310 typename IndexType_ = Index,
311 typename ScalarMatrix_ = LAFEM::SparseMatrixCSR<DataType_, IndexType_> >
313 public ScalarBasicSystemLevel<DataType_, IndexType_, ScalarMatrix_>
314 {
315 public:
317
318 // basic types
319 typedef DataType_ DataType;
320 typedef IndexType_ IndexType;
321
324
327
330
332 template <typename DT2_, typename IT2_, typename ScalarMatrix2_>
334
337
340 BaseClass()
341 {
342 }
343
345 std::size_t bytes() const
346 {
347 return BaseClass::bytes() + this->filter_sys.local().bytes();
348 }
349
357 template<typename D_, typename I_, typename SM_>
359 {
360 BaseClass::convert(other);
361 filter_sys.convert(other.filter_sys);
362 }
363
364 template<typename DomainLevel_, typename Space_>
365 void assemble_homogeneous_unit_filter(const DomainLevel_& dom_level, const Space_& space)
366 {
367 Asm::asm_unit_filter_scalar_homogeneous(this->filter_sys.local(), dom_level, space, "*");
368 }
369
370 }; // class ScalarUnitFilterSystemLevel<...>
371
372 template<
373 typename DataType_ = Real,
374 typename IndexType_ = Index,
375 typename ScalarMatrix_ = LAFEM::SparseMatrixCSR<DataType_, IndexType_> >
377 public ScalarBasicSystemLevel<DataType_, IndexType_, ScalarMatrix_>
378 {
379 public:
381
382 // basic types
383 typedef DataType_ DataType;
384 typedef IndexType_ IndexType;
385
388
391
394
396 template <typename DT2_, typename IT2_, typename ScalarMatrix2_>
398
401
404 BaseClass()
405 {
406 }
407
409 std::size_t bytes() const
410 {
411 return BaseClass::bytes() + this->filter_sys.local().bytes();
412 }
413
421 template<typename D_, typename I_, typename SM_>
423 {
424 BaseClass::convert(other);
425 filter_sys.convert(other.filter_sys);
426 }
427
428 template<typename Space_, typename Cubature_>
429 void assemble_mean_filter(const Space_& space, const Cubature_& cubature)
430 {
431 this->filter_sys.local() = Asm::asm_mean_filter(this->gate_sys, space, cubature);
432 }
433 }; // class ScalarMeanFilterSystemLevel<...>
434
435 template<
436 typename DataType_ = Real,
437 typename IndexType_ = Index,
438 typename ScalarMatrix_ = LAFEM::SparseMatrixCSR<DataType_, IndexType_> >
440 public ScalarBasicSystemLevel<DataType_, IndexType_, ScalarMatrix_>
441 {
442 public:
444
445 // basic types
446 typedef DataType_ DataType;
447 typedef IndexType_ IndexType;
448
451
457
460
462 template <typename DT2_, typename IT2_, typename ScalarMatrix2_>
464
467
470 BaseClass()
471 {
472 }
473
475 std::size_t bytes() const
476 {
477 return BaseClass::bytes() + this->filter_sys.local().bytes();
478 }
479
480 template<typename D_, typename I_, typename SM_>
481 void convert(const ScalarMeanFilterSystemLevel<D_, I_, SM_> & other)
482 {
483 BaseClass::convert(other);
484 filter_sys.convert(other.filter_sys);
485 }
486
487 LocalUnitFilterSeq& get_local_unit_filter_seq()
488 {
489 return this->filter_sys.local().template at<0>();
490 }
491
492 LocalUnitFilter& get_local_unit_filter(const String& name)
493 {
494 return get_local_unit_filter_seq().find_or_add(name);
495 }
496
497 LocalMeanFilter& get_local_mean_filter()
498 {
499 return this->filter_sys.local().template at<1>();
500 }
501
502 template<typename DomainLevel_, typename Space_>
503 void assemble_unit_filter(const DomainLevel_& dom_level, const Space_& space, const String& name, const String& mesh_part_names)
504 {
505 auto& loc_filter = get_local_unit_filter(name);
506 loc_filter.clear();
507 Asm::asm_unit_filter_scalar_homogeneous(loc_filter, dom_level, space, mesh_part_names);
508 }
509
510 template<typename DomainLevel_, typename Space_, typename Function_>
511 void assemble_unit_filter(const DomainLevel_& dom_level, const Space_& space, const String& name, const String& mesh_part_names, const Function_& function)
512 {
513 auto& loc_filter = get_local_unit_filter(name);
514 loc_filter.clear();
515 Asm::asm_unit_filter_scalar(loc_filter, dom_level, space, mesh_part_names, function);
516 }
517
518 template<typename Space_>
519 void assemble_mean_filter(const Space_& space, const String& cubature)
520 {
521 get_local_mean_filter() = Asm::asm_mean_filter(this->gate_sys, space, cubature);
522 }
523 }; // class ScalarCombinedSystemLevel<...>
524 } // namespace Control
525} // namespace FEAT
#define ASSERTM(expr, msg)
Debug-Assertion macro definition with custom message.
Definition: assertion.hpp:230
#define XASSERT(expr)
Assertion macro definition.
Definition: assertion.hpp:262
FEAT Kernel base header.
static void assemble_matrix1(Matrix_ &matrix, Operator_ &operat, const Space_ &space, const CubatureFactory_ &cubature_factory, typename Matrix_::DataType alpha=typename Matrix_::DataType(1))
Assembles a bilinear operator into a matrix.
static void assemble_matrix_std1(MatrixType_ &matrix, const Space_ &space)
Assembles a standard matrix structure from a single space.
Global::Muxer< LocalSystemVector, SystemMirror > SystemMuxer
define system muxer
LocalSystemMatrix::VectorTypeR LocalSystemVector
define local system vector type
LAFEM::Transfer< LocalSystemTransferMatrix > LocalSystemTransfer
define local system transfer operator type
SystemGate gate_sys
our system gate
Global::Transfer< LocalSystemTransfer, SystemMirror > GlobalSystemTransfer
define global system transfer operator type
std::size_t bytes() const
Returns the total amount of bytes allocated.
SystemSplitter base_splitter_sys
our base-mesh multiplexer
ScalarMatrix_ LocalScalarMatrix
define local scalar matrix type
LAFEM::VectorMirror< DataType, IndexType > SystemMirror
define system mirror type
TransferMatrix_ LocalSystemTransferMatrix
define local transfer matrix type
GlobalSystemTransfer transfer_sys
our global transfer operator
SystemMuxer coarse_muxer_sys
our coarse-level system muxer
Global::Matrix< LocalSystemMatrix, SystemMirror, SystemMirror > GlobalSystemMatrix
define global system matrix type
Global::Vector< LocalSystemVector, SystemMirror > GlobalSystemVector
define global system vector type
Global::Gate< LocalSystemVector, SystemMirror > SystemGate
define system gate
Global::Splitter< LocalSystemVector, SystemMirror > SystemSplitter
define system splitter
GlobalSystemMatrix matrix_sys
our global system matrix
ScalarMatrix_ LocalSystemMatrix
define local system matrix type
Global::Filter< LocalSystemFilter, SystemMirror > GlobalSystemFilter
define global filter types
LAFEM::VectorMirror< DataType, IndexType > SystemMirror
define system mirror type
std::size_t bytes() const
Returns the total amount of bytes allocated.
GlobalSystemFilter filter_sys
our global system filter
LAFEM::UnitFilter< DataType, IndexType > LocalUnitFilter
define local filter types
GlobalSystemFilter filter_sys
our global system filter
Global::Filter< LocalSystemFilter, SystemMirror > GlobalSystemFilter
define global filter type
Global::MeanFilter< DataType_, IndexType_ > LocalSystemFilter
define local filter type
std::size_t bytes() const
Returns the total amount of bytes allocated.
void convert(const ScalarMeanFilterSystemLevel< D_, I_, SM_ > &other)
Conversion method.
LAFEM::VectorMirror< DataType, IndexType > SystemMirror
define system mirror type
LAFEM::VectorMirror< DataType, IndexType > SystemMirror
define system mirror type
Global::Filter< LocalSystemFilter, SystemMirror > GlobalSystemFilter
define global filter type
std::size_t bytes() const
Returns the total amount of bytes allocated.
LAFEM::UnitFilter< DataType_, IndexType_ > LocalSystemFilter
define local filter type
GlobalSystemFilter filter_sys
our global system filter
void convert(const ScalarUnitFilterSystemLevel< D_, I_, SM_ > &other)
Conversion method.
Global Filter wrapper class template.
Definition: filter.hpp:21
Global gate implementation.
Definition: gate.hpp:51
void convert(const Gate< LVT2_, MT2_ > &other)
Conversion function for same vector container type but with different MDI-Type.
Definition: gate.hpp:191
std::size_t bytes() const
Returns the total amount of bytes allocated.
Definition: gate.hpp:252
Global Matrix wrapper class template.
Definition: matrix.hpp:40
LocalMatrix_ & local()
Returns a reference to the internal local LAFEM matrix object.
Definition: matrix.hpp:126
Mean Filter class template.
Definition: mean_filter.hpp:23
Global multiplexer/demultiplexer implementation.
Definition: muxer.hpp:68
std::size_t bytes() const
Returns the internal data size in bytes.
Definition: muxer.hpp:211
void convert(const Muxer< LVT2_, MT2_ > &other)
Conversion function for same vector container type but with different MDI-Type.
Definition: muxer.hpp:155
Global base-mesh vector splitter (and joiner) implementation.
Definition: splitter.hpp:59
std::size_t bytes() const
Returns the internal data size in bytes.
Definition: splitter.hpp:163
void convert(const Splitter< LVT2_, MT2_ > &other)
Conversion function for same vector container type but with different MDI-Type.
Definition: splitter.hpp:124
Global grid-transfer operator class template.
Definition: transfer.hpp:23
void convert(MuxerType *coarse_muxer, const Transfer< LocalTransfer2_, Mirror2_ > &other)
container conversion function
Definition: transfer.hpp:107
std::size_t bytes() const
Definition: transfer.hpp:143
LocalTransfer_ & local()
Definition: transfer.hpp:131
Global vector wrapper class template.
Definition: vector.hpp:68
Filter Chainclass template.
std::size_t bytes() const
Returns the total amount of bytes allocated.
Sequence of filters of the same type.
Grid-Transfer operator class template.
Definition: transfer.hpp:27
Unit Filter class template.
Definition: unit_filter.hpp:29
std::size_t bytes() const
Returns the total amount of bytes allocated.
Handles vector prolongation, restriction and serialization.
void assemble_bilinear_operator_matrix_1(DomainAssembler< Trafo_ > &dom_asm, Matrix_ &matrix, const BilOp_ &bilinear_operator, const Space_ &space, const String &cubature, const typename Matrix_::DataType alpha=typename Matrix_::DataType(1))
Assembles a bilinear operator into a matrix with identical test- and trial-spaces.
FEAT namespace.
Definition: adjactor.hpp:12
double Real
Real data type.
std::uint64_t Index
Index data type.