9#include <kernel/assembly/asm_traits.hpp>
54 typename CubatureFactory_>
58 const TestSpace_& test_space,
59 const TrialSpace_& trial_space,
60 const CubatureFactory_& cubature_factory,
61 typename Matrix_::DataType alpha =
typename Matrix_::DataType(1))
64 XASSERTM(matrix.rows() == test_space.get_num_dofs(),
"invalid matrix dimensions");
65 XASSERTM(matrix.columns() == trial_space.get_num_dofs(),
"invalid matrix dimensions");
68 typedef Matrix_ MatrixType;
70 typedef Operator_ OperatorType;
72 typedef TestSpace_ TestSpaceType;
74 typedef TrialSpace_ TrialSpaceType;
78 typename MatrixType::DataType,
81 OperatorType::trafo_config,
82 OperatorType::test_config,
83 OperatorType::trial_config> AsmTraits;
86 const typename AsmTraits::TrafoType& trafo = test_space.get_trafo();
89 typename AsmTraits::TrafoEvaluator trafo_eval(trafo);
92 typename AsmTraits::TestEvaluator test_eval(test_space);
93 typename AsmTraits::TrialEvaluator trial_eval(trial_space);
96 typename AsmTraits::TestDofMapping test_dof_mapping(test_space);
97 typename AsmTraits::TrialDofMapping trial_dof_mapping(trial_space);
100 typename OperatorType::template Evaluator<AsmTraits> oper_eval(operat);
103 typename AsmTraits::TrafoEvalData trafo_data;
106 typename AsmTraits::TestEvalData test_data;
107 typename AsmTraits::TrialEvalData trial_data;
110 typedef typename OperatorType::template Evaluator<AsmTraits>::ValueType ValueType;
113 static_assert(std::is_same<ValueType, typename MatrixType::ValueType>::value,
114 "matrix and bilinear operator have different value types!");
117 typename AsmTraits::template TLocalMatrix<ValueType> loc_mat;
120 typename AsmTraits::CubatureRuleType cubature_rule(Cubature::ctor_factory, cubature_factory);
123 typename MatrixType::ScatterAxpy scatter_axpy(matrix);
124 FEAT_APPLICATION_MARKER_START(
"bilin_op_asm_mat2");
126 for(
typename AsmTraits::CellIterator cell(trafo_eval.begin()); cell != trafo_eval.end(); ++cell)
129 trafo_eval.prepare(cell);
132 test_eval.prepare(trafo_eval);
133 trial_eval.prepare(trafo_eval);
136 oper_eval.prepare(trafo_eval);
139 int num_loc_test_dofs = test_eval.get_num_local_dofs();
140 int num_loc_trial_dofs = trial_eval.get_num_local_dofs();
146 for(
int k(0); k < cubature_rule.get_num_points(); ++k)
149 trafo_eval(trafo_data, cubature_rule.get_point(k));
152 test_eval(test_data, trafo_data);
153 trial_eval(trial_data, trafo_data);
156 oper_eval.set_point(trafo_data);
159 for(
int i(0); i < num_loc_test_dofs; ++i)
162 for(
int j(0); j < num_loc_trial_dofs; ++j)
165 Tiny::axpy(loc_mat(i,j), oper_eval.eval(trial_data.phi[j], test_data.phi[i]),
166 trafo_data.jac_det * cubature_rule.get_weight(k));
173 FEAT_APPLICATION_MARKER_STOP(
"bilin_op_asm_mat2");
184 test_dof_mapping.prepare(cell);
185 trial_dof_mapping.prepare(cell);
188 scatter_axpy(loc_mat, test_dof_mapping, trial_dof_mapping, alpha);
191 trial_dof_mapping.finish();
192 test_dof_mapping.finish();
224 typename CubatureFactory_>
229 const CubatureFactory_& cubature_factory,
230 typename Matrix_::DataType alpha =
typename Matrix_::DataType(1))
233 XASSERTM(matrix.rows() == space.get_num_dofs(),
"invalid matrix dimensions");
234 XASSERTM(matrix.columns() == space.get_num_dofs(),
"invalid matrix dimensions");
237 typedef Matrix_ MatrixType;
239 typedef Operator_ OperatorType;
241 typedef Space_ SpaceType;
245 typename MatrixType::DataType,
247 OperatorType::trafo_config,
248 OperatorType::test_config | OperatorType::trial_config> AsmTraits;
251 const typename AsmTraits::TrafoType& trafo = space.get_trafo();
254 typename AsmTraits::TrafoEvaluator trafo_eval(trafo);
257 typename AsmTraits::SpaceEvaluator space_eval(space);
260 typename AsmTraits::DofMapping dof_mapping(space);
263 typename OperatorType::template Evaluator<AsmTraits> oper_eval(operat);
266 typename AsmTraits::TrafoEvalData trafo_data;
269 typename AsmTraits::SpaceEvalData space_data;
272 typedef typename OperatorType::template Evaluator<AsmTraits>::ValueType ValueType;
275 static_assert(std::is_same<ValueType, typename MatrixType::ValueType>::value,
276 "matrix and bilinear operator have different value types!");
279 typename AsmTraits::template TLocalMatrix<ValueType> loc_mat;
282 typename AsmTraits::CubatureRuleType cubature_rule(Cubature::ctor_factory, cubature_factory);
285 typename MatrixType::ScatterAxpy scatter_axpy(matrix);
286 FEAT_APPLICATION_MARKER_START(
"bilin_op_asm:matrix1");
289 for(
typename AsmTraits::CellIterator cell(trafo_eval.begin()); cell != trafo_eval.end(); ++cell)
292 trafo_eval.prepare(cell);
295 space_eval.prepare(trafo_eval);
298 oper_eval.prepare(trafo_eval);
301 int num_loc_dofs = space_eval.get_num_local_dofs();
307 for(
int k(0); k < cubature_rule.get_num_points(); ++k)
310 trafo_eval(trafo_data, cubature_rule.get_point(k));
313 space_eval(space_data, trafo_data);
316 oper_eval.set_point(trafo_data);
319 for(
int i(0); i < num_loc_dofs; ++i)
322 for(
int j(0); j < num_loc_dofs; ++j)
325 Tiny::axpy(loc_mat(i,j), oper_eval.eval(space_data.phi[j], space_data.phi[i]),
326 trafo_data.jac_det * cubature_rule.get_weight(k));
333 FEAT_APPLICATION_MARKER_STOP(
"bilin_op_asm:matrix1");
342 dof_mapping.prepare(cell);
345 scatter_axpy(loc_mat, dof_mapping, dof_mapping, alpha);
348 dof_mapping.finish();
388 typename CubatureFactory_
392 const Vector_& coeff_vector,
393 const Operator_& operat,
395 const CubatureFactory_& cubature_factory,
396 typename Vector_::DataType alpha =
typename Vector_::DataType(1))
398 XASSERTM(ret.size()==space.get_num_dofs(),
"Return vector size does not match FE space dimension");
399 XASSERTM(coeff_vector.size()==space.get_num_dofs(),
"Coefficient vector size does not match FE space dimension");
403 typedef Vector_ VectorType;
405 typedef Operator_ OperatorType;
407 typedef Space_ SpaceType;
412 typename VectorType::DataType,
414 OperatorType::trafo_config,
415 OperatorType::test_config | OperatorType::trial_config
419 const typename AsmTraits::TrafoType& trafo = space.get_trafo();
422 typename AsmTraits::TrafoEvaluator trafo_eval(trafo);
425 typename AsmTraits::SpaceEvaluator space_eval(space);
428 typename AsmTraits::DofMapping dof_mapping(space);
431 typename OperatorType::template Evaluator<AsmTraits> oper_eval(operat);
434 typename AsmTraits::TrafoEvalData trafo_data;
437 typename AsmTraits::SpaceEvalData space_data;
440 typedef typename VectorType::ValueType ValueType;
443 typename AsmTraits::template TLocalVector<ValueType> loc_coeff, loc_ret;
446 typename AsmTraits::CubatureRuleType cubature_rule(Cubature::ctor_factory, cubature_factory);
449 typename VectorType::ScatterAxpy scatter_axpy(ret);
451 typename VectorType::GatherAxpy gather_axpy(coeff_vector);
452 FEAT_APPLICATION_MARKER_START(
"bilin_op_asm:apply1");
454 for(
typename AsmTraits::CellIterator cell(trafo_eval.begin()); cell != trafo_eval.end(); ++cell)
461 dof_mapping.prepare(cell);
464 trafo_eval.prepare(cell);
467 gather_axpy(loc_coeff, dof_mapping);
470 space_eval.prepare(trafo_eval);
473 oper_eval.prepare(trafo_eval);
476 int num_loc_dofs = space_eval.get_num_local_dofs();
479 for(
int k(0); k < cubature_rule.get_num_points(); ++k)
482 trafo_eval(trafo_data, cubature_rule.get_point(k));
485 space_eval(space_data, trafo_data);
488 oper_eval.set_point(trafo_data);
491 for(
int i(0); i < num_loc_dofs; ++i)
494 for(
int j(0); j < num_loc_dofs; ++j)
498 oper_eval.eval(space_data.phi[j], space_data.phi[i]) * loc_coeff(j),
499 trafo_data.jac_det * cubature_rule.get_weight(k));
506 FEAT_APPLICATION_MARKER_STOP(
"bilin_op_asm:apply1");
515 scatter_axpy(loc_ret, dof_mapping, alpha);
518 dof_mapping.finish();
561 typename TrialSpace_,
562 typename CubatureFactory_
566 const Vector_& coeff_vector,
567 const Operator_& operat,
568 const TestSpace_& test_space,
569 const TrialSpace_& trial_space,
570 const CubatureFactory_& cubature_factory,
571 typename Vector_::DataType alpha =
typename Vector_::DataType(1))
573 XASSERTM(ret.size()==test_space.get_num_dofs(),
"Return vector size does not match FE space dimension");
574 XASSERTM(coeff_vector.size()==trial_space.get_num_dofs(),
"Coefficient vector size does not match FE space dimension");
578 typedef Vector_ VectorType;
580 typedef Operator_ OperatorType;
582 typedef TestSpace_ TestSpaceType;
584 typedef TrialSpace_ TrialSpaceType;
589 typename VectorType::DataType,
592 OperatorType::trafo_config,
593 OperatorType::test_config,
594 OperatorType::trial_config
598 const typename AsmTraits::TrafoType& trafo = test_space.get_trafo();
601 typename AsmTraits::TrafoEvaluator trafo_eval(trafo);
604 typename AsmTraits::TestEvaluator test_eval(test_space);
605 typename AsmTraits::TrialEvaluator trial_eval(trial_space);
608 typename AsmTraits::TestDofMapping test_dof_mapping(test_space);
609 typename AsmTraits::TrialDofMapping trial_dof_mapping(trial_space);
612 typename OperatorType::template Evaluator<AsmTraits> oper_eval(operat);
615 typename AsmTraits::TrafoEvalData trafo_data;
618 typename AsmTraits::TestEvalData test_data;
619 typename AsmTraits::TrialEvalData trial_data;
622 typedef typename VectorType::ValueType ValueType;
625 typename AsmTraits::template TLocalTrialVector<ValueType> loc_coeff;
626 typename AsmTraits::template TLocalTestVector<ValueType> loc_ret;
629 typename AsmTraits::CubatureRuleType cubature_rule(Cubature::ctor_factory, cubature_factory);
632 typename VectorType::ScatterAxpy scatter_axpy(ret);
634 typename VectorType::GatherAxpy gather_axpy(coeff_vector);
636 FEAT_APPLICATION_MARKER_START(
"bilin_op_asm:apply2");
638 for(
typename AsmTraits::CellIterator cell(trafo_eval.begin()); cell != trafo_eval.end(); ++cell)
645 test_dof_mapping.prepare(cell);
646 trial_dof_mapping.prepare(cell);
649 trafo_eval.prepare(cell);
651 test_eval.prepare(trafo_eval);
652 trial_eval.prepare(trafo_eval);
655 gather_axpy(loc_coeff, trial_dof_mapping);
658 oper_eval.prepare(trafo_eval);
661 int num_loc_test_dofs = test_eval.get_num_local_dofs();
662 int num_loc_trial_dofs = trial_eval.get_num_local_dofs();
665 for(
int k(0); k < cubature_rule.get_num_points(); ++k)
668 trafo_eval(trafo_data, cubature_rule.get_point(k));
671 test_eval(test_data, trafo_data);
672 trial_eval(trial_data, trafo_data);
675 oper_eval.set_point(trafo_data);
678 for(
int i(0); i < num_loc_test_dofs; ++i)
681 for(
int j(0); j < num_loc_trial_dofs; ++j)
685 oper_eval.eval(trial_data.phi[j], test_data.phi[i]) * loc_coeff(j),
686 trafo_data.jac_det * cubature_rule.get_weight(k));
693 FEAT_KERNEL_MARKER_STOP(
"bilin_op_asm:apply2");
704 scatter_axpy(loc_ret, test_dof_mapping, alpha);
707 test_dof_mapping.finish();
708 trial_dof_mapping.finish();
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Common single-space assembly traits class template.
Common test-/trial-space assembly traits class template.
Bilinear Operator Assembler class template.
static void assemble_matrix2(Matrix_ &matrix, Operator_ &operat, const TestSpace_ &test_space, const TrialSpace_ &trial_space, const CubatureFactory_ &cubature_factory, typename Matrix_::DataType alpha=typename Matrix_::DataType(1))
Assembles a bilinear operator into a matrix.
static void apply2(Vector_ &ret, const Vector_ &coeff_vector, const Operator_ &operat, const TestSpace_ &test_space, const TrialSpace_ &trial_space, const CubatureFactory_ &cubature_factory, typename Vector_::DataType alpha=typename Vector_::DataType(1))
Applies the bilinear operator to an FE function.
static void apply1(Vector_ &ret, const Vector_ &coeff_vector, const Operator_ &operat, const Space_ &space, const CubatureFactory_ &cubature_factory, typename Vector_::DataType alpha=typename Vector_::DataType(1))
Applies the bilinear operator to an FE function.
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.
CUDA_HOST_DEVICE void axpy(T_ &y, const T_ &x, const T_ &alpha)
Performs an AXPY of two scalars.