1383 {
1391
1393
1394
1395 const double vol = OP::getMeasure();
1396
1397 auto t_w = OP::getFTensor0IntegrationWeight();
1398
1399 auto t_jac = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(
jac));
1400
1401 auto t_diff_jac = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(
diffJac));
1402
1404
1405 auto t_row_grad = row_data.getFTensor1DiffN<
SPACE_DIM>();
1406
1407 auto t_grad_u =
1408 getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(
commPtr->matGradPtr));
1409
1410 auto t_cauchy_stress =
1411 getFTensor2SymmetricFromMat<SPACE_DIM>(*(
commPtr->getMatCauchyStress()));
1412
1413 auto t_D =
1414 getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, 0>(*(
commPtr->matDPtr));
1415
1416 for (int gg = 0; gg != OP::nbIntegrationPts; gg++) {
1417
1418 const double alpha = t_w * vol;
1419
1423
1424
1426 t_diff_inv_jac(
i,
j) =
1427 -(t_inv_jac(
i,
I) * t_diff_jac(
I,
J)) * t_inv_jac(
J,
j);
1429 t_diff_grad(
i,
j) = t_grad_u(
i,
k) * t_diff_inv_jac(
k,
j);
1430
1431
1433 t_diff_strain(
i,
j) = t_diff_symm(
i,
j,
k,
l) * t_diff_grad(
k,
l);
1434
1435
1437 t_diff_stress(
i,
j) = t_D(
i,
j,
k,
l) * t_diff_strain(
k,
l);
1438
1439
1440 auto t_nf = OP::template getNf<SPACE_DIM>();
1441
1442 int rr = 0;
1443 for (; rr != OP::nbRows /
SPACE_DIM; rr++) {
1444
1446 t_diff_row_grad(
k) = t_row_grad(
j) * t_diff_inv_jac(
j,
k);
1447
1448
1449 t_nf(
j) += alpha * t_diff_row_grad(
i) * t_cauchy_stress(
i,
j);
1450
1451
1452 t_nf(
j) += (alpha * t_cof) * t_row_grad(
i) * t_cauchy_stress(
i,
j);
1453
1454
1455 t_nf(
j) += alpha * t_row_grad(
i) * t_diff_stress(
i,
j);
1456
1457 ++t_row_grad;
1458 ++t_nf;
1459 }
1460 for (; rr < OP::nbRowBaseFunctions; ++rr) {
1461 ++t_row_grad;
1462 }
1463
1464 ++t_grad_u;
1465 ++t_cauchy_stress;
1466 ++t_jac;
1467 ++t_diff_jac;
1468 ++t_cof;
1469 ++t_w;
1470 }
1472}
#define FTENSOR_INDEX(DIM, I)
auto diff_symmetrize(FTensor::Number< DIM >)
constexpr int SPACE_DIM
[Define dimension]
constexpr IntegrationType I
Use Gauss quadrature for integration.
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
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
static MoFEMErrorCode invertTensor(FTensor::Tensor2< T1, DIM, DIM > &t, T2 &det, FTensor::Tensor2< T3, DIM, DIM > &inv_t)
static auto determinantTensor(FTensor::Tensor2< T, DIM, DIM > &t)
Calculate the determinant of a tensor of rank DIM.
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.