|
|
maketopo.py.html
| |
|
Source file: maketopo.py
|
|
Directory: /var/www/html/clawpack/links/awr10/radial-ocean-island
|
|
Converted: Thu Jul 29 2010 at 13:49:17
using clawcode2html
|
|
This documentation file will
not reflect any later changes in the source file.
|
"""
Module to create topo and qinit data files for this example.
"""
from pyclaw.geotools import topotools
from pyclaw.interp import pwcubic
from pyclaw.data import Data
from numpy import *
from mapper import latlong
probdata = Data('setprob.data')
theta_island = probdata.theta_island
geodata = Data('setgeo.data')
Rearth = geodata.Rearth
(xisland,yisland) = latlong(1600.e3, theta_island, 40., Rearth)
def maketopo():
"""
Output topography file for the entire domain
and near-shore in one location.
"""
nxpoints=400
nypoints=400
xlower=-20.e0
xupper= 20.e0
ylower= 20.e0
yupper= 60.e0
outfile= "ocean.topotype2"
topotools.topo2writer(outfile,topo,xlower,xupper,ylower,yupper,nxpoints,nypoints)
nxpoints=200
nypoints=200
xlower= xisland - 1.
xupper= xisland + 1.
ylower= yisland - 1.
yupper= yisland + 1.
outfile= "island.topotype2"
topotools.topo2writer(outfile,topo,xlower,xupper,ylower,yupper,nxpoints,nypoints)
def makeqinit():
"""
Create qinit data file
"""
nxpoints=100
nypoints=100
xlower=-20.e0
xupper= 20.e0
ylower= 20.e0
yupper= 60.e0
outfile= "hump.xyz"
topotools.topo1writer(outfile,qinit,xlower,xupper,ylower,yupper,nxpoints,nypoints)
def shelf1(r):
"""
Ocean followed by continental slope, continental shelf, and beach.
The ocean is flat, the slope is cubic, and the shelf and beach are linear.
"""
rad1 = 1500e3 # beginning of continental slope
rad2 = rad1 + 60e3 # end of slope, start of shelf
rad3 = rad2 + 80e3 # end of shelf, start of beach
rad4 = rad3 + 5e3 # radius of shoreline where z=0
z1 = -4000. # depth from r=0 to rad1 (ocean)
z2 = -100. # depth at r=rad2 (start of shelf)
z3 = -100. # depth at r=rad3 (start of beach)
z4 = 0. # depth at shoreline
xi = array([0., rad1, rad2, rad3, rad4])
zl = array([z1, z1, z2, z3, z4])
zr = zl # continuous!
slope_of_shelf = (z3 - z2) / (rad3 - rad2)
slope_of_beach = (z4 - z3) / (rad4 - rad3)
print "Slope of shelf = ",slope_of_shelf
print "Slope of beach = ",slope_of_beach
slopel = array([0., 0., slope_of_shelf, slope_of_shelf, slope_of_beach])
sloper = array([0., 0., slope_of_shelf, slope_of_beach, slope_of_beach])
z = pwcubic(xi, zl, zr, slopel, sloper, r)
return z
def island1(r):
"""
Island created using piecewise cubic with radius rad with zero slope at peak and
base. Raises topo by ztop at the peak.
"""
rad = 30e3
ztop = 120. # 20m above sealevel on the 100m deep shelf.
xi = array([0., rad])
zl = array([ztop, 0.])
zr = zl
slopel = array([0., 0.])
sloper = slopel
z = pwcubic(xi, zl, zr, slopel, sloper, r)
return z
def topo(x,y):
"""
x = longitude, y = latitude in degrees
"""
import numpy as np
x0 = 0.0
y0 = 40.0
d = topotools.gcdist(x,y,x0,y0,Rearth) # great circle distance on earth
z = shelf1(d)
d = topotools.gcdist(x,y,xisland,yisland,Rearth)
z = z + island1(d)
return z
def qinit(x,y):
"""
Gaussian hump:
"""
from numpy import where
x0 = 0.0
y0 = 40.0
d = topotools.gcdist(x,y,x0,y0,Rearth) # great circle distance on earth
ze = -d**2/2.e9
z = where(ze>-100., 20.e0*exp(ze), 0.)
return z
if __name__=='__main__':
maketopo()
makeqinit()