Skip to content
Snippets Groups Projects
Commit 66842576 authored by wenqing's avatar wenqing
Browse files

[BGRaCreep] Changed the type of parameters of the creep model.

parent 3850c63d
No related branches found
No related tags found
No related merge requests found
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "BaseLib/Error.h" #include "BaseLib/Error.h"
#include "ProcessLib/Parameter/Parameter.h" #include "ProcessLib/Parameter/Parameter.h"
#include "ProcessLib/Utils/ProcessUtils.h" // required for findParameter
namespace MaterialLib namespace MaterialLib
{ {
...@@ -39,27 +40,27 @@ createCreepBGRa( ...@@ -39,27 +40,27 @@ createCreepBGRa(
config.checkConfigParameter("type", "CreepBGRa"); config.checkConfigParameter("type", "CreepBGRa");
DBUG("Create CreepBGRa material"); DBUG("Create CreepBGRa material");
// Read elastic data frist. // Read elastic data first.
const bool skip_type_checking = true; const bool skip_type_checking = true;
auto elastic_data = auto elastic_data =
MaterialLib::Solids::createLinearElasticIsotropic<DisplacementDim>( MaterialLib::Solids::createLinearElasticIsotropic<DisplacementDim>(
parameters, config, skip_type_checking); parameters, config, skip_type_checking);
//! \ogs_file_param_special{material__solid__constitutive_relation__CreepBGRa__a} auto& A = ProcessLib::findParameter<double>(
const auto A = config.getConfigParameter<double>("a"); //! \ogs_file_param_special{material__solid__constitutive_relation__CreepBGRa__a}
DBUG("CreepBGRa parameter A=%g", A); config, "a", parameters, 1);
//! \ogs_file_param_special{material__solid__constitutive_relation__CreepBGRa__n} auto& n = ProcessLib::findParameter<double>(
const auto n = config.getConfigParameter<double>("n"); //! \ogs_file_param_special{material__solid__constitutive_relation__CreepBGRa__n}
DBUG("CreepBGRa parameter n=%g", n); config, "n", parameters, 1);
//! \ogs_file_param_special{material__solid__constitutive_relation__CreepBGRa__sigma0} auto& sigma0 = ProcessLib::findParameter<double>(
const auto sigma0 = config.getConfigParameter<double>("sigma0"); //! \ogs_file_param_special{material__solid__constitutive_relation__CreepBGRa__sigma0}
DBUG("CreepBGRa parameter sigma0=%g", sigma0); config, "sigma0", parameters, 1);
//! \ogs_file_param_special{material__solid__constitutive_relation__CreepBGRa__q} auto& Q = ProcessLib::findParameter<double>(
const auto Q = config.getConfigParameter<double>("q"); //! \ogs_file_param_special{material__solid__constitutive_relation__CreepBGRa__q}
DBUG("CreepBGRa parameter Q=%g", Q); config, "q", parameters, 1);
auto const nonlinear_solver_parameters = auto const nonlinear_solver_parameters =
createNewtonRaphsonSolverParameters(config); createNewtonRaphsonSolverParameters(config);
......
...@@ -43,9 +43,16 @@ CreepBGRa<DisplacementDim>::integrateStress( ...@@ -43,9 +43,16 @@ CreepBGRa<DisplacementDim>::integrateStress(
KelvinVector sigma_try = sigma_prev + C * (eps - eps_prev); KelvinVector sigma_try = sigma_prev + C * (eps - eps_prev);
ResidualVectorType solution = sigma_try; ResidualVectorType solution = sigma_try;
const double A = _a(t, x)[0];
const double n = _n(t, x)[0];
const double sigma0 = _sigma_f(t, x)[0];
const double Q = _q(t, x)[0];
const double coef = A * std::pow(1.5, 0.5 * (1 + n)) / std::pow(sigma0, n);
const double b = const double b =
dt * _coef * dt * coef *
std::exp(-_q / (MaterialLib::PhysicalConstant::IdealGasConstant * T)); std::exp(-Q / (MaterialLib::PhysicalConstant::IdealGasConstant * T));
auto const& deviatoric_matrix = Invariants::deviatoric_projection; auto const& deviatoric_matrix = Invariants::deviatoric_projection;
// In newton_solver.solve(), the Jacobian is calculated first, and then // In newton_solver.solve(), the Jacobian is calculated first, and then
...@@ -65,12 +72,12 @@ CreepBGRa<DisplacementDim>::integrateStress( ...@@ -65,12 +72,12 @@ CreepBGRa<DisplacementDim>::integrateStress(
double const norm_s_n1 = Invariants::FrobeniusNorm(s_n1); double const norm_s_n1 = Invariants::FrobeniusNorm(s_n1);
// side effect // side effect
pow_norm_s_n1_n_minus_one_2b_G = pow_norm_s_n1_n_minus_one_2b_G =
2.0 * b * this->_mp.mu(t, x) * std::pow(norm_s_n1, _n - 1); 2.0 * b * this->_mp.mu(t, x) * std::pow(norm_s_n1, n - 1);
jacobian = KelvinMatrix::Identity() + jacobian =
pow_norm_s_n1_n_minus_one_2b_G * KelvinMatrix::Identity() +
(deviatoric_matrix + pow_norm_s_n1_n_minus_one_2b_G *
((_n - 1) / (norm_s_n1 * norm_s_n1)) * s_n1 * (deviatoric_matrix +
s_n1.transpose()); ((n - 1) / (norm_s_n1 * norm_s_n1)) * s_n1 * s_n1.transpose());
}; };
auto const update_residual = [&](ResidualVectorType& r) { auto const update_residual = [&](ResidualVectorType& r) {
...@@ -110,11 +117,17 @@ double CreepBGRa<DisplacementDim>::getTemperatureRelatedCoefficient( ...@@ -110,11 +117,17 @@ double CreepBGRa<DisplacementDim>::getTemperatureRelatedCoefficient(
double const t, double const dt, ProcessLib::SpatialPosition const& x, double const t, double const dt, ProcessLib::SpatialPosition const& x,
double const T, double const deviatoric_stress_norm) const double const T, double const deviatoric_stress_norm) const
{ {
return 2.0 * _coef * const double A = _a(t, x)[0];
std::exp(-_q / const double n = _n(t, x)[0];
const double sigma0 = _sigma_f(t, x)[0];
const double Q = _q(t, x)[0];
const double coef = A * std::pow(1.5, 0.5 * (1 + n)) / std::pow(sigma0, n);
return 2.0 * coef *
std::exp(-Q /
(MaterialLib::PhysicalConstant::IdealGasConstant * T)) * (MaterialLib::PhysicalConstant::IdealGasConstant * T)) *
this->_mp.mu(t, x) * std::pow(deviatoric_stress_norm, _n - 1) * dt * this->_mp.mu(t, x) * std::pow(deviatoric_stress_norm, n - 1) * dt *
_q / (MaterialLib::PhysicalConstant::IdealGasConstant * T * T); Q / (MaterialLib::PhysicalConstant::IdealGasConstant * T * T);
} }
template class CreepBGRa<2>; template class CreepBGRa<2>;
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "LinearElasticIsotropic.h" #include "LinearElasticIsotropic.h"
#include "MathLib/KelvinVector.h" #include "MathLib/KelvinVector.h"
#include "NumLib/NewtonRaphson.h" #include "NumLib/NewtonRaphson.h"
#include "ProcessLib/Parameter/Parameter.h"
namespace MaterialLib namespace MaterialLib
{ {
...@@ -50,6 +51,8 @@ public: ...@@ -50,6 +51,8 @@ public:
using KelvinMatrix = using KelvinMatrix =
MathLib::KelvinVector::KelvinMatrixType<DisplacementDim>; MathLib::KelvinVector::KelvinMatrixType<DisplacementDim>;
using Parameter = ProcessLib::Parameter<double>;
std::unique_ptr< std::unique_ptr<
typename MechanicsBase<DisplacementDim>::MaterialStateVariables> typename MechanicsBase<DisplacementDim>::MaterialStateVariables>
createMaterialStateVariables() override createMaterialStateVariables() override
...@@ -61,19 +64,21 @@ public: ...@@ -61,19 +64,21 @@ public:
CreepBGRa( CreepBGRa(
typename LinearElasticIsotropic<DisplacementDim>::MaterialProperties mp, typename LinearElasticIsotropic<DisplacementDim>::MaterialProperties mp,
NumLib::NewtonRaphsonSolverParameters nonlinear_solver_parameters, NumLib::NewtonRaphsonSolverParameters nonlinear_solver_parameters,
const double A, const double n, const double sigma0, const double Q) Parameter const& A, Parameter const& n, Parameter const& sigma_f,
Parameter const& Q)
: LinearElasticIsotropic<DisplacementDim>(std::move(mp)), : LinearElasticIsotropic<DisplacementDim>(std::move(mp)),
_nonlinear_solver_parameters(std::move(nonlinear_solver_parameters)), _nonlinear_solver_parameters(std::move(nonlinear_solver_parameters)),
_a(A),
_n(n), _n(n),
_coef(A * std::pow(1.5, 0.5 * (1 + _n)) / std::pow(sigma0, _n)), _sigma_f(sigma_f),
_q(Q) _q(Q)
{ {
} }
boost::optional<std::tuple<KelvinVector, boost::optional<
std::unique_ptr<typename MechanicsBase< std::tuple<KelvinVector, std::unique_ptr<typename MechanicsBase<
DisplacementDim>::MaterialStateVariables>, DisplacementDim>::MaterialStateVariables>,
KelvinMatrix>> KelvinMatrix>>
integrateStress( integrateStress(
double const t, ProcessLib::SpatialPosition const& x, double const dt, double const t, ProcessLib::SpatialPosition const& x, double const dt,
KelvinVector const& eps_prev, KelvinVector const& eps, KelvinVector const& eps_prev, KelvinVector const& eps,
...@@ -94,10 +99,10 @@ public: ...@@ -94,10 +99,10 @@ public:
private: private:
NumLib::NewtonRaphsonSolverParameters const _nonlinear_solver_parameters; NumLib::NewtonRaphsonSolverParameters const _nonlinear_solver_parameters;
const double _n; /// Creep rate exponent n. Parameter const& _a; /// A parameter determined by experiment.
/// \f$A\left(\frac{3}{2}\right)^{n/2+1}/\sigma_{eff}^n \f$ Parameter const& _n; /// Creep rate exponent n.
const double _coef; Parameter const& _sigma_f; /// A stress scaling factor.
const double _q; /// Activation energy Parameter const& _q; /// Activation energy
}; };
extern template class CreepBGRa<2>; extern template class CreepBGRa<2>;
......
...@@ -15,10 +15,10 @@ ...@@ -15,10 +15,10 @@
<type>CreepBGRa</type> <type>CreepBGRa</type>
<youngs_modulus>E</youngs_modulus> <youngs_modulus>E</youngs_modulus>
<poissons_ratio>nu</poissons_ratio> <poissons_ratio>nu</poissons_ratio>
<a>2.0833333333333334e-06</a> <a>A</a>
<n>4.9</n> <n>n</n>
<sigma0>1e6</sigma0> <sigma0>sigma_f</sigma0>
<q>54000</q> <q>Q</q>
<nonlinear_solver> <nonlinear_solver>
<maximum_iterations>1000</maximum_iterations> <maximum_iterations>1000</maximum_iterations>
<error_tolerance>2e-8</error_tolerance> <error_tolerance>2e-8</error_tolerance>
...@@ -109,6 +109,27 @@ ...@@ -109,6 +109,27 @@
</time_loop> </time_loop>
<parameters> <parameters>
<parameter>
<name>A</name>
<type>Constant</type>
<value>2.0833333333333334e-06</value>
</parameter>
<parameter>
<name>n</name>
<type>Constant</type>
<value>4.9</value>
</parameter>
<parameter>
<name>sigma_f</name>
<type>Constant</type>
<value>1.0e+6</value>
</parameter>
<parameter>
<name>Q</name>
<type>Constant</type>
<value>54000</value>
</parameter>
<parameter> <parameter>
<name>E</name> <name>E</name>
<type>MeshElement</type> <type>MeshElement</type>
......
...@@ -11,10 +11,10 @@ ...@@ -11,10 +11,10 @@
<type>CreepBGRa</type> <type>CreepBGRa</type>
<youngs_modulus>E</youngs_modulus> <youngs_modulus>E</youngs_modulus>
<poissons_ratio>nu</poissons_ratio> <poissons_ratio>nu</poissons_ratio>
<a>0.18</a> <a>A</a>
<n>5.0</n> <n>n</n>
<sigma0>1</sigma0> <sigma0>sigma_f</sigma0>
<q>54000</q> <q>Q</q>
<nonlinear_solver> <nonlinear_solver>
<maximum_iterations>1000</maximum_iterations> <maximum_iterations>1000</maximum_iterations>
<error_tolerance>1e-8</error_tolerance> <error_tolerance>1e-8</error_tolerance>
...@@ -105,6 +105,27 @@ ...@@ -105,6 +105,27 @@
</time_loop> </time_loop>
<parameters> <parameters>
<parameter>
<name>A</name>
<type>Constant</type>
<value>0.18</value>
</parameter>
<parameter>
<name>n</name>
<type>Constant</type>
<value>5.0</value>
</parameter>
<parameter>
<name>sigma_f</name>
<type>Constant</type>
<value>1</value>
</parameter>
<parameter>
<name>Q</name>
<type>Constant</type>
<value>54000</value>
</parameter>
<parameter> <parameter>
<name>E</name> <name>E</name>
<type>Constant</type> <type>Constant</type>
......
...@@ -11,10 +11,10 @@ ...@@ -11,10 +11,10 @@
<type>CreepBGRa</type> <type>CreepBGRa</type>
<youngs_modulus>E</youngs_modulus> <youngs_modulus>E</youngs_modulus>
<poissons_ratio>nu</poissons_ratio> <poissons_ratio>nu</poissons_ratio>
<a>0.18</a> <a>A</a>
<n>5.0</n> <n>n</n>
<sigma0>1</sigma0> <sigma0>sigma_f</sigma0>
<q>54000</q> <q>Q</q>
<nonlinear_solver> <nonlinear_solver>
<maximum_iterations>1000</maximum_iterations> <maximum_iterations>1000</maximum_iterations>
<error_tolerance>1e-8</error_tolerance> <error_tolerance>1e-8</error_tolerance>
...@@ -93,6 +93,27 @@ ...@@ -93,6 +93,27 @@
</time_loop> </time_loop>
<parameters> <parameters>
<parameter>
<name>A</name>
<type>Constant</type>
<value>0.18</value>
</parameter>
<parameter>
<name>n</name>
<type>Constant</type>
<value>5.0</value>
</parameter>
<parameter>
<name>sigma_f</name>
<type>Constant</type>
<value>1</value>
</parameter>
<parameter>
<name>Q</name>
<type>Constant</type>
<value>54000</value>
</parameter>
<parameter> <parameter>
<name>E</name> <name>E</name>
<type>Constant</type> <type>Constant</type>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment