v0.16.0
Loading...
Searching...
No Matches
Public Member Functions | Private Attributes | List of all members
EshelbianPlasticity::HMHStorakers::OpCalculateStretchFromStress Struct Reference

Evaluate Storakers stretch and its tangent from the supplied stress. More...

Inheritance diagram for EshelbianPlasticity::HMHStorakers::OpCalculateStretchFromStress:
[legend]
Collaboration diagram for EshelbianPlasticity::HMHStorakers::OpCalculateStretchFromStress:
[legend]

Public Member Functions

 OpCalculateStretchFromStress (boost::shared_ptr< DataAtIntegrationPts > data_ptr, boost::shared_ptr< MatrixDouble > strain_ptr, boost::shared_ptr< MatrixDouble > stress_ptr, boost::shared_ptr< HMHStorakers > storakers_ptr, VectorPtr external_pressure_ptr)
 
MoFEMErrorCode doWork (int side, EntityType type, EntData &data) override
 

Private Attributes

boost::shared_ptr< DataAtIntegrationPtsdataAtPts
 
boost::shared_ptr< MatrixDouble > strainPtr
 
boost::shared_ptr< MatrixDouble > stressPtr
 
boost::shared_ptr< HMHStorakersstorakersPtr
 
VectorPtr externalPressurePtr
 

Detailed Description

Evaluate Storakers stretch and its tangent from the supplied stress.

Definition at line 1172 of file HMHStorakers.cpp.

Constructor & Destructor Documentation

◆ OpCalculateStretchFromStress()

EshelbianPlasticity::HMHStorakers::OpCalculateStretchFromStress::OpCalculateStretchFromStress ( boost::shared_ptr< DataAtIntegrationPts data_ptr,
boost::shared_ptr< MatrixDouble >  strain_ptr,
boost::shared_ptr< MatrixDouble >  stress_ptr,
boost::shared_ptr< HMHStorakers storakers_ptr,
VectorPtr  external_pressure_ptr 
)

Definition at line 1707 of file HMHStorakers.cpp.

1713 : VolUserDataOperator(H1, OPLAST), dataAtPts(std::move(data_ptr)),
1714 strainPtr(std::move(strain_ptr)), stressPtr(std::move(stress_ptr)),
1715 storakersPtr(std::move(storakers_ptr)),
1716 externalPressurePtr(std::move(external_pressure_ptr)) {
1717 std::fill(&doEntities[MBVERTEX], &doEntities[MBMAXTYPE], false);
1718 doEntities[MBVERTEX] = true;
1719}
@ H1
continuous field
Definition definitions.h:85
VolumeElementForcesAndSourcesCore::UserDataOperator VolUserDataOperator

Member Function Documentation

◆ doWork()

MoFEMErrorCode EshelbianPlasticity::HMHStorakers::OpCalculateStretchFromStress::doWork ( int  side,
EntityType  type,
EntData data 
)
override

Definition at line 1722 of file HMHStorakers.cpp.

1722 {
1724
1725 if (!dataAtPts || !strainPtr || !stressPtr || !storakersPtr) {
1726 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1727 "Invalid data passed to Storakers stretch-from-stress operator");
1728 }
1730
1731 const int nb_integration_pts = stressPtr->size1();
1732#ifndef NDEBUG
1733 if (nb_integration_pts != getGaussPts().size2()) {
1734 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1735 "Inconsistent number of Storakers integration points");
1736 }
1737#endif
1738 if (externalPressurePtr &&
1739 externalPressurePtr->size() != nb_integration_pts) {
1740 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1741 "Inconsistent number of external-pressure integration points");
1742 }
1743
1744 MatrixSizeHelper<GetFTensor2SymmetricFromMatType<SPACE_DIM, -1, DL>,
1745 DL>::size(*strainPtr, nb_integration_pts);
1746 MatrixSizeHelper<GetFTensor2SymmetricFromMatType<SPACE_DIM, -1, DL>,
1747 DL>::size(*dataAtPts->getStretchTensorAtPts(),
1748 nb_integration_pts);
1749 MatrixSizeHelper<GetFTensor4DdgFromMatType<SPACE_DIM, SPACE_DIM, -1, DL>,
1750 DL>::size(*dataAtPts->getDiffStretchTensorAtPts(),
1751 nb_integration_pts);
1752 MatrixSizeHelper<GetFTensor1FromMatType<SPACE_DIM, -1, DL>, DL>::size(
1753 *dataAtPts->getEigenVals(), nb_integration_pts);
1754 MatrixSizeHelper<GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>,
1755 DL>::size(*dataAtPts->getEigenVecs(), nb_integration_pts);
1756 dataAtPts->nbUniq.resize(nb_integration_pts, false);
1757 MatrixSizeHelper<GetFTensor4DdgFromMatType<SPACE_DIM, SPACE_DIM, -1, DL>,
1758 DL>::size(dataAtPts->matD, nb_integration_pts);
1759 MatrixSizeHelper<GetFTensor4DdgFromMatType<SPACE_DIM, SPACE_DIM, -1, DL>,
1760 DL>::size(dataAtPts->matInvD, nb_integration_pts);
1761 MatrixSizeHelper<GetFTensor2SymmetricFromMatType<SPACE_DIM, -1, DL>,
1762 DL>::size(dataAtPts->logStretch2H1AtPts, nb_integration_pts);
1763 MatrixSizeHelper<GetFTensor2SymmetricFromMatType<SPACE_DIM, -1, DL>,
1764 DL>::size(dataAtPts->logStretchTotalTensorAtPts,
1765 nb_integration_pts);
1766 MatrixSizeHelper<GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>,
1767 DL>::size(dataAtPts->rotMatAtPts, nb_integration_pts);
1768 MatrixSizeHelper<GetFTensor2FromMatType<SPACE_DIM, SPACE_DIM, -1, DL>,
1769 DL>::size(*dataAtPts->getAdjointPdstretchAtPts(),
1770 nb_integration_pts);
1771
1772 strainPtr->clear();
1773 dataAtPts->getStretchTensorAtPts()->clear();
1774 dataAtPts->getDiffStretchTensorAtPts()->clear();
1775 dataAtPts->getEigenVals()->clear();
1776 dataAtPts->getEigenVecs()->clear();
1777 dataAtPts->nbUniq.clear();
1778 dataAtPts->matD.clear();
1779 dataAtPts->matInvD.clear();
1780 dataAtPts->logStretch2H1AtPts.clear();
1781 dataAtPts->logStretchTotalTensorAtPts.clear();
1782
1783 auto t_strain = getFTensor2SymmetricFromMat<SPACE_DIM, -1, DL>(*strainPtr);
1784 auto t_biot_stretch = dataAtPts->getFTensorStretch(nb_integration_pts);
1785 auto t_diff_stretch = dataAtPts->getFTensorDiffStretch(nb_integration_pts);
1786 auto t_stress = getFTensor2FromMat<SPACE_DIM, SPACE_DIM, -1, DL>(*stressPtr);
1787 auto t_omega = dataAtPts->getFTensorRotAxis(nb_integration_pts);
1788 auto t_R = dataAtPts->getFTensorRotMat(nb_integration_pts);
1789 auto t_biot_stress =
1790 dataAtPts->getFTensorAdjointPdstretch(nb_integration_pts);
1791 auto t_eigen_vals = dataAtPts->getFTensorEigenVals(nb_integration_pts);
1792 auto t_eigen_vecs = dataAtPts->getFTensorEigenVecs(nb_integration_pts);
1793 auto t_mat_d =
1794 getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, -1, DL>(dataAtPts->matD);
1795 auto t_mat_inv_d =
1796 getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, -1, DL>(dataAtPts->matInvD);
1797 auto t_log_u2_h1 = dataAtPts->getFTensorLogStretch2H1(nb_integration_pts);
1798 auto t_log_stretch_total =
1799 dataAtPts->getFTensorLogStretchTotal(nb_integration_pts);
1801 dataAtPts->nbUniq.data().data());
1802
1803 const auto parameters =
1804 storakersPtr->getMaterialParameters(getFEEntityHandle());
1805 StressToStrech stress_to_stretch(parameters);
1806 constexpr auto t_diff_sym = FTensor::DiffSymmetrize<double>();
1807 constexpr auto identity = [](const double value) { return value; };
1808
1810 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1811 "Rotation selector not handled by Storakers");
1812 }
1813
1814 for (int gg = 0; gg != nb_integration_pts; ++gg) {
1815 t_R(i, j) = LieGroups::SO3::exp(t_omega, t_omega.l2())(i, j);
1816
1818 t_rotated_stress(i, j) = t_R(k, i) * t_stress(k, j);
1819 t_biot_stress(i, j) = t_diff_sym(i, j, k, l) * t_rotated_stress(k, l);
1820
1821 const double initial_y = stress_to_stretch.getScalarEquationState().y;
1822 const double q = externalPressurePtr ? (*externalPressurePtr)[gg] : 0.;
1823 const auto calculate_error = stress_to_stretch.calculate(
1824 t_biot_stress, t_biot_stretch, t_mat_d, t_mat_inv_d, q);
1825 if (calculate_error) {
1826 // Keep the production diagnostic to one copy-paste line. The atom prints
1827 // the material and spectral state, plus the scalar state on convergence.
1828 std::ostringstream atom_reproducer;
1829 atom_reproducer
1830 << std::scientific
1831 << std::setprecision(std::numeric_limits<double>::max_digits10)
1832 << "./storakers_stress_to_stretch_atom"
1833 << " -storakers_atom_eta " << parameters.eta
1834 << " -storakers_atom_mu " << parameters.mu
1835 << " -storakers_atom_beta " << parameters.beta
1836 << " -storakers_atom_q " << q
1837 << " -storakers_atom_initial_y " << initial_y
1838 << " -storakers_atom_solver_tol "
1839 << stress_to_stretch.absoluteTolerance
1840 << " -storakers_atom_biot_stress " << t_biot_stress(0, 0) << ","
1841 << t_biot_stress(0, 1) << "," << t_biot_stress(0, 2) << ","
1842 << t_biot_stress(1, 1) << "," << t_biot_stress(1, 2) << ","
1843 << t_biot_stress(2, 2) << " -log_no_color";
1844
1845 PetscMPIInt rank = -1;
1846 (void)MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
1847 std::ostringstream atom_reproducer_log;
1848 atom_reproducer_log << "[" << rank
1849 << "] <warning> atom_reproducer_command="
1850 << atom_reproducer.str() << '\n';
1851 const auto atom_reproducer_log_string = atom_reproducer_log.str();
1852 std::fwrite(atom_reproducer_log_string.data(), 1,
1853 atom_reproducer_log_string.size(), stderr);
1854 std::fflush(stderr);
1855 }
1856 CHKERR calculate_error;
1857
1858 const auto &state = stress_to_stretch.getScalarEquationState();
1859 const auto &eigenvectors = stress_to_stretch.getEigenVectors();
1860 t_eigen_vals(i) = state.tLogU(i);
1861 t_eigen_vecs(i, j) = eigenvectors(i, j);
1862 for (int aa = 0; aa != SPACE_DIM; ++aa) {
1863 if (!std::isfinite(t_eigen_vals(aa))) {
1864 SETERRQ(PETSC_COMM_SELF, MOFEM_INVALID_DATA,
1865 "Non-finite Storakers strain eigenvalue");
1866 }
1867 }
1868
1869 auto t_log_stretch =
1870 EigenMatrix::getMat(t_eigen_vals, t_eigen_vecs, identity);
1871 t_strain(i, j) = t_log_stretch(i, j);
1872 t_log_stretch_total(i, j) = t_strain(i, j);
1873 t_log_u2_h1(i, j) = 0;
1874
1875 t_nb_uniq =
1876 getUniqNb<SPACE_DIM>(getVectorAdaptor(&t_eigen_vals(0), SPACE_DIM),
1878 if (t_nb_uniq < SPACE_DIM) {
1879 CHKERR sortEigenVals<SPACE_DIM>(
1880 getVectorAdaptor(&t_eigen_vals(0), SPACE_DIM),
1881 getMatrixAdaptor(&t_eigen_vecs(0, 0), SPACE_DIM, SPACE_DIM),
1883 }
1884 auto t_diff_stretch_mat = EigenMatrix::getDiffMat(
1885 t_eigen_vals, t_eigen_vecs,
1886 static_cast<double (*)(double)>(std::exp),
1887 static_cast<double (*)(double)>(std::exp), t_nb_uniq);
1888 t_diff_stretch(i, j, k, l) = t_diff_stretch_mat(i, j, k, l);
1889
1890 ++t_strain;
1891 ++t_biot_stretch;
1892 ++t_diff_stretch;
1893 ++t_stress;
1894 ++t_omega;
1895 ++t_R;
1896 ++t_biot_stress;
1897 ++t_eigen_vals;
1898 ++t_eigen_vecs;
1899 ++t_mat_d;
1900 ++t_mat_inv_d;
1901 ++t_log_u2_h1;
1902 ++t_log_stretch_total;
1903 ++t_nb_uniq;
1904 }
1905
1907}
#define FTENSOR_INDEXES(DIM,...)
constexpr int SPACE_DIM
Fourth-order symmetrization tensor.
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
@ MOFEM_INVALID_DATA
Definition definitions.h:36
#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< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
auto getMat(A &&t_val, B &&t_vec, Fun< double > f)
Get the Mat object.
auto getDiffMat(A &&t_val, B &&t_vec, Fun< double > f, Fun< double > d_f, const int nb)
Get the Diff Mat object.
DataLayoutTraits< DataLayout::GaussByCoeffs > DL
auto getVectorAdaptor(T1 ptr, const size_t n)
Get Vector adaptor.
Definition Templates.hpp:49
decltype(GetFTensor2SymmetricFromMatImpl< Tensor_Dim, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor2SymmetricFromMatType
auto getFTensor2FromMat(M &data)
Get tensor rank 2 (matrix) form data matrix.
decltype(GetFTensor4DdgFromMatImpl< Tensor_Dim01, Tensor_Dim23, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor4DdgFromMatType
auto getMatrixAdaptor(T1 ptr, const size_t n, const size_t m)
Get Matrix adaptor.
Definition Templates.hpp:75
decltype(GetFTensor1FromMatImpl< Tensor_Dim, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor1FromMatType
decltype(GetFTensor2FromMatImpl< Tensor_Dim0, Tensor_Dim1, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor2FromMatType
static enum RotSelector rotSelector
static auto exp(A &&t_w_vee, B &&theta)
Definition Lie.hpp:69

Member Data Documentation

◆ dataAtPts

boost::shared_ptr<DataAtIntegrationPts> EshelbianPlasticity::HMHStorakers::OpCalculateStretchFromStress::dataAtPts
private

Definition at line 1183 of file HMHStorakers.cpp.

◆ externalPressurePtr

VectorPtr EshelbianPlasticity::HMHStorakers::OpCalculateStretchFromStress::externalPressurePtr
private

Definition at line 1187 of file HMHStorakers.cpp.

◆ storakersPtr

boost::shared_ptr<HMHStorakers> EshelbianPlasticity::HMHStorakers::OpCalculateStretchFromStress::storakersPtr
private

Definition at line 1186 of file HMHStorakers.cpp.

◆ strainPtr

boost::shared_ptr<MatrixDouble> EshelbianPlasticity::HMHStorakers::OpCalculateStretchFromStress::strainPtr
private

Definition at line 1184 of file HMHStorakers.cpp.

◆ stressPtr

boost::shared_ptr<MatrixDouble> EshelbianPlasticity::HMHStorakers::OpCalculateStretchFromStress::stressPtr
private

Definition at line 1185 of file HMHStorakers.cpp.


The documentation for this struct was generated from the following file: