1368 {
1376
1377 auto t_diff_symm = FTensor::diff_symmetrize<double>();
1378
1379
1380 const double vol = OP::getMeasure();
1381
1382 auto t_w = OP::getFTensor0IntegrationWeight();
1383
1384 auto t_jac = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(
jac));
1385
1386 auto t_diff_jac = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(
diffJac));
1387
1389
1390 auto t_row_grad = row_data.getFTensor1DiffN<
SPACE_DIM>();
1391
1392 auto t_grad_u =
1393 getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(
commPtr->matGradPtr));
1394
1395 auto t_cauchy_stress =
1396 getFTensor2SymmetricFromMat<SPACE_DIM>(*(
commPtr->getMatCauchyStress()));
1397
1398 auto t_D =
1399 getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, 0>(*(
commPtr->matDPtr));
1400
1401 for (int gg = 0; gg != OP::nbIntegrationPts; gg++) {
1402
1403 const double alpha = t_w * vol;
1404
1408
1409
1411 t_diff_inv_jac(
i,
j) =
1412 -(t_inv_jac(
i,
I) * t_diff_jac(
I,
J)) * t_inv_jac(
J,
j);
1414 t_diff_grad(
i,
j) = t_grad_u(
i,
k) * t_diff_inv_jac(
k,
j);
1415
1416
1418 t_diff_strain(
i,
j) = t_diff_symm(
i,
j,
k,
l) * t_diff_grad(
k,
l);
1419
1420
1422 t_diff_stress(
i,
j) = t_D(
i,
j,
k,
l) * t_diff_strain(
k,
l);
1423
1424
1425 auto t_nf = OP::template getNf<SPACE_DIM>();
1426
1427 int rr = 0;
1428 for (; rr != OP::nbRows /
SPACE_DIM; rr++) {
1429
1431 t_diff_row_grad(
k) = t_row_grad(
j) * t_diff_inv_jac(
j,
k);
1432
1433
1434 t_nf(
j) += alpha * t_diff_row_grad(
i) * t_cauchy_stress(
i,
j);
1435
1436
1437 t_nf(
j) += (alpha * t_cof) * t_row_grad(
i) * t_cauchy_stress(
i,
j);
1438
1439
1440 t_nf(
j) += alpha * t_row_grad(
i) * t_diff_stress(
i,
j);
1441
1442 ++t_row_grad;
1443 ++t_nf;
1444 }
1445 for (; rr < OP::nbRowBaseFunctions; ++rr) {
1446 ++t_row_grad;
1447 }
1448
1449 ++t_grad_u;
1450 ++t_cauchy_stress;
1451 ++t_jac;
1452 ++t_diff_jac;
1453 ++t_cof;
1454 ++t_w;
1455 }
1457}
#define FTENSOR_INDEX(DIM, I)
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(V &data)
Get tensor rank 0 (scalar) form data vector.