1 /*!
2  * \file   include/TFEL/Material/ChuNeedleman1980StressBasedNucleationModel.hxx
3  * \brief
4  * \author Thomas Helfer
5  * \date   04/04/2020
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 #ifndef LIB_TFEL_MATERIAL_CHUNEEDLEMAN1980STRESSBASEDNUCLEATIONMODEL_HXX
15 #define LIB_TFEL_MATERIAL_CHUNEEDLEMAN1980STRESSBASEDNUCLEATIONMODEL_HXX
16 
17 #include <tuple>
18 #include <ostream>
19 #include "TFEL/Config/TFELTypes.hxx"
20 #include "TFEL/Math/General/ResultType.hxx"
21 #include "TFEL/Math/stensor.hxx"
22 
23 namespace tfel {
24 
25   namespace material {
26 
27     //! \brief a simple alias
28     template <typename StressStensorType>
29     using ChuNeedleman1980StressBasedNucleationModelStressType =
30         tfel::math::StensorNumType<StressStensorType>;
31     //! \brief a simple alias
32     template <typename StressStensorType>
33     using ChuNeedleman1980StressBasedNucleationModelRealType =
34         tfel::typetraits::base_type<tfel::math::StensorNumType<StressStensorType>>;
35     //! \brief a simple alias
36     template <typename StressStensorType>
37     using ChuNeedleman1980StressBasedNucleationModelInverseStressType =
38         tfel::math::result_type<
39             ChuNeedleman1980StressBasedNucleationModelRealType<StressStensorType>,
40             ChuNeedleman1980StressBasedNucleationModelStressType<StressStensorType>,
41             tfel::math::OpDiv>;
42     //! \brief a simple alias
43     template <typename StressStensorType>
44     using ChuNeedleman1980StressBasedNucleationModeDerivativeType =
45         tfel::math::stensor<
46             tfel::math::StensorTraits<StressStensorType>::dime,
47             ChuNeedleman1980StressBasedNucleationModelInverseStressType<
48                 StressStensorType>>;
49 
50     /*!
51      * \brief parameters of the strain version of the nucleation model
52      * proposed by Chu and Needleman.
53      *
54      * Chu, C. C., and A. Needleman. 1980.
55      * “Void Nucleation Effects in Biaxially Stretched Sheets.”
56      * Journal of Engineering Materials and Technology 102 (3): 249–56
57      */
58     template <typename StressStensorType>
59     struct ChuNeedleman1980StressBasedNucleationModelParameters {
60       //! \brief factor in front of the gaussian distribution
61       ChuNeedleman1980StressBasedNucleationModelStressType<StressStensorType> fn;
62       //! \brief mean value of the gaussian distribution
63       ChuNeedleman1980StressBasedNucleationModelStressType<StressStensorType> sigm;
64       //! \brief standard deviation of the gaussian distribution
65       ChuNeedleman1980StressBasedNucleationModelStressType<StressStensorType> sn;
66     };  // end of struct ChuNeedleman1980StressBasedNucleationModelParameters
67 
68     /*!
69      * \brief stream operator
70      * \return the output stream
71      * \tparam real: numeric type
72      * \tparam use_qt: flag stating if quantities are used
73      * \param[in] os: output stream
74      * \param[in] p: parameters
75      */
76     template <typename StressStensorType>
77     std::ostream& operator<<(
78         std::ostream&,
79         const ChuNeedleman1980StressBasedNucleationModelParameters<
80             StressStensorType>&);
81     /*!
82      * \brief computes the porosity rate factor \f$A_{n}\f$ as defined by
83      * the nucleation model of Chu and Needleman.
84      *
85      * \f[
86      * A_{n} = \frac{f_N}{s_N \sqrt{2\pi}}
87      *         \exp\left(-\frac{1}{2}
88      *                    \left(\frac{\sigma_{I} - \epsilon_N}{s_N}\right)^2\right)
89      * \f]
90      *
91      * Chu, C. C., and A. Needleman. 1980.
92      * “Void Nucleation Effects in Biaxially Stretched Sheets.”
93      * Journal of Engineering Materials and Technology 102 (3): 249–56
94      *
95      * \param[in] params: parameters
96      * \param[in] sig: stress tensor
97      * \param[in] p: equivalent plastic strain (unused)
98      */
99     template <typename StressStensorType>
100     ChuNeedleman1980StressBasedNucleationModelRealType<StressStensorType>
101     computeChuNeedleman1980StressBasedNucleationModelPorosityRateFactor(
102         const ChuNeedleman1980StressBasedNucleationModelParameters<
103             StressStensorType>&,
104         const StressStensorType&,
105         const ChuNeedleman1980StressBasedNucleationModelRealType<
106             StressStensorType>&);
107 
108     /*!
109      * \brief computes the porosity rate factor \f$A_{n}\f$ as defined by
110      * the nucleation model of Chu and Needleman and its derivative
111      * \f$\frac{\partial A_{n}}{\partial \underline{\sigma}}\f$ with respect to the
112      * stress.
113      *
114      * \f[
115      * A_{n} = \frac{f_N}{s_N \sqrt{2\pi}}
116      *         \exp\left(-\frac{1}{2}
117      *                    \left(\frac{\sigma_{I} - \epsilon_N}{s_N}\right)^2\right)
118      * \f]
119      *
120      * Chu, C. C., and A. Needleman. 1980.
121      * “Void Nucleation Effects in Biaxially Stretched Sheets.”
122      * Journal of Engineering Materials and Technology 102 (3): 249–56
123      *
124      * \param[in] params: parameters
125      * \param[in] sig: stress tensor
126      * \param[in] p: equivalent plastic strain (unused)
127      */
128     template <typename StressStensorType>
129     std::tuple<
130         ChuNeedleman1980StressBasedNucleationModelRealType<StressStensorType>,
131         ChuNeedleman1980StressBasedNucleationModeDerivativeType<
132             StressStensorType>>
133     computeChuNeedleman1980StressBasedNucleationModelPorosityRateFactorAndDerivative(
134         const ChuNeedleman1980StressBasedNucleationModelParameters<
135             StressStensorType>&,
136         const StressStensorType&,
137         const ChuNeedleman1980StressBasedNucleationModelRealType<
138             StressStensorType>&);
139 
140   }  // end of namespace material
141 
142 }  // end of namespace tfel
143 
144 #include "TFEL/Material/ChuNeedleman1980StressBasedNucleationModel.ixx"
145 
146 #endif /* LIB_TFEL_MATERIAL_CHUNEEDLEMAN1980STRESSBASEDNUCLEATIONMODEL_HXX */
147