Alaska Tsunami Sources for WA State modeling projects

The Statement of Work for the 2019 UW modeling study (Island County and Skagit River Delta) refers to using a model of the 1964 Mw 9.2 earthquake, and refers to several past studies. However, the past studies mentioned have also/instead used a model sometimes called AKmax, which not displaced somewhat from the 1964 event, and that has magnitude 9.15 or 9.2 depending on the version used.

This notebook summarizes our exploration of this source.

In [1]:
%pylab inline
Populating the interactive namespace from numpy and matplotlib
In [2]:
import os,sys
from scipy.interpolate import griddata
from IPython.display import Image
from clawpack.geoclaw import topotools,dtopotools

Load topo and define background map

In [3]:
etopo1 = topotools.read_netcdf('etopo1', extent=[-160,-140,53,63], coarsen=3)
In [4]:
def fig_background():
    figure(figsize=(12,5))
    subplot(121)
    contourf(etopo1.X, etopo1.Y, etopo1.Z, [0,10000], colors=[[.8,1,.8]])
    contour(etopo1.X, etopo1.Y, etopo1.Z, [0], colors='g', lw=0.5)
    plot([-149.9],[61.2],'ro')
    text(-150.2,61.4,'Anchorage',color='r',fontsize=14)
    plot([-147.339],[60.908],'k*',markersize=15)
    axis([-158, -143, 54, 62])
    gca().set_aspect(1/cos(57*pi/180))
    grid(True)
    

In the figures below, the black star is the epicenter of the 1964 event, at 60.908°N 147.339°W according to https://earthquake.usgs.gov/earthquakes/eventpage/official19640328033616_30/origin/detail

In [5]:
fig_background()

Scope of Work statement

Here is the statement from the SOW:

In [6]:
Image('sow.png', width=650)
Out[6]:

Reviewing the Witter et al. (2011) study of Bandon, OR, it seems that they only used the 15 T-shirt size CSZ realizations in that study and no Alaska events. They do however refer to the paper of Johnson et al. (1996), where a slip model for the Alaska 1964 event is presented. This paper is also referenced in the Allen et al. (2018) DOGAMI report, and is presumably the AK64 slip model discussed further at the end of this this document.

DOGAMI Report on tsunami modeling in the Columbia River

In Allan et al., 2018 two Alaska sources were used, called AK64 and AKMax, as described in the paragraphs below.

In [7]:
Image('DOGAMI_ColumbiaRiver.png', width=650)
Out[7]:

Seaside OR paper

The Gonzalez et al. 2009 paper on PTHA for Seaside, OR has Table 1 below. Note that the slip values for Source 3 agree with the values listed in the DOGAMI report above, 15, 20, 25, and 30m.

In [8]:
Image('GonzalezGeist_Table1.png', width=800)
Out[8]:

AASZ03 from original Crescent City PTHA study

For the Crescent City study of 2014 we used a source AASZ03 that was generated using the AASZ03.csv file printed below. Note that the penultimate column contains the slip values, which are 19.5, 24.5, 29.5, and 34.5. Each is 4.5m higher than the corresponding value from the references above. I am not sure where we got these files.

Longitude,Latitude,Depth(km),Length,Width,Strike,Dip,Rake,Slip3,UnitSrc
204.89500,55.97000,17.94,100.0,50.0,236.000,15.000,90.0,19.5000,acsza31
205.34000,55.59800,5.00,100.0,50.0,236.000,15.000,90.0,19.5000,acszb31
206.20800,56.47300,17.94,100.0,50.0,236.000,15.000,90.0,24.5000,acsza32
206.65800,56.10000,5.00,100.0,50.0,236.000,15.000,90.0,24.5000,acszb32
207.53700,56.97500,17.94,100.0,50.0,236.000,15.000,90.0,29.5000,acsza33
207.99300,56.60300,5.00,100.0,50.0,236.000,15.000,90.0,29.5000,acszb33
208.93710,57.51240,17.94,100.0,50.0,236.000,15.000,90.0,34.5000,acsza34
209.40000,57.14000,5.00,100.0,50.0,236.000,15.000,90.0,34.5000,acszb34
210.25970,58.04410,17.94,100.0,50.0,230.000,15.000,90.0,34.5000,acsza35
210.80000,57.70000,5.00,100.0,50.0,230.000,15.000,90.0,34.5000,acszb35
211.32490,58.65650,17.94,100.0,50.0,218.000,15.000,90.0,34.5000,acsza36
212.00000,58.38000,5.00,100.0,50.0,218.000,15.000,90.0,34.5000,acszb36

It is possible the slips were adjusted to give a Mw 9.2 event, which this does:

In [9]:
sift_slip_large = {'acsza31':19.5,'acszb31':19.5, 'acsza32':24.5,'acszb32':24.5, \
             'acsza33':29.5,'acszb33':29.5, 'acsza34':34.5,'acszb34':34.5, \
             'acsza35':34.5,'acszb35':34.5, 'acsza36':34.5,'acszb36':34.5}

AKmax_sift_large = dtopotools.SiftFault(sift_slip_large)
print('Magnitude = %.2f' % AKmax_sift_large.Mw())
Magnitude = 9.20

Confirm that the parameters agree with the csv file values:

In [10]:
print('Longitude Latitude  Depth   Strike   Dip   Rake   Slip')
for s in AKmax_sift_large.subfaults:
    print ('%.4f  %.4f  %4.1f     %.1f   %.1f   %.1f   %.1f' \
            % (s.longitude, s.latitude, s.depth/1e3, s.strike, s.dip, s.rake, s.slip))
Longitude Latitude  Depth   Strike   Dip   Rake   Slip
204.8950  55.9700  17.9     236.0   15.0   90.0   19.5
205.3400  55.5980   5.0     236.0   15.0   90.0   19.5
206.2080  56.4730  17.9     236.0   15.0   90.0   24.5
206.6580  56.1000   5.0     236.0   15.0   90.0   24.5
207.5370  56.9750  17.9     236.0   15.0   90.0   29.5
207.9930  56.6030   5.0     236.0   15.0   90.0   29.5
208.9371  57.5124  17.9     236.0   15.0   90.0   34.5
209.4000  57.1400   5.0     236.0   15.0   90.0   34.5
210.2597  58.0441  17.9     230.0   15.0   90.0   34.5
210.8000  57.7000   5.0     230.0   15.0   90.0   34.5
211.3249  58.6565  17.9     218.0   15.0   90.0   34.5
212.0000  58.3800   5.0     218.0   15.0   90.0   34.5

We shift the longitude by -360 for consistency with recent work:

In [11]:
AKmax_sift_large = dtopotools.SiftFault(sift_slip_large, longitude_shift=-360.)

Apply the Okada model to compute the seafloor deformation

We use the GeoClaw utility for generating seafloor deformation from NOAA SIFT unit sources.

In [12]:
x,y = AKmax_sift_large.create_dtopo_xy(dx=1/60., buffer_size=0.5)
print('Will create dtopo with shape %i by %i' % (len(x),len(y)))
dtopo_AKmax_sift_large = AKmax_sift_large.create_dtopography(x,y, times=[1.],verbose=True)
Will create dtopo with shape 601 by 361
Making Okada dz for each of 12 subfaults
0..1..2..3..4..5..6..7..8..9..10..11..
Done
In [13]:
fig_background()
clines_neg = arange(-10,0.,1.)
clines_pos = arange(1,16,1.)
dtopo = dtopo_AKmax_sift_large
dZ = dtopo.dZ[-1,:,:]
contour(dtopo.X, dtopo.Y, dZ, clines_neg, colors='b', linestyles='-')
contour(dtopo.X, dtopo.Y, dZ, clines_pos, colors='r', linestyles='-')
dZmin = dZ.min()
dZmax = dZ.max()
title('AKmax SIFT large\n min(dZ) = %.1f, max(dZ) = %.1f' % (dZmin,dZmax))
print('Blue contours at ', [c for c in clines_neg if c>=dZmin])
print('Red contours at ', [c for c in clines_pos if c<=dZmax])
subplot(122)
j = find(dtopo.x < -150).max()
plot(dtopo.y, dZ[:,j],'b')
axis([55,62,-10,20])
xlabel('Latitude')
ylabel('meters')
title('Transect at Longitude -150')
grid(True);
Blue contours at  [-7.0, -6.0, -5.0, -4.0, -3.0, -2.0, -1.0]
Red contours at  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0]

Note that although the magnitude agrees with the 1964 event, the deformation is not centered around the epicenter of that event, shown by the black star in the figure above, at 60.908°N 147.339°W according to https://earthquake.usgs.gov/earthquakes/eventpage/official19640328033616_30/origin/detail

SIFT source with slip values from Table 1.

Recreating the source with the smaller slip values from Table 1 of the Seaside paper gives a similar seafloor deformation but with smaller maxima, and also a smaller magnitude Mw 9.15:

In [14]:
sift_slip = {'acsza31':15.,'acszb31':15., 'acsza32':20.,'acszb32':20., \
             'acsza33':25.,'acszb33':25., 'acsza34':30.,'acszb34':30., \
             'acsza35':30.,'acszb35':30., 'acsza36':30.,'acszb36':30.}

AKmax_sift = dtopotools.SiftFault(sift_slip, longitude_shift=-360.)
print('Magnitude = %.2f' % AKmax_sift.Mw())
Magnitude = 9.15
In [15]:
#x,y = AKmax_sift.create_dtopo_xy(dx=1/60., buffer_size=0.5) # same as above
print('Will create dtopo with shape %i by %i' % (len(x),len(y)))
dtopo_AKmax_sift = AKmax_sift.create_dtopography(x,y, times=[1.],verbose=True)
Will create dtopo with shape 601 by 361
Making Okada dz for each of 12 subfaults
0..1..2..3..4..5..6..7..8..9..10..11..
Done
In [16]:
fig_background()
clines_neg = arange(-10,0.,1.)
clines_pos = arange(1,16,1.)
dtopo = dtopo_AKmax_sift
dZ = dtopo.dZ[-1,:,:]
contour(dtopo.X, dtopo.Y, dZ, clines_neg, colors='b', linestyles='-')
contour(dtopo.X, dtopo.Y, dZ, clines_pos, colors='r', linestyles='-')
dZmin = dZ.min()
dZmax = dZ.max()
title('AKmax SIFT\n min(dZ) = %.1f, max(dZ) = %.1f' % (dZmin,dZmax))
print('Blue contours at ', [c for c in clines_neg if c>=dZmin])
print('Red contours at ', [c for c in clines_pos if c<=dZmax])
subplot(122)
j = find(dtopo.x < -150).max()
plot(dtopo.y, dZ[:,j],'b')
axis([55,62,-10,20])
xlabel('Latitude')
ylabel('meters')
title('Transect at Longitude -150')
grid(True);
Blue contours at  [-6.0, -5.0, -4.0, -3.0, -2.0, -1.0]
Red contours at  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0]

AKmax.txt source

During work on the Crescent City project (ca. 2012) Frank purchased a CD that contained files AK64.txt and AKmax.txt in a directory CSZ_Bandon/def_grids. These are not in GeoClaw format and do not appear to have been used in our Crescent City modeling work. They are on a coarse grid with 15-20 arcsecond resolution. Plotting AKmax.txt shows it is similar to the above, with min and max of dZ (-6.2m and 13.4m respectively) that agree well with the dZ generated using the SIFT unit sources with the slip values from Table 1. (And hence correspond to the smaller Mw 9.15 event.)

In [17]:
fname = '/Users/rjl/git/CCptha/Sources/CSZ_Bandon/def_grids/AKmax.txt'
d = loadtxt(fname,skiprows=1)
data = d[:,1:]  # ignore first column
data[:,0] = data[:,0] #+ 360

points = data[:,:2]
values = data[:,2]

xpoints = points[:,0]
ypoints = points[:,1]

# Interpolate onto finer grid for plotting:
mx = 600
my = 400
xlower = xpoints.min()
xupper = xpoints.max()
ylower = ypoints.min()
yupper = ypoints.max()
x = linspace(xlower,xupper,mx)
y = linspace(ylower,yupper,my)
X_AKmax,Y_AKmax = meshgrid(x,y)
dZ_AKmax = griddata(points, values, (X_AKmax,Y_AKmax), method='nearest', fill_value=0.)
In [18]:
fig_background()
clines_neg = arange(-10,0.,1.)
clines_pos = arange(1,15,1.)
contour(X_AKmax,Y_AKmax,dZ_AKmax, clines_neg, colors='b', linestyles='-')
contour(X_AKmax,Y_AKmax,dZ_AKmax, clines_pos, colors='r', linestyles='-')
dZmin = dZ_AKmax.min()
dZmax = dZ_AKmax.max()
title('AKmax\n min(dZ) = %.1f, max(dZ) = %.1f' % (dZmin,dZmax))
print('Blue contours at ', [c for c in clines_neg if c>=dZmin])
print('Red contours at ', [c for c in clines_pos if c<=dZmax])
subplot(122)
j = find(x < -150).max()
plot(y, dZ_AKmax[:,j],'b')
axis([55,62,-10,20])
xlabel('Latitude')
ylabel('meters')
title('Transect at Longitude -150')
grid(True);
Blue contours at  [-6.0, -5.0, -4.0, -3.0, -2.0, -1.0]
Red contours at  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0]

AK64.txt source

The AK64.txt file (of unknown origin) contains a similarly coarse resolution deformation that is centered more around the 1964 epicenter.

In [19]:
fname = '/Users/rjl/git/CCptha/Sources/CSZ_Bandon/def_grids/AK64.txt'
d = loadtxt(fname,skiprows=1)
data = d[:,1:]  # ignore first column
data[:,0] = data[:,0] #+ 360

points = data[:,:2]
values = data[:,2]

xpoints = points[:,0]
ypoints = points[:,1]

# Interpolate onto finer grid for plotting:
mx = 600
my = 400
xlower = xpoints.min()
xupper = xpoints.max()
ylower = ypoints.min()
yupper = ypoints.max()
x = linspace(xlower,xupper,mx)
y = linspace(ylower,yupper,my)
X_AK64,Y_AK64 = meshgrid(x,y)
dZ_AK64 = griddata(points, values, (X_AK64,Y_AK64), method='nearest', fill_value=0.)
In [20]:
fig_background()
clines_neg = arange(-10,0.,1.)
clines_pos = arange(1,15,1.)
contour(X_AK64,Y_AK64,dZ_AK64, clines_neg, colors='b', linestyles='-')
contour(X_AK64,Y_AK64,dZ_AK64, clines_pos, colors='r', linestyles='-')
#axis([-155, -140, 55, 61])
dZmin = dZ_AK64.min()
dZmax = dZ_AK64.max()
title('AK64\n min(dZ) = %.1f, max(dZ) = %.1f' % (dZmin,dZmax))
print('Blue contours at ', [c for c in clines_neg if c>=dZmin])
print('Red contours at ', [c for c in clines_pos if c<=dZmax])
subplot(122)
j = find(x < -150).max()
plot(y, dZ_AK64[:,j],'b')
axis([55,62,-10,20])
xlabel('Latitude')
ylabel('meters')
title('Transect at Longitude -150')
grid(True);
Blue contours at  [-5.0, -4.0, -3.0, -2.0, -1.0]
Red contours at  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]

Johnson, Satake, et al. 1996

The paper on the Bandon, OR study by Witter et al. refers to this paper for the Alaska 1964 source,

The 1964 Prince William Sound earthquake: Joint inversion of tsunami and geodetic data, by Jean M. Johnson Kenji Satake Sanford R. Holdahl Jeanne Sauber, JGR 1996. DOI 10.1029/95JB02806

The figure below from this paper shows subfaults that may have been used to derive the source above.

This paper has a table of subfault parameters so this could be used to generate a better version of the sea floor deformation.

In [21]:
Image('JohnsonSatakeFig9.png', width=400)
Out[21]:

Source from PMEL tech report

Further discussion led us to consider the source constructed in

MODELING TSUNAMI INUNDATION IMPACT ON THE WASHINGTON COAST FROM DISTANT SEISMIC SOURCES
Christopher D. Chamberlin,  Vasily V. Titov, and Diego Arcas
PMEL Tech report 2009.  (Available online?)

In this report a source consisting of 20 unit sources with uniform slip is constructed that gives the maximum amplitude on the Washington coast. It is stated that a uniform slip of 20m on each of 20 subfaults gives Mw 9.2. However, this is not consistent with this statement from the report:

"In the database, a single unit source, a 50 x 100 km region, with a scaling factor (slip) of 1.0 represents a Mw 7.5 earthquake."

We believe this is correct, but that one must place a uniform slip of roughly 17.7m on each subfault to obtain Mw 9.2. Here are our calculations, using

$$ M_w = \frac 2 3 (\log_{10}(M_o) - 9.05), $$

where the seismic moment $M_o$ is in N-m, using a rigidity $\mu = 4\times 10^{10}$ Pa or 40 GPa.

In [22]:
mu = 40e9  # rigidity in Pascals
L = 100e3  # length in meters
W = 50e3   # width in meters
s = 1.     # unit slip 1 meter
Mo = L*W*s*mu  # seismic moment in N-m
Mw = 2/3. * (log10(Mo) - 9.05)
print('Using mu = %i GPa, a unit source with slip 1m has Mo = %g and Mw = %g' % (mu/1e9,Mo,Mw))
Using mu = 40 GPa, a unit source with slip 1m has Mo = 2e+20 and Mw = 7.50069

This agrees with the paper, but then if we use $N=20$ subfaults with slip $s=20$m we get

In [23]:
N = 20
s = 20
print('This uniform slip %g on %i subfaults gives Mw = %g' \
      %(s, N, 2/3. * (log10(N*s*Mo) - 9.05)))
This uniform slip 20 on 20 subfaults gives Mw = 9.23539

We can solve for how much slip we need with $N$ unit sources:

In [24]:
Mw = 9.2
print('Uniform slip required for Mw = %g:' % Mw)
for N in [16,18,20,22,24]:
    s = 10**(1.5*Mw + 9.05) / (Mo*N)
    print('  for %s unit sources, s = %g' % (N,s))
Uniform slip required for Mw = 9.2:
  for 16 unit sources, s = 22.1233
  for 18 unit sources, s = 19.6652
  for 20 unit sources, s = 17.6986
  for 22 unit sources, s = 16.0897
  for 24 unit sources, s = 14.7489

These values agree with the values given in Table 1 of the Seaside paper, where sources AASZ01 and 2 have 20 sources and slip 17.7, while sources 4 and 5 have 24 sources and slip 14.8. (But their source 3 has the wrong seismic moment unless the slips are scaled upward as discussed above. The total of s over all unit sources should be 354 to give Mw 9.2 but it is only 300.)

Rigidity value?

Above we used a rigidity (shear modulus) of $\mu = $40 GPa. We believe PMEL uses the value 40 GPa in constructing deformation from unit sources.

However, in some work a value of 30 GPa has been used instead, e.g. for the Seattle Fault model we have been using from

S. Koshimura, H. O. Mofjeld, F. I. Gonzalez, and A. L. Moore, Modeling the 1100 BP paleotsunami in Puget Sound, Washington, Geophysical Research Letters, 29 (2002), p. 1948, DOI 10.1029/2002GL015170.

Note that reducing $\mu$ by 3/4 would require increasing the slip by 4/3 to get the same value of Mw. Re-doing the above calculations with 30 GPa gives:

In [25]:
mu = 30e9  # rigidity in Pascals
L = 100e3  # length in meters
W = 50e3   # width in meters
s = 1.     # unit slip 1 meter
Mo = L*W*s*mu  # seismic moment in N-m
Mw = 2/3. * (log10(Mo) - 9.05)
print('With mu = %i GPa, a unit source with slip 1m has Mo = %g and Mw = %g' % ((mu/1e9),Mo,Mw))

N = 20
s = 20
print('With mu = %i GPa, this uniform slip %g on %i subfaults gives Mw = %g' \
      %((mu/1e9),s, N, 2/3. * (log10(N*s*Mo) - 9.05)))

Mw = 9.2
print('With mu = %i GPa, uniform slip required for Mw = %g:' % ((mu/1e9),Mw))
for N in [16,18,20,22,24]:
    s = 10**(1.5*Mw + 9.05) / (Mo*N)
    print('  for %s unit sources, s = %g' % (N,s))
With mu = 30 GPa, a unit source with slip 1m has Mo = 1.5e+20 and Mw = 7.41739
With mu = 30 GPa, this uniform slip 20 on 20 subfaults gives Mw = 9.1521
With mu = 30 GPa, uniform slip required for Mw = 9.2:
  for 16 unit sources, s = 29.4977
  for 18 unit sources, s = 26.2202
  for 20 unit sources, s = 23.5982
  for 22 unit sources, s = 21.4529
  for 24 unit sources, s = 19.6652

This does not give values that agree any better with what is in some of the references, so we still believe 40 GPa is the correct value to use for CSZ.

Also note that the value of $\mu$ used comes into the calculation of Mw, but does not come into the Okada model except indirectly through the definition of the Poisson ratio. We set the Poisson ratio to $0.25$ in our Okada model and believe this is standard, so changing the rigidity $\mu$ for a given set of slip values affects the magnitude Mw calculated but not the sea floor deformation.

Create a fault for PMEL maximum scenario 1

Use slip 17.7m rather than 20m, and rigidity 40 GPa.

In [26]:
sift_slip_pmelmax = {}
slip_uniform = 17.7
for usrc in range(29,39):
    k = 'acsza%s' % usrc
    sift_slip_pmelmax[k] = slip_uniform
    k = 'acszb%s' % usrc
    sift_slip_pmelmax[k] = slip_uniform

AK_pmelmax = dtopotools.SiftFault(sift_slip_pmelmax, longitude_shift=-360.)
print('Magnitude = %.2f' % AK_pmelmax.Mw())
Magnitude = 9.20

Check that the rigidity is set to 40 GPa:

In [27]:
AK_pmelmax.subfaults[0].mu/1e9
Out[27]:
40.0

Create dtopo:

In [28]:
x,y = AK_pmelmax.create_dtopo_xy(dx=1/60., buffer_size=0.5)
print('Will create dtopo with shape %i by %i' % (len(x),len(y)))
dtopo_AK_pmelmax = AK_pmelmax.create_dtopography(x,y, times=[0.],verbose=True)
Will create dtopo with shape 961 by 481
Making Okada dz for each of 20 subfaults
0..1..2..3..4..5..6..7..8..9..10..11..12..13..14..15..16..17..18..19..
Done
In [29]:
fig_background()
clines_neg = arange(-10,0.,1.)
clines_pos = arange(1,16,1.)
dtopo = dtopo_AK_pmelmax
dZ = dtopo.dZ[-1,:,:]
contour(dtopo.X, dtopo.Y, dZ, clines_neg, colors='b', linestyles='-')
contour(dtopo.X, dtopo.Y, dZ, clines_pos, colors='r', linestyles='-')
dZmin = dZ.min()
dZmax = dZ.max()
axis([-160,-143,52,62])
title('AK pmelmax\n min(dZ) = %.1f, max(dZ) = %.1f' % (dZmin,dZmax))
print('Blue contours at ', [c for c in clines_neg if c>=dZmin])
print('Red contours at ', [c for c in clines_pos if c<=dZmax])
subplot(122)
j = find(dtopo.x < -150).max()
plot(dtopo.y, dZ[:,j],'b')
axis([55,62,-10,20])
xlabel('Latitude')
ylabel('meters')
title('Transect at Longitude -150')
grid(True);
Blue contours at  [-5.0, -4.0, -3.0, -2.0, -1.0]
Red contours at  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]

The plot on the left is similar to what is in the top plot of Figure 3 of the PMEL report.

We will call this AK_PMEL_2009_Scenario1_slip_177.

In [30]:
dtopo.write('AK_PMEL_2009_Scenario1_slip_177.tt3', dtopo_type=3)

Comments on other sources in the PMEL report

Scenario 3 in the PMEL report was created from source #2 of the Seaside paper. However this 2009 report did referred to the original 2006 Seaside technical report "Seaside, Oregon, Tsunami Pilot Study : Modernization of FEMA Flood Hazard Maps", available at https://pdxscholar.library.pdx.edu/geology_fac/16/, rather than to the 2009 Seaside paper. Table 1 of the technical report contained typos that were fixed in the 2009 paper. In the paper Source #2 is a Mw 9.2 created using 17.7 m of slip on each of 20 unit sources, which we believe is correct. The incorrect table the 2006 report stated that a slip of 18.1 m was used on each of 22 unit sources, which would give a Mw 9.234 event. This is of no concern to the present work since Scenario 3, even with this incorrect larger value, was found to have much smaller impact on the WA coast than the other scenarios considered due to the orientation of the fault.

Scenario 2 of the PMEL report was a model of 1964 generated by Tang et al (2006) by starting with the Johnson et al. model and with additional inversion of tide gauge records. It is stated that it has a maximum slip value of 38 m but the unit source solution is not provided in the 2009 report (. Diego later provided it as

4.000*ac33a+5.000*ac33z+28.000*ac34a+5.000*ac34x+37.000*ac34y+38.000*ac34z
+2.000*ac35a+3.000*ac35x+14.000*ac35y+29.000*ac35z+10.000*ac36x`.

This is a different unit source labeling system than we are currently using.

This gives a Mw 9.0 event:

In [31]:
total_slip = 4+5+28+5+37+38+2+3+14+29+10

mu = 4e10  # rigidity in Pascals
L = 100e3  # length in meters
W = 50e3   # width in meters
Mo = L*W*total_slip*mu  # seismic moment in N-m
Mw = 2/3. * (log10(Mo) - 9.05)
print('A total slip of %g has Mo = %g and Mw = %g' % (total_slip,Mo,Mw))
A total slip of 175 has Mo = 3.5e+22 and Mw = 8.99605

Preliminary Conclusion

What should be used for our Alaska Source? There are at least 5 possibilities:

  1. The Mw 9.2 AKmax deformation as defined above using the SIFT subfaults,
  2. The Mw 9.15 AKmax deformation as defined above using the SIFT subfaults,
  3. A fine resolution version of the 1964 source model from Johnson, Satake, et al. 1996,
  4. A better source model for the 1964 event developed more recently, e.g from PMEL,
  5. The PMEL Scenario 1 event with uniform slip 20 m.
  6. The PMEL Scenario 1 event with uniform slip 17.7 m.

We now think we should choose option #2 (which we call AASZ03) or #6, which we will refer to as AK_PMEL_2009_Scenario1_slip_177.

Comparison of GeoClaw results with different sources

It probably doesn't matter very much which we use. One fault is longer than the other and has less uniform slip as a result, but they are both in the same region. Once the slips are adjusted to have roughly the same magnitude, Mw 9.2, they give very similar tsunamis.

In [32]:
fig_background()
clines_neg = arange(-10,0.,1.)
clines_pos = arange(1,16,1.)
dtopo = dtopo_AKmax_sift_large
dZ = dtopo.dZ[-1,:,:]
contour(dtopo.X, dtopo.Y, dZ, clines_neg, colors='b', linestyles='-')
contour(dtopo.X, dtopo.Y, dZ, clines_pos, colors='r', linestyles='-')
dZmin = dZ.min()
dZmax = dZ.max()
axis([-160,-143,52,62])

title('AKmax SIFT large\n min(dZ) = %.1f, max(dZ) = %.1f' % (dZmin,dZmax))
print('Blue contours at ', [c for c in clines_neg if c>=dZmin])
print('Red contours at ', [c for c in clines_pos if c<=dZmax])

subplot(122)
j = find(dtopo.x < -150).max()
plot(dtopo.y, dZ[:,j],'b')
axis([55,62,-10,20])
xlabel('Latitude')
ylabel('meters')
title('Transect at Longitude -150')
grid(True);

fig_background()
clines_neg = arange(-10,0.,1.)
clines_pos = arange(1,16,1.)
dtopo = dtopo_AK_pmelmax
dZ = dtopo.dZ[-1,:,:]
contour(dtopo.X, dtopo.Y, dZ, clines_neg, colors='b', linestyles='-')
contour(dtopo.X, dtopo.Y, dZ, clines_pos, colors='r', linestyles='-')
dZmin = dZ.min()
dZmax = dZ.max()
axis([-160,-143,52,62])
title('AK pmelmax\n min(dZ) = %.1f, max(dZ) = %.1f' % (dZmin,dZmax))
print('Blue contours at ', [c for c in clines_neg if c>=dZmin])
print('Red contours at ', [c for c in clines_pos if c<=dZmax])
subplot(122)
j = find(dtopo.x < -150).max()
plot(dtopo.y, dZ[:,j],'b')
axis([55,62,-10,20])
xlabel('Latitude')
ylabel('meters')
title('Transect at Longitude -150')
grid(True);
Blue contours at  [-7.0, -6.0, -5.0, -4.0, -3.0, -2.0, -1.0]
Red contours at  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0]
Blue contours at  [-5.0, -4.0, -3.0, -2.0, -1.0]
Red contours at  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]

Tsunami simulation results

Below are a few initial tests on a relatively coarse grid (6 arcminutes finest resolution), looking at several gauges as indicated in this figure:

In [33]:
from IPython.display import Image
Image(filename='AKplots/gauges.png', width=800)
Out[33]:

Gauge results

The gauge results are remarkably similar.

In each of the plots below the blue curve was computed using AK_PMEL_2009_Scenario1_slip_177 and the red curve using AASZ03.

Near Neah Bay

In [34]:
Image(filename='AKplots/gauge98.png', width=800)
Out[34]:

Near Port Angeles

In [35]:
Image(filename='AKplots/gauge99.png', width=800)
Out[35]:

In Admiralty Inlet

In [36]:
Image(filename='AKplots/gauge21.png', width=800)
Out[36]:

Source to use

In a meeting at PMEL on July 12, 2019 with DNR and EMD, it was decided to use the PMEL source explored in the cells above, with uniform slip of 20 m on the 20 subfaults, giving Mw 9.24 (which is normally rounded down to 9.2, but for clarity we will use the full 9.24 in our project report).

Note that this will give a slightly larger tsunami than the ones shown above.

Seafloor deformation from PMEL

Subsequently, a deformation file for this source was provided by PMEL. In the cells below we test that this agrees with what we generate from the unit sources directly.

Note that some errors were found in the Clawpack 5.6.0 version of the SIFT database in doing this, and are corrected below by adjusting the depth and dip of some subfaults.

In [37]:
import netCDF4
In [38]:
f = netCDF4.Dataset('AKpmel/deformation1.nc', 'r')
In [39]:
pmeldef_x = array(f.variables['GRID_LON']) - 360.
pmeldef_y = array(f.variables['GRID_LAT'])
pmeldef_X,pmeldef_Y = meshgrid(pmeldef_x,pmeldef_y)
pmeldef_dZ = -array(f.variables['DEFORMATION'])
pmeldef_X.shape, pmeldef_dZ.shape
Out[39]:
((300, 316), (300, 316))
In [40]:
pmeldef_x[1]-pmeldef_x[0], pmeldef_y[1]-pmeldef_y[0]
Out[40]:
(0.06666666666666288, 0.04229736328125)
In [41]:
60*.0423
Out[41]:
2.538
In [42]:
pmeldef_x[0],pmeldef_x[-1],pmeldef_y[0],pmeldef_y[-1]
Out[42]:
(-160.78329467773438,
 -139.78329467773438,
 50.64400100708008,
 61.653900146484375)
In [43]:
print('Average mesh spacing in arcminutes: %.2f by %.2f' \
      % (60 * mean(diff(pmeldef_x)), 60 * mean(diff(pmeldef_y))))
Average mesh spacing in arcminutes: 4.00 by 2.21
In [44]:
sift_slip_pmelmax_20 = {}
slip_uniform = 20.
for usrc in range(29,39):
    k = 'acsza%s' % usrc
    sift_slip_pmelmax_20[k] = slip_uniform        
    k = 'acszz%s' % usrc
    sift_slip_pmelmax_20[k] = slip_uniform

AK_pmelmax_20 = dtopotools.SiftFault(sift_slip_pmelmax_20, longitude_shift=-360.)
print('Magnitude = %.2f' % AK_pmelmax_20.Mw())


#x,y = AK_pmelmax_20.create_dtopo_xy(dx=1/60., buffer_size=0.5)
print('Will create dtopo with shape %i by %i' % (len(pmeldef_x),len(pmeldef_y)))
dtopo_AK_pmelmax_20 = AK_pmelmax_20.create_dtopography(pmeldef_x,pmeldef_y, 
                                                       times=[0.],verbose=True)
Magnitude = 9.24
Will create dtopo with shape 316 by 300
Making Okada dz for each of 20 subfaults
0..1..2..3..4..5..6..7..8..9..10..11..12..13..14..15..16..17..18..19..
Done
In [45]:
fig_background()
clines_neg = arange(-10,0.,1.)
clines_pos = arange(1,16,1.)
dZ = pmeldef_dZ
contour(pmeldef_X, pmeldef_Y, dZ, clines_neg, colors='b', linestyles='-')
contour(pmeldef_X, pmeldef_Y, dZ, clines_pos, colors='r', linestyles='-')
dZmin = dZ.min()
dZmax = dZ.max()
axis([-160,-143,52,62])

title('PMEL deformation\n min(dZ) = %.1f, max(dZ) = %.1f' % (dZmin,dZmax))
print('Blue contours at ', [c for c in clines_neg if c>=dZmin])
print('Red contours at ', [c for c in clines_pos if c<=dZmax])

subplot(122)
j = find(pmeldef_x < -145).max()
plot(pmeldef_y, dZ[:,j],'b')
axis([55,62,-10,20])
xlabel('Latitude')
ylabel('meters')
title('Transect at Longitude -145')
grid(True);
savefig('PMEL_deformation1.png')

fig_background()
clines_neg = arange(-10,0.,1.)
clines_pos = arange(1,16,1.)
dtopo = dtopo_AK_pmelmax_20
dZ = dtopo.dZ[-1,:,:]
contour(dtopo.X, dtopo.Y, dZ, clines_neg, colors='b', linestyles='-')
contour(dtopo.X, dtopo.Y, dZ, clines_pos, colors='r', linestyles='-')
dZmin = dZ.min()
dZmax = dZ.max()
axis([-160,-143,52,62])
title('AK pmelmax with slip=20\n min(dZ) = %.1f, max(dZ) = %.1f' % (dZmin,dZmax))
print('Blue contours at ', [c for c in clines_neg if c>=dZmin])
print('Red contours at ', [c for c in clines_pos if c<=dZmax])
subplot(122)
j = find(dtopo.x < -145).max()
plot(dtopo.y, dZ[:,j],'b')
axis([55,62,-10,20])
xlabel('Latitude')
ylabel('meters')
title('Transect at Longitude -145')
grid(True);

savefig('pmelmax_20.png')
Blue contours at  [-4.0, -3.0, -2.0, -1.0]
Red contours at  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
Blue contours at  [-6.0, -5.0, -4.0, -3.0, -2.0, -1.0]
Red contours at  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
In [46]:
for usrc in range(29,39):
    
    k = 'acsza%s' % usrc
    s = AK_pmelmax_20.sift_subfaults[k]
    print('%s  %.4f  %.4f  %4.1f  %.4f  %5.2f' \
        % (k, (s.longitude+360), s.latitude, s.dip, s.strike, (s.depth/1e3)))
    
    k = 'acszz%s' % usrc
    s = AK_pmelmax_20.sift_subfaults[k]
    print('%s  %.4f  %.4f  %4.1f  %.4f  %5.2f' \
        % (k, (s.longitude+360), s.latitude, s.dip, s.strike, (s.depth/1e3)))
acsza29  202.2610  55.1330  15.0  247.0000  17.94
acszz29  201.8797  55.4908  15.0  246.2137  30.88
acsza30  203.6040  55.5090  15.0  240.0000  17.94
acszz30  203.1521  55.8534  15.0  240.4869  30.88
acsza31  204.8950  55.9700  15.0  236.0000  17.94
acszz31  204.4315  56.3016  15.0  235.6690  30.88
acsza32  206.2080  56.4730  15.0  236.0000  17.94
acszz32  205.7880  56.8210  15.0  235.4756  30.88
acsza33  207.5370  56.9750  15.0  236.0000  17.94
acszz33  207.1091  57.3227  15.0  235.4119  30.88
acsza34  208.9371  57.5124  15.0  236.0000  17.94
acszz34  208.4198  57.8213  15.0  234.6891  30.88
acsza35  210.2597  58.0441  15.0  230.0000  17.94
acszz35  209.6425  58.3252  15.0  230.1971  30.88
acsza36  211.3249  58.6565  15.0  218.0000  17.94
acszz36  210.5412  58.8129  15.0  217.3327  30.88
acsza37  212.2505  59.2720  15.0  213.7100  17.94
acszz37  211.6079  59.5820  15.0  214.2669  30.88
acsza38  214.6555  60.1351   0.0  260.0800  15.00
acszz38  214.5362  60.5429   0.0  259.0313  15.00
In [47]:
for s in AK_pmelmax_20.subfaults:
    if s.depth < 16e3:
        print('Modifying depth at latitude %.4f' % s.latitude)
        if s.latitude > 60.4:
            s.depth = 30.88e3
        else:
            s.depth = 17.94e3
Modifying depth at latitude 60.1351
Modifying depth at latitude 60.5429
In [48]:
for s in AK_pmelmax_20.subfaults:
    if s.dip < 10:
        print('Modifying dip at latitude %.4f' % s.latitude)
        s.dip = 15.
Modifying dip at latitude 60.1351
Modifying dip at latitude 60.5429
In [50]:
for usrc in range(29,39):
    
    k = 'acsza%s' % usrc
    s = AK_pmelmax_20.sift_subfaults[k]
    print('%s  %.4f  %.4f  %.2f  %.4f  %.0f %.0f %.0f' \
        % (k, s.longitude, s.latitude, (s.depth/1e3), s.strike, s.dip, s.rake, s.slip))
    
    k = 'acszz%s' % usrc
    s = AK_pmelmax_20.sift_subfaults[k]
    print('%s  %.4f  %.4f  %.2f  %.4f  %.0f %.0f %.0f' \
        % (k, s.longitude, s.latitude, (s.depth/1e3), s.strike, s.dip, s.rake, s.slip))
acsza29  -157.7390  55.1330  17.94  247.0000  15 90 20
acszz29  -158.1203  55.4908  30.88  246.2137  15 90 20
acsza30  -156.3960  55.5090  17.94  240.0000  15 90 20
acszz30  -156.8479  55.8534  30.88  240.4869  15 90 20
acsza31  -155.1050  55.9700  17.94  236.0000  15 90 20
acszz31  -155.5685  56.3016  30.88  235.6690  15 90 20
acsza32  -153.7920  56.4730  17.94  236.0000  15 90 20
acszz32  -154.2120  56.8210  30.88  235.4756  15 90 20
acsza33  -152.4630  56.9750  17.94  236.0000  15 90 20
acszz33  -152.8909  57.3227  30.88  235.4119  15 90 20
acsza34  -151.0629  57.5124  17.94  236.0000  15 90 20
acszz34  -151.5802  57.8213  30.88  234.6891  15 90 20
acsza35  -149.7403  58.0441  17.94  230.0000  15 90 20
acszz35  -150.3575  58.3252  30.88  230.1971  15 90 20
acsza36  -148.6751  58.6565  17.94  218.0000  15 90 20
acszz36  -149.4588  58.8129  30.88  217.3327  15 90 20
acsza37  -147.7495  59.2720  17.94  213.7100  15 90 20
acszz37  -148.3921  59.5820  30.88  214.2669  15 90 20
acsza38  -145.3445  60.1351  17.94  260.0800  15 90 20
acszz38  -145.4638  60.5429  30.88  259.0313  15 90 20
In [51]:
print('Will create dtopo with shape %i by %i' % (len(pmeldef_x),len(pmeldef_y)))
dtopo_AK_pmelmax_20 = AK_pmelmax_20.create_dtopography(pmeldef_x,pmeldef_y, 
                                                       times=[0.],verbose=True)
Will create dtopo with shape 316 by 300
Making Okada dz for each of 20 subfaults
0..1..2..3..4..5..6..7..8..9..10..11..12..13..14..15..16..17..18..19..
Done
In [52]:
fig_background()
clines_neg = arange(-10,0.,1.)
clines_pos = arange(1,16,1.)
dZ = pmeldef_dZ
contour(pmeldef_X, pmeldef_Y, dZ, clines_neg, colors='b', linestyles='-')
contour(pmeldef_X, pmeldef_Y, dZ, clines_pos, colors='r', linestyles='-')
dZmin = dZ.min()
dZmax = dZ.max()
axis([-160,-143,52,62])

title('PMEL deformation\n min(dZ) = %.1f, max(dZ) = %.1f' % (dZmin,dZmax))
print('Blue contours at ', [c for c in clines_neg if c>=dZmin])
print('Red contours at ', [c for c in clines_pos if c<=dZmax])

subplot(122)
j = find(pmeldef_x < -145).max()
plot(pmeldef_y, dZ[:,j],'b')
axis([55,62,-10,20])
xlabel('Latitude')
ylabel('meters')
title('Transect at Longitude -145')
grid(True);
#savefig('PMEL_deformation1.png')

fig_background()
clines_neg = arange(-10,0.,1.)
clines_pos = arange(1,16,1.)
dtopo = dtopo_AK_pmelmax_20
dZ = dtopo.dZ[-1,:,:]
contour(dtopo.X, dtopo.Y, dZ, clines_neg, colors='b', linestyles='-')
contour(dtopo.X, dtopo.Y, dZ, clines_pos, colors='r', linestyles='-')
dZmin = dZ.min()
dZmax = dZ.max()
axis([-160,-143,52,62])
title('AK pmelmax with slip=20\n min(dZ) = %.1f, max(dZ) = %.1f' % (dZmin,dZmax))
print('Blue contours at ', [c for c in clines_neg if c>=dZmin])
print('Red contours at ', [c for c in clines_pos if c<=dZmax])
subplot(122)
j = find(dtopo.x < -145).max()
plot(dtopo.y, dZ[:,j],'b')
axis([55,62,-10,20])
xlabel('Latitude')
ylabel('meters')
title('Transect at Longitude -145')
grid(True);

savefig('pmelmax_20_fix_depth_and_dip.png')
Blue contours at  [-4.0, -3.0, -2.0, -1.0]
Red contours at  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
Blue contours at  [-4.0, -3.0, -2.0, -1.0]
Red contours at  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
In [53]:
AK_pmelmax_20.plot_subfaults_depth()
tight_layout()
In [54]:
len(AK_pmelmax_20.sift_subfaults)
Out[54]:
1989
In [55]:
s = AK_pmelmax_20.sift_subfaults['acsza38']
s.depth
Out[55]:
17940.0
In [56]:
AK_pmelmax_20_fix = dtopotools.SiftFault(longitude_shift=-360.)

# fix subfaults:
SIFT = AK_pmelmax_20_fix.sift_subfaults

k = 'acsza38'
s = SIFT[k]
print('%s, old dip = %i, depth = %.3f' % (k,s.dip, s.depth/1e3))
s.dip = 15; s.depth = 17.94e3
print('%s, new dip = %i, depth = %.3f' % (k,s.dip, s.depth/1e3))

k = 'acszz38'
s = SIFT[k]
print('%s, old dip = %i, depth = %.3f' % (k,s.dip, s.depth/1e3))
s.dip = 15; s.depth = 30.88e3
print('%s, new dip = %i, depth = %.3f' % (k,s.dip, s.depth/1e3))
acsza38, old dip = 0, depth = 15.000
acsza38, new dip = 15, depth = 17.940
acszz38, old dip = 0, depth = 15.000
acszz38, new dip = 15, depth = 30.880
In [57]:
for usrc in range(29,39):
    
    k = 'acsza%s' % usrc
    s = AK_pmelmax_20_fix.sift_subfaults[k]
    print('%s  %.4f  %.4f  %4.1f  %.4f  %5.2f' \
        % (k, (s.longitude+360), s.latitude, s.dip, s.strike, (s.depth/1e3)))
    
    k = 'acszz%s' % usrc
    s = AK_pmelmax_20_fix.sift_subfaults[k]
    print('%s  %.4f  %.4f  %4.1f  %.4f  %5.2f' \
        % (k, (s.longitude+360), s.latitude, s.dip, s.strike, (s.depth/1e3)))
acsza29  202.2610  55.1330  15.0  247.0000  17.94
acszz29  201.8797  55.4908  15.0  246.2137  30.88
acsza30  203.6040  55.5090  15.0  240.0000  17.94
acszz30  203.1521  55.8534  15.0  240.4869  30.88
acsza31  204.8950  55.9700  15.0  236.0000  17.94
acszz31  204.4315  56.3016  15.0  235.6690  30.88
acsza32  206.2080  56.4730  15.0  236.0000  17.94
acszz32  205.7880  56.8210  15.0  235.4756  30.88
acsza33  207.5370  56.9750  15.0  236.0000  17.94
acszz33  207.1091  57.3227  15.0  235.4119  30.88
acsza34  208.9371  57.5124  15.0  236.0000  17.94
acszz34  208.4198  57.8213  15.0  234.6891  30.88
acsza35  210.2597  58.0441  15.0  230.0000  17.94
acszz35  209.6425  58.3252  15.0  230.1971  30.88
acsza36  211.3249  58.6565  15.0  218.0000  17.94
acszz36  210.5412  58.8129  15.0  217.3327  30.88
acsza37  212.2505  59.2720  15.0  213.7100  17.94
acszz37  211.6079  59.5820  15.0  214.2669  30.88
acsza38  214.6555  60.1351  15.0  260.0800  17.94
acszz38  214.5362  60.5429  15.0  259.0313  30.88
In [58]:
sift_slip_pmelmax_20_fix = {}
slip_uniform = 20.
for usrc in range(29,39):
    k = 'acsza%s' % usrc
    sift_slip_pmelmax_20_fix[k] = slip_uniform        
    k = 'acszz%s' % usrc
    sift_slip_pmelmax_20_fix[k] = slip_uniform
    
AK_pmelmax_20_fix.set_subfaults(sift_slip_pmelmax_20_fix)

print('Magnitude = %.2f' % AK_pmelmax_20_fix.Mw())


#x,y = AK_pmelmax_20_fix.create_dtopo_xy(dx=1/60., buffer_size=0.5)

# Use x,y from the PMEL deformation file:
print('Will create dtopo with shape %i by %i' % (len(pmeldef_x),len(pmeldef_y)))
dtopo_AK_pmelmax_20_fix = AK_pmelmax_20_fix.create_dtopography(pmeldef_x,pmeldef_y, 
                                                       times=[0.],verbose=True)
Magnitude = 9.24
Will create dtopo with shape 316 by 300
Making Okada dz for each of 20 subfaults
0..1..2..3..4..5..6..7..8..9..10..11..12..13..14..15..16..17..18..19..
Done
In [59]:
fig_background()
clines_neg = arange(-10,0.,1.)
clines_pos = arange(1,16,1.)
dZ = pmeldef_dZ
contour(pmeldef_X, pmeldef_Y, dZ, clines_neg, colors='b', linestyles='-')
contour(pmeldef_X, pmeldef_Y, dZ, clines_pos, colors='r', linestyles='-')
dZmin = dZ.min()
dZmax = dZ.max()
axis([-160,-143,52,62])

title('PMEL deformation\n min(dZ) = %.1f, max(dZ) = %.1f' % (dZmin,dZmax))
print('Blue contours at ', [c for c in clines_neg if c>=dZmin])
print('Red contours at ', [c for c in clines_pos if c<=dZmax])

subplot(122)
j = find(pmeldef_x < -145).max()
plot(pmeldef_y, dZ[:,j],'b')
axis([55,62,-10,20])
xlabel('Latitude')
ylabel('meters')
title('Transect at Longitude -145')
grid(True);
#savefig('PMEL_deformation1.png')

fig_background()
clines_neg = arange(-10,0.,1.)
clines_pos = arange(1,16,1.)
dtopo = dtopo_AK_pmelmax_20_fix
dZ = dtopo.dZ[-1,:,:]
contour(dtopo.X, dtopo.Y, dZ, clines_neg, colors='b', linestyles='-')
contour(dtopo.X, dtopo.Y, dZ, clines_pos, colors='r', linestyles='-')
dZmin = dZ.min()
dZmax = dZ.max()
axis([-160,-143,52,62])
title('AK pmelmax with slip=20\n min(dZ) = %.1f, max(dZ) = %.1f' % (dZmin,dZmax))
print('Blue contours at ', [c for c in clines_neg if c>=dZmin])
print('Red contours at ', [c for c in clines_pos if c<=dZmax])
subplot(122)
j = find(dtopo.x < -145).max()
plot(dtopo.y, dZ[:,j],'b')
axis([55,62,-10,20])
xlabel('Latitude')
ylabel('meters')
title('Transect at Longitude -145')
grid(True);

savefig('pmelmax_20_fix_depth_and_dip.png')
Blue contours at  [-4.0, -3.0, -2.0, -1.0]
Red contours at  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
Blue contours at  [-4.0, -3.0, -2.0, -1.0]
Red contours at  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
In [60]:
abs(pmeldef_dZ - dZ).max()
Out[60]:
1.691058448545757

Plot the differences between the PMEL deformation and the one produced with GeoClaw:

In [61]:
fig_background()
v = [-2,-1.5,-1,-0.5,-0.1, 0, 0.1,0.5,1,1.5,2]
c = [[0,0,1],[.2,.2,1],[.4,.4,1],[.6,.6,1],[1,1,1],
     [1,1,1],[1,.6,.6],[1,.4,.4],[1,.2,.2],[1,0,0]]
contourf(dtopo.X, dtopo.Y, pmeldef_dZ - dZ, v, colors=c)
colorbar()
Out[61]:
<matplotlib.colorbar.Colorbar at 0xb1f710588>

While the difference seem large in places, plotting transects reveals that this is mostly do to a slight horizontal shift:

In [62]:
long = -154.5
j = find(dtopo.x < long).max()
plot(dtopo.y, dZ[:,j],'b', label='Okada')
j = find(pmeldef_x < long).max()
plot(pmeldef_y, pmeldef_dZ[:,j],'r', label='PMEL def')
legend(loc='upper right')
axis([55,62,-10,20])
xlabel('Latitude')
ylabel('meters')
title('Trasect at longitude %.1f' % long);
In [63]:
long = -148.
j = find(dtopo.x < long).max()
plot(dtopo.y, dZ[:,j],'b', label='Okada')
j = find(pmeldef_x < long).max()
plot(pmeldef_y, pmeldef_dZ[:,j],'r', label='PMEL def')
legend(loc='upper right')
axis([55,62,-10,20])
xlabel('Latitude')
ylabel('meters')
title('Trasect at longitude %.1f' % long);

Create a plot for the final report showing the source used:

In [64]:
figure(figsize=(12,10))
subplot(121)
#contourf(etopo1.X, etopo1.Y, etopo1.Z, [0,10000], colors=[[.8,1,.8]])
contourf(etopo1.X, etopo1.Y, etopo1.Z, [0,10000], colors=[[0.6,1,0.6]])
contour(etopo1.X, etopo1.Y, etopo1.Z, [0], colors='g', lw=0.5)
plot([-149.9],[61.2],'ro')
text(-150.2,61.4,'Anchorage',color='r',fontsize=14)
axis([-158, -143, 54, 62])
gca().set_aspect(1/cos(57*pi/180))
grid(True)

clines_neg = arange(-10,0.,1.)
clines_pos = arange(1,16,1.)
dZ = pmeldef_dZ
contour(pmeldef_X, pmeldef_Y, dZ, clines_neg, colors='b', linestyles='-')
contour(pmeldef_X, pmeldef_Y, dZ, clines_pos, colors='r', linestyles='-')
dZmin = dZ.min()
dZmax = dZ.max()
axis([-160,-143,52,62])

title('AK source deformation')
print('Blue contours at ', [c for c in clines_neg if c>=dZmin])
print('Red contours at ', [c for c in clines_pos if c<=dZmax])

savefig('dtopoAK.png',bbox_inches='tight')
Blue contours at  [-4.0, -3.0, -2.0, -1.0]
Red contours at  [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]

Create dtopo file for GeoClaw

Note that we must first generate the deformation on a uniform grid rather than the grid used by PMEL, which was nonuniform in y, since the GeoClaw format has a header followed by data and assumes uniform spacing.

In [89]:
x_unif = linspace(pmeldef_x[0], pmeldef_x[-1], 316)
y_unif = linspace(pmeldef_y[0], pmeldef_y[-1], 301)
dtopo_AK_pmelmax_20_unif = AK_pmelmax_20_fix.create_dtopography(x_unif, y_unif, 
                                                       times=[1.],verbose=True)

dtopo_AK_pmelmax_20_unif.write('AK_pmel20.tt3', 3)
Making Okada dz for each of 20 subfaults
0..1..2..3..4..5..6..7..8..9..10..11..12..13..14..15..16..17..18..19..
Done

For some reason this is slightly different than the dtopo file used in the runs, stored in dtopofiles/AKpmel20.tt3, but essentially identical...

In [87]:
dtopo_reload = dtopotools.DTopography('AK_pmel20.tt3',3)
In [66]:
dtopo_runs = dtopotools.DTopography('dtopofiles/AKpmel20.tt3',3)
In [93]:
abs(dtopo_runs.dZ - dtopo_AK_pmelmax_20_unif.dZ).max()
Out[93]:
0.2871307406539012
In [95]:
figure(figsize=(20,20))
subplot(121)
#contourf(etopo1.X, etopo1.Y, etopo1.Z, [0,10000], colors=[[.8,1,.8]])
contourf(etopo1.X, etopo1.Y, etopo1.Z, [0,10000], colors=[[0.6,1,0.6]])
contour(etopo1.X, etopo1.Y, etopo1.Z, [0], colors='g', lw=0.5)
plot([-149.9],[61.2],'ro')
text(-150.2,61.4,'Anchorage',color='r',fontsize=14)
axis([-158, -143, 54, 62])
gca().set_aspect(1/cos(57*pi/180))
grid(True)

clines_neg = arange(-10,0.,1.)
clines_pos = arange(1,16,1.)

dZ = pmeldef_dZ
contour(pmeldef_X, pmeldef_Y, dZ, clines_neg, colors='c', linestyles='-')
contour(pmeldef_X, pmeldef_Y, dZ, clines_pos, colors='m', linestyles='-')

dd = dtopo_runs
contour(dd.X, dd.Y, dd.dZ[0,:,:], clines_neg, colors='b', linestyles='-')
contour(dd.X, dd.Y, dd.dZ[0,:,:], clines_pos, colors='r', linestyles='-')
dd = dtopo_reload
contour(dd.X, dd.Y, dd.dZ[0,:,:], clines_neg, colors='b', linestyles='-')
contour(dd.X, dd.Y, dd.dZ[0,:,:], clines_pos, colors='r', linestyles='-')

dZmin = dZ.min()
dZmax = dZ.max()
axis([-160,-143,54,62])
Out[95]:
[-160, -143, 54, 62]

Conclusions

  • In a meeting at PMEL on July 12, 2019 with DNR and EMD, it was decided to use the PMEL source explored in the cells above, with uniform slip of 20 m on the 20 subfaults, giving Mw 9.24 (which is normally rounded down to 9.2, but for clarity we will use the full 9.24 in our project report).

  • The incorrect values in the SIFT database for some unit sources (dip and depth, that were corrected above) have been corrected on the webpage https://sift.pmel.noaa.gov/ComMIT/compressed/info_sz.dat. The computations done in this notebook were using geoclaw.dtopotools from Clawpack 5.6.0, which contained an earlier incorrect version of this database. This will be corrected in future versions of Clawpack.

  • We will use the dtopo file generated from the unit sources above by GeoClaw. We confirm above that this agrees well with the PMEL deformation file, although they are not exactly equal.