Compute objective function contributions at element level.
Evaluates Python objective function with current displacement and stress state, and accumulates global objective value and gradients.
1818 {
1820
1821
1826
1829
1831
1833
1834 auto nb_gauss_pts = getGaussPts().size2();
1835 auto objective_ptr = boost::make_shared<VectorDouble>(nb_gauss_pts);
1836 auto objective_dstress =
1837 boost::make_shared<MatrixDouble>(symm_size, nb_gauss_pts);
1838 auto objective_dstrain =
1839 boost::make_shared<MatrixDouble>(symm_size, nb_gauss_pts);
1840 auto obj_grad = boost::make_shared<MatrixDouble>(
SPACE_DIM, nb_gauss_pts);
1841
1842 auto evaluate_python = [&]() {
1844 auto &coords = OP::getCoordsAtGaussPts();
1847 objective_ptr);
1850 objective_dstress);
1853 objective_dstrain);
1854
1855 auto t_grad_u =
1856 getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(
commPtr->matGradPtr));
1857 auto t_D =
1858 getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, 0>(*(
commPtr->matDPtr));
1859 auto t_jac = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(
jacPtr));
1860 auto t_diff_jac = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(
diffJacPtr));
1862 auto t_d_grad = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(
dGradPtr));
1863
1865 auto t_obj_dstress =
1866 getFTensor2SymmetricFromMat<SPACE_DIM>(*objective_dstress);
1867 auto t_obj_dstrain =
1868 getFTensor2SymmetricFromMat<SPACE_DIM>(*objective_dstrain);
1869
1870 auto vol = OP::getMeasure();
1871 auto t_w = getFTensor0IntegrationWeight();
1872 for (auto gg = 0; gg != nb_gauss_pts; ++gg) {
1873
1877
1879 t_diff_inv_jac(
i,
j) =
1880 -(t_inv_jac(
i,
I) * t_diff_jac(
I,
J)) * t_inv_jac(
J,
j);
1882 t_diff_grad(
i,
j) = t_grad_u(
i,
k) * t_diff_inv_jac(
k,
j);
1883
1885 t_d_strain(
i,
j) = t_diff_symm(
i,
j,
k,
l) * (
1886
1888
1889 +
1890
1892
1893 );
1894
1895 auto alpha = t_w * vol;
1896
1897 (*globObjectivePtr) += alpha * t_obj;
1898 (*globObjectiveGradPtr) +=
1899 alpha *
1900 (
1901
1902 t_obj_dstress(
i,
j) * (t_D(
i,
j,
k,
l) * t_d_strain(
k,
l))
1903
1904 +
1905
1906 t_obj_dstrain(
i,
j) * t_d_strain(
i,
j)
1907
1908 +
1909
1910 t_obj * t_cof
1911
1912 );
1913
1914 ++t_w;
1915 ++t_jac;
1916 ++t_diff_jac;
1917 ++t_cof;
1918
1919 ++t_obj;
1920 ++t_obj_dstress;
1921 ++t_obj_dstrain;
1922
1923 ++t_grad_u;
1924 ++t_d_grad;
1925 }
1927 };
1928
1929 CHKERR evaluate_python();
1930
1932 }
#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.