423 {
425
426 const auto *fe =
427 dynamic_cast<const FlatPrismElementForcesAndSourcesCore *>(ptrFE);
428 if (!fe)
430 "TIE prism RHS operator is attached to a wrong finite element");
431
432 const auto nb_gauss_pts = getGaussPts().size2();
433 if (!nb_gauss_pts || nb_gauss_pts % 2) {
435 "Expected concatenated [slave|master] TIE Gauss points");
436 }
437 const auto nb_slave_gauss = nb_gauss_pts / 2;
438 if (
dispPtr->size1() != nb_gauss_pts) {
440 "TIE displacement values at Gauss points were not prepared "
441 "before RHS assembly");
442 }
443
446 "Unexpected number of LAMBDA dofs on TIE prism rows");
447
448 auto &row_n = row_data.getN();
449 if (!row_n.size1() || !row_n.size2())
451 if (row_n.size1() != nb_gauss_pts)
453 "Unexpected number of Gauss points on TIE multiplier block");
454
455 const int nb_row_base = nbRows /
SPACE_DIM;
456 if (static_cast<size_t>(nb_row_base) > row_n.size2())
458 "More TIE multiplier bases than shape functions");
461 "Unexpected TIE displacement matrix size: size2=%d expected=%d",
463 if (locF.size() != static_cast<size_t>(nbRows))
465 "Unexpected TIE RHS block size: rowSide=%d rowType=%d nbRows=%d "
466 "locF.size()=%d row_n=(%d,%d) disp=(%d,%d)",
467 rowSide, rowType, nbRows, static_cast<int>(locF.size()),
468 static_cast<int>(row_n.size1()), static_cast<int>(row_n.size2()),
469 static_cast<int>(
dispPtr->size1()),
470 static_cast<int>(
dispPtr->size2()));
471
472 auto t_w = getFTensor0IntegrationWeight();
473 for (size_t gg = 0; gg != nb_slave_gauss; ++gg) {
475 auto t_row_base = row_data.getFTensor0N(gg, 0);
476 for (int rr = 0; rr != nb_row_base; ++rr) {
477 const double row_base = t_row_base;
478 if (row_base != 0.) {
479 auto t_row_rhs = getFTensor1FromPtr<SPACE_DIM>(&locF[
SPACE_DIM * rr]);
481 t_row_rhs(dd) += row_base * slave_alpha *
482 ((*dispPtr)(gg,
dd) -
484 }
485 }
486 ++t_row_base;
487 }
488
489 ++t_w;
490 }
491
493 }
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
const Tensor2_symmetric_Expr< const ddTensor0< T, Dim, i, j >, typename promote< T, double >::V, Dim, i, j > dd(const Tensor0< T * > &a, const Index< i, Dim > index1, const Index< j, Dim > index2, const Tensor1< int, Dim > &d_ijk, const Tensor1< double, Dim > &d_xyz)
double getSlaveFaceArea()