bool FlowRateModel::computeDflowrateDstress(RankTwoTensor & dflowrate_dstress, const RankTwoTensor & pk2, const RankTwoTensor & ce, const std::vector<Real> & internal_var, const unsigned int start_index, const unsigned int /*size*/) const { RankTwoTensor pk2_dev = computePK2Deviatoric(pk2, ce); Real eqv_stress = computeEqvStress(pk2_dev, ce); Real sigy = _flow_stress_uo.value(internal_var[start_index]); Real dflowrate_dseqv = _ref_flow_rate * _flow_rate_exponent * std::pow(eqv_stress/sigy,_flow_rate_exponent-1) * 1/sigy; if (dflowrate_dseqv > _flow_rate_tol) { #ifdef DEBUG mooseWarning("dflowrate_dseqv greater than " << _flow_rate_tol << " " << dflowrate_dseqv << " " << eqv_stress << " " << sigy ); #endif return false; } RankTwoTensor tau = pk2_dev * ce; RankTwoTensor dseqv_dpk2dev; dseqv_dpk2dev.zero(); if (eqv_stress > 0) dseqv_dpk2dev = 3/(2 * eqv_stress) * tau * ce; RankTwoTensor ce_inv = ce.inverse(); RankFourTensor dpk2dev_dpk2; for (unsigned int i = 0; i < LIBMESH_DIM; ++i) for (unsigned int j = 0; j < LIBMESH_DIM; ++j) for (unsigned int k = 0; k < LIBMESH_DIM; ++k) for (unsigned int l = 0; l < LIBMESH_DIM; ++l) { dpk2dev_dpk2(i, j, k, l) = 0.0; if (i==k && j==l) dpk2dev_dpk2(i, j, k, l) = 1.0; dpk2dev_dpk2(i, j, k, l) -= ce_inv(i, j) * ce(k, l)/3.0; } dflowrate_dstress = dflowrate_dseqv * dpk2dev_dpk2.transposeMajor() * dseqv_dpk2dev; return true; }
bool stzRHEVPFlowRatePowerLawJ2::computeTensorDerivative(unsigned int qp, const std::string & coupled_var_name, RankTwoTensor & val) const { val.zero(); if (_pk2_prop_name == coupled_var_name) { RankTwoTensor pk2_dev = computePK2Deviatoric(_pk2[qp], _ce[qp]); Real eqv_stress = computeEqvStress(pk2_dev, _ce[qp]); Real dflowrate_dseqv; if (eqv_stress>_strength[qp]) // dflowrate_dseqv = 1/_t_tau*std::exp(-1/_chiv[qp])*std::exp(eqv_stress/_grain_pressure/_chiv[qp])* \ (1.0/(_grain_pressure*_chiv[qp])*(1.0-_strength[qp]/eqv_stress)+_strength[qp]/(eqv_stress*eqv_stress)); dflowrate_dseqv = _v*std::exp(-1/_chiv[qp])*(1.0-1.0/(eqv_stress*eqv_stress)); RankTwoTensor tau = pk2_dev * _ce[qp]; RankTwoTensor dseqv_dpk2dev; dseqv_dpk2dev.zero(); if (eqv_stress > _strength[qp]) dseqv_dpk2dev = 1.5/eqv_stress * tau * _ce[qp]; RankTwoTensor ce_inv = _ce[qp].inverse(); RankFourTensor dpk2dev_dpk2; for (unsigned int i = 0; i < LIBMESH_DIM; ++i) for (unsigned int j = 0; j < LIBMESH_DIM; ++j) for (unsigned int k = 0; k < LIBMESH_DIM; ++k) for (unsigned int l = 0; l < LIBMESH_DIM; ++l) { dpk2dev_dpk2(i, j, k, l) = 0.0; if (i==k && j==l) dpk2dev_dpk2(i, j, k, l) = 1.0; dpk2dev_dpk2(i, j, k, l) -= ce_inv(i, j) * _ce[qp](k, l)/3.0; } val = dflowrate_dseqv * dpk2dev_dpk2.transposeMajor() * dseqv_dpk2dev; } return true; }
bool HEVPFlowRatePowerLawJ2::computeTensorDerivative(unsigned int qp, const std::string & coupled_var_name, RankTwoTensor & val) const { val.zero(); if (_pk2_prop_name == coupled_var_name) { RankTwoTensor pk2_dev = computePK2Deviatoric(_pk2[qp], _ce[qp]); Real eqv_stress = computeEqvStress(pk2_dev, _ce[qp]); Real dflowrate_dseqv = _ref_flow_rate * _flow_rate_exponent * std::pow(eqv_stress / _strength[qp], _flow_rate_exponent - 1.0) / _strength[qp]; RankTwoTensor tau = pk2_dev * _ce[qp]; RankTwoTensor dseqv_dpk2dev; dseqv_dpk2dev.zero(); if (eqv_stress > 0.0) dseqv_dpk2dev = 1.5 / eqv_stress * tau * _ce[qp]; RankTwoTensor ce_inv = _ce[qp].inverse(); RankFourTensor dpk2dev_dpk2; for (unsigned int i = 0; i < LIBMESH_DIM; ++i) for (unsigned int j = 0; j < LIBMESH_DIM; ++j) for (unsigned int k = 0; k < LIBMESH_DIM; ++k) for (unsigned int l = 0; l < LIBMESH_DIM; ++l) { dpk2dev_dpk2(i, j, k, l) = 0.0; if (i == k && j == l) dpk2dev_dpk2(i, j, k, l) = 1.0; dpk2dev_dpk2(i, j, k, l) -= ce_inv(i, j) * _ce[qp](k, l) / 3.0; } val = dflowrate_dseqv * dpk2dev_dpk2.transposeMajor() * dseqv_dpk2dev; } return true; }
bool stznewHEVPFlowRatePowerLawJ2::computeTensorDerivative(unsigned int qp, const std::string & coupled_var_name, RankTwoTensor & val) const { val.zero(); if (_pk2_prop_name == coupled_var_name) { RankTwoTensor pk2_dev = computePK2Deviatoric(_pk2[qp], _ce[qp]); // Real s_xx = _tensor[qp](0,0); // Real s_yy = _tensor[qp](1,1); // Real tau_xy= _tensor[qp](0,1); // Real s_mean = 1.0/3.0*(s_xx+s_yy); // Real PI = 3.1415926; // Real tau_max = std::pow((s_xx-s_yy)/2*(s_xx-s_yy)/2+tau_xy*tau_xy,0.5); // Real eqv_stress = tau_max ; Real eqv_stress = computeEqvStress(pk2_dev, _ce[qp]); Real _pressure_eff=_grain_pressure-_biot*_pf[qp]; // Real _t_taunew = _agrain[qp]/std::sqrt(_grain_pressure/_rho); Real _t_taunew = _agrain[qp]/std::sqrt(_pressure_eff/_rho); // Real dflowrate_dseqv = _ref_flow_rate * _flow_rate_exponent * std::pow(eqv_stress/_strength[qp],_flow_rate_exponent-1.0)/_strength[qp]; // stz // Real dflowrate_dseqv = 1/_t_tau*std::exp(-1/_chiv[qp])*std::exp(eqv_stress/_grain_pressure/_chiv[qp])* \ // (1/(_grain_pressure*_chiv[qp])*(1-_strength[qp]/eqv_stress)+_strength[qp]/(eqv_stress*eqv_stress))*(eqv_stress>_strength[qp]); // Real dflowrate_dseqv; if (eqv_stress>_strength[qp]) // dflowrate_dseqv = 1/_t_tau*std::exp(-1/_chiv[qp])*std::exp(eqv_stress/_grain_pressure/_chiv[qp])* \ (1.0/(_grain_pressure*_chiv[qp])*(1.0-_strength[qp]/eqv_stress)+_strength[qp]/(eqv_stress*eqv_stress)); // Original Stuff { dflowrate_dseqv = 1/_t_taunew*std::exp(-1/_chiv[qp])*std::exp(eqv_stress/_pressure_eff/_chiv[qp])* \ (1.0/(_pressure_eff*_chiv[qp])*(1.0-_strength[qp]/eqv_stress)+_strength[qp]/(eqv_stress*eqv_stress)); } // Modified // { //dflowrate_dseqv = 1.0/_t_taunew*std::exp(-1.0/_chiv[qp])*(-1.0*_strength[qp])/(eqv_stress*eqv_stress); // } // dflowrate_dseqv = 1/_t_tau*std::exp(-1/_chi)*std::exp(eqv_stress/_grain_pressure/_chi)* \ // (1.0/(_grain_pressure*_chi)*(1.0-_strength[qp]/eqv_stress)+_strength[qp]/(eqv_stress*eqv_stress)); RankTwoTensor tau = pk2_dev * _ce[qp]; RankTwoTensor dseqv_dpk2dev; dseqv_dpk2dev.zero(); if (eqv_stress > _strength[qp]) dseqv_dpk2dev = 1.5/eqv_stress * tau * _ce[qp]; RankTwoTensor ce_inv = _ce[qp].inverse(); RankFourTensor dpk2dev_dpk2; for (unsigned int i = 0; i < LIBMESH_DIM; ++i) for (unsigned int j = 0; j < LIBMESH_DIM; ++j) for (unsigned int k = 0; k < LIBMESH_DIM; ++k) for (unsigned int l = 0; l < LIBMESH_DIM; ++l) { dpk2dev_dpk2(i, j, k, l) = 0.0; if (i==k && j==l) dpk2dev_dpk2(i, j, k, l) = 1.0; dpk2dev_dpk2(i, j, k, l) -= ce_inv(i, j) * _ce[qp](k, l)/3.0; } val = dflowrate_dseqv * dpk2dev_dpk2.transposeMajor() * dseqv_dpk2dev; } return true; }