96 |
k3=kronecker(self.domain) |
k3=kronecker(self.domain) |
97 |
# set new thermal stress increment |
# set new thermal stress increment |
98 |
if self.temperature: |
if self.temperature: |
99 |
self.dthermal_stress=self.bulk_modulus*self.self.expansion_coefficient*(self.temperature-self.__temperature_old) |
self.deps_therm=self.self.expansion_coefficient*(self.temperature-self.__temperature_old) |
100 |
else: |
else: |
101 |
self.dthermal_stress=0. |
self.deps_therm=0. |
102 |
# set PDE coefficients: |
# set PDE coefficients: |
103 |
self.__pde.setValue(A=self.S) |
self.__pde.setValue(A=self.S) |
104 |
self.__pde.setValue(X=self.stress_old-self.dthermal_stress*k3) |
self.__pde.checkSymmetry() |
105 |
|
self.__pde.setValue(X=self.stress_old-self.bulk_modulus*self.deps_therm*k3) |
106 |
if self.internal_force: self.__pde.setValue(Y=self.internal_force) |
if self.internal_force: self.__pde.setValue(Y=self.internal_force) |
107 |
if self.external_force: self.__pde.setValue(y=self.external_force) |
if self.external_force: self.__pde.setValue(y=self.external_force) |
108 |
self.__pde.setValue(r=self.prescribed_velocity, \ |
self.__pde.setValue(r=self.prescribed_velocity, \ |
132 |
""" |
""" |
133 |
accept all the values: |
accept all the values: |
134 |
""" |
""" |
135 |
self.displacement=self.__displacement_old |
self.__displacement_old=self.displacement |
136 |
self.stress=self.stress_old |
self.stress_old=self.stress |
137 |
self.velocity=self.__velocity_old |
self.__velocity_old=self.velocity |
138 |
self.temperature=self.__temperature_old |
self.__temperature_old=self.temperature |
139 |
|
|
140 |
def getSafeTimeStepSize(self,dt): |
def getSafeTimeStepSize(self,dt): |
141 |
""" |
""" |
162 |
self.declareParameter(plastic_stress=0., |
self.declareParameter(plastic_stress=0., |
163 |
friction_parameter=0., |
friction_parameter=0., |
164 |
dilatancy_parameter=0., |
dilatancy_parameter=0., |
165 |
shear_length=1.e15) |
shear_length=1.e15, |
166 |
|
hardening=0.) |
167 |
|
|
168 |
def doInitialization(self): |
def doInitialization(self): |
169 |
""" |
""" |
172 |
super(DruckerPrager, self).doInitialization() |
super(DruckerPrager, self).doInitialization() |
173 |
self.__plastic_stress_old=self.plastic_stress |
self.__plastic_stress_old=self.plastic_stress |
174 |
self.__tau_y_old=self.shear_length |
self.__tau_y_old=self.shear_length |
175 |
|
self.__hardening_old=self.hardening |
176 |
|
|
177 |
def doStepPreprocessing(self,dt): |
def doStepPreprocessing(self,dt): |
178 |
""" |
""" |
183 |
""" |
""" |
184 |
super(DruckerPrager, self).doStepPreprocessing(dt) |
super(DruckerPrager, self).doStepPreprocessing(dt) |
185 |
self.plastic_stress=self.__plastic_stress_old |
self.plastic_stress=self.__plastic_stress_old |
186 |
|
self.shear_length=self.__tau_y_old |
187 |
|
self.hardening=self.__hardening_old |
188 |
|
|
189 |
def doStep(self,dt): |
def doStep(self,dt): |
190 |
G=self.shear_modulus |
G=self.shear_modulus |
192 |
alpha=self.friction_parameter |
alpha=self.friction_parameter |
193 |
beta=self.dilatancy_parameter |
beta=self.dilatancy_parameter |
194 |
tau_Y=self.shear_length |
tau_Y=self.shear_length |
195 |
if self.__plastic_stress_old: |
h=self.hardening |
|
dps=self.plastic_stress-self.__plastic_stress_old |
|
|
h=(tau_Y-self.__tau_y_old)/(dps+self.abs_tol*whereZero(dps)) |
|
|
else: |
|
|
h=0 |
|
196 |
# set new tangential operator: |
# set new tangential operator: |
197 |
self.S=self.getTangentialTensor(self.stress, |
self.S=self.getTangentialTensor(self.stress, |
198 |
tau_Y,G,K,alpha,beta,h) |
tau_Y,G,K,alpha,beta,h) |
202 |
# update stresses: |
# update stresses: |
203 |
self.stress,self.plastic_stress=self.getNewStress(self.stress_old,self.__plastic_stress_old, |
self.stress,self.plastic_stress=self.getNewStress(self.stress_old,self.__plastic_stress_old, |
204 |
self.velocity*dt, |
self.velocity*dt, |
205 |
self.dthermal_stress,tau_Y,G,K,alpha,beta,h) |
self.deps_therm,tau_Y,G,K,alpha,beta,h) |
206 |
|
if self.__plastic_stress_old: |
207 |
|
dps=self.plastic_stress-self.__plastic_stress_old |
208 |
|
self.hardening=(tau_Y-self.__tau_y_old)/(dps+self.abs_tol*whereZero(dps)) |
209 |
|
else: |
210 |
|
self.hardening=0 |
211 |
|
|
212 |
def doStepPostprocessing(self,dt): |
def doStepPostprocessing(self,dt): |
213 |
super(DruckerPrager, self).doStepPostprocessing(dt) |
super(DruckerPrager, self).doStepPostprocessing(dt) |
214 |
self.plastic_stress=self.__plastic_stress_old=self.plastic_stress |
self.__plastic_stress_old=self.plastic_stress |
215 |
|
self.__tau_y_old=self.shear_length |
216 |
|
self.__hardening_old=self.hardening |
217 |
|
|
218 |
def getNewStress(self,s,gamma_p,du,ds_therm,tau_Y,G,K,alpha,beta,h): |
def getNewStress(self,s,gamma_p,du,deps_therm,tau_Y,G,K,alpha,beta,h): |
219 |
k3=kronecker(self.domain) |
k3=kronecker(self.domain) |
220 |
dt=1. |
dt=1. |
221 |
g=grad(du) |
g=grad(du) |
222 |
D=symmetric(g) |
D=symmetric(g) |
223 |
W=nonsymmetric(g) |
W=nonsymmetric(g) |
224 |
s_e=s+ds_therm+dt*(2*G*D+(K-2./3*G)*trace(D)*k3 \ |
s_e=s+K*deps_therm*k3 +dt*(2*G*D+(K-2./3*G)*trace(D)*k3 \ |
225 |
+2*nonsymmetric(matrix_mult(W,s))) |
+2*nonsymmetric(matrix_mult(W,s))) |
226 |
p_e=-1./3*trace(s_e) |
p_e=-1./3*trace(s_e) |
227 |
s_e_dev=s_e+p_e*k3 |
s_e_dev=s_e+p_e*k3 |
228 |
tau_e=sqrt(1./2*inner(s_e_dev,s_e_dev)) |
tau_e=sqrt(1./2*inner(s_e_dev,s_e_dev)) |
243 |
chi=whereNonNegative(tau-alpha*p-tau_Y) |
chi=whereNonNegative(tau-alpha*p-tau_Y) |
244 |
sXk3=outer(s,k3) |
sXk3=outer(s,k3) |
245 |
k3Xk3=outer(k3,k3) |
k3Xk3=outer(k3,k3) |
246 |
tmp=G*s_dev/tau |
tmp=G*s_dev/(tau+tau_Y*1.e-15*whereZero(tau,1.e-15)) |
247 |
S=G*(swap_axes(k3Xk3,1,2)+swap_axes(k3Xk3,1,3)) \ |
S=G*(swap_axes(k3Xk3,1,2)+swap_axes(k3Xk3,1,3)) \ |
248 |
+ (K-2./3*G)*k3Xk3 \ |
+ (K-2./3*G)*k3Xk3 \ |
249 |
+ sXk3-swap_axes(sXk3,1,3) \ |
+ sXk3-swap_axes(sXk3,1,3) \ |
250 |
+ 1./2*(swap_axes(sXk3,0,3)-swap_axes(sXk3,1,2) \ |
+ 1./2*(swap_axes(sXk3,0,3)-swap_axes(sXk3,1,2) \ |
251 |
-swap_axes(sXk3,1,3)+swap_axes(sXk3,0,2)) |
-swap_axes(sXk3,1,3)+swap_axes(sXk3,0,2)) |
252 |
# - chi/(h+G+alpha*beta*K)*outer(tmp+beta*K*k3,tmp+alpha*K*k3)\ |
- chi/(h+G+alpha*beta*K)*outer(tmp+beta*K*k3,tmp+alpha*K*k3)\ |
253 |
|
# print S |
254 |
return S |
return S |