Compute objective function contributions at element level.
Evaluates Python objective function with current displacement and stress state, and accumulates global objective value and gradients.
1619 {
1621
1622
1627
1630
1632 2;
1633
1634 auto t_diff_symm = FTensor::diff_symmetrize<double>();
1635
1636
1637 auto nb_gauss_pts =
1638 getGaussPts().size2();
1639 auto objective_ptr = boost::make_shared<MatrixDouble>(
1640 1, nb_gauss_pts);
1641 auto objective_dstress = boost::make_shared<MatrixDouble>(
1642 nb_gauss_pts,
1643 symm_size);
1644 auto objective_dstrain = boost::make_shared<MatrixDouble>(
1645 nb_gauss_pts,
1646 symm_size);
1647 auto objective_du =
1648 boost::make_shared<MatrixDouble>(nb_gauss_pts,
SPACE_DIM);
1649
1650
1651 auto evaluate_python = [&]() {
1653 auto &coords = OP::getCoordsAtGaussPts();
1656 objective_ptr);
1659 objective_dstress);
1662 objective_dstrain);
1665 objective_du);
1666
1667 auto t_grad_u =
1668 getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(
commPtr->matGradPtr));
1669 auto t_D =
1670 getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, 0>(*(
commPtr->matDPtr));
1671 auto t_jac = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(
jacPtr));
1672 auto t_diff_jac = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(
diffJacPtr));
1674 auto t_d_grad = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(
dGradPtr));
1675
1677 auto t_obj_dstress =
1678 getFTensor2SymmetricFromMat<SPACE_DIM>(*objective_dstress);
1679 auto t_obj_dstrain =
1680 getFTensor2SymmetricFromMat<SPACE_DIM>(*objective_dstrain);
1681 auto t_obj_du = getFTensor1FromMat<SPACE_DIM>(*objective_du);
1682 auto t_d_u = getFTensor1FromMat<SPACE_DIM>(*
dUPtr);
1683
1684 auto vol = OP::getMeasure();
1685 auto t_w = getFTensor0IntegrationWeight();
1686 for (auto gg = 0; gg != nb_gauss_pts; ++gg) {
1687
1691
1693 t_diff_inv_jac(
i,
j) =
1694 -(t_inv_jac(
i,
I) * t_diff_jac(
I,
J)) * t_inv_jac(
J,
j);
1696 t_diff_grad(
i,
j) = t_grad_u(
i,
k) * t_diff_inv_jac(
k,
j);
1697
1699 t_d_strain(
i,
j) = t_diff_symm(
i,
j,
k,
l) * (
1700
1702
1703 +
1704
1706
1707 );
1708
1709 auto alpha = t_w * vol;
1710
1711 (*globObjectivePtr) += alpha * t_obj;
1712 (*globObjectiveGradPtr) +=
1713 alpha *
1714 (
1715
1716 t_obj_dstress(
i,
j) * (t_D(
i,
j,
k,
l) * t_d_strain(
k,
l))
1717
1718 +
1719
1720 t_obj_dstrain(
i,
j) * t_d_strain(
i,
j)
1721
1722 +
1723
1724 t_obj_du(
i) * t_d_u(
i)
1725
1726 +
1727
1728 t_obj * t_cof
1729
1730 );
1731
1732 ++t_w;
1733 ++t_jac;
1734 ++t_diff_jac;
1735 ++t_cof;
1736
1737 ++t_obj;
1738 ++t_obj_dstress;
1739 ++t_obj_dstrain;
1740 ++t_obj_du;
1741
1742 ++t_grad_u;
1743 ++t_d_grad;
1744 ++t_d_u;
1745 }
1747 };
1748
1749 CHKERR evaluate_python();
1750
1752 }
#define FTENSOR_INDEX(DIM, I)
#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.
constexpr int SPACE_DIM
[Define dimension]
constexpr IntegrationType I
Use Gauss quadrature for integration.
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.
auto getFTensor0FromMat(M &data)
Get tensor rank 0 (scalar) form data vector.
static auto getFTensor0FromVec(V &data)
Get tensor rank 0 (scalar) form data vector.