# Diff of /trunk/doc/examples/usersguide/wave.py

trunk/esys2/doc/user/examples/wave.py revision 110 by jgs, Mon Feb 14 04:14:42 2005 UTC trunk/doc/examples/usersguide/wave.py revision 2548 by jfenwick, Mon Jul 20 06:20:06 2009 UTC
# Line 1  Line 1
1  # \$Id\$
2    ########################################################
3    #
4    # Copyright (c) 2003-2009 by University of Queensland
5    # Earth Systems Science Computational Center (ESSCC)
6    # http://www.uq.edu.au/esscc
7    #
8    # Primary Business: Queensland, Australia
11    #
12    ########################################################
13
15    Earth Systems Science Computational Center (ESSCC)
16    http://www.uq.edu.au/esscc
21
22  from esys.escript import *  from esys.escript import *
23  from esys.linearPDEs import LinearPDE  from esys.escript.pdetools import Locator
24    from esys.escript.linearPDEs import LinearPDE
25  from esys.finley import Brick  from esys.finley import Brick
26  from numarray import identity  from numpy import identity,zeros,ones
27  ne=10           # number of cells in x_0-direction
28  depth=10000.   # length in x_0-direction  ne=32          # number of cells in x_0 and x_1 directions
29  width=100000.  # length in x_1 and x_2 direction  width=10000.  # length in x_0 and x_1 directions
30  lam=3.462e9  lam=3.462e9
31  mu=3.462e9  mu=3.462e9
32  rho=1154.  rho=1154.
33  tau=10.  tend=20. # to ran a full simulation change tend to 60.
34  umax=2.  alpha=0.7
35  tend=60  t0=3.
h=1./5.*sqrt(rho/(lam+2*mu))*(depth/ne)
print "time step size = ",h
36
37  def s_tt(t): return umax/tau**2*(6*t/tau-9*(t/tau)**4)*exp(-(t/tau)**3)  U0=1. # maximum displacement
38    mkDir("data") # create directory data if it does not exist already.
39
40  def wavePropagation(domain,h,tend,lam,mu,rho,s_tt):  def wavePropagation(domain,h,tend,lam,mu,rho, xc, src_radius, U0):
41     x=domain.getX()     x=domain.getX()
42     # ... open new PDE ...     # ... open new PDE ...
43     mypde=LinearPDE(domain)     mypde=LinearPDE(domain)
44     mypde.setLumpingOn()     mypde.getSolverOptions().setSolverMethod(mypde.getSolverOptions().LUMPING)
45     kronecker=identity(mypde.getDim())     kronecker=identity(mypde.getDim())
46     mypde.setValue(D=kronecker*rho, \
47                    q=x[0].whereZero()*kronecker[1,:])     dunit=numpy.array([1.,0.,0.]) # defines direction of point source
48
50     # ... set initial values ....     # ... set initial values ....
51     n=0     n=0
52     u=Vector(0,ContinuousFunction(domain))     # for first two time steps
53     u_last=Vector(0,ContinuousFunction(domain))     u=Vector(0.,Solution(domain))
54       u_last=Vector(0.,Solution(domain))
55     t=0     t=0
56
57       # define the location of the point source
58       L=Locator(domain,xc)
59       # find potential at point source
60       u_pc=L.getValue(u)
61       print "u at point charge=",u_pc
62       # open file to save displacement at point source
63       u_pc_data=FileWriter('./data/U_pc.out')
64       u_pc_data.write("%f %f %f %f\n"%(t,u_pc[0],u_pc[1],u_pc[2]))
65
66     while t<tend:     while t<tend:
67         t+=h
68       # ... get current stress ....       # ... get current stress ....
70       stress=lam*trace(g)*kronecker+mu*(g+transpose(g))       stress=lam*trace(g)*kronecker+mu*(g+transpose(g))
71       # ... get new acceleration ....       # ... get new acceleration ....
72       mypde.setValue(X=-stress,r=s_tt(t+h)*kronecker[1,:])       amplitude=U0*(4*(t-t0)**3/alpha**3-6*(t-t0)/alpha)*sqrt(2.)/alpha**2*exp(1./2.-(t-t0)**2/alpha**2)
73         mypde.setValue(X=-stress, r=dunit*amplitude)
74       a=mypde.getSolution()       a=mypde.getSolution()
75       # ... get new displacement ...       # ... get new displacement ...
76       u_new=2*u-u_last+h**2*a       u_new=2*u-u_last+h**2*a
77       # ... shift displacements ....       # ... shift displacements ....
78       u_last=u       u_last=u
79       u=u_new       u=u_new
t+=h
80       n+=1       n+=1
81       print n,"-th time step t ",t       print n,"-th time step t ",t
82       print "a=",inf(a),sup(a)       u_pc=L.getValue(u)
83       print "u=",inf(u),sup(u)       print "u at point charge=",u_pc
84       # ... save current acceleration in units of gravity       # save displacements at point source to file for t > 0
85       if n%10==0 : (length(a)/9.81).saveDX("/tmp/res/u.%i.dx"%(n/10)       u_pc_data.write("%f %f %f %f\n"%(t,u_pc[0],u_pc[1],u_pc[2]))
86
87         # ... save current acceleration in units of gravity and displacements
88         if n==1 or n%10==0: saveVTK("./data/usoln.%i.vtu"%(n/10),acceleration=length(a)/9.81,
89         displacement = length(u), tensor = stress, Ux = u[0] )
90
91  mydomain=Brick(ne,int(width/depth)*ne,int(width/depth)*ne,l0=depth,l1=width,l2=width)     u_pc_data.close()
92  wavePropagation(mydomain,h,tend,lam,mu,rho,s_tt)
93    mydomain=Brick(ne,ne,10,l0=width,l1=width,l2=10.*width/ne)
94    h=inf(1./5.)*inf(sqrt(rho/(lam+2*mu))*mydomain.getSize())
95    print "time step size = ",h
96    #  spherical source at middle of bottom face
97    xc=[width/2.,width/2.,0.]
98    # define small radius around point xc