pism-exp-gsw

ice stream and sediment transport experiments
git clone git://src.adamsgaard.dk/pism-exp-gsw # fast
git clone https://src.adamsgaard.dk/pism-exp-gsw.git # slow
Log | Files | Refs | README | LICENSE Back to index

commit 1c7dcced9c0a9c9b8915593268159a4d4490e322
parent 92cec776e88d9a786c967f6d5e5f3bc0faf8d246
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Tue,  7 Dec 2021 22:38:28 +0100

add plots for AGU

Diffstat:
MMakefile | 8++++++++
Aplot-till-evolution.py | 124+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mplot-time-series.py | 20+++++++++++---------
3 files changed, 143 insertions(+), 9 deletions(-)

diff --git a/Makefile b/Makefile @@ -30,14 +30,22 @@ OUT_COMMON =\ -ys 0 -ye ${T_END}\ all: \ + ex_deltaSL-linear_1d-till-evol.pdf\ ex_deltaSL-linear_1d-profile.pdf\ + ex_constant-linear_1d-till-evol.pdf\ ex_constant-linear_1d-profile.pdf\ ex_nt-deltaSL-linear_1d-profile.pdf\ ex_nt-constant-linear_1d-profile.pdf\ +ex_deltaSL-linear_1d-till-evol.pdf: ex_deltaSL-linear_1d.nc plot-till-evolution.py + ./plot-till-evolution.py ex_deltaSL-linear_1d.nc + ex_deltaSL-linear_1d-profile.pdf: ex_deltaSL-linear_1d.nc plot-time-series.py ./plot-time-series.py ex_deltaSL-linear_1d.nc +ex_constant-linear_1d-till-evol.pdf: ex_constant-linear_1d.nc plot-till-evolution.py + ./plot-till-evolution.py ex_constant-linear_1d.nc + ex_constant-linear_1d-profile.pdf: ex_constant-linear_1d.nc plot-time-series.py ./plot-time-series.py ex_constant-linear_1d.nc diff --git a/plot-till-evolution.py b/plot-till-evolution.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 + +from pylab import figure, subplots, plot, xlabel, ylabel, title, axis, vlines, savefig, text, tight_layout, cm, legend +from sys import exit + +import MISMIP + +import numpy as np +from optparse import OptionParser +import os.path + +try: + from netCDF4 import Dataset as NC +except: + print("netCDF4 is not installed!") + sys.exit(1) + +def process_options(): + "Process command-line options and arguments." + parser = OptionParser() + parser.usage = "%prog <input files> [options]" + parser.description = "Plots the ice flux as a function of the distance from the divide." + parser.add_option("-o", "--output", dest="output", type="string", + help="Output image file name (e.g. -o foo.png)") + + opts, args = parser.parse_args() + + if len(args) == 0: + print("ERROR: An input file is requied.") + exit(0) + + if len(args) > 1 and opts.output: + print("More than one input file given. Ignoring the -o option...\n") + opts.output = None + + return args, opts.output, opts + + +def read(filename, name): + "Read a variable and extract the middle row." + nc = NC(filename) + + try: + var = nc.variables[name][:] + except: + print("ERROR: Variable '%s' not present in '%s'" % (name, filename)) + exit(1) + + return var + + +def find_grounding_line(x, topg, thk, mask): + "Find the modeled grounding line position." + # "positive" parts of x, topg, thk, mask + topg = topg[x > 0] + thk = thk[x > 0] + mask = mask[x > 0] + x = x[x > 0] # this should go last + + def f(j): + "See equation (7) in Pattyn et al, 'Role of transition zones in marine ice sheet dynamics', 2005." + z_sl = 0 + return (z_sl - topg[j]) * MISMIP.rho_w() / (MISMIP.rho_i() * thk[j]) + + for j in range(x.size): + if mask[j] == 2 and mask[j + 1] == 3: # j is grounded, j+1 floating + nabla_f = (f(j + 1) - f(j)) / (x[j + 1] - x[j]) + + # See equation (8) in Pattyn et al + return (1.0 - f(j) + nabla_f * x[j]) / nabla_f + + raise Exception("Can't find the grounding line") + + +def plot_profile(in_file, out_file): + + if out_file is None: + out_file = os.path.splitext(in_file)[0] + "-till-evol.pdf" + + steps = read(in_file, 'thk').shape[0] + + fig, ax = subplots(1, 1, sharex=True, figsize=[6, 3]) + for i in range(1, steps): + + mask = read(in_file, 'mask')[i] + uvelbase = read(in_file, 'uvelbase')[i] + utillflux = read(in_file, 'utillflux')[i] + till_deposit = read(in_file, 'tilldeposit')[i] + x = read(in_file, 'x') + + # convert x to kilometers + x /= 1e3 + + # modeled grounding line position + #xg_PISM = find_grounding_line(x, lsrf, thk, mask) + #plot(x, np.zeros_like(x), ls='dotted', color='red') + icecolor = cm.cool(i / steps) + #ax[0].plot(x, uvelbase, color=icecolor) + #ax[1].plot(x, utillflux, color=icecolor) #, label='{}'.format(i)) + ax.plot(x, till_deposit, color=icecolor) + + ax.set_xlabel('distance from the divide, km') + #ax[0].set_ylabel('$v_{SSA}$, m/a') + #ax[1].set_ylabel('$q_{t,x}$, m$^2$/a') + ax.set_ylabel('$\Delta b$, m') + + #_, _, ymin, ymax = axis(xmin=0, xmax=x.max()) + _, _, ymin, ymax = axis(xmin=950, xmax=1150) + #_, _, ymin, ymax = axis(xmin=x.min(), xmax=x.max()) + + #vlines(xg / 1e3, ymin, ymax, linestyles='dashed', color='black') + #vlines(xg_PISM / 1e3, ymin, ymax, linestyles='dashed', color='red') + + #legend() + fig.tight_layout() + print("Saving '%s'...\n" % out_file) + savefig(out_file) + +if __name__ == "__main__": + args, out_file, opts = process_options() + + for in_file in args: + plot_profile(in_file, out_file)+ \ No newline at end of file diff --git a/plot-time-series.py b/plot-time-series.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -from pylab import figure, subplot, plot, xlabel, ylabel, title, axis, vlines, savefig, text, tight_layout, cm, legend +from pylab import figure, subplots, plot, xlabel, ylabel, title, axis, vlines, savefig, text, tight_layout, cm, legend from sys import exit import MISMIP @@ -79,8 +79,7 @@ def plot_profile(in_file, out_file): steps = read(in_file, 'thk').shape[0] - figure(1) - ax = subplot(111) + fig, ax = subplots(1, 1, figsize=[4, 3]) for i in range(1, steps): mask = read(in_file, 'mask')[i] @@ -89,6 +88,7 @@ def plot_profile(in_file, out_file): lsrf = topg.copy() thk = read(in_file, 'thk')[i] sea_lvl = read(in_file, 'sea_level')[i] + #till_deposit = read(in_file, 'tilldeposit')[i] x = read(in_file, 'x') # mask out ice-free areas @@ -104,20 +104,22 @@ def plot_profile(in_file, out_file): #xg_PISM = find_grounding_line(x, lsrf, thk, mask) #plot(x, np.zeros_like(x), ls='dotted', color='red') icecolor = cm.cool(i / steps) - plot(x, topg, color='black') - plot(x, usurf, color=icecolor, label='{}'.format(i)) - plot(x, lsrf, color=icecolor) + ax.plot(x, topg, color='black') + ax.plot(x, usurf, color=icecolor, label='{}'.format(i)) + ax.plot(x, lsrf, color=icecolor) - xlabel('distance from the divide, km') - ylabel('elevation, m') + ax.set_xlabel('distance from the divide, km') + ax.set_ylabel('elevation, m') #_, _, ymin, ymax = axis(xmin=0, xmax=x.max()) + _, _, ymin, ymax = axis(xmin=950, xmax=1150, ymin=-500, ymax=1150) #_, _, ymin, ymax = axis(xmin=x.min(), xmax=x.max()) #vlines(xg / 1e3, ymin, ymax, linestyles='dashed', color='black') #vlines(xg_PISM / 1e3, ymin, ymax, linestyles='dashed', color='red') - legend() + #legend() + fig.tight_layout() print("Saving '%s'...\n" % out_file) savefig(out_file)