13#ifndef __BILINEAR_FORMS_INTEGRATORS_IMPL_HPP__
14#define __BILINEAR_FORMS_INTEGRATORS_IMPL_HPP__
19 std::map<std::pair<int, int>, boost::shared_ptr<MatrixDouble>>;
25template <
int SPACE_DIM,
typename OpBase>
29 const std::string col_field_name,
31 boost::shared_ptr<Range> ents_ptr =
nullptr)
32 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL, ents_ptr),
34 if (row_field_name == col_field_name)
44template <
int FIELD_DIM,
int SPACE_DIM,
typename OpBase>
48 const std::string col_field_name,
50 boost::shared_ptr<Range> ents_ptr =
nullptr)
51 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL, ents_ptr),
53 if (row_field_name == col_field_name)
63template <
int BASE_DIM,
int FIELD_DIM, IntegrationType I,
typename OpBase>
66template <
typename OpBase>
70 const std::string row_field_name,
const std::string col_field_name,
71 ScalarFun beta = [](
double,
double,
double)
constexpr {
return 1; },
72 boost::shared_ptr<Range> ents_ptr =
nullptr,
73 boost::shared_ptr<MatrixDouble> cache_mat =
nullptr)
74 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL, ents_ptr),
76 if (row_field_name == col_field_name)
89 return integrateImpl(row_data, col_data, OpBase::getMeasure());
93template <
int FIELD_DIM,
typename OpBase>
105 return integrateImpl(row_data, col_data, OpBase::getMeasure());
112template <
int FIELD_DIM,
typename OpBase>
115 OpMassImpl(
const std::string row_field_name,
const std::string col_field_name,
117 boost::shared_ptr<Range> ents_ptr =
nullptr)
118 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL, ents_ptr),
120 if (row_field_name == col_field_name)
130template <
typename OpBase>
132 OpMassImpl(
const std::string row_field_name,
const std::string col_field_name,
134 boost::shared_ptr<Range> ents_ptr =
nullptr)
135 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL, ents_ptr),
137 if (row_field_name == col_field_name)
147template <
typename OpBase>
149 OpMassImpl(
const std::string row_field_name,
const std::string col_field_name,
151 boost::shared_ptr<Range> ents_ptr =
nullptr)
152 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL, ents_ptr),
154 if (row_field_name == col_field_name)
164template <
typename OpBase>
166 OpMassImpl(
const std::string row_field_name,
const std::string col_field_name,
168 boost::shared_ptr<Range> ents_ptr =
nullptr)
169 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL, ents_ptr),
171 if (row_field_name == col_field_name)
181template <
int BASE_DIM,
int FIELD_DIM, IntegrationType I,
typename OpBase>
184template <
int FIELD_DIM, IntegrationType I,
typename OpBase>
186 :
public OpMassImpl<1, FIELD_DIM, I, OpBase> {
188 const std::string col_field_name,
const double beta,
189 boost::shared_ptr<Range> ents_ptr =
nullptr)
191 row_field_name, col_field_name,
193 cacheLocMats(cache), scalarBeta(beta) {}
196 EntitiesFieldData::EntData &col_data);
207template <
int SPACE_DIM,
int S,
typename OpBase>
212 const std::string col_field_name,
213 boost::shared_ptr<MatrixDouble> mat_D,
214 boost::shared_ptr<Range> ents_ptr =
nullptr,
216 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL, ents_ptr),
217 matD(mat_D), betaCoeff(beta) {
218 if (row_field_name == col_field_name)
223 boost::shared_ptr<MatrixDouble>
matD;
233template <
int SPACE_DIM,
int S,
typename OpBase>
238 const std::string col_field_name,
239 boost::shared_ptr<MatrixDouble> mat_D,
241 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL), matD(mat_D),
245 boost::shared_ptr<MatrixDouble>
matD;
255template <
int FIELD_DIM,
int SPACE_DIM,
int S,
typename OpBase>
259 const std::string col_field_name,
260 boost::shared_ptr<MatrixDouble> mat_D,
261 boost::shared_ptr<Range> ents_ptr =
nullptr)
262 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL, ents_ptr),
264 if (row_field_name == col_field_name)
269 boost::shared_ptr<MatrixDouble>
matD;
278template <
int FIELD_DIM,
int SPACE_DIM,
int S,
typename OpBase>
282 const std::string col_field_name,
283 boost::shared_ptr<MatrixDouble> mat_D,
284 boost::shared_ptr<Range> ents_ptr =
nullptr)
285 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL, ents_ptr),
287 if (row_field_name == col_field_name)
292 boost::shared_ptr<MatrixDouble>
matD;
297template <
int SPACE_DIM, IntegrationType I,
typename OpBase>
300template <
int SPACE_DIM,
typename OpBase>
303 const std::string col_field_name,
305 const bool assemble_transpose =
false,
306 const bool only_transpose =
false)
307 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
308 alphaConstant(alpha_fun) {
309 this->assembleTranspose = assemble_transpose;
310 this->onlyTranspose = only_transpose;
324template <
int SPACE_DIM,
typename OpBase, CoordinateTypes CoordSys>
329 const std::string col_field_name,
ConstantFun alpha_fun,
330 const bool assemble_transpose,
331 const bool only_transpose =
false)
332 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
333 alphaConstant(alpha_fun) {
334 this->assembleTranspose = assemble_transpose;
335 this->onlyTranspose = only_transpose;
339 const std::string col_field_name,
ConstantFun alpha_fun,
340 ScalarFun beta_fun,
const bool assemble_transpose,
341 const bool only_transpose =
false)
342 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
343 alphaConstant(alpha_fun), betaCoeff(beta_fun) {
344 this->assembleTranspose = assemble_transpose;
345 this->onlyTranspose = only_transpose;
362template <
int SPACE_DIM,
typename OpBase, CoordinateTypes COORDINATE_SYSTEM>
366 const std::string row_field_name,
const std::string col_field_name,
367 ScalarFun alpha_fun = [](
double,
double,
double)
constexpr {
return 1; },
368 const bool assemble_transpose =
false,
const bool only_transpose =
false)
369 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
370 alphaConstant(alpha_fun) {
371 this->assembleTranspose = assemble_transpose;
372 this->onlyTranspose = only_transpose;
387template <
int SPACE_DIM,
typename OpBase>
391 const std::string col_field_name,
393 const bool assemble_transpose =
false,
394 const bool only_transpose =
false)
395 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
396 alphaConstant(alpha_fun) {
397 this->assembleTranspose = assemble_transpose;
398 this->onlyTranspose = only_transpose;
408template <
int SPACE_DIM,
typename OpBase>
412 const std::string col_field_name,
414 const bool assemble_transpose =
false,
415 const bool only_transpose =
false)
416 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
417 alphaConstant(alpha_fun) {
418 this->assembleTranspose = assemble_transpose;
419 this->onlyTranspose = only_transpose;
433template <
int BASE_DIM,
int FIELD_DIM,
int SPACE_DIM,
int S,
typename OpBase>
437 "Expected vector or square tensor column bases");
439 "Expected a positive row field size and 2D or 3D tensors");
442 const std::string row_field_name,
const std::string col_field_name,
443 boost::shared_ptr<MatrixDouble> mat_tensor,
444 ConstantFun alpha_fun = []()
constexpr {
return 1.; },
445 const bool assemble_transpose =
false,
const bool only_transpose =
false)
446 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
447 matTensor(mat_tensor), alphaConstant(alpha_fun) {
449 this->assembleTranspose = assemble_transpose;
450 this->onlyTranspose = only_transpose;
460template <
int SPACE_DIM, IntegrationType I,
typename OpBase>
463template <
int SPACE_DIM,
typename OpBase>
467 const std::string col_field_name,
468 ConstantFun alpha_fun,
const bool assemble_transpose,
469 const bool only_transpose =
false)
470 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
471 alphaConstant(alpha_fun) {
472 this->assembleTranspose = assemble_transpose;
473 this->onlyTranspose = only_transpose;
477 const std::string col_field_name,
479 const bool assemble_transpose,
480 const bool only_transpose =
false)
481 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
482 alphaConstant(alpha_fun), betaCoeff(beta_coeff) {
483 this->assembleTranspose = assemble_transpose;
484 this->onlyTranspose = only_transpose;
496template <
int SPACE_DIM,
typename OpBase>
503 const double vol = OpBase::getMeasure();
505 auto t_w = OpBase::getFTensor0IntegrationWeight();
509 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
513 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
515 const double alpha = t_w * beta;
540template <
int FIELD_DIM,
int SPACE_DIM,
typename OpBase>
548 const double vol = OpBase::getMeasure();
550 auto t_w = OpBase::getFTensor0IntegrationWeight();
554 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
559 auto get_t_vec = [&](
const int rr) {
560 std::array<double *, FIELD_DIM> ptrs;
569 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
571 const double alpha = t_w * beta;
582 t_vec(
j) += alpha * (t_row_grad(
i) * t_col_grad(
i));
599template <
typename OpBase>
606 auto log_error = [&]() {
616 "Wrong number of base functions on rows %zu < %d",
622 "Wrong number of base functions on cols %zu < %d",
628 "Wrong number of integration points on rows %zu != %d",
634 "Wrong number of integration points on cols %zu != %d",
640 auto t_w = OpBase::getFTensor0IntegrationWeight();
644 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
647 const double beta = betaCoeff(t_coords(0), t_coords(1), t_coords(2));
649 const double alpha = t_w * beta;
659 *a_mat_ptr += alpha * (t_row_base * t_col_base);
676template <
int FIELD_DIM,
typename OpBase>
682 auto integrate = [&](
auto &mat) {
685 auto t_w = OpBase::getFTensor0IntegrationWeight();
689 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
692 auto get_t_vec = [&](
const int rr) {
693 std::array<double *, FIELD_DIM> ptrs;
695 ptrs[
i] = &mat(rr +
i,
i);
702 const double beta = betaCoeff(t_coords(0), t_coords(1), t_coords(2));
704 const double alpha = t_w * beta;
715 t_vec(
i) += alpha * (t_row_base * t_col_base);
735template <
int FIELD_DIM,
typename OpBase>
741 size_t nb_base_functions = row_data.
getN().size2() / 3;
743 const double vol = OpBase::getMeasure();
745 auto t_w = OpBase::getFTensor0IntegrationWeight();
749 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
752 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
754 const double alpha = t_w * beta;
764 (*a_mat_ptr) += alpha * (t_row_base(
i) * t_col_base(
i));
770 for (; rr < nb_base_functions; ++rr)
778template <
typename OpBase>
785 auto get_t_vec = [&](
const int rr) {
789 size_t nb_base_functions = row_data.
getN().size2() / 3;
791 const double vol = OpBase::getMeasure();
793 auto t_w = OpBase::getFTensor0IntegrationWeight();
797 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
800 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
802 const double alpha = t_w * beta;
808 auto t_vec = get_t_vec(2 * rr);
812 t_vec(
I) += alpha * (t_row_base(
k) * t_col_base(
k));
818 for (; rr < nb_base_functions; ++rr)
826template <
typename OpBase>
833 auto get_t_vec = [&](
const int rr) {
838 size_t nb_base_functions = row_data.
getN().size2() / 3;
840 const double vol = OpBase::getMeasure();
842 auto t_w = OpBase::getFTensor0IntegrationWeight();
846 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
849 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
851 const double alpha = t_w * beta;
857 auto t_vec = get_t_vec(3 * rr);
861 t_vec(
i) += alpha * (t_row_base(
k) * t_col_base(
k));
867 for (; rr < nb_base_functions; ++rr)
875template <
typename OpBase>
882 size_t nb_base_functions = row_data.
getN().size2() / 9;
884 const double vol = OpBase::getMeasure();
886 auto t_w = OpBase::getFTensor0IntegrationWeight();
890 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
893 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
895 const double alpha = t_w * beta;
909 for (; rr < nb_base_functions; ++rr)
917template <
int FIELD_DIM, IntegrationType I,
typename OpBase>
923 const auto vol = this->getMeasure();
924 const auto row_type = this->rowType;
925 const auto col_type = this->colType;
926 auto &loc_mat = this->locMat;
928 auto p = std::make_pair(row_type, col_type);
930 if (cacheLocMats[p]) {
931 if (cacheLocMats[p]->size1() != loc_mat.size1() &&
932 cacheLocMats[p]->size2() != loc_mat.size2()) {
933 cacheLocMats[p]->resize(loc_mat.size1(), loc_mat.size2());
934 CHKERR this->integrateImpl(row_data, col_data, 1);
935 *(cacheLocMats[p]) = loc_mat;
937 loc_mat = *(cacheLocMats[p]);
939 loc_mat *= scalarBeta * this->getMeasure();
941 CHKERR this->integrateImpl(row_data, col_data,
942 scalarBeta * this->getMeasure());
947template <
int SPACE_DIM,
int S,
typename OpBase>
954 const size_t nb_row_dofs = row_data.
getIndices().size();
955 const size_t nb_col_dofs = col_data.
getIndices().size();
957 if (nb_row_dofs && nb_col_dofs) {
968 double vol = OpBase::getMeasure();
971 auto t_w = OpBase::getFTensor0IntegrationWeight();
982 auto t_D_at_pts = get_D_at_pts();
985 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
991 double a = t_w * vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
998 auto t_m = OpBase::template getLocMat<SPACE_DIM>(
SPACE_DIM * rr);
1004 t_rowD(
l,
j,
k) = t_D_at_pts(
i,
j,
k,
l) * (
a * t_row_diff_base(
i));
1011 for (
int cc = 0; cc <= nb_cols; ++cc) {
1014 t_m(
i,
j) += t_rowD(
i,
j,
k) * t_col_diff_base(
k);
1039 auto t_m_rr = getFTensor2FromArray<SPACE_DIM, SPACE_DIM, SPACE_DIM>(
1041 auto t_m_cc = getFTensor2FromArray<SPACE_DIM, SPACE_DIM>(
1045 t_m_rr(
i,
j) = t_m_cc(
j,
i);
1056template <
int FIELD_DIM,
int SPACE_DIM,
int S,
typename OpBase>
1072 auto &row_hessian = row_data.
getN(BaseDerivatives::SecondDerivative);
1073 auto &col_hessian = col_data.
getN(BaseDerivatives::SecondDerivative);
1078 "Wrong number of integration pts (%zu != %d)", row_hessian.size1(),
1081 if (row_hessian.size2() !=
1084 "Wrong number of base functions (%zu != %d)",
1090 "Wrong number of base functions (%zu < %d)", row_hessian.size2(),
1095 "Wrong number of integration pts (%zu != %d)", col_hessian.size1(),
1100 "Wrong number of base functions (%zu < %d)", col_hessian.size2(),
1106 double vol = OpBase::getMeasure();
1109 auto t_w = OpBase::getFTensor0IntegrationWeight();
1111 auto t_row_diff2 = getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(
1112 &*row_hessian.data().begin());
1120 auto t_D_at_pts = get_D_at_pts();
1127 double a = t_w * vol;
1133 auto t_mat = getFTensor2FromPtr<FIELD_DIM, FIELD_DIM, FIELD_DIM>(
1137 t_rowD(
k,
l) = t_D_at_pts(
i,
j,
k,
l) * (
a * t_row_diff2(
i,
j));
1141 getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(&col_hessian(gg, 0));
1147 t_mat(
I,
J) += (t_rowD(
i,
j) * t_col_diff2(
i,
j)) *
t_kd(
I,
J);
1172template <
int FIELD_DIM,
int SPACE_DIM,
int S,
typename OpBase>
1188 auto &row_hessian = row_data.
getN(BaseDerivatives::SecondDerivative);
1189 auto &col_hessian = col_data.
getN(BaseDerivatives::SecondDerivative);
1194 "Wrong number of integration pts (%zu != %d)", row_hessian.size1(),
1197 if (row_hessian.size2() !=
1200 "Wrong number of base functions (%zu != %d)",
1206 "Wrong number of base functions (%zu < %d)", row_hessian.size2(),
1211 "Wrong number of integration pts (%zu != %d)", col_hessian.size1(),
1216 "Wrong number of base functions (%zu < %d)", col_hessian.size2(),
1222 double vol = OpBase::getMeasure();
1225 auto t_w = OpBase::getFTensor0IntegrationWeight();
1227 auto t_row_diff2 = getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(
1228 &*row_hessian.data().begin());
1236 auto t_D_at_pts = get_D_at_pts();
1244 double a = t_w * vol;
1254 t_rowD(
k,
l) = t_D_at_pts(
i,
j,
k,
l) * (
a * t_row_diff2(
i,
j));
1258 getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(&col_hessian(gg, 0));
1260 auto t_mat = getFTensor2FromPtr<FIELD_DIM, FIELD_DIM, FIELD_DIM>(
1267 t_mat(
I,
J) += (t_rowD(
i,
j) * t_col_diff2(
i,
j)) *
t_kd(
I,
J);
1292template <
int SPACE_DIM,
int S,
typename OpBase>
1299 const size_t nb_row_dofs = row_data.
getIndices().size();
1300 const size_t nb_col_dofs = col_data.
getIndices().size();
1302 if (nb_row_dofs && nb_col_dofs) {
1310 double vol = OpBase::getMeasure();
1313 auto t_w = OpBase::getFTensor0IntegrationWeight();
1324 auto t_D_at_pts = get_D_at_pts();
1327 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
1333 double a = t_w * vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
1340 auto t_m = OpBase::template getLocMat<SPACE_DIM>(
SPACE_DIM * rr);
1344 t_row(
i,
k,
l) = t_D_at_pts(
i,
j,
k,
l) * (
a * t_row_diff_base(
j));
1353 t_m(
i,
k) += t_row(
i,
k,
l) * t_col_diff_base(
l);
1379template <
int SPACE_DIM,
typename OpBase>
1385 auto t_w = this->getFTensor0IntegrationWeight();
1387 size_t nb_base_functions = row_data.
getN().size2() / 3;
1390 const double alpha_constant = alphaConstant();
1393 const double alpha = alpha_constant * this->getMeasure() * t_w;
1397 const double t_row_div_base = t_row_diff_base(
i,
i);
1400 this->locMat(rr, cc) += alpha * t_row_div_base * t_col_base;
1405 for (; rr < nb_base_functions; ++rr)
1414template <
int SPACE_DIM,
typename OpBase, CoordinateTypes CoordSys>
1421 auto t_w = this->getFTensor0IntegrationWeight();
1422 auto t_coords = this->getFTensor1CoordsAtGaussPts();
1424 size_t nb_base_functions = row_data.
getN().size2() / 3;
1427 const double alpha_constant = alphaConstant() * this->getMeasure();
1430 const double alpha =
1431 alpha_constant * t_w * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
1435 auto t_mat_diag = getFTensor1FromArrayDiag<SPACE_DIM, SPACE_DIM>(
1437 const double t_row_div_base = t_row_diff_base(
i,
i);
1441 t_mat_diag(
i) += alpha * t_row_div_base * t_col_base;
1443 t_mat_diag(
i) += t_row_base(0) * (alpha / t_coords(0)) * t_col_base;
1451 for (; rr < nb_base_functions; ++rr) {
1463template <
int SPACE_DIM,
typename OpBase, CoordinateTypes COORDINATE_SYSTEM>
1473 "Number of rows in matrix should be multiple of space dimensions");
1477 if constexpr (COORDINATE_SYSTEM ==
POLAR || COORDINATE_SYSTEM ==
SPHERICAL)
1479 "%s coordiante not implemented",
1482 auto t_w = this->getFTensor0IntegrationWeight();
1483 auto t_coords = this->getFTensor1CoordsAtGaussPts();
1484 size_t nb_base_functions_row = row_data.
getN().size2();
1486 const double vol = this->getMeasure();
1489 const double alpha =
1490 alphaConstant(t_coords(0), t_coords(1), t_coords(2)) * t_w * vol;
1493 auto t_m = getFTensor1FromPtr<SPACE_DIM>(
OpBase::locMat.data().data());
1496 if constexpr (COORDINATE_SYSTEM ==
CARTESIAN) {
1498 const double r_val = alpha * t_row_base;
1501 t_m(
i) += r_val * t_col_diff_base(
i);
1512 const double r_val = alpha * t_row_base;
1516 t_m(
i) += r_val * t_col_diff_base(
i);
1517 t_m(0) += (r_val / t_coords(0)) * t_col_base;
1526 for (; rr < nb_base_functions_row; ++rr)
1536template <
int SPACE_DIM,
typename OpBase>
1543 auto t_w = this->getFTensor0IntegrationWeight();
1545 size_t nb_base_functions = row_data.
getN().size2() / 3;
1547 auto &mat = this->locMat;
1548 const double alpha_constant = alphaConstant();
1551 const double alpha = alpha_constant * this->getMeasure() * t_w;
1557 mat(rr, cc) += alpha * t_row_base(
i) * t_col_diff_base(
i);
1562 for (; rr < nb_base_functions; ++rr)
1571template <
int SPACE_DIM,
typename OpBase>
1578 auto t_w = this->getFTensor0IntegrationWeight();
1580 size_t nb_base_functions = row_data.
getN().size2();
1583 auto get_t_vec = [&](
const int rr) {
1584 std::array<double *, SPACE_DIM> ptrs;
1590 const double alpha_constant = alphaConstant();
1593 const double alpha = alpha_constant * this->getMeasure() * t_w;
1600 t_vec(
i) += alpha * t_row_base * t_col_diff_base(
i);
1606 for (; rr < nb_base_functions; ++rr)
1615template <
int BASE_DIM,
int FIELD_DIM,
int SPACE_DIM,
int S,
typename OpBase>
1622 constexpr int base_extent = tensor_basis ? (
BASE_DIM == 4 ? 2 : 3) :
BASE_DIM;
1623 constexpr int col_dim = tensor_basis ? 1 :
SPACE_DIM;
1625 "Column basis storage is smaller than the physical tensor");
1632 auto t_tensor = get_tensor();
1633 auto t_w = this->getFTensor0IntegrationWeight();
1635 const double alpha_constant = alphaConstant() * this->getMeasure();
1638 const double alpha = alpha_constant * t_w;
1641 auto t_col = [&]() {
1642 if constexpr (tensor_basis)
1643 return col_data.
getFTensor2N<base_extent, base_extent>(gg, 0);
1647 auto t_m = OpBase::template getLocMat<FIELD_DIM, col_dim>(
FIELD_DIM * rr);
1649 if constexpr (tensor_basis) {
1651 t_m(
a, n0) += (alpha * t_row) * (t_tensor(
i,
j,
a) * t_col(
i,
j));
1653 t_m(
a,
i) += (alpha * t_row) * (t_tensor(
i,
j,
a) * t_col(
j));
1668template <
int SPACE_DIM,
typename OpBase>
1674 auto t_w = this->getFTensor0IntegrationWeight();
1675 auto t_coords = this->getFTensor1CoordsAtGaussPts();
1677 size_t nb_base_functions = row_data.
getN().size2() / 3;
1679 const double alpha_constant = alphaConstant() * this->getMeasure();
1682 const double alpha =
1683 alpha_constant * betaCoeff(t_coords(0), t_coords(1), t_coords(2)) * t_w;
1687 auto t_mat_diag = getFTensor1FromArrayDiag<SPACE_DIM, SPACE_DIM>(
1692 t_mat_diag(
i) += alpha * t_row_base(
j) * t_col_diff_base(
j);
1699 for (; rr < nb_base_functions; ++rr)
#define FTENSOR_INDEXES(DIM,...)
static const char *const CoordinateTypesNames[]
Coordinate system names.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
CoordinateTypes
Coodinate system.
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MOFEM_LOG(channel, severity)
Log.
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'J', DIM1 > J
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
decltype(GetFTensor4FromMatImpl< Tensor_Dim0, Tensor_Dim1, Tensor_Dim2, Tensor_Dim3, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor4FromMatType
std::map< std::pair< int, int >, boost::shared_ptr< MatrixDouble > > CacheMatsTypeType
boost::function< double()> ConstantFun
Constant function type.
decltype(GetFTensor3FromMatImpl< Tensor_Dim0, Tensor_Dim1, Tensor_Dim2, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor3FromMatType
constexpr IntegrationType I
OpBaseImpl< PETSC, EdgeEleOp > OpBase
Data on single entity (This is passed as argument to DataOperator::doWork)
FTensor::Tensor2< FTensor::PackPtr< double *, Tensor_Dim0 *Tensor_Dim1 >, Tensor_Dim0, Tensor_Dim1 > getFTensor2DiffN(FieldApproximationBase base)
Get derivatives of base functions for Hdiv space.
FTensor::Tensor0< FTensor::PackPtr< double *, 1 > > getFTensor0N(const FieldApproximationBase base)
Get base function as Tensor0.
const VectorFieldEntities & getFieldEntities() const
Get field entities (const version)
auto getFTensor2N(FieldApproximationBase base)
Get base functions for Hdiv/Hcurl spaces.
auto getFTensor1DiffN(const FieldApproximationBase base)
Get derivatives of base functions.
MatrixDouble & getN(const FieldApproximationBase base)
get base functions this return matrix (nb. of rows is equal to nb. of Gauss pts, nb....
auto getFTensor1N(FieldApproximationBase base)
Get base functions for Hdiv/Hcurl spaces.
const VectorInt & getIndices() const
Get global indices of degrees of freedom on entity.
int rowSide
row side number
int colSide
column side number
int nbRows
number of dofs on rows
EntityType colType
column type
int nbIntegrationPts
number of integration points
MatrixDouble locMat
local entity block matrix
int nbCols
number if dof on column
int nbRowBaseFunctions
number or row base functions
EntityType rowType
row type
boost::shared_ptr< MatrixDouble > matTensor
ConstantFun alphaConstant
OpBaseTensorBaseImpl(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< MatrixDouble > mat_tensor, ConstantFun alpha_fun=[]() constexpr { return 1.;}, const bool assemble_transpose=false, const bool only_transpose=false)
OpGradGradImpl(const std::string row_field_name, const std::string col_field_name, ScalarFun beta=scalar_fun_one, boost::shared_ptr< Range > ents_ptr=nullptr)
FTensor::Index< 'i', SPACE_DIM > i
summit Index
OpGradGradImpl(const std::string row_field_name, const std::string col_field_name, ScalarFun beta=scalar_fun_one, boost::shared_ptr< Range > ents_ptr=nullptr)
FTensor::Index< 'i', SPACE_DIM > i
summit Index
boost::shared_ptr< MatrixDouble > matD
OpGradGradSymTensorGradGradImpl(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< MatrixDouble > mat_D, boost::shared_ptr< Range > ents_ptr=nullptr)
boost::shared_ptr< MatrixDouble > matD
OpGradGradTensorGradGradImpl(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< MatrixDouble > mat_D, boost::shared_ptr< Range > ents_ptr=nullptr)
FTensor::Index< 'i', SPACE_DIM > i
summit Index
boost::shared_ptr< MatrixDouble > matD
OpGradSymTensorGradImpl(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< MatrixDouble > mat_D, boost::shared_ptr< Range > ents_ptr=nullptr, ScalarFun beta=scalar_fun_one)
boost::shared_ptr< MatrixDouble > matD
FTensor::Index< 'i', SPACE_DIM > i
summit Index
OpGradTensorGradImpl(const std::string row_field_name, const std::string col_field_name, boost::shared_ptr< MatrixDouble > mat_D, ScalarFun beta=scalar_fun_one)
CacheMatsTypeType cacheLocMats
OpMassCacheImpl(CacheMatsTypeType cache, const std::string row_field_name, const std::string col_field_name, const double beta, boost::shared_ptr< Range > ents_ptr=nullptr)
OpMassImpl(const std::string row_field_name, const std::string col_field_name, ScalarFun beta=[](double, double, double) constexpr { return 1;}, boost::shared_ptr< Range > ents_ptr=nullptr, boost::shared_ptr< MatrixDouble > cache_mat=nullptr)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
Integrate grad-grad operator.
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &data)
Class dedicated to integrate operator.
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
Integrate grad-grad operator.
OpMassImpl(const std::string row_field_name, const std::string col_field_name, ScalarFun beta=scalar_fun_one, boost::shared_ptr< Range > ents_ptr=nullptr)
OpMassImpl(const std::string row_field_name, const std::string col_field_name, ScalarFun beta=scalar_fun_one, boost::shared_ptr< Range > ents_ptr=nullptr)
OpMassImpl(const std::string row_field_name, const std::string col_field_name, ScalarFun beta=scalar_fun_one, boost::shared_ptr< Range > ents_ptr=nullptr)
OpMassImpl(const std::string row_field_name, const std::string col_field_name, ScalarFun beta=scalar_fun_one, boost::shared_ptr< Range > ents_ptr=nullptr)
ConstantFun alphaConstant
FTensor::Index< 'i', SPACE_DIM > i
summit Index
OpMixDivTimesScalarImpl(const std::string row_field_name, const std::string col_field_name, ConstantFun alpha_fun, const bool assemble_transpose=false, const bool only_transpose=false)
OpMixDivTimesVecImpl(const std::string row_field_name, const std::string col_field_name, ConstantFun alpha_fun, const bool assemble_transpose, const bool only_transpose=false)
FTensor::Index< 'i', SPACE_DIM > i
summit Index
OpMixDivTimesVecImpl(const std::string row_field_name, const std::string col_field_name, ConstantFun alpha_fun, ScalarFun beta_fun, const bool assemble_transpose, const bool only_transpose=false)
OpMixScalarTimesDivImpl(const std::string row_field_name, const std::string col_field_name, ScalarFun alpha_fun=[](double, double, double) constexpr { return 1;}, const bool assemble_transpose=false, const bool only_transpose=false)
FTensor::Index< 'i', SPACE_DIM > i
summit Index
FTensor::Index< 'i', SPACE_DIM > i
summit Index
OpMixTensorTimesGradImpl(const std::string row_field_name, const std::string col_field_name, ConstantFun alpha_fun, const bool assemble_transpose, const bool only_transpose=false)
OpMixTensorTimesGradImpl(const std::string row_field_name, const std::string col_field_name, ConstantFun alpha_fun, ScalarFun beta_coeff, const bool assemble_transpose, const bool only_transpose=false)
FTensor::Index< 'j', SPACE_DIM > j
summit Index
ConstantFun alphaConstant
FTensor::Index< 'i', SPACE_DIM > i
summit Index
OpMixVectorTimesGradImpl(const std::string row_field_name, const std::string col_field_name, ConstantFun alpha_fun, const bool assemble_transpose=false, const bool only_transpose=false)
FTensor::Index< 'i', SPACE_DIM > i
summit Index
ConstantFun alphaConstant
OpMixVectorTimesGradImpl(const std::string row_field_name, const std::string col_field_name, ConstantFun alpha_fun, const bool assemble_transpose=false, const bool only_transpose=false)