From dc546c6f678150909110eb3c0288fd45f0cfa0c8 Mon Sep 17 00:00:00 2001 From: jain651 Date: Mon, 27 Sep 2021 01:52:16 -0600 Subject: [PATCH] adding damage plasticity model for concrete ref #184 --- doc/content/bib/blackbear.bib | 47 ++ .../media/Return_mapping_flow_chart.png | Bin 0 -> 114214 bytes .../ComputeMultipleInelasticDamageStress.md | 21 + .../materials/DamagePlasticityStressUpdate.md | 346 +++++++++ .../ComputeMultipleInelasticDamageStress.h | 42 ++ .../materials/DamagePlasticityStressUpdate.h | 184 +++++ .../ComputeMultipleInelasticDamageStress.C | 73 ++ src/materials/DamagePlasticityStressUpdate.C | 682 ++++++++++++++++++ .../gold/dilatancy_out.csv | 52 ++ .../gold/shear_test_out.csv | 32 + .../gold/uniaxial_compression_out.csv | 52 ++ .../gold/uniaxial_tension_2elem_out.csv | 25 + .../gold/uniaxial_tension_out.csv | 52 ++ test/tests/damage_plasticity_model/plots.py | 56 ++ .../damage_plasticity_model/shear_test.i | 214 ++++++ test/tests/damage_plasticity_model/tests | 57 ++ .../damage_plasticity_model/uniaxial_test.i | 232 ++++++ 17 files changed, 2167 insertions(+) create mode 100644 doc/content/media/Return_mapping_flow_chart.png create mode 100644 doc/content/source/materials/ComputeMultipleInelasticDamageStress.md create mode 100644 doc/content/source/materials/DamagePlasticityStressUpdate.md create mode 100644 include/materials/ComputeMultipleInelasticDamageStress.h create mode 100644 include/materials/DamagePlasticityStressUpdate.h create mode 100644 src/materials/ComputeMultipleInelasticDamageStress.C create mode 100644 src/materials/DamagePlasticityStressUpdate.C create mode 100644 test/tests/damage_plasticity_model/gold/dilatancy_out.csv create mode 100644 test/tests/damage_plasticity_model/gold/shear_test_out.csv create mode 100644 test/tests/damage_plasticity_model/gold/uniaxial_compression_out.csv create mode 100644 test/tests/damage_plasticity_model/gold/uniaxial_tension_2elem_out.csv create mode 100644 test/tests/damage_plasticity_model/gold/uniaxial_tension_out.csv create mode 100755 test/tests/damage_plasticity_model/plots.py create mode 100644 test/tests/damage_plasticity_model/shear_test.i create mode 100644 test/tests/damage_plasticity_model/tests create mode 100644 test/tests/damage_plasticity_model/uniaxial_test.i diff --git a/doc/content/bib/blackbear.bib b/doc/content/bib/blackbear.bib index 29c911b6..f5fa6ac0 100644 --- a/doc/content/bib/blackbear.bib +++ b/doc/content/bib/blackbear.bib @@ -244,3 +244,50 @@ @article{poyet2009temperature year={2009}, publisher={Elsevier} } + + @article{lee1998plastic, + title={Plastic-damage model for cyclic loading of concrete structures}, + author={Lee, Jeeho and Fenves, Gregory L}, + journal={Journal of engineering mechanics}, + volume={124}, + number={8}, + pages={892--900}, + year={1998}, + publisher={American Society of Civil Engineers} +} + +@book{lee1996theory, + title={Theory and implementation of plastic-damage model for concrete structures under cyclic and dynamic loading}, + author={Lee, Jeeho}, + year={1996}, + publisher={University of California, Berkeley} +} + +@article{wilkins2020method, + title = {A method for smoothing multiple yield functions}, + author = {Andy Wilkins and Benjamin W. Spencer and Amit Jain and Bora Gencturk}, + year = {2020}, +journal = {International Journal for Numerical Methods in Engineering}, + volume = {121}, + number = {3}, + pages = {434--449}, + doi = {10.1002/nme.6215} +} + +@article{lubliner1989plastic, + title={A plastic-damage model for concrete}, + author={Lubliner, Jacob and Oliver, Javier and Oller, Sand and Onate, EJIJos}, + journal={International Journal of solids and structures}, + volume={25}, + number={3}, + pages={299--326}, + year={1989}, + publisher={Elsevier} +} + +@article{krabbenhoft2002basic, + title={Basic computational plasticity}, + author={Krabbenh{\o}ft, KRISTIAN}, + journal={University of Denmark}, + year={2002} +} diff --git a/doc/content/media/Return_mapping_flow_chart.png b/doc/content/media/Return_mapping_flow_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..aebf3738979c30f0109c47e8e1dc6cbe8e60cc8c GIT binary patch literal 114214 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�V^hw1f+Wn#H;lm^>c{ADk;we0iJCW3v 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%0Ak`^DmtW`HdWx6lN7=av5=c1SXS=rt|C&jytgV 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 Ay#N3J literal 0 HcmV?d00001 diff --git a/doc/content/source/materials/ComputeMultipleInelasticDamageStress.md b/doc/content/source/materials/ComputeMultipleInelasticDamageStress.md new file mode 100644 index 00000000..eeaceb64 --- /dev/null +++ b/doc/content/source/materials/ComputeMultipleInelasticDamageStress.md @@ -0,0 +1,21 @@ +# Compute Multiple Inelastic Damage Stress + +!syntax description /Materials/ComputeMultipleInelasticDamageStress + +## Description + +`ComputeMultipleInelasticDamageStress` computes the damage stress. + +## Example Input Files + +The input settings for the inelastic material model is as follows + +!listing test/tests/damage_plasticity_model/uniaxial_test.i block=Materials/stress + +!syntax parameters /Materials/ComputeMultipleInelasticDamageStress + +!syntax inputs /Materials/ComputeMultipleInelasticDamageStress + +!syntax children /Materials/ComputeMultipleInelasticDamageStress + +!bibtex bibliography diff --git a/doc/content/source/materials/DamagePlasticityStressUpdate.md b/doc/content/source/materials/DamagePlasticityStressUpdate.md new file mode 100644 index 00000000..689cd492 --- /dev/null +++ b/doc/content/source/materials/DamagePlasticityStressUpdate.md @@ -0,0 +1,346 @@ +# Damage Plasticity Model + +The [!cite](lee1996theory) model accounts for the independent damage in tension and compression. It also accounts for degradation of the elastic modulus of the concrete as the loading goes beyond yielding in either tension or compression. The model uses the incremental theory of plasticity and decomposes the total strain, $\boldsymbol{\varepsilon}$, into elastic strain, $\boldsymbol{\varepsilon}^{e}$, and plastic strain, $\boldsymbol{\varepsilon}^{p}$, as follows +\begin{equation} + \boldsymbol{\varepsilon} = \boldsymbol{\varepsilon}^{e} + \boldsymbol{\varepsilon}^{p} \label{eps_def} +\end{equation} +where bold symbol represents a vectoral or tensorial quantity. The relation between elastic strain and the stress, $\boldsymbol{\sigma}$, is given by +\begin{equation} + \boldsymbol{\varepsilon}^{e} = \boldsymbol{\mathfrak{E}}^{-1}:\boldsymbol{\sigma} \label{eps_e_def} +\end{equation} +where $\boldsymbol{\mathfrak{E}}$ is the elasticity tensor. Using Eqs. \eqref{eps_def}-\eqref{eps_e_def}, the relation between $\boldsymbol{\sigma}$ and $\boldsymbol{\varepsilon}^{p}$ is expressed as +\begin{equation} + \boldsymbol{\sigma} = \boldsymbol{\mathfrak{E}}:\left(\boldsymbol{\varepsilon} - \boldsymbol{\varepsilon}^{e}\right) +\end{equation} +Since the model considers the effect of damage in elastic stiffness, an effective stress, +$\boldsymbol{\sigma}^{e}$, is defined, where the stress for a given strain always corresponds to the +undamaged elastic stiffness of the material, $\boldsymbol{\mathfrak{E}}_{0}$ The relation between +$\boldsymbol{\sigma}^{e}$, $\boldsymbol{\varepsilon}$, and $\boldsymbol{\varepsilon}^{p}$ is given by +\begin{equation} + \boldsymbol{\sigma}^e = \boldsymbol{\mathfrak{E}}_0:\left(\boldsymbol{\varepsilon} - \boldsymbol{\varepsilon}^{e}\right) +\end{equation} +To consider the degradation of reinforced-concrete structures, an isotropic damage was +considered in concrete material. Hence, the relation between $\boldsymbol{\sigma}^e$ and $\boldsymbol{\sigma}$ can be established by +the isotropic scalar degradation damage variable, D, as follows +\begin{equation} + \boldsymbol{\sigma} = \left(1-D\right)\boldsymbol{\sigma}^e \label{sigma_def} +\end{equation} +\begin{equation} + \boldsymbol{\sigma} = \left(1-D\right)\boldsymbol{\mathfrak{E}}_0:\left(\boldsymbol{\varepsilon} - \boldsymbol{\varepsilon}^{e}\right)\label{sigma_def2} +\end{equation} +The Damage Plasticity Model has various attributes to define the mechanical behavior of concrete +in tension and compression such as the yield function, plastic potential, strength of material +in tension and compression, and hardening and softening of the yield surface. These attributes +are discussed in detail in the following sections. A method for the implementation of the +Damage Plasticity Model and for the estimation of crack width are also presented in the upcoming +sections. + +## Yield Function + +The yield function, $\mathfrak{F}$ is a function of $\boldsymbol{\sigma}$, the strength of the material in uniaxial tension, $f_t$, and the strength of the material in uniaxial compression, $f_c$. It was used to describe the admissible stress space. For this implementation, the yield function in stress space is defined as follows +\begin{equation} \label{yf} +\begin{gathered} + \mathfrak{F}\left(\boldsymbol{\sigma},f_t,f_c\right) = \frac{1}{1-\alpha} \\ + \left(\alpha I_1 + \sqrt{3J_2} + \beta\left(\boldsymbol{\kappa}\right)<{\hat{\boldsymbol{\sigma}}_{max}}>\right) - f_c\left(\boldsymbol{\kappa}\right) +\end{gathered} +\end{equation} +where $I_1$ and $J_2$ is first invariant of stress and second invariant of the deviatoric +component of the stress, respectively, $ =\frac{x+|x|}{2}$ is the Macaulay bracket function, ${\hat{\boldsymbol{\sigma}}_{max}}$ is algebraically maximum principal +stress, $\alpha = \frac{f_{b0}-f_{c0}}{2 f_{b0}-f_{c0}}$ is a parameter that relates +uniaxial, $f_{c0}$, and biaxial, $f_{b0}$, yield strength of concrete in compression, +$\beta\left(\boldsymbol{\kappa}\right)=\frac{f_c\left(\boldsymbol{\kappa}\right)}{f_t\left(\boldsymbol{\kappa}\right)}\left(\alpha-1\right)-\left(1+\alpha\right)$ is a parameter that +relates tensile, $f_t\left(\boldsymbol{\kappa}\right)$, and compressive, $f_c\left(\boldsymbol{\kappa}\right)$, yield strength which are +function of a vector of damage variable, $\boldsymbol{\kappa} = \{\kappa_t, \kappa_c\}$ and $\kappa_t$ +and $\kappa_c$ are the damage variables in tension and compression, respectively. + +The implementation first solves the given problem in the effective stress space and then transform the effective stress to stress space using Eq. \eqref{sigma_def2}. Thus, the yield strength of the concrete under uniaxial loading is expressed as effective yield strength as follows +\begin{equation} + f_t\left(\boldsymbol{\kappa}\right) = \left(1-D_t \left(\kappa_t\right)\right)f_{t}^{e}\left(\kappa_t\right) \label{ft} +\end{equation} +\begin{equation} + f_c\left(\boldsymbol{\kappa}\right) = \left(1-D_c \left(\kappa_c\right)\right)f_{c}^{e}\left(\kappa_c\right) \label{fc} +\end{equation} +where $f_{t}^{e}$ and $f_{c}^{e}$ are the yield strength of the concrete in tension and +compression, respectively and $D_t$ and $D_c$ are the degradation damage variables in +tension and compression, respectively such that $0\leq D_t$\textless 1 and $0\leq D_c$\textless 1. +The scalar degradation damage variable is expressed in terms of $D_t$ and $D_c$ as follows +\begin{equation} + D\left(\boldsymbol{\kappa}\right) = 1-\left(1-D_t\left(\kappa_t\right)\right)\left(1-D_c\left(\kappa_c\right)\right) \label{D} +\end{equation} +Hence, for uniaxial tension, $D=D_t$, while for uniaxial compression, $D=D_c$.The yield strength for multi-axial loading, i.e., Eqs. \eqref{ft}-\eqref{fc}, can be rewritten as +\begin{equation} + f_t\left(\boldsymbol{\kappa}\right) = \left(1-D\left(\boldsymbol{\kappa}\right)\right)f_{t}^{e}\left(\kappa_t\right) \label{ft_new} +\end{equation} +\begin{equation} + f_c\left(\boldsymbol{\kappa}\right) = \left(1-D\left(\boldsymbol{\kappa}\right)\right)f_{c}^{e}\left(\kappa_c\right) \label{fc_new} +\end{equation} +Similarly, the first invariant of $\boldsymbol{\sigma}^e$, $I_1^e$, and second invariant of the deviatoric component of $\boldsymbol{\sigma}^e$, $J_2^e$, can be rewritten in terms of $I_1$ and $J_2$ as follows +\begin{equation} + I_1^e = \left(1-D\left(\boldsymbol{\kappa}\right)\right)I_1 \label{I1e} +\end{equation} +\begin{equation} + J_2^e = \left(1-D\left(\boldsymbol{\kappa}\right)\right)^2J_2 \label{J2e} +\end{equation} +Since $D$ \textless 1, the maximum principal effective stress ${\hat{\boldsymbol{\sigma}}_{max}}^e$ is expressed in the terms of ${\hat{\boldsymbol{\sigma}}_{max}}$ as follows +\begin{equation} + {\hat{\boldsymbol{\sigma}}_{max}}^e = \left(1-D\left(\boldsymbol{\kappa}\right)\right){\hat{\boldsymbol{\sigma}}_{max}} \label{sig_max_e} +\end{equation} +Consequently, yield function $\left(\mathfrak{F}\left(\boldsymbol{\sigma},f_t,f_c\right)\right)$ is a homogenous +function, i.e., $x \mathfrak{F}\left(\boldsymbol{\sigma},f_t,f_c\right) = \mathfrak{F}\left(x \boldsymbol{\sigma},x f_t,x f_c\right)$ Hence, using Eqs. \eqref{ft_new}-\eqref{sig_max_e}, the yield function in the effective stress space was obtained by multiplying by a factor $\left(1-D\right)$ of both sides of Eq. \eqref{yf}, as follows +\begin{equation}\label{yf_e} +\begin{gathered} + \mathfrak{F}\left(\boldsymbol{\sigma}^e,f_t^e,f_c^e\right) = \frac{1}{1-\alpha} \\ + \left(\alpha I_1^e + \sqrt{3J_2^e} + \beta\left(\boldsymbol{\kappa}\right)<{\hat{\boldsymbol{\sigma}}_{max}}^e>\right) - f_c^e\left(\boldsymbol{\kappa}\right) +\end{gathered} +\end{equation} + +## Plastic Potential + +It was found that for concrete, the Drucker-Prager flow rule describes the experimentally observed volumetric expansion of the material as opposed to the Von-Mises flow rule, which results in no volumetric expansion ([!cite](krabbenhoft2002basic)). Since all the equations are solved in the effective stress space, the plastic flow potential is also defined in the effective stress space ([!cite](lee1996theory)) as follows +\begin{equation} + \dot{\boldsymbol{\varepsilon}^p} = \dot{\gamma} \nabla_{\boldsymbol{\sigma}^e}\Phi\left(\boldsymbol{\sigma}^e\right) +\end{equation} +\begin{equation} \label{flowRule} + \Phi\left(\boldsymbol{\sigma}^e\right)=\alpha_p I_1^e+\|{s^e}\| +\end{equation} +where $\Phi$ is the plastic potential function, $s^e$ is the deviatoric component of the +$\boldsymbol{\sigma}^e$, and $\|\cdot\|$ is $L_2$ norm of $\alpha_p$ is a parameter that controls the +dilatancy of concrete, and $\dot{\gamma}$ is the plastic consistency parameter. + +## Strength Function + +Since the concrete shows strain-softening in tension and strain hardening and softening in compression, the concrete strength is expressed as a combination of two exponential functions as follows +\begin{equation} + f_N = f_{N0} \left(\left(1+a_N\right) e^{-b_N \varepsilon^p}- a_N e^{-2b_N \varepsilon^p}\right) \label{fN} +\end{equation} +where $f_{N0}$ is the initial yield stress of the material, $N = t$, for the uniaxial +tension, $N = c$, for uniaxial compression, $a_N$ and $b_N$, are the material constants +that describe the softening and hardening behavior of the concrete. Similarly, the +degradation of the elastic modulus is also expressed as another exponential function as +follows +\begin{equation} + D_N = 1 - e^{-d_N \varepsilon^p} \label{DN} +\end{equation} +where $d_N$ is a constant that determine the rate of degradation of $\boldsymbol{\mathfrak{E}}$ with the +increase in plastic strain. The strength of the material in the effective stress space was +obtained using Eqs. \eqref{ft_new}-\eqref{fc_new}, and \eqref{fN}-\eqref{DN}, as follows +\begin{equation}\label{fNe} + f_N^e = f_{N0} \left(\left(1+a_N\right) \left(e^{-b_N \varepsilon^p}\right)^{1-\frac{d_N}{b_N}}- + a_N \left(e^{-b_N \varepsilon^p}\right)^{2-\frac{d_N}{b_N}}\right) +\end{equation} +The damage variable, $\kappa_N$ is defined as +\begin{equation} + \kappa_N = \frac{1}{g_N}\int_0^{\varepsilon^p} {f_N\left(\varepsilon^p\right)d\varepsilon^p} \label{kN_def} +\end{equation} +where $g_N$ $\left(=\int_0^\infty {f_N\left(\varepsilon^p\right)d\varepsilon^p}=\frac {f_{N0}}{b_N}\left(1+\frac{a_N}{2}\right)\right)$ +is the fracture energy density during the process of cracking, which is derived from the +fracture energy, $G_N$, which is a material property. The relation between $G_N$ and $g_N$ +is expressed as follows +\begin{equation} + g_N = \frac{G_N}{l_N} \label{GN_def} +\end{equation} +where $l_N$ is characteristic length or the size of the deformation localization zone. +Thus, the plastic strain can be presented in terms of damage variable as follows +\begin{equation} + \varepsilon^p = \frac{1}{b_N} \log{\frac{\sqrt{\Phi_N}}{a_N}} \label{eps_p} +\end{equation} +where $\Phi_N = 1 + a_N \left(2+a_N \right)\kappa_N$. Using Eqs. \eqref{fN} and \eqref{eps_p}, the +strength of the concrete can be expressed in terms of the damage variable as follows +\begin{equation} + f_N = f_{N0} \frac{1+a_N-\sqrt{\Phi_N\left(\kappa_N\right)}}{a_N}\sqrt{\Phi_N\left(\kappa_N\right)} \label{fN_new} +\end{equation} +Thus, the strength of the material and degradation damage variable in the effective stress space can be written as + +\begin{equation} + f_N^e = f_{N0} \left(\frac{1+a_N-\sqrt{\Phi_N\left(\kappa_N\right)}}{a_N}\right)^{1-\frac{d_N}{b_N}} \sqrt{\Phi_N\left(\kappa_N\right)} \label{fNe_new} +\end{equation} +\begin{equation} + D_N = 1- \left(\frac{1+a_N-\sqrt{\Phi_N\left(\kappa_N\right)}}{a_N}\right)^{\frac{d_N}{b_N}} \label{DN_new} +\end{equation} +where $a_N$, $b_N$,and $d_N$ are the modeling parameters, which are evaluated from the +material properties. Since the maximum compressive strength of concrete, $f_{cm}$, was used +as a material property, $f_{cm}$ was obtained in terms of $a_c$ by finding maximum value of +compressive strength in Eq. \eqref{fNe} as follows +\begin{equation} + f_{cm} = \frac{f_{c0}\left(1+a_c\right)^2}{4a_c} \label{fcm} +\end{equation} +Thus, $a_c$ can be expressed as follows +\begin{equation} + a_c = 2\frac{f_{cm}}{f_{c0}}-1+2\sqrt{\left(\frac{f_{cm}}{f_{c0}}\right)^2-\frac{f_{cm}}{f_{c0}}} \label{ac} +\end{equation} +Similarly, if $G_c$ and $l_c$ are known then $b_c$ can be expressed in term of known quantities as follows +\begin{equation} + b_c = \frac{f_{c0}}{\frac{G_c}{l_c}}\left(1+\frac{a_c}{2}\right) \label{bc} +\end{equation} +A relationship between $a_t$ and $b_t$ is written as follows +\begin{equation} + b_t = \frac{f_{t0}}{\frac{G_t}{l_t}}\left(1+\frac{a_t}{2}\right) \label{bt} +\end{equation} +[!cite](lubliner1989plastic) suggested that if the slope of $\sigma$ versus $\varepsilon^p$ curve is +known at $\varepsilon^p=0$, then another relationship between $a_t$ and $b_t$ will be obtained +as follows +\begin{equation} + \left(\frac{d\sigma}{d\varepsilon^p}\right)_{\varepsilon^p=0} = f_{t0}b_t\left(a_t-1\right) \label{slope} +\end{equation} +Thus, $a_t$ was obtained using Eqs. \eqref{bt}-\eqref{slope} as follows +\begin{equation} + a_t = \sqrt{\frac{9}{4}+\frac{2\frac{G_t}{l_t} \left(\frac{d\sigma}{d\varepsilon^p}\right)_{\varepsilon^p=0}}{f_{t0}^2}}\label{at} +\end{equation} +The minimum slope of the $\sigma$ versus $\varepsilon^p$ curve is +$\left(\left(\frac{d\sigma}{d\varepsilon^p}\right)_{\varepsilon^p=0}\right)_{min}= +-\frac{9}{8}\frac{f_{t0}^2}{\frac{G_t}{l_t}}$, which is a function of the characteristic length in tension. +Therefore, a mesh independent slope parameter $\omega\in\left(0,1\right)$, is defined such that +\begin{equation} + \left(\frac{d\boldsymbol{\sigma}}{d\varepsilon^p}\right)_{\varepsilon^p=0} = \omega \left(\left(\frac{d\sigma}{d\varepsilon^p}\right)_{\varepsilon^p=0}\right)_{min} \label{slope_new} +\end{equation} +Using Eqs. \eqref{at}-\eqref{slope_new}, $a_t$ is rewritten as follows +\begin{equation} + a_t = \frac{3}{2}\sqrt{1-\omega}-\frac{1}{2}\label{at_new} +\end{equation} +The ratio of $\frac{d_c}{b_c}$ was obtained by specifying degradation values for uniaxial +compression case from experiments. If the degradation in the elastic modulus is known, +denoted as $\widetilde{D}_c$, when the concrete is unloaded from $\sigma =f_{cm}$, then $\frac{d_c}{b_c}$ will be obtained using the following relation +\begin{equation} + \widetilde{D}_c = 1 - \left(\frac{1+a_c}{2a_c}\right)^{\frac{d_c}{b_c}} \label{Dc_fcm} +\end{equation} +\begin{equation} + \frac{d_c}{b_c} = \frac{\log\left(1-\widetilde{D}_c\right)}{\log\left(\frac{1+a_c}{2a_c}\right)} \label{dcbc_fcm} +\end{equation} +Similarly, if degradation in the elastic modulus is known, denoted as $\widetilde{D}_t$, when the material is unloaded from $\sigma=\frac {f_{t0}}{2}$, on softening branch, then $\frac{d_t}{b_t}$ will be obtained using the following relation +\begin{equation} + \widetilde{D}_t = 1 - \left(\frac{1+a_t-\sqrt{1+a_t^2}}{2a_t}\right)^{\frac{d_t}{b_t}} \label{Dt_ft0_2} +\end{equation} +\begin{equation} + \frac{d_t}{b_t} = \frac{\log\left(1-\widetilde{D}_t\right)}{\log\left(\frac{1+a_t-\sqrt{1+a_t^2}}{2a_t}\right)} \label{Dt_ft0} +\end{equation} +Thus, material modeling parameters $a_N$,$b_N$, and $d_N$ were obtained, which were used in +defining the strength of concrete in both tension and compression as given in Eq. +\eqref{fNe_new}. These parameters are also used to define the degradation damage variable in +both tension and compression as indicated in Eq. \eqref{DN_new}. + +## Hardening Potential + +The vector of two damage variables, $\boldsymbol{\kappa}=\{\kappa_t, \kappa_c\}$, was used in the implementation as the state variable to store the state of damage in tension and compression, separately. The evolution of these damage variables is defined in terms of the hardening potential, $H$, as +\begin{equation} + \dot{\boldsymbol{\kappa}} = \dot{\gamma} H\left(\boldsymbol{\sigma}^e, \boldsymbol{\kappa}\right)\label{kappa} +\end{equation} +The evolution of the damage variable is expressed in terms of the evolution of $\boldsymbol{\varepsilon}^p$ as follows +\begin{equation} + \dot{\boldsymbol{\kappa}} = \frac{1}{g_N}f_N^e\left(\kappa_N\right)\dot{\boldsymbol{\varepsilon}^p} \label{kappa_ep} +\end{equation} +where $g_N$ is dissipated energy density during the process of cracking. The scalar $\dot{\boldsymbol{\varepsilon}^p}$, is extended to multi-dimensional case as follows +\begin{equation} + \dot{\boldsymbol{\varepsilon}^p} = \delta_{tN} r\left(\hat{\boldsymbol{\sigma}^e}\right)\dot{\varepsilon}^{p}_{max} + \delta_{cN} \left(1-r\left(\hat{\boldsymbol{\sigma}^e}\right)\right)\dot{\varepsilon}^{p}_{min} \label{ep_dot} +\end{equation} +where $\delta_{ij}$ is the Dirac delta function and $\hat{\boldsymbol{\sigma}^e}$ are eigenvalues of the $\boldsymbol{\sigma}^e$, +\begin{equation}\label{r_sige} + r\left(\hat{\boldsymbol{\sigma}^e}\right) = + \begin{cases} + 0,& \text{if } \boldsymbol{\sigma}^e = \boldsymbol{0}\\ + \frac{\sum_{i=1}^3<\sigma^e_i>}{\sum_{i=1}^3|\sigma^e_i|}, & \text{otherwise} + \end{cases} +\end{equation} +$\dot{\varepsilon}^{p}_{max}$ and $\dot{\varepsilon}^{p}_{min}$ +are the maximum and minimum principal plastic strain, respectively. From Eqs. \eqref{kappa_ep} - \eqref{r_sige}, the evolution of $\boldsymbol{\kappa}$ was obtained as +\begin{equation} + \dot{\boldsymbol{\kappa}} = \boldsymbol{h}\left(\hat{\boldsymbol{\sigma}^e}\right):\dot{\boldsymbol{\varepsilon}}^{\hat{p}} \label{kappa_h_ep} +\end{equation} +where +\begin{equation}\label{h} + \boldsymbol{h}\left(\hat{\boldsymbol{\sigma}^e}\right)= + \begin{bmatrix} + \frac{r\left(\hat{\boldsymbol{\sigma}^e}\right)}{g_t}f_t^e\left(\kappa_t\right)&0&0\\ + 0&1&0\\ + 0&0&\frac{1-r\left(\hat{\boldsymbol{\sigma}^e}\right)}{g_c}f_c^e\left(\kappa_c\right)\\ + \end{bmatrix} +\end{equation} +and ‘:’ represents products of two matrices. Hence, $H\left(\boldsymbol{\sigma}^e,\boldsymbol{\kappa}\right)$ in Eq. \eqref{kappa} was obtained as follows +\begin{equation} + H\left(\boldsymbol{\sigma}^e, \boldsymbol{\kappa}\right) = \boldsymbol{h}\cdot \nabla_{\hat{\boldsymbol{\sigma}^e}}\Phi\left(\hat{\boldsymbol{\sigma}^e}\right) \label{H_def} +\end{equation} +where ‘$\cdot$’ represents the dot product of a matrix and a vector, and $\nabla_{\hat{\boldsymbol{\sigma}^e}}$ is the gradient with respect to principal effective stress components, $\hat{\boldsymbol{\sigma}^e}$. Thus, the hardening potential that governs the evolution of damage variables is expressed in terms of effective stress space. + +## Return Mapping Algorithm + +Return mapping algorithm is summarized in a flowchart [flowChart]. For given strain increment and previous state of stress, trial effective stress is obtained by elastic increment in the elastic predictor step according to +\begin{equation} + \boldsymbol{\sigma}_{n+1}^{e^{tr}} = \boldsymbol{\mathfrak{E}}_0:\left(\varepsilon_{n+1}-\varepsilon_n^p\right) \label{predictor_step} +\end{equation} +If the state of trial effective stress lies inside the admissible domain, i.e, $\mathfrak{F}\left(\boldsymbol{\sigma}^e,f_t^e,f_c^e\right) < 0$, the trial effective stress is considered as an admissible effective stress and old damage variables are supplied for the next step. +If the state of trial effective stress is outside admissible domain, i.e, $\mathfrak{F}\left(\boldsymbol{\sigma}^e,f_t^e,f_c^e\right) > 0$, the effective stress is obtained using the plastic corrector step + +!media media/Return_mapping_flow_chart.png + id=flowChart + style=width:30%; + caption=Flow chart for return mapping algorithm. + +\begin{equation} +\boldsymbol{\sigma}_{n+1}^e = \boldsymbol{\sigma}_{n+1}^{e^{tr}}-\boldsymbol{\mathfrak{E}}_0:\varepsilon_n^p \label{plasticCorrector} +\end{equation} +Once admissible effective stress is obtained, degradation corrector step is utilized to account for the stiffness degradation on the state of stress according to +\begin{equation} +\boldsymbol{\sigma}_{n+1} = \left(1-D_{n}\right)\boldsymbol{\sigma}_{n+1}^{e} \label{degradation_corrector} +\end{equation} + + + +During the plastic corrector step, the returned effective stress should satisfy the Kuhn-Tucker conditions on the $\mathfrak{F}\left(\boldsymbol{\sigma}^e,f_t^e,f_c^e\right)$ and $\dot{\gamma}$, according to +\begin{equation} + \begin{split} \label{khunTuckerConditions} + \dot{\gamma} > 0 \\ + \dot{\gamma}\mathfrak{F}\left(\boldsymbol{\sigma}^e,f_t^e,f_c^e\right) = 0 \\ + \mathfrak{F}\left(\boldsymbol{\sigma}^e,f_t^e,f_c^e\right) = 0 + \end{split} +\end{equation} +As per flow rule in Eq. \eqref{flowRule}, the plastic corrector step, i.e., Eq. \eqref{plasticCorrector} can be rewritten as +\begin{equation} +\boldsymbol{\sigma^e}_{n+1} = \boldsymbol{\sigma}_{n+1}^{e^{tr}}-\dot{\gamma}\left(2G\frac{\boldsymbol{s}_{n+1}^e}{\|\boldsymbol{s}_{n+1}^e\|} + 3K\alpha_p\boldsymbol{I}\right) \label{returnMap1} +\end{equation} +where $G$ is shear modulus and $K$ is bulk modulus. After separating the volumetric and deviatoric components from Eq. \eqref{returnMap1} following relations can be obtained +\begin{equation} + I_{1|n+1} = I_{1|n+1}^{e^{tr}} - 9K\alpha \alpha_p \dot{\gamma} \label{stressRelation1} +\end{equation} +\begin{equation}\label{stressRelation2} + \begin{gathered} + \frac{\boldsymbol{s}_{n+1}^e}{\|\boldsymbol{s}_{n+1}^e\|} = \frac{\boldsymbol{s}_{{n+1}}^{e^{tr}}}{\|\boldsymbol{s}_{n+1}^{e^{tr}}\|} \\ + {\|\boldsymbol{s}^{e}_{n+1}\|} = {\|\boldsymbol{s}_{n+1}^{e^{tr}}\|} - 2G\dot{\gamma} + \end{gathered} +\end{equation} +Using Eqs. \eqref{stressRelation1} and \eqref{stressRelation2}, Eq. \eqref{returnMap1} can be written as +\begin{equation} + \boldsymbol{\sigma}_{n+1}^e = \boldsymbol{\sigma}_{n+1}^{e^{tr}}-\dot{\gamma}\left(2G\frac{\boldsymbol{s}^{e^{tr}}_{n+1}}{\|\boldsymbol{s}_{{n+1}}^{e^{tr}} \|}+ 3K\alpha_p\boldsymbol{I}\right) \label{returnMap2} +\end{equation} +In case of plastic deformation, the returned state of stress should lie on the yield surface as per Kuhn-Tucker conditions (Eq. \eqref{khunTuckerConditions}, therefore $\mathfrak{F}\left(\boldsymbol{\sigma}_{n+1}^e,f_t^e,f_c^e\right) = 0$, i.e., +\begin{equation} \label{yfnext} + \begin{gathered} + \alpha I_{1|n+1}^e + \sqrt{3J_{2|n+1}^e} + \beta\left(\boldsymbol{\kappa}\right)<\hat{\boldsymbol{\sigma}}^e_{n+1|max}> \\ - \left(1-\alpha\right)f_c^e\left(\boldsymbol{\kappa}\right) = 0 + \end{gathered} +\end{equation} +Using Eq. \eqref{stressRelation1}, \eqref{stressRelation2}, and \eqref{returnMap2}, Eq. \eqref{yfnext} can be written as +\begin{equation} \label{yfzero} + \begin{gathered} + \alpha\left(I_{1|n+1}^{e^{tr}} - 9K\alpha \alpha_p \dot{\gamma}\right) + + \left(\sqrt{\frac{3}{2}}\|\boldsymbol{s}_{{n+1}}^{e^{tr}}\| - \sqrt{6}G\dot{\gamma}\right)\\+ + \beta\left(\boldsymbol{\kappa}\right)<\hat{\boldsymbol{\sigma}}^e_{n+1|max}> - \left(1-\alpha\right)f_c^e\left(\boldsymbol{\kappa}\right) = 0 + \end{gathered} +\end{equation} +Thus, the plastic multiplier can be by solving Eq. \eqref{yfzero} as +\begin{equation}\label{gammaDef} + \dot{\gamma} = + \begin{cases} + \frac{\alpha I_{1|n+1}^{e^{tr}}+\sqrt{\frac{3}{2}}\|\boldsymbol{s}_{{n+1}}^{e^{tr}}\|-\left(1-\alpha\right)f_c^e\left(\boldsymbol{\kappa}\right)} + {9K \alpha_p + \sqrt{6}G}, & \text{if $\sigma_{m|n+1}^e < 0$}\\ + \frac{\alpha I_{1|n+1}^{e^{tr}}+\sqrt{\frac{3}{2}}\|\boldsymbol{s}_{{n+1}}^{e^{tr}}\|+\beta\left(\boldsymbol{\kappa}\right) \sigma_{m|n+1}^{e^{tr}}-\left(1-\alpha\right)f_c^e\left(\boldsymbol{\kappa}\right)} + {9K \alpha_p + \sqrt{6}G + \beta\left(\boldsymbol{\kappa}\right)\left(2G\frac{s^{e^{tr}}_{m|n+1}}{\|\boldsymbol{s}_{{n+1}}^{e^{tr}} \|}+ 3K\alpha_p\right)}, & \text{otherwise}. + \end{cases} +\end{equation} +where $\sigma_{m|n+1}^e$, $\sigma_{m|n+1}^{e^{tr}}$, and $s^{e^{tr}}_{m|n+1}$ are the $m^{th}$ component of the $\hat{\boldsymbol{\sigma}}_{n+1}^e$, $\boldsymbol{\sigma}_{n+1}^{e^{tr}}$, and $\boldsymbol{s}^{e^{tr}}_{n+1}$, respectively, which corresponds to maximum principal effective stress in $\left(n+1\right)^{th}$ step. Eq. \eqref{gammaDef} is solved iteratively. + + +!syntax parameters /Materials/DamagePlasticityStressUpdate + +!syntax inputs /Materials/DamagePlasticityStressUpdate + +!syntax children /Materials/DamagePlasticityStressUpdate + +!bibtex bibliography diff --git a/include/materials/ComputeMultipleInelasticDamageStress.h b/include/materials/ComputeMultipleInelasticDamageStress.h new file mode 100644 index 00000000..a569e8b7 --- /dev/null +++ b/include/materials/ComputeMultipleInelasticDamageStress.h @@ -0,0 +1,42 @@ +/****************************************************************/ +/* DO NOT MODIFY THIS HEADER */ +/* BlackBear */ +/* */ +/* (c) 2017 Battelle Energy Alliance, LLC */ +/* ALL RIGHTS RESERVED */ +/* */ +/* Prepared by Battelle Energy Alliance, LLC */ +/* Under Contract No. DE-AC07-05ID14517 */ +/* With the U. S. Department of Energy */ +/* */ +/* See COPYRIGHT for full restrictions */ +/****************************************************************/ + +#pragma once + +#include "ComputeMultipleInelasticStress.h" + +class ComputeMultipleInelasticDamageStress : public ComputeMultipleInelasticStress +{ +public: + static InputParameters validParams(); + ComputeMultipleInelasticDamageStress(const InputParameters & parameters); + +protected: + /// damage parameter for DamagePlasticityStressUpdate model + const MaterialProperty & _D; + const MaterialProperty & _D_old; + const MaterialProperty & _D_older; + + virtual void computeQpJacobianMult() override; + + virtual void computeAdmissibleState(unsigned model_number, + RankTwoTensor & elastic_strain_increment, + RankTwoTensor & inelastic_strain_increment, + RankFourTensor & consistent_tangent_operator) override; + + virtual void + updateQpStateSingleModel(unsigned model_number, + RankTwoTensor & elastic_strain_increment, + RankTwoTensor & combined_inelastic_strain_increment) override; +}; diff --git a/include/materials/DamagePlasticityStressUpdate.h b/include/materials/DamagePlasticityStressUpdate.h new file mode 100644 index 00000000..51b958a9 --- /dev/null +++ b/include/materials/DamagePlasticityStressUpdate.h @@ -0,0 +1,184 @@ +/****************************************************************/ +/* DO NOT MODIFY THIS HEADER */ +/* BlackBear */ +/* */ +/* (c) 2017 Battelle Energy Alliance, LLC */ +/* ALL RIGHTS RESERVED */ +/* */ +/* Prepared by Battelle Energy Alliance, LLC */ +/* Under Contract No. DE-AC07-05ID14517 */ +/* With the U. S. Department of Energy */ +/* */ +/* See COPYRIGHT for full restrictions */ +/****************************************************************/ + +#pragma once + +#include "MultiParameterPlasticityStressUpdate.h" + +class DamagePlasticityStressUpdate : public MultiParameterPlasticityStressUpdate +{ +public: + static InputParameters validParams(); + DamagePlasticityStressUpdate(const InputParameters & parameters); + + /** + * Does the model require the elasticity tensor to be isotropic? + */ + bool requiresIsotropicTensor() override { return true; } + +protected: + virtual void initQpStatefulProperties() override; + virtual void finalizeReturnProcess(const RankTwoTensor & rotation_increment) override; + +private: + const Real _f_tol; + const Real _alfa; + const Real _alfa_p; + const Real _s0; + + const Real _Chi; + const Real _Dt; + const Real _ft; + const Real _FEt; + + const Real _fyc; + const Real _Dc; + const Real _fc; + const Real _FEc; + + const Real _at; + const Real _ac; + const Real _zt; + const Real _zc; + const Real _dPhit; + const Real _dPhic; + const Real _sqrtPhit_max; + const Real _sqrtPhic_max; + const Real _dt_bt; + const Real _dc_bc; + const Real _ft0; + const Real _fc0; + const Real _small_smoother2; + + const Real _sqrt3; + + /// Whether to provide an estimate of the returned stress, based on perfect plasticity + const bool _perfect_guess; + + /// Eigenvectors of the trial stress as a RankTwoTensor, in order to rotate the returned stress back to stress space + RankTwoTensor _eigvecs; + + MaterialProperty & _max_principal; + MaterialProperty & _min_principal; + MaterialProperty & _intnl0; + MaterialProperty & _intnl1; + MaterialProperty & _ele_len; + MaterialProperty & _gt; + MaterialProperty & _gc; + + MaterialProperty & _tD; + MaterialProperty & _cD; + MaterialProperty & _D; + MaterialProperty & _min_ep; + MaterialProperty & _mid_ep; + MaterialProperty & _max_ep; + MaterialProperty & _sigma0; + MaterialProperty & _sigma1; + MaterialProperty & _sigma2; + + Real ft(const std::vector & intnl) const; /// tensile strength + Real dft(const std::vector & intnl) const; /// d(tensile strength)/d(intnl) + Real fc(const std::vector & intnl) const; /// compressive strength + Real dfc(const std::vector & intnl) const; /// d(compressive strength)/d(intnl) + Real beta(const std::vector & intnl) const; + Real dbeta0(const std::vector & intnl) const; + Real dbeta1(const std::vector & intnl) const; + void weighfac(const std::vector & stress_params, Real & wf) const; /// weight factor + void dweighfac(const std::vector & stress_params, + Real & wf, + std::vector & dwf) const; /// d(weight factor)/d(stress) + Real damageVar(const std::vector & stress_params, const std::vector & intnl) const; + + void computeStressParams(const RankTwoTensor & stress, + std::vector & stress_params) const override; + + std::vector dstress_param_dstress(const RankTwoTensor & stress) const override; + + std::vector d2stress_param_dstress(const RankTwoTensor & stress) const override; + + void setEffectiveElasticity(const RankFourTensor & Eijkl) override; + + virtual void preReturnMapV(const std::vector & trial_stress_params, + const RankTwoTensor & stress_trial, + const std::vector & intnl_old, + const std::vector & yf, + const RankFourTensor & Eijkl) override; + + virtual void setStressAfterReturnV(const RankTwoTensor & stress_trial, + const std::vector & stress_params, + Real gaE, + const std::vector & intnl, + const yieldAndFlow & smoothed_q, + const RankFourTensor & Eijkl, + RankTwoTensor & stress) const override; + + void yieldFunctionValuesV(const std::vector & stress_params, + const std::vector & intnl, + std::vector & yf) const override; + + void computeAllQV(const std::vector & stress_params, + const std::vector & intnl, + std::vector & all_q) const override; + + virtual void flowPotential(const std::vector & stress_params, + const std::vector & intnl, + std::vector & r) const; + + virtual void dflowPotential_dstress(const std::vector & stress_params, + const std::vector & intnl, + std::vector> & dr_dstress) const; + + virtual void dflowPotential_dintnl(const std::vector & stress_params, + const std::vector & intnl, + std::vector> & dr_dintnl) const; + + virtual void hardPotential(const std::vector & stress_params, + const std::vector & intnl, + std::vector & h) const; + + virtual void dhardPotential_dstress(const std::vector & stress_params, + const std::vector & intnl, + std::vector> & dh_dsig) const; + + virtual void dhardPotential_dintnl(const std::vector & stress_params, + const std::vector & intnl, + std::vector> & dh_dintnl) const; + + void initialiseVarsV(const std::vector & trial_stress_params, + const std::vector & intnl_old, + std::vector & stress_params, + Real & gaE, + std::vector & intnl) const; + + void setIntnlValuesV(const std::vector & trial_stress_params, + const std::vector & current_stress_params, + const std::vector & intnl_old, + std::vector & intnl) const override; + + void setIntnlDerivativesV(const std::vector & trial_stress_params, + const std::vector & current_stress_params, + const std::vector & intnl, + std::vector> & dintnl) const override; + + virtual void consistentTangentOperatorV(const RankTwoTensor & stress_trial, + const std::vector & trial_stress_params, + const RankTwoTensor & stress, + const std::vector & stress_params, + Real gaE, + const yieldAndFlow & smoothed_q, + const RankFourTensor & Eijkl, + bool compute_full_tangent_operator, + const std::vector> & dvar_dtrial, + RankFourTensor & cto) override; +}; diff --git a/src/materials/ComputeMultipleInelasticDamageStress.C b/src/materials/ComputeMultipleInelasticDamageStress.C new file mode 100644 index 00000000..4f92615e --- /dev/null +++ b/src/materials/ComputeMultipleInelasticDamageStress.C @@ -0,0 +1,73 @@ +/****************************************************************/ +/* DO NOT MODIFY THIS HEADER */ +/* BlackBear */ +/* */ +/* (c) 2017 Battelle Energy Alliance, LLC */ +/* ALL RIGHTS RESERVED */ +/* */ +/* Prepared by Battelle Energy Alliance, LLC */ +/* Under Contract No. DE-AC07-05ID14517 */ +/* With the U. S. Department of Energy */ +/* */ +/* See COPYRIGHT for full restrictions */ +/****************************************************************/ + +#include "ComputeMultipleInelasticDamageStress.h" +#include "StressUpdateBase.h" + +registerMooseObject("BlackBearApp", ComputeMultipleInelasticDamageStress); + +InputParameters +ComputeMultipleInelasticDamageStress::validParams() +{ + InputParameters params = ComputeMultipleInelasticStress::validParams(); + return params; +} + +ComputeMultipleInelasticDamageStress::ComputeMultipleInelasticDamageStress( + const InputParameters & parameters) + : ComputeMultipleInelasticStress(parameters), + _D(getMaterialProperty("elemental_damage_variable")), + _D_old(getMaterialPropertyOld("elemental_damage_variable")), + _D_older(getMaterialPropertyOlder("elemental_damage_variable")) +{ +} + +void +ComputeMultipleInelasticDamageStress::computeQpJacobianMult() +{ + ComputeMultipleInelasticStress::computeQpJacobianMult(); + _Jacobian_mult[_qp] = (1.0 - _D_older[_qp]) * _Jacobian_mult[_qp]; + // _Jacobian_mult[_qp] = (1.0 - _D[_qp]) * _Jacobian_mult[_qp]; +} + +void +ComputeMultipleInelasticDamageStress::updateQpStateSingleModel( + unsigned model_number, + RankTwoTensor & elastic_strain_increment, + RankTwoTensor & combined_inelastic_strain_increment) +{ + ComputeMultipleInelasticStress::updateQpStateSingleModel( + model_number, elastic_strain_increment, combined_inelastic_strain_increment); + _Jacobian_mult[_qp] = (1.0 - _D_older[_qp]) * _Jacobian_mult[_qp]; +} + +void +ComputeMultipleInelasticDamageStress::computeAdmissibleState( + unsigned model_number, + RankTwoTensor & elastic_strain_increment, + RankTwoTensor & inelastic_strain_increment, + RankFourTensor & consistent_tangent_operator) +{ + _models[model_number]->updateState(elastic_strain_increment, + inelastic_strain_increment, + _rotation_increment[_qp], + _stress[_qp], + _stress_old[_qp] / (1.0 - _D_older[_qp]), + // _stress_old[_qp] / (1.0 - _D[_qp]), + _elasticity_tensor[_qp], + _elastic_strain_old[_qp], + _tangent_operator_type == TangentOperatorEnum::nonlinear, + consistent_tangent_operator); + _stress[_qp] *= (1.0 - _D_older[_qp]); +} diff --git a/src/materials/DamagePlasticityStressUpdate.C b/src/materials/DamagePlasticityStressUpdate.C new file mode 100644 index 00000000..8f38c945 --- /dev/null +++ b/src/materials/DamagePlasticityStressUpdate.C @@ -0,0 +1,682 @@ +/****************************************************************/ +/* DO NOT MODIFY THIS HEADER */ +/* BlackBear */ +/* */ +/* (c) 2017 Battelle Energy Alliance, LLC */ +/* ALL RIGHTS RESERVED */ +/* */ +/* Prepared by Battelle Energy Alliance, LLC */ +/* Under Contract No. DE-AC07-05ID14517 */ +/* With the U. S. Department of Energy */ +/* */ +/* See COPYRIGHT for full restrictions */ +/****************************************************************/ +#include "DamagePlasticityStressUpdate.h" +#include "libmesh/utility.h" + +registerMooseObject("BlackBearApp", DamagePlasticityStressUpdate); + +InputParameters +DamagePlasticityStressUpdate::validParams() +{ + InputParameters params = MultiParameterPlasticityStressUpdate::validParams(); + params.addParam( + "yield_function_tolerance", + "If the yield function is less than this amount, the (stress, internal parameters) are " + "deemed admissible. A std::vector of tolerances must be entered for the multi-surface case"); + params.addRangeCheckedParam("factor_relating_biaxial_unixial_cmp_str", + 0.1, + "factor_relating_biaxial_unixial_cmp_str < 0.5 & " + "factor_relating_biaxial_unixial_cmp_str >= 0", + "Material parameter that relate biaxial and uniaxial " + "compressive strength, i.e., \alfa = (fb0-fc0)/(2*fb0-fc0)"); + params.addRequiredParam("factor_controlling_dilatancy", + "controls the dilation of concrete"); + params.addRangeCheckedParam("stiff_recovery_factor", + 0., + "stiff_recovery_factor <= 1. & stiff_recovery_factor >= 0", + "stiffness recovery factor"); + params.addRangeCheckedParam( + "ft_ep_slope_factor_at_zero_ep", + "ft_ep_slope_factor_at_zero_ep <= 1 & ft_ep_slope_factor_at_zero_ep >= 0", + "slope of ft vs plastic strain curve at zero plastic strain"); + params.addRequiredParam( + "tensile_damage_at_half_tensile_strength", + "fraction of the elastic recovery slope in tension at 0.5*ft0 after yielding"); + params.addRangeCheckedParam("yield_strength_in_tension", + "yield_strength_in_tension >= 0", + "Tensile yield strength of concrete"); + params.addRangeCheckedParam("fracture_energy_in_tension", + "fracture_energy_in_tension >= 0", + "Fracture energy of concrete in uniaxial tension"); + + params.addRangeCheckedParam("yield_strength_in_compression", + "yield_strength_in_compression >= 0", + "Absolute yield compressice strength"); + params.addRequiredParam("compressive_damage_at_max_compressive_strength", + "damage at maximum compressive strength"); + params.addRequiredParam("maximum_strength_in_compression", + "Absolute maximum compressive strength"); + params.addRangeCheckedParam("fracture_energy_in_compression", + "fracture_energy_in_compression >= 0", + "Fracture energy of concrete in uniaxial compression"); + + params.addRequiredRangeCheckedParam( + "tip_smoother", + "tip_smoother>=0", + "Smoothing parameter: the cone vertex at mean = cohesion*cot(friction_angle), will be " + "smoothed by the given amount. Typical value is 0.1*cohesion"); + params.addParam("perfect_guess", + true, + "Provide a guess to the Newton-Raphson proceedure " + "that is the result from perfect plasticity. With " + "severe hardening/softening this may be " + "suboptimal."); + params.addClassDescription("Damage Plasticity Model for concrete"); + return params; +} + +DamagePlasticityStressUpdate::DamagePlasticityStressUpdate(const InputParameters & parameters) + : MultiParameterPlasticityStressUpdate(parameters, 3, 1, 2), + _f_tol(getParam("yield_function_tol")), + + _alfa(getParam("factor_relating_biaxial_unixial_cmp_str")), + _alfa_p(getParam("factor_controlling_dilatancy")), + _s0(getParam("stiff_recovery_factor")), + + _Chi(getParam("ft_ep_slope_factor_at_zero_ep")), + _Dt(getParam("tensile_damage_at_half_tensile_strength")), + _ft(getParam("yield_strength_in_tension")), + _FEt(getParam("fracture_energy_in_tension")), + + _fyc(getParam("yield_strength_in_compression")), + _Dc(getParam("compressive_damage_at_max_compressive_strength")), + _fc(getParam("maximum_strength_in_compression")), + _FEc(getParam("fracture_energy_in_compression")), + + _at(1.5 * std::sqrt(1 - _Chi) - 0.5), + _ac((2. * (_fc / _fyc) - 1. + 2. * std::sqrt(std::pow((_fc / _fyc), 2.) - _fc / _fyc))), + + _zt((1. + _at) / _at), + _zc((1. + _ac) / _ac), + _dPhit(_at * (2. + _at)), + _dPhic(_ac * (2. + _ac)), + _sqrtPhit_max((1. + _at + sqrt(1. + _at * _at)) / 2.), + _sqrtPhic_max((1. + _ac) / 2.), + _dt_bt(log(1. - _Dt) / log((1. + _at - sqrt(1. + _at * _at)) / (2. * _at))), + _dc_bc(log(1. - _Dc) / log((1. + _ac) / (2. * _ac))), + _ft0(0.5 * _ft / + ((1. - _Dt) * pow((_zt - _sqrtPhit_max / _at), (1. - _dt_bt)) * _sqrtPhit_max)), + _fc0(_fc / ((1. - _Dc) * pow((_zc - _sqrtPhic_max / _ac), (1. - _dc_bc)) * _sqrtPhic_max)), + _small_smoother2(std::pow(getParam("tip_smoother"), 2)), + + _sqrt3(sqrt(3.)), + _perfect_guess(getParam("perfect_guess")), + _eigvecs(RankTwoTensor()), + _max_principal(declareProperty("max_principal_stress")), + _min_principal(declareProperty("min_principal_stress")), + _intnl0(declareProperty("damage_state_in_tension")), + _intnl1(declareProperty("damage_state_in_compression")), + _ele_len(declareProperty("element_length")), + _gt(declareProperty("elemental_fracture_energy_in_tension")), + _gc(declareProperty("elemental_fracture_energy_in_compression")), + _tD(declareProperty("elemental_tensile_damage")), + _cD(declareProperty("elemental_compression_damage")), + _D(declareProperty("elemental_damage_variable")), + _min_ep(declareProperty("min_ep")), + _mid_ep(declareProperty("mid_ep")), + _max_ep(declareProperty("max_ep")), + _sigma0(declareProperty("damaged_min_principal_stress")), + _sigma1(declareProperty("damaged_mid_principal_stress")), + _sigma2(declareProperty("damaged_max_principal_stress")) +{ +} + +void +DamagePlasticityStressUpdate::initQpStatefulProperties() +{ + // if (_current_elem->n_vertices() < 3) + // _ele_len[_qp] = _current_elem->length(0, 1); + // else if (_current_elem->n_vertices() < 5) + // _ele_len[_qp] = (_current_elem->length(0, 1) + _current_elem->length(1, 2)) / 2.; + // else + // _ele_len[_qp] = + // (_current_elem->length(0, 1) + _current_elem->length(1, 2) + _current_elem->length(0, 4)) + // / 3.; + _ele_len[_qp] = std::cbrt(_current_elem->volume()); + + _gt[_qp] = _FEt / _ele_len[_qp]; + _gc[_qp] = _FEc / _ele_len[_qp]; + + _min_ep[_qp] = 0.; + _mid_ep[_qp] = 0.; + _max_ep[_qp] = 0.; + _sigma0[_qp] = 0.; + _sigma1[_qp] = 0.; + _sigma2[_qp] = 0.; + _intnl0[_qp] = 0.; + _intnl1[_qp] = 0.; + _tD[_qp] = 0.; + _cD[_qp] = 0.; + _D[_qp] = 0.; + MultiParameterPlasticityStressUpdate::initQpStatefulProperties(); +} + +void +DamagePlasticityStressUpdate::finalizeReturnProcess(const RankTwoTensor & /*rotation_increment*/) +{ + std::vector eigstrain; + _plastic_strain[_qp].symmetricEigenvalues(eigstrain); + _min_ep[_qp] = eigstrain[0]; + _mid_ep[_qp] = eigstrain[1]; + _max_ep[_qp] = eigstrain[2]; +} + +void +DamagePlasticityStressUpdate::computeStressParams(const RankTwoTensor & stress, + std::vector & stress_params) const +{ + stress.symmetricEigenvalues(stress_params); +} + +std::vector +DamagePlasticityStressUpdate::dstress_param_dstress(const RankTwoTensor & stress) const +{ + std::vector sp; + std::vector dsp; + stress.dsymmetricEigenvalues(sp, dsp); + return dsp; +} + +std::vector +DamagePlasticityStressUpdate::d2stress_param_dstress(const RankTwoTensor & stress) const +{ + std::vector d2; + stress.d2symmetricEigenvalues(d2); + return d2; +} + +void +DamagePlasticityStressUpdate::setEffectiveElasticity(const RankFourTensor & Eijkl) +{ + // Eijkl is required to be isotropic, so we can use the + // frame where stress is diagonal + for (unsigned a = 0; a < _num_sp; ++a) + for (unsigned b = 0; b < _num_sp; ++b) + _Eij[a][b] = Eijkl(a, a, b, b); + _En = _Eij[2][2]; + const Real denom = _Eij[0][0] * (_Eij[0][0] + _Eij[0][1]) - 2 * Utility::pow<2>(_Eij[0][1]); + for (unsigned a = 0; a < _num_sp; ++a) + { + _Cij[a][a] = (_Eij[0][0] + _Eij[0][1]) / denom; + for (unsigned b = 0; b < a; ++b) + _Cij[a][b] = _Cij[b][a] = -_Eij[0][1] / denom; + } +} + +void +DamagePlasticityStressUpdate::preReturnMapV(const std::vector & /*trial_stress_params*/, + const RankTwoTensor & stress_trial, + const std::vector & /*intnl_old*/, + const std::vector & /*yf*/, + const RankFourTensor & /*Eijkl*/) +{ + std::vector eigvals; + stress_trial.symmetricEigenvaluesEigenvectors(eigvals, _eigvecs); +} + +void +DamagePlasticityStressUpdate::setStressAfterReturnV(const RankTwoTensor & /*stress_trial*/, + const std::vector & stress_params, + Real /*gaE*/, + const std::vector & intnl, + const yieldAndFlow & /*smoothed_q*/, + const RankFourTensor & /*Eijkl*/, + RankTwoTensor & stress) const +{ + // form the diagonal stress + stress = RankTwoTensor(stress_params[0], stress_params[1], stress_params[2], 0.0, 0.0, 0.0); + // rotate to the original frame + stress = _eigvecs * stress * (_eigvecs.transpose()); + // _dir[_qp] = _eigvecs; + Real D = damageVar(stress_params, intnl); + _sigma0[_qp] = (1. - D) * stress_params[0]; + _sigma1[_qp] = (1. - D) * stress_params[1]; + _sigma2[_qp] = (1. - D) * stress_params[2]; + _intnl0[_qp] = intnl[0]; + _intnl1[_qp] = intnl[1]; + _D[_qp] = D; +} + +void +DamagePlasticityStressUpdate::yieldFunctionValuesV(const std::vector & stress_params, + const std::vector & intnl, + std::vector & yf) const +{ + Real I1 = stress_params[0] + stress_params[1] + stress_params[2]; + Real J2 = RankTwoTensor(stress_params[0], stress_params[1], stress_params[2], 0, 0, 0) + .secondInvariant(); + yf[0] = 1. / (1. - _alfa) * + (_alfa * I1 + _sqrt3 * sqrt(J2) + + beta(intnl) * (stress_params[2] < 0. ? 0. : stress_params[2])) - + fc(intnl); +} + +void +DamagePlasticityStressUpdate::computeAllQV(const std::vector & stress_params, + const std::vector & intnl, + std::vector & all_q) const +{ + Real I1 = stress_params[0] + stress_params[1] + stress_params[2]; + Real J2 = RankTwoTensor(stress_params[0], stress_params[1], stress_params[2], 0, 0, 0) + .secondInvariant(); + RankTwoTensor d_sqrt_3J2; + if (J2 == 0) + d_sqrt_3J2 = RankTwoTensor(); + else + d_sqrt_3J2 = 0.5 * std::sqrt(3.0 / J2) * + RankTwoTensor(stress_params[0], stress_params[1], stress_params[2], 0, 0, 0) + .dsecondInvariant(); + + all_q[0].f = 1. / (1. - _alfa) * + (_alfa * I1 + _sqrt3 * sqrt(J2) + + beta(intnl) * (stress_params[2] < 0. ? 0. : stress_params[2])) - + fc(intnl); + + for (unsigned i = 0; i < _num_sp; ++i) + if (J2 == 0) + all_q[0].df[i] = + 1. / (1. - _alfa) * (_alfa + beta(intnl) * (stress_params[2] < 0. ? 0. : (i == 2))); + else + all_q[0].df[i] = + 1. / (1. - _alfa) * + (_alfa + d_sqrt_3J2(i, i) + beta(intnl) * (stress_params[2] < 0. ? 0. : (i == 2))); + all_q[0].df_di[0] = + 1. / (1. - _alfa) * (dbeta0(intnl) * (stress_params[2] < 0. ? 0. : stress_params[2])); + all_q[0].df_di[1] = + 1. / (1. - _alfa) * (dbeta1(intnl) * (stress_params[2] < 0. ? 0. : stress_params[2])) - + dfc(intnl); + + flowPotential(stress_params, intnl, all_q[0].dg); + dflowPotential_dstress(stress_params, intnl, all_q[0].d2g); + dflowPotential_dintnl(stress_params, intnl, all_q[0].d2g_di); +} + +void +DamagePlasticityStressUpdate::flowPotential(const std::vector & stress_params, + const std::vector & intnl, + std::vector & r) const +{ + Real J2 = RankTwoTensor(stress_params[0], stress_params[1], stress_params[2], 0, 0, 0) + .secondInvariant(); + RankTwoTensor d_sqrt_2J2; + if (J2 == 0) + d_sqrt_2J2 = RankTwoTensor(); + else + d_sqrt_2J2 = 0.5 * std::sqrt(2.0 / J2) * + RankTwoTensor(stress_params[0], stress_params[1], stress_params[2], 0, 0, 0) + .dsecondInvariant(); + + Real D = damageVar(stress_params, intnl); + + for (unsigned int i = 0; i < _num_sp; ++i) + r[i] = (_alfa_p + d_sqrt_2J2(i, i)) * pow((1. - D), 1); +} + +void +DamagePlasticityStressUpdate::dflowPotential_dstress( + const std::vector & stress_params, + const std::vector & intnl, + std::vector> & dr_dstress) const +{ + Real J2 = RankTwoTensor(stress_params[0], stress_params[1], stress_params[2], 0, 0, 0) + .secondInvariant(); + RankTwoTensor dII = RankTwoTensor(stress_params[0], stress_params[1], stress_params[2], 0, 0, 0) + .dsecondInvariant(); + RankTwoTensor d_sqrt_2J2; + RankFourTensor dfp; + Real pre; + if (J2 == 0) + { + d_sqrt_2J2 = RankTwoTensor(); + dfp = RankFourTensor(); + pre = 0; + } + else + { + d_sqrt_2J2 = 0.5 * std::sqrt(2.0 / J2) * dII; + dfp = 0.5 * std::sqrt(2.0 / J2) * + RankTwoTensor(stress_params[0], stress_params[1], stress_params[2], 0, 0, 0) + .d2secondInvariant(); + pre = -0.25 * std::sqrt(2.0) * std::pow(J2, -1.5); + } + + for (unsigned i = 0; i < 3; ++i) + for (unsigned j = 0; j < 3; ++j) + for (unsigned k = 0; k < 3; ++k) + for (unsigned l = 0; l < 3; ++l) + dfp(i, j, k, l) += pre * dII(i, j) * dII(k, l); + + Real D = damageVar(stress_params, intnl); + + for (unsigned i = 0; i < _num_sp; ++i) + for (unsigned j = 0; j < (i + 1); ++j) + { + dr_dstress[i][i] = J2 < _f_tol ? 0. : dfp(i, i, j, j) * pow((1. - D), 2); + if (i != j) + dr_dstress[j][i] = dr_dstress[i][j]; + } +} + +void +DamagePlasticityStressUpdate::dflowPotential_dintnl( + const std::vector & /* stress_params */, + const std::vector & /* intnl */, + std::vector> & dr_dintnl) const +{ + for (unsigned i = 0; i < _num_sp; ++i) + for (unsigned j = 0; j < _num_intnl; ++j) + dr_dintnl[i][j] = 0.; +} + +void +DamagePlasticityStressUpdate::hardPotential(const std::vector & stress_params, + const std::vector & intnl, + std::vector & h) const +{ + Real wf; + weighfac(stress_params, wf); + std::vector r(3); + flowPotential(stress_params, intnl, r); + h[0] = wf * ft(intnl) / _gt[_qp] * r[2]; + h[1] = -(1. - wf) * fc(intnl) / _gc[_qp] * r[0]; +} + +void +DamagePlasticityStressUpdate::dhardPotential_dstress(const std::vector & stress_params, + const std::vector & intnl, + std::vector> & dh_dsig) const +{ + Real wf; + std::vector dwf(3); + dweighfac(stress_params, wf, dwf); + + std::vector r(3); + flowPotential(stress_params, intnl, r); + std::vector> dr_dsig(3, std::vector(3)); + dflowPotential_dstress(stress_params, intnl, dr_dsig); + + for (unsigned i = 0; i < _num_sp; ++i) + { + dh_dsig[0][i] = (wf * dr_dsig[2][i] + dwf[i] * r[2]) * ft(intnl) / _gt[_qp]; + dh_dsig[1][i] = -((1. - wf) * dr_dsig[0][i] - dwf[i] * r[0]) * fc(intnl) / _gc[_qp]; + } +} + +void +DamagePlasticityStressUpdate::dhardPotential_dintnl( + const std::vector & stress_params, + const std::vector & intnl, + std::vector> & dh_dintnl) const +{ + Real wf; + weighfac(stress_params, wf); + std::vector r(3); + flowPotential(stress_params, intnl, r); + + dh_dintnl[0][0] = wf * dft(intnl) / _gt[_qp] * r[2]; + dh_dintnl[0][1] = 0.; + dh_dintnl[1][0] = 0.; + dh_dintnl[1][1] = -(1 - wf) * dfc(intnl) / _gc[_qp] * r[0]; +} + +void +DamagePlasticityStressUpdate::initialiseVarsV(const std::vector & trial_stress_params, + const std::vector & intnl_old, + std::vector & stress_params, + Real & /* gaE */, + std::vector & intnl) const +{ + setIntnlValuesV(trial_stress_params, stress_params, intnl_old, intnl); +} + +void +DamagePlasticityStressUpdate::setIntnlValuesV(const std::vector & trial_stress_params, + const std::vector & current_stress_params, + const std::vector & intnl_old, + std::vector & intnl) const +{ + Real I1_trial = trial_stress_params[0] + trial_stress_params[1] + trial_stress_params[2]; + Real J2_trial = + RankTwoTensor(trial_stress_params[0], trial_stress_params[1], trial_stress_params[2], 0, 0, 0) + .secondInvariant(); + Real invsqrt2J2_trial = 1. / sqrt(2. * J2_trial); + Real G = 0.5 * (_Eij[0][0] - _Eij[0][1]); // Lame's mu + Real K = _Eij[0][1] + 2. * G / 3.; // Bulk modulus + Real C1 = (2. * G * invsqrt2J2_trial); + Real C2 = -(I1_trial / 3. * G * invsqrt2J2_trial - 3. * K * _alfa_p); + Real C3 = 3. * K * _alfa_p; + + RankTwoTensor dsig = RankTwoTensor(trial_stress_params[0] - current_stress_params[0], + trial_stress_params[1] - current_stress_params[1], + trial_stress_params[2] - current_stress_params[2], + 0., + 0., + 0.); + RankTwoTensor fac = J2_trial < _f_tol ? C3 * RankTwoTensor(1., 1., 1., 0., 0., 0.) + : RankTwoTensor(C1 * trial_stress_params[0] - C2, + C1 * trial_stress_params[1] - C2, + C1 * trial_stress_params[2] - C2, + 0., + 0., + 0.); + + Real lam = dsig.L2norm() / fac.L2norm(); + std::vector h(2); + hardPotential(current_stress_params, intnl_old, h); + + intnl[0] = intnl_old[0] + lam * h[0]; + intnl[1] = intnl_old[1] + lam * h[1]; +} + +void +DamagePlasticityStressUpdate::setIntnlDerivativesV(const std::vector & trial_stress_params, + const std::vector & current_stress_params, + const std::vector & intnl, + std::vector> & dintnl) const +{ + Real I1_trial = trial_stress_params[0] + trial_stress_params[1] + trial_stress_params[2]; + Real J2_trial = + RankTwoTensor(trial_stress_params[0], trial_stress_params[1], trial_stress_params[2], 0, 0, 0) + .secondInvariant(); + Real invsqrt2J2_trial = 1. / sqrt(2. * J2_trial); + Real G = 0.5 * (_Eij[0][0] - _Eij[0][1]); // Lame's mu + Real K = _Eij[0][1] + 2. * G / 3.; // Bulk modulus + Real C1 = (2. * G * invsqrt2J2_trial); + Real C2 = -(I1_trial / 3. * G * invsqrt2J2_trial - 3. * K * _alfa_p); + Real C3 = 3. * K * _alfa_p; + + RankTwoTensor dsig = RankTwoTensor(trial_stress_params[0] - current_stress_params[0], + trial_stress_params[1] - current_stress_params[1], + trial_stress_params[2] - current_stress_params[2], + 0., + 0., + 0.); + RankTwoTensor fac = J2_trial < _f_tol ? C3 * RankTwoTensor(1., 1., 1., 0., 0., 0.) + : RankTwoTensor(C1 * trial_stress_params[0] - C2, + C1 * trial_stress_params[1] - C2, + C1 * trial_stress_params[2] - C2, + 0., + 0., + 0.); + + Real lam = dsig.L2norm() / fac.L2norm(); + + std::vector dlam_dsig(3); + for (unsigned i = 0; i < _num_sp; ++i) + dlam_dsig[i] = dsig.L2norm() == 0. ? 0. + : -(trial_stress_params[i] - current_stress_params[i]) / + (dsig.L2norm() * fac.L2norm()); + + std::vector h(2); + hardPotential(current_stress_params, intnl, h); + std::vector> dh_dsig(2, std::vector(3)); + dhardPotential_dstress(current_stress_params, intnl, dh_dsig); + std::vector> dh_dintnl(2, std::vector(2)); + dhardPotential_dintnl(current_stress_params, intnl, dh_dintnl); + + for (unsigned i = 0; i < _num_intnl; ++i) + for (unsigned j = 0; j < _num_sp; ++j) + dintnl[i][j] = dlam_dsig[j] * h[i] + lam * dh_dsig[i][j]; +} + +Real +DamagePlasticityStressUpdate::ft(const std::vector & intnl) const +{ + Real sqrtPhi_t = sqrt(1. + _at * (2. + _at) * intnl[0]); + if (_zt > sqrtPhi_t / _at) + return _ft0 * pow(_zt - sqrtPhi_t / _at, (1. - _dt_bt)) * sqrtPhi_t; + else + return _ft0 * 1.E-6; +} + +Real +DamagePlasticityStressUpdate::dft(const std::vector & intnl) const +{ + Real sqrtPhi_t = sqrt(1. + _at * (2. + _at) * intnl[0]); + if (_zt > sqrtPhi_t / _at) + return _ft0 * _dPhit / (2 * sqrtPhi_t) * pow(_zt - sqrtPhi_t / _at, -_dt_bt) * + (_zt - (2. - _dt_bt) * sqrtPhi_t / _at); + else + return 0.; +} + +Real +DamagePlasticityStressUpdate::fc(const std::vector & intnl) const +{ + Real sqrtPhi_c; + if (intnl[1] < 1.0) + sqrtPhi_c = sqrt(1. + _ac * (2. + _ac) * intnl[1]); + else + sqrtPhi_c = sqrt(1. + _ac * (2. + _ac) * 0.99); + return _fc0 * pow((_zc - sqrtPhi_c / _ac), (1. - _dc_bc)) * sqrtPhi_c; +} + +Real +DamagePlasticityStressUpdate::dfc(const std::vector & intnl) const +{ + if (intnl[1] < 1.0) + { + Real sqrtPhi_c = sqrt(1. + _ac * (2. + _ac) * intnl[1]); + return _fc0 * _dPhic / (2. * sqrtPhi_c) * pow(_zc - sqrtPhi_c / _ac, -_dc_bc) * + (_zc - (2. - _dc_bc) * sqrtPhi_c / _ac); + } + else + return 0.; +} + +Real +DamagePlasticityStressUpdate::beta(const std::vector & intnl) const +{ + return (1. - _alfa) * fc(intnl) / ft(intnl) - (1. + _alfa); +} + +Real +DamagePlasticityStressUpdate::dbeta0(const std::vector & intnl) const +{ + return -(1. - _alfa) * fc(intnl) * dft(intnl) / pow(ft(intnl), 2.); +} + +Real +DamagePlasticityStressUpdate::dbeta1(const std::vector & intnl) const +{ + return dfc(intnl) / ft(intnl) * (1. - _alfa); +} + +void +DamagePlasticityStressUpdate::weighfac(const std::vector & stress_params, Real & wf) const +{ + Real Dr = 0.; + Real Nr = 0.; + for (unsigned i = 0; i < _num_sp; ++i) + { + if (stress_params[i] > 0.) + { + Nr += stress_params[i]; + Dr += stress_params[i]; + } + else + Dr += -stress_params[i]; + } + wf = Nr / Dr; +} + +void +DamagePlasticityStressUpdate::dweighfac(const std::vector & stress_params, + Real & wf, + std::vector & dwf) const +{ + std::vector dNr(3, 0.), dDr(3, 0.); + Real Dr = 0.; + Real Nr = 0.; + for (unsigned i = 0; i < _num_sp; ++i) + { + if (stress_params[i] > 0.) + { + Nr += stress_params[i]; + dNr[i] = 1.; + Dr += stress_params[i]; + dDr[i] = 1.; + } + else + { + Dr += -stress_params[i]; + dDr[i] = -1.; + } + } + wf = Nr / Dr; + + for (unsigned i = 0; i < _num_sp; ++i) + dwf[i] = (dNr[i] - wf * dDr[i]) / Dr; +} + +Real +DamagePlasticityStressUpdate::damageVar(const std::vector & stress_params, + const std::vector & intnl) const +{ + Real sqrtPhi_t = sqrt(1. + _at * (2. + _at) * intnl[0]); + if (_zt > sqrtPhi_t / _at) + _tD[_qp] = 1. - pow(_zt - sqrtPhi_t / _at, _dt_bt); + else + _tD[_qp] = 1. - 1.E-6; + + Real wf; + weighfac(stress_params, wf); + Real s = _s0 + (1. - _s0) * wf; + + Real sqrtPhi_c; + if (intnl[1] < 1.0) + sqrtPhi_c = sqrt(1. + _ac * (2. + _ac) * intnl[1]); + else + sqrtPhi_c = sqrt(1. + _ac * (2. + _ac) * 0.99); + + _cD[_qp] = 1. - pow((_zc - sqrtPhi_c / _ac), _dc_bc); + return 1. - (1. - s * _tD[_qp]) * (1. - _cD[_qp]); +} + +void +DamagePlasticityStressUpdate::consistentTangentOperatorV( + const RankTwoTensor & /* stress_trial */, + const std::vector & /* trial_stress_params */, + const RankTwoTensor & /*stress*/, + const std::vector & /* stress_params */, + Real /*gaE*/, + const yieldAndFlow & /*smoothed_q*/, + const RankFourTensor & elasticity_tensor, + bool /* compute_full_tangent_operator */, + const std::vector> & /* dvar_dtrial */, + RankFourTensor & cto) +{ + cto = elasticity_tensor; + return; +} diff --git a/test/tests/damage_plasticity_model/gold/dilatancy_out.csv b/test/tests/damage_plasticity_model/gold/dilatancy_out.csv new file mode 100644 index 00000000..36e43d73 --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/dilatancy_out.csv @@ -0,0 +1,52 @@ +time,displacement_x,e_xx,ep_xx,react_x,s_xx,volumetric_strain +0,0,0,0,0,0,0 +10,-0.0001,-0.0001,0,3.1699999999999,-3.1699999999999,-6.3997952043815e-05 +20,-0.0002,-0.0002,0,6.3400000000001,-6.3400000000001,-0.00012799180834944 +30,-0.0003,-0.0003,0,9.51,-9.51,-0.00019198156917977 +40,-0.0004,-0.0004,0,12.679999999999,-12.679999999999,-0.00025596723479604 +50,-0.0005,-0.0005,0,15.85,-15.85,-0.00031994880546093 +60,-0.0006,-0.0006,-1.1665738232695e-05,18.650196118397,-18.650196118397,-0.00035614282315743 +70,-0.0007,-0.0007,-6.1828854261652e-05,20.230025607081,-20.230025607081,-0.0003006468067881 +80,-0.0008,-0.0008,-0.00011331162649309,21.690648221572,-21.690648221572,-0.00024200461334467 +90,-0.0009,-0.0009,-0.00016614913708622,22.799704333641,-22.799704333641,-0.00018013186395471 +100,-0.001,-0.001,-0.00022037903585743,23.81421136198,-23.81421136198,-0.00011493827993558 +110,-0.0011,-0.0011,-0.00027604130414741,24.734577041306,-24.734577041306,-4.6327966772286e-05 +120,-0.0012,-0.0012,-0.00033317799381064,25.561276539756,-25.561276539756,2.5799966409057e-05 +130,-0.0013,-0.0013,-0.00039183297149091,26.294871697908,-26.294871697908,0.00010155080142915 +140,-0.0014,-0.0014,-0.0004520516597867,26.936029857296,-26.936029857296,0.00018103359894006 +150,-0.0015,-0.0015,-0.00051388076630392,27.485542276032,-27.485542276032,0.00026436055778256 +160,-0.0016,-0.0016,-0.00057736797596317,27.944343585127,-27.944343585127,0.0003516465822625 +170,-0.0017,-0.0017,-0.00064256165753739,28.31352560435,-28.31352560435,0.00044300735156488 +180,-0.0018,-0.0018,-0.00070951052887771,28.594359107342,-28.594359107342,0.00053856047607881 +190,-0.0019,-0.0019,-0.00077826318802138,28.788313072888,-28.788313072888,0.00063842301141082 +200,-0.002,-0.002,-0.00084886769514531,28.897067967104,-28.897067967104,0.00074271083271926 +210,-0.0021,-0.0021,-0.00092137106592132,28.922534713088,-28.922534713088,0.00085153743051258 +220,-0.0022,-0.0022,-0.0009958187062277,28.866870300854,-28.866870300854,0.00096501256618398 +230,-0.0023,-0.0023,-0.0010722537859612,28.732492436828,-28.732492436828,0.0010832407813517 +240,-0.0024,-0.0024,-0.0011507165519859,28.522092389824,-28.522092389824,0.001206319760874 +250,-0.0025,-0.0025,-0.0012312435818733,28.238645486967,-28.238645486967,0.0013343385512471 +260,-0.0026,-0.0026,-0.0013138669884538,27.885418466814,-27.885418466814,0.0014673756659466 +270,-0.0027,-0.0027,-0.001398613576955,27.465973245362,-27.465973245362,0.0016054970661906 +280,-0.0028,-0.0028,-0.0014855039769927,26.984166022758,-26.984166022758,0.0017487540861979 +290,-0.0029,-0.0029,-0.0015745517640939,26.444141189209,-26.444141189209,0.0018971813295503 +300,-0.003,-0.003,-0.0016657625933436,25.850319245322,-25.850319245322,0.0020507945890735 +310,-0.0031,-0.0031,-0.0017591333751518,25.207378090089,-25.207378090089,0.0022095888650929 +320,-0.0032,-0.0032,-0.0018546515266787,24.52022717612,-24.52022717612,0.0023735365639236 +330,-0.0033,-0.0033,-0.0019522943910385,23.793974427846,-23.793974427846,0.0025425862783173 +340,-0.0034,-0.0034,-0.0020520284412321,23.033885470834,-23.033885470834,0.0027166599366673 +350,-0.0035,-0.0035,-0.0021538095409242,22.245335664265,-22.245335664265,0.0028956551521739 +360,-0.0036,-0.0036,-0.0022575823167839,21.433760428386,-21.433760428386,0.0030794421263903 +370,-0.0037,-0.0037,-0.0023632805004571,20.604589162518,-20.604589162518,0.0032678650659883 +380,-0.0038,-0.0038,-0.0024708273247877,19.763188934628,-19.763188934628,0.0034607430395285 +390,-0.0039,-0.0039,-0.0025801361706377,18.914798648891,-18.914798648891,0.0036578714779741 +400,-0.004,-0.004,-0.0026911114470869,18.064466216176,-18.064466216176,0.003859024244846 +410,-0.0041,-0.0041,-0.0028036497813661,17.216987550428,-17.216987550428,0.00406395645791 +420,-0.0042,-0.0042,-0.0029176413246996,16.376852028445,-16.376852028445,0.0042724075815702 +430,-0.0043,-0.0043,-0.003032971249846,15.548193962869,-15.548193962869,0.0044841049864369 +440,-0.0044,-0.0044,-0.0031495213353396,14.734753736897,-14.734753736897,0.0046987677199525 +450,-0.0045,-0.0045,-0.0032671716396185,13.939848439479,-13.939848439479,0.0049161108234703 +460,-0.0046,-0.0046,-0.0033858019252944,13.16635519868,-13.16635519868,0.0051358474281626 +470,-0.0047,-0.0047,-0.0035052933648644,12.416701988262,-12.416701988262,0.0053576947781209 +480,-0.0048,-0.0048,-0.0036255298400256,11.692874931522,-11.692874931522,0.0055813760526295 +490,-0.0049,-0.0049,-0.0037463991755309,10.996428436578,-10.996428436578,0.0058066236434121 +500,-0.005,-0.005,-0.0038677940116051,10.328508871587,-10.328508871587,0.0060331809638028 diff --git a/test/tests/damage_plasticity_model/gold/shear_test_out.csv b/test/tests/damage_plasticity_model/gold/shear_test_out.csv new file mode 100644 index 00000000..27901560 --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/shear_test_out.csv @@ -0,0 +1,32 @@ +time,e_xy,ep_xy,s_xy +0,0,0,0 +5,7.8182642932574e-06,0,0.66498115646358 +10,1.5636528586514e-05,0,1.3299623129272 +15,2.345207495453e-05,4.8983821458532e-07,1.8597699614386 +20,3.11707777874e-05,2.3387363549052e-06,1.999713831302 +25,3.8959171524551e-05,4.3097281241562e-06,2.1346824057288 +30,4.6801703888548e-05,6.3885974716588e-06,2.2574870564089 +35,5.5637752385082e-05,1.207217846236e-05,2.3033174652061 +40,6.4839823260016e-05,1.844537790924e-05,2.3398394923518 +45,7.4332133712806e-05,2.5158614352263e-05,2.3733504627113 +50,8.4092539131669e-05,3.2187207599246e-05,2.4049417650395 +55,9.3888463826214e-05,3.9908256976132e-05,2.4266012372914 +60,0.00010323683612959,4.8992974581954e-05,2.4214548809772 +65,0.00011266255963277,5.8229398297501e-05,2.4142310514246 +70,0.00012214407352407,6.7602846421036e-05,2.4038645327461 +75,0.00013168927245092,7.7076797993163e-05,2.3923720472085 +80,0.00014129356869822,8.6636512382646e-05,2.3798545017804 +85,0.00015095301808515,9.6270716039463e-05,2.3664924645965 +90,0.00016066467929913,0.00010597105426996,2.3523986408369 +95,0.00017040819689737,0.00011571915090458,2.3387981408876 +100,0.00018018480850651,0.00012550953189172,2.3252270791176 +105,0.00018999579215526,0.00013533938039156,2.3114253216103 +110,0.00019983912189051,0.0001452051244901,2.2974371251615 +115,0.00020971300364264,0.00015510388179827,2.2833019593255 +120,0.00021959888110224,0.00016502273243373,2.270282271349 +125,0.00022950520377271,0.00017496197512972,2.2574608359554 +130,0.00023943148653538,0.00018492075750379,2.2447204907186 +135,0.00024937629740186,0.00019489784829704,2.2320557231984 +140,0.00025933856736405,0.0002048919743404,2.2194726111622 +145,0.00026931733603067,0.00021490203530275,2.2069758602706 +150,0.00027931174337632,0.00022492707416744,2.1945687759467 diff --git a/test/tests/damage_plasticity_model/gold/uniaxial_compression_out.csv b/test/tests/damage_plasticity_model/gold/uniaxial_compression_out.csv new file mode 100644 index 00000000..ab309695 --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/uniaxial_compression_out.csv @@ -0,0 +1,52 @@ +time,displacement_x,e_xx,ep_xx,react_x,s_xx,volumetric_strain +0,0,0,0,0,0,0 +10,-0.0001,-0.0001,0,3.1699999999999,-3.1699999999999,-6.3997952043815e-05 +20,-0.0002,-0.0002,0,6.3400000000001,-6.3400000000001,-0.00012799180834944 +30,-0.0003,-0.0003,0,9.51,-9.51,-0.00019198156917977 +40,-0.0004,-0.0004,0,12.679999999999,-12.679999999999,-0.00025596723479604 +50,-0.0005,-0.0005,0,15.85,-15.85,-0.00031994880546093 +60,-0.0006,-0.0006,-1.1804722047823e-05,18.645790333253,-18.645790333253,-0.00036249125763133 +70,-0.0007,-0.0007,-6.2975427614796e-05,20.193679271904,-20.193679271904,-0.00033355073055208 +80,-0.0008,-0.0008,-0.00011541677415614,21.625126160924,-21.625126160924,-0.00030230221027006 +90,-0.0009,-0.0009,-0.00016916425553904,22.71489701518,-22.71489701518,-0.00026868076340714 +100,-0.001,-0.001,-0.000224255049219,23.713709391446,-23.713709391446,-0.00023261864527802 +110,-0.0011,-0.0011,-0.00028072790806985,24.621956814156,-24.621956814156,-0.00019404521771327 +120,-0.0012,-0.0012,-0.00033862298806045,25.440115495139,-25.440115495139,-0.0001528872622234 +130,-0.0013,-0.0013,-0.00039798165756048,26.168758911814,-26.168758911814,-0.00010906932519672 +140,-0.0014,-0.0014,-0.00045884628786399,26.808572609276,-26.808572609276,-6.2514096564659e-05 +150,-0.0015,-0.0015,-0.00052126002186467,27.360368963722,-27.360368963722,-1.3142827840262e-05 +160,-0.0016,-0.0016,-0.00058526651672789,27.825101918733,-27.825101918733,3.9124202762197e-05 +170,-0.0017,-0.0017,-0.00065090964072823,28.203882855689,-28.203882855689,9.4367394860351e-05 +180,-0.0018,-0.0018,-0.00071823317880874,28.497991149064,-28.497991149064,0.00015266623726873 +190,-0.0019,-0.0019,-0.00078728048790254,28.708892109312,-28.708892109312,0.00021410034417269 +200,-0.002,-0.002,-0.00085809403408581,28.838252173337,-28.838252173337,0.00027874745080292 +210,-0.0021,-0.0021,-0.00093071497365776,28.88794826729,-28.88794826729,0.00034668296339513 +220,-0.0022,-0.0022,-0.001005182658188,28.860081910853,-28.860081910853,0.00041797906126495 +230,-0.0023,-0.0023,-0.00108153409345,28.7569897543,-28.7569897543,0.00049270371462473 +240,-0.0024,-0.0024,-0.0011598033541234,28.581252625506,-28.581252625506,0.00057091962149575 +250,-0.0025,-0.0025,-0.0012400209582824,28.33570231749,-28.33570231749,0.00065268307084532 +260,-0.0026,-0.0026,-0.0013222132082343,28.023425594236,-28.023425594236,0.0007380427437671 +270,-0.0027,-0.0027,-0.0014064015071389,27.647764863792,-27.647764863792,0.00082703846971899 +280,-0.0028,-0.0028,-0.0014926016632303,27.212314980298,-27.212314980298,0.00091969995797347 +290,-0.0029,-0.0029,-0.0015808232004808,26.720915541941,-26.720915541941,0.0010160455439201 +300,-0.003,-0.003,-0.0016710686882156,26.177638395575,-26.177638395575,0.0011160809614754 +310,-0.0031,-0.0031,-0.0017633331185398,25.586769706949,-25.586769706949,0.0012197982068281 +320,-0.0032,-0.0032,-0.0018576034190763,24.952786780019,-24.952786780019,0.0013271749243531 +330,-0.0033,-0.0033,-0.0019538576499181,24.28032769229,-24.28032769229,0.0014381715406116 +340,-0.0034,-0.0034,-0.0020520654025408,23.574157384401,-23.574157384401,0.0015527349162403 +350,-0.0035,-0.0035,-0.0021521866532633,22.83913275817,-22.83913275817,0.0016707927323695 +360,-0.0036,-0.0036,-0.0022541726183475,22.080145928602,-22.080145928602,0.0017922578233748 +370,-0.0037,-0.0037,-0.0023579652111488,21.3020915597,-21.3020915597,0.0019170256298214 +380,-0.0038,-0.0038,-0.0024634977749313,20.509803919286,-20.509803919286,0.0020449760559709 +390,-0.0039,-0.0039,-0.0025706954872611,19.708013738036,-19.708013738036,0.0021759741084868 +400,-0.004,-0.004,-0.0026794760836711,18.901294071898,-18.901294071898,0.0023098712014461 +410,-0.0041,-0.0041,-0.0027897506587824,18.094012736346,-18.094012736346,0.0024465069781732 +420,-0.0042,-0.0042,-0.0029014250712181,17.290287880826,-17.290287880826,0.0025857104011994 +430,-0.0043,-0.0043,-0.0030144004957488,16.493948496358,-16.493948496358,0.0027273028561901 +440,-0.0044,-0.0044,-0.0031285750308939,15.708502523694,-15.708502523694,0.002871099716623 +450,-0.0045,-0.0045,-0.0032438448491474,14.937112218878,-14.937112218878,0.0030169127557584 +460,-0.0046,-0.0046,-0.003360105437405,14.182575694223,-14.182575694223,0.0031645524005071 +470,-0.0047,-0.0047,-0.0034772527911228,13.447318810031,-13.447318810031,0.0033138299032145 +480,-0.0048,-0.0048,-0.0035951845278076,12.733394473591,-12.733394473591,0.0034645593687072 +490,-0.0049,-0.0049,-0.0037138008916511,12.042489437445,-12.042489437445,0.0036165595851656 +500,-0.005,-0.005,-0.0038330056279197,11.375937763182,-11.375937763182,0.0037696556194753 diff --git a/test/tests/damage_plasticity_model/gold/uniaxial_tension_2elem_out.csv b/test/tests/damage_plasticity_model/gold/uniaxial_tension_2elem_out.csv new file mode 100644 index 00000000..8d33b01c --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/uniaxial_tension_2elem_out.csv @@ -0,0 +1,25 @@ +time,displacement_x,e_xx,ep_xx,react_x,s_xx,volumetric_strain +0,0,0,0,0,0,0 +1,5e-05,5.0000000001209e-05,0,-1.5850000000321,1.5850000000321,3.2000512005526e-05 +2,0.0001,0.00010000000000003,0,-3.1700000000012,3.1700000000012,6.4002048043743e-05 +3,0.00015,0.00014999999727429,4.0024734223106e-05,-3.4862156892916,3.4862156892916,9.6779051148882e-05 +4,0.0002,0.00017862734293029,6.8093756626783e-05,-3.477471609198,3.477471609198,0.00011216165953351 +5,0.00025,0.00024835041190431,0.000137933469697,-3.4652098234512,3.4652098234512,0.0001616852321851 +6,0.0003,0.00026993896006456,0.00015888007847208,-3.4291886168407,3.4291886168407,0.00017133095578839 +7,0.00035,0.00034485935625532,0.00023401341905145,-3.3921352348948,3.3921352348948,0.00022512601060176 +8,0.0004,0.00035654059152294,0.0002450169275363,-3.35653185387,3.35653185387,0.0002265865480974 +9,0.00045,0.00043833198349069,0.00032705678256184,-3.3201883999425,3.3201883999425,0.00028619595227733 +10,0.0005,0.00044651293525115,0.00033495631513795,-3.2792710308472,3.2792710308472,0.00028450762708399 +11,0.00055,0.00052715305030193,0.00041541055592181,-3.2502722981684,3.2502722981684,0.00034349724648966 +12,0.0006,0.0005332924201731,0.00042146720973885,-3.2069341423991,3.2069341423991,0.00034001250270793 +13,0.00065,0.00060642256236638,0.00049410815746748,-3.1829649589623,3.1829649589623,0.00039312366765298 +14,0.0007,0.00061084634713792,0.00049870146528674,-3.1374831784249,3.1374831784249,0.0003883105411033 +15,0.00075,0.0006645560288364,0.00055144486396568,-3.118863533145,3.118863533145,0.00042589491311074 +16,0.0008,0.00066769219744388,0.00055502022061305,-3.0715413732282,3.0715413732282,0.00042044367651783 +17,0.00085,0.00068831671615083,0.00057436933338461,-3.0558252843467,3.0558252843467,0.0004314913621756 +18,0.0009,0.00069078433673531,0.00057748426642578,-3.0082898057619,3.0082898057619,0.0004264043942068 +19,0.00095,0.00070155032206198,0.00058809635710821,-2.9782137952719,2.9782137952719,0.00042946948977682 +20,0.001,0.00070359512299156,0.0005907971189515,-2.9350739662572,2.9350739662572,0.00042504800025697 +21,0.00105,0.00070982616304493,0.0005969673208269,-2.903402488752,2.903402488752,0.00042476536078784 +22,0.0011,0.00071277747533545,0.00060028276453205,-2.8668857778067,2.8668857778067,0.0004218749400221 +23,0.00115,0.00071611407176282,0.00060388799583745,-2.8403058869124,2.8403058869124,0.00041987152776998 diff --git a/test/tests/damage_plasticity_model/gold/uniaxial_tension_out.csv b/test/tests/damage_plasticity_model/gold/uniaxial_tension_out.csv new file mode 100644 index 00000000..6be221e3 --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/uniaxial_tension_out.csv @@ -0,0 +1,52 @@ +time,displacement_x,e_xx,ep_xx,react_x,s_xx,volumetric_strain +0,0,0,0,0,0,0 +2,0.0001,0.0001,0,-3.1699999999999,3.1699999999999,6.4002048043577e-05 +4,0.0002,0.0002,8.9681412657498e-05,-3.4970986694694,3.4970986694694,0.00012974332005933 +6,0.0003,0.0003,0.00018914297676655,-3.514166465918,3.514166465918,0.00019567795022701 +8,0.0004,0.0004,0.00028866489214183,-3.4288604959872,3.4288604959872,0.00026161801110303 +10,0.0005,0.0005,0.00038824436782359,-3.3331899089345,3.3331899089345,0.00032756354008456 +12,0.0006,0.0006,0.00048787872917602,-3.2384622376478,3.2384622376478,0.00039351448492519 +14,0.0007,0.0007,0.00058756540621693,-3.1448420623741,3.1448420623741,0.00045947079552255 +16,0.0008,0.0008,0.00068730185017397,-3.0524734855524,3.0524734855524,0.00052543256741 +18,0.0009,0.0009,0.0007870858579702,-2.9614818474489,2.9614818474489,0.0005913994353004 +20,0.001,0.001,0.00088691507170409,-2.8719753382615,2.8719753382615,0.0006573715348468 +22,0.0011,0.0011,0.00098678730899121,-2.7840463870004,2.7840463870004,0.00072334882337133 +24,0.0012,0.0012,0.0010867003547575,-2.6977732949368,2.6977732949368,0.0007893313770424 +26,0.0013,0.0013,0.0011866524940094,-2.6132212616737,2.6132212616737,0.00085531886808354 +28,0.0014,0.0014,0.0012866419364226,-2.5304436642513,2.5304436642513,0.00092131148098096 +30,0.0015,0.0015,0.0013866658893711,-2.4494830405856,2.4494830405856,0.00098730904650979 +32,0.0016,0.0016,0.0014867235005769,-2.3703724472729,2.3703724472729,0.0010533116629232 +34,0.0017,0.0017,0.0015868128119294,-2.2931362422041,2.2931362422041,0.0011193192527386 +36,0.0018,0.0018,0.0016869322049859,-2.2177901507909,2.2177901507909,0.0011853317842476 +38,0.0019,0.0019,0.0017870801305661,-2.1443434815375,2.1443434815375,0.0012513492271478 +40,0.002,0.002,0.0018872551061383,-2.0727989494016,2.0727989494016,0.0013173715524852 +42,0.0021,0.0021,0.0019874557132744,-2.0031535588155,2.0031535588155,0.0013833987325986 +44,0.0022,0.0022,0.0020876805951768,-1.9353992240802,1.9353992240802,0.001449430741068 +46,0.0023,0.0023,0.0021879284542768,-1.8695233388149,1.8695233388149,0.0015154675526621 +48,0.0024,0.0024,0.0022881980499046,-1.8055092980636,1.8055092980636,0.0015815091432911 +50,0.0025,0.0025,0.0023884881960325,-1.7433369764451,1.7433369764451,0.0016475554899593 +52,0.0026,0.0026,0.002488797763518,-1.6829831659987,1.6829831659987,0.0017136068218411 +54,0.0027,0.0027,0.0025891256604954,-1.6244219748428,1.6244219748428,0.0017796626206013 +56,0.0028,0.0028,0.0026894708562166,-1.5676251991681,1.5676251991681,0.0018457231109581 +58,0.0029,0.0029,0.0027898323620786,-1.5125626360816,1.5125626360816,0.0019117882740176 +60,0.003,0.003,0.0028902092338994,-1.4592024014971,1.4592024014971,0.001977858091754 +62,0.0031,0.0031,0.0029906005700804,-1.4075112038476,1.4075112038476,0.0020439325469717 +64,0.0032,0.0032,0.0030910055039585,-1.3574545904958,1.3574545904958,0.0021100113633035 +66,0.0033,0.0033,0.0031914232255192,-1.3089971741688,1.3089971741688,0.002176095047314 +68,0.0034,0.0034,0.0032918529447778,-1.2621028307554,1.2621028307554,0.0022421833226036 +70,0.0035,0.0035,0.0033922939133948,-1.2167348995924,1.2167348995924,0.002308276174863 +72,0.0036,0.0036,0.0034927454173892,-1.1728563364041,1.1728563364041,0.0023743735904589 +74,0.0037,0.0037,0.0035932067756743,-1.1304298616862,1.1304298616862,0.0024404755564074 +76,0.0038,0.0038,0.0036936773386507,-1.0894180964372,1.0894180964372,0.0025065820603414 +78,0.0039,0.0039,0.0037941564868545,-1.0497836811968,1.0497836811968,0.0025726930904868 +80,0.004,0.004,0.0038946436296585,-1.0114893820592,1.0114893820592,0.0026388086356353 +82,0.0041,0.0041,0.0039951382040248,-0.97449818475746,0.97449818475746,0.0027049286851193 +84,0.0042,0.0042,0.0040956396733079,-0.93877337783695,0.93877337783695,0.0027710532287879 +86,0.0043,0.0043,0.0041961475261056,-0.90427862585682,0.90427862585682,0.0028371822569846 +88,0.0044,0.0044,0.0042966612751568,-0.87097803348817,0.87097803348817,0.0029033157605249 +90,0.0045,0.0045,0.0043971804562844,-0.83883620131154,0.83883620131154,0.0029694537306755 +92,0.0046,0.0046,0.0044977046273811,-0.80781827405383,0.80781827405383,0.0030355961591337 +94,0.0047,0.0047,0.0045982333674382,-0.77788998194802,0.77788998194802,0.0031017430380103 +96,0.0048,0.0048,0.0046987662756136,-0.74901767584481,0.74901767584481,0.0031678943598068 +98,0.0049,0.0049,0.0047993029703398,-0.72116835665633,0.72116835665633,0.0032340501174029 +100,0.005,0.005,0.0048998430884682,-0.69430969966569,0.69430969966569,0.0033002103040352 diff --git a/test/tests/damage_plasticity_model/plots.py b/test/tests/damage_plasticity_model/plots.py new file mode 100755 index 00000000..10dd6d51 --- /dev/null +++ b/test/tests/damage_plasticity_model/plots.py @@ -0,0 +1,56 @@ +import matplotlib.pyplot as plt +import matplotlib.gridspec as gridspec +import matplotlib.image as mpimg +from matplotlib.ticker import (MultipleLocator, FormatStrFormatter, AutoMinorLocator) +from matplotlib.offsetbox import TextArea, DrawingArea, OffsetImage, AnnotationBbox, AnchoredOffsetbox +from numpy import * +import numpy as np +import pandas as pd +import math + +uni_ten = pd.read_csv('./test/tests/damage_plasticity_model/uniaxial_tension_out.csv') +uni_cmp = pd.read_csv('./test/tests/damage_plasticity_model/uniaxial_compression_out.csv') +uni_cmp_dila30 = pd.read_csv('./test/tests/damage_plasticity_model/dilatancy_out.csv') +uni_shr = pd.read_csv('./test/tests/damage_plasticity_model/shear_test_out.csv') +uni_msh_sens = pd.read_csv('./test/tests/damage_plasticity_model/uniaxial_tension_2elem_out.csv') + +fig, sub_fig = plt.subplots(2,3, sharex=False, sharey=False, figsize = (12,8)) +plt.subplots_adjust(left=0.08, bottom=0.1, right=0.95, top=0.95, wspace = 0.25, hspace = 0.35) +[i, j] = [0, 0] +sub_fig[i][j].set_title('Uniaxial Tensile Test', fontsize=11) +sub_fig[i][j].plot(uni_ten['e_xx']*1000, uni_ten['s_xx'], color = 'black', linestyle ='solid', linewidth=1.0) +sub_fig[i][j].set_xlabel("Tensile Strain [mm/m]") +sub_fig[i][j].set_ylabel("Tensile Stress [MPa]") + +[i, j] = [1, 0] +sub_fig[i][j].set_title('Uniaxial Tensile \n Mesh Sensitivity Test', fontsize=11) +sub_fig[i][j].plot(uni_ten['displacement_x']*1000, -1*uni_ten['react_x'], color = 'black', linestyle ='solid', linewidth=1.0) +sub_fig[i][j].plot(uni_msh_sens['displacement_x']*1000, -1*uni_msh_sens['react_x'], color = 'red' , linestyle ='solid', linewidth=1.0) +sub_fig[i][j].set_xlabel("Displacement [mm]") +sub_fig[i][j].set_ylabel("Force [N]") + +[i, j] = [0, 1] +sub_fig[i][j].set_title('Uniaxial Compression Test', fontsize=11) +sub_fig[i][j].plot(-1*uni_cmp['e_xx']*1000, -1*uni_cmp['s_xx'], color = 'black', linestyle ='solid', linewidth=1.0) +sub_fig[i][j].set_xlabel("Comrpessive Strain [mm/m]") +sub_fig[i][j].set_ylabel("Comrpessive Stress [MPa]") + +[i, j] = [1, 1] +sub_fig[i][j].set_title('Uniaxial Compression \n Dilatancy Test', fontsize=11) +sub_fig[i][j].plot(uni_cmp['volumetric_strain']*1000, -1*uni_cmp['s_xx'], color = 'black', linestyle ='solid', linewidth=1.0) +sub_fig[i][j].plot(uni_cmp_dila30['volumetric_strain']*1000, -1*uni_cmp_dila30['s_xx'], color = 'red' , linestyle ='solid', linewidth=1.0) +sub_fig[i][j].set_xlabel("Volumetric Strain [mm/m]") +sub_fig[i][j].set_ylabel("Comrpessive Stress [MPa]") + +[i, j] = [0, 2] +sub_fig[i][j].set_title('Shear Test', fontsize=11) +sub_fig[i][j].plot((uni_shr['e_xy']+uni_shr['ep_xy'])*1000, uni_shr['s_xy'], color = 'black', linestyle ='solid', linewidth=1.0) +sub_fig[i][j].set_xlabel("Shear Strain [mm/m]") +sub_fig[i][j].set_ylabel("Shear Stress [MPa]") + +for i in range(2): + for j in range(3): + sub_fig[i][j].grid(color="grey", ls = '--', lw = 0.5) + sub_fig[i][j].legend(loc='upper right', facecolor = 'white', framealpha = 0.4, edgecolor ='none') + +plt.show() diff --git a/test/tests/damage_plasticity_model/shear_test.i b/test/tests/damage_plasticity_model/shear_test.i new file mode 100644 index 00000000..6f308929 --- /dev/null +++ b/test/tests/damage_plasticity_model/shear_test.i @@ -0,0 +1,214 @@ +[Mesh] + type = GeneratedMesh + dim = 3 + nx = 1 + ny = 1 + nz = 1 + xmin = -0.5 + xmax = 0.5 + ymin = -0.5 + ymax = 0.5 + zmin = -0.5 + zmax = 0.5 +[] + +[GlobalParams] + displacements = 'disp_x disp_y disp_z' +[] + +[Modules/TensorMechanics/Master] + [all] + add_variables = true + incremental = true + generate_output = 'stress_xx stress_xy stress_xz stress_yy stress_yz stress_zz plastic_strain_xx plastic_strain_xy plastic_strain_xz plastic_strain_yy plastic_strain_yz plastic_strain_zz strain_xx strain_xy strain_xz strain_yy strain_yz strain_zz' + save_in = 'resid_x resid_y resid_z' + [] +[] + +[AuxVariables] + [resid_x] + [] + [resid_y] + [] + [resid_z] + [] + [min_ep] + order = CONSTANT + family = MONOMIAL + [] + [mid_ep] + order = CONSTANT + family = MONOMIAL + [] + [max_ep] + order = CONSTANT + family = MONOMIAL + [] + [sigma0] + order = CONSTANT + family = MONOMIAL + [] + [sigma1] + order = CONSTANT + family = MONOMIAL + [] + [sigma2] + order = CONSTANT + family = MONOMIAL + [] + [f0] + order = CONSTANT + family = MONOMIAL + [] + [D] + order = CONSTANT + family = MONOMIAL + [] + [intnl0] + order = CONSTANT + family = MONOMIAL + [] + [intnl1] + order = CONSTANT + family = MONOMIAL + [] +[] + +[AuxKernels] + [f0_auxk] + type = MaterialStdVectorAux + property = plastic_yield_function + index = 0 + variable = f0 + [] + [D_auxk] + type = MaterialRealAux + property = elemental_damage_variable + variable = D + [] + [min_ep] + type = MaterialRealAux + property = min_ep + variable = min_ep + [] + [mid_ep] + type = MaterialRealAux + property = mid_ep + variable = mid_ep + [] + [max_ep] + type = MaterialRealAux + property = max_ep + variable = max_ep + [] + [sigma0] + type = MaterialRealAux + property = damaged_min_principal_stress + variable = sigma0 + [] + [sigma1] + type = MaterialRealAux + property = damaged_mid_principal_stress + variable = sigma1 + [] + [sigma2] + type = MaterialRealAux + property = damaged_max_principal_stress + variable = sigma2 + [] + [intnl0_auxk] + type = MaterialRealAux + property = damage_state_in_tension + variable = intnl0 + [] + [intnl1_auxk] + type = MaterialRealAux + property = damage_state_in_compression + variable = intnl1 + [] +[] + +[Postprocessors] + [s_xy] + type = ElementAverageValue + variable = stress_xx + [] + [e_xy] + type = ElementAverageValue + variable = strain_xy + [] + [ep_xy] + type = ElementAverageValue + variable = plastic_strain_xy + [] +[] + +[BCs] + [x_r] + type = FunctionDirichletBC + variable = disp_x + boundary = 'top' + function = '1E-5*t' + [] + [x_l] + type = FunctionDirichletBC + variable = disp_x + boundary = 'left' + function = '0' + [] + [y_l] + type = FunctionDirichletBC + variable = disp_y + boundary = 'bottom' + function = '0' + [] + [z_l] + type = FunctionDirichletBC + variable = disp_z + boundary = 'back' + function = '0' + [] +[] + +[Materials] + [elasticity_tensor] + type = ComputeIsotropicElasticityTensor + youngs_modulus = 3.17E4 + poissons_ratio = 0.18 + [] + [damage_plasticity_model] + type = DamagePlasticityStressUpdate + factor_relating_biaxial_unixial_cmp_str = 0.109 + factor_controlling_dilatancy = 0.23 + stiff_recovery_factor = 0.001 + + yield_strength_in_tension = 3.48 + ft_ep_slope_factor_at_zero_ep = 0.70 + tensile_damage_at_half_tensile_strength = 0.51 + fracture_energy_in_tension = 12.3E-3 + + yield_strength_in_compression = 18.30 + maximum_strength_in_compression = 27.60 + compressive_damage_at_max_compressive_strength = 0.25 + fracture_energy_in_compression = 6.889E-2 + + yield_function_tol = 1.E-5 + tip_smoother = 1.E-6 + smoothing_tol = 1.E-3 + [] + [stress] + type = ComputeMultipleInelasticDamageStress + inelastic_models = damage_plasticity_model + perform_finite_strain_rotations = false + [] +[] + +[Executioner] + end_time = 150 + dt = 5 + type = Transient +[] + +[Outputs] + csv = true +[] diff --git a/test/tests/damage_plasticity_model/tests b/test/tests/damage_plasticity_model/tests new file mode 100644 index 00000000..ad5ce001 --- /dev/null +++ b/test/tests/damage_plasticity_model/tests @@ -0,0 +1,57 @@ +[Tests] + issues = '#184' + design = 'DamagePlasticityStressUpdate.md ComputeMultipleInelasticDamageStress.md' + [concrete_behavior] + requirement = 'Blackbear shall demonstrate behavior of concrete ' + [uniaxial_tension] + type = 'CSVDiff' + input = 'uniaxial_test.i' + csvdiff = 'uniaxial_tension_out.csv' + allow_test_objects = True + cli_args = 'Outputs/file_base=uniaxial_tension_out' + detail = ' in uniaxial tensile loading.' + [] + [uniaxial_tension_mesh_sensitivity] + type = 'CSVDiff' + input = 'uniaxial_test.i' + csvdiff = 'uniaxial_tension_2elem_out.csv' + allow_test_objects = True + cli_args = 'Mesh/nx=2 + Executioner/dt=1 + Executioner/end_time=23 + Outputs/file_base=uniaxial_tension_2elem_out' + detail = ' in uniaxial tensile loading on multiple elements model.' + [] + [uniaxial_compression] + type = 'CSVDiff' + input = 'uniaxial_test.i' + csvdiff = 'uniaxial_compression_out.csv' + allow_test_objects = True + cli_args = 'BCs/x_r/function=-2E-5*x*t + Executioner/end_time=500 + Executioner/dt=10 + Outputs/file_base=uniaxial_compression_out' + detail = ' in uniaxial compressive loading.' + [] + [dilatancy] + type = 'CSVDiff' + input = 'uniaxial_test.i' + csvdiff = 'dilatancy_out.csv' + allow_test_objects = True + cli_args = 'BCs/x_r/function=-2E-5*x*t + Executioner/end_time=500 + Executioner/dt=10 + Materials/damage_plasticity_model/factor_controlling_dilatancy=0.30 + Outputs/file_base=dilatancy_out' + detail = ' when factor_controlling_dilatancy is changed.' + [] + [shear] + type = 'CSVDiff' + input = 'shear_test.i' + csvdiff = 'shear_test_out.csv' + allow_test_objects = True + cli_args = 'Outputs/file_base=shear_test_out' + detail = ' in shear loading.' + [] + [] +[] diff --git a/test/tests/damage_plasticity_model/uniaxial_test.i b/test/tests/damage_plasticity_model/uniaxial_test.i new file mode 100644 index 00000000..c9b6c38c --- /dev/null +++ b/test/tests/damage_plasticity_model/uniaxial_test.i @@ -0,0 +1,232 @@ +[Mesh] + type = GeneratedMesh + dim = 3 + nx = 1 + ny = 1 + nz = 1 + xmin = -0.5 + xmax = 0.5 + ymin = -0.5 + ymax = 0.5 + zmin = -0.5 + zmax = 0.5 +[] + +[GlobalParams] + displacements = 'disp_x disp_y disp_z' +[] + +[Modules/TensorMechanics/Master] + [all] + add_variables = true + incremental = true + generate_output = 'stress_xx stress_xy stress_xz stress_yy stress_yz stress_zz plastic_strain_xx plastic_strain_xy plastic_strain_xz plastic_strain_yy plastic_strain_yz plastic_strain_zz strain_xx strain_xy strain_xz strain_yy strain_yz strain_zz volumetric_strain' + save_in = 'resid_x resid_y resid_z' + [] +[] + +[AuxVariables] + [resid_x] + [] + [resid_y] + [] + [resid_z] + [] + [min_ep] + order = CONSTANT + family = MONOMIAL + [] + [mid_ep] + order = CONSTANT + family = MONOMIAL + [] + [max_ep] + order = CONSTANT + family = MONOMIAL + [] + [sigma0] + order = CONSTANT + family = MONOMIAL + [] + [sigma1] + order = CONSTANT + family = MONOMIAL + [] + [sigma2] + order = CONSTANT + family = MONOMIAL + [] + [f0] + order = CONSTANT + family = MONOMIAL + [] + [D] + order = CONSTANT + family = MONOMIAL + [] + [intnl0] + order = CONSTANT + family = MONOMIAL + [] + [intnl1] + order = CONSTANT + family = MONOMIAL + [] +[] + +[AuxKernels] + [f0_auxk] + type = MaterialStdVectorAux + property = plastic_yield_function + index = 0 + variable = f0 + [] + [D_auxk] + type = MaterialRealAux + property = elemental_damage_variable + variable = D + [] + [min_ep] + type = MaterialRealAux + property = min_ep + variable = min_ep + [] + [mid_ep] + type = MaterialRealAux + property = mid_ep + variable = mid_ep + [] + [max_ep] + type = MaterialRealAux + property = max_ep + variable = max_ep + [] + [sigma0] + type = MaterialRealAux + property = damaged_min_principal_stress + variable = sigma0 + [] + [sigma1] + type = MaterialRealAux + property = damaged_mid_principal_stress + variable = sigma1 + [] + [sigma2] + type = MaterialRealAux + property = damaged_max_principal_stress + variable = sigma2 + [] + [intnl0_auxk] + type = MaterialRealAux + property = damage_state_in_tension + variable = intnl0 + [] + [intnl1_auxk] + type = MaterialRealAux + property = damage_state_in_compression + variable = intnl1 + [] +[] + +[Postprocessors] + [react_x] + type = NodalSum + variable = resid_x + boundary = 'left' + [] + [displacement_x] + type = AverageNodalVariableValue + variable = disp_x + boundary = 'right' + [] + [s_xx] + type = PointValue + point = '0 0 0' + variable = stress_xx + [] + [e_xx] + type = PointValue + point = '0 0 0' + variable = strain_xx + [] + [ep_xx] + type = PointValue + point = '0 0 0' + variable = plastic_strain_xx + [] + [volumetric_strain] + type = PointValue + point = '0 0 0' + variable = volumetric_strain + [] +[] + +[BCs] + [x_r] + type = FunctionDirichletBC + variable = disp_x + boundary = 'right' + function = '1E-4*x*t' + [] + [x_l] + type = FunctionDirichletBC + variable = disp_x + boundary = 'left' + function = '0' + [] + [y_l] + type = FunctionDirichletBC + variable = disp_y + boundary = 'bottom' + function = '0' + [] + [z_l] + type = FunctionDirichletBC + variable = disp_z + boundary = 'back' + function = '0' + [] +[] + +[Materials] + [elasticity_tensor] + type = ComputeIsotropicElasticityTensor + youngs_modulus = 3.17E4 + poissons_ratio = 0.18 + [] + [damage_plasticity_model] + type = DamagePlasticityStressUpdate + factor_relating_biaxial_unixial_cmp_str = 0.109 + factor_controlling_dilatancy = 0.23 + stiff_recovery_factor = 0.001 + + yield_strength_in_tension = 3.48 + ft_ep_slope_factor_at_zero_ep = 0.70 + tensile_damage_at_half_tensile_strength = 0.51 + fracture_energy_in_tension = 12.3E-3 + + yield_strength_in_compression = 18.30 + maximum_strength_in_compression = 27.60 + compressive_damage_at_max_compressive_strength = 0.25 + fracture_energy_in_compression = 6.889E-2 + + yield_function_tol = 1.E-5 + tip_smoother = 1.E-6 + smoothing_tol = 1.E-3 + [] + [stress] + type = ComputeMultipleInelasticDamageStress + inelastic_models = damage_plasticity_model + perform_finite_strain_rotations = false + [] +[] + +[Executioner] + type = Transient + end_time = 100 + dt = 2 +[] + +[Outputs] + csv = true +[]