1 /*!
2  * \file   AbaqusSymbolsGenerator.cxx
3  * \brief
4  * \author Thomas Helfer
5  * \date   19/07/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 <ostream>
15 #include "TFEL/Raise.hxx"
16 #include "MFront/BehaviourDescription.hxx"
17 #include "MFront/StandardBehaviourInterface.hxx"
18 #include "MFront/AbaqusInterface.hxx"
19 #include "MFront/AbaqusSymbolsGenerator.hxx"
20 
21 namespace mfront {
22 
23   AbaqusSymbolsGenerator::AbaqusSymbolsGenerator() = default;
24 
writeAdditionalSymbols(std::ostream &,const StandardBehaviourInterface &,const BehaviourDescription &,const FileDescription &,const std::string &,const Hypothesis) const25   void AbaqusSymbolsGenerator::writeAdditionalSymbols(
26       std::ostream&,
27       const StandardBehaviourInterface&,
28       const BehaviourDescription&,
29       const FileDescription&,
30       const std::string&,
31       const Hypothesis) const {
32   }  // end of AbaqusSymbolsGenerator::writeAdditionalSymbols
33 
writeSpecificSymbols(std::ostream & out,const StandardBehaviourInterface & i,const BehaviourDescription & mb,const FileDescription &,const std::string & name) const34   void AbaqusSymbolsGenerator::writeSpecificSymbols(
35       std::ostream& out,
36       const StandardBehaviourInterface& i,
37       const BehaviourDescription& mb,
38       const FileDescription&,
39       const std::string& name) const {
40     if (mb.getSymmetryType() == mfront::ORTHOTROPIC) {
41       if (!mb.hasAttribute(
42               AbaqusInterface::orthotropyManagementPolicy)) {
43         out << "MFRONT_SHAREDOBJ unsigned short "
44             << i.getFunctionNameBasis(name)
45             << "_OrthotropyManagementPolicy = 0u;\n\n";
46       } else {
47         const auto omp = mb.getAttribute<std::string>(
48             AbaqusInterface::orthotropyManagementPolicy);
49         if (omp == "MFront") {
50           out << "MFRONT_SHAREDOBJ unsigned short "
51               << i.getFunctionNameBasis(name)
52               << "_OrthotropyManagementPolicy = 2u;\n\n";
53         } else if (omp == "Native") {
54           out << "MFRONT_SHAREDOBJ unsigned short "
55               << i.getFunctionNameBasis(name)
56               << "_OrthotropyManagementPolicy = 1u;\n\n";
57         } else {
58           tfel::raise(
59               "AbaqusSymbolsGenerator::writeSpecificSymbols: "
60               "unsupported orthotropy management policy");
61         }
62       }
63     }
64   }  // end of AbaqusSymbolsGenerator::writeSpecificSymbols
65 
writeBehaviourTypeSymbols(std::ostream & out,const StandardBehaviourInterface & i,const BehaviourDescription & mb,const std::string & name) const66   void AbaqusSymbolsGenerator::writeBehaviourTypeSymbols(
67       std::ostream& out,
68       const StandardBehaviourInterface& i,
69       const BehaviourDescription& mb,
70       const std::string& name) const {
71     auto throw_if = [](const bool b, const std::string& m) {
72       tfel::raise_if(b,
73                      "AbaqusSymbolsGenerator::writeBehaviourTypeSymbols: " + m);
74     };
75     out << "MFRONT_SHAREDOBJ unsigned short "
76         << i.getFunctionNameBasis(name) << "_BehaviourType = ";
77     if (mb.getBehaviourType() ==
78         BehaviourDescription::STANDARDSTRAINBASEDBEHAVIOUR) {
79       if ((AbaqusInterfaceBase::hasFiniteStrainStrategy(mb)) &&
80           (AbaqusInterfaceBase::getFiniteStrainStrategy(mb) != "Native")) {
81         out << "2u;\n\n";
82       } else {
83         out << "1u;\n\n";
84       }
85     } else if (mb.getBehaviourType() ==
86                BehaviourDescription::STANDARDFINITESTRAINBEHAVIOUR) {
87       out << "2u;\n\n";
88     } else {
89       throw_if(true, "unsupported behaviour type");
90     }
91   }  // end of AbaqusSymbolsGenerator::writeBehaviourTypeSymbols
92 
writeBehaviourKinematicSymbols(std::ostream & out,const StandardBehaviourInterface & i,const BehaviourDescription & mb,const std::string & name) const93   void AbaqusSymbolsGenerator::writeBehaviourKinematicSymbols(
94       std::ostream& out,
95       const StandardBehaviourInterface& i,
96       const BehaviourDescription& mb,
97       const std::string& name) const {
98     auto throw_if = [](const bool b, const std::string& m) {
99       tfel::raise_if(
100           b, "AbaqusSymbolsGenerator::writeBehaviourKinematicSymbols: " + m);
101     };
102     out << "MFRONT_SHAREDOBJ unsigned short "
103         << i.getFunctionNameBasis(name) << "_BehaviourKinematic = ";
104     if (mb.getBehaviourType() ==
105         BehaviourDescription::STANDARDSTRAINBASEDBEHAVIOUR) {
106       if (AbaqusInterfaceBase::hasFiniteStrainStrategy(mb)) {
107         out << "3u;\n\n";
108       } else {
109         out << "1u;\n\n";
110       }
111     } else if (mb.getBehaviourType() ==
112                BehaviourDescription::STANDARDFINITESTRAINBEHAVIOUR) {
113       out << "3u;\n\n";
114     } else {
115       throw_if(true, "unsupported behaviour type");
116     }
117   }  // end of AbaqusSymbolsGenerator::writeBehaviourKinematicSymbols
118 
handleStrainMeasure() const119   bool AbaqusSymbolsGenerator::handleStrainMeasure() const{
120     return true;
121   }  // end of AbaqusSymbolsGenerator::handleStrainMeasure
122 
123   AbaqusSymbolsGenerator::~AbaqusSymbolsGenerator() = default;
124 
125 }  // end of namespace mfront
126