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;
429template <
int SPACE_DIM, IntegrationType I,
typename OpBase>
432template <
int SPACE_DIM,
typename OpBase>
436 const std::string col_field_name,
437 ConstantFun alpha_fun,
const bool assemble_transpose,
438 const bool only_transpose =
false)
439 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
440 alphaConstant(alpha_fun) {
441 this->assembleTranspose = assemble_transpose;
442 this->onlyTranspose = only_transpose;
446 const std::string col_field_name,
448 const bool assemble_transpose,
449 const bool only_transpose =
false)
450 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
451 alphaConstant(alpha_fun), betaCoeff(beta_coeff) {
452 this->assembleTranspose = assemble_transpose;
453 this->onlyTranspose = only_transpose;
465template <
int SPACE_DIM,
typename OpBase>
472 const double vol = OpBase::getMeasure();
474 auto t_w = OpBase::getFTensor0IntegrationWeight();
478 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
482 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
484 const double alpha = t_w * beta;
509template <
int FIELD_DIM,
int SPACE_DIM,
typename OpBase>
517 const double vol = OpBase::getMeasure();
519 auto t_w = OpBase::getFTensor0IntegrationWeight();
523 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
528 auto get_t_vec = [&](
const int rr) {
529 std::array<double *, FIELD_DIM> ptrs;
538 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
540 const double alpha = t_w * beta;
551 t_vec(
j) += alpha * (t_row_grad(
i) * t_col_grad(
i));
568template <
typename OpBase>
575 auto log_error = [&]() {
585 "Wrong number of base functions on rows %zu < %d",
591 "Wrong number of base functions on cols %zu < %d",
597 "Wrong number of integration points on rows %zu != %d",
603 "Wrong number of integration points on cols %zu != %d",
609 auto t_w = OpBase::getFTensor0IntegrationWeight();
613 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
616 const double beta = betaCoeff(t_coords(0), t_coords(1), t_coords(2));
618 const double alpha = t_w * beta;
628 *a_mat_ptr += alpha * (t_row_base * t_col_base);
645template <
int FIELD_DIM,
typename OpBase>
651 auto integrate = [&](
auto &mat) {
654 auto t_w = OpBase::getFTensor0IntegrationWeight();
658 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
661 auto get_t_vec = [&](
const int rr) {
662 std::array<double *, FIELD_DIM> ptrs;
664 ptrs[
i] = &mat(rr +
i,
i);
671 const double beta = betaCoeff(t_coords(0), t_coords(1), t_coords(2));
673 const double alpha = t_w * beta;
684 t_vec(
i) += alpha * (t_row_base * t_col_base);
704template <
int FIELD_DIM,
typename OpBase>
710 size_t nb_base_functions = row_data.
getN().size2() / 3;
712 const double vol = OpBase::getMeasure();
714 auto t_w = OpBase::getFTensor0IntegrationWeight();
718 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
721 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
723 const double alpha = t_w * beta;
733 (*a_mat_ptr) += alpha * (t_row_base(
i) * t_col_base(
i));
739 for (; rr < nb_base_functions; ++rr)
747template <
typename OpBase>
754 auto get_t_vec = [&](
const int rr) {
758 size_t nb_base_functions = row_data.
getN().size2() / 3;
760 const double vol = OpBase::getMeasure();
762 auto t_w = OpBase::getFTensor0IntegrationWeight();
766 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
769 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
771 const double alpha = t_w * beta;
777 auto t_vec = get_t_vec(2 * rr);
781 t_vec(
I) += alpha * (t_row_base(
k) * t_col_base(
k));
787 for (; rr < nb_base_functions; ++rr)
795template <
typename OpBase>
802 auto get_t_vec = [&](
const int rr) {
807 size_t nb_base_functions = row_data.
getN().size2() / 3;
809 const double vol = OpBase::getMeasure();
811 auto t_w = OpBase::getFTensor0IntegrationWeight();
815 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
818 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
820 const double alpha = t_w * beta;
826 auto t_vec = get_t_vec(3 * rr);
830 t_vec(
i) += alpha * (t_row_base(
k) * t_col_base(
k));
836 for (; rr < nb_base_functions; ++rr)
844template <
typename OpBase>
851 size_t nb_base_functions = row_data.
getN().size2() / 9;
853 const double vol = OpBase::getMeasure();
855 auto t_w = OpBase::getFTensor0IntegrationWeight();
859 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
862 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
864 const double alpha = t_w * beta;
878 for (; rr < nb_base_functions; ++rr)
886template <
int FIELD_DIM, IntegrationType I,
typename OpBase>
892 const auto vol = this->getMeasure();
893 const auto row_type = this->rowType;
894 const auto col_type = this->colType;
895 auto &loc_mat = this->locMat;
897 auto p = std::make_pair(row_type, col_type);
899 if (cacheLocMats[p]) {
900 if (cacheLocMats[p]->size1() != loc_mat.size1() &&
901 cacheLocMats[p]->size2() != loc_mat.size2()) {
902 cacheLocMats[p]->resize(loc_mat.size1(), loc_mat.size2());
903 CHKERR this->integrateImpl(row_data, col_data, 1);
904 *(cacheLocMats[p]) = loc_mat;
906 loc_mat = *(cacheLocMats[p]);
908 loc_mat *= scalarBeta * this->getMeasure();
910 CHKERR this->integrateImpl(row_data, col_data,
911 scalarBeta * this->getMeasure());
916template <
int SPACE_DIM,
int S,
typename OpBase>
923 const size_t nb_row_dofs = row_data.
getIndices().size();
924 const size_t nb_col_dofs = col_data.
getIndices().size();
926 if (nb_row_dofs && nb_col_dofs) {
937 double vol = OpBase::getMeasure();
940 auto t_w = OpBase::getFTensor0IntegrationWeight();
951 auto t_D_at_pts = get_D_at_pts();
954 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
960 double a = t_w * vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
967 auto t_m = OpBase::template getLocMat<SPACE_DIM>(
SPACE_DIM * rr);
973 t_rowD(
l,
j,
k) = t_D_at_pts(
i,
j,
k,
l) * (
a * t_row_diff_base(
i));
980 for (
int cc = 0; cc <= nb_cols; ++cc) {
983 t_m(
i,
j) += t_rowD(
i,
j,
k) * t_col_diff_base(
k);
1008 auto t_m_rr = getFTensor2FromArray<SPACE_DIM, SPACE_DIM, SPACE_DIM>(
1010 auto t_m_cc = getFTensor2FromArray<SPACE_DIM, SPACE_DIM>(
1014 t_m_rr(
i,
j) = t_m_cc(
j,
i);
1025template <
int FIELD_DIM,
int SPACE_DIM,
int S,
typename OpBase>
1041 auto &row_hessian = row_data.
getN(BaseDerivatives::SecondDerivative);
1042 auto &col_hessian = col_data.
getN(BaseDerivatives::SecondDerivative);
1047 "Wrong number of integration pts (%zu != %d)", row_hessian.size1(),
1050 if (row_hessian.size2() !=
1053 "Wrong number of base functions (%zu != %d)",
1059 "Wrong number of base functions (%zu < %d)", row_hessian.size2(),
1064 "Wrong number of integration pts (%zu != %d)", col_hessian.size1(),
1069 "Wrong number of base functions (%zu < %d)", col_hessian.size2(),
1075 double vol = OpBase::getMeasure();
1078 auto t_w = OpBase::getFTensor0IntegrationWeight();
1080 auto t_row_diff2 = getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(
1081 &*row_hessian.data().begin());
1089 auto t_D_at_pts = get_D_at_pts();
1096 double a = t_w * vol;
1102 auto t_mat = getFTensor2FromPtr<FIELD_DIM, FIELD_DIM, FIELD_DIM>(
1106 t_rowD(
k,
l) = t_D_at_pts(
i,
j,
k,
l) * (
a * t_row_diff2(
i,
j));
1110 getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(&col_hessian(gg, 0));
1116 t_mat(
I,
J) += (t_rowD(
i,
j) * t_col_diff2(
i,
j)) *
t_kd(
I,
J);
1141template <
int FIELD_DIM,
int SPACE_DIM,
int S,
typename OpBase>
1157 auto &row_hessian = row_data.
getN(BaseDerivatives::SecondDerivative);
1158 auto &col_hessian = col_data.
getN(BaseDerivatives::SecondDerivative);
1163 "Wrong number of integration pts (%zu != %d)", row_hessian.size1(),
1166 if (row_hessian.size2() !=
1169 "Wrong number of base functions (%zu != %d)",
1175 "Wrong number of base functions (%zu < %d)", row_hessian.size2(),
1180 "Wrong number of integration pts (%zu != %d)", col_hessian.size1(),
1185 "Wrong number of base functions (%zu < %d)", col_hessian.size2(),
1191 double vol = OpBase::getMeasure();
1194 auto t_w = OpBase::getFTensor0IntegrationWeight();
1196 auto t_row_diff2 = getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(
1197 &*row_hessian.data().begin());
1205 auto t_D_at_pts = get_D_at_pts();
1213 double a = t_w * vol;
1223 t_rowD(
k,
l) = t_D_at_pts(
i,
j,
k,
l) * (
a * t_row_diff2(
i,
j));
1227 getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(&col_hessian(gg, 0));
1229 auto t_mat = getFTensor2FromPtr<FIELD_DIM, FIELD_DIM, FIELD_DIM>(
1236 t_mat(
I,
J) += (t_rowD(
i,
j) * t_col_diff2(
i,
j)) *
t_kd(
I,
J);
1261template <
int SPACE_DIM,
int S,
typename OpBase>
1268 const size_t nb_row_dofs = row_data.
getIndices().size();
1269 const size_t nb_col_dofs = col_data.
getIndices().size();
1271 if (nb_row_dofs && nb_col_dofs) {
1279 double vol = OpBase::getMeasure();
1282 auto t_w = OpBase::getFTensor0IntegrationWeight();
1293 auto t_D_at_pts = get_D_at_pts();
1296 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
1302 double a = t_w * vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
1309 auto t_m = OpBase::template getLocMat<SPACE_DIM>(
SPACE_DIM * rr);
1313 t_row(
i,
k,
l) = t_D_at_pts(
i,
j,
k,
l) * (
a * t_row_diff_base(
j));
1322 t_m(
i,
k) += t_row(
i,
k,
l) * t_col_diff_base(
l);
1348template <
int SPACE_DIM,
typename OpBase>
1354 auto t_w = this->getFTensor0IntegrationWeight();
1356 size_t nb_base_functions = row_data.
getN().size2() / 3;
1359 const double alpha_constant = alphaConstant();
1362 const double alpha = alpha_constant * this->getMeasure() * t_w;
1366 const double t_row_div_base = t_row_diff_base(
i,
i);
1369 this->locMat(rr, cc) += alpha * t_row_div_base * t_col_base;
1374 for (; rr < nb_base_functions; ++rr)
1383template <
int SPACE_DIM,
typename OpBase, CoordinateTypes CoordSys>
1390 auto t_w = this->getFTensor0IntegrationWeight();
1391 auto t_coords = this->getFTensor1CoordsAtGaussPts();
1393 size_t nb_base_functions = row_data.
getN().size2() / 3;
1396 const double alpha_constant = alphaConstant() * this->getMeasure();
1399 const double alpha =
1400 alpha_constant * t_w * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
1404 auto t_mat_diag = getFTensor1FromArrayDiag<SPACE_DIM, SPACE_DIM>(
1406 const double t_row_div_base = t_row_diff_base(
i,
i);
1410 t_mat_diag(
i) += alpha * t_row_div_base * t_col_base;
1412 t_mat_diag(
i) += t_row_base(0) * (alpha / t_coords(0)) * t_col_base;
1420 for (; rr < nb_base_functions; ++rr) {
1432template <
int SPACE_DIM,
typename OpBase, CoordinateTypes COORDINATE_SYSTEM>
1442 "Number of rows in matrix should be multiple of space dimensions");
1446 if constexpr (COORDINATE_SYSTEM ==
POLAR || COORDINATE_SYSTEM ==
SPHERICAL)
1448 "%s coordiante not implemented",
1451 auto t_w = this->getFTensor0IntegrationWeight();
1452 auto t_coords = this->getFTensor1CoordsAtGaussPts();
1453 size_t nb_base_functions_row = row_data.
getN().size2();
1455 const double vol = this->getMeasure();
1458 const double alpha =
1459 alphaConstant(t_coords(0), t_coords(1), t_coords(2)) * t_w * vol;
1462 auto t_m = getFTensor1FromPtr<SPACE_DIM>(
OpBase::locMat.data().data());
1465 if constexpr (COORDINATE_SYSTEM ==
CARTESIAN) {
1467 const double r_val = alpha * t_row_base;
1470 t_m(
i) += r_val * t_col_diff_base(
i);
1481 const double r_val = alpha * t_row_base;
1485 t_m(
i) += r_val * t_col_diff_base(
i);
1486 t_m(0) += (r_val / t_coords(0)) * t_col_base;
1495 for (; rr < nb_base_functions_row; ++rr)
1505template <
int SPACE_DIM,
typename OpBase>
1512 auto t_w = this->getFTensor0IntegrationWeight();
1514 size_t nb_base_functions = row_data.
getN().size2() / 3;
1516 auto &mat = this->locMat;
1517 const double alpha_constant = alphaConstant();
1520 const double alpha = alpha_constant * this->getMeasure() * t_w;
1526 mat(rr, cc) += alpha * t_row_base(
i) * t_col_diff_base(
i);
1531 for (; rr < nb_base_functions; ++rr)
1540template <
int SPACE_DIM,
typename OpBase>
1547 auto t_w = this->getFTensor0IntegrationWeight();
1549 size_t nb_base_functions = row_data.
getN().size2();
1552 auto get_t_vec = [&](
const int rr) {
1553 std::array<double *, SPACE_DIM> ptrs;
1559 const double alpha_constant = alphaConstant();
1562 const double alpha = alpha_constant * this->getMeasure() * t_w;
1569 t_vec(
i) += alpha * t_row_base * t_col_diff_base(
i);
1575 for (; rr < nb_base_functions; ++rr)
1584template <
int SPACE_DIM,
typename OpBase>
1590 auto t_w = this->getFTensor0IntegrationWeight();
1591 auto t_coords = this->getFTensor1CoordsAtGaussPts();
1593 size_t nb_base_functions = row_data.
getN().size2() / 3;
1595 const double alpha_constant = alphaConstant() * this->getMeasure();
1598 const double alpha =
1599 alpha_constant * betaCoeff(t_coords(0), t_coords(1), t_coords(2)) * t_w;
1603 auto t_mat_diag = getFTensor1FromArrayDiag<SPACE_DIM, SPACE_DIM>(
1608 t_mat_diag(
i) += alpha * t_row_base(
j) * t_col_diff_base(
j);
1615 for (; rr < nb_base_functions; ++rr)
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.
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
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)