34 S Vanuatu#

Authors: Kidus Teshome, Cian Wilson

Steady state implementation#

Preamble#

Set some path information.

import sys, os
basedir = ''
if "__file__" in globals(): basedir = os.path.dirname(__file__)
sys.path.append(os.path.join(basedir, os.path.pardir, os.path.pardir, os.path.pardir, 'python'))

Loading everything we need from sz_problem and also set our default plotting and output preferences.

import utils
from sz_problems.sz_params import allsz_params
from sz_problems.sz_slab import create_slab, plot_slab
from sz_problems.sz_geometry import create_sz_geometry
from sz_problems.sz_steady_dislcreep import SteadyDislSubductionProblem
import numpy as np
import dolfinx as df
import pyvista as pv
import pathlib
output_folder = pathlib.Path(os.path.join(basedir, "output"))
output_folder.mkdir(exist_ok=True, parents=True)
import hashlib
import zipfile
import requests

Parameters#

We first select the name and resolution scale, resscale of the model.

Resolution

By default the resolution is low to allow for a quick runtime and smaller website size. If sufficient computational resources are available set a lower resscale to get higher resolutions and results with sufficient accuracy.

name = "34_S_Vanuatu"
resscale = 3.0

Then load the remaining parameters from the global suite.

szdict = allsz_params[name]
print("{}:".format(name))
print("{:<20} {:<10}".format('Key','Value'))
print("-"*85)
for k, v in allsz_params[name].items():
    if v is not None and k not in ['z0', 'z15']: print("{:<20} {}".format(k, v))
34_S_Vanuatu:
Key                  Value     
-------------------------------------------------------------------------------------
coast_distance       120
extra_width          20
lc_depth             30
io_depth             166
dirname              34_S_Vanuatu
As                   20.0
Ac                   25.0
A                    50
sztype               oceanic
Vs                   112.7
xs                   [0, 33.8, 65.0, 93.0, 97.2, 98.2, 105.0, 126.0, 164.0]
ys                   [-6, -15.0, -30.0, -70.0, -80.0, -82.5, -100.0, -150.0, -240.0]

Any of these can be modified in the dictionary.

Several additional parameters can be modified, for details see the documentation for the SteadyDislSubductionProblem class.

SteadyDislSubductionProblem?

Setup#

Setup a slab.

slab = create_slab(szdict['xs'], szdict['ys'], resscale, szdict['lc_depth'])
_ = plot_slab(slab)
../../../_images/9bcad8135b6629050d48e1cfccb314062188d6b4e034954855f079b4ed8a58f9.png

Create the subduction zome geometry around the slab.

geom = create_sz_geometry(slab, resscale, szdict['sztype'], szdict['io_depth'], szdict['extra_width'], 
                             szdict['coast_distance'], szdict['lc_depth'], szdict['uc_depth'])
_ = geom.plot()
../../../_images/44d08bd17bff2fc9bfc204c66bae623e98dee9c8f55d9628d537074778be2e48.png

Finally, declare the SubductionZone problem class using the dictionary of parameters.

sz = SteadyDislSubductionProblem(geom, **szdict)

Solve#

Solve using a dislocation creep rheology and assuming a steady state.

sz.solve()
Iteration   Residual     Relative Residual
------------------------------------------
0           8172.06      1           
1           711.519      0.0870673   
2           141.652      0.0173336   
3           71.5361      0.00875374  
4           44.2626      0.00541633  
5           29.6861      0.00363263  
6           20.5571      0.00251554  
7           14.6478      0.00179242  
8           10.7072      0.00131022  
9           7.9981       0.000978712 
10          6.08329      0.0007444   
11          4.69534      0.00057456  
12          3.66625      0.000448632 
13          2.88836      0.000353444 
14          2.29109      0.000280357 
15          1.82667      0.000223526 
16          1.4619       0.00017889  
17          1.17319      0.00014356  
18          0.943313     0.000115431 
19          0.759578     9.29481e-05 
20          0.612264     7.49215e-05 
21          0.4939       6.04376e-05 
22          0.39867      4.87845e-05 
23          0.321986     3.94008e-05 
24          0.260197     3.18398e-05 
25          0.210389     2.57449e-05 
26          0.170225     2.08301e-05 
27          0.137827     1.68656e-05 
28          0.111683     1.36665e-05 
29          0.0905773    1.10838e-05 
30          0.073528     8.99749e-06 
31          0.0597462    7.31103e-06 
32          0.0485966    5.94668e-06 
33          0.0395684    4.84191e-06 

Plot#

Plot the solution.

plotter = pv.Plotter()
utils.plot.plot_scalar(sz.T_i, plotter=plotter, scale=sz.T0, gather=True, cmap='coolwarm', scalar_bar_args={'title': 'Temperature (deg C)', 'bold':True})
utils.plot.plot_vector_glyphs(sz.vw_i, plotter=plotter, gather=True, factor=0.1, color='k', scale=utils.mps_to_mmpyr(sz.v0))
utils.plot.plot_vector_glyphs(sz.vs_i, plotter=plotter, gather=True, factor=0.1, color='k', scale=utils.mps_to_mmpyr(sz.v0))
utils.plot.plot_geometry(geom, plotter=plotter, color='green', width=2)
utils.plot.plot_couplingdepth(slab, plotter=plotter, render_points_as_spheres=True, point_size=10.0, color='green')
utils.plot.plot_show(plotter)
utils.plot.plot_save(plotter, output_folder / "{}_ss_solution_resscale_{:.2f}.png".format(name, resscale))

Save it to disk so that it can be examined with other visualization software (e.g. Paraview).

filename = output_folder / "{}_ss_solution_resscale_{:.2f}.bp".format(name, resscale)
with df.io.VTXWriter(sz.mesh.comm, filename, [sz.T_i, sz.vs_i, sz.vw_i]) as vtx:
    vtx.write(0.0)
# zip the .bp folder so that it can be downloaded from Jupyter lab
zipfilename = filename.with_suffix(".zip")
!zip -r $zipfilename $filename
  adding: output/34_S_Vanuatu_ss_solution_resscale_3.00.bp/ (stored 0%)
  adding: output/34_S_Vanuatu_ss_solution_resscale_3.00.bp/mmd.0 (deflated 64%)
  adding: output/34_S_Vanuatu_ss_solution_resscale_3.00.bp/profiling.json (deflated 62%)
  adding: output/34_S_Vanuatu_ss_solution_resscale_3.00.bp/md.idx (deflated 59%)
  adding: output/34_S_Vanuatu_ss_solution_resscale_3.00.bp/md.0 (deflated 76%)
  adding: output/34_S_Vanuatu_ss_solution_resscale_3.00.bp/data.0 (deflated 63%)

Comparison#

Compare to the published result from Wilson & van Keken, PEPS, 2023 (II) and van Keken & Wilson, PEPS, 2023 (III). The original models used in these papers are also available as open-source repositories on github and zenodo.

First download the minimal necessary data from zenodo and check it is the right version.

zipfilename = pathlib.Path(os.path.join(basedir, os.path.pardir, os.path.pardir, os.path.pardir, "data", "vankeken_wilson_peps_2023_TF_lowres_minimal.zip"))
if not zipfilename.is_file():
    zipfileurl = 'https://zenodo.org/records/13234021/files/vankeken_wilson_peps_2023_TF_lowres_minimal.zip'
    r = requests.get(zipfileurl, allow_redirects=True)
    open(zipfilename, 'wb').write(r.content)
assert hashlib.md5(open(zipfilename, 'rb').read()).hexdigest() == 'a8eca6220f9bee091e41a680d502fe0d'
tffilename = os.path.join('vankeken_wilson_peps_2023_TF_lowres_minimal', 'sz_suite_ss', szdict['dirname']+'_minres_2.00.vtu')
tffilepath = os.path.join(basedir, os.path.pardir, os.path.pardir, os.path.pardir, 'data')
with zipfile.ZipFile(zipfilename, 'r') as z:
    z.extract(tffilename, path=tffilepath)
fxgrid = utils.plot.grids_scalar(sz.T_i)[0]

tfgrid = pv.get_reader(os.path.join(tffilepath, tffilename)).read()

diffgrid = utils.plot.pv_diff(fxgrid, tfgrid, field_name_map={'T':'Temperature::PotentialTemperature'}, pass_point_data=True)
diffgrid.set_active_scalars('T')
plotter_diff = pv.Plotter()
clim = None
plotter_diff.add_mesh(diffgrid, cmap='coolwarm', clim=clim, scalar_bar_args={'title': 'Temperature Difference (deg C)', 'bold':True})
utils.plot.plot_geometry(geom, plotter=plotter_diff, color='green', width=2)
utils.plot.plot_couplingdepth(slab, plotter=plotter_diff, render_points_as_spheres=True, point_size=5.0, color='green')
plotter_diff.enable_parallel_projection()
plotter_diff.view_xy()
plotter_diff.show()
integrated_data = diffgrid.integrate_data()
error = integrated_data['T'][0]/integrated_data['Area'][0]
print("Average error = {}".format(error,))
assert np.abs(error) < 5
Average error = 4.275425806440598