495 {
497 const int nb_integration_pts = getGaussPts().size2();
498 const double area = getMeasure();
499 auto t_w = getFTensor0IntegrationWeight();
503 auto t_coords = getFTensor1CoordsAtGaussPts();
506
507 double error_l2 = 0;
508 double error_h1 = 0;
509 double error_ind = 0;
510 for (int gg = 0; gg != nb_integration_pts; ++gg) {
511 const double alpha = t_w * area;
512
514 t_coords(0), t_coords(1), t_coords(2));
515 error_l2 += alpha *
sqr(diff);
516
518 t_coords(0), t_coords(1), t_coords(2));
520 t_diff(
i) = t_val_grad(
i) - t_fun_grad(
i);
521 error_h1 += alpha * t_diff(
i) * t_diff(
i);
522
523 t_diff(
i) = t_val_grad(
i) - t_flux(
i);
524 error_ind += alpha * t_diff(
i) * t_diff(
i);
525
526 ++t_w;
527 ++t_val;
528 ++t_val_grad;
529 ++t_flux;
530 ++t_coords;
531 }
532
534 Tag th_error_l2, th_error_h1, th_error_ind;
536 th_error_l2);
538 th_error_h1);
540 th_error_ind);
541
542 double error_l2_norm = sqrt(error_l2);
543 double error_h1_seminorm = sqrt(error_h1);
544 double error_ind_local = sqrt(error_ind);
547 &error_h1_seminorm);
549 &error_ind_local);
550
553
555 constexpr std::array<int, CommonData::LAST_ELEMENT> indices = {
558 std::array<double, CommonData::LAST_ELEMENT> values;
559 values[0] = error_l2;
560 values[1] = error_h1;
561 values[2] = error_ind;
563 indices.data(), values.data(), ADD_VALUES);
565}
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Tensor1< FTensor::PackPtr< T *, S >, Tensor_Dim > getFTensor1FromMat(ublas::matrix< T, L, A > &data)
Get tensor rank 1 (vector) form data matrix.
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
MoFEMErrorCode VecSetValues(Vec V, const EntitiesFieldData::EntData &data, const double *ptr, InsertMode iora)
Assemble PETSc vector.
auto getFTensor1FromArray(VectorDouble &data)
Get FTensor1 from array.
static VectorDouble analyticalFunctionGrad(const double x, const double y, const double z)
[Analytical function]
static double analyticalFunction(const double x, const double y, const double z)
[Analytical function]
static MoFEMErrorCode getTagHandle(MoFEM::Interface &m_field, const char *name, DataType type, Tag &tag_handle)
[Source function]
virtual moab::Interface & get_moab()=0