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 %lu < %d",
574 "Wrong number of base functions on cols %lu < %d",
580 "Wrong number of integration points on rows %lu != %d",
586 "Wrong number of integration points on cols %lu != %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();
888 auto t_D = getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, S>(*matD);
891 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
897 double a = t_w * vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
904 auto t_m = OpBase::template getLocMat<SPACE_DIM>(
SPACE_DIM * rr);
910 t_rowD(
l,
j,
k) = t_D(
i,
j,
k,
l) * (
a * t_row_diff_base(
i));
917 for (
int cc = 0; cc <= nb_cols; ++cc) {
920 t_m(
i,
j) += t_rowD(
i,
j,
k) * t_col_diff_base(
k);
945 auto t_m_rr = getFTensor2FromArray<SPACE_DIM, SPACE_DIM, SPACE_DIM>(
947 auto t_m_cc = getFTensor2FromArray<SPACE_DIM, SPACE_DIM>(
951 t_m_rr(
i,
j) = t_m_cc(
j,
i);
962template <
int FIELD_DIM,
int SPACE_DIM,
int S,
typename OpBase>
978 auto &row_hessian = row_data.
getN(BaseDerivatives::SecondDerivative);
979 auto &col_hessian = col_data.
getN(BaseDerivatives::SecondDerivative);
984 "Wrong number of integration pts (%d != %d)", row_hessian.size1(),
987 if (row_hessian.size2() !=
990 "Wrong number of base functions (%d != %d)",
996 "Wrong number of base functions (%d < %d)", row_hessian.size2(),
1001 "Wrong number of integration pts (%d != %d)", col_hessian.size1(),
1006 "Wrong number of base functions (%d < %d)", col_hessian.size2(),
1012 double vol = OpBase::getMeasure();
1015 auto t_w = OpBase::getFTensor0IntegrationWeight();
1017 auto t_row_diff2 = getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(
1018 &*row_hessian.data().begin());
1022 auto t_D = getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, S>(*matD);
1029 double a = t_w * vol;
1035 auto t_mat = getFTensor2FromPtr<FIELD_DIM, FIELD_DIM, FIELD_DIM>(
1039 t_rowD(
k,
l) = t_D(
i,
j,
k,
l) * (
a * t_row_diff2(
i,
j));
1043 getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(&col_hessian(gg, 0));
1049 t_mat(
I,
J) += (t_rowD(
i,
j) * t_col_diff2(
i,
j)) *
t_kd(
I,
J);
1074template <
int FIELD_DIM,
int SPACE_DIM,
int S,
typename OpBase>
1090 auto &row_hessian = row_data.
getN(BaseDerivatives::SecondDerivative);
1091 auto &col_hessian = col_data.
getN(BaseDerivatives::SecondDerivative);
1096 "Wrong number of integration pts (%d != %d)", row_hessian.size1(),
1099 if (row_hessian.size2() !=
1102 "Wrong number of base functions (%d != %d)",
1108 "Wrong number of base functions (%d < %d)", row_hessian.size2(),
1113 "Wrong number of integration pts (%d != %d)", col_hessian.size1(),
1118 "Wrong number of base functions (%d < %d)", col_hessian.size2(),
1124 double vol = OpBase::getMeasure();
1127 auto t_w = OpBase::getFTensor0IntegrationWeight();
1129 auto t_row_diff2 = getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(
1130 &*row_hessian.data().begin());
1133 auto t_D = getFTensor4FromMat<SPACE_DIM, SPACE_DIM, S>(*matD);
1141 double a = t_w * vol;
1151 t_rowD(
k,
l) = t_D(
i,
j,
k,
l) * (
a * t_row_diff2(
i,
j));
1155 getFTensor2SymmetricLowerFromPtr<SPACE_DIM>(&col_hessian(gg, 0));
1157 auto t_mat = getFTensor2FromPtr<FIELD_DIM, FIELD_DIM, FIELD_DIM>(
1164 t_mat(
I,
J) += (t_rowD(
i,
j) * t_col_diff2(
i,
j)) *
t_kd(
I,
J);
1189template <
int SPACE_DIM,
int S,
typename OpBase>
1196 const size_t nb_row_dofs = row_data.
getIndices().size();
1197 const size_t nb_col_dofs = col_data.
getIndices().size();
1199 if (nb_row_dofs && nb_col_dofs) {
1207 double vol = OpBase::getMeasure();
1210 auto t_w = OpBase::getFTensor0IntegrationWeight();
1217 getFTensor4FromMat<SPACE_DIM, SPACE_DIM, SPACE_DIM, SPACE_DIM, S>(
1221 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
1227 double a = t_w * vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
1234 auto t_m = OpBase::template getLocMat<SPACE_DIM>(
SPACE_DIM * rr);
1238 t_row(
i,
k,
l) = t_D(
i,
j,
k,
l) * (
a * t_row_diff_base(
j));
1247 t_m(
i,
k) += t_row(
i,
k,
l) * t_col_diff_base(
l);
1273template <
int SPACE_DIM,
typename OpBase>
1279 auto t_w = this->getFTensor0IntegrationWeight();
1281 size_t nb_base_functions = row_data.
getN().size2() / 3;
1284 const double alpha_constant = alphaConstant();
1287 const double alpha = alpha_constant * this->getMeasure() * t_w;
1291 const double t_row_div_base = t_row_diff_base(
i,
i);
1294 this->locMat(rr, cc) += alpha * t_row_div_base * t_col_base;
1299 for (; rr < nb_base_functions; ++rr)
1308template <
int SPACE_DIM,
typename OpBase, CoordinateTypes CoordSys>
1315 auto t_w = this->getFTensor0IntegrationWeight();
1316 auto t_coords = this->getFTensor1CoordsAtGaussPts();
1318 size_t nb_base_functions = row_data.
getN().size2() / 3;
1321 const double alpha_constant = alphaConstant() * this->getMeasure();
1324 const double alpha =
1325 alpha_constant * t_w * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
1329 auto t_mat_diag = getFTensor1FromArrayDiag<SPACE_DIM, SPACE_DIM>(
1331 const double t_row_div_base = t_row_diff_base(
i,
i);
1335 t_mat_diag(
i) += alpha * t_row_div_base * t_col_base;
1337 t_mat_diag(
i) += t_row_base(0) * (alpha / t_coords(0)) * t_col_base;
1345 for (; rr < nb_base_functions; ++rr) {
1357template <
int SPACE_DIM,
typename OpBase, CoordinateTypes COORDINATE_SYSTEM>
1367 "Number of rows in matrix should be multiple of space dimensions");
1371 if constexpr (COORDINATE_SYSTEM ==
POLAR || COORDINATE_SYSTEM ==
SPHERICAL)
1373 "%s coordiante not implemented",
1376 auto t_w = this->getFTensor0IntegrationWeight();
1377 auto t_coords = this->getFTensor1CoordsAtGaussPts();
1378 size_t nb_base_functions_row = row_data.
getN().size2();
1380 const double vol = this->getMeasure();
1383 const double alpha =
1384 alphaConstant(t_coords(0), t_coords(1), t_coords(2)) * t_w * vol;
1387 auto t_m = getFTensor1FromPtr<SPACE_DIM>(
OpBase::locMat.data().data());
1390 if constexpr (COORDINATE_SYSTEM ==
CARTESIAN) {
1392 const double r_val = alpha * t_row_base;
1395 t_m(
i) += r_val * t_col_diff_base(
i);
1406 const double r_val = alpha * t_row_base;
1410 t_m(
i) += r_val * t_col_diff_base(
i);
1411 t_m(0) += (r_val / t_coords(0)) * t_col_base;
1420 for (; rr < nb_base_functions_row; ++rr)
1430template <
int SPACE_DIM,
typename OpBase>
1437 auto t_w = this->getFTensor0IntegrationWeight();
1439 size_t nb_base_functions = row_data.
getN().size2() / 3;
1441 auto &mat = this->locMat;
1442 const double alpha_constant = alphaConstant();
1445 const double alpha = alpha_constant * this->getMeasure() * t_w;
1451 mat(rr, cc) += alpha * t_row_base(
i) * t_col_diff_base(
i);
1456 for (; rr < nb_base_functions; ++rr)
1465template <
int SPACE_DIM,
typename OpBase>
1472 auto t_w = this->getFTensor0IntegrationWeight();
1474 size_t nb_base_functions = row_data.
getN().size2();
1477 auto get_t_vec = [&](
const int rr) {
1478 std::array<double *, SPACE_DIM> ptrs;
1484 const double alpha_constant = alphaConstant();
1487 const double alpha = alpha_constant * this->getMeasure() * t_w;
1494 t_vec(
i) += alpha * t_row_base * t_col_diff_base(
i);
1500 for (; rr < nb_base_functions; ++rr)
1509template <
int SPACE_DIM,
typename OpBase>
1515 auto t_w = this->getFTensor0IntegrationWeight();
1516 auto t_coords = this->getFTensor1CoordsAtGaussPts();
1518 size_t nb_base_functions = row_data.
getN().size2() / 3;
1520 const double alpha_constant = alphaConstant() * this->getMeasure();
1523 const double alpha =
1524 alpha_constant * betaCoeff(t_coords(0), t_coords(1), t_coords(2)) * t_w;
1528 auto t_mat_diag = getFTensor1FromArrayDiag<SPACE_DIM, SPACE_DIM>(
1533 t_mat_diag(
i) += alpha * t_row_base(
j) * t_col_diff_base(
j);
1540 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
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::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > getFTensor1DiffN(const FieldApproximationBase base)
Get derivatives of base functions.
FTensor::Tensor0< FTensor::PackPtr< double *, 1 > > getFTensor0N(const FieldApproximationBase base)
Get base function as Tensor0.
const VectorFieldEntities & getFieldEntities() const
Get field entities (const version)
MatrixDouble & getN(const FieldApproximationBase base)
get base functions this return matrix (nb. of rows is equal to nb. of Gauss pts, nb....
FTensor::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > 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)