|
maketopo.py.html |
|
|
Source file: maketopo.py
|
|
Directory: /Users/rjl/clawpack_src/clawpack_master/geoclaw/examples/tsunami/radial-ocean-island-fgmax
|
|
Converted: Mon Feb 10 2020 at 10:51:30
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 __future__ import print_function
from clawpack.geoclaw import topotools
from clawpack.geoclaw.data import Rearth # radius of earth
from interp import pwcubic
from clawpack.clawutil.data import ClawData
from numpy import *
from mapper import latlong, gcdist
probdata = ClawData()
probdata.read('setprob.data', force=True)
theta_island = probdata.theta_island
print("theta_island = ",theta_island)
(xisland,yisland) = latlong(1600.e3, theta_island, 40., Rearth)
print('Island is centered at: (%.3f, %.3f)' % (xisland,yisland))
def maketopo():
"""
Output topography file for the entire domain
and near-shore in one location.
"""
# 6 arcminute resolution:
nxpoints=401
nypoints=401
xlower=-20.e0
xupper= 20.e0
ylower= 20.e0
yupper= 60.e0
outfile= "ocean.tt3"
topotools.topo3writer(outfile,topo,xlower,xupper,ylower,yupper,nxpoints,nypoints)
# round off lat/lon to 2 digits so even multiple of 0.01 degree = 36 arcsec
xlower= round(xisland - 1., 2)
xupper= round(xisland + 1., 2)
ylower= round(yisland - 1., 2)
yupper= round(yisland + 1., 2)
# 18 arcsecond resolution:
nxpoints = int((xupper-xlower) * 3600. / 18.) + 1
nypoints = int((yupper-ylower) * 3600. / 18.) + 1
print('island topofile has %i by %i points' % (nxpoints,nypoints))
outfile= "island.tt3"
topotools.topo3writer(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 = gcdist(x0,y0,x,y,Rearth)
z = shelf1(d)
d = gcdist(xisland,yisland,x,y,Rearth)
z = z + island1(d)
z = where(z>200, 200, z) # cut off topo at 200 m above sea level
return z
def qinit(x,y):
"""
Gaussian hump:
"""
from numpy import where
x0 = 0.0
y0 = 40.0
d = gcdist(x0,y0,x,y,Rearth)
ze = -(d/100e3)**2
z = where(ze>-100., 20.e0*exp(ze), 0.)
return z
if __name__=='__main__':
maketopo()
makeqinit()