mapper.py.html | ![]() |
Source file: mapper.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. |
from __future__ import print_function from pylab import * def latlong(d,theta,phi,Rearth): """ Take a point at distance d from the North pole with longitude theta and return longitude and latitude of point after rotating pole down to latitude phi. Applying this function to a set of points on a circle of radius d will result in points that are equi-distant (distance d on the earth) from the point at latitude phi, longitude 0. Used to construct a radially symmetric ocean on the earth and place gauges, islands, etc. """ # Convert phi to radians: theta = theta * pi/180. phi = phi * pi/180. alpha = pi/2. - d/Rearth # latitude of original point # x,y,z coordinates of this point on the earth: x1 = cos(alpha)*cos(theta) y1 = cos(alpha)*sin(theta) z1 = sin(alpha) # rotate so centered at latitude phi: x2 = x1*sin(phi) + z1*cos(phi) y2 = y1 z2 = -x1*cos(phi) + z1*sin(phi) # compute longitude xhat and latitude yhat: xhat = -arctan(y2/x2) yhat = arcsin(z2) # convert to degrees: xhat = xhat * 180./pi yhat = yhat * 180./pi return xhat,yhat def plot_ocean_and_shelf(d1=1580e3, d2=1645e3, phi=40.): theta = linspace(0, 360., 200) d = d1*ones(theta.shape) xhat, yhat = latlong(d, theta, phi) clf() plot(xhat,yhat,'b') hold(True) d = d2*ones(theta.shape) xhat, yhat = latlong(d, theta, phi) plot(xhat,yhat,'r') legend(['Continental shelf', 'Shoreline'],loc='lower left') (xi1,yi1) = latlong(1600.e3,220.,40.) plot([xi1],[yi1],'ko') (xi2,yi2) = latlong(1600.e3,260.,40.) plot([xi2],[yi2],'ko') axis('scaled') xlim([-20, 20]) ylim([15, 60]) #========================================================== def gcdist(x1,y1,x2,y2,Rearth,units='degrees'): """ Compute the great circle distance on the earth between points (x1,y1) and (x2,y2), where: x = longitude, y = latitude Taken from Clawpack 4.x. """ from numpy import pi,sin,cos,arccos,arcsin,sqrt if units=='degrees': # convert to radians: x1 = x1 * pi/180. y1 = y1 * pi/180. x2 = x2 * pi/180. y2 = y2 * pi/180. elif units != 'radians': raise Exception("unrecognized units") dx = x1 - x2 dy = y1 - y2 # angle subtended by two points, using Haversine formula: dsigma = 2. * arcsin(sqrt(sin(0.5*dy)**2 + cos(y1)*cos(y2)*sin(0.5*dx)**2)) # alternative formula that may have more rounding error: #dsigma2 = arccos(sin(y1)*sin(y2)+ cos(y1)*cos(y2)*cos(dx)) #print("max diff in dsigma: ", abs(dsigma-dsigma2).max()) d = Rearth * dsigma return d