v0.16.0
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Public Attributes | List of all members
EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch > Struct Template Reference

Recover the stretch tensor from a prescribed Biot stress. More...

Inheritance diagram for EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >:
[legend]
Collaboration diagram for EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >:
[legend]

Public Member Functions

MoFEMErrorCode evaluateRhs ()
 
MoFEMErrorCode evaluateLhs ()
 
MoFEMErrorCode evaluateFullLhs ()
 
double evaluateComplementaryPotential () const
 
MoFEMErrorCode calculateStretch ()
 
MoFEMErrorCode calculateBiotStretch ()
 
MoFEMErrorCode calculateDHenckyStreachDBiotStress ()
 
MoFEMErrorCode logSnesFailure (const PetscErrorCode snes_solve_error, const PetscErrorCode accepted_state_error, const PetscErrorCode reason_query_error)
 
MoFEMErrorCode setUPSnes ()
 

Static Public Member Functions

static MoFEMErrorCode snesObjective (SNES snes, Vec x, PetscReal *objective, void *ctx)
 
static MoFEMErrorCode snesRhs (SNES snes, Vec x, Vec r, void *ctx)
 
static MoFEMErrorCode snesLhs (SNES snes, Vec x, Mat A, Mat B, void *ctx)
 

Public Attributes

FTensor::Tensor2_symmetric< T_Biota, 3 > tBiotStress
 
FTensor::Tensor2_symmetric< T_Stretch, 3 > tBiotStreach
 
FTensor::Tensor2_symmetric< double, 3 > tHenckyStreach
 
FTensor::Ddg< double, 3, 3 > tDRe
 
FTensor::Ddg< double, 3, 3 > tDHenckyStreachDBiotStress
 
FTensor::Tensor1< double, 3 > tBiotStressEigenVals
 
FTensor::Tensor1< double, 3 > tHenckyStreachEigenVals
 
FTensor::Tensor2< double, 3, 3 > tBiotStressEigenVecs
 
FTensor::Tensor1< double, SPACE_DIMtReVec
 
MatrixDouble tPrincipalDReMat
 
MatrixDouble tDReMat
 
MatrixDouble tDHenckyStreachDBiotStressMat
 
FTensor::Tensor1< double, SPACE_DIMtStretchVec
 SNES unknown: principal Hencky stretches.
 
SmartPetscObj< Mat > A
 
SmartPetscObj< Vec > R
 
SmartPetscObj< Vec > Chi
 
SmartPetscObj< SNES > sNes
 
double c10
 
double K
 
double externalPressure = 0
 
int max_iter = 100
 
double tol = 1e-12
 
double minimEigenValue = 0.
 
bool allowNonConverged = true
 
double minimumComplementaryHessianEigenvalue
 
double complementaryHessianSpectralRadius = 0.
 

Detailed Description

template<typename T_Biota, typename T_Stretch>
struct EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >

Recover the stretch tensor from a prescribed Biot stress.

After diagonalising the Biot stress, the principal Hencky stretches \(h_a = \log(\lambda_a)\) are found from

\[ \mathcal{R}_a(\boldsymbol{h}) = s_a e^{h_a} - \tau_a + q = 0, \qquad \tau_a = 2c_{10}J^{-2/3} \left(e^{2h_a} - \frac{I_1}{3}\right) + KJ(J-1), \quad I_1 = \sum_b e^{2h_b}, \]

where \(s_a\) is a principal Biot stress and \(q=3K_{\rm ext}\varepsilon_{\rm ext}\) is prescribed at the integration point. The recovered stretch is \(\mathbf{U} = \mathbf{Q}\,\mathrm{diag}(e^{h_a})\mathbf{Q}^T\).

Definition at line 383 of file HMHNeohookean.cpp.

Member Function Documentation

◆ calculateBiotStretch()

template<typename T_Biota , typename T_Stretch >
MoFEMErrorCode EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::calculateBiotStretch ( )

Definition at line 1408 of file HMHNeohookean.cpp.

1408 {
1410
1412 tBiotStreach(i, j) =
1414 static_cast<double (*)(double)>(std::exp))(i, j);
1415
1417}
#define FTENSOR_INDEXES(DIM,...)
constexpr int SPACE_DIM
#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()
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'j', 3 > j
auto getMat(A &&t_val, B &&t_vec, Fun< double > f)
Get the Mat object.
FTensor::Tensor2_symmetric< T_Stretch, 3 > tBiotStreach

◆ calculateDHenckyStreachDBiotStress()

template<typename T_Biota , typename T_Stretch >
MoFEMErrorCode EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::calculateDHenckyStreachDBiotStress ( )

Definition at line 1421 of file HMHNeohookean.cpp.

1421 {
1423
1425
1429
1432 t_eigen_vecs(i, j) = tHenckyStreach(i, j);
1433
1434 CHKERR computeEigenValuesSymmetric(t_eigen_vecs, t_eigen_vals);
1435
1436 const int nb_uniq = getUniqNb<SPACE_DIM>(t_eigen_vals);
1437 if (nb_uniq < SPACE_DIM) {
1438 CHKERR sortEigenVals<SPACE_DIM>(t_eigen_vals, t_eigen_vecs);
1439 }
1440
1441 auto t_diff_stretch = EigenMatrix::getDiffMat(
1442 t_eigen_vals, t_eigen_vecs, static_cast<double (*)(double)>(std::exp),
1443 static_cast<double (*)(double)>(std::exp), nb_uniq);
1444
1445 MatrixDouble d_re_d_biot_stress_mat;
1446 d_re_d_biot_stress_mat.resize(size_symm, size_symm, false);
1448
1449 auto t_d_re_d_biot_stress =
1450 getFTensor2FromMat<size_symm, size_symm>(d_re_d_biot_stress_mat);
1451 t_d_re_d_biot_stress(L, J) =
1452 t_L(i, j, L) * (t_diff_stretch(k, l, i, j) * t_L(k, l, J));
1453
1454 auto inv_d_re_d_hencky_mat = tDReMat;
1455 CHKERR computeMatrixInverse(inv_d_re_d_hencky_mat);
1456
1457 auto t_inv_d_re_d_hencky =
1458 getFTensor2FromMat<size_symm, size_symm>(inv_d_re_d_hencky_mat);
1459 auto t_d_hencky_d_biot_stress =
1460 getFTensor2FromMat<size_symm, size_symm>(tDHenckyStreachDBiotStressMat);
1461
1462 t_d_hencky_d_biot_stress(L, J) =
1463 -t_inv_d_re_d_hencky(L, M) * t_d_re_d_biot_stress(M, J);
1464
1465 // tDHenckyStreachDBiotStressMat is the packed symmetric operator Q.
1466 // DDg storage is Q W^-1, so remove the repeated off-diagonal contraction
1467 // weights before exposing the same memory as a fourth-order tensor.
1468 auto d_hencky_d_biot_stress_ddg_mat = tDHenckyStreachDBiotStressMat;
1469 for (int row = 0; row != size_symm; ++row) {
1470 for (const int col : {1, 2, 4}) {
1471 d_hencky_d_biot_stress_ddg_mat(row, col) *= 0.5;
1472 }
1473 }
1474 auto get_d_hencky_d_biot_stress_ddg =
1475 MatrixSizeHelper<GetFTensor4DdgFromMatType<SPACE_DIM, SPACE_DIM, -1, DL>,
1476 DL>::size(d_hencky_d_biot_stress_ddg_mat, 1);
1477 auto t_d_hencky_d_biot_stress_ddg = get_d_hencky_d_biot_stress_ddg();
1479 t_d_hencky_d_biot_stress_ddg(i, j, k, l);
1480
1482}
Mapping from symmetric tensor indices to packed storage index.
#define CHKERR
Inline error check.
FTensor::Index< 'J', DIM1 > J
Definition level_set.cpp:30
FTensor::Index< 'l', 3 > l
FTensor::Index< 'k', 3 > k
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
static constexpr auto size_symm
UBlasMatrix< double > MatrixDouble
Definition Types.hpp:77
MoFEMErrorCode computeMatrixInverse(MatrixDouble &mat)
compute matrix inverse with lapack dgetri
decltype(GetFTensor4DdgFromMatImpl< Tensor_Dim01, Tensor_Dim23, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor4DdgFromMatType
MoFEMErrorCode computeEigenValuesSymmetric(const MatrixDouble &mat, VectorDouble &eig, MatrixDouble &eigen_vec)
compute eigenvalues of a symmetric matrix using lapack dsyev

◆ calculateStretch()

template<typename T_Biota , typename T_Stretch >
MoFEMErrorCode EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::calculateStretch ( )

Definition at line 1775 of file HMHNeohookean.cpp.

1775 {
1777
1778 if (!sNes) {
1779 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1780 "Neo-Hookean stretch-from-stress SNES is not set up");
1781 }
1782 CHKERR validateMaterialParameters(c10, K, "stretch-from-stress solve");
1783
1787
1788 FTensor::Tensor1<double, SPACE_DIM> t_target_biot_stress_eigenvalues;
1789 t_target_biot_stress_eigenvalues(i) = tBiotStressEigenVals(i);
1790
1791 constexpr auto t_one = FTensor::One<>();
1792 const double tr_biot_stress =
1794 auto set_linear_initial_guess = [&]() {
1795 tStretchVec(i) =
1796 (tBiotStressEigenVals(i) + externalPressure - tr_biot_stress / 3.) /
1797 (4 * c10) +
1798 tr_biot_stress / (9 * K);
1799 };
1800 set_linear_initial_guess();
1801 PetscBool test_zero_initial_guess = PETSC_FALSE;
1802 CHKERR PetscOptionsHasName(PETSC_NULLPTR, PETSC_NULLPTR,
1803 "-nh_stretch_test_zero_initial_guess",
1804 &test_zero_initial_guess);
1805 if (test_zero_initial_guess) {
1806 tStretchVec(i) = 0;
1807 }
1808 struct LocalSolveState {
1809 PetscErrorCode solveError = 0;
1810 PetscErrorCode acceptedStateError = 0;
1811 PetscErrorCode reasonQueryError = 0;
1812 PetscErrorCode residualError = 0;
1813 PetscErrorCode hessianError = 0;
1814 SNESConvergedReason reason = SNES_CONVERGED_ITERATING;
1815 double residualNorm = std::numeric_limits<double>::infinity();
1816 bool finiteIterate = false;
1817 bool boundedIterate = false;
1818 bool stableHessian = false;
1819 bool acceptable = false;
1820 };
1821
1822 auto solve_from_current_guess = [&]() {
1823 LocalSolveState state;
1824 double initial_residual_norm = std::numeric_limits<double>::infinity();
1825 if (!evaluateRhs()) {
1826 initial_residual_norm = tReVec.l2();
1827 }
1828
1829 double *chi_array = PETSC_NULLPTR;
1830 state.acceptedStateError = VecGetArray(Chi, &chi_array);
1831 if (!state.acceptedStateError) {
1832 for (int aa = 0; aa != SPACE_DIM; ++aa) {
1833 chi_array[aa] = tStretchVec(aa);
1834 }
1835 state.acceptedStateError = VecRestoreArray(Chi, &chi_array);
1836 }
1837 if (!state.acceptedStateError) {
1838 state.acceptedStateError = VecAssemblyBegin(Chi);
1839 }
1840 if (!state.acceptedStateError) {
1841 state.acceptedStateError = VecAssemblyEnd(Chi);
1842 }
1843 if (state.acceptedStateError) {
1844 return state;
1845 }
1846
1847 state.solveError = SNESSolve(sNes, PETSC_NULLPTR, Chi);
1848
1849 // The callbacks can finish at a rejected trial point. Copy Chi and
1850 // explicitly re-evaluate the residual and unprojected Hessian there.
1851 const double *accepted_chi_array = PETSC_NULLPTR;
1852 state.acceptedStateError = VecGetArrayRead(Chi, &accepted_chi_array);
1853 if (!state.acceptedStateError) {
1854 for (int aa = 0; aa != SPACE_DIM; ++aa) {
1855 tStretchVec(aa) = accepted_chi_array[aa];
1856 }
1857 state.acceptedStateError = VecRestoreArrayRead(Chi, &accepted_chi_array);
1858 }
1859 state.reasonQueryError = SNESGetConvergedReason(sNes, &state.reason);
1860 if (!state.acceptedStateError) {
1861 state.residualError = evaluateRhs();
1862 state.hessianError = evaluateLhs();
1863 }
1864
1865 state.finiteIterate = !state.acceptedStateError;
1866 double maximum_absolute_natural_hencky = 0.;
1867 for (int aa = 0; aa != SPACE_DIM && state.finiteIterate; ++aa) {
1868 state.finiteIterate = std::isfinite(tStretchVec(aa));
1869 maximum_absolute_natural_hencky =
1870 std::max(maximum_absolute_natural_hencky, std::abs(tStretchVec(aa)));
1871 }
1872 constexpr double catastrophic_hencky_limit = 10. * EshelbianCore::v_max;
1873 state.boundedIterate =
1874 state.finiteIterate &&
1875 maximum_absolute_natural_hencky <= catastrophic_hencky_limit;
1876
1877 if (!state.residualError) {
1878 state.residualNorm = tReVec.l2();
1879 }
1880
1881 const double stability_tolerance =
1882 std::sqrt(std::numeric_limits<double>::epsilon()) *
1883 std::max({1., std::abs(K), complementaryHessianSpectralRadius});
1884 state.stableHessian =
1885 !state.hessianError &&
1887 minimumComplementaryHessianEigenvalue > stability_tolerance;
1888
1889 PetscReal absolute_tolerance = tol;
1890 PetscReal relative_tolerance = tol;
1891 PetscReal step_tolerance = PETSC_DEFAULT;
1892 PetscInt maximum_iterations = max_iter;
1893 PetscInt maximum_function_evaluations = PETSC_DEFAULT;
1894 const PetscErrorCode tolerance_error = SNESGetTolerances(
1895 sNes, &absolute_tolerance, &relative_tolerance, &step_tolerance,
1896 &maximum_iterations, &maximum_function_evaluations);
1897 const double acceptable_residual =
1898 tolerance_error
1899 ? 10. * tol
1900 : 10. * std::max(static_cast<double>(absolute_tolerance),
1901 static_cast<double>(relative_tolerance) *
1902 initial_residual_norm);
1903 const bool converged =
1904 !state.reasonQueryError && state.reason > SNES_CONVERGED_ITERATING;
1905 const bool mildly_nonconverged = allowNonConverged &&
1906 !state.reasonQueryError &&
1907 state.reason == SNES_DIVERGED_MAX_IT &&
1908 state.residualNorm <= acceptable_residual;
1909 const bool admissible_error =
1910 !state.solveError || state.solveError == PETSC_ERR_NOT_CONVERGED;
1911 state.acceptable =
1912 admissible_error && !state.acceptedStateError && !state.residualError &&
1913 !state.hessianError && state.finiteIterate && state.boundedIterate &&
1914 state.stableHessian && (converged || mildly_nonconverged);
1915 return state;
1916 };
1917
1918 struct ContinuationState {
1919 LocalSolveState finalState;
1920 double acceptedFraction = 0.;
1921 double rejectedFraction = 0.;
1922 FTensor::Tensor1<double, SPACE_DIM> tRejectedHencky{0., 0., 0.};
1923 };
1924
1925 auto run_stress_continuation = [&]() {
1926 ContinuationState continuation;
1927 FTensor::Tensor1<double, SPACE_DIM> t_accepted_hencky{0., 0., 0.};
1928 double fraction_step = 0.25;
1929 constexpr double minimum_fraction_step = 1.e-6;
1930 constexpr int maximum_continuation_attempts = 200;
1931
1932 for (int attempt = 0; attempt != maximum_continuation_attempts &&
1933 continuation.acceptedFraction < 1.;
1934 ++attempt) {
1935 const double trial_fraction =
1936 std::min(1., continuation.acceptedFraction + fraction_step);
1938 trial_fraction * t_target_biot_stress_eigenvalues(i);
1939 tStretchVec(i) = t_accepted_hencky(i);
1940
1941 continuation.finalState = solve_from_current_guess();
1942 if (continuation.finalState.acceptable) {
1943 continuation.acceptedFraction = trial_fraction;
1944 t_accepted_hencky(i) = tStretchVec(i);
1945 fraction_step =
1946 std::min(1. - continuation.acceptedFraction, 1.5 * fraction_step);
1947 } else {
1948 continuation.rejectedFraction = trial_fraction;
1949 continuation.tRejectedHencky(i) = tStretchVec(i);
1950 fraction_step *= 0.5;
1951 tStretchVec(i) = t_accepted_hencky(i);
1952 }
1953
1954 if (continuation.acceptedFraction < 1. &&
1955 fraction_step < minimum_fraction_step) {
1956 break;
1957 }
1958 }
1959
1960 tBiotStressEigenVals(i) = t_target_biot_stress_eigenvalues(i);
1961 return continuation;
1962 };
1963
1964 auto direct_state = solve_from_current_guess();
1965 auto final_state = direct_state;
1966 bool used_continuation = false;
1967
1968 if (!direct_state.acceptable) {
1969 used_continuation = true;
1970 const auto original_continuation = run_stress_continuation();
1971 final_state = original_continuation.finalState;
1972
1973 if (original_continuation.acceptedFraction < 1.) {
1974 const double failure_minimum_hessian_eigenvalue =
1976 (void)logSnesFailure(final_state.solveError,
1977 final_state.acceptedStateError,
1978 final_state.reasonQueryError);
1979 const double reached_fraction = original_continuation.acceptedFraction;
1980 MOFEM_LOG("EP", Sev::warning)
1981 << "Neo-Hookean stress continuation stopped at accepted fraction "
1982 << reached_fraction << " after rejecting fraction "
1983 << original_continuation.rejectedFraction
1984 << "; residual = " << final_state.residualNorm
1985 << "; minimum complementary Hessian eigenvalue = "
1986 << failure_minimum_hessian_eigenvalue
1987 << "; rejected principal Hencky = ["
1988 << original_continuation.tRejectedHencky(0) << ","
1989 << original_continuation.tRejectedHencky(1) << ","
1990 << original_continuation.tRejectedHencky(2) << "]";
1991 MOFEM_LOG("EP", Sev::error)
1992 << "Abaqus Neo-Hookean stretch-from-stress solve failed to reach a "
1993 "globally unique constitutive target; this indicates a numerical "
1994 "range or nonlinear-solver failure; aborting all MPI ranks";
1995 // This failure is detected by one integration-point owner only. Returning
1996 // a rank-local PETSc error lets that rank unwind distributed solvers
1997 // while the other ranks remain in residual assembly, producing mismatched
1998 // MPI collectives (for example MUMPS MPI_Bcast versus Vec MPI_Allreduce).
1999 // Abort before rank-asymmetric destruction of distributed PETSc objects.
2000 (void)MPI_Abort(PETSC_COMM_WORLD, MOFEM_OPERATION_UNSUCCESSFUL);
2001 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
2002 "Abaqus Neo-Hookean stretch-from-stress numerical solve failed");
2003 }
2004 }
2005
2006 if (used_continuation) {
2007 MOFEM_LOG("EP", Sev::verbose)
2008 << "Neo-Hookean stretch-from-stress recovered by adaptive stress "
2009 "continuation";
2010 } else if (final_state.reason == SNES_DIVERGED_MAX_IT) {
2011 MOFEM_LOG("EP", Sev::warning)
2012 << "Neo-Hookean stretch-from-stress accepted a bounded, stable "
2013 "maximum-iteration state with residual "
2014 << final_state.residualNorm;
2015 }
2016
2017 for (int aa = 0; aa != SPACE_DIM; ++aa) {
2018 if (aa != 0 &&
2020 continue;
2021 }
2022 double group_sum = 0;
2023 int group_size = 0;
2024 for (int bb = aa; bb != SPACE_DIM; ++bb) {
2026 group_sum += tStretchVec(bb);
2027 ++group_size;
2028 }
2029 }
2030 const double group_average = group_sum / group_size;
2031 for (int bb = aa; bb != SPACE_DIM; ++bb) {
2033 tStretchVec(bb) = group_average;
2034 }
2035 }
2036 }
2037
2039 auto identity = [](const double v) { return v; };
2043
2045}
Stateless vector whose components are all equal to one.
Definition One.hpp:22
@ MOFEM_OPERATION_UNSUCCESSFUL
Definition definitions.h:34
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
#define MOFEM_LOG(channel, severity)
Log.
const double v
phase velocity of light in medium (cm/ns)
bool isEq(const T a, const T b)
static constexpr double v_max
FTensor::Tensor1< double, SPACE_DIM > tStretchVec
SNES unknown: principal Hencky stretches.
MoFEMErrorCode logSnesFailure(const PetscErrorCode snes_solve_error, const PetscErrorCode accepted_state_error, const PetscErrorCode reason_query_error)
static MoFEMErrorCode validateMaterialParameters(const double c10, const double K, const char *source)

◆ evaluateComplementaryPotential()

template<typename T_Biota , typename T_Stretch >
double EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::evaluateComplementaryPotential ( ) const

Definition at line 1229 of file HMHNeohookean.cpp.

1229 {
1230 double complementary_potential = getStrainEnergy(c10, K, tStretchVec);
1231 for (int aa = 0; aa != SPACE_DIM; ++aa) {
1232 const double h = tStretchVec(aa);
1233 complementary_potential -= tBiotStressEigenVals(aa) * (std::exp(h) - 1.);
1234 complementary_potential -= externalPressure * h;
1235 }
1236 return complementary_potential;
1237}
double h
static double getStrainEnergy(const double c10, const double K, T &principal_coordinate_stretches)

◆ evaluateFullLhs()

template<typename T_Biota , typename T_Stretch >
MoFEMErrorCode EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::evaluateFullLhs ( )

Definition at line 1334 of file HMHNeohookean.cpp.

1334 {
1336
1339
1341
1344 t_eigen_vecs(i, j) = tHenckyStreach(i, j);
1345
1346 CHKERR computeEigenValuesSymmetric(t_eigen_vecs, t_eigen_vals);
1347
1348 const int nb_uniq = getUniqNb<SPACE_DIM>(t_eigen_vals);
1349 if (nb_uniq < SPACE_DIM) {
1350 CHKERR sortEigenVals<SPACE_DIM>(t_eigen_vals, t_eigen_vecs);
1351 }
1352
1353 const auto principal_state = getPrincipalState(K, t_eigen_vals);
1354 CHKERR validatePrincipalState(principal_state, "full Hessian");
1355 auto coordinate_stress = [this, principal_state](const double v) {
1356 return getPrincipalCoordinateStress(c10, principal_state, v);
1357 };
1358 auto coordinate_stress_derivative = [this, principal_state](const double v) {
1360 c10, principal_state, v);
1361 };
1362 auto squared_stretch = [](const double v) { return std::exp(2. * v); };
1363 auto identity = [](const double) { return 1.; };
1364 auto isochoric_coordinate_stress = [this, principal_state](const double v) {
1365 return getShearModulus(c10) * principal_state.jacobianToMinusTwoThirds *
1366 (std::exp(2. * v) - principal_state.firstInvariant / 3.);
1367 };
1368
1369 auto t_diff_neohookean =
1370 EigenMatrix::getDiffMat(t_eigen_vals, t_eigen_vecs, coordinate_stress,
1371 coordinate_stress_derivative, nb_uniq);
1372 auto t_squared_stretch =
1373 EigenMatrix::getMat(t_eigen_vals, t_eigen_vecs, squared_stretch);
1374 auto t_identity = EigenMatrix::getMat(t_eigen_vals, t_eigen_vecs, identity);
1375 auto t_isochoric_coordinate_stress = EigenMatrix::getMat(
1376 t_eigen_vals, t_eigen_vecs, isochoric_coordinate_stress);
1377 const double scaled_shear_modulus =
1378 getShearModulus(c10) * principal_state.jacobianToMinusTwoThirds;
1379
1380 FTensor::Ddg<double, 3, 3> t_model_log_stress_diff;
1381 t_model_log_stress_diff(i, j, k, l) =
1382 t_diff_neohookean(i, j, k, l) -
1383 (2. / 3.) * t_isochoric_coordinate_stress(i, j) * t_identity(k, l) -
1384 (2. / 3.) * scaled_shear_modulus * t_identity(i, j) *
1385 t_squared_stretch(k, l) +
1386 principal_state.volumetricTangent * t_identity(i, j) * t_identity(k, l);
1387
1388 auto t_diff2_stretch_stress = EigenMatrix::getDiffDiffMat(
1389 t_eigen_vals, t_eigen_vecs, static_cast<double (*)(double)>(std::exp),
1390 static_cast<double (*)(double)>(std::exp),
1391 static_cast<double (*)(double)>(std::exp), tBiotStress, nb_uniq);
1392
1393 tDRe(i, j, k, l) =
1394 t_diff2_stretch_stress(i, j, k, l) - t_model_log_stress_diff(i, j, k, l);
1395
1396 if (tDReMat.size1() != size_symm || tDReMat.size2() != size_symm) {
1397 tDReMat.resize(size_symm, size_symm, false);
1398 }
1399 auto t_d_re_mat = getFTensor2FromMat<size_symm, size_symm>(tDReMat);
1400 t_d_re_mat(L, J) = t_L(i, j, L) * (tDRe(i, j, k, l) * t_L(k, l, J));
1401
1403}
auto getDiffDiffMat(A &&t_val, B &&t_vec, Fun< double > f, Fun< double > d_f, Fun< double > dd_f, C &&t_S, const int nb)
Get the Diff Diff Mat object.
static double getShearModulus(const double c10)
static MoFEMErrorCode validatePrincipalState(const PrincipalState &state, const char *source)
static double getPrincipalCoordinateStressDerivativeAtFixedInvariants(const double c10, const PrincipalState &state, const double v)
static double getPrincipalCoordinateStress(const double c10, const PrincipalState &state, const double v)
static PrincipalState getPrincipalState(const double K, T &principal_coordinate_stretches)

◆ evaluateLhs()

template<typename T_Biota , typename T_Stretch >
MoFEMErrorCode EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::evaluateLhs ( )

Definition at line 1259 of file HMHNeohookean.cpp.

1259 {
1261
1262 const auto principal_state = getPrincipalState(K, tStretchVec);
1263 CHKERR validatePrincipalState(principal_state, "principal Hessian");
1264 const double scaled_shear_modulus =
1265 getShearModulus(c10) * principal_state.jacobianToMinusTwoThirds;
1266
1268 auto t_principal_d_re =
1269 getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(tPrincipalDReMat);
1270 for (int aa = 0; aa != SPACE_DIM; ++aa) {
1271 const double h_a = tStretchVec(aa);
1272 const double stretch_a = std::exp(h_a);
1273 const double squared_stretch_a = stretch_a * stretch_a;
1274 const double isochoric_deviator_a =
1275 squared_stretch_a - principal_state.firstInvariant / 3.;
1276 for (int bb = 0; bb != SPACE_DIM; ++bb) {
1277 const double squared_stretch_b = std::exp(2. * tStretchVec(bb));
1278 const double isochoric_tangent =
1279 scaled_shear_modulus *
1280 ((aa == bb ? 2. * squared_stretch_a : 0.) -
1281 (2. / 3.) * squared_stretch_b - (2. / 3.) * isochoric_deviator_a);
1282 const double coordinate_stress_tangent =
1283 isochoric_tangent + principal_state.volumetricTangent;
1284 tPrincipalDReMat(aa, bb) = -coordinate_stress_tangent;
1285 if (aa == bb) {
1286 tPrincipalDReMat(aa, bb) += stretch_a * tBiotStressEigenVals(aa);
1287 }
1288 }
1289 }
1290
1291 // R = d(S:U - W)/dh, so the complementary Hessian is -dR/dh. Inspect the
1292 // unprojected Hessian even when optional Newton regularisation is enabled.
1294 t_hessian_eig_vecs(i, j) =
1295 -0.5 * (t_principal_d_re(i, j) + t_principal_d_re(j, i));
1296 FTensor::Tensor1<double, SPACE_DIM> t_hessian_eig_vals;
1297 CHKERR computeEigenValuesSymmetric(t_hessian_eig_vecs, t_hessian_eig_vals);
1299 std::numeric_limits<double>::infinity();
1301 for (int aa = 0; aa != SPACE_DIM; ++aa) {
1303 std::min(minimumComplementaryHessianEigenvalue, t_hessian_eig_vals(aa));
1305 complementaryHessianSpectralRadius, std::abs(t_hessian_eig_vals(aa)));
1306 }
1307
1308 if (minimEigenValue > 0) {
1309 // Project the Newton matrix to positive definite and restore the residual
1310 // Jacobian sign. The residual and the stability measurement above remain
1311 // unmodified.
1312 const double eigenvalue_floor = K * minimEigenValue;
1313 bool project_hessian = false;
1314 for (int aa = 0; aa != SPACE_DIM; ++aa) {
1315 project_hessian =
1316 project_hessian || t_hessian_eig_vals(aa) < eigenvalue_floor;
1317 }
1318 if (project_hessian) {
1319 auto floor_eigenvalue = [eigenvalue_floor](const double v) {
1320 return (v + eigenvalue_floor + std::abs(v - eigenvalue_floor)) / 2.;
1321 };
1322 auto t_projected_hessian = EigenMatrix::getMat(
1323 t_hessian_eig_vals, t_hessian_eig_vecs, floor_eigenvalue);
1324 t_principal_d_re(i, j) = -t_projected_hessian(i, j);
1325 }
1326 }
1327
1329}

◆ evaluateRhs()

template<typename T_Biota , typename T_Stretch >
MoFEMErrorCode EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::evaluateRhs ( )

Definition at line 1241 of file HMHNeohookean.cpp.

1241 {
1243
1244 const auto principal_state = getPrincipalState(K, tStretchVec);
1245 CHKERR validatePrincipalState(principal_state, "principal residual");
1246
1247 for (int aa = 0; aa != SPACE_DIM; ++aa) {
1248 const double h = tStretchVec(aa);
1249 tReVec(aa) = std::exp(h) * tBiotStressEigenVals(aa) -
1250 getPrincipalCoordinateStress(c10, principal_state, h) +
1252 }
1253
1255}

◆ logSnesFailure()

template<typename T_Biota , typename T_Stretch >
MoFEMErrorCode EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::logSnesFailure ( const PetscErrorCode  snes_solve_error,
const PetscErrorCode  accepted_state_error,
const PetscErrorCode  reason_query_error 
)

Definition at line 1663 of file HMHNeohookean.cpp.

1666 {
1668
1669 // Failure reporting must never replace the error which triggered it. Keep
1670 // every query best-effort and report the first diagnostic error.
1671 PetscErrorCode diagnostic_error = 0;
1672 auto record_diagnostic_error = [&](const PetscErrorCode error) {
1673 if (error && !diagnostic_error) {
1674 diagnostic_error = error;
1675 }
1676 return error == 0;
1677 };
1678
1679 SNESConvergedReason snes_reason = SNES_CONVERGED_ITERATING;
1680 PetscInt snes_iterations = -1;
1681 PetscReal function_norm = std::numeric_limits<PetscReal>::quiet_NaN();
1682 record_diagnostic_error(SNESGetConvergedReason(sNes, &snes_reason));
1683 record_diagnostic_error(SNESGetIterationNumber(sNes, &snes_iterations));
1684 record_diagnostic_error(SNESGetFunctionNorm(sNes, &function_norm));
1685
1686 PetscMPIInt rank = -1;
1687 record_diagnostic_error(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
1688
1689 std::ostringstream atom_reproducer;
1690 atom_reproducer << std::scientific
1691 << std::setprecision(
1692 std::numeric_limits<double>::max_digits10)
1693 << "./neohookean_stretch_gradient_atom"
1694 << " -nh_stretch_atom_c10 " << c10 << " -nh_stretch_atom_k "
1695 << K << " -nh_stretch_atom_q " << externalPressure
1696 << " -nh_stretch_atom_max_it " << max_iter
1697 << " -nh_stretch_atom_tol " << tol
1698 << " -nh_stretch_atom_biot_stress " << tBiotStress(0, 0)
1699 << "," << tBiotStress(0, 1) << "," << tBiotStress(0, 2) << ","
1700 << tBiotStress(1, 1) << "," << tBiotStress(1, 2) << ","
1701 << tBiotStress(2, 2);
1702
1703 // setUPSnes() gives the atom the same defaults as production. Append only
1704 // explicitly supplied options which can change this local solve.
1705 const char *const reproduced_options[] = {
1706 "-neo_hookean_min_eigen_value",
1707 "-nh_stretch_test_zero_initial_guess",
1708 "-nh_stretch_snes_type",
1709 "-nh_stretch_snes_linesearch_type",
1710 "-nh_stretch_snes_linesearch_minlambda",
1711 "-nh_stretch_snes_linesearch_maxstep",
1712 "-nh_stretch_snes_linesearch_rtol",
1713 "-nh_stretch_snes_linesearch_atol",
1714 "-nh_stretch_snes_linesearch_ltol",
1715 "-nh_stretch_snes_linesearch_max_it",
1716 "-nh_stretch_snes_linesearch_damping",
1717 "-nh_stretch_snes_linesearch_order",
1718 "-nh_stretch_snes_linesearch_alpha",
1719 "-nh_stretch_ksp_type",
1720 "-nh_stretch_ksp_rtol",
1721 "-nh_stretch_ksp_atol",
1722 "-nh_stretch_ksp_divtol",
1723 "-nh_stretch_ksp_max_it",
1724 "-nh_stretch_ksp_gmres_restart",
1725 "-nh_stretch_pc_type",
1726 "-nh_stretch_snes_atol",
1727 "-nh_stretch_snes_rtol",
1728 "-nh_stretch_snes_stol",
1729 "-nh_stretch_snes_max_it",
1730 "-nh_stretch_snes_max_funcs",
1731 "-nh_stretch_snes_error_if_not_converged"};
1732 for (const auto option_name : reproduced_options) {
1733 char option_value[PETSC_MAX_PATH_LEN] = {};
1734 PetscBool option_set = PETSC_FALSE;
1735 if (record_diagnostic_error(PetscOptionsGetString(
1736 PETSC_NULLPTR, PETSC_NULLPTR, option_name, option_value,
1737 sizeof(option_value), &option_set)) &&
1738 option_set) {
1739 atom_reproducer << " " << option_name;
1740 if (option_value[0]) {
1741 atom_reproducer << " " << option_value;
1742 }
1743 }
1744 }
1745 atom_reproducer << " -log_no_color";
1746
1747 // MoFEM's PETSc log formatter has a fixed 1024-byte buffer. Bypass it for
1748 // this one potentially long record so the copy-paste command is never cut.
1749 const auto atom_reproducer_string = atom_reproducer.str();
1750 std::ostringstream atom_reproducer_log;
1751 atom_reproducer_log << "[" << rank << "] <warning> atom_reproducer_command="
1752 << atom_reproducer_string << '\n';
1753 const auto atom_reproducer_log_string = atom_reproducer_log.str();
1754 std::fwrite(atom_reproducer_log_string.data(), 1,
1755 atom_reproducer_log_string.size(), stderr);
1756 std::fflush(stderr);
1757
1758 const char *reason_string = "unavailable";
1759 record_diagnostic_error(SNESGetConvergedReasonString(sNes, &reason_string));
1760 MOFEM_LOG("SELF", Sev::warning)
1761 << std::scientific
1762 << std::setprecision(std::numeric_limits<double>::max_digits10)
1763 << "Neo-Hookean principal SNES failed: reason=" << reason_string << " ("
1764 << static_cast<int>(snes_reason) << ")"
1765 << " iterations=" << snes_iterations << " fnorm=" << function_norm
1766 << " errors=[" << snes_solve_error << "," << accepted_state_error << ","
1767 << reason_query_error << "," << diagnostic_error << "]";
1768
1770}
PetscErrorCode PetscOptionsGetString(PetscOptions *, const char pre[], const char name[], char str[], size_t size, PetscBool *set)

◆ setUPSnes()

template<typename T_Biota , typename T_Stretch >
MoFEMErrorCode EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::setUPSnes ( )

Definition at line 1486 of file HMHNeohookean.cpp.

1486 {
1488
1489 if (sNes) {
1491 }
1492
1493 tPrincipalDReMat.resize(SPACE_DIM, SPACE_DIM, false);
1494 tDReMat.resize(size_symm, size_symm, false);
1498 tHenckyStreach(i, j) = 0;
1499 tReVec(i) = 0;
1500 tStretchVec(i) = 0;
1503 tBiotStressEigenVecs(i, j) = 0;
1504 auto t_principal_d_re =
1505 getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(tPrincipalDReMat);
1506 auto t_d_re = getFTensor2FromMat<size_symm, size_symm>(tDReMat);
1507 auto t_d_hencky_d_biot_stress =
1508 getFTensor2FromMat<size_symm, size_symm>(tDHenckyStreachDBiotStressMat);
1509 t_principal_d_re(i, j) = 0;
1510 t_d_re(L, J) = 0;
1511 t_d_hencky_d_biot_stress(L, J) = 0;
1512
1513 Mat a;
1514 Vec r;
1515 Vec chi;
1516 CHKERR MatCreateSeqDense(PETSC_COMM_SELF, SPACE_DIM, SPACE_DIM, PETSC_NULLPTR,
1517 &a);
1518 CHKERR VecCreateSeq(PETSC_COMM_SELF, SPACE_DIM, &r);
1519 CHKERR VecCreateSeq(PETSC_COMM_SELF, SPACE_DIM, &chi);
1520
1521 A = SmartPetscObj<Mat>(a);
1522 R = SmartPetscObj<Vec>(r);
1523 Chi = SmartPetscObj<Vec>(chi);
1524
1525 sNes = createSNES(PETSC_COMM_SELF);
1526 CHKERR SNESSetType(sNes, SNESNEWTONLS);
1527 CHKERR SNESSetObjective(sNes, snesObjective, this);
1528 CHKERR SNESSetFunction(sNes, R, snesRhs, this);
1529 CHKERR SNESSetJacobian(sNes, A, A, snesLhs, this);
1530
1531 CHKERR PetscOptionsGetReal(PETSC_NULLPTR, PETSC_NULLPTR,
1532 "-neo_hookean_min_eigen_value", &minimEigenValue,
1533 PETSC_NULLPTR);
1534 if (!std::isfinite(minimEigenValue) || minimEigenValue < 0) {
1535 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1536 "-neo_hookean_min_eigen_value must be finite and non-negative");
1537 }
1538
1539 KSP ksp;
1540 PC pc;
1541 SNESLineSearch line_search;
1542 CHKERR SNESGetKSP(sNes, &ksp);
1543 CHKERR KSPGetPC(ksp, &pc);
1544 CHKERR KSPSetType(ksp, KSPPREONLY);
1545 CHKERR PCSetType(pc, PCLU);
1546 CHKERR SNESSetTolerances(sNes, tol, tol, tol, max_iter, PETSC_DEFAULT);
1547 CHKERR SNESGetLineSearch(sNes, &line_search);
1548 CHKERR SNESLineSearchSetType(line_search, SNESLINESEARCHL2);
1549 PetscReal min_lambda;
1550 PetscReal max_step;
1551 PetscReal line_search_rtol;
1552 PetscReal line_search_atol;
1553 PetscReal line_search_ltol;
1554 PetscInt line_search_max_it;
1555 CHKERR SNESLineSearchGetTolerances(line_search, &min_lambda, &max_step,
1556 &line_search_rtol, &line_search_atol,
1557 &line_search_ltol, &line_search_max_it);
1558 CHKERR SNESLineSearchSetTolerances(line_search, min_lambda, 1.,
1559 line_search_rtol, line_search_atol,
1560 line_search_ltol, line_search_max_it);
1561 CHKERR SNESAppendOptionsPrefix(sNes, "nh_stretch_");
1562 CHKERR SNESSetFromOptions(sNes);
1563
1565}
constexpr double a
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
const FTensor::Tensor2< T, Dim, Dim > Vec
auto createSNES(MPI_Comm comm)
PetscErrorCode PetscOptionsGetReal(PetscOptions *, const char pre[], const char name[], PetscReal *dval, PetscBool *set)
int r
Definition sdf.py:205
static MoFEMErrorCode snesRhs(SNES snes, Vec x, Vec r, void *ctx)
static MoFEMErrorCode snesObjective(SNES snes, Vec x, PetscReal *objective, void *ctx)
static MoFEMErrorCode snesLhs(SNES snes, Vec x, Mat A, Mat B, void *ctx)

◆ snesLhs()

template<typename T_Biota , typename T_Stretch >
MoFEMErrorCode EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::snesLhs ( SNES  snes,
Vec  x,
Mat  A,
Mat  B,
void *  ctx 
)
static

Definition at line 1623 of file HMHNeohookean.cpp.

1624 {
1626
1627 auto stretch_from_stress =
1628 static_cast<CalculateStretchFromStress<T_Biota, T_Stretch> *>(ctx);
1629
1630 const double *x_array;
1631 CHKERR VecGetArrayRead(x, &x_array);
1632 for (int ii = 0; ii != SPACE_DIM; ++ii) {
1633 stretch_from_stress->tStretchVec(ii) = x_array[ii];
1634 }
1635 CHKERR VecRestoreArrayRead(x, &x_array);
1636
1637 CHKERR stretch_from_stress->evaluateLhs();
1638
1639 PetscScalar *a_array;
1640 CHKERR MatDenseGetArray(A, &a_array);
1641 for (int aa = 0; aa != SPACE_DIM; ++aa) {
1642 for (int bb = 0; bb != SPACE_DIM; ++bb) {
1643 // Use the symmetric complementary Hessian. evaluateLhs() optionally
1644 // projects this Hessian before restoring the residual-Jacobian sign.
1645 a_array[aa + SPACE_DIM * bb] =
1646 -0.5 * (stretch_from_stress->tPrincipalDReMat(aa, bb) +
1647 stretch_from_stress->tPrincipalDReMat(bb, aa));
1648 }
1649 }
1650 CHKERR MatDenseRestoreArray(A, &a_array);
1651
1652 CHKERR MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY);
1653 CHKERR MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY);
1654 if (A != B) {
1655 CHKERR MatCopy(A, B, SAME_NONZERO_PATTERN);
1656 }
1657
1659}

◆ snesObjective()

template<typename T_Biota , typename T_Stretch >
MoFEMErrorCode EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::snesObjective ( SNES  snes,
Vec  x,
PetscReal *  objective,
void *  ctx 
)
static

Definition at line 1569 of file HMHNeohookean.cpp.

1570 {
1572
1573 auto stretch_from_stress =
1574 static_cast<CalculateStretchFromStress<T_Biota, T_Stretch> *>(ctx);
1575
1576 const double *x_array;
1577 CHKERR VecGetArrayRead(x, &x_array);
1578 for (int ii = 0; ii != SPACE_DIM; ++ii) {
1579 stretch_from_stress->tStretchVec(ii) = x_array[ii];
1580 }
1581 CHKERR VecRestoreArrayRead(x, &x_array);
1582
1583 *objective = stretch_from_stress->evaluateComplementaryPotential();
1584 if (!std::isfinite(*objective)) {
1585 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FP,
1586 "Non-finite Neo-Hookean complementary potential");
1587 }
1588
1590}

◆ snesRhs()

template<typename T_Biota , typename T_Stretch >
MoFEMErrorCode EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::snesRhs ( SNES  snes,
Vec  x,
Vec  r,
void *  ctx 
)
static

Definition at line 1594 of file HMHNeohookean.cpp.

1595 {
1597
1598 auto stretch_from_stress =
1599 static_cast<CalculateStretchFromStress<T_Biota, T_Stretch> *>(ctx);
1600
1601 const double *x_array;
1602 CHKERR VecGetArrayRead(x, &x_array);
1603 for (int ii = 0; ii != SPACE_DIM; ++ii) {
1604 stretch_from_stress->tStretchVec(ii) = x_array[ii];
1605 }
1606 CHKERR VecRestoreArrayRead(x, &x_array);
1607
1608 CHKERR stretch_from_stress->evaluateRhs();
1609
1610 double *r_array;
1611 CHKERR VecGetArray(r, &r_array);
1612 for (int ii = 0; ii != SPACE_DIM; ++ii) {
1613 // R = d(S:U-W)/dh, therefore -R is the gradient of W-S:U.
1614 r_array[ii] = -stretch_from_stress->tReVec(ii);
1615 }
1616 CHKERR VecRestoreArray(r, &r_array);
1617
1619}

Member Data Documentation

◆ A

template<typename T_Biota , typename T_Stretch >
SmartPetscObj<Mat> EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::A

Definition at line 415 of file HMHNeohookean.cpp.

◆ allowNonConverged

template<typename T_Biota , typename T_Stretch >
bool EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::allowNonConverged = true

Definition at line 425 of file HMHNeohookean.cpp.

◆ c10

Definition at line 419 of file HMHNeohookean.cpp.

◆ Chi

template<typename T_Biota , typename T_Stretch >
SmartPetscObj<Vec> EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::Chi

Definition at line 417 of file HMHNeohookean.cpp.

◆ complementaryHessianSpectralRadius

template<typename T_Biota , typename T_Stretch >
double EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::complementaryHessianSpectralRadius = 0.

Definition at line 428 of file HMHNeohookean.cpp.

◆ externalPressure

Definition at line 421 of file HMHNeohookean.cpp.

◆ K

Definition at line 420 of file HMHNeohookean.cpp.

◆ max_iter

Definition at line 422 of file HMHNeohookean.cpp.

◆ minimEigenValue

Definition at line 424 of file HMHNeohookean.cpp.

◆ minimumComplementaryHessianEigenvalue

template<typename T_Biota , typename T_Stretch >
double EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::minimumComplementaryHessianEigenvalue
Initial value:
=
std::numeric_limits<double>::infinity()

Definition at line 426 of file HMHNeohookean.cpp.

◆ R

template<typename T_Biota , typename T_Stretch >
SmartPetscObj<Vec> EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::R

Definition at line 416 of file HMHNeohookean.cpp.

◆ sNes

template<typename T_Biota , typename T_Stretch >
SmartPetscObj<SNES> EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::sNes

Definition at line 418 of file HMHNeohookean.cpp.

◆ tBiotStreach

Definition at line 402 of file HMHNeohookean.cpp.

◆ tBiotStress

Definition at line 401 of file HMHNeohookean.cpp.

◆ tBiotStressEigenVals

Definition at line 406 of file HMHNeohookean.cpp.

◆ tBiotStressEigenVecs

Definition at line 408 of file HMHNeohookean.cpp.

◆ tDHenckyStreachDBiotStress

template<typename T_Biota , typename T_Stretch >
FTensor::Ddg<double, 3, 3> EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::tDHenckyStreachDBiotStress

Definition at line 405 of file HMHNeohookean.cpp.

◆ tDHenckyStreachDBiotStressMat

template<typename T_Biota , typename T_Stretch >
MatrixDouble EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::tDHenckyStreachDBiotStressMat

Definition at line 412 of file HMHNeohookean.cpp.

◆ tDRe

Definition at line 404 of file HMHNeohookean.cpp.

◆ tDReMat

template<typename T_Biota , typename T_Stretch >
MatrixDouble EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::tDReMat

Definition at line 411 of file HMHNeohookean.cpp.

◆ tHenckyStreach

Definition at line 403 of file HMHNeohookean.cpp.

◆ tHenckyStreachEigenVals

Definition at line 407 of file HMHNeohookean.cpp.

◆ tol

Definition at line 423 of file HMHNeohookean.cpp.

◆ tPrincipalDReMat

template<typename T_Biota , typename T_Stretch >
MatrixDouble EshelbianPlasticity::HMHNeohookean::CalculateStretchFromStress< T_Biota, T_Stretch >::tPrincipalDReMat

Definition at line 410 of file HMHNeohookean.cpp.

◆ tReVec

Definition at line 409 of file HMHNeohookean.cpp.

◆ tStretchVec

SNES unknown: principal Hencky stretches.

Definition at line 414 of file HMHNeohookean.cpp.


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