2
########################################################
4
# Copyright (c) 2003-2010 by University of Queensland
5
# Earth Systems Science Computational Center (ESSCC)
6
# http://www.uq.edu.au/esscc
8
# Primary Business: Queensland, Australia
9
# Licensed under the Open Software License version 3.0
10
# http://www.opensource.org/licenses/osl-3.0.php
12
########################################################
14
__copyright__="""Copyright (c) 2003-2010 by University of Queensland
15
Earth Systems Science Computational Center (ESSCC)
16
http://www.uq.edu.au/esscc
17
Primary Business: Queensland, Australia"""
18
__license__="""Licensed under the Open Software License version 3.0
19
http://www.opensource.org/licenses/osl-3.0.php"""
20
__url__="https://launchpad.net/escript-finley"
23
# AXI-SYMMETRIC NEWTONIAN MODEL ; UPDATED LAGRANGIAN FORMULATION
26
# step 1 rho*(v_star-v) = dt * (sigma'_ij,j-teta3*p,i+f_i)
27
# step 2 dp=-dt*B*(v_j,j+teta1*v_star_j,j-dt*teta1*((1-teta3)*p_,jj+teta2*dp_,jj))
28
# step 3 rho*(v+-v) = -dt*((1-teta3)*p_,jj+teta2*dp_,jj)
29
# step 3b p+=1/2(p+dp+abs(p+dp))
30
# step 4 sigma'i+_ij,j=f(v+,p+,...)
33
from esys.escript import *
34
from esys.escript.linearPDEs import LinearSinglePDE, LinearPDESystem
35
from esys.dudley import Rectangle
42
eta = 1.0 # shear viscosity
54
w_step=max(int(nstep/50),1)*0+1
58
teta3 = 1 # =0 split A; =1 split B
61
dom=Rectangle(int(nel*L/min(L,H)),int(nel*H/min(L,H)),order=1, l0=L, l1=H)
65
momentumStep1=LinearPDESystem(dom)
66
momentumStep1.setValue(q=whereZero(x[0])*[1.,0.]+whereZero(x[1])*[0.,1.]) # fix x0=0 and x1=0
67
face_mask=whereZero(FunctionOnBoundary(dom).getX()[1])
69
pressureStep2=LinearSinglePDE(dom)
70
pressureStep2.setReducedOrderOn()
71
pressureStep2.setValue(q=whereZero(x[0]-L)+whereZero(x[1]-H))
73
momentumStep3=LinearPDESystem(dom)
74
momentumStep3.setValue(q=whereZero(x[0])*[1.,0.]+whereZero(x[1])*[0.,1.])
78
U=Vector(0.,Solution(dom))
79
p=ro*g*(L-ReducedSolution(dom).getX()[0])*(H-ReducedSolution(dom).getX()[1])/3
80
p=ro*g*(H-ReducedSolution(dom).getX()[1])
81
dev_stress=Tensor(0.,Function(dom))
87
print "time step :",istep," t = ",t
88
r=Function(dom).getX()[0]
89
r_b=FunctionOnBoundary(dom).getX()[0]
90
print " volume : ",integrate(r)
96
t_d=matrixmult(numpy.array([[0.,-1.],[1.,0]]),n_d)
97
sigma_d=(sign(inner(t_d,U))*alpha_w*t_d-n_d)*Pen*clip(inner(n_d,U),0.)
98
print " sigma_d =",inf(sigma_d),sup(sigma_d)
100
momentumStep1.setValue(D=r*ro*kronecker(dom),
101
Y=r*ro*U+dt*r*[0.,-ro*g],
102
X=-dt*r*(dev_stress-teta3*p*kronecker(dom)),
103
y=sigma_d*face_mask*r_b)
104
U_star=momentumStep1.getSolution()
105
saveVTK("u.vtu",u=U_star,u0=U)
109
# U2=U+teta1*(U_star-U)
112
div_U2=gg2[0,0]+gg2[1,1]+U2[0]/r
116
pressureStep2.setValue(A=r*dt*B*teta1*teta2/ro*dt*kronecker(dom),
119
X=-r*B*dt**2/ro*teta1*(1-teta3)*grad_p)
120
dp=pressureStep2.getSolution()
124
p2=(1-teta3)*p+teta2*dp
126
momentumStep3.setValue(D=r*ro*kronecker(dom),
127
Y=r*(ro*U_star-dt*teta2*grad_p2))
128
U_new=momentumStep3.getSolution()
134
print " U:",inf(U),sup(U)
135
print " P:",inf(p),sup(p)
140
vol=gg[0,0]+gg[1,1]+U[0]/r
141
gamma=sqrt(2*((gg[0,0]-vol/3)**2+(gg[1,1]-vol/3)**2+(U[0]/r-vol/3)**2+(gg[1,0]+gg[0,1])**2/2))
142
m=whereNegative(eta*gamma-alpha*p_pos)
143
eta_d=m*eta+(1.-m)*alpha*p_pos/(gamma+small)
144
print " viscosity =",inf(eta_d),sup(eta_d)
145
dev_stress=eta_d*(symmetric(gg)-2./3.*vol*kronecker(dom))
149
len=inf(dom.getSize())
150
dt1=inf(dom.getSize()/(length(U)+small))
151
dt2=inf(0.5*ro*(len**2)/eta_d)
153
print " new step size = ",dt
157
dom.setX(dom.getX()+U*dt)
159
if (istep-1)%w_step==0:saveVTK("u.%d.vtu"%((istep-1)/w_step),p=p,eta=eta_d,U=U_star,U_star=U_star,gamma=gamma)