1 /*!
2  * \file   KinematicHardeningRuleBase.cxx
3  * \brief
4  * \author Thomas Helfer
5  * \date   04/04/2018
6  * \copyright Copyright (C) 2006-2018 CEA/DEN, EDF R&D. All rights
7  * reserved.
8  * This project is publicly released under either the GNU GPL Licence
9  * or the CECILL-A licence. A copy of thoses licences are delivered
10  * with the sources of TFEL. CEA or EDF may also distribute this
11  * project under specific licensing conditions.
12  */
13 
14 #include <sstream>
15 #include "TFEL/Raise.hxx"
16 #include "MFront/BehaviourBrick/BrickUtilities.hxx"
17 #include "MFront/BehaviourBrick/OptionDescription.hxx"
18 #include "MFront/BehaviourBrick/KinematicHardeningRuleBase.hxx"
19 
20 namespace mfront {
21 
22   namespace bbrick {
23 
getOptions() const24     std::vector<OptionDescription> KinematicHardeningRuleBase::getOptions()
25         const {
26       auto opts = std::vector<OptionDescription>{};
27       opts.emplace_back("C", "kinematic moduli",
28                         OptionDescription::MATERIALPROPERTY);
29       return opts;
30     }  // end of KinematicHardeningRuleBase::getOptions()
31 
initialize(BehaviourDescription & bd,AbstractBehaviourDSL & dsl,const std::string & fid,const std::string & kid,const DataMap & d)32     void KinematicHardeningRuleBase::initialize(BehaviourDescription& bd,
33                                                 AbstractBehaviourDSL& dsl,
34                                                 const std::string& fid,
35                                                 const std::string& kid,
36                                                 const DataMap& d) {
37       constexpr const auto uh = ModellingHypothesis::UNDEFINEDHYPOTHESIS;
38       const auto an = KinematicHardeningRule::getVariableId("a", fid, kid);
39       const auto Xn = KinematicHardeningRule::getVariableId("X", fid, kid);
40       const auto Cn = KinematicHardeningRule::getVariableId("C", fid, kid);
41       const auto en = KinematicHardeningRule::getVariableId("BackStrain", fid, kid);
42       addStateVariable(bd, "StrainStensor", an, en);
43       // kinematic moduli
44       tfel::raise_if(d.count("C") == 0,
45                      "KinematicHardeningRuleBase::initialize: "
46                      "material property 'C' is not defined");
47       this->C = getBehaviourDescriptionMaterialProperty(dsl, "C", d.at("C"));
48       declareParameterOrLocalVariable(bd, this->C, "stress", Cn);
49       // kinematic hardening at the beginning of the time step
50       bd.reserveName(uh, Xn);
51       // kinematic hardening at the middle of the time step
52       bd.reserveName(uh, Xn + '_');
53       // back strain at the middle of the time step
54       bd.reserveName(uh, an + '_');
55     }  // end of KinematicHardeningRuleBase::initialize
56 
getBackStrainVariable(const std::string & fid,const std::string & kid) const57     std::string KinematicHardeningRuleBase::getBackStrainVariable(
58         const std::string& fid, const std::string& kid) const {
59       return KinematicHardeningRule::getVariableId("a", fid, kid);
60     }  // end of KinematicHardeningRuleBase::getBackStrainVariable
61 
getBackStressDerivative(const std::string & fid,const std::string & kid) const62     std::string KinematicHardeningRuleBase::getBackStressDerivative(
63         const std::string& fid, const std::string& kid) const {
64       const auto Cn = KinematicHardeningRule::getVariableId("C", fid, kid);
65       return "((2 * (this->theta) * ((this->" + Cn + ")/3)) * (Stensor4::Id()))";
66     }  // end of KinematicHardeningRuleBase::getBackStressDerivative
67 
generateImplicitEquationDerivatives(const std::string & v,const std::string & mdfv_ds,const std::string & fid,const std::string & kid) const68     std::string KinematicHardeningRuleBase::generateImplicitEquationDerivatives(
69         const std::string& v,
70         const std::string& mdfv_ds,
71         const std::string& fid,
72         const std::string& kid) const {
73       const auto an = KinematicHardeningRule::getVariableId("a", fid, kid);
74       const auto Cn = KinematicHardeningRule::getVariableId("C", fid, kid);
75       auto c = std::string{};
76       c += "df" + v + "_dd" + an + " += ";
77       c += "(2*(this->theta)*((this->" + Cn + ")/3))*(" + mdfv_ds + ");\n";
78       return c;
79     }
80 
endTreatment(BehaviourDescription & bd,const AbstractBehaviourDSL & dsl,const std::string & fid,const std::string & kid) const81     void KinematicHardeningRuleBase::endTreatment(
82         BehaviourDescription& bd,
83         const AbstractBehaviourDSL& dsl,
84         const std::string& fid,
85         const std::string& kid) const {
86       constexpr const auto uh = ModellingHypothesis::UNDEFINEDHYPOTHESIS;
87       auto mts = getMiddleOfTimeStepModifier(bd);
88       if (!this->C.is<BehaviourDescription::ConstantMaterialProperty>()) {
89         const auto Cn = KinematicHardeningRule::getVariableId("C", fid, kid);
90         CodeBlock i;
91         std::ostringstream mps;
92         mps << "this->" + Cn + " = ";
93         dsl.writeMaterialPropertyEvaluation(mps, this->C, mts);
94         mps << ";\n";
95         i.code += mps.str();
96         bd.setCode(uh, BehaviourData::BeforeInitializeLocalVariables, i,
97                    BehaviourData::CREATEORAPPEND, BehaviourData::AT_BEGINNING);
98       }
99     }  // end of KinematicHardeningRuleBase::endTreatment
100 
101     std::vector<std::string>
getKinematicHardeningsVariables(const std::string & fid,const std::string & kid) const102     KinematicHardeningRuleBase::getKinematicHardeningsVariables(
103         const std::string& fid, const std::string& kid) const {
104       return {KinematicHardeningRule::getVariableId("X", fid, kid)};
105     }  // end of KinematicHardeningRuleBase::getKinematicHardeningsVariables
106 
107     std::string
computeKinematicHardeningsInitialValues(const std::string & fid,const std::string & kid) const108     KinematicHardeningRuleBase::computeKinematicHardeningsInitialValues(
109         const std::string& fid, const std::string& kid) const {
110       const auto an = KinematicHardeningRule::getVariableId("a", fid, kid);
111       const auto Xn = KinematicHardeningRule::getVariableId("X", fid, kid);
112       const auto Cn = KinematicHardeningRule::getVariableId("C", fid, kid);
113       return "const auto " + Xn + "  = eval(2*(this->" + Cn + ")*(this->" + an +
114              ")/3);\n";
115     }  // end of
116        // KinematicHardeningRuleBase::computeKinematicHardeningsInitialValues
117 
computeKinematicHardenings(const std::string & fid,const std::string & kid) const118     std::string KinematicHardeningRuleBase::computeKinematicHardenings(
119         const std::string& fid, const std::string& kid) const {
120       const auto an = KinematicHardeningRule::getVariableId("a", fid, kid);
121       const auto Xn = KinematicHardeningRule::getVariableId("X", fid, kid);
122       const auto Cn = KinematicHardeningRule::getVariableId("C", fid, kid);
123       auto c = std::string{};
124       c += "const auto " + an + "_  = eval(this->" + an +
125            "+(this->theta)*(this->d" + an + "));\n";
126       c += "const auto " + Xn + "_  = eval(2*(this->" + Cn + ")*" + an +
127            "_/3);\n";
128       return c;
129     }  // end of KinematicHardeningRuleBase::computeKinematicHardenings
130 
131     KinematicHardeningRuleBase::~KinematicHardeningRuleBase() = default;
132 
133   }  // end of namespace bbrick
134 
135 }  // end of namespace mfront
136