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.