From 13d51757ca18019209fccc408125d7801c14a721 Mon Sep 17 00:00:00 2001 From: Amit Jain Date: Wed, 18 Aug 2021 09:33:11 -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 | 679 ++++++++++++++++++ test/tests/damage_plasticity_model/bi_ten.i | 316 ++++++++ .../gold/Lee_bi_cmp.csv | 25 + .../gold/Lee_bi_ten.csv | 25 + .../gold/Lee_cyc_shr.csv | 61 ++ .../gold/Lee_cyc_uni_cmp.csv | 47 ++ .../gold/Lee_cyc_uni_ten.csv | 47 ++ .../gold/Lee_cyc_uni_ten_cmp.csv | 61 ++ .../gold/Lee_dila_ap_02.csv | 14 + .../gold/Lee_dila_ap_025.csv | 23 + .../gold/Lee_dila_ap_03.csv | 25 + .../gold/Lee_uni_cmp.csv | 26 + .../gold/Lee_uni_ten.csv | 25 + .../gold/Lee_uni_ten_msh_sen_2_elem.csv | 17 + .../gold/Lee_uni_ten_msh_sen_4_elem.csv | 15 + .../gold/Lee_uni_ten_msh_sen_8_elem.csv | 13 + .../damage_plasticity_model/multiaxial1_cmp.i | 282 ++++++++ .../damage_plasticity_model/multiaxial1_ten.i | 282 ++++++++ .../damage_plasticity_model/multiaxial2_cmp.i | 287 ++++++++ .../damage_plasticity_model/multiaxial2_ten.i | 288 ++++++++ .../damage_plasticity_model/plotting_SEM.py | 171 +++++ .../damage_plasticity_model/shr_cyclic.i | 287 ++++++++ test/tests/damage_plasticity_model/uni_cmp.i | 498 +++++++++++++ .../uni_cmp_dila_ap2.i | 498 +++++++++++++ .../uni_cmp_dila_ap25.i | 498 +++++++++++++ .../uni_cmp_dila_ap3.i | 498 +++++++++++++ test/tests/damage_plasticity_model/uni_ten.i | 301 ++++++++ .../uni_ten_msh_sen_1ele.i | 298 ++++++++ .../uni_ten_msh_sen_2ele.i | 343 +++++++++ .../uni_ten_msh_sen_4ele.i | 344 +++++++++ 37 files changed, 7007 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/bi_ten.i create mode 100644 test/tests/damage_plasticity_model/gold/Lee_bi_cmp.csv create mode 100644 test/tests/damage_plasticity_model/gold/Lee_bi_ten.csv create mode 100644 test/tests/damage_plasticity_model/gold/Lee_cyc_shr.csv create mode 100644 test/tests/damage_plasticity_model/gold/Lee_cyc_uni_cmp.csv create mode 100644 test/tests/damage_plasticity_model/gold/Lee_cyc_uni_ten.csv create mode 100644 test/tests/damage_plasticity_model/gold/Lee_cyc_uni_ten_cmp.csv create mode 100644 test/tests/damage_plasticity_model/gold/Lee_dila_ap_02.csv create mode 100644 test/tests/damage_plasticity_model/gold/Lee_dila_ap_025.csv create mode 100644 test/tests/damage_plasticity_model/gold/Lee_dila_ap_03.csv create mode 100644 test/tests/damage_plasticity_model/gold/Lee_uni_cmp.csv create mode 100644 test/tests/damage_plasticity_model/gold/Lee_uni_ten.csv create mode 100644 test/tests/damage_plasticity_model/gold/Lee_uni_ten_msh_sen_2_elem.csv create mode 100644 test/tests/damage_plasticity_model/gold/Lee_uni_ten_msh_sen_4_elem.csv create mode 100644 test/tests/damage_plasticity_model/gold/Lee_uni_ten_msh_sen_8_elem.csv create mode 100644 test/tests/damage_plasticity_model/multiaxial1_cmp.i create mode 100644 test/tests/damage_plasticity_model/multiaxial1_ten.i create mode 100644 test/tests/damage_plasticity_model/multiaxial2_cmp.i create mode 100644 test/tests/damage_plasticity_model/multiaxial2_ten.i create mode 100644 test/tests/damage_plasticity_model/plotting_SEM.py create mode 100644 test/tests/damage_plasticity_model/shr_cyclic.i create mode 100644 test/tests/damage_plasticity_model/uni_cmp.i create mode 100644 test/tests/damage_plasticity_model/uni_cmp_dila_ap2.i create mode 100644 test/tests/damage_plasticity_model/uni_cmp_dila_ap25.i create mode 100644 test/tests/damage_plasticity_model/uni_cmp_dila_ap3.i create mode 100644 test/tests/damage_plasticity_model/uni_ten.i create mode 100644 test/tests/damage_plasticity_model/uni_ten_msh_sen_1ele.i create mode 100644 test/tests/damage_plasticity_model/uni_ten_msh_sen_2ele.i create mode 100644 test/tests/damage_plasticity_model/uni_ten_msh_sen_4ele.i diff --git a/doc/content/bib/blackbear.bib b/doc/content/bib/blackbear.bib index 29c911b66..f5fa6ac07 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 z90f0QK<)nCv}Zs@a~)FA8jo8sv@eoH&cTNXWVQD{%ms%VT&&oalM$RbLhsG;P696t zT+;WYR2_V9)CrT9y40%3>0F&0D3(%`B;Eh;-{a}6t@jbw*Wun(HY9w~54fi{_N8eS zmaxKV=tlw_)AP|)ODUMv2jaehebo_yX}u(V`%Hshyn=J?_D{~t{`|AnU?B3EtfgN3Dr)^0Zrzc4=qlm4dCslCsw)=Qy_7 z$H02IN%uji0Ekv$tM}Ev1lJ0|cgu>Vn@*{sMLMiGXxKCR)oY3A{|2{^U{Eh=NkH7o zS}-z&02qldWpBo!x-e`yqZzK3M%lPy9Htv55q@M(kNk1SdA+tL0?W$S#>sOL6#J#8 z;KMyNA%m?A<=k*mocdI3(@%03@s_5|xxJZMuK~jUut-SPOBT61A&BPIEOx^u~W@Aeiqdz9>Z~os$>EWXos@I8eivMUZqY$u8oH2Nt<*IHD&Ye&yaTZmynxl!y>E(cU6^Iwo>_X>XF3DzF^X7?Hp3 zS|Ab(?71I-B^*h4MIZy>G<~QdaZhpmzXOeu)-tMSWs6Qjyc0B+9NiobiTu@`Dx_bn zKJ?2>c|<@B+X1pJs(ZQ<2dkeyAQ^$(n;kVbw0#hz*ZA88{qlQhBe2ZZQW6Nfkc|Q# zWvsF%-P2g0foB=|DW*gbc%h+9BGA}$uMHCgZG<17AA3qLftMzhhFH6t;It^#>@&*`1@v4+z0l>%SGT3y7* z;ZT>h0v0l8r;(AiG;F5{9G}E9U$gz2v$8s+E83 zXv9R=z5&dE;GTNzuLvvw)`E(w2On0HmC;_0>O}8!Xqw<7xGjeW9eN3CXLb%JMiX-u zZth6nHze#NJ2PSE0CcfB9CCO;Ytk%sXH@B!kl-Wrv>4F(rP);l33kbVMwh- z5(x~8yQ(5V`-cRCT0lm+KOOVTKqED9<{PNy%hs#7y`lW6z>enHI0mDytQJYa?A&2? zLdE+sYmtjEi_t6#7cC?h4&)&cO}b6Tw13eBU7cy*3aKdY5lpiJyiH6$VFWhhaB39+ zS5XAG26WL{J8-E1Mg}yE1QAdSt?ItLNCN(f(Oncc3o&zxRZjRg1)|^Lahy3EMYa$p zy$@o_7yJYlNXr~$A*BbbK};e!<3-%QwW8+%#xNQS@$yMtufy=b3Lb(Hu1jZg=GbQ1 zf|V6i1#?VWeSud%^5nH8F1Q!D2O~%^8{l+Mnx(Lv!gXPPKDo^kEG_dRQO{VowZ{YQ zr(g?O^GR|CKtiJ^83X#up-jC2avzv(x~6_D5Uqg3g$DQPrL?_!_-7{HuG@GIh{(Q$ zlC{lW+nv&13x3&4#OPr<8ppKYlPbt38BK6H_$sBqCT89qwPI&@m@SyXcRp|g0%5oI zlz^dTy{QN)$wKZT8Lx;II*wRsFuv@CS-+k&tA_l-!)B>r#@9U~sdb%q*M|o52?;&V5D4q=C2W z2D~)DyGzZoHCN+z8p1mD$b|+S+I;hUVm(skM-q%&Zj1mL&oM|0GG1*v_rhmFK%%(V zMQN5a+Xg^qN5SyvYSksptPFZJ9j8OP_c(k1T zP6ZGGZwCh^YEDYND_v9vo*-8?8vU1X`@WJ4s)x7O8Ia3^klSP=7|QhG+nujMgBxA$ z$M!B10bsfGMpzK9+|2obwX=gG$3_4;fehZ@_#(XW2yePXqpdYk4(ybT} zIc|<2X#`Ni?7d#IyH(><_V$~QsY@HT!(y^*-t?_tG!>(+aJY#1$uha@ELbvB*LuIY$rcPCkkdO2z zQ*=&xu&YP|YKg(t7#lHt5a~?J&U8#Y6su2`KU>aI%8@)t0oybvW0p=`Z3K4ja)Vku zTG70*nI?TcsJ8Oxdo}q*-2Akff)}~QV0x1KIj^<1LnqQ#U*I23R*a;g5xC%=gMhv{|`-QrmS-(%>Mki zY}YZg{P>g&O;yg}{w`nYAqvQnfFWH0#ef7b->$!&J0jw7ZoR!`yS;ww@eO?>t>O-d z1`^cc7AkDzBYD>VhfyadS64XyiV?zmTK{~6Kg5O_Y?cOqDJ3$u0sE_Anl)GS2Zvi^zc zkbhrwkw*RE-t?n1!c5--G78nsiutaTN&YS7mdc+W&JJyK6~WEq#j`J+-YVr#M#9m_ zp9=O{O|c42tD{L7Hy*ddP~reepaq|U{UWu|gF}(I#hgo!b*IwwvqaS4v;uc=aY4^I zs4U|w=wB$TwO@BDCE*&y&M?Je-H7-)V=2gD5b36$OZ9T9I~M#uHjz*CEoaW53pZ)1 z0=4}%`x+E>mlQ%F?rio(&Nrdfg<$Uj14$flZHbiYX`h%LXs1+HbrgLu3IXNTr{XtG zkefa-z>blTrFNXO80_K z#&J?QxLH$n7W4{@+#+3bRBa}R4OiIxS+gVXt9&flSab7K^+FVl_a8k#9rjp=G(Y|w zN%kdu^lkNZ*;RRESEC5Uqn2Z3ep_V?E%K|y1*}LKiu4aDV}3N>cX<5NF4cVH>E$Dz zKDOrV{u$csoV4?SQ97hc4-JDd!V@n8Yo{};zE#{#X50Y9+>mPN`1&_O&`!N)H7-{# zCOGCs_f~wMMtwjE&(|kU)i7aBZ7+)Kx|G8v&2$q|_MX$OzzS+fTei-9l{5vpcz8pP zj;WIU1>6_RLl(ptQ^>6t>2j}j?T2ffl8+8w(@#gXe}J%lirlaV#w~4U!hDAt$=DcK z%GmYkhw=k_D$7~8xN*B$@a}V&JcsC0XSn4OG4c5wv%4N6P`cc>N$kci&3J9Ntdn;J z$y4!LI^|dT)TLnk?$FlvQ^?g%*K6%a+NMD=JR>Ao>+s=)^tDP}(JRz6OJc2T4Asc4 zO5tAh^Xgb(usj{}gp=GxoAxmU_~+dT(@{R2`Q6#Mott;Y;q?US?+elHwCPRbJ6n)# z9lW(!MD+rXJ{@`IqXCdD=smQ=?Zkr{WzW)gjaOm&6$!opWM}g5y5H{Ht_|u_jL$d< zKPLh)1hvl>0@=1Lj;fZCAt?mgWR4M>fo6wT!wOv5Bi+Qm&1ktFU8gQxrya6;1m$Fs z2ttvD9M+?^FKp^?XJBEw8^A(X%RN9c7aKCR+cJWXwE2-I+IO#)uROn%wh}b9*>k%B z5F{FS5 zu0LOLu{EoQ?5*UE>N z>sr1snObW11IkJ>(v}=*RviZB;&I2)Q3ZHio|3~)d4kbrT$Vlh-YA_OL6j?)_XgZ@ zBFSO{RC^7}Qs(4-_@Psr&JmQCbKH~-8l9JyT>rrt)3DvWR@2we1?R%Uxg z-_cQKHy@kCD@lCU7x7x)sr$!;*(utQuq~!q#PAe(wvyGL3G^# z*=thdHtpdG-xRTYJ@WLN(vG@lZqWhWaJgar{!Hd}f4%esJ)+Qh6DDdSRYX73-{>S@tMW z1;tu(oq(`-p2?T{ni{j!2bRyN!YsBdr*4wn^8Wg@1V``FR6K@Up%y%pWSw~w-L|Ph z{Y=4LrN=wicV7C6z{LjY;kt@o_ zlxbL`*p1_Zm8{6)-mn-XF}aXp6!3-9(`jI9Ze4tb{gaqX<9U_9gV%%vDD3F@1n6yE&}k8Q)}$K=#$%RQ9> zqc7H9-0hm%){<6|lG1bM(y)MnNL5^2T7A!5(jcKhb@V?TWa99cDEfsWr*LJ2oGVtR3Ry`}1DpkFIoEa(7aJHdpZ~&Cmvt z&bODKi~05iwOJKBL>-WPJ`QWKn5?~BJu}fXm7KV$@TX5=ZKKU$fDUxdU)I91PD8;&x{OxTh{A#c#Qax}d%$`XsT{j!A?kkqAPBIA%43TT$l z(S{>xcTnf4A)n5xDk5F&aL2CcH0&xXa03cm2UHeqyi}}m!kl83h20W-|9tk7V<{d! zr-8Y8(_%7Tw91kwz)3C)q#Euk1v|->acP zAsl`NjrE~>#HTW#mUkFWIw7||=_W~Vvzv6^svxJNhr;6bNYu}A(~(WWwbN=Svpf-{ zG4TGCq`PC+i0mKqgx$7MIrMp^kS5Jn?ZoX57sN2U$U`v#e%f0BkrIWC@hGk1F(#4;Cy#vbu02UX!OPNrn}(J#t8jyp#APWb3GM zzwDtlfd?->v`MiBZ4uKv^(5e;ocqf^DD#K7*r;*?Wg^>P+2lo@SMsIL zRYjOk=gQu6-oUG`h-Nsc6OuIl7I}^SRrjy=LS+mYV>MfEYud$=rSigvBy*U#0!|Fa z#p>!h(wZn|>2%n9`lK2}D6Csf+WU-+rnkN|aOk}J$~law&q9+iud(T+xWz;&<_)hq z8)@!rOFt|}uXdD1O#7Eo3pdN|@&psoY|Kbjj>l;jYF)+@WKMre>;;5jRYG?P1=$c9 z`&@Am&N*9&pR?Iz@gyU}F-eS694Re==4~Fo3bY9*s#GE$*c+xBtcnegC-P^Tji7ZO zTug8f@;Y`?7#=scN*_RzVPUz@t?|iDnq%9SWJ0r>8_%Cuxt#}n*qOt+JRNstv7_7W ziuA7dl*DzWsSL{Wl-Or|Dzvxlq6w?Jm$ygIQX=)H$>JY8J1Cn7<;UAQmUJ# zl9V*q*@<96xuGDz^y6>L0az?viatJJf2 z(;_I9>K0GYlCVwsk#Gkc^rY=1&9$Vl>_=|VPQn`#ITt5l@{}zN%e@Cj}X8DPh&MjmQ8)Hu(`8#x8DVmdGLkirY zC$n%Bt+iavDuFC%Y?@@`r{+Q?I5ZkbcrHi`t_##G3Jk1vr}jqjApD; zjg{&QBeUngcKgE^Ohmlw%)%JAv_R9FlgHzK_#|*dkWXe8`>Gw+NwLXkyNlcfE$s>m zNMato$M~$4W>j6kXuef4h8K31;91Y^$xSNV)LvH=xu_*L;qbPnuPvfj7s5Jjyy5$B zQut~Cd0neC>!FVL#z&Fplf9joL6mIR1@-&tN}G$0sZ%?etb(HF*Nr~K@?SqrbIj)o z-#j35%MEu0CDoxgCe?D%sjS{9@{+AQi^H(h7V>fQ7azV6@3}E1=f9?^^M_~2b_Z=% zTN|6NFUW;GQO^3Cy?o@)J*VLfPdG;3;1-yysfJA0s}e&AS|^xWh*{94JT%$yiYIii znzL(j9|_PXN$GExQxe_x+Vqxt^1K4)@gu9!u)6mb+8&q1hjJ=Nvf3ILmR!ASQm_-r z#v_Nnyz^fD3QzCZd0dPSmx)CT6-y&+{Gc5-E3IhT)~gK2wKsNqzU?V%G4K82y=d!{ z-s;&UJ4&-<(*^dJmCWPBDqaeo(mHgc&B^=B~bSckpauw!8J_r@#!P7+6%lS}F5 z&!-I;RzoTC4NY(KhnUq2TK$_p=6Y}(nSLB&OB z9n84>{Vg*?Opm%6!DwMTTW`{x1aYN6D*H*=VJbzdB&sEEIF}0;LxJP)T{pn@vLzo# z2$a6t#ugfSIL%FLf?*)%aJyX7SxTzckHRh?gaqK*;W ztiyXN7E3T|BkQLwnYpx0oVQhySS6TYGczZf%CD#6F`7hzA`KGY?bwklv;3iwf9s3A zrc*a>BUOi`(!A96{p{o;~=p32qj3iV!1keht>q-;ce-^AZzpFc9?t#9R z;Tayg{DIA|k9tD!_&Cj4%gfu6j8`pQ^6~_kknwj*tKbVeaD5RoRp2olb830~oQCE% z;O$Ym$QJe;Ijcg{($ZLZ=rGd}?ZMfp>v%a-%&A@~x3oODtX>%_t@fPj9sAtYo@(aB zO1sQB9!lz&rJ8tx)h(VwoOkK!^4tqR=u6h-oT92oK=*Toqfe85?tL4-%aPa__&sKu zOM-y3kZZ79Obpw_r(}X+TBulv$K{nPS`2J3EtvkKIZx|X0x4n1^)F5jwHx^~kD5>& zFPEv@=)Bd1?r%MuVWV;^J5$S9`TP1+wYoHlzK-f_6?`sf%=AYqE};oY$>MW?(P%Zd zsm#E@DW;nSeQ`=w%*iufBZCNU%5{WimXajq_&n9ah`Oj^29k`1Y)kO(5xU6d%KFjh z%JF>HyU)*KDraT=raVgfM_a(1jqe+(!Gvj%<;N!aa(jlWXs=41fzzR@wAJXFmVith z#@@&nH5Hxv?H*kP+GrG`TvnO^&%*KC-@1|tH>k4C@lvs#SXgVr9LZ7HXq1qQp#7qQ zy*_M6M{_5|v>~{wy-n)~TAuRwMq}&g$mc1KX&9q=$^q8yrq;)+*Hb((B_f` zDX5!1v3$uKvb@1Dd{n7{FT@|Eux(^7yAWujds?K0GvmGe=jg9v52IttI1KqoEf4pqWZT`ig87?6OVN7=;H+tVZI zj-nFTxQwvQrF&}*nr`~@)zRU-WHJ{ldG!aYp9sZ8wIW4i&U&AS&8$_d(t9!kW6q>* z*c~ZUbxR+oDa;nLo2oXoq->eW5LPySORdC38yaPIQat@$(|b$e&F= zQ2KSli)iLz-Bbb9$zdMG!d2|vdlY_BPIFH?h#`e)`~GZ@3K?{b(hSGpLgNFQ~pj9{mEY}Cy6+6 z`)*c`(e|tWHFG@aYA;PxZDyT$UQg{>ddPY(gBjx}=Ns(x@jlrss&CngQ}b!Zw9-$M zng;)1?H%3__pHi(C6rWFyG=exBP>p2UlJYf=X#gm&`s4PYEtsim00aa;;2d^PKs3Kc4zm#*!Han?Z7`$X6|dQdZNXEQOq**o4V|+ zv3$RT${#Xzr5s1e>)o2euioSII!2=gH!u1<^AqQkp2{TCuXI_SRm&;U3};9?(=Iwj}hfz%mscLc4r@<(ec`M~u4a zlCvA?YtOu2QCL7=J~!9kQ9k@NjKL{YFJ{l-xb+(sSFLT&y6ozNoVJf2@kK9g#w}U~ zrq5Ke-8TObE5f@JY}r_{eW!ZN@Es`yn}@vT9rRgk)}KQTBoJYKNXO!R`)HIAvtud) z7Mm*?7x4_Ww6M6d5szZ-;INt{_)ef2j?VoL$mS zDx=D|bFn=%e5RbY`DIv7W>&_W{-bXaGqVxxXLc<|%_0l+9f6sYS}%(ipI`{MYlh~I zMp@4tRvM#Pr7q(SncNVYxO{(m*+{Sj21oGUh^@)g$ z-wS8sUyVsb->?ZLT)M+pH=G_8t~2EM(}>ENP=`^^ILkkk3B|Xe@-<>Z?C}hNTUtuj z<5IcHfJI7A&RJu7ghI;a)sh_by7?k1^&!`(GurpqPLn@6sT3IM=1AN-oq9YvjgX{{ z2DRZtrqE-rY`bCR5Pi2!=acXjVlUz*e|2$=HReh01ywSyJdbB6etU#wNHW|5J|3YFys)w zKQy@(>aZyL`H7K9fYh)S!&&ap)otGHxaqi#)rw%k6K3&0kBw}84)P{3qX{aUFqRWB zBBEMyN=PT`jJ%AWmMxY*$6WqqQcY=eBc5h#Y}GykxQUW*19N44>E5<{%`TE*9EB7)2->-jB2^b}_s)vB*G6j{sbvwY+@F0|tyW{Ib8okv2P!>6|qpDIhq(!*Dn1?4Y+gzPUj}M1}fy)qBZ9bhttWczI)1vW{(tKQ_#O;DoD< z8KHdh^1D|F9{!74Rw^7v$+Cxg6f@n^6CDzQp6UCH(C}u+bX|~qy8b6Fj8j?L(_EL9 z$<22-Qm#9gbH%F{g@7f$;OD7I>6ctB>O1?a$0*Q#G6c@GHAH9vjO-Lm)YZZGMY#?e z_{(iH)1vE94|DMdW{{S;g~}HD(@Q2%4l9j5>s;2?-54h4fQ4xc@vb!LQ;M^bC7+Mcv5tknh$H!VKseVnp9H{kg9l-&?u3wY{SU z5$;BaLuoC~(-5T)@h>qia@bJO#|LoKd{Qhpmc?LSE8%C6tkNwYSH$IYo231eNN+wn zwX)_?5I#kd52HK*eGc!FJjUOVL_$A38&z?-B5N-f9~otAS2b#!^~=zF)>87dm{&xO zfRI!(jxx?Pl_bbB%Y5QWIaMREM_2;flzG@nZ#b2!k{Wc$zG+DF#ECJ{)HGNcR7-LO z;zoQdOT-IxL%$R)r@wv;4nG)ztW83u9k*xH!LKGhg+lWtQzDp4R0N zGbhzyq^S?YMJLfyF}rOSMH|WYo{^auy+5R|Q3Zm|NKo_J=bcDE(tlRFrlH|8Q&CfSvBIbFFBB@e?%&&!YsLe`mlf^`J#DK@^(ghollNu2#XW*vI&`W6M zV#=%cUOH*?1I?uIKRHC5%(=v##3piDR`X$JI5(zZzQI-TWfijC(Z{!mMVZ?M1(^jk zRqQxD*wCFJJmNeJU&SpWr#lp;7FP}Sj#1SGJz-I|9pl)-A)LH^gQ`nFW;_5_LpP1CXn)0!Lf77~;#hMym;FsnzTjyviqA{w&ph6}Jmm+s%!n zUb9Ko3H3-5&(Og*38sYv4QC{-%c*LUL_flps_A#a_3%Y#HNENBsuz;Tm@dHP)NcIt zv3nUFa_iTxYbJ2e&YK$#ctYHkO|moYu*vV=OB{9aV^#7B?St!Qo2fyX3R40SM?OJ}DvzxWi> z_d8c^c9_)Ph&sa@@4(eT!(6_o8GV0rGV+_%GAHw_B#+%iLN&~=ndY3Ayo-ULMDMd~ zr_9oO&6iDeyj)IDbhT;6qANxH&vgBS1v#DZCNMrbw3oF}(f6ZcG9ExWYj9fgHBuWH|X!WbyE7v45Rluy>w~{^9^ePys~RbdE)Q7Zb3}hn=Xe? z(v*t1vW7AFT9Bo9ag3FE0Yk!E@YJ`Ud!4*0^p^fz%IW^cY19lnyS49})CvhxrCmsG zKZR{$6RUF#juvYq?Kb$LN=$It<(sOm8ODkAv&t`3oOCk7ME1^0AxbW{MNR2xsyiy3 z9lX&t=gujuG*F2IoVI(3Q3)Fo%)-p@JxVWsI+AeiyNBO+lLfA)_RsN{=<*~B9OJ{| z;cbbZ=gKJIFxCH|&sjn);4T%5?4U>8g!d)JcdBmyPl|Xc^1{L;{*=no0x{e2W`|TN zIY&x@e;OuB^2aeUC7V))^**q>nbN^q-A;MAe`5@TFiBk99* z?b!u;kyh10ok^oXe181foF`3wNySW!>NZLL__Lg+aMyssRF>yaH%9~+b86Vz5n>Je3pNgozCbPf5rd?SC-buxeb*q!gI6?4K{2xw)(I6M!B#Ul?K{1O*CVEd$zqU z#z{VhqVj9DgHcEPkxR}*dB-}K;3fDWBc1wLtSK$`U@^%lR+_a#X}Z{V9T!Af9$k0I z_Q3ThZac;FF0{#9!1}0)wM#jrnLZ{Ld-hQI>#37j{tKI&(mcE#iD{0qOm*Qhs4LS? zo~L9hoQc<+S>TIbAL;w5D1sNx%45bO+q%9W{-LuWnc)xxcMu89M#_cd>l12srbjaK z?5=1JRJx2$70y#<;wmuNWx+(pujw*e!!`Y!d z4Hr3f1BCTn+r*5V3g~H`O59xFjI6RF_TjmtX9jiDLJh~G^!q4P32%Bw9>rqVU}qEC zir2Y@4*Yom8==DH#hg}(9%jM~UscgQL+Ca)okZ1GY-C^wn~qY0Y=uuBm0D4fJ;`TQ zv^`*bHT`KlUgo2mY&AVTT&0yqlon^83m5}8myYN3jl+q#y`UAxiFKP%Snu{zrt%*V;Oo1Gh#{G3tcIWGEzB%(bI3W z=g1ohY-lK~z0QZt$T9gwr}KKzIkAkGpOE`l`mU)x)a=PNaj!TYHk6C1PJLOoscozD z9p#$yRWEbK!Vo(;_ssi0XnuZd;f{ z@%*S5wjRX{fM9Svu5FFNFD`qiL%?k0^FEBXm2}JY_Dv2q#^B-Og`HAAepn1|1RP?2 zccPnqQEj?OC-G^nXGm{px9ia|9%?eG;{+cqm}-&9Lo{tBVB9T^`1*zB40Atxa$({exi6i?en_Vq3H^Nth(p$=dD&r@!0P zj5Zn9ZjR`g;3?Jf-K;rRROPher|ADgJ!kyQ=}f^{op^E1XX>oP>@wOw=yQn;pG?Nk zk(;c8C`mjIe%D)Kiw|6Mt!Yiv;Bu+yIkh^jRxk@^>A7Y2xc4YISwcyFW=ld=LsHUo z6lq^&&^euNV!ij$uzy(B68_}sXi^aDwt07Y(h6!;p1S~swR!7ozjU%yFF!!VligD)TNiOuyGwN2`?wdDo zqOXMMRSx7J=+nmYRtJU6aU15u{iWOL*^<*5%KC3c;ufwqZ|CKfY{ zF0OM|x=XJbYH^H!N-V5LIYwNr&W8T8fH&zkK=d`HkSBK>b@fPFyXoV_@LB=` zhPPv;Jl{r2)X27lc^#*IO0LdDU|rl{O^@@_Czh%n^H(^T1NsH*sl3A(z38Qp{; zhL12!1w3Y__0@Pvre#Vb8KWZ`Eoy#mgGF+c*s6uV^ivL>LN zzS`r;oQ9`p%9E2K6*=74t5)J81rlti82GH+!qhEquOUCw;XnwQ6 z#-_fyzAC=qJqvhFOcTlcf0IJpRPVW;H6tZ3qt6F@H zYUZQOip5}F5|>ttbolwsasv**Fp&Sh-NGG4AF8C zYW!(XPLz$^jUWoY^@e280&4q{lX@$qU7MmWHBW?v7`8Ao6l)FIX})eD|EUM*wof<2 z78n)2azm{ZwoJ)N%#2mYUznKk4E3!jV-oij)k=2T38_zTcZb)WcT##$wdoZ>hEjc_ zbQPiMPK9KgmDQWV4YrN#(Csv|eB_a0YJr80E!LP+Ggd=B-lI&}Ifcu;F}{)}J^bj& zrvm0nPtc0E;?t*sn@2ljl_6P^2a+{u->#l>)a3UXOJ!ThSF>@reg7(VjAk969qqNJdYa&S-x2Z<*XKY_a}+b^Go(PR;gN zwZy4FDrUo%(cwBQ_3R=QPo)IXC3r~~>PnuqG&^h>i$FQ(?ewEjKYqzV9XBIAO#Ha_ zN$H5gRCj2leUNM~LHX9_&xnr$G~0l+%cmjsAGAt0k~dhNiO&sF81CANpLV^I^fo|% zF7hn(qevoBhZ@0>2-(?tD&w5@U3`1njy;v$)PQP$w?_bCW?{(@$T$sTa63K$GWM?7 z9Bx-GrOgS-*TQEiwkV}%%@T~&!VyLh;*xFieNw!O8a>|MjYbDWAyoAS@A;gTg z!PM=6_IMwke!uhZ4^(8~uywE&^G=I@9E@l^{fC`s5*h=z0t3chXXG$t$+nYm} z%>h#`>h>94Ny@*Gx9s*^BOnQ8hDI?bl z;n%y63ICud+0u%{BOMAK-7Y}k>v3PCbgL6^8mAdx#o|_V9R*2x`XE&lK%B%=R114B z4_>^1GK)V**+-pWMATmS23OBfAZsa!j`?rZtfB&vWnU6+nZpxn3w0@yAjZ9nUksQ8 zBn?OADS(ZQK$sM>dGSG(Jt$N@-Bd>h$l*dcA}~}?NYL4A==g!`!!JnkMM@YSpvx~2 z9*qii@+^YnSPP(?5c{kjbLgotlnx{i^NF9lX7Yn87^y1+0vIV_1m$LZ$G;##{_lY~ zk90nIWh&(uKD32I?mhU0b7TC{%s~#HpfW%cib#_^n7=*gLF)8?Mmeao#`GISMD3R= z0RJEf%J3ARSvCD`f=LBIHOLjwXiEfR2vVtAVG0#BQ~)gawU!zx1MHDH3TvV!v_@tX zmH@4(h{J^}&@tQh*TDnSc;BGJ`6ULw2_0Efb)NtY9KuD{K@CQKeH_vXnYk}J%!?72 z7hZn=sU~K^qa=S@K7mQE!lb|0RlBG*H6J~S09KGfIk+HkK~n=Avrzr2E=UHjiupvU zT5)gj;mS$^FQ|gWz3!!Dw*T7l9`fOTLssR>7Ox)(v@CkP<*+Lyv4ep-6gQj!Wm!>{ zIQWJZEWb=$^=fuR)GN(FK=>%&feo`0^|1!Z)2}qUz$kxF&3u|yXjvqN%Qf&&AllR2 z&Xaf9o)lV&88}mC!l}@o2aId*$tn( z`#K#^`{3hyLL`aQ>>s+^^cM~?9O&n=rHn-Rr-SS)e{iCIi=fT&Yeur=_8UD+wo}g( zL53*4KXG4i6NW&_zzxCu$nUy2n;a4KCQMcluL=dLkk%$xL=XpXSL$D6>2LmpQR+Gi zscleo%-zEVYO>S+F75&{95XUp0hG?`1b+#b;*+K)m>i*2kG;oUj^L zUmn#%DkQU?xQANin59qh_)7!%UvhuH;t~}GHFh5Gc6?<3+Tgse4c9?t_seVcfs0O4 z!tWlCKk3IXl_$p6QUfI#wM+W2MgAp{^#c+zK1P=Jx7@8Z0DeGWK~w(Q!l&)-)_&M{A}Py$MpnjFiR! zz7`MA*;@?I04G>#+cnss4*PGxbS45KW+>{7`&+h{QBz=v(r%ceo<=rYmRU0cJS*N< z24;Ax&SZU@SK-VZu1|i7z`Jlpy<%J#hhQ@wa06|BM?lD*3xqmOG%y&0)FX2g8I%|} z>Ss-!p*D(!z2}T?I#go{0;*Q=afNOz1pP>Ci%*(bBCLr?5@ws(=`g|7a{$g}h?K1m z7q<05eeHXxTO@#(!r5>Z>PpoC6%BPnz$oM~qCuQ*t*ayc;$+#vF4J*uOc;2Epne%T zdlx@Ib~wW7)(Kjc$eu+blKUVZd@XG`pyPLlAwgP!1Rk&Ryd##Q^{Qd;*-HfQi}mM) z%es#G^^@nR`Jh6cuW=L&11ck{GvYnd3J|NRH*97|ohzv7Si>u#)8F*o2n$Q$cwm1{mbucI1Fo3l@2?HZ`6e)z9 zj(TFqpkG{^66$xJT^rUpZ^RwIIS;@-{z3~_giZl(V^aj-}Eusmp+*0ck=@^=CTaAX3!Q+EAEA4MQOnuvrKkMsv^WjAF~2 zyOUx9(nyy>BaJi+DH75uB_iE|lmQ4LNQ>w^F7lMNex?Kov5FX3*LiY^V41&@acu%$2}Y$*@~RUxRM<;T4LB^SJ$Bz+Wm_5N4h z|GzN^rNbE7D!)?N=5#US=$6GpFo7#3nsOcXvY5uAJ@vXz?0Qwz~*ko;UXy9(p{ z_qP8f<$tJL*2zSl$1tEh&?#Y5Qfu7HtC8QelkMHel)~pn8`2AAX zOCDpG*BnL25rgnOc8^usy$21sbjv9V4B?c`gj{icmts359i#+H=~5=x?{KGJK7jPf zQj-du6oD&9ctrl;<6m$K96Lf-oOg788}UbQ)0v%7`%cU$SX|U&(Y#BvOtLR5cU?8_ zyEvY>1!BtsX1v&^;+IsLVanSZ=kCLhrBiFRm3ajX6n>n92{9w~_F9py5*e9=%V$v- z@)fUfW4H(Y4>17)5FB=DT(TCAfR{uR)s@8nIRIRO0(Wx1=lB-~NJ-%)IVxB9?;Kyn z07FywN?8^Xt7Q9CV+CAD4JF|Leb6Gf8}8c;5Aqsv55C|PrWR5$>wv58NZf_x1;NMW z>0i=Og(rmk&lw6w;41aKEB7z{YcH?e!3a8Se+!HlWec3*6VXxVfVIph zz!pm2n+RLOWh6U1bYwi^3>^sVX~K zM)7OO9l$E_KYU!QFx-&WQI`!nIwvl*G_*uK85KJ~E^SL869IOM@@Tk^hWdNq*s;HV z3H3jn`VYtP_l(oYG#z6hq*X*_r+%U|`B@pL_*s{QSR(=g?)I78)+xVnuRV+a!2kLQv-spk=#pIEINLJwA^J@R)zWZbbp78yzk7iiRt4HwMDhidupB#1q{HhE z6@bu5y4)VeD(<##IW`avzE_;QrA9^t4uKN>!yqh5ydNo}grs z&)wXRkqb$3Xu}doy=EmKA`4CT=dC;|g>8>YAfRFz{dtB(u(+*%gqnbo=j!nwjK?o6 z&liN0sCOIctJ73Wc-OKr1~&HTKlyHykEOm69UN@-7wA`6?u4jh6rX$aLx+)o2-odY z-rdL|JoL>?4kLP~T*h+D|2`25I&Qwtm{0atwkBhrt`~hfrokw>OEF0jPe#ZRBL=V9 zka!)iK_!Jvh`!AEH|dxe`}t@BHum$rd32PI9~;6L9Dbd!{lxirAS{VH|0~O5IEB|4 z-xhX8{akPgJn;ygn5jP#NXqhffae&U{w?;$6FfLmEj@O)9o_H4dd%MjJ}EkNRnPG} z6>4%P&K1{@1Qsws z9zGKi_2gqR?DtMPd6`o(If$JMJ0o)Nm=+yhM)g$pzCbQfZ zYO?oro{BsQguzoH!lj;fPKDJP`qG;)aSb_{Yb(e%v>XdL#4 zqF}_g9piC6vWw@csd6ZMKL*j5mb|V-c9?v$NeOit71P%TXtrE2BVJkp7`yg}Mc*@9z)+(%zamO~vSu%f^m85&jZ(_);4N9$8E$5UCy(I?4N4fLbY0hXMtIVSyzS$6 z!eV1P7Qq*i^yh;A>n~6h-LCZSa#|K>XFzoBBuJAcD6%IL{<<&l_t+;()r6DDVcPmn zSRrOnrv~QG5c<4=2IQo*^Z-J8u{^vW-TQ!_1d)O?Na5r>Ta^|3&Af5Od6PZH4PMZ- zc7uf;nd3Mz$6d;uL>VxD67h1^R4IdwQ*3SD-jaVt92$)r{GalQpce*Sl+woklApl( zEK}H%)&q41WPs&}KKx+)&KC?qr13ObIq6>=MkW_RAI*f3fpy|R6qCj1{>~Fn%xj_d z93BvQ)5G^a9rWo^f{2W`9}hT9%TDN#fTVc0>c;p8S|Z^4deMxX|MmOUgx<*ehYos2 z|LgZ}5wsxhPl~3;AbRqDykCsa2zkHzfeP<`{k|ietX67aN+_4H-jOjC;Is&^3Fk!EoOm1xq8 ztu!FgQHC!Re+|#cM27qjmh6jV8{=PC`h#6oA)XWd4R6B;b`Vbg`3!Wz?}An!2_=s%jPT+dhr@CB z{Ix7ZKZ=ZycOJ+{agYnBW!(Xp742|`?jwuRh5T?DnbiR(&-!fWNLBzL2`vbnL^RY8 z@gwUo@WZl&_a4r`2#>taA6XVt_=UM}BoZ9+?*xNIvA26XgOPggFxPTpvIO8`#U7!L z46taA_27FZ^`z#cAPOEzh7YWilwF7jjP956TIwq7gD2R$DhHI-WznabdZ#2@(66m zvVa$*I^L>)NRhHD4W#C%bARh!ZG7>cObMCJ9{APy_?ORXG(eMN!ecKGAd!xU@}Cux z`d4vtLqR6YqGa*YFhQsH7w(++zpTF$R_^gS)zMmSK)mZ>f)x8-GyYBo6Eytu8ukCo z(*E)zl=!n}Ue(1GnQW0{yyJIz(|vb)+%&DCWxxB<%a0E&p@U@4=ZKH`l&Ja-PKfdx zBSgWpvB?xxhwyiO%CFDxFYuV8Ae|Gv{~qqT+8JBtC#qDKH21_RFzYYwz4kxRyV)=4 z==@S0MHkQx~Oa$4mR~!5ZT}e`b zp1bP_gFtI3^wF_Q)V(b*T&ON`>vB!P2iW;keH(SY7vU&gH2LKX4oo&&>>tCyfj%(N zM&$=Tj+AK|iP4gugQJ^8c>9s@kw1eIeyfu;CBNVf{KK)Iz)bP-mzwzYh^WUO;ImGJ zk-oBo5mjhrrd+ccYl8kALgS`>KB|#)m%j_yPgYmHT{gP&TY7iOrlicqpw>?Rn%BTYX| z!)hw`{cnZW`gfs8;8(eAN|ah1s|ouLxWw2KI994(l?qKEg%-(d6liUp-Z2YLoumpA z^?+*tG=@m~GR?(0iH|*taeF$D@*iD5iFS)xk=26^rQw2I)I% zMiQqfQNJ|UD2{CWK0Bx`CfM8>3|}#l`+P+xYO`iIP0&n=?62Lo-C4g1ea~Eq+$Czj7qNPK+w{<2Wba9u$3 z$!0b*Nvpi&(WHsM1q9t)7j^{$!#m>}X;Bj1?iiv{AU)D2^I3m$+CDS54qB605zxXC+BVmRtNcQ=zqm*P=ek`bc4_SqLltSBT57uQI!p`jR-84Ae>AH5Tw4zOke`>+kI8S50`XzfWSV#s$XKN zytfFqfB(^b`LuV1T1R!4VdEn{Yk@uJQD;VHfXx>5$hk1GH{Rwm=YM)q8#)x(S?=q` z=&_?}VxK?xVc7WKnYdA-wP|xkSKvWCh_k-S>D)hl6l@UtgmTdb@uMHSn5W8%ve3CLnrF*sb_FJPZ+Op*_Kr^h=tvDg?2&=!~sTlx2xpCHMV-W!JliGetxj?+20bV zxv7;3>e4u4K_R{sGuY~qzeKR@nNoEQauNSl)+6zDK{#cU6z=5NbjDtXzeMk;uY-cdbMdvZ{zznO=#k#wWm%cJiv!F4#xgT0?A zXQ@#UqPmTZ?hAMJdY4No9O$#xKvD&6n=R{j%q%+^B`E7SqpRKDqYhZUXMLm(B$~en~jNC?=FT z*dK8YIs_~LtJ?FyOmq#ta_fWDvy?z`(JrxHU*a)0ai^8E^Pxo;zjG&})qNZ)pNb3@ z;(fS1E<8C3|Go>?RQ-~H?PnB8Y_AZFH&CpWXkyLej&j4J$vr;Cjyg_kGOYNzgNn@U zl=|oRr?AVyj&fUj0%1yAA?kZ*&G0VtBD*JXur7NuU)lB&or(MW_Y~V`<-3>QgzC-# z1PkjzCF_3jaNN%7RGMXP>er^)%CkplHuI5YJ_MKjg{|!;8cAZ`L}rf7=SEAs_-$?E z@iozM?zMmBSnGuR7iv*ugD?rV?{^$m0_Kn6u7*B%hVG38Xfy;U(P zb~~_OxJyq=9T^AL-<#e++}LYQ$SaeY{4YNMn`>81*w|pp%20=-<5pw23_D7KJ1C@o zrp*n}qj!)Ka=d@mn3M#0a+5c2^V8RGBimuOLc@I$0s5w!YdlPz_nH0rnzWmGR;JB% z_nsJ{3Uc5msXO|6-vd~sY5AJQu?H^xn9l&f=*biDp(@9Ol^ks3`W&GOl5fxPLjG15 z)%Lv!9Nk8%T!Ge6v$h4~JSR=I>Mx|zUwWg9m7wRwsqFdiT>i5lt;d0&ZsejTxnILr;b=m=P!msKGz4f1`V{@o&D*hq&VZ6awwHAPc^#u3RDmKXK7TR5t{sp~2#R zRXe(ciWF^9e$4D4*8f+?rSd6ewi)$D8ZOa`aI$2-zffz%94l%P&91RpME*f4<{> zmi*`NcN&tgxh#+HI+HoF%#p&Eu4cBXS;0D_yOM<<`3%kcgn=aO@dxLAaU3BDF@Xe3d~Zp}&Mg8Q7Vo3GXOM{(5@XTk5YnrJGXdJQ z9LSO`upTbhslr??P)RY165qMw42{Dk&9AoXnT^$)-{JTx{rUl@+1v9$9zQ7E;WHJ; z8CMvC28u$1P8=!iz%lNF-HD_vHpdU5&}1pzad zg!`9EDyo^Uflwv=TR2InwF?r!^ zhaHz%I@ZRQq+z1MsqjmO`%qInE*zMI1PZwW{*-Lc}` zRwHOK?RHW3N_O@pv?)ukhn{`Q!Pi{y5)%YRc~T-b|GieiDtO;w(@%&nJ)SFNNt7gF(b7;;2`#j5KSqeLgq0OT$}T|#G#@PIbz}?=K}~Vr9)6~e>0GLS+3TMlVA8GPT0gj>Dx(bv3i8%GppLr z%N#m#>U>(bdyH`TEQ6>^(T(|_vx3}^k6S-Au;IN1p<)xV*s0GerB!N}C-((6{;6G9 zDA^E_r<71;Pafwyq!@uyZCyvp@lO<<07}@JF@yI_Al@7H8fUh^^NB8csKF!=ZK3HF zZd!RMS~^*4Ps%`)7XUGp)*+8tiIQl{=6>U&Mz>WI4eN*Ud4{6})8Y0%B4n7&;OHTePPQIVq7V2EJx}G&~4RnyK|xc z1MC~K@!L)CUvrv!Ey{(IOZpuO87kh0^P*(;zu>#~#{18&MS-V^nu%Oaz$uZ+DjTA+ zU;DA5o2az16GdAFU8!>F>h)2?r7yZKE?530Uw}HUyp9#nW%k7oYmVoiBKT6(C4RMkgbHrq^$7|Ub6Wga z@V-3$k7j+wF}$CCztuc_kB*R<>-qN=?^B_`8Asd^?MuRJ%?DpT^5Y1RhyvWdVw+I0 z6;^tVfZ{kMKW_2rgXC)yq3VE`cEgUh0NhO?7e7R(D(Kh95Ue@l{u#&TG=i_6R?MrnB}}8kTa}#~kxzuwu}G$Z~z|%{M=@B34iw|5HQh=H!<=xvR9$&9VT&jCALWB#w z;9ED>?R*^hEi{!oR2!5i>xWooSL@N@#Bbm{km8NG{vG%OowNR+N8OiTFkJ711!Zzm zGp{ehE=gW0=;-K=GQAtYr5~ZH>`CC&Rw-1=Sk72PLQFH^jPGyzsxbrG6hPbFxk+)# z6J*EIc>F*DI}5Zv#3lQSni$Qt_~1}yp=5vbQL6_aw~MM$u}js%O*wLMzfs~p0c7RJ)>C;Y%7aLlT z$NdPQ0qB+N)uCS4HoHO;8mzh~Mck`aAG{Z7eL@p_wVPNBn4&G;Uw(-`%ca5(M_A2s zYUHsT5zo>Pd^0Q>rYZ5XJZYra>rvHf0@7rK3qB*R+LaWr@xg!G{*d4Iz%pX%=Q zZ99ez6!izOBZkt1Kt4nECz%c*Zl%`RPo-++Vp5<-XV%*B1{6P@WI)^}3o{b`uQ!-iSyF zoilc`EzRF1Ds$_h)HCCamSNGjLXg^k1l^nawd<{dyC14-0EZ`zdMAK(#m3)E~b zuj&(B0BA%QRXGJ*itjD7mft6KxdX7%JA&8FDB_c8BNn+!h-lUj1a)PrB~RkB+-hhf z!_M$)hM>~uaAimLhW}u$0+SG0s8_wejIf>2D*YY@dgOC?m^B26gp5za_0CoRC{Qp( zB{tuS@N#PTwZK%hHFPTtaGHs9mm#GNTIx+*M2ob}A@9nAY$cA(wEj0U^hCD&K2d4e zmwqF$k@r!66ft1{UJQKwD`?wkyqu8d!+eT@+3r#Km}daQ^fcfRoAL&b#S)+Yv^YMA z0(TbS*Tm5U_`xwg%lyRKHU|MDUm)>1CioKZqZ-7p8p;}KJIt32Yte_lcSR5);};=L zkBGh~-G$^ALpBHKSaGKN-lF7R>jKp@OQghx+|X!BYOEo5^tR#U{-Jk3F&$I;X%~>O zU<&Si=ImG=Uk7qzu_fT=_wF>@83Mm%<+;6V0onPmgOrZd&((PKlKol<^)=w%$Bmx>YI z7C#WOGDi8;6bT0qQPr;xEbSQCAiq{Sg6L)Knw^`Q8w)eq)ASO)8f$L)7&JJ1W@JxP^}r z_0{~=yQ9E^;JTV0X`4T|jvHGc6%teJLxB76OU>_Ht00?eT}sjAC5zD5`Gs{VY+o;UHkJt?@Qnc{=h?ud1X5_-8SL(7nwgwgWJZB$H+d))Z zfHN!nKqdNQTIYL=EV)3cxi7#-sc@6J%;;tQM+V{p$Zn8~bOBnZRpr|CrV3s2`d%4o z?9BSJvXz7{nf$!y#L1ZrS4a{BWi~)#j~v|x-`}fc{pRSBi;-G+c<|%{FWkr=;}wd& zi$Hb$Y+z*(go}F?Hr4o8x6e3{R0s{T4{Vu))te_HQu8sfJL(e}|nL!Vd^0E0EKs&sQ#PHJ=U28EstyCctaMRV|QMr9rVct$2r=fuF_vWqWw}xMGGJ z7amRU{!-PG8*`6OeE-9kpGfm}6m&I3iwzkEg4I*MG1*DG_`UFtbw)@5!>{z}&Mza{ z>NPns!!`kV(|w~X&A>w*CP5?hU`zM65w@xe!fp@rI_I;5bg$+qM9w74e9~f?qr}Y) z#|~OOwB+Gdym;Xtxt0eJ;qL@2_qtSF(xO^NV#L6IHmaSXKo&QW+Rb8655X<9{Nu~6 z;$Lk zfA?3eGI{<2ZqesA{rCu|q0&O&DT%$g6OF^37C-Jx7{gx5Pc{*l@bQ0Y7S+KJ@xKR~ z2rT_l8|MbBQaSG*%*zO=2nAb0;#3=3%f73IplDNXYtK}(=xb-Ag`(ha2tN*Rs9&NWH(*8^4EZs&27d*ioUkf+GT<~O#Bd6HToyn0xK{W2Ov7xG(OU-q5TfMQe%=6sc#mYE zwIpv6n4Ya@m(|W986co{wZHEnm6YL`h*Vm+?u{C1$L8&)(-mJJ+zUYTj;yQbh1bhobk%~cfp3&7qqkIe-k>=Y7sc5m-N z2Kv1^71_OY5WDWZw=O!4|9HcBAsLXFqP_nEd7B43`?FFfV-u{m3k6qY& zNP81_nn|8X3p*?mCl|+N$$K7r$O3TISFh1B>*92XDKE3#Hdl{qPeWUq^>3OU5FX(? zsO&D2U=I7zLaN8FMK%gsC$9i}dmHUgGkV*NY>+)#%#7x^((fB}spt;Hev=qL(#^+{ z2%q_Q8bc`Qfwti`4h`S93VSiw>#NL95IM(4f}H=98ujBbFLzQDJ;mFA2+&@E(Xv0& znEwTmGsw?MGZ?ONG=oB>K+1Ac`*xbJeGfD}H-~_jbYo#N4P11;_rcG%mAdyJl)MY8 zG9w-33P(xD-6h+p;mIq7cAAxasAI%WAwizNYD?ch3PNC&39e#i^v^){O|7SD?J@kf z_^o#z&c?N@aIT}Ni>OdZ0P$F?-DN`j5&`%nlE+`&Z?E!Zf1_OHRJ(|ucZYW}3F!n@ zgGElA>O&Qm+v1-J7c_EoOZC+)!~osjNLPV33! z0-sd?i`)#JU3Cjx6@%2gbT59%Ssbhl4t^lk))f!=rn*LyRoV^bfO(ZM<|(Xf!W8;9MoFSnup8 zxck%1srkSeYsknRY-9#tkyM!3TV|7 z!48)nV4HWyMi3hA%@mP$R590ea?y$rbos%%nw3SHB%(-ZdrH6e1clh$@q72l*E<;r zCfBvJ3rsw}aa!5gbWsLjWL>VG23Pc&9qNPV^u)Fi@D_b`l^t{oZ%$u8-(0QMjxzcx zUK-LfQE7fnWN_<=bl@oqiO^ZX!O8%0zOw2#d%}~?JXE7z3%>2-Q}>8;(FAQAL0t8d5U%1-_*%u+t36hoI5VhN9tylL~G!e&EHX9Q1kAs zf#cacU{&t#Nfuz=>ndRsT6qut{26XT#-;s<)lVOS_&wfEJu?b4RqG@;j@@1PhwPPzZsc5$R zSUigm*Eviyv;Cyjw_Yc9IcLACNGW9ZGpC5s{gS1!o{@ih{jEEMd&& z!obe#1rzR?stqt3$J>VXHD`F`Uk=W*_yPfT=+a*4J6BYb+8dBB<=l1dUf=Aw zW-rGtpF6B`-IQ9Ujb1&!N6mg>3o^|QH}d8^^2%>(OSYu4t#{CyPRxkg=ZrMC+WuD8 zKAEE=iB2VWBleYtQ6dQpJ~!RvydizGk5J1;f^dYv_8mqa& zc~;eCi*@-L)p70B6iQwzJgsS%5^rT9979t+^Z7%~#d!3r7ArxZ-}#$vXmG7Hejn#o zwiRMl?rAYJKsFjw<+W`hyEw1rZ<{LRE;XE7xH z&NFK3JRK3yDy46az}pf3lFmuVzrXrbuGYC7d$l{`wQ~4$w7#p7VtM`oz{&P5qLv1i z7O>0lo^JxTAmWYK-sCy3|NH0gT7cXu!xp(~TFubaiK4MGpH9Ixbh9%~uIf(<1R|>{ zo8o7vR_Z%f3bQKz046i>>SmHXZjx@I{IgYt>+K9H!PJ*p&(cPG>qozMRY5Qux^hSB zvk*S-v{Ccs@;lAEP&*|uweS-{YTT-+&|g$To_qpO=w8UotwKv(A>a0Mgp)p^xfh;c z8vqx?d8QkwKJ)uikF(33Nx<%d+S_}(lO3K^@|*LdY$GKJbXID%+4_VO4D*Z10WzCx zLgy|^XRDTN1zx&^&RYstNNPIfej)j~Jz zzVG0I_xxHqhdpWkhjE>Y+n$baSqQ^^^~KStg|#FAIyd3+>U&J69-$Jh~?!)hS!pOlSU28)l`Tv7vkJ<_4bUz zNoyKG&#pQzW;_zM@qA8xF?}$!^EV_^4u5|gtrwR=j-*7j?3eB0W%6v){Gyq~zjHYPW+b;)U9~2JQzWzRy#!4>Zhqf- zjwU6$A;V?{)mtsSe)F&SJo0O*c+sV-z$d;{&cQ8Yrk`8AaQnQ(|GjC;E3`pH6jG-pXqD_a`A4Tn*dl@K6g91#j`VT zzHu%OHKq0KOK!MXkMTO^wz_3g>Li&I33 zF@;(cP}}AVV&w0=>Qbkc`7mY{wAujmvR#F#)0u3ln6SUD;QSX7wABO*=E4T{E|>;& z{=KuerH0D~XqVyeN)gp}gMC;hyEYZ}4P+;ES3WN&Z_MX*v4-P#%NT)k@gQh z@*JY*uNBE&r!5kH>uP@!T9MDlim+KQl)<)t7a&tD4!xQFf|x8r5^|jvB_b8Jz%!2wC~A$9wwGj$$M=h;R)6f4X|?Z74N&LzX6RQ-FTyIUoe%zNQMVsy2Bs z848mX9INc8U(Xc<)t?X7j5QQX8)LPIOv|i#AIY&BwG^n}k5|-&Va^z-lBkyQ?k^K< zL-Av_lNu5)^oT$GAu*ZIbEN;4)9v3Tn;hHge81Sx)mQ_+CF!8Zkf4yVJF9-noZ4Gl zdRoHsg<*Gs?F=|(S8mNijUbOrcvFcKV;=w>6=XMq!NyP_gI)gyx+G-iP@g~jn6K$V zFhwo5J-ZCMHARB&-@KrZ0uR1qe~chn^oNa>6XQvW4f|N%WNsOD750$bU?Q?@?~>DE zsWitweRS@x3H5<)b4@=(5X_dAT-tbp3MFkqZ$cY&dxbaW0TG;A(sAx$4W+qnHZWl> zm&;;@v%LM7P~6I(oq;0=BlStL;!RZ{v#4q$OTD_(aaFYV4s2&UoSmS)tmA^|#rXm7 zy()?OXuBL4M^|5LWw0_w6U_f?V2%h!eO~L!SDS;7!y>AMyQ^Q@!_V61VSZt9$#C+{ z$}(6iNtWeR9(2`;wxbZIp&x}oNh3fUG~X)kUzNqS_q?Larpg$;ket);NSf!3OmK*& zH?5{QKz5i-ff~wEi}z100SgeBY>;?%T36ED;97R)OPPVvbmQHY<@X2x^na^qbSH+(iedrfN? zHXyzynOC0+mK^c^A`{=zzV&rrz|5&kTQlh5s1j}ocD$#sEN}qq{X4et0laU*_IFwsGk4|w z%bb*=Qg1C*i44G-Gt|pYDPOm4P@?>6{C3+sX*E=JrLbN9@74+YE8-8uica-or@q~Y zlo)Ra&D0jJQ1;9eve4M{**<6Eqh5P>%5H(=0HEb#Uy>cOzvZS{8j$@~UvjkRPT);B zUs98$H>(co^z3koxV7C@$Mm>1>K3wBpSal69wcn7GhxoDx}v$I;@V?f`EcMKx2cHm z>UHAmY~iQAd?WZ3&!L8CsMeDaWXVdjYD998Of}V?0mr!L{sk+&Umrb*>Q7Q`=!15bw>urv*t$51 z9l6p{pZV44##i^~0iM&N8;SVN)P;gqfJvn=&u>ik;^MY9Wgei?k#_8>EbK8!L*7D-g#9 z@^IoZc|8r#w4b#qprOX9A9crv1G@C9i+o6;{`sn5e@v#W>ld9{ zB&Z^krp^eDj}`v2Vg@GlY6UsHs{=OmzB#M}L-t07-c2d55+1>VpkU1VK;GH?sD!MM zU8|L`GA1-^hA~CAr!lNNs;VqXs=uZ5=Zp-y<%KVN=<3QRsLlC2ve}XAqy-jBMiMfz z;Af%xUpDl#4IkWs$ z2*NJT32Pecoe)Ff`A&#~sb^L9hFRfYXciUYmBz~5{rUH`*Xj!_tw&hP^JZ>_mu6X+ zXyXDfPEHiTh6y|xLt$Y#PK3^;fnpa6ofrGwDEvm6S52LN_f-$KCHH=`=qX(-p9PcB zFi!+J&<)R?FYh`2$$5 zaa)HFgR8Qnr%e~3k{RzMo?HTL*^%WN5nQV==jiTIXBGcG#bkH4kW?`%D85}|@57mA ze7jyjn0n&3dM&~&!`02mK9HM4yWWc_&TlVmmIktG*>Cv;?nlMH)>}+75&BfJ_I&QQ zvY+X4(7UHw=X2N6?y6^CnS~yXR>ohZa=pluco2=x$eFeG>0cI+CeX|fTTa(b_H)IC zv`v&uQ{uYtjn*V(law|$@wt}`wY)IH?p66(IcgSs{rToL>{vk6ZZ5?6{F)3H=t|Pb z`~`V}4<7%f;#BQS$pfZ8xx?iXlZuMsCG!c<0|V%D+lr@^C<+R^gW~_J2cF7`TB))l z(yC4}qNqjP8O)opT|I~TA%8^&TU1$iA=xQ{giJhne!cF^NY)%mC}?zm)H79xAPeIN zXCVSFdAw3iwzg44TQ_Lb;_U~$fBBBlWIR8nk*hy^612hlkm$6Mxcr9p9Vu(HoNF`} z?#~jlSu9a)tNU40ObNMEB}@)= ztb15fU2b9m&N7M={(AvF6@QhttyyJcW&1qU+WgELUJ>fY=tv%(CyX6(5xarj;te8Jpcl zuP;>mxA3khy6pt2=V6Hv-cUPixvN{RYV^yQJtE9q3OV!YOJ-jHL+STpa*$fO#z zO#lFD-)=qg{1Q03((^`a7Q1z0FA8T8cRM>4mn(p!u|90mR^Iwre6o2y zkBW>qgN3)$Zh&P(;E?Kc^VoiANF1H3`~@eWocmVpeZC)MWPj+by};-Pmf>imnp1<#XHxK`t(@vrz?9SD_jndYg+=ITtgn=4|ojoAB9K0UNOC$g!y z^e4PrRZiu;Ursplh~y$cVnM6YeMLJ$C283gLaQTJ2Dfxv%`krI0k$c;dOhV9&FgpbaSCc_O#jcapFQl+n;kf!!QDtzdvFOSE}(jU!uxIX+=MJE|D411Q#=ZDeh&trPH&|6~oB>p?kD6d@Gmq;5J@T4qj z?n)eS&X@O_pYii~bK2H2V5M4E;S-x8N`JVDAyl1|3bo8g#x~JKx80(2T|S=fg+lb{ zPdr^|s#t95V^LzGTL4*##Z5EgmX_CeCmG&n-V|3DJzhXgsydwTm`DMu-KI-+hxoBK zeaj0Bdy18;E#asDo?JmS4M54Qo7rmyhZt+|g30SR&N1wL?mQ|C$peLKKKPjtCjuH8-tAN-l;&@ck_`$^P)~ReIWk+ zJ-TIG9J8LR0=tbgtSZMcP5%3upaG{|_7AIrvsoz0Z0 z+^*ebB<(g7gFaNze%n@c!n>RvvV%2FPBaJk$lUm=yAma+kY%NDvC+-~wUZ26cliWk z3e3MMr&`jGi!;0&2*Z%Zo!=ki9VcMxW$LYo4*4V1N*d-YVEw&r><%^qbKQbTKIVCN zdE}tX>Us@8wwF84gxVDx#38oHgz7c_hYO&IjwUi(l)rW5nDb~EA_Gp>a-|*~ zqn8EUaVYLAwOfao*0C)+XGpkJ!tNRj-Cpr4x+js9M$8R8VEBwj;ej>_{64%x8PmIx*r zIpvh9MXNgayx;*T*>*sY-i>sc6uHQm_leb~L(N_)#24r&xhJN+NUT`W8jSHlMcuB> za~evjO(x`p%IKtZssX*)2TVunV%ys1b?X)xSxKWeEtmbt3 zZ|gCZ<}$L*eYDmWn+Bg17~p@F@k-23M+d7676$N8f^aVP>GmsL$6rC&^Xg4#9BT3% z7`RL(`|gd%&P-7HPTX$(3%4RxbN=3)rMMgsbtS#8mO-pRGORlyY60#^a9GlguyiYk z8+a}--FmQxHqB-=9C6x%gAUg$zZ#rjHf|~>&GG7DK?^c?oIP=TH6xo0<19ZBK2K*t zmtDiS-_lFxBcK-?0kM+MBkJmXowliHVeXhd)iO1}jHV|#=)7v`tI1b>eoUMk*Xd`DT}d0z$Tev0 z_@IT(E7}O!9UKU7*;cf@gHEr0EZCsN;@vW`8}U8CeuSgR>ygCn069L@pdh5)^HBmi zujG{NKwyFSn-+S{3wd_h2{g2P6Bfq5;wVuK6$?1!m=JAQTPu#4t(RGNE0{LKmi5D~ zSoSuq54-cYglXoqj0OHDUh=>@ z=Zum@*9Duqw*Cg!n`U9-R-0R*3005cBICv}TRT|B(AY{g+(l-8Fybvz6KC4`bH(-Q zhge%_@4Jzh${bT)vz*r_23;>1*ye<(nNeN(bak{4m9Kp_(21m?87L}}BcHWb$|*i4 zZ7ip{@PH)Fn`73dI4f>p$Hr5^S+?RR=PYPxZ5^SeVI-M05IvKQ%1 zsP*7Xjx~E0xq6&a#3o z`^oNM*hcXRUzo)#a^L#GBdQt05it^3p*qm2WF|xAw%VJ8DR+y}l{IqCq_w}bdztea zh0%)P$Y%yMo2=ponYMj-s50uCvLR? z@k?UkcCmO4@|wG1Mo%wuy!ZRSc3H{$%QXXz`K+rrry>6ODBCY;WM09Mqdb8!Y_^}v zUKd~w0|hs>@q|^~XSi2Ya}~KG-c~GX&$|S6Y(*I5$}dT4T_0SZRo1DK+vOW{UA~;S zKG58zl*Vd#wrO5WsYwCLAuayOtC(H+lg?~p>JMe)iVP)JRxc;5fpHbj5CEdsU$tzS&B4WsGBG39lXwPfYiZEyXt`o} z_lvjI+LSZ{IKo;5zFJh#)k95ywnobnDA_8|xXKJiw#sm(zKZFmHZ_oBooAUnr9@^H zoT-bZ!5Mu^pTNe86O+nE#vIe~aVBQo-r{@OB>Y{AL|s5Tx(Va+#qk#=vIB1D4bScD z=}TpqTwy%^wCVq!+e@nB>&9Ak?%$Zt?$L1<UVI*J}>yOD8p!!R$-~A_wYaBChHGr zeG}psyN13f^pFKe&9EB9cyiVjw_H z=m#g7rdfJ011*oy3>jgsz?A&R&AZXDT-jf{r}z6(QIc9@R$$(*r>SifnDn@vxq-fl zdM$KA+=h~((iYZJt!}WwIhCyzwniqOzob6?fLo}$raoaupGf`Yd$$V$gCl}MK}@%( z1($=zT}t8n%m))sAz#i*UoVU*fPpz(%?ayw{$UJ-4 zyqq$IO>Pfu{jgjg&E6WD4Q1g}uZPbsae2)21?C6W~4eP(LvqY{@a_m=V|HmQp zVQYj&ekj5gL|%I?iEIfkAGH`Y5y>Duv#W+spqR}$Wpog`3f?~__P9Mqex4?w(85-6 zX9}J0iV;6qr)9(ecXlqbt#Pi`3bT#W+gNn837P!mkGitPUrSy}GPs6+X0GoZI7G{< z=H51_F5soK8HkKbwl2CRs(MjRfBv)0^L{wUq=p+7N3*f_we<9k@c0)zc(33eNwf^tk;~o3k z{;i?^6_S4AORNUGKjc;X0dxKb@f* z_jvK^7rWwg40bAebotEt7RHDc`hz-hmg5ZUc=-skC;hj6(daXWvr<~PGX znR1@yz1?jW8JIx%2`LS@$`|njK6&~_Ka_YQKTC71KdVQa4*!6m=iAaYXWAf^X)4A7%}GI z@dzdxvn;ob@$ZD9)uH*cA3#!CX)|7x-;+UT$|fMvrbw3}S{1FMX*F)zc7N2wJ+j)! znNMouMW9$F!OK1N0aVCaUx%!M%ccBvv*?dOVK8xZTv$HRZX>)J#G)2c#$ud28>J2t zHP!2mbw7f2^(oS0ZTGdWfvON8GEM&8L!4^B6o_=I)aUoE=5X*F&)3N%zz&T9xAu5@ z-rEUid)slmW_DJfDj4hcav?G&7QuiS_LBQ5XB2~nsg3H=d+noE%q#LCqN`cn4@FXP zS6m>)koz6l5-I3!>0z>dc<;XH$ndXAI)@e?u|j0Kz?US7@GO3AfCX%FZ}v`-z{ks( zq*XUBHn#qdWNRL3I01=N63D}P5GaYoxW0!B5_oM;U~&4l!Bx zs@!f3ejNa9md(DvF6iwFf?*sG>hnBXLL7>YO}lyxb>9gKUslV9&s7t#q=;;1-fCl& z!9x|qjTqj1mD6UUPLzKG4bT3T_Tb}E8%vuzxRF&}Nrx~$+(oM9!G)r(&_J56Tt^8^ z%FN;ss$-D6u?WAO<*^#pTnT+G+3g?vuJr}=SWli-=GQ6r8Ixzs45ruYMv7h^S+0Ys zLoBX1WSG0*OITO-E|gxj!=_kr*2UHSV&g^zUjDFw%r>9Tc}-siy86+Vz(m*AcgWuk zikiHS(gGsIs;LPF32&cms~~3AB!K07pL(;@`)2JPg=&R9iyJ6_oJNGI#M{AF&;vV) zce~F-8PBaIV7p5Yjd)C34+O6NJy|JkI}-coGJ4FD{Q2g4D(n$JU&gfjkx;E){!wuc z?n|+&I-7Mlul~mPoSnF5UVcMmXhHHA_T6LH4-55*)viI|m5Gbs(Q6wJxC%mX*7D0O zTgEt$bn@wF43&a#xH9~$FwN74EG{dCTJyyq6RP2UfjJXeP=rp0`YgUOl;w76q~5GZ z?=c^{C+7n~^FK|2&k!AyHlnI)yhki^{3vrKllaD8CXa{o<+7O+wn;cEAU&;3rC#+Q zd`W9!`|R%Z6S&hwkl)vYCk$WU7s*dA#&)jM+BF6PkE-!D&HB9q^&?#Mb#XG!Dxzs7224*Zvn6bV{8aHi+(7U{-2mAg@@ph7n zV$)9_N=C8^C`ksERt=~sb_Dp`D(=_ZJfXEKBC#m!v@4ql-P_`{io7M@oo6hsaHNZP zZOSVo4wp06)+bHWe$d7aRGuRKx$f$YP=jdzJ1EKvDccwXkPWd#fn}f}#WKM#Mg}XR;uxDaVElA^j4t;VJfyh!m@ljEYe3DL0pV#9NPE z+XbV$FbMSDPF-#?Yw>ZWSbKI2mvG4>(C=Jl2&T%;Xq|c&n^!^(eYrg=%4f`J)-FJb z>zeI*(FRlILm6L~b-+jF92NB0c#}H(x^$4J;@W9QE=T zb_#WXFc`zm<^iQC4_gd zRe4^OH(Ze&Gz_I>2-|Ks}J+?pz>U!x&@*6uR!}fw=ePU!_fKJh zp-x16bMAsdY%hO6uxCADV<9x$tQEca91X)I7?-G&L^H1sp#(6v@^U6FYi8b+?ga6s zW8IkNCJF6sjEJY~nh-hHI;gI`%@1=1j!bbDRo<+Xr?tKf-s8ND;Za=WnjKJ;r+}*1 zKrSQS0H3kw$cDpVL#QPG=^d%xfh%C1s_A|souk=#Ufv`$E**x*e0bjBf1GdE_6w{{ z?MQ|+uf)HT?PD5#?H=TNw^OZnvoB*?c5)JwVL9dXTi_izDu|JM4PC|&len-^8Q+8S zWi>y8p_xR?95Ekzm{yqE*x%}-U11diOjOfnhx{ruuosan`5>dU3qiiImqn5n9xSCu zmIU>z264o{d!Ca^c=`HJp0#o26(g#&&O0flnWKmW=IdMO350_)LM?h9tPG`|!CZ~S z@J`VGn#>2Fdh93U6&lU^ z0uI4t3iQZM)SE7Z&jW(_&G-#x>hQi70aq;HRbG1Z9EKtd2g) zuA_uvV;?jUwJ|iVup~uo!$qVbii$U#tzOBfEEf8Mf=fo@`%DJnmzs#uN!YZHtv6cI z`$}z-?EG3repT6jAE2aGQy;p1sd#sbYYO~sZWazu`4?M_yHnHg04NSbVR7eRGBmId zSiDYaLKlNqH0J(DBS-AljOZlO@SM}e)TONZ3RTM)e?Xrlx@L4KRDrkeZr%u#3?(>o zdJ8G@mQo4=`tkw_vWS25;E7(=SbOT9g{zxF%MnX*^*V8H{b@m25B^FKNs28PTWxo) zyMk>VnZ>m{YHytE3|b-nA4C}X#v6;U zq)3-uF@!Q;Kh?G_#TH{_D5PaC4)U-F=&8PYcl-8C`rrGWnX|rJVttQmw-6ncT zo36y*k!2#=*h(a6fHpSP?wE}q`NnuxkZWx%b6;$$t^yQPU?Xonjo zHjZMcgmqzpaEUxDK28QL$mcSs;HS`@f!oWKPwIH9wdVy1%U8r_fE6M?c^GrLTk4w( z4!&`X1v`{(PssZ?bC&08ta)An0xz^L)fg8HI3n2p2DE zQ1XcQuX*swplw8EGzmYW;~gMx2Gm6|VuCu3p>M{JZ+)-?OgCI0TXk!0jYUS9yBZAuYrOxc_O=g0}LQeNiYxV z%%%yave~iQa(YM#xN#?ud6?=|InY1yF8T44)O|XKzQA%@NvEW@T%$45?vz$-@WZczM>9NXU``3gFawcs_%sma8~^1+0%?kCoi)eUt(# zW@^-BNj)|UZeR;qa0onXCpc3ODknw9{ z*@?<{Fh){vQC0zNXpGlfEK&;Yx`2g_jV0^3Ef6CCBl-MLAHxrPYF(UR1a@TwA18)L z(1XaHf}pME)twtQnFAC)uAZfUnHjAeDw2oSOM%|wz!byehgeEJHauPvA?wo^NSP_E z8Z!@1hK*--{rmiq39$MmtR7P6Tnkhb9IC@cM?R@b1k?WjIOH&WPImRrNm4zCwF%5| z#(ldM!Oy$l_@qVa#}X-|0a%IB|$Cm0PaF zJsGxVU^z;qf`v;76trx`~ zup)j94g`qufQx-1L@0CEm1DvS#B)}E<(HNn0 z0(ea96}!62cVqj2|KPd8K=Y7A4OxF8Ilui*#GNmrF~1Eaiq<bdcMB z`X48k32xv2Q7jGmE?nKJ@DE(%0prdq!LE#v!{q>ZNx3s+<1j?dLEp#)NFnT%uMd*$ z{Ywod@H>Pf?W>ji!=RJF2K-sDLhlE1A{{u@s zhMy4^zYN^S@eZAyB!aGt5f;Eg;1bqwg$P&pB3QgRajBA-H390Hd4ntpc~j42ecPvnyKq=Y_Bh*2yr9+hb^l4kB)s8xq;p23m1?(AcvD^iCpK~fuOY&gX2NQ1YCvV z5zZR&V;!)cepI-Z73;!l(#CV~9){!Up0HfFfZWY31OSKde}F+qX+lXQ|3MT^KPu%f zJ&h25mV^k9C2N)d9)NJkhZrH);KreG-_oOkD|bCe9YJ9n0scvBQvV(K0#BsX@l@91PAEuh=c?k?$ZysjLH5Il@ij;PYVTHF&cg zwNp@QW5Z1g$!2%1!f?pr^VPYB+_W={&Ce>YDvV*AgTiC%=ViEXcfQv1U0m;_zrbHp z11(yywEfsp#61Dl|5xTW+{o2kX;B1`uE`A#FCVjh`oGD?6rSqSAM6nbx^@-_1HrEx zKj!@hz#2y4wx;IXMdYUc8#xXCzSN$JaMS#gf#*2o*YHFh4e(M^0BBZGjfpGA6TYK@ z(fuKWwqmoWb+PvaP9B8Ufo3e0oEOUNTt(osha zY>9A)F?7S8{5u|AlwwZ%o_SY}+ZG!BG0gl?NL5aUT&57_C;3df(UL{jlig{*^b7xg zPWu0eF}H<4S;6o&N%_TmOX7=m!bKRHd{5En8WDcdxHmO1GNEX}6S(>N@gE_0nsGD& zZMiU2v7Fq<2}Yh%7cz?ZD&p4A;Z0vO{eWExZ=}(U@tgv#40u8ot>ekYugI9kR{Onz zJk^%y{Btl40;Y=#zq;@qSylY0%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 000000000..2afb96f05 --- /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/plastic_damage_model/uni_ten.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 000000000..689cd4926 --- /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 000000000..a569e8b7d --- /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 000000000..51b958a92 --- /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 000000000..4f92615e1 --- /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 000000000..0921e9156 --- /dev/null +++ b/src/materials/DamagePlasticityStressUpdate.C @@ -0,0 +1,679 @@ +/****************************************************************/ +/* 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", "parameter for the dilation"); + params.addRangeCheckedParam("stiff_recovery_factor", + 0., + "stiff_recovery_factor <= 1. & stiff_recovery_factor >= 0", + "stiffness recovery parameter"); + + 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 = + (pow(stress_params[0] - stress_params[1], 2.) + pow(stress_params[1] - stress_params[2], 2.) + + pow(stress_params[2] - stress_params[0], 2.)) / + 6. + + _small_smoother2; + Real sqrtJ2 = sqrt(J2); + yf[0] = 1. / (1. - _alfa) * + (_alfa * I1 + _sqrt3 * sqrtJ2 + + 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 = + (pow(stress_params[0] - stress_params[1], 2.) + pow(stress_params[1] - stress_params[2], 2.) + + pow(stress_params[2] - stress_params[0], 2.)) / + 6. + + _small_smoother2; + Real sqrtJ2 = sqrt(J2); + std::vector DevSt(3); // vector of principal deviatoric stress + for (unsigned i = 0; i < 3; ++i) + DevSt[i] = stress_params[i] - I1 / 3.; + + // yieldFunctionValuesV(stress_params, intnl, all_q[0].f); + all_q[0].f = 1. / (1. - _alfa) * + (_alfa * I1 + _sqrt3 * sqrtJ2 + + beta(intnl) * (stress_params[2] < 0. ? 0. : stress_params[2])) - + fc(intnl); + + for (unsigned i = 0; i < _num_sp; ++i) + all_q[0].df[i] = 1. / (1. - _alfa) * + (_alfa + _sqrt3 * DevSt[i] / (2. * sqrtJ2) + + 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 = + (pow(stress_params[0] - stress_params[1], 2.) + pow(stress_params[1] - stress_params[2], 2.) + + pow(stress_params[2] - stress_params[0], 2.)) / + 6. + + _small_smoother2; + Real invsqrt2J2 = 1. / sqrt(2. * J2); + std::vector DevSt(3); + DevSt[0] = (2. * stress_params[0] - stress_params[1] - stress_params[2]) / 3.; // dJ2/dsig0 + DevSt[1] = (2. * stress_params[1] - stress_params[2] - stress_params[0]) / 3.; // dJ2/dsig1 + DevSt[2] = (2. * stress_params[2] - stress_params[0] - stress_params[1]) / 3.; // dJ2/dsig2 + + Real D = damageVar(stress_params, intnl); + + for (unsigned int i = 0; i < _num_sp; ++i) + r[i] = (_alfa_p + (J2 < _f_tol ? 0. : DevSt[i] * invsqrt2J2)) * pow((1. - D), 1); +} + +void +DamagePlasticityStressUpdate::dflowPotential_dstress( + const std::vector & stress_params, + const std::vector & intnl, + std::vector> & dr_dstress) const +{ + Real J2 = + (pow(stress_params[0] - stress_params[1], 2.) + pow(stress_params[1] - stress_params[2], 2.) + + pow(stress_params[2] - stress_params[0], 2.)) / + 6. + + _small_smoother2; + Real invsqrt2J2 = 1. / sqrt(2. * J2); + std::vector DevSt(3); + DevSt[0] = (2. * stress_params[0] - stress_params[1] - stress_params[2]) / 3.; // dJ2/dsig0 + DevSt[1] = (2. * stress_params[1] - stress_params[2] - stress_params[0]) / 3.; // dJ2/dsig1 + DevSt[2] = (2. * stress_params[2] - stress_params[0] - stress_params[1]) / 3.; // dJ2/dsig2 + + Real D = damageVar(stress_params, intnl); + + for (unsigned i = 0; i < _num_sp; ++i) + for (unsigned j = 0; j < (i + 1); ++j) + { + if (i != j) + { + dr_dstress[i][j] = J2 < _f_tol ? 0. + : invsqrt2J2 * (-1. / 3. - DevSt[i] * DevSt[j] / (2. * J2)) * + pow((1. - D), 2); + dr_dstress[j][i] = dr_dstress[i][j]; + } + else + dr_dstress[i][i] = J2 < _f_tol ? 0. + : invsqrt2J2 * (2. / 3. - DevSt[i] * DevSt[j] / (2. * J2)) * + pow((1. - D), 2); + } +} + +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 = (pow(trial_stress_params[0] - trial_stress_params[1], 2.) + + pow(trial_stress_params[1] - trial_stress_params[2], 2.) + + pow(trial_stress_params[2] - trial_stress_params[0], 2.)) / + 6. + + _small_smoother2; + 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 = (pow(trial_stress_params[0] - trial_stress_params[1], 2.) + + pow(trial_stress_params[1] - trial_stress_params[2], 2.) + + pow(trial_stress_params[2] - trial_stress_params[0], 2.)) / + 6.; + 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/bi_ten.i b/test/tests/damage_plasticity_model/bi_ten.i new file mode 100644 index 000000000..1cfc285ac --- /dev/null +++ b/test/tests/damage_plasticity_model/bi_ten.i @@ -0,0 +1,316 @@ +[Mesh] + [gmg] + type = GeneratedMeshGenerator + dim = 2 + nx = 1 + ny = 1 + + xmin = -12.7 + xmax = 12.7 + + ymin = -12.7 + ymax = 12.7 + [] + [./subdomains] + type = SubdomainBoundingBoxGenerator + input = gmg + bottom_left = '0 12.7 0' + top_right = '12.7 -12.7 0' + block_id = '1' + location = INSIDE + [] + [./extra_nodeset1] + type = ExtraNodesetGenerator + input = subdomains + new_boundary = 'bottom_left' + coord = '-12.7 -12.7' + [] + [./extra_nodeset2] + type = ExtraNodesetGenerator + input = extra_nodeset1 + new_boundary = 'top_left' + coord = '-12.7 12.7' + [] +[] + +[GlobalParams] + displacements = 'disp_x disp_y' + volumetric_locking_correction = true + out_of_plane_strain = strain_zz +[] + +[Variables] + [./disp_x] + [../] + [./disp_y] + [../] + [./strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[Kernels] + [./TensorMechanics] + use_displaced_mesh = true + save_in = 'resid_x resid_y' + [../] + + [./solid_z] + type = WeakPlaneStress + variable = strain_zz + use_displaced_mesh = true + [../] +[] + +[AuxVariables] + [./resid_x] + [../] + [./resid_y] + [../] + [./D] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl0] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl1] + order = CONSTANT + family = MONOMIAL + [../] + + [./stress_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_zz] + order = CONSTANT + family = MONOMIAL + [../] + + [./strain_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./material_strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[AuxKernels] + [./D_auxk] + type = MaterialRealAux + property = elemental_damage_variable + variable = D + [../] + [./intnl0_auxk] + type = MaterialRealAux + property = damage_state_in_tension + variable = intnl0 + [../] + [./intnl1_auxk] + type = MaterialRealAux + property = damage_state_in_compression + variable = intnl1 + [../] + + [./stress_xx] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xx + index_i = 0 + index_j = 0 + [../] + [./stress_xy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xy + index_i = 0 + index_j = 1 + [../] + [./stress_yy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yy + index_i = 1 + index_j = 1 + [../] + [./stress_zz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_zz + index_i = 2 + index_j = 2 + [../] + + [./strain_xx] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xx + index_i = 0 + index_j = 0 + [../] + [./strain_xy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xy + index_i = 0 + index_j = 1 + [../] + [./strain_yy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_yy + index_i = 1 + index_j = 1 + [../] + [./strain_zz] + type = RankTwoAux + rank_two_tensor = total_strain + variable = material_strain_zz + index_i = 2 + index_j = 2 + [../] +[] + +[BCs] + [./left_x] + type = FunctionDirichletBC + variable = disp_x + boundary = 'left' + function = '0.' + [../] + [./y1] + type = FunctionDirichletBC + variable = disp_y + boundary = 'bottom' + function = '0.' + [../] + [./right_surface] + type = FunctionDirichletBC + variable = disp_x + boundary = 'right' + function = '1E-4*t' + [../] + [./top_surface] + type = FunctionDirichletBC + variable = disp_y + boundary = 'top' + function = '1E-4*t' + [../] +[] + +[Postprocessors] + [./displacement_x] + type = AverageNodalVariableValue + variable = disp_x + boundary = 'right' + [../] + [./s_xx] + type = ElementAverageValue + variable = stress_xx + [../] + [./displacement_y] + type = AverageNodalVariableValue + variable = disp_y + boundary = 'top' + [../] + [./s_yy] + type = ElementAverageValue + variable = stress_yy + [../] +[] + +[Materials] + [./elasticity_tensor] + type = ComputeIsotropicElasticityTensor + youngs_modulus = 3.17E4 + poissons_ratio = 0.18 + [../] + [./stress] + type = ComputeMultipleInelasticDamageStress + inelastic_models = pdm + perform_finite_strain_rotations = false + tangent_operator = nonlinear + [../] + [./strain] + type = ComputePlaneIncrementalStrain + [../] + [./pdm] + type = DamagePlasticityStressUpdate + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + 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.40 + fracture_energy_in_compression = 1750E-2 + + yield_function_tol = 1.E-5 + tip_smoother = 1.E-6 + smoothing_tol = 1.E-3 + [../] +[] + +[Preconditioning] + active = SMP + [./SMP] + type = SMP + full = true + [../] + [./FDP] + type = FDP + full = true + [../] +[] + +[Executioner] + solve_type = 'NEWTON' + nl_max_its = 100 + nl_abs_tol = 1.E-5 + nl_rel_tol = 1E-3 + + line_search = none + + petsc_options_iname = '-pc_type' + petsc_options_value = 'lu' + + petsc_options = '-snes_converged_reason' + + type = Transient + end_time = 200 + dt = 1 +[] + + +[Outputs] + exodus = false + [./csv] + type = CSV + [../] +[] diff --git a/test/tests/damage_plasticity_model/gold/Lee_bi_cmp.csv b/test/tests/damage_plasticity_model/gold/Lee_bi_cmp.csv new file mode 100644 index 000000000..bd2a2ef2b --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/Lee_bi_cmp.csv @@ -0,0 +1,25 @@ +0.00E+00,0.00 +-8.25E-05,-2.72 +-2.37E-04,-9.05 +-4.84E-04,-18.68 +-5.67E-04,-20.74 +-7.01E-04,-23.32 +-9.19E-04,-26.26 +-1.16E-03,-28.69 +-1.46E-03,-30.76 +-1.68E-03,-31.57 +-1.81E-03,-31.87 +-1.96E-03,-32.01 +-2.16E-03,-31.87 +-2.36E-03,-31.43 +-2.55E-03,-30.70 +-2.76E-03,-29.82 +-2.98E-03,-28.72 +-3.24E-03,-26.89 +-3.67E-03,-24.02 +-4.01E-03,-21.60 +-4.37E-03,-18.96 +-4.87E-03,-15.37 +, +, +, \ No newline at end of file diff --git a/test/tests/damage_plasticity_model/gold/Lee_bi_ten.csv b/test/tests/damage_plasticity_model/gold/Lee_bi_ten.csv new file mode 100644 index 000000000..fd59e52fd --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/Lee_bi_ten.csv @@ -0,0 +1,25 @@ +0.00E+00,0.00 +1.40E-05,0.55 +3.30E-05,1.21 +5.01E-05,1.87 +6.03E-05,2.27 +7.67E-05,2.91 +8.44E-05,3.16 +9.13E-05,3.36 +1.19E-04,2.98 +1.41E-04,2.67 +1.71E-04,2.27 +1.95E-04,2.00 +2.16E-04,1.73 +2.40E-04,1.46 +2.68E-04,1.21 +2.93E-04,1.01 +3.35E-04,0.74 +3.60E-04,0.61 +4.00E-04,0.44 +4.34E-04,0.35 +4.74E-04,0.25 +5.19E-04,0.17 +5.64E-04,0.11 +5.88E-04,0.09 +, \ No newline at end of file diff --git a/test/tests/damage_plasticity_model/gold/Lee_cyc_shr.csv b/test/tests/damage_plasticity_model/gold/Lee_cyc_shr.csv new file mode 100644 index 000000000..53418c991 --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/Lee_cyc_shr.csv @@ -0,0 +1,61 @@ +3.95E-06,3.16E-05 +2.12E-04,2.85E+00 +2.44E-04,3.05E+00 +4.81E-04,2.91E+00 +6.02E-04,2.86E+00 +4.82E-04,1.97E+00 +3.44E-04,9.80E-01 +2.52E-04,1.68E-02 +1.72E-04,-8.79E-01 +-3.24E-06,-2.13E+00 +-7.71E-05,-2.70E+00 +-1.15E-04,-2.82E+00 +-5.90E-04,-2.82E+00 +-3.53E-04,-1.70E+00 +-3.11E-04,-1.47E+00 +-1.34E-04,1.39E-02 +3.25E-06,1.16E+00 +6.02E-05,1.60E+00 +3.37E-04,2.88E+00 +6.04E-04,2.87E+00 +3.33E-04,1.79E+00 +3.00E-04,1.58E+00 +9.29E-05,8.16E-03 +-1.39E-04,-1.71E+00 +-4.12E-04,-2.79E+00 +-5.85E-04,-2.83E+00 +-4.21E-04,-2.20E+00 +-2.96E-04,-1.71E+00 +-1.88E-04,-9.42E-01 +-2.37E-05,1.71E-01 +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, \ No newline at end of file diff --git a/test/tests/damage_plasticity_model/gold/Lee_cyc_uni_cmp.csv b/test/tests/damage_plasticity_model/gold/Lee_cyc_uni_cmp.csv new file mode 100644 index 000000000..1d1caf7bb --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/Lee_cyc_uni_cmp.csv @@ -0,0 +1,47 @@ +0.00E+00,0.00E+00 +-2.86E-04,-8.76E+00 +-4.54E-04,-1.42E+01 +-5.18E-04,-1.61E+01 +-5.76E-04,-1.73E+01 +-6.50E-04,-1.86E+01 +-8.02E-04,-2.05E+01 +-1.07E-03,-2.34E+01 +-1.31E-03,-2.53E+01 +-1.52E-03,-2.64E+01 +-1.73E-03,-2.72E+01 +-1.88E-03,-2.76E+01 +-2.11E-03,-2.76E+01 +-1.46E-03,-1.52E+01 +-7.06E-04,-1.14E+00 +-2.09E-03,-2.72E+01 +-2.21E-03,-2.76E+01 +-2.40E-03,-2.72E+01 +-2.63E-03,-2.65E+01 +-2.84E-03,-2.57E+01 +-3.01E-03,-2.48E+01 +-2.42E-03,-1.71E+01 +-1.22E-03,-1.21E+00 +-3.00E-03,-2.49E+01 +-3.30E-03,-2.32E+01 +-3.58E-03,-2.14E+01 +-3.84E-03,-1.98E+01 +-3.91E-03,-1.92E+01 +-3.30E-03,-1.39E+01 +-1.81E-03,-1.12E+00 +-3.91E-03,-1.92E+01 +-4.09E-03,-1.79E+01 +-4.31E-03,-1.63E+01 +-4.40E-03,-1.57E+01 +-3.75E-03,-1.15E+01 +-2.55E-03,-3.35E+00 +-2.23E-03,-1.28E+00 +-4.38E-03,-1.57E+01 +-4.60E-03,-1.45E+01 +-4.80E-03,-1.31E+01 +-5.00E-03,-1.19E+01 +-3.89E-03,-6.50E+00 +-2.82E-03,-1.58E+00 +-5.00E-03,-1.19E+01 +, +, +, \ No newline at end of file diff --git a/test/tests/damage_plasticity_model/gold/Lee_cyc_uni_ten.csv b/test/tests/damage_plasticity_model/gold/Lee_cyc_uni_ten.csv new file mode 100644 index 000000000..0eeb294ba --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/Lee_cyc_uni_ten.csv @@ -0,0 +1,47 @@ +-5.25E-07,-3.77E-03 +3.80E-05,1.24E+00 +8.98E-05,2.94E+00 +1.03E-04,3.29E+00 +1.09E-04,3.41E+00 +1.19E-04,3.20E+00 +1.42E-04,2.76E+00 +1.59E-04,2.48E+00 +6.20E-05,2.91E-01 +1.58E-04,2.48E+00 +1.82E-04,2.12E+00 +2.09E-04,1.78E+00 +2.30E-04,1.54E+00 +1.31E-04,1.78E-01 +2.31E-04,1.53E+00 +2.49E-04,1.34E+00 +2.74E-04,1.13E+00 +3.00E-04,9.43E-01 +2.12E-04,2.04E-01 +3.01E-04,9.47E-01 +3.26E-04,7.94E-01 +3.58E-04,6.38E-01 +2.75E-04,1.47E-01 +3.57E-04,6.35E-01 +3.81E-04,5.34E-01 +4.04E-04,4.57E-01 +4.29E-04,3.90E-01 +3.40E-04,9.03E-02 +4.28E-04,3.87E-01 +4.51E-04,3.35E-01 +4.90E-04,2.51E-01 +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, \ No newline at end of file diff --git a/test/tests/damage_plasticity_model/gold/Lee_cyc_uni_ten_cmp.csv b/test/tests/damage_plasticity_model/gold/Lee_cyc_uni_ten_cmp.csv new file mode 100644 index 000000000..1f57545d0 --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/Lee_cyc_uni_ten_cmp.csv @@ -0,0 +1,61 @@ +3.67E-07,-8.88E-03 +1.86E-05,3.23E+00 +1.98E-05,3.32E+00 +3.52E-05,2.98E+00 +1.00E-05,-1.83E-02 +5.94E-07,-1.42E+00 +1.00E-05,-8.36E-03 +3.52E-05,2.96E+00 +3.66E-05,2.94E+00 +5.48E-05,2.48E+00 +2.22E-05,-5.22E-03 +2.27E-07,-2.73E+00 +2.20E-05,-1.27E-02 +5.39E-05,2.37E+00 +5.60E-05,2.43E+00 +6.99E-05,2.11E+00 +3.14E-05,-1.22E-02 +6.88E-06,-2.81E+00 +3.11E-05,-1.22E-02 +6.87E-05,2.04E+00 +7.20E-05,2.06E+00 +8.53E-05,1.78E+00 +3.98E-05,-1.18E-02 +1.06E-05,-3.06E+00 +3.96E-05,-1.92E-02 +8.50E-05,1.77E+00 +9.98E-05,1.48E+00 +4.72E-05,-1.14E-02 +1.56E-05,-3.21E+00 +4.70E-05,-1.88E-02 +9.96E-05,1.47E+00 +1.17E-04,1.20E+00 +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, \ No newline at end of file diff --git a/test/tests/damage_plasticity_model/gold/Lee_dila_ap_02.csv b/test/tests/damage_plasticity_model/gold/Lee_dila_ap_02.csv new file mode 100644 index 000000000..f6d56ee07 --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/Lee_dila_ap_02.csv @@ -0,0 +1,14 @@ +1.91E-05,0.00 +-6.46E-05,-3.74 +-1.54E-04,-8.03 +-2.37E-04,-12.21 +-3.15E-04,-16.02 +-3.76E-04,-20.98 +-3.81E-04,-23.07 +-4.48E-04,-27.51 +-3.19E-04,-21.46 +-2.13E-04,-18.18 +-5.54E-05,-14.89 +1.08E-04,-12.09 +2.43E-04,-10.30 +3.67E-04,-9.10 \ No newline at end of file diff --git a/test/tests/damage_plasticity_model/gold/Lee_dila_ap_025.csv b/test/tests/damage_plasticity_model/gold/Lee_dila_ap_025.csv new file mode 100644 index 000000000..c4725a824 --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/Lee_dila_ap_025.csv @@ -0,0 +1,23 @@ +1.35E-05,-0.04 +-1.20E-04,-6.39 +-2.21E-04,-11.35 +-3.15E-04,-16.20 +-3.38E-04,-17.55 +-3.37E-04,-20.64 +-3.30E-04,-23.33 +-3.12E-04,-25.31 +-2.72E-04,-27.06 +-2.44E-04,-27.47 +-2.27E-04,-27.67 +-2.06E-04,-27.58 +-1.72E-04,-27.22 +-1.72E-04,-27.22 +-4.07E-05,-25.29 +5.64E-05,-23.60 +2.34E-04,-20.64 +4.16E-04,-18.09 +5.93E-04,-15.96 +8.01E-04,-13.60 +9.87E-04,-11.95 +1.16E-03,-10.52 +1.36E-03,-9.17 \ No newline at end of file diff --git a/test/tests/damage_plasticity_model/gold/Lee_dila_ap_03.csv b/test/tests/damage_plasticity_model/gold/Lee_dila_ap_03.csv new file mode 100644 index 000000000..8ddd7edf0 --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/Lee_dila_ap_03.csv @@ -0,0 +1,25 @@ +1.49E-05,0.01 +-7.71E-05,-4.44 +-1.57E-04,-8.24 +-2.65E-04,-13.62 +-3.32E-04,-16.98 +-3.27E-04,-18.46 +-2.93E-04,-20.64 +-2.62E-04,-22.52 +-2.32E-04,-23.83 +-1.85E-04,-25.54 +-1.42E-04,-26.38 +-9.53E-05,-26.97 +-4.00E-05,-27.41 +2.80E-05,-27.63 +8.32E-05,-27.47 +1.64E-04,-27.10 +2.48E-04,-26.48 +3.76E-04,-25.48 +5.32E-04,-24.02 +7.61E-04,-21.78 +1.04E-03,-19.09 +1.30E-03,-16.93 +1.97E-03,-12.22 +2.29E-03,-10.42 +2.56E-03,-9.02 \ No newline at end of file diff --git a/test/tests/damage_plasticity_model/gold/Lee_uni_cmp.csv b/test/tests/damage_plasticity_model/gold/Lee_uni_cmp.csv new file mode 100644 index 000000000..50a33fe90 --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/Lee_uni_cmp.csv @@ -0,0 +1,26 @@ +0.00E+00,0.00 +-1.45E-04,-4.05 +-2.79E-04,-8.31 +-4.34E-04,-13.24 +-5.26E-04,-16.26 +-5.57E-04,-16.99 +-5.99E-04,-17.95 +-6.72E-04,-18.91 +-7.89E-04,-20.50 +-9.55E-04,-22.32 +-1.14E-03,-24.09 +-1.31E-03,-25.22 +-1.50E-03,-26.25 +-1.68E-03,-27.03 +-1.84E-03,-27.38 +-1.97E-03,-27.58 +-2.17E-03,-27.58 +-2.34E-03,-27.39 +-2.56E-03,-26.85 +-2.84E-03,-26.12 +-3.05E-03,-25.05 +-3.58E-03,-22.21 +-3.84E-03,-20.74 +-4.18E-03,-18.64 +-4.58E-03,-16.15 +-4.88E-03,-14.34 \ No newline at end of file diff --git a/test/tests/damage_plasticity_model/gold/Lee_uni_ten.csv b/test/tests/damage_plasticity_model/gold/Lee_uni_ten.csv new file mode 100644 index 000000000..bb5a76c13 --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/Lee_uni_ten.csv @@ -0,0 +1,25 @@ +0.00E+00,0.00 +1.33E-05,0.38 +2.85E-05,0.88 +4.12E-05,1.30 +5.96E-05,1.86 +9.32E-05,2.91 +1.01E-04,3.16 +1.11E-04,3.46 +1.25E-04,3.20 +1.41E-04,2.87 +1.58E-04,2.56 +1.82E-04,2.19 +1.99E-04,1.95 +2.21E-04,1.67 +2.48E-04,1.39 +2.79E-04,1.11 +3.10E-04,0.90 +3.42E-04,0.72 +3.81E-04,0.56 +4.15E-04,0.44 +4.58E-04,0.32 +4.99E-04,0.25 +5.40E-04,0.19 +5.86E-04,0.09 +, \ No newline at end of file diff --git a/test/tests/damage_plasticity_model/gold/Lee_uni_ten_msh_sen_2_elem.csv b/test/tests/damage_plasticity_model/gold/Lee_uni_ten_msh_sen_2_elem.csv new file mode 100644 index 000000000..bde340393 --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/Lee_uni_ten_msh_sen_2_elem.csv @@ -0,0 +1,17 @@ +3.61664E-05,0.504201681 +0.000687161,11.59663866 +0.002314647,37.81512605 +0.003471971,55.29411765 +0.004484629,71.42857143 +0.005424955,85.88235294 +0.005895118,82.68907563 +0.006003617,78.65546218 +0.006437613,67.73109244 +0.007088608,55.79831933 +0.008282098,41.8487395 +0.009584087,30.92436975 +0.011103074,22.01680672 +0.012983725,15.12605042 +0.014972875,10.25210084 +0.017070524,7.058823529 +0.019240506,4.705882353 \ No newline at end of file diff --git a/test/tests/damage_plasticity_model/gold/Lee_uni_ten_msh_sen_4_elem.csv b/test/tests/damage_plasticity_model/gold/Lee_uni_ten_msh_sen_4_elem.csv new file mode 100644 index 000000000..c755f1096 --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/Lee_uni_ten_msh_sen_4_elem.csv @@ -0,0 +1,15 @@ +0,0.168067227 +0.000759494,12.10084034 +0.002857143,45.21008403 +0.005497288,85.37815126 +0.005822785,78.31932773 +0.006401447,61.17647059 +0.006943942,49.41176471 +0.007703436,39.49579832 +0.008499096,31.42857143 +0.009511754,24.53781513 +0.011211573,15.96638655 +0.013092224,10.58823529 +0.015551537,6.386554622 +0.018155515,3.697478992 +0.019891501,2.521008403 \ No newline at end of file diff --git a/test/tests/damage_plasticity_model/gold/Lee_uni_ten_msh_sen_8_elem.csv b/test/tests/damage_plasticity_model/gold/Lee_uni_ten_msh_sen_8_elem.csv new file mode 100644 index 000000000..db8b8c23b --- /dev/null +++ b/test/tests/damage_plasticity_model/gold/Lee_uni_ten_msh_sen_8_elem.csv @@ -0,0 +1,13 @@ +-7.23327E-05,0.168067227 +0.000831826,13.61344538 +0.003471971,54.95798319 +0.005497288,85.37815126 +0.005822785,73.94957983 +0.006473779,53.94957983 +0.007016275,43.36134454 +0.007884268,33.27731092 +0.009222423,23.19327731 +0.011392405,13.44537815 +0.013490054,8.403361345 +0.016166365,4.705882353 +0.019891501,2.352941176 \ No newline at end of file diff --git a/test/tests/damage_plasticity_model/multiaxial1_cmp.i b/test/tests/damage_plasticity_model/multiaxial1_cmp.i new file mode 100644 index 000000000..74cb8cb91 --- /dev/null +++ b/test/tests/damage_plasticity_model/multiaxial1_cmp.i @@ -0,0 +1,282 @@ +[Mesh] + type = GeneratedMesh + dim = 2 + nx = 2 + ny = 2 + xmin = -12.7 + xmax = 12.7 + ymin = -12.7 + ymax = 12.7 +[] + +[GlobalParams] + displacements = 'disp_x disp_y' + volumetric_locking_correction = true + out_of_plane_strain = strain_zz +[] + +[Variables] + [./disp_x] + [../] + [./disp_y] + [../] + [./strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[Kernels] + [./TensorMechanics] + use_displaced_mesh = true + save_in = 'resid_x resid_y' + [../] + + [./solid_z] + type = WeakPlaneStress + variable = strain_zz + use_displaced_mesh = true + [../] +[] + +[AuxVariables] + [./resid_x] + [../] + [./resid_y] + [../] + [./D] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl0] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl1] + order = CONSTANT + family = MONOMIAL + [../] + + [./stress_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_zz] + order = CONSTANT + family = MONOMIAL + [../] + + [./strain_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./material_strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[AuxKernels] + [./D_auxk] + type = MaterialRealAux + property = elemental_damage_variable + variable = D + [../] + [./intnl0_auxk] + type = MaterialRealAux + property = damage_state_in_tension + variable = intnl0 + [../] + [./intnl1_auxk] + type = MaterialRealAux + property = damage_state_in_compression + variable = intnl1 + [../] + + [./stress_xx] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xx + index_i = 0 + index_j = 0 + [../] + [./stress_xy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xy + index_i = 0 + index_j = 1 + [../] + [./stress_yy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yy + index_i = 1 + index_j = 1 + [../] + [./stress_zz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_zz + index_i = 2 + index_j = 2 + [../] + + [./strain_xx] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xx + index_i = 0 + index_j = 0 + [../] + [./strain_xy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xy + index_i = 0 + index_j = 1 + [../] + [./strain_yy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_yy + index_i = 1 + index_j = 1 + [../] + [./strain_zz] + type = RankTwoAux + rank_two_tensor = total_strain + variable = material_strain_zz + index_i = 2 + index_j = 2 + [../] +[] + +[BCs] + [./left_x] + type = FunctionDirichletBC + variable = disp_x + boundary = 'left' + function = '0.' + [../] + [./y1] + type = FunctionDirichletBC + variable = disp_y + boundary = 'bottom' + function = '0.' + [../] + [./right_surface] + type = FunctionDirichletBC + variable = disp_x + boundary = 'right' + function = '-1E-3*t' + [../] +[] + +[Postprocessors] + [./displacement_x] + type = AverageNodalVariableValue + variable = disp_x + boundary = 'right' + [../] + [./s_xx] + type = ElementAverageValue + variable = stress_xx + [../] + # [./react_x] + # type = NodalSum + # variable = resid_x + # boundary = 'left' + # [../] +[] + +[Materials] + [./elasticity_tensor] + type = ComputeIsotropicElasticityTensor + youngs_modulus = 3.1E4 + poissons_ratio = 0.18 + [../] + [./stress] + type = ComputeMultipleInelasticDamageStress + inelastic_models = pdm + perform_finite_strain_rotations = false + tangent_operator = nonlinear + [../] + [./strain] + type = ComputePlaneIncrementalStrain + [../] + [./pdm] + type = DamagePlasticityStressUpdate + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + 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 = 825E-3 + + yield_function_tol = 1.E-5 + tip_smoother = 1.E-6 + smoothing_tol = 1.E-3 + [../] +[] + +[Preconditioning] + active = SMP + [./SMP] + type = SMP + full = true + [../] + [./FDP] + type = FDP + full = true + [../] +[] + +[Executioner] + solve_type = 'NEWTON' + nl_max_its = 100 + nl_abs_tol = 1.E-5 + nl_rel_tol = 1E-3 + + line_search = none + + petsc_options_iname = '-pc_type' + petsc_options_value = 'lu' + + petsc_options = '-snes_converged_reason' + + type = Transient + end_time = 200 + dt = 1 +[] + + +[Outputs] + exodus = false + [./csv] + type = CSV + [../] +[] diff --git a/test/tests/damage_plasticity_model/multiaxial1_ten.i b/test/tests/damage_plasticity_model/multiaxial1_ten.i new file mode 100644 index 000000000..80c409bf6 --- /dev/null +++ b/test/tests/damage_plasticity_model/multiaxial1_ten.i @@ -0,0 +1,282 @@ +[Mesh] + type = GeneratedMesh + dim = 2 + nx = 2 + ny = 2 + xmin = -12.7 + xmax = 12.7 + ymin = -12.7 + ymax = 12.7 +[] + +[GlobalParams] + displacements = 'disp_x disp_y' + volumetric_locking_correction = true + out_of_plane_strain = strain_zz +[] + +[Variables] + [./disp_x] + [../] + [./disp_y] + [../] + [./strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[Kernels] + [./TensorMechanics] + use_displaced_mesh = true + save_in = 'resid_x resid_y' + [../] + + [./solid_z] + type = WeakPlaneStress + variable = strain_zz + use_displaced_mesh = true + [../] +[] + +[AuxVariables] + [./resid_x] + [../] + [./resid_y] + [../] + [./D] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl0] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl1] + order = CONSTANT + family = MONOMIAL + [../] + + [./stress_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_zz] + order = CONSTANT + family = MONOMIAL + [../] + + [./strain_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./material_strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[AuxKernels] + [./D_auxk] + type = MaterialRealAux + property = elemental_damage_variable + variable = D + [../] + [./intnl0_auxk] + type = MaterialRealAux + property = damage_state_in_tension + variable = intnl0 + [../] + [./intnl1_auxk] + type = MaterialRealAux + property = damage_state_in_compression + variable = intnl1 + [../] + + [./stress_xx] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xx + index_i = 0 + index_j = 0 + [../] + [./stress_xy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xy + index_i = 0 + index_j = 1 + [../] + [./stress_yy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yy + index_i = 1 + index_j = 1 + [../] + [./stress_zz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_zz + index_i = 2 + index_j = 2 + [../] + + [./strain_xx] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xx + index_i = 0 + index_j = 0 + [../] + [./strain_xy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xy + index_i = 0 + index_j = 1 + [../] + [./strain_yy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_yy + index_i = 1 + index_j = 1 + [../] + [./strain_zz] + type = RankTwoAux + rank_two_tensor = total_strain + variable = material_strain_zz + index_i = 2 + index_j = 2 + [../] +[] + +[BCs] + [./left_x] + type = FunctionDirichletBC + variable = disp_x + boundary = 'left' + function = '0.' + [../] + [./y1] + type = FunctionDirichletBC + variable = disp_y + boundary = 'bottom' + function = '0.' + [../] + [./right_surface] + type = FunctionDirichletBC + variable = disp_x + boundary = 'right' + function = '1E-4*t' + [../] +[] + +[Postprocessors] + [./displacement_x] + type = AverageNodalVariableValue + variable = disp_x + boundary = 'right' + [../] + [./s_xx] + type = ElementAverageValue + variable = stress_xx + [../] + # [./react_x] + # type = NodalSum + # variable = resid_x + # boundary = 'left' + # [../] +[] + +[Materials] + [./elasticity_tensor] + type = ComputeIsotropicElasticityTensor + youngs_modulus = 3.17E4 + poissons_ratio = 0.18 + [../] + [./stress] + type = ComputeMultipleInelasticDamageStress + inelastic_models = pdm + perform_finite_strain_rotations = false + tangent_operator = nonlinear + [../] + [./strain] + type = ComputePlaneIncrementalStrain + [../] + [./pdm] + type = DamagePlasticityStressUpdate + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + 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.40 + fracture_energy_in_compression = 1750E-2 + + yield_function_tol = 1.E-5 + tip_smoother = 1.E-6 + smoothing_tol = 1.E-3 + [../] +[] + +[Preconditioning] + active = SMP + [./SMP] + type = SMP + full = true + [../] + [./FDP] + type = FDP + full = true + [../] +[] + +[Executioner] + solve_type = 'NEWTON' + nl_max_its = 100 + nl_abs_tol = 1.E-5 + nl_rel_tol = 1E-3 + + line_search = none + + petsc_options_iname = '-pc_type' + petsc_options_value = 'lu' + + petsc_options = '-snes_converged_reason' + + type = Transient + end_time = 200 + dt = 1 +[] + + +[Outputs] + exodus = false + [./csv] + type = CSV + [../] +[] diff --git a/test/tests/damage_plasticity_model/multiaxial2_cmp.i b/test/tests/damage_plasticity_model/multiaxial2_cmp.i new file mode 100644 index 000000000..112d1019d --- /dev/null +++ b/test/tests/damage_plasticity_model/multiaxial2_cmp.i @@ -0,0 +1,287 @@ +[Mesh] + type = GeneratedMesh + dim = 2 + nx = 2 + ny = 2 + xmin = -12.7 + xmax = 12.7 + ymin = -12.7 + ymax = 12.7 +[] + +[GlobalParams] + displacements = 'disp_x disp_y' + volumetric_locking_correction = true + out_of_plane_strain = strain_zz +[] + +[Variables] + [./disp_x] + [../] + [./disp_y] + [../] + [./strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[Kernels] + [./TensorMechanics] + use_displaced_mesh = true + save_in = 'resid_x resid_y' + [../] + + [./solid_z] + type = WeakPlaneStress + variable = strain_zz + use_displaced_mesh = true + [../] +[] + +[AuxVariables] + [./resid_x] + [../] + [./resid_y] + [../] + [./D] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl0] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl1] + order = CONSTANT + family = MONOMIAL + [../] + + [./stress_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_zz] + order = CONSTANT + family = MONOMIAL + [../] + + [./strain_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./material_strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[AuxKernels] + [./D_auxk] + type = MaterialRealAux + property = elemental_damage_variable + variable = D + [../] + [./intnl0_auxk] + type = MaterialRealAux + property = damage_state_in_tension + variable = intnl0 + [../] + [./intnl1_auxk] + type = MaterialRealAux + property = damage_state_in_compression + variable = intnl1 + [../] + + [./stress_xx] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xx + index_i = 0 + index_j = 0 + [../] + [./stress_xy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xy + index_i = 0 + index_j = 1 + [../] + [./stress_yy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yy + index_i = 1 + index_j = 1 + [../] + [./stress_zz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_zz + index_i = 2 + index_j = 2 + [../] + + [./strain_xx] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xx + index_i = 0 + index_j = 0 + [../] + [./strain_xy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xy + index_i = 0 + index_j = 1 + [../] + [./strain_yy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_yy + index_i = 1 + index_j = 1 + [../] + [./strain_zz] + type = RankTwoAux + rank_two_tensor = total_strain + variable = material_strain_zz + index_i = 2 + index_j = 2 + [../] +[] + +[BCs] + [./left_x] + type = FunctionDirichletBC + variable = disp_x + boundary = 'left' + function = '0.' + [../] + [./y1] + type = FunctionDirichletBC + variable = disp_y + boundary = 'bottom' + function = '0.' + [../] + [./right_surface] + type = FunctionDirichletBC + variable = disp_x + boundary = 'right' + function = '-1E-3*t' + [../] + [./top_surface] + type = FunctionDirichletBC + variable = disp_y + boundary = 'top' + function = '-1E-3*t' + [../] +[] + +[Postprocessors] + [./displacement_x] + type = AverageNodalVariableValue + variable = disp_x + boundary = 'right' + [../] + [./s_xx] + type = ElementAverageValue + variable = stress_xx + [../] + # [./react_x] + # type = NodalSum + # variable = resid_x + # boundary = 'left' + # [../] +[] + +[Materials] + [./elasticity_tensor] + type = ComputeIsotropicElasticityTensor + youngs_modulus = 3.1E4 + poissons_ratio = 0.18 + [../] + [./stress] + type = ComputeMultipleInelasticDamageStress + inelastic_models = pdm + perform_finite_strain_rotations = false + tangent_operator = nonlinear + [../] + [./strain] + type = ComputePlaneIncrementalStrain + [../] + [./pdm] + type = DamagePlasticityStressUpdate + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + 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 = 825E-3 + yield_function_tol = 1.E-5 + tip_smoother = 1.E-6 + smoothing_tol = 1.E-3 + [../] +[] + +[Preconditioning] + active = SMP + [./SMP] + type = SMP + full = true + [../] + [./FDP] + type = FDP + full = true + [../] +[] + +[Executioner] + solve_type = 'NEWTON' + nl_max_its = 100 + nl_abs_tol = 1.E-5 + nl_rel_tol = 1E-3 + + line_search = none + + petsc_options_iname = '-pc_type' + petsc_options_value = 'lu' + + petsc_options = '-snes_converged_reason' + + type = Transient + end_time = 200 + dt = 1 +[] + + +[Outputs] + exodus = false + [./csv] + type = CSV + [../] +[] diff --git a/test/tests/damage_plasticity_model/multiaxial2_ten.i b/test/tests/damage_plasticity_model/multiaxial2_ten.i new file mode 100644 index 000000000..1dd0e2c76 --- /dev/null +++ b/test/tests/damage_plasticity_model/multiaxial2_ten.i @@ -0,0 +1,288 @@ +[Mesh] + type = GeneratedMesh + dim = 2 + nx = 2 + ny = 2 + xmin = -12.7 + xmax = 12.7 + ymin = -12.7 + ymax = 12.7 +[] + +[GlobalParams] + displacements = 'disp_x disp_y' + volumetric_locking_correction = true + out_of_plane_strain = strain_zz +[] + +[Variables] + [./disp_x] + [../] + [./disp_y] + [../] + [./strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[Kernels] + [./TensorMechanics] + use_displaced_mesh = true + save_in = 'resid_x resid_y' + [../] + + [./solid_z] + type = WeakPlaneStress + variable = strain_zz + use_displaced_mesh = true + [../] +[] + +[AuxVariables] + [./resid_x] + [../] + [./resid_y] + [../] + [./D] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl0] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl1] + order = CONSTANT + family = MONOMIAL + [../] + + [./stress_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_zz] + order = CONSTANT + family = MONOMIAL + [../] + + [./strain_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./material_strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[AuxKernels] + [./D_auxk] + type = MaterialRealAux + property = elemental_damage_variable + variable = D + [../] + [./intnl0_auxk] + type = MaterialRealAux + property = damage_state_in_tension + variable = intnl0 + [../] + [./intnl1_auxk] + type = MaterialRealAux + property = damage_state_in_compression + variable = intnl1 + [../] + + [./stress_xx] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xx + index_i = 0 + index_j = 0 + [../] + [./stress_xy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xy + index_i = 0 + index_j = 1 + [../] + [./stress_yy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yy + index_i = 1 + index_j = 1 + [../] + [./stress_zz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_zz + index_i = 2 + index_j = 2 + [../] + + [./strain_xx] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xx + index_i = 0 + index_j = 0 + [../] + [./strain_xy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xy + index_i = 0 + index_j = 1 + [../] + [./strain_yy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_yy + index_i = 1 + index_j = 1 + [../] + [./strain_zz] + type = RankTwoAux + rank_two_tensor = total_strain + variable = material_strain_zz + index_i = 2 + index_j = 2 + [../] +[] + +[BCs] + [./left_x] + type = FunctionDirichletBC + variable = disp_x + boundary = 'left' + function = '0.' + [../] + [./y1] + type = FunctionDirichletBC + variable = disp_y + boundary = 'bottom' + function = '0.' + [../] + [./right_surface] + type = FunctionDirichletBC + variable = disp_x + boundary = 'right' + function = '1E-4*t' + [../] + [./top_surface] + type = FunctionDirichletBC + variable = disp_y + boundary = 'top' + function = '1E-4*t' + [../] +[] + +[Postprocessors] + [./displacement_x] + type = AverageNodalVariableValue + variable = disp_x + boundary = 'right' + [../] + [./s_xx] + type = ElementAverageValue + variable = stress_xx + [../] + # [./react_x] + # type = NodalSum + # variable = resid_x + # boundary = 'left' + # [../] +[] + +[Materials] + [./elasticity_tensor] + type = ComputeIsotropicElasticityTensor + youngs_modulus = 3.17E4 + poissons_ratio = 0.18 + [../] + [./stress] + type = ComputeMultipleInelasticDamageStress + inelastic_models = pdm + perform_finite_strain_rotations = false + tangent_operator = nonlinear + [../] + [./strain] + type = ComputePlaneIncrementalStrain + [../] + [./pdm] + type = DamagePlasticityStressUpdate + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + 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.40 + fracture_energy_in_compression = 1750E-2 + + yield_function_tol = 1.E-5 + tip_smoother = 1.E-6 + smoothing_tol = 1.E-3 + [../] +[] + +[Preconditioning] + active = SMP + [./SMP] + type = SMP + full = true + [../] + [./FDP] + type = FDP + full = true + [../] +[] + +[Executioner] + solve_type = 'NEWTON' + nl_max_its = 100 + nl_abs_tol = 1.E-5 + nl_rel_tol = 1E-3 + + line_search = none + + petsc_options_iname = '-pc_type' + petsc_options_value = 'lu' + + petsc_options = '-snes_converged_reason' + + type = Transient + end_time = 200 + dt = 1 +[] + + +[Outputs] + exodus = false + [./csv] + type = CSV + [../] +[] diff --git a/test/tests/damage_plasticity_model/plotting_SEM.py b/test/tests/damage_plasticity_model/plotting_SEM.py new file mode 100644 index 000000000..db3df4b9c --- /dev/null +++ b/test/tests/damage_plasticity_model/plotting_SEM.py @@ -0,0 +1,171 @@ +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 + +proj_dir = './test/tests/plastic_damage_model/' +# Tension test +uni_ten = pd.read_csv(proj_dir+'uni_ten_out.csv') +bi_ten = pd.read_csv(proj_dir+'bi_ten_out.csv') + +multiaxial1_ten = pd.read_csv(proj_dir+'multiaxial1_ten_out.csv') +multiaxial2_ten = pd.read_csv(proj_dir+'multiaxial2_ten_out.csv') + +# Mesh sensitivity test +uni_ten_msh_sen_1ele = pd.read_csv(proj_dir+'uni_ten_msh_sen_1ele_out.csv') +uni_ten_msh_sen_2ele = pd.read_csv(proj_dir+'uni_ten_msh_sen_2ele_out.csv') +uni_ten_msh_sen_4ele = pd.read_csv(proj_dir+'uni_ten_msh_sen_4ele_out.csv') + +# Compression test +uni_cmp = pd.read_csv(proj_dir+'uni_cmp_out.csv') +# bi_cmp = pd.read_csv(proj_dir+'bi_cmp_out.csv') + +multiaxial1_cmp = pd.read_csv(proj_dir+'multiaxial1_cmp_out.csv') +multiaxial2_cmp = pd.read_csv(proj_dir+'multiaxial2_cmp_out.csv') + +# Dilatancy test +uni_cmp_dila_ap_02 = pd.read_csv(proj_dir+'uni_cmp_dila_ap_02_out.csv') +uni_cmp_dila_ap_025 = pd.read_csv(proj_dir+'uni_cmp_dila_ap_025_out.csv') +uni_cmp_dila_ap_03 = pd.read_csv(proj_dir+'uni_cmp_dila_ap_03_out.csv') + +# Shear Cyclic Loading +shr_cyclic = pd.read_csv(proj_dir+'shr_cyclic_out.csv') + +# Calculation of volumetric strain for Dilatancy test +vol_strain_ap_02 = uni_cmp_dila_ap_02['e_xx'] + uni_cmp_dila_ap_02['e_yy'] + uni_cmp_dila_ap_02['e_zz'] + uni_cmp_dila_ap_02['max_ep'] + uni_cmp_dila_ap_02['mid_ep'] + uni_cmp_dila_ap_02['min_ep'] +vol_strain_ap_025 = uni_cmp_dila_ap_025['e_xx'] + uni_cmp_dila_ap_025['e_yy'] + uni_cmp_dila_ap_025['e_zz'] + uni_cmp_dila_ap_025['max_ep'] + uni_cmp_dila_ap_025['mid_ep'] + uni_cmp_dila_ap_025['min_ep'] +vol_strain_ap_03 = uni_cmp_dila_ap_03['e_xx'] + uni_cmp_dila_ap_03['e_yy'] + uni_cmp_dila_ap_03['e_zz'] + uni_cmp_dila_ap_03['max_ep'] + uni_cmp_dila_ap_03['mid_ep'] + uni_cmp_dila_ap_03['min_ep'] + +# Lee results +Lee_uni_ten = pd.read_csv(proj_dir+'gold/Lee_uni_ten.csv', header=None) +Lee_uni_cmp = pd.read_csv(proj_dir+'gold/Lee_uni_cmp.csv', header=None) +Lee_bi_ten = pd.read_csv(proj_dir+'gold/Lee_bi_ten.csv', header=None) +Lee_bi_cmp = pd.read_csv(proj_dir+'gold/Lee_bi_cmp.csv', header=None) +Lee_cyc_uni_ten = pd.read_csv(proj_dir+'gold/Lee_cyc_uni_ten.csv', header=None) +Lee_cyc_uni_cmp = pd.read_csv(proj_dir+'gold/Lee_uni_cmp.csv', header=None) +Lee_cyc_uni_ten_cmp = pd.read_csv(proj_dir+'gold/Lee_cyc_uni_ten_cmp.csv', header=None) +Lee_cyc_shr = pd.read_csv(proj_dir+'gold/Lee_cyc_shr.csv', header=None) +Lee_dila_ap_02 = pd.read_csv(proj_dir+'gold/Lee_dila_ap_02.csv', header=None) +Lee_dila_ap_025 = pd.read_csv(proj_dir+'gold/Lee_dila_ap_025.csv', header=None) +Lee_dila_ap_03 = pd.read_csv(proj_dir+'gold/Lee_dila_ap_03.csv', header=None) +Lee_uni_ten_msh_sen_2_elem = pd.read_csv(proj_dir+'gold/Lee_uni_ten_msh_sen_2_elem.csv', header=None) +Lee_uni_ten_msh_sen_4_elem = pd.read_csv(proj_dir+'gold/Lee_uni_ten_msh_sen_4_elem.csv', header=None) +Lee_uni_ten_msh_sen_8_elem = pd.read_csv(proj_dir+'gold/Lee_uni_ten_msh_sen_8_elem.csv', header=None) + +# function to put image +def place_image(im, loc=3, ax=None, zoom=1, **kw): + if ax==None: ax=plt.gca() + imagebox = OffsetImage(im, zoom=zoom*0.72) + ab = AnchoredOffsetbox(loc=loc, child=imagebox, frameon=False, **kw) + ax.add_artist(ab) + +## plotting Single Element Model (SEM) response +############################################################################# +SEM, SEM_ax = plt.subplots(2,2, 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.3) +# SEM.text(0.03, 0.5, 'Force [N]', va='center', rotation='vertical') +# SEM.text(0.5, 0.05, 'Deformation [mm]', ha='center') + +[i, j] = [0, 0] +SEM_ax[i][j].set_title('Multi-axial Tensile Loading', fontsize=11) +SEM_ax[i][j].plot(Lee_uni_ten[0]*1000, Lee_uni_ten[1], c = '0.6', linestyle ='solid', linewidth=1.0, label= 'Uniaxial (Lee)') +SEM_ax[i][j].plot(Lee_bi_ten[0]*1000, Lee_bi_ten[1], c = '0.6', linestyle ='dashdot', linewidth=1.0, label= 'Biaxial (Lee)') +# SEM_ax[i][j].plot(uni_ten['displacement_x']/25.4*1000, uni_ten['s_xx'], c = '0', linestyle ='solid', linewidth=1.0, label= 'Uniaxial') +# SEM_ax[i][j].plot(bi_ten['displacement_x']/25.4*1000, bi_ten['s_xx'], c = '0', linestyle ='dashdot', linewidth=1.0, label= 'Biaxial') +SEM_ax[i][j].plot(multiaxial1_ten['displacement_x']/25.4*1000, multiaxial1_ten['s_xx'], c = '0', linestyle ='solid', linewidth=1.0, label= 'Uniaxial') +SEM_ax[i][j].plot(multiaxial2_ten['displacement_x']/25.4*1000, multiaxial2_ten['s_xx'], c = '0', linestyle ='dashdot', linewidth=1.0, label= 'Biaxial') + +SEM_ax[i][j].grid(color="grey", ls = '--', lw = 0.5) +# SEM_ax[i][j].xaxis.set_minor_locator(MultipleLocator(0.2)) +# SEM_ax[i][j].yaxis.set_minor_locator(MultipleLocator(0.2)) +SEM_ax[i][j].set_xlabel("Strain [mm/m]") +SEM_ax[i][j].set_ylabel("Stress [MPa]") +# SEM_ax[i][j].set_xlim(0, 0.001) +# SEM_ax[i][j].set_ylim(0,0.15) +# STT_image = mpimg.imread('./test/tests/plastic_damage_model_2017/gold/STT.png') +# place_image(STT_image, loc='lower right', ax=SEM_ax[i][j], pad=0, zoom=0.18) +SEM_ax[i][j].legend(loc='upper right', facecolor = 'white', framealpha = 0.4, edgecolor ='none') + + +[i, j] = [0, 1] +SEM_ax[i][j].set_title('Multi-axial Compressive Loading', fontsize=11) +SEM_ax[i][j].plot(-1*Lee_uni_cmp[0]*1000, -1*Lee_uni_cmp[1], c = '0.6', linestyle ='solid', linewidth=1.0, label= 'Uniaxial (Lee)') +SEM_ax[i][j].plot(-1*Lee_bi_cmp[0]*1000, -1*Lee_bi_cmp[1], c = '0.6', linestyle ='dashdot', linewidth=1.0, label= 'Biaxial (Lee)') +SEM_ax[i][j].plot(-1*multiaxial1_cmp['displacement_x']/25.4*1000, -1*multiaxial1_cmp['s_xx'], c = '0', linestyle ='solid', linewidth=1.0, label= 'Uniaxial (Model)') +SEM_ax[i][j].plot(-1*multiaxial2_cmp['displacement_x']/25.4*1000, -1*multiaxial2_cmp['s_xx'], c = '0', linestyle ='dashdot', linewidth=1.0, label= 'Biaxial (Model)') +SEM_ax[i][j].grid(color="grey", ls = '--', lw = 0.5) +# SEM_ax[i][j].xaxis.set_minor_locator(MultipleLocator(0.2)) +# SEM_ax[i][j].yaxis.set_minor_locator(MultipleLocator(0.2)) +SEM_ax[i][j].set_ylabel("Stress [MPa]") +SEM_ax[i][j].set_xlabel("Strain [mm/m]") +# SEM_ax[i][j].set_xlim(0, 0.01) +# SEM_ax[i][j].set_ylim(0,35) +SEM_ax[i][j].legend(loc='lower center', facecolor = 'white', framealpha = 0.4, edgecolor ='none') + + +# [i, j] = [0, 2] +# SEM_ax[i][j].set_title('Shear Cyclic Loading', fontsize=11) +# SEM_ax[i][j].plot(Lee_cyc_shr[0], Lee_cyc_shr[1], c = '0.6', linestyle ='solid', linewidth=1.0, label= 'Uniaxial (Lee)') +# SEM_ax[i][j].plot(shr_cyclic['displacement_x']/25.4, shr_cyclic['s_xy'], c = '0', linestyle ='solid', linewidth=1.0, label= 'Uniaxial') +# SEM_ax[i][j].grid(color="grey", ls = '--', lw = 0.5) +# # SEM_ax[i][j].xaxis.set_minor_locator(MultipleLocator(0.2)) +# # SEM_ax[i][j].yaxis.set_minor_locator(MultipleLocator(0.2)) +# SEM_ax[i][j].set_xlabel("Strain [m/m]") +# SEM_ax[i][j].set_ylabel("Stress [MPa]") +# # SEM_ax[i][j].set_xlim(0, 0.001) +# # SEM_ax[i][j].set_ylim(0,0.15) +# # STT_image = mpimg.imread('./test/tests/plastic_damage_model_2017/gold/STT.png') +# # place_image(STT_image, loc='lower right', ax=SEM_ax[i][j], pad=0, zoom=0.18) +# SEM_ax[i][j].legend(loc='lower right', facecolor = 'white', framealpha = 0.4, edgecolor ='none') + + + +[i, j] = [1, 0] +SEM_ax[i][j].set_title('Mesh sensitivity', fontsize=11) +SEM_ax[i][j].plot(Lee_uni_ten_msh_sen_2_elem[0], Lee_uni_ten_msh_sen_2_elem[1], c = '0.6', linestyle ='solid', linewidth=1.0, label= '1 element (Lee)') +SEM_ax[i][j].plot(Lee_uni_ten_msh_sen_4_elem[0], Lee_uni_ten_msh_sen_4_elem[1], c = '0.6', linestyle ='dashdot', linewidth=1.0, label= '2 elements (Lee)') +SEM_ax[i][j].plot(Lee_uni_ten_msh_sen_8_elem[0], Lee_uni_ten_msh_sen_8_elem[1], c = '0.6', linestyle ='dashed', linewidth=1.0, label= '4 elements (Lee)') +SEM_ax[i][j].plot(uni_ten_msh_sen_1ele['displacement_x'], -1*uni_ten_msh_sen_1ele['react_x'], c = '0', linestyle ='solid', linewidth=1.0, label= '1 element (Model)') +SEM_ax[i][j].plot(uni_ten_msh_sen_2ele['displacement_x'], -1*uni_ten_msh_sen_2ele['react_x'], c = '0', linestyle ='dashdot', linewidth=1.0, label= '2 elements (Model)') +SEM_ax[i][j].plot(uni_ten_msh_sen_4ele['displacement_x'], -1*uni_ten_msh_sen_4ele['react_x'], c = '0', linestyle ='dashed', linewidth=1.0, label= '4 elements (Model)') +SEM_ax[i][j].grid(color="grey", ls = '--', lw = 0.5) +# SEM_ax[i][j].xaxis.set_minor_locator(MultipleLocator(0.2)) +# SEM_ax[i][j].yaxis.set_minor_locator(MultipleLocator(0.01)) +SEM_ax[i][j].set_ylabel("Force [N]") +SEM_ax[i][j].set_xlabel("Deformation [mm]") +SEM_ax[i][j].set_xlim(0, 0.02) +SEM_ax[i][j].set_ylim(0,90) +SEM_ax[i][j].legend(loc='upper right', facecolor = 'white', framealpha = 0.4, edgecolor ='none') + + +[i, j] = [1, 1] +SEM_ax[i][j].set_title('Dilatancy check', fontsize=11) +SEM_ax[i][j].plot(Lee_dila_ap_02[0]*1000, -1*Lee_dila_ap_02[1], c = '0.6', linestyle ='solid', linewidth=1.0, label= '$\\alpha_p$ = 0.20 (Lee)') +SEM_ax[i][j].plot(Lee_dila_ap_025[0]*1000, -1*Lee_dila_ap_025[1], c = '0.6', linestyle ='dashdot', linewidth=1.0, label= '$\\alpha_p$ = 0.25 (Lee)') +SEM_ax[i][j].plot(Lee_dila_ap_03[0]*1000, -1*Lee_dila_ap_03[1], c = '0.6', linestyle ='dashed', linewidth=1.0, label= '$\\alpha_p$ = 0.30 (Lee)') +SEM_ax[i][j].plot(vol_strain_ap_02*1000, -1*uni_cmp_dila_ap_02['s_xx'], c = '0', linestyle ='solid', linewidth=1.0, label= '$\\alpha_p$ = 0.12 (Model)') +SEM_ax[i][j].plot(vol_strain_ap_025*1000, -1*uni_cmp_dila_ap_025['s_xx'], c = '0', linestyle ='dashdot', linewidth=1.0, label= '$\\alpha_p$ = 0.15 (Model)') +SEM_ax[i][j].plot(vol_strain_ap_03*1000, -1*uni_cmp_dila_ap_03['s_xx'], c = '0', linestyle ='dashed', linewidth=1.0, label= '$\\alpha_p$ = 0.20 (Model)') +# SEM_ax[i][j].plot(Lee_dila_ap_02[0], -1*Lee_dila_ap_02[1], 'k', marker='o', ms=3, linewidth=1.0, label= '$\\alpha_p$ = 0.20 (Lee)') +# SEM_ax[i][j].plot(Lee_dila_ap_025[0], -1*Lee_dila_ap_025[1], 'r', marker='o', ms=3, linewidth=1.0, label= '$\\alpha_p$ = 0.25 (Lee)') +# SEM_ax[i][j].plot(Lee_dila_ap_03[0], -1*Lee_dila_ap_03[1], 'b', marker='o', ms=3, linewidth=1.0, label= '$\\alpha_p$ = 0.30 (Lee)') +# SEM_ax[i][j].plot(vol_strain_ap_02, -1*uni_cmp_dila_ap_02['s_xx'], 'k', linewidth=1.0, label= '$\\alpha_p$ = 0.12 (Model)') +# SEM_ax[i][j].plot(vol_strain_ap_025, -1*uni_cmp_dila_ap_025['s_xx'], 'r', linewidth=1.0, label= '$\\alpha_p$ = 0.15 (Model)') +# SEM_ax[i][j].plot(vol_strain_ap_03, -1*uni_cmp_dila_ap_03['s_xx'], 'b', linewidth=1.0, label= '$\\alpha_p$ = 0.20 (Model)') + +SEM_ax[i][j].grid(color="grey", ls = '--', lw = 0.5) +# SEM_ax[i][j].xaxis.set_minor_locator(MultipleLocator(0.2)) +# SEM_ax[i][j].yaxis.set_minor_locator(MultipleLocator(0.2)) +SEM_ax[i][j].set_ylabel("Stress [MPa]") +SEM_ax[i][j].set_xlabel("Strain [mm/m]") +SEM_ax[i][j].set_xlim(-1, 4) +# SEM_ax[i][j].set_ylim(0,0.15) +SEM_ax[i][j].legend(loc='upper right', facecolor = 'white', framealpha = 0.4, edgecolor ='none') + +plt.savefig(proj_dir+'dpm_results.png') +plt.show() diff --git a/test/tests/damage_plasticity_model/shr_cyclic.i b/test/tests/damage_plasticity_model/shr_cyclic.i new file mode 100644 index 000000000..5d40adeac --- /dev/null +++ b/test/tests/damage_plasticity_model/shr_cyclic.i @@ -0,0 +1,287 @@ +[Mesh] + type = GeneratedMesh + dim = 2 + nx = 1 + ny = 1 + xmin = -12.7 + xmax = 12.7 + ymin = -12.7 + ymax = 12.7 +[] + + +[GlobalParams] + displacements = 'disp_x disp_y' + volumetric_locking_correction = true + out_of_plane_strain = strain_zz +[] + +[Variables] + [./disp_x] + [../] + [./disp_y] + [../] + [./strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[Kernels] + [./TensorMechanics] + use_displaced_mesh = true + save_in = 'resid_x resid_y' + [../] + + [./solid_z] + type = WeakPlaneStress + variable = strain_zz + use_displaced_mesh = true + [../] +[] + +[AuxVariables] + [./resid_x] + [../] + [./resid_y] + [../] + [./D] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl0] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl1] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_zz] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./material_strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[AuxKernels] + [./D_auxk] + type = MaterialRealAux + property = elemental_damage_variable + variable = D + [../] + [./intnl0_auxk] + type = MaterialRealAux + property = damage_state_in_tension + variable = intnl0 + [../] + [./intnl1_auxk] + type = MaterialRealAux + property = damage_state_in_compression + variable = intnl1 + [../] + [./stress_xx] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xx + index_i = 0 + index_j = 0 + [../] + [./stress_xy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xy + index_i = 0 + index_j = 1 + [../] + [./stress_yy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yy + index_i = 1 + index_j = 1 + [../] + [./stress_zz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_zz + index_i = 2 + index_j = 2 + [../] + [./strain_xx] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xx + index_i = 0 + index_j = 0 + [../] + [./strain_xy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xy + index_i = 0 + index_j = 1 + [../] + [./strain_yy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_yy + index_i = 1 + index_j = 1 + [../] + [./strain_zz] + type = RankTwoAux + rank_two_tensor = total_strain + variable = material_strain_zz + index_i = 2 + index_j = 2 + [../] +[] + +[BCs] + [./disp_x_zero] + type = FunctionDirichletBC + variable = disp_x + # boundary = '1 4' + boundary = 'bottom' + function = '0.' + [../] + [./disp_y_zero] + type = FunctionDirichletBC + variable = disp_y + boundary = 'top bottom' + # boundary = '1 2 3 4' + function = '0.' + [../] + [./disp_x_loading] + type = FunctionDirichletBC + variable = disp_x + boundary = 'top' + # boundary = '2 3' + function = '1E-3*t' + [../] +[] + +[Postprocessors] + [./displacement_x] + type = AverageNodalVariableValue + variable = disp_x + boundary = 'top' + # boundary = '2 3' + [../] + [./eps_xy] + type = ElementAverageValue + variable = strain_xy + [../] + [./s_xy] + type = ElementAverageValue + variable = stress_xy + [../] + # [./react_x] + # type = NodalSum + # variable = resid_x + # boundary = 'left' + # [../] +[] + +[Materials] + [./elasticity_tensor] + type = ComputeIsotropicElasticityTensor + youngs_modulus = 3.1E4 + poissons_ratio = 0.18 + [../] + [./stress] + type = ComputeMultipleInelasticDamageStress + inelastic_models = pdm + perform_finite_strain_rotations = false + tangent_operator = nonlinear + [../] + [./strain] + type = ComputePlaneIncrementalStrain + [../] + [./pdm] + type = DamagePlasticityStressUpdate + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + 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 = 825E-3 + + yield_function_tol = 1.E-5 + tip_smoother = 1.E-6 + smoothing_tol = 1.E-3 + [../] +[] + +[Preconditioning] + active = SMP + [./SMP] + type = SMP + full = true + [../] + [./FDP] + type = FDP + full = true + [../] +[] + +[Executioner] + solve_type = 'NEWTON' + nl_max_its = 100 + nl_abs_tol = 1.E-5 + nl_rel_tol = 1E-3 + + line_search = none + + petsc_options_iname = '-pc_type' + petsc_options_value = 'lu' + + petsc_options = '-snes_converged_reason' + + type = Transient + end_time = 200 + dt = 0.2 +[] + + +[Outputs] + exodus = false + [./csv] + type = CSV + [../] +[] diff --git a/test/tests/damage_plasticity_model/uni_cmp.i b/test/tests/damage_plasticity_model/uni_cmp.i new file mode 100644 index 000000000..a537afd70 --- /dev/null +++ b/test/tests/damage_plasticity_model/uni_cmp.i @@ -0,0 +1,498 @@ +[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 +[] + +[Variables] + [./disp_x] + [../] + [./disp_y] + [../] + [./disp_z] + [../] +[] + +[Kernels] + [./TensorMechanics] + displacements = 'disp_x disp_y disp_z' + save_in = 'resid_x resid_y resid_z' + [../] +[] + +[AuxVariables] + [./resid_x] + [../] + [./resid_y] + [../] + [./resid_z] + [../] + [./stress_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xz] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yz] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_zz] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xz] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yz] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_zz] + order = CONSTANT + family = MONOMIAL + [../] + [./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] + [./stress_xx] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xx + index_i = 0 + index_j = 0 + [../] + [./stress_xy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xy + index_i = 0 + index_j = 1 + [../] + [./stress_xz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xz + index_i = 0 + index_j = 2 + [../] + [./stress_yy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yy + index_i = 1 + index_j = 1 + [../] + [./stress_yz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yz + index_i = 1 + index_j = 2 + [../] + [./stress_zz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_zz + index_i = 2 + index_j = 2 + [../] + [./strain_xx] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_xx + index_i = 0 + index_j = 0 + [../] + [./strain_xy] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_xy + index_i = 0 + index_j = 1 + [../] + [./strain_xz] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_xz + index_i = 0 + index_j = 2 + [../] + [./strain_yy] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_yy + index_i = 1 + index_j = 1 + [../] + [./strain_yz] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_yz + index_i = 1 + index_j = 2 + [../] + [./strain_zz] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_zz + index_i = 2 + index_j = 2 + [../] + [./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] + active ='react_x react_y react_z displacement_x' + [./react_x] + type = NodalSum + variable = resid_x + boundary = 'left' + [../] + [./react_y] + type = NodalSum + variable = resid_y + boundary = 'left' + [../] + [./react_z] + type = NodalSum + variable = resid_z + boundary = 'left' + [../] + [./displacement_x] + type = AverageNodalVariableValue + variable = disp_x + boundary = 'right' + [../] + [./s_xx] + type = PointValue + point = '0 0 0' + variable = stress_xx + [../] + [./s_xy] + type = PointValue + point = '0 0 0' + variable = stress_xy + [../] + [./s_xz] + type = PointValue + point = '0 0 0' + variable = stress_xz + [../] + [./s_yy] + type = PointValue + point = '0 0 0' + variable = stress_yy + [../] + [./s_yz] + type = PointValue + point = '0 0 0' + variable = stress_yz + [../] + [./s_zz] + type = PointValue + point = '0 0 0' + variable = stress_zz + [../] + [./e_xx] + type = PointValue + point = '0 0 0' + variable = strain_xx + [../] + [./e_xy] + type = PointValue + point = '0 0 0' + variable = strain_xy + [../] + [./e_xz] + type = PointValue + point = '0 0 0' + variable = strain_xz + [../] + [./e_yy] + type = PointValue + point = '0 0 0' + variable = strain_yy + [../] + [./e_yz] + type = PointValue + point = '0 0 0' + variable = strain_yz + [../] + [./e_zz] + type = PointValue + point = '0 0 0' + variable = strain_zz + [../] + [./max_ep] + type = PointValue + point = '0 0 0' + variable = max_ep + [../] + [./mid_ep] + type = PointValue + point = '0 0 0' + variable = mid_ep + [../] + [./min_ep] + type = PointValue + point = '0 0 0' + variable = min_ep + [../] + [./sigma0] + type = PointValue + point = '0 0 0' + variable = sigma0 + [../] + [./sigma1] + type = PointValue + point = '0 0 0' + variable = sigma1 + [../] + [./sigma2] + type = PointValue + point = '0 0 0' + variable = sigma2 + [../] + [./f0] + type = PointValue + point = '0 0 0' + variable = f0 + [../] + [./D] + type = PointValue + point = '0 0 0' + variable = D + [../] + [./intnl0] + type = PointValue + point = '0 0 0' + variable = intnl0 + [../] + [./intnl1] + type = PointValue + point = '0 0 0' + variable = intnl1 + [../] +[] + +[BCs] + [./x_r] + type = FunctionDirichletBC + variable = disp_x + boundary = 'right' + function = '-2E-5*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 + [../] + [./strain] + type = ComputeIncrementalSmallStrain + displacements = 'disp_x disp_y disp_z' + [../] + [./pdm] + # type = DamagePlasticityStressUpdate + # yield_function_tol = 1.E-5 + # alpha = 0.109 # fb0 = -19.47 + # alpha_p = 0.23 + # s0 = 0.001 + # + # at = 0.0001 # parameter to adjust yield strength + # Dt = 0.51 # degradation at half of maximum tensile strength + # ft = 3.48 # maximum yield strength + # gt = 4.8E-4 + # + # ac = 3.77 # parameter to adjust yield strength + # Dc = 0.40 # degradation at maximum compressive strength + # fc = 27.6 # maximum compressive strength of concrete + # gc = 6.889E-2 # + # + # tip_smoother = 1.E-6 + # smoothing_tol = 1.E-3 + + type = DamagePlasticityStressUpdate + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + factor_controlling_dilatancy = 0.12 + stiff_recovery_factor = 0.001 + + yield_strength_in_tension = 3.48 + ft_ep_slope_factor_at_zero_ep = 0.88 + tensile_damage_at_half_tensile_strength = 0.51 + fracture_energy_in_tension = 4.8E-4 + + 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 = pdm + perform_finite_strain_rotations = false + [../] +[] + +[Executioner] +# nl_abs_tol=1E-6 +# petsc_options_iname = '-pc_type' +# petsc_options_value = 'lu' + + end_time = 4000 + dt = 5 + type = Transient +[] + +[Outputs] + exodus = false + [./csv] + type = CSV + [../] +[] diff --git a/test/tests/damage_plasticity_model/uni_cmp_dila_ap2.i b/test/tests/damage_plasticity_model/uni_cmp_dila_ap2.i new file mode 100644 index 000000000..79f6192fc --- /dev/null +++ b/test/tests/damage_plasticity_model/uni_cmp_dila_ap2.i @@ -0,0 +1,498 @@ +[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 +[] + +[Variables] + [./disp_x] + [../] + [./disp_y] + [../] + [./disp_z] + [../] +[] + +[Kernels] + [./TensorMechanics] + displacements = 'disp_x disp_y disp_z' + save_in = 'resid_x resid_y resid_z' + [../] +[] + +[AuxVariables] + [./resid_x] + [../] + [./resid_y] + [../] + [./resid_z] + [../] + [./stress_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xz] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yz] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_zz] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xz] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yz] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_zz] + order = CONSTANT + family = MONOMIAL + [../] + [./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] + [./stress_xx] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xx + index_i = 0 + index_j = 0 + [../] + [./stress_xy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xy + index_i = 0 + index_j = 1 + [../] + [./stress_xz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xz + index_i = 0 + index_j = 2 + [../] + [./stress_yy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yy + index_i = 1 + index_j = 1 + [../] + [./stress_yz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yz + index_i = 1 + index_j = 2 + [../] + [./stress_zz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_zz + index_i = 2 + index_j = 2 + [../] + [./strain_xx] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_xx + index_i = 0 + index_j = 0 + [../] + [./strain_xy] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_xy + index_i = 0 + index_j = 1 + [../] + [./strain_xz] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_xz + index_i = 0 + index_j = 2 + [../] + [./strain_yy] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_yy + index_i = 1 + index_j = 1 + [../] + [./strain_yz] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_yz + index_i = 1 + index_j = 2 + [../] + [./strain_zz] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_zz + index_i = 2 + index_j = 2 + [../] + [./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] + # active ='react_x react_y react_z displacement_x' + [./react_x] + type = NodalSum + variable = resid_x + boundary = 'left' + [../] + [./react_y] + type = NodalSum + variable = resid_y + boundary = 'left' + [../] + [./react_z] + type = NodalSum + variable = resid_z + boundary = 'left' + [../] + [./displacement_x] + type = AverageNodalVariableValue + variable = disp_x + boundary = 'right' + [../] + [./s_xx] + type = PointValue + point = '0 0 0' + variable = stress_xx + [../] + [./s_xy] + type = PointValue + point = '0 0 0' + variable = stress_xy + [../] + [./s_xz] + type = PointValue + point = '0 0 0' + variable = stress_xz + [../] + [./s_yy] + type = PointValue + point = '0 0 0' + variable = stress_yy + [../] + [./s_yz] + type = PointValue + point = '0 0 0' + variable = stress_yz + [../] + [./s_zz] + type = PointValue + point = '0 0 0' + variable = stress_zz + [../] + [./e_xx] + type = PointValue + point = '0 0 0' + variable = strain_xx + [../] + [./e_xy] + type = PointValue + point = '0 0 0' + variable = strain_xy + [../] + [./e_xz] + type = PointValue + point = '0 0 0' + variable = strain_xz + [../] + [./e_yy] + type = PointValue + point = '0 0 0' + variable = strain_yy + [../] + [./e_yz] + type = PointValue + point = '0 0 0' + variable = strain_yz + [../] + [./e_zz] + type = PointValue + point = '0 0 0' + variable = strain_zz + [../] + [./max_ep] + type = PointValue + point = '0 0 0' + variable = max_ep + [../] + [./mid_ep] + type = PointValue + point = '0 0 0' + variable = mid_ep + [../] + [./min_ep] + type = PointValue + point = '0 0 0' + variable = min_ep + [../] + [./sigma0] + type = PointValue + point = '0 0 0' + variable = sigma0 + [../] + [./sigma1] + type = PointValue + point = '0 0 0' + variable = sigma1 + [../] + [./sigma2] + type = PointValue + point = '0 0 0' + variable = sigma2 + [../] + [./f0] + type = PointValue + point = '0 0 0' + variable = f0 + [../] + [./D] + type = PointValue + point = '0 0 0' + variable = D + [../] + [./intnl0] + type = PointValue + point = '0 0 0' + variable = intnl0 + [../] + [./intnl1] + type = PointValue + point = '0 0 0' + variable = intnl1 + [../] +[] + +[BCs] + [./x_r] + type = FunctionDirichletBC + variable = disp_x + boundary = 'right' + function = '-2E-5*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 + [../] + [./strain] + type = ComputeIncrementalSmallStrain + displacements = 'disp_x disp_y disp_z' + [../] + [./pdm] + # type = DamagePlasticityStressUpdate + # yield_function_tol = 1.E-5 + # alpha = 0.109 # fb0 = -19.47 + # alpha_p = 0.23 + # s0 = 0.001 + # + # at = 0.0001 # parameter to adjust yield strength + # Dt = 0.51 # degradation at half of maximum tensile strength + # ft = 3.48 # maximum yield strength + # gt = 4.8E-4 + # + # ac = 3.77 # parameter to adjust yield strength + # Dc = 0.40 # degradation at maximum compressive strength + # fc = 27.6 # maximum compressive strength of concrete + # gc = 6.889E-2 # + # + # tip_smoother = 1.E-6 + # smoothing_tol = 1.E-3 + + type = DamagePlasticityStressUpdate + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + factor_controlling_dilatancy = 0.12 + stiff_recovery_factor = 0.001 + + yield_strength_in_tension = 3.48 + ft_ep_slope_factor_at_zero_ep = 0.88 + tensile_damage_at_half_tensile_strength = 0.51 + fracture_energy_in_tension = 4.8E-4 + + yield_strength_in_compression = 18.30 + maximum_strength_in_compression = 27.60 + compressive_damage_at_max_compressive_strength = 0.40 + 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 = pdm + perform_finite_strain_rotations = false + [../] +[] + +[Executioner] +# nl_abs_tol=1E-6 +# petsc_options_iname = '-pc_type' +# petsc_options_value = 'lu' + + end_time = 4000 + dt = 5 + type = Transient +[] + +[Outputs] + exodus = false + [./csv] + type = CSV + [../] +[] diff --git a/test/tests/damage_plasticity_model/uni_cmp_dila_ap25.i b/test/tests/damage_plasticity_model/uni_cmp_dila_ap25.i new file mode 100644 index 000000000..7461d364b --- /dev/null +++ b/test/tests/damage_plasticity_model/uni_cmp_dila_ap25.i @@ -0,0 +1,498 @@ +[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 +[] + +[Variables] + [./disp_x] + [../] + [./disp_y] + [../] + [./disp_z] + [../] +[] + +[Kernels] + [./TensorMechanics] + displacements = 'disp_x disp_y disp_z' + save_in = 'resid_x resid_y resid_z' + [../] +[] + +[AuxVariables] + [./resid_x] + [../] + [./resid_y] + [../] + [./resid_z] + [../] + [./stress_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xz] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yz] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_zz] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xz] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yz] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_zz] + order = CONSTANT + family = MONOMIAL + [../] + [./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] + [./stress_xx] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xx + index_i = 0 + index_j = 0 + [../] + [./stress_xy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xy + index_i = 0 + index_j = 1 + [../] + [./stress_xz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xz + index_i = 0 + index_j = 2 + [../] + [./stress_yy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yy + index_i = 1 + index_j = 1 + [../] + [./stress_yz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yz + index_i = 1 + index_j = 2 + [../] + [./stress_zz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_zz + index_i = 2 + index_j = 2 + [../] + [./strain_xx] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_xx + index_i = 0 + index_j = 0 + [../] + [./strain_xy] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_xy + index_i = 0 + index_j = 1 + [../] + [./strain_xz] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_xz + index_i = 0 + index_j = 2 + [../] + [./strain_yy] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_yy + index_i = 1 + index_j = 1 + [../] + [./strain_yz] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_yz + index_i = 1 + index_j = 2 + [../] + [./strain_zz] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_zz + index_i = 2 + index_j = 2 + [../] + [./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] + # active ='react_x react_y react_z displacement_x' + [./react_x] + type = NodalSum + variable = resid_x + boundary = 'left' + [../] + [./react_y] + type = NodalSum + variable = resid_y + boundary = 'left' + [../] + [./react_z] + type = NodalSum + variable = resid_z + boundary = 'left' + [../] + [./displacement_x] + type = AverageNodalVariableValue + variable = disp_x + boundary = 'right' + [../] + [./s_xx] + type = PointValue + point = '0 0 0' + variable = stress_xx + [../] + [./s_xy] + type = PointValue + point = '0 0 0' + variable = stress_xy + [../] + [./s_xz] + type = PointValue + point = '0 0 0' + variable = stress_xz + [../] + [./s_yy] + type = PointValue + point = '0 0 0' + variable = stress_yy + [../] + [./s_yz] + type = PointValue + point = '0 0 0' + variable = stress_yz + [../] + [./s_zz] + type = PointValue + point = '0 0 0' + variable = stress_zz + [../] + [./e_xx] + type = PointValue + point = '0 0 0' + variable = strain_xx + [../] + [./e_xy] + type = PointValue + point = '0 0 0' + variable = strain_xy + [../] + [./e_xz] + type = PointValue + point = '0 0 0' + variable = strain_xz + [../] + [./e_yy] + type = PointValue + point = '0 0 0' + variable = strain_yy + [../] + [./e_yz] + type = PointValue + point = '0 0 0' + variable = strain_yz + [../] + [./e_zz] + type = PointValue + point = '0 0 0' + variable = strain_zz + [../] + [./max_ep] + type = PointValue + point = '0 0 0' + variable = max_ep + [../] + [./mid_ep] + type = PointValue + point = '0 0 0' + variable = mid_ep + [../] + [./min_ep] + type = PointValue + point = '0 0 0' + variable = min_ep + [../] + [./sigma0] + type = PointValue + point = '0 0 0' + variable = sigma0 + [../] + [./sigma1] + type = PointValue + point = '0 0 0' + variable = sigma1 + [../] + [./sigma2] + type = PointValue + point = '0 0 0' + variable = sigma2 + [../] + [./f0] + type = PointValue + point = '0 0 0' + variable = f0 + [../] + [./D] + type = PointValue + point = '0 0 0' + variable = D + [../] + [./intnl0] + type = PointValue + point = '0 0 0' + variable = intnl0 + [../] + [./intnl1] + type = PointValue + point = '0 0 0' + variable = intnl1 + [../] +[] + +[BCs] + [./x_r] + type = FunctionDirichletBC + variable = disp_x + boundary = 'right' + function = '-2E-5*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 + [../] + [./strain] + type = ComputeIncrementalSmallStrain + displacements = 'disp_x disp_y disp_z' + [../] + [./pdm] + # type = DamagePlasticityStressUpdate + # yield_function_tol = 1.E-5 + # alpha = 0.109 # fb0 = -19.47 + # alpha_p = 0.23 + # s0 = 0.001 + # + # at = 0.0001 # parameter to adjust yield strength + # Dt = 0.51 # degradation at half of maximum tensile strength + # ft = 3.48 # maximum yield strength + # gt = 4.8E-4 + # + # ac = 3.77 # parameter to adjust yield strength + # Dc = 0.40 # degradation at maximum compressive strength + # fc = 27.6 # maximum compressive strength of concrete + # gc = 6.889E-2 # + # + # tip_smoother = 1.E-6 + # smoothing_tol = 1.E-3 + + type = DamagePlasticityStressUpdate + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + factor_controlling_dilatancy = 0.155 + stiff_recovery_factor = 0.001 + + yield_strength_in_tension = 3.48 + ft_ep_slope_factor_at_zero_ep = 0.88 + tensile_damage_at_half_tensile_strength = 0.51 + fracture_energy_in_tension = 4.8E-4 + + yield_strength_in_compression = 18.30 + maximum_strength_in_compression = 27.60 + compressive_damage_at_max_compressive_strength = 0.40 + 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 = pdm + perform_finite_strain_rotations = false + [../] +[] + +[Executioner] +# nl_abs_tol=1E-6 +# petsc_options_iname = '-pc_type' +# petsc_options_value = 'lu' + + end_time = 4000 + dt = 5 + type = Transient +[] + +[Outputs] + exodus = false + [./csv] + type = CSV + [../] +[] diff --git a/test/tests/damage_plasticity_model/uni_cmp_dila_ap3.i b/test/tests/damage_plasticity_model/uni_cmp_dila_ap3.i new file mode 100644 index 000000000..76e72ec05 --- /dev/null +++ b/test/tests/damage_plasticity_model/uni_cmp_dila_ap3.i @@ -0,0 +1,498 @@ +[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 +[] + +[Variables] + [./disp_x] + [../] + [./disp_y] + [../] + [./disp_z] + [../] +[] + +[Kernels] + [./TensorMechanics] + displacements = 'disp_x disp_y disp_z' + save_in = 'resid_x resid_y resid_z' + [../] +[] + +[AuxVariables] + [./resid_x] + [../] + [./resid_y] + [../] + [./resid_z] + [../] + [./stress_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xz] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yz] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_zz] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xz] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yz] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_zz] + order = CONSTANT + family = MONOMIAL + [../] + [./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] + [./stress_xx] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xx + index_i = 0 + index_j = 0 + [../] + [./stress_xy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xy + index_i = 0 + index_j = 1 + [../] + [./stress_xz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xz + index_i = 0 + index_j = 2 + [../] + [./stress_yy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yy + index_i = 1 + index_j = 1 + [../] + [./stress_yz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yz + index_i = 1 + index_j = 2 + [../] + [./stress_zz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_zz + index_i = 2 + index_j = 2 + [../] + [./strain_xx] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_xx + index_i = 0 + index_j = 0 + [../] + [./strain_xy] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_xy + index_i = 0 + index_j = 1 + [../] + [./strain_xz] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_xz + index_i = 0 + index_j = 2 + [../] + [./strain_yy] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_yy + index_i = 1 + index_j = 1 + [../] + [./strain_yz] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_yz + index_i = 1 + index_j = 2 + [../] + [./strain_zz] + type = RankTwoAux + rank_two_tensor = elastic_strain + variable = strain_zz + index_i = 2 + index_j = 2 + [../] + [./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] + # active ='react_x react_y react_z displacement_x' + [./react_x] + type = NodalSum + variable = resid_x + boundary = 'left' + [../] + [./react_y] + type = NodalSum + variable = resid_y + boundary = 'left' + [../] + [./react_z] + type = NodalSum + variable = resid_z + boundary = 'left' + [../] + [./displacement_x] + type = AverageNodalVariableValue + variable = disp_x + boundary = 'right' + [../] + [./s_xx] + type = PointValue + point = '0 0 0' + variable = stress_xx + [../] + [./s_xy] + type = PointValue + point = '0 0 0' + variable = stress_xy + [../] + [./s_xz] + type = PointValue + point = '0 0 0' + variable = stress_xz + [../] + [./s_yy] + type = PointValue + point = '0 0 0' + variable = stress_yy + [../] + [./s_yz] + type = PointValue + point = '0 0 0' + variable = stress_yz + [../] + [./s_zz] + type = PointValue + point = '0 0 0' + variable = stress_zz + [../] + [./e_xx] + type = PointValue + point = '0 0 0' + variable = strain_xx + [../] + [./e_xy] + type = PointValue + point = '0 0 0' + variable = strain_xy + [../] + [./e_xz] + type = PointValue + point = '0 0 0' + variable = strain_xz + [../] + [./e_yy] + type = PointValue + point = '0 0 0' + variable = strain_yy + [../] + [./e_yz] + type = PointValue + point = '0 0 0' + variable = strain_yz + [../] + [./e_zz] + type = PointValue + point = '0 0 0' + variable = strain_zz + [../] + [./max_ep] + type = PointValue + point = '0 0 0' + variable = max_ep + [../] + [./mid_ep] + type = PointValue + point = '0 0 0' + variable = mid_ep + [../] + [./min_ep] + type = PointValue + point = '0 0 0' + variable = min_ep + [../] + [./sigma0] + type = PointValue + point = '0 0 0' + variable = sigma0 + [../] + [./sigma1] + type = PointValue + point = '0 0 0' + variable = sigma1 + [../] + [./sigma2] + type = PointValue + point = '0 0 0' + variable = sigma2 + [../] + [./f0] + type = PointValue + point = '0 0 0' + variable = f0 + [../] + [./D] + type = PointValue + point = '0 0 0' + variable = D + [../] + [./intnl0] + type = PointValue + point = '0 0 0' + variable = intnl0 + [../] + [./intnl1] + type = PointValue + point = '0 0 0' + variable = intnl1 + [../] +[] + +[BCs] + [./x_r] + type = FunctionDirichletBC + variable = disp_x + boundary = 'right' + function = '-2E-5*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 + [../] + [./strain] + type = ComputeIncrementalSmallStrain + displacements = 'disp_x disp_y disp_z' + [../] + [./pdm] + # type = DamagePlasticityStressUpdate + # yield_function_tol = 1.E-5 + # alpha = 0.109 # fb0 = -19.47 + # alpha_p = 0.23 + # s0 = 0.001 + # + # at = 0.0001 # parameter to adjust yield strength + # Dt = 0.51 # degradation at half of maximum tensile strength + # ft = 3.48 # maximum yield strength + # gt = 4.8E-4 + # + # ac = 3.77 # parameter to adjust yield strength + # Dc = 0.40 # degradation at maximum compressive strength + # fc = 27.6 # maximum compressive strength of concrete + # gc = 6.889E-2 # + # + # tip_smoother = 1.E-6 + # smoothing_tol = 1.E-3 + + type = DamagePlasticityStressUpdate + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + factor_controlling_dilatancy = 0.195 + stiff_recovery_factor = 0.001 + + yield_strength_in_tension = 3.48 + ft_ep_slope_factor_at_zero_ep = 0.88 + tensile_damage_at_half_tensile_strength = 0.51 + fracture_energy_in_tension = 4.8E-4 + + yield_strength_in_compression = 18.30 + maximum_strength_in_compression = 27.60 + compressive_damage_at_max_compressive_strength = 0.40 + 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 = pdm + perform_finite_strain_rotations = false + [../] +[] + +[Executioner] +# nl_abs_tol=1E-6 +# petsc_options_iname = '-pc_type' +# petsc_options_value = 'lu' + + end_time = 4000 + dt = 5 + type = Transient +[] + +[Outputs] + exodus = false + [./csv] + type = CSV + [../] +[] diff --git a/test/tests/damage_plasticity_model/uni_ten.i b/test/tests/damage_plasticity_model/uni_ten.i new file mode 100644 index 000000000..e0d3b3b2c --- /dev/null +++ b/test/tests/damage_plasticity_model/uni_ten.i @@ -0,0 +1,301 @@ +[Mesh] + [gmg] + type = GeneratedMeshGenerator + dim = 2 + nx = 1 + ny = 1 + + xmin = -12.7 + xmax = 12.7 + + ymin = -12.7 + ymax = 12.7 + [] + [./subdomains] + type = SubdomainBoundingBoxGenerator + input = gmg + bottom_left = '0 12.7 0' + top_right = '12.7 -12.7 0' + block_id = '1' + location = INSIDE + [] + [./extra_nodeset1] + type = ExtraNodesetGenerator + input = subdomains + new_boundary = 'bottom_left' + coord = '-12.7 -12.7' + [] + [./extra_nodeset2] + type = ExtraNodesetGenerator + input = extra_nodeset1 + new_boundary = 'top_left' + coord = '-12.7 12.7' + [] +[] + +[GlobalParams] + displacements = 'disp_x disp_y' + volumetric_locking_correction = true + out_of_plane_strain = strain_zz +[] + +[Variables] + [./disp_x] + [../] + [./disp_y] + [../] + [./strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[Kernels] + [./TensorMechanics] + use_displaced_mesh = true + save_in = 'resid_x resid_y' + [../] + + [./solid_z] + type = WeakPlaneStress + variable = strain_zz + use_displaced_mesh = true + [../] +[] + +[AuxVariables] + [./resid_x] + [../] + [./resid_y] + [../] + [./D] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl0] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl1] + order = CONSTANT + family = MONOMIAL + [../] + + [./stress_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_zz] + order = CONSTANT + family = MONOMIAL + [../] + + [./strain_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./material_strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[AuxKernels] + [./D_auxk] + type = MaterialRealAux + property = elemental_damage_variable + variable = D + [../] + [./intnl0_auxk] + type = MaterialRealAux + property = damage_state_in_tension + variable = intnl0 + [../] + [./intnl1_auxk] + type = MaterialRealAux + property = damage_state_in_compression + variable = intnl1 + [../] + + [./stress_xx] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xx + index_i = 0 + index_j = 0 + [../] + [./stress_xy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xy + index_i = 0 + index_j = 1 + [../] + [./stress_yy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yy + index_i = 1 + index_j = 1 + [../] + [./stress_zz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_zz + index_i = 2 + index_j = 2 + [../] + + [./strain_xx] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xx + index_i = 0 + index_j = 0 + [../] + [./strain_xy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xy + index_i = 0 + index_j = 1 + [../] + [./strain_yy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_yy + index_i = 1 + index_j = 1 + [../] + [./strain_zz] + type = RankTwoAux + rank_two_tensor = total_strain + variable = material_strain_zz + index_i = 2 + index_j = 2 + [../] +[] + +[BCs] + [./left_x] + type = FunctionDirichletBC + variable = disp_x + boundary = 'left' + function = '0.' + [../] + [./y1] + type = FunctionDirichletBC + variable = disp_y + boundary = 'bottom_left' + function = '0.' + [../] + [./right_surface] + type = FunctionDirichletBC + variable = disp_x + boundary = 'right' + function = '1E-4*t' + [../] +[] + +[Postprocessors] + [./displacement_x] + type = AverageNodalVariableValue + variable = disp_x + boundary = 'right' + [../] + [./s_xx] + type = ElementAverageValue + variable = stress_xx + [../] +[] + +[Materials] + [./elasticity_tensor] + type = ComputeIsotropicElasticityTensor + youngs_modulus = 3.17E4 + poissons_ratio = 0.18 + [../] + [./stress] + type = ComputeMultipleInelasticDamageStress + inelastic_models = pdm + perform_finite_strain_rotations = false + tangent_operator = nonlinear + [../] + [./strain] + type = ComputePlaneIncrementalStrain + [../] + [./pdm] + type = DamagePlasticityStressUpdate + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + 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.40 + fracture_energy_in_compression = 1750E-2 + + yield_function_tol = 1.E-5 + tip_smoother = 1.E-6 + smoothing_tol = 1.E-3 + [../] +[] + +[Preconditioning] + active = SMP + [./SMP] + type = SMP + full = true + [../] + [./FDP] + type = FDP + full = true + [../] +[] + +[Executioner] + solve_type = 'NEWTON' + nl_max_its = 100 + nl_abs_tol = 1.E-5 + nl_rel_tol = 1E-3 + + line_search = none + + petsc_options_iname = '-pc_type' + petsc_options_value = 'lu' + + petsc_options = '-snes_converged_reason' + + type = Transient + end_time = 200 + dt = 1 +[] + + +[Outputs] + exodus = false + [./csv] + type = CSV + [../] +[] diff --git a/test/tests/damage_plasticity_model/uni_ten_msh_sen_1ele.i b/test/tests/damage_plasticity_model/uni_ten_msh_sen_1ele.i new file mode 100644 index 000000000..1a1b57de2 --- /dev/null +++ b/test/tests/damage_plasticity_model/uni_ten_msh_sen_1ele.i @@ -0,0 +1,298 @@ +[Mesh] + [gmg] + type = GeneratedMeshGenerator + dim = 2 + nx = 1 + ny = 1 + + xmin = -25.4 + xmax = 25.4 + + ymin = -12.7 + ymax = 12.7 + [] + [./extra_nodeset1] + type = ExtraNodesetGenerator + input = gmg + new_boundary = 'bottom_left' + coord = '-25.4 -12.7' + [] + [./extra_nodeset2] + type = ExtraNodesetGenerator + input = extra_nodeset1 + new_boundary = 'top_left' + coord = '-25.4 12.7' + [] +[] + +[GlobalParams] + displacements = 'disp_x disp_y' + volumetric_locking_correction = true + out_of_plane_strain = strain_zz +[] + +[Variables] + [./disp_x] + [../] + [./disp_y] + [../] + [./strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[Kernels] + [./TensorMechanics] + use_displaced_mesh = true + save_in = 'resid_x resid_y' + [../] + + [./solid_z] + type = WeakPlaneStress + variable = strain_zz + use_displaced_mesh = true + [../] +[] + +[AuxVariables] + [./resid_x] + [../] + [./resid_y] + [../] + [./D] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl0] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl1] + order = CONSTANT + family = MONOMIAL + [../] + + [./stress_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_zz] + order = CONSTANT + family = MONOMIAL + [../] + + [./strain_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./material_strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[AuxKernels] + [./D_auxk] + type = MaterialRealAux + property = elemental_damage_variable + variable = D + [../] + [./intnl0_auxk] + type = MaterialRealAux + property = damage_state_in_tension + variable = intnl0 + [../] + [./intnl1_auxk] + type = MaterialRealAux + property = damage_state_in_compression + variable = intnl1 + [../] + + [./stress_xx] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xx + index_i = 0 + index_j = 0 + [../] + [./stress_xy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xy + index_i = 0 + index_j = 1 + [../] + [./stress_yy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yy + index_i = 1 + index_j = 1 + [../] + [./stress_zz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_zz + index_i = 2 + index_j = 2 + [../] + + [./strain_xx] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xx + index_i = 0 + index_j = 0 + [../] + [./strain_xy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xy + index_i = 0 + index_j = 1 + [../] + [./strain_yy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_yy + index_i = 1 + index_j = 1 + [../] + [./strain_zz] + type = RankTwoAux + rank_two_tensor = total_strain + variable = material_strain_zz + index_i = 2 + index_j = 2 + [../] +[] + +[BCs] + [./left_x] + type = FunctionDirichletBC + variable = disp_x + boundary = 'left' + function = '0.' + [../] + [./y1] + type = FunctionDirichletBC + variable = disp_y + boundary = 'bottom_left' + function = '0.' + [../] + [./right_surface] + type = FunctionDirichletBC + variable = disp_x + boundary = 'right' + function = '1E-4*t' + [../] +[] + +[Postprocessors] + [./displacement_x] + type = AverageNodalVariableValue + variable = disp_x + boundary = 'right' + [../] + [./react_x] + type = NodalSum + variable = resid_x + boundary = 'left' + [../] +[] + +[Materials] + [./elasticity_tensor_right] + type = ComputeIsotropicElasticityTensor + block = '0' + youngs_modulus = 3.17E4 + poissons_ratio = 0.18 + [../] + [./stress_right] + type = ComputeMultipleInelasticDamageStress + block = '0' + inelastic_models = pdm_right + perform_finite_strain_rotations = false + tangent_operator = nonlinear + [../] + [./strain_right] + type = ComputePlaneIncrementalStrain + block = '0' + [../] + [./pdm_right] + type = DamagePlasticityStressUpdate + block = '0' + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + factor_controlling_dilatancy = 0.23 + stiff_recovery_factor = 0.001 + + yield_strength_in_tension = 3.40 + ft_ep_slope_factor_at_zero_ep = 0.90 + tensile_damage_at_half_tensile_strength = 0.27 + fracture_energy_in_tension = 25E-3 #4.8E-4 + + yield_strength_in_compression = 18.30 + maximum_strength_in_compression = 27.60 + compressive_damage_at_max_compressive_strength = 0.40 + fracture_energy_in_compression = 6.889E-2 + + yield_function_tol = 1.E-5 + tip_smoother = 1.E-6 + smoothing_tol = 1.E-3 + [../] +[] + +[Preconditioning] + active = SMP + [./SMP] + type = SMP + full = true + [../] + [./FDP] + type = FDP + full = true + [../] +[] + +[Executioner] + solve_type = 'NEWTON' + nl_max_its = 100 + nl_abs_tol = 1.E-5 + nl_rel_tol = 1E-3 + + line_search = none + + petsc_options_iname = '-pc_type' + petsc_options_value = 'lu' + + petsc_options = '-snes_converged_reason' + + type = Transient + end_time = 200 + dt = 1 +[] + + +[Outputs] + exodus = false + [./csv] + type = CSV + [../] +[] diff --git a/test/tests/damage_plasticity_model/uni_ten_msh_sen_2ele.i b/test/tests/damage_plasticity_model/uni_ten_msh_sen_2ele.i new file mode 100644 index 000000000..6d5efed55 --- /dev/null +++ b/test/tests/damage_plasticity_model/uni_ten_msh_sen_2ele.i @@ -0,0 +1,343 @@ +[Mesh] + [gmg] + type = GeneratedMeshGenerator + dim = 2 + nx = 2 + ny = 1 + + xmin = -25.4 + xmax = 25.4 + + ymin = -12.7 + ymax = 12.7 + [] + [./subdomains] + type = SubdomainBoundingBoxGenerator + input = gmg + bottom_left = '0 12.7 0' + top_right = '25.4 -12.7 0' + block_id = '1' + location = INSIDE + [] + [./extra_nodeset1] + type = ExtraNodesetGenerator + input = subdomains + new_boundary = 'bottom_left' + coord = '-25.4 -12.7' + [] + [./extra_nodeset2] + type = ExtraNodesetGenerator + input = extra_nodeset1 + new_boundary = 'top_left' + coord = '-25.4 12.7' + [] +[] + +[GlobalParams] + displacements = 'disp_x disp_y' + volumetric_locking_correction = true + out_of_plane_strain = strain_zz +[] + +[Variables] + [./disp_x] + [../] + [./disp_y] + [../] + [./strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[Kernels] + [./TensorMechanics] + use_displaced_mesh = true + save_in = 'resid_x resid_y' + [../] + + [./solid_z] + type = WeakPlaneStress + variable = strain_zz + use_displaced_mesh = true + [../] +[] + +[AuxVariables] + [./resid_x] + [../] + [./resid_y] + [../] + [./D] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl0] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl1] + order = CONSTANT + family = MONOMIAL + [../] + + [./stress_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_zz] + order = CONSTANT + family = MONOMIAL + [../] + + [./strain_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./material_strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[AuxKernels] + [./D_auxk] + type = MaterialRealAux + property = elemental_damage_variable + variable = D + [../] + [./intnl0_auxk] + type = MaterialRealAux + property = damage_state_in_tension + variable = intnl0 + [../] + [./intnl1_auxk] + type = MaterialRealAux + property = damage_state_in_compression + variable = intnl1 + [../] + + [./stress_xx] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xx + index_i = 0 + index_j = 0 + [../] + [./stress_xy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xy + index_i = 0 + index_j = 1 + [../] + [./stress_yy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yy + index_i = 1 + index_j = 1 + [../] + [./stress_zz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_zz + index_i = 2 + index_j = 2 + [../] + + [./strain_xx] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xx + index_i = 0 + index_j = 0 + [../] + [./strain_xy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xy + index_i = 0 + index_j = 1 + [../] + [./strain_yy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_yy + index_i = 1 + index_j = 1 + [../] + [./strain_zz] + type = RankTwoAux + rank_two_tensor = total_strain + variable = material_strain_zz + index_i = 2 + index_j = 2 + [../] +[] + +[BCs] + [./left_x] + type = FunctionDirichletBC + variable = disp_x + boundary = 'left' + function = '0.' + [../] + [./y1] + type = FunctionDirichletBC + variable = disp_y + boundary = 'bottom_left' + function = '0.' + [../] + [./right_surface] + type = FunctionDirichletBC + variable = disp_x + boundary = 'right' + function = '1E-4*t' + [../] +[] + +[Postprocessors] + [./displacement_x] + type = AverageNodalVariableValue + variable = disp_x + boundary = 'right' + [../] + [./react_x] + type = NodalSum + variable = resid_x + boundary = 'left' + [../] +[] + +[Materials] + [./elasticity_tensor_left] + type = ComputeIsotropicElasticityTensor + block = '0' + youngs_modulus = 3.17E4 + poissons_ratio = 0.18 + [../] + [./stress_left] + type = ComputeMultipleInelasticDamageStress + block = '0' + inelastic_models = pdm_left + perform_finite_strain_rotations = false + tangent_operator = nonlinear + [../] + [./strain_left] + type = ComputePlaneIncrementalStrain + block = '0' + [../] + [./pdm_left] + type = DamagePlasticityStressUpdate + block = '0' + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + factor_controlling_dilatancy = 0.23 + stiff_recovery_factor = 0.001 + + yield_strength_in_tension = 3.48 + ft_ep_slope_factor_at_zero_ep = 0.90 + tensile_damage_at_half_tensile_strength = 0.27 + fracture_energy_in_tension = 25E-3 #4.8E-4 + + maximum_strength_in_compression = 18.30 + maximum_strength_in_compression = 27.60 + compressive_damage_at_max_compressive_strength = 0.40 + fracture_energy_in_compression = 6.889E-2 + + yield_function_tol = 1.E-5 + tip_smoother = 1.E-6 + smoothing_tol = 1.E-3 + [../] + [./elasticity_tensor_right] + type = ComputeIsotropicElasticityTensor + block = '1' + youngs_modulus = 3.17E4 + poissons_ratio = 0.18 + [../] + [./stress_right] + type = ComputeMultipleInelasticDamageStress + block = '1' + inelastic_models = pdm_right + perform_finite_strain_rotations = false + tangent_operator = nonlinear + [../] + [./strain_right] + type = ComputePlaneIncrementalStrain + block = '1' + [../] + [./pdm_right] + type = DamagePlasticityStressUpdate + block = '1' + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + factor_controlling_dilatancy = 0.23 + stiff_recovery_factor = 0.001 + + yield_strength_in_tension = 3.40 + ft_ep_slope_factor_at_zero_ep = 0.90 + tensile_damage_at_half_tensile_strength = 0.27 + fracture_energy_in_tension = 25E-3 #4.8E-4 + + yield_strength_in_compression = 18.30 + maximum_strength_in_compression = 27.60 + compressive_damage_at_max_compressive_strength = 0.40 + fracture_energy_in_compression = 6.889E-2 + + yield_function_tol = 1.E-5 + tip_smoother = 1.E-6 + smoothing_tol = 1.E-3 + [../] +[] + +[Preconditioning] + active = SMP + [./SMP] + type = SMP + full = true + [../] + [./FDP] + type = FDP + full = true + [../] +[] + +[Executioner] + solve_type = 'NEWTON' + nl_max_its = 100 + nl_abs_tol = 1.E-5 + nl_rel_tol = 1E-3 + + line_search = none + + petsc_options_iname = '-pc_type' + petsc_options_value = 'lu' + + petsc_options = '-snes_converged_reason' + + type = Transient + end_time = 200 + dt = 1 +[] + +[Outputs] + exodus = false + [./csv] + type = CSV + [../] +[] diff --git a/test/tests/damage_plasticity_model/uni_ten_msh_sen_4ele.i b/test/tests/damage_plasticity_model/uni_ten_msh_sen_4ele.i new file mode 100644 index 000000000..81285b97c --- /dev/null +++ b/test/tests/damage_plasticity_model/uni_ten_msh_sen_4ele.i @@ -0,0 +1,344 @@ +[Mesh] + [gmg] + type = GeneratedMeshGenerator + dim = 2 + nx = 4 + ny = 1 + + xmin = -25.4 + xmax = 25.4 + + ymin = -12.7 + ymax = 12.7 + [] + [./subdomains] + type = SubdomainBoundingBoxGenerator + input = gmg + bottom_left = '12.7 12.7 0' + top_right = '25.4 -12.7 0' + block_id = '1' + location = INSIDE + [] + [./extra_nodeset1] + type = ExtraNodesetGenerator + input = subdomains + new_boundary = 'bottom_left' + coord = '-25.4 -12.7' + [] + [./extra_nodeset2] + type = ExtraNodesetGenerator + input = extra_nodeset1 + new_boundary = 'top_left' + coord = '-25.4 12.7' + [] +[] + +[GlobalParams] + displacements = 'disp_x disp_y' + volumetric_locking_correction = true + out_of_plane_strain = strain_zz +[] + +[Variables] + [./disp_x] + [../] + [./disp_y] + [../] + [./strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[Kernels] + [./TensorMechanics] + use_displaced_mesh = true + save_in = 'resid_x resid_y' + [../] + + [./solid_z] + type = WeakPlaneStress + variable = strain_zz + use_displaced_mesh = true + [../] +[] + +[AuxVariables] + [./resid_x] + [../] + [./resid_y] + [../] + [./D] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl0] + order = CONSTANT + family = MONOMIAL + [../] + [./intnl1] + order = CONSTANT + family = MONOMIAL + [../] + + [./stress_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./stress_zz] + order = CONSTANT + family = MONOMIAL + [../] + + [./strain_xx] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_xy] + order = CONSTANT + family = MONOMIAL + [../] + [./strain_yy] + order = CONSTANT + family = MONOMIAL + [../] + [./material_strain_zz] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[AuxKernels] + [./D_auxk] + type = MaterialRealAux + property = elemental_damage_variable + variable = D + [../] + [./intnl0_auxk] + type = MaterialRealAux + property = damage_state_in_tension + variable = intnl0 + [../] + [./intnl1_auxk] + type = MaterialRealAux + property = damage_state_in_compression + variable = intnl1 + [../] + + [./stress_xx] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xx + index_i = 0 + index_j = 0 + [../] + [./stress_xy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_xy + index_i = 0 + index_j = 1 + [../] + [./stress_yy] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_yy + index_i = 1 + index_j = 1 + [../] + [./stress_zz] + type = RankTwoAux + rank_two_tensor = stress + variable = stress_zz + index_i = 2 + index_j = 2 + [../] + + [./strain_xx] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xx + index_i = 0 + index_j = 0 + [../] + [./strain_xy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_xy + index_i = 0 + index_j = 1 + [../] + [./strain_yy] + type = RankTwoAux + rank_two_tensor = total_strain + variable = strain_yy + index_i = 1 + index_j = 1 + [../] + [./strain_zz] + type = RankTwoAux + rank_two_tensor = total_strain + variable = material_strain_zz + index_i = 2 + index_j = 2 + [../] +[] + +[BCs] + [./left_x] + type = FunctionDirichletBC + variable = disp_x + boundary = 'left' + function = '0.' + [../] + [./y1] + type = FunctionDirichletBC + variable = disp_y + boundary = 'bottom_left' + function = '0.' + [../] + [./right_surface] + type = FunctionDirichletBC + variable = disp_x + boundary = 'right' + function = '1E-4*t' + [../] +[] + +[Postprocessors] + [./displacement_x] + type = AverageNodalVariableValue + variable = disp_x + boundary = 'right' + [../] + [./react_x] + type = NodalSum + variable = resid_x + boundary = 'left' + [../] +[] + +[Materials] + [./elasticity_tensor_left] + type = ComputeIsotropicElasticityTensor + block = '0' + youngs_modulus = 3.17E4 + poissons_ratio = 0.18 + [../] + [./stress_left] + type = ComputeMultipleInelasticDamageStress + block = '0' + inelastic_models = pdm_left + perform_finite_strain_rotations = false + tangent_operator = nonlinear + [../] + [./strain_left] + type = ComputePlaneIncrementalStrain + block = '0' + [../] + [./pdm_left] + type = DamagePlasticityStressUpdate + block = '0' + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + factor_controlling_dilatancy = 0.23 + stiff_recovery_factor = 0.001 + + yield_strength_in_tension = 3.48 + ft_ep_slope_factor_at_zero_ep = 0.90 + tensile_damage_at_half_tensile_strength = 0.27 + fracture_energy_in_tension = 25E-3 #4.8E-4 + + maximum_strength_in_compression = 18.30 + maximum_strength_in_compression = 27.60 + compressive_damage_at_max_compressive_strength = 0.40 + fracture_energy_in_compression = 6.889E-2 + + yield_function_tol = 1.E-5 + tip_smoother = 1.E-6 + smoothing_tol = 1.E-3 + [../] + [./elasticity_tensor_right] + type = ComputeIsotropicElasticityTensor + block = '1' + youngs_modulus = 3.17E4 + poissons_ratio = 0.18 + [../] + [./stress_right] + type = ComputeMultipleInelasticDamageStress + block = '1' + inelastic_models = pdm_right + perform_finite_strain_rotations = false + tangent_operator = nonlinear + [../] + [./strain_right] + type = ComputePlaneIncrementalStrain + block = '1' + [../] + [./pdm_right] + type = DamagePlasticityStressUpdate + block = '1' + factor_relating_biaxial_unixial_cmp_str = 0.109 # fb0 = -20.862 + factor_controlling_dilatancy = 0.23 + stiff_recovery_factor = 0.001 + + yield_strength_in_tension = 3.40 + ft_ep_slope_factor_at_zero_ep = 0.90 + tensile_damage_at_half_tensile_strength = 0.27 + fracture_energy_in_tension = 25E-3 #4.8E-4 + + yield_strength_in_compression = 18.30 + maximum_strength_in_compression = 27.60 + compressive_damage_at_max_compressive_strength = 0.40 + fracture_energy_in_compression = 6.889E-2 + + yield_function_tol = 1.E-5 + tip_smoother = 1.E-6 + smoothing_tol = 1.E-3 + [../] +[] + +[Preconditioning] + active = SMP + [./SMP] + type = SMP + full = true + [../] + [./FDP] + type = FDP + full = true + [../] +[] + +[Executioner] + solve_type = 'NEWTON' + nl_max_its = 100 + nl_abs_tol = 1.E-5 + nl_rel_tol = 1E-3 + + line_search = none + + petsc_options_iname = '-pc_type' + petsc_options_value = 'lu' + + petsc_options = '-snes_converged_reason' + + type = Transient + end_time = 200 + dt = 1 +[] + + +[Outputs] + exodus = false + [./csv] + type = CSV + [../] +[]