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