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 <
int BASE_DIM,
int FIELD_DIM, IntegrationType I,
typename OpBase>
167template <
int FIELD_DIM, IntegrationType I,
typename OpBase>
169 :
public OpMassImpl<1, FIELD_DIM, I, OpBase> {
171 const std::string col_field_name,
const double beta,
172 boost::shared_ptr<Range> ents_ptr =
nullptr)
174 row_field_name, col_field_name,
176 cacheLocMats(cache), scalarBeta(beta) {}
179 EntitiesFieldData::EntData &col_data);
190template <
int SPACE_DIM,
int S,
typename OpBase>
195 const std::string col_field_name,
196 boost::shared_ptr<MatrixDouble> mat_D,
197 boost::shared_ptr<Range> ents_ptr =
nullptr,
199 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL, ents_ptr),
200 matD(mat_D), betaCoeff(beta) {
201 if (row_field_name == col_field_name)
206 boost::shared_ptr<MatrixDouble>
matD;
216template <
int SPACE_DIM,
int S,
typename OpBase>
221 const std::string col_field_name,
222 boost::shared_ptr<MatrixDouble> mat_D,
224 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL), matD(mat_D),
228 boost::shared_ptr<MatrixDouble>
matD;
238template <
int FIELD_DIM,
int SPACE_DIM,
int S,
typename OpBase>
242 const std::string col_field_name,
243 boost::shared_ptr<MatrixDouble> mat_D,
244 boost::shared_ptr<Range> ents_ptr =
nullptr)
245 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL, ents_ptr),
247 if (row_field_name == col_field_name)
252 boost::shared_ptr<MatrixDouble>
matD;
261template <
int FIELD_DIM,
int SPACE_DIM,
int S,
typename OpBase>
265 const std::string col_field_name,
266 boost::shared_ptr<MatrixDouble> mat_D,
267 boost::shared_ptr<Range> ents_ptr =
nullptr)
268 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL, ents_ptr),
270 if (row_field_name == col_field_name)
275 boost::shared_ptr<MatrixDouble>
matD;
280template <
int SPACE_DIM, IntegrationType I,
typename OpBase>
283template <
int SPACE_DIM,
typename OpBase>
286 const std::string col_field_name,
288 const bool assemble_transpose =
false,
289 const bool only_transpose =
false)
290 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
291 alphaConstant(alpha_fun) {
292 this->assembleTranspose = assemble_transpose;
293 this->onlyTranspose = only_transpose;
307template <
int SPACE_DIM,
typename OpBase, CoordinateTypes CoordSys>
312 const std::string col_field_name,
ConstantFun alpha_fun,
313 const bool assemble_transpose,
314 const bool only_transpose =
false)
315 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
316 alphaConstant(alpha_fun) {
317 this->assembleTranspose = assemble_transpose;
318 this->onlyTranspose = only_transpose;
322 const std::string col_field_name,
ConstantFun alpha_fun,
323 ScalarFun beta_fun,
const bool assemble_transpose,
324 const bool only_transpose =
false)
325 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
326 alphaConstant(alpha_fun), betaCoeff(beta_fun) {
327 this->assembleTranspose = assemble_transpose;
328 this->onlyTranspose = only_transpose;
345template <
int SPACE_DIM,
typename OpBase, CoordinateTypes COORDINATE_SYSTEM>
349 const std::string row_field_name,
const std::string col_field_name,
350 ScalarFun alpha_fun = [](
double,
double,
double)
constexpr {
return 1; },
351 const bool assemble_transpose =
false,
const bool only_transpose =
false)
352 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
353 alphaConstant(alpha_fun) {
354 this->assembleTranspose = assemble_transpose;
355 this->onlyTranspose = only_transpose;
370template <
int SPACE_DIM,
typename OpBase>
374 const std::string col_field_name,
376 const bool assemble_transpose =
false,
377 const bool only_transpose =
false)
378 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
379 alphaConstant(alpha_fun) {
380 this->assembleTranspose = assemble_transpose;
381 this->onlyTranspose = only_transpose;
391template <
int SPACE_DIM,
typename OpBase>
395 const std::string col_field_name,
397 const bool assemble_transpose =
false,
398 const bool only_transpose =
false)
399 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
400 alphaConstant(alpha_fun) {
401 this->assembleTranspose = assemble_transpose;
402 this->onlyTranspose = only_transpose;
412template <
int SPACE_DIM, IntegrationType I,
typename OpBase>
415template <
int SPACE_DIM,
typename OpBase>
419 const std::string col_field_name,
420 ConstantFun alpha_fun,
const bool assemble_transpose,
421 const bool only_transpose =
false)
422 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
423 alphaConstant(alpha_fun) {
424 this->assembleTranspose = assemble_transpose;
425 this->onlyTranspose = only_transpose;
429 const std::string col_field_name,
431 const bool assemble_transpose,
432 const bool only_transpose =
false)
433 :
OpBase(row_field_name, col_field_name,
OpBase::OPROWCOL),
434 alphaConstant(alpha_fun), betaCoeff(beta_coeff) {
435 this->assembleTranspose = assemble_transpose;
436 this->onlyTranspose = only_transpose;
448template <
int SPACE_DIM,
typename OpBase>
455 const double vol = OpBase::getMeasure();
457 auto t_w = OpBase::getFTensor0IntegrationWeight();
461 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
465 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
467 const double alpha = t_w * beta;
492template <
int FIELD_DIM,
int SPACE_DIM,
typename OpBase>
500 const double vol = OpBase::getMeasure();
502 auto t_w = OpBase::getFTensor0IntegrationWeight();
506 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
511 auto get_t_vec = [&](
const int rr) {
512 std::array<double *, FIELD_DIM> ptrs;
521 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
523 const double alpha = t_w * beta;
534 t_vec(
j) += alpha * (t_row_grad(
i) * t_col_grad(
i));
551template <
typename OpBase>
558 auto log_error = [&]() {
568 "Wrong number of base functions on rows %zu < %d",
574 "Wrong number of base functions on cols %zu < %d",
580 "Wrong number of integration points on rows %zu != %d",
586 "Wrong number of integration points on cols %zu != %d",
592 auto t_w = OpBase::getFTensor0IntegrationWeight();
596 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
599 const double beta = betaCoeff(t_coords(0), t_coords(1), t_coords(2));
601 const double alpha = t_w * beta;
611 *a_mat_ptr += alpha * (t_row_base * t_col_base);
628template <
int FIELD_DIM,
typename OpBase>
634 auto integrate = [&](
auto &mat) {
637 auto t_w = OpBase::getFTensor0IntegrationWeight();
641 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
644 auto get_t_vec = [&](
const int rr) {
645 std::array<double *, FIELD_DIM> ptrs;
647 ptrs[
i] = &mat(rr +
i,
i);
654 const double beta = betaCoeff(t_coords(0), t_coords(1), t_coords(2));
656 const double alpha = t_w * beta;
667 t_vec(
i) += alpha * (t_row_base * t_col_base);
687template <
int FIELD_DIM,
typename OpBase>
693 size_t nb_base_functions = row_data.
getN().size2() / 3;
695 const double vol = OpBase::getMeasure();
697 auto t_w = OpBase::getFTensor0IntegrationWeight();
701 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
704 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
706 const double alpha = t_w * beta;
716 (*a_mat_ptr) += alpha * (t_row_base(
i) * t_col_base(
i));
722 for (; rr < nb_base_functions; ++rr)
730template <
typename OpBase>
737 auto get_t_vec = [&](
const int rr) {
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;
760 auto t_vec = get_t_vec(2 * rr);
764 t_vec(
I) += alpha * (t_row_base(
k) * t_col_base(
k));
770 for (; rr < nb_base_functions; ++rr)
778template <
typename OpBase>
785 auto get_t_vec = [&](
const int rr) {
790 size_t nb_base_functions = row_data.
getN().size2() / 3;
792 const double vol = OpBase::getMeasure();
794 auto t_w = OpBase::getFTensor0IntegrationWeight();
798 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
801 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
803 const double alpha = t_w * beta;
809 auto t_vec = get_t_vec(3 * rr);
813 t_vec(
i) += alpha * (t_row_base(
k) * t_col_base(
k));
819 for (; rr < nb_base_functions; ++rr)
827template <
int FIELD_DIM, IntegrationType I,
typename OpBase>
833 const auto vol = this->getMeasure();
834 const auto row_type = this->rowType;
835 const auto col_type = this->colType;
836 auto &loc_mat = this->locMat;
838 auto p = std::make_pair(row_type, col_type);
840 if (cacheLocMats[p]) {
841 if (cacheLocMats[p]->size1() != loc_mat.size1() &&
842 cacheLocMats[p]->size2() != loc_mat.size2()) {
843 cacheLocMats[p]->resize(loc_mat.size1(), loc_mat.size2());
844 CHKERR this->integrateImpl(row_data, col_data, 1);
845 *(cacheLocMats[p]) = loc_mat;
847 loc_mat = *(cacheLocMats[p]);
849 loc_mat *= scalarBeta * this->getMeasure();
851 CHKERR this->integrateImpl(row_data, col_data,
852 scalarBeta * this->getMeasure());
857template <
int SPACE_DIM,
int S,
typename OpBase>
864 const size_t nb_row_dofs = row_data.
getIndices().size();
865 const size_t nb_col_dofs = col_data.
getIndices().size();
867 if (nb_row_dofs && nb_col_dofs) {
878 double vol = OpBase::getMeasure();
881 auto t_w = OpBase::getFTensor0IntegrationWeight();
892 auto t_D_at_pts = get_D_at_pts();
895 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
901 double a = t_w * vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
908 auto t_m = OpBase::template getLocMat<SPACE_DIM>(
SPACE_DIM * rr);
914 t_rowD(
l,
j,
k) = t_D_at_pts(
i,
j,
k,
l) * (
a * t_row_diff_base(
i));
921 for (
int cc = 0; cc <= nb_cols; ++cc) {
924 t_m(
i,
j) += t_rowD(
i,
j,
k) * t_col_diff_base(
k);
949 auto t_m_rr = getFTensor2FromArray<SPACE_DIM, SPACE_DIM, SPACE_DIM>(
951 auto t_m_cc = getFTensor2FromArray<SPACE_DIM, SPACE_DIM>(
955 t_m_rr(
i,
j) = t_m_cc(
j,
i);
966template <
int FIELD_DIM,
int SPACE_DIM,
int S,
typename OpBase>
982 auto &row_hessian = row_data.
getN(BaseDerivatives::SecondDerivative);
983 auto &col_hessian = col_data.
getN(BaseDerivatives::SecondDerivative);
988 "Wrong number of integration pts (%zu != %d)", row_hessian.size1(),
991 if (row_hessian.size2() !=
994 "Wrong number of base functions (%zu != %d)",
1000 "Wrong number of base functions (%zu < %d)", row_hessian.size2(),
1005 "Wrong number of integration pts (%zu != %d)", col_hessian.size1(),
1010 "Wrong number of base functions (%zu < %d)", col_hessian.size2(),
1016 double vol = OpBase::getMeasure();
1019 auto t_w = OpBase::getFTensor0IntegrationWeight();
1021 auto t_row_diff2 = getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(
1022 &*row_hessian.data().begin());
1030 auto t_D_at_pts = get_D_at_pts();
1037 double a = t_w * vol;
1043 auto t_mat = getFTensor2FromPtr<FIELD_DIM, FIELD_DIM, FIELD_DIM>(
1047 t_rowD(
k,
l) = t_D_at_pts(
i,
j,
k,
l) * (
a * t_row_diff2(
i,
j));
1051 getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(&col_hessian(gg, 0));
1057 t_mat(
I,
J) += (t_rowD(
i,
j) * t_col_diff2(
i,
j)) *
t_kd(
I,
J);
1082template <
int FIELD_DIM,
int SPACE_DIM,
int S,
typename OpBase>
1098 auto &row_hessian = row_data.
getN(BaseDerivatives::SecondDerivative);
1099 auto &col_hessian = col_data.
getN(BaseDerivatives::SecondDerivative);
1104 "Wrong number of integration pts (%zu != %d)", row_hessian.size1(),
1107 if (row_hessian.size2() !=
1110 "Wrong number of base functions (%zu != %d)",
1116 "Wrong number of base functions (%zu < %d)", row_hessian.size2(),
1121 "Wrong number of integration pts (%zu != %d)", col_hessian.size1(),
1126 "Wrong number of base functions (%zu < %d)", col_hessian.size2(),
1132 double vol = OpBase::getMeasure();
1135 auto t_w = OpBase::getFTensor0IntegrationWeight();
1137 auto t_row_diff2 = getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(
1138 &*row_hessian.data().begin());
1146 auto t_D_at_pts = get_D_at_pts();
1154 double a = t_w * vol;
1164 t_rowD(
k,
l) = t_D_at_pts(
i,
j,
k,
l) * (
a * t_row_diff2(
i,
j));
1168 getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(&col_hessian(gg, 0));
1170 auto t_mat = getFTensor2FromPtr<FIELD_DIM, FIELD_DIM, FIELD_DIM>(
1177 t_mat(
I,
J) += (t_rowD(
i,
j) * t_col_diff2(
i,
j)) *
t_kd(
I,
J);
1202template <
int SPACE_DIM,
int S,
typename OpBase>
1209 const size_t nb_row_dofs = row_data.
getIndices().size();
1210 const size_t nb_col_dofs = col_data.
getIndices().size();
1212 if (nb_row_dofs && nb_col_dofs) {
1220 double vol = OpBase::getMeasure();
1223 auto t_w = OpBase::getFTensor0IntegrationWeight();
1234 auto t_D_at_pts = get_D_at_pts();
1237 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
1243 double a = t_w * vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
1250 auto t_m = OpBase::template getLocMat<SPACE_DIM>(
SPACE_DIM * rr);
1254 t_row(
i,
k,
l) = t_D_at_pts(
i,
j,
k,
l) * (
a * t_row_diff_base(
j));
1263 t_m(
i,
k) += t_row(
i,
k,
l) * t_col_diff_base(
l);
1289template <
int SPACE_DIM,
typename OpBase>
1295 auto t_w = this->getFTensor0IntegrationWeight();
1297 size_t nb_base_functions = row_data.
getN().size2() / 3;
1300 const double alpha_constant = alphaConstant();
1303 const double alpha = alpha_constant * this->getMeasure() * t_w;
1307 const double t_row_div_base = t_row_diff_base(
i,
i);
1310 this->locMat(rr, cc) += alpha * t_row_div_base * t_col_base;
1315 for (; rr < nb_base_functions; ++rr)
1324template <
int SPACE_DIM,
typename OpBase, CoordinateTypes CoordSys>
1331 auto t_w = this->getFTensor0IntegrationWeight();
1332 auto t_coords = this->getFTensor1CoordsAtGaussPts();
1334 size_t nb_base_functions = row_data.
getN().size2() / 3;
1337 const double alpha_constant = alphaConstant() * this->getMeasure();
1340 const double alpha =
1341 alpha_constant * t_w * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
1345 auto t_mat_diag = getFTensor1FromArrayDiag<SPACE_DIM, SPACE_DIM>(
1347 const double t_row_div_base = t_row_diff_base(
i,
i);
1351 t_mat_diag(
i) += alpha * t_row_div_base * t_col_base;
1353 t_mat_diag(
i) += t_row_base(0) * (alpha / t_coords(0)) * t_col_base;
1361 for (; rr < nb_base_functions; ++rr) {
1373template <
int SPACE_DIM,
typename OpBase, CoordinateTypes COORDINATE_SYSTEM>
1383 "Number of rows in matrix should be multiple of space dimensions");
1387 if constexpr (COORDINATE_SYSTEM ==
POLAR || COORDINATE_SYSTEM ==
SPHERICAL)
1389 "%s coordiante not implemented",
1392 auto t_w = this->getFTensor0IntegrationWeight();
1393 auto t_coords = this->getFTensor1CoordsAtGaussPts();
1394 size_t nb_base_functions_row = row_data.
getN().size2();
1396 const double vol = this->getMeasure();
1399 const double alpha =
1400 alphaConstant(t_coords(0), t_coords(1), t_coords(2)) * t_w * vol;
1403 auto t_m = getFTensor1FromPtr<SPACE_DIM>(
OpBase::locMat.data().data());
1406 if constexpr (COORDINATE_SYSTEM ==
CARTESIAN) {
1408 const double r_val = alpha * t_row_base;
1411 t_m(
i) += r_val * t_col_diff_base(
i);
1422 const double r_val = alpha * t_row_base;
1426 t_m(
i) += r_val * t_col_diff_base(
i);
1427 t_m(0) += (r_val / t_coords(0)) * t_col_base;
1436 for (; rr < nb_base_functions_row; ++rr)
1446template <
int SPACE_DIM,
typename OpBase>
1453 auto t_w = this->getFTensor0IntegrationWeight();
1455 size_t nb_base_functions = row_data.
getN().size2() / 3;
1457 auto &mat = this->locMat;
1458 const double alpha_constant = alphaConstant();
1461 const double alpha = alpha_constant * this->getMeasure() * t_w;
1467 mat(rr, cc) += alpha * t_row_base(
i) * t_col_diff_base(
i);
1472 for (; rr < nb_base_functions; ++rr)
1481template <
int SPACE_DIM,
typename OpBase>
1488 auto t_w = this->getFTensor0IntegrationWeight();
1490 size_t nb_base_functions = row_data.
getN().size2();
1493 auto get_t_vec = [&](
const int rr) {
1494 std::array<double *, SPACE_DIM> ptrs;
1500 const double alpha_constant = alphaConstant();
1503 const double alpha = alpha_constant * this->getMeasure() * t_w;
1510 t_vec(
i) += alpha * t_row_base * t_col_diff_base(
i);
1516 for (; rr < nb_base_functions; ++rr)
1525template <
int SPACE_DIM,
typename OpBase>
1531 auto t_w = this->getFTensor0IntegrationWeight();
1532 auto t_coords = this->getFTensor1CoordsAtGaussPts();
1534 size_t nb_base_functions = row_data.
getN().size2() / 3;
1536 const double alpha_constant = alphaConstant() * this->getMeasure();
1539 const double alpha =
1540 alpha_constant * betaCoeff(t_coords(0), t_coords(1), t_coords(2)) * t_w;
1544 auto t_mat_diag = getFTensor1FromArrayDiag<SPACE_DIM, SPACE_DIM>(
1549 t_mat_diag(
i) += alpha * t_row_base(
j) * t_col_diff_base(
j);
1556 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 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)
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)