Risk Assessment#

import os
import os.path as op
import sys

import glob
import natsort
import xarray as xr
import matplotlib.pyplot as plt
from matplotlib import colors
from matplotlib.colors import ListedColormap
from matplotlib.gridspec import GridSpec
import cmocean
import matplotlib.colors as mcolors
import matplotlib

import numpy as np
import numpy.ma as ma
import pandas as pd
from natsort import natsorted
import contextily as ctx

# geospatial
import rioxarray
sys.path.insert(0, op.join(os.getcwd(), '..',  'lib'))

from plot import Map
from config import *
from data_process import agg_damage_syn, calculate_risk_syn
island = 'samoa'              
mode = 'syn'          
code_utm = code_utm_samoa
# main project folder
p_main = op.join(os.getcwd(), '..')
p_data = op.join(p_main ,'data')

p_output = op.join(p_main, 'output')

p_tcs = op.join(p_main, 'data', 'TCs_')
# load bathymetry and dem
bathy = rioxarray.open_rasterio(op.join(p_data, '{0}_smooth_utm.tif'.format(island))).drop('band').squeeze()
dem_savaii = xr.open_dataset(op.join(p_data, 'savaii_5m.nc')).isel(x=slice(None, None, 20), y=slice(None, None, 20))
dem_upolu = xr.open_dataset(op.join(p_data, 'upolu_5m.nc')).isel(x=slice(None, None, 20), y=slice(None, None, 20))

tcs = xr.open_dataset(op.join(p_tcs, 'TCs_r8_{0}_{1}.nc'.format(mode, island)))
tcs_ids = xr.open_dataset(op.join(p_tcs, 'Tesla_sim_newTCIds_Samoa.nc'))

# select only first simulation
#tcs = tcs.sel
# load dem
dem_savaii = xr.open_dataset(op.join(p_data, 'savaii_5m.nc')).isel(x=slice(None, None, 20), y=slice(None, None, 20))
dem_upolu = xr.open_dataset(op.join(p_data, 'upolu_5m.nc')).isel(x=slice(None, None, 20), y=slice(None, None, 20))
dem_samoa = xr.merge([dem_savaii.sel(x=slice(None, dem_upolu.x.min()-10)), dem_upolu])
dem_samoa = dem_samoa.where(dem_samoa > 0)
mapRk = Map()
mapRk.dem = dem_samoa
# load damages 
pr_savaii_rainTC = glob.glob(op.join(p_main, 'riskscape', 'io', 'io_savaii', 'results', mode, 'rainTC*', 'damage_100_TC*.nc'))
pr_savaii_windTC = glob.glob(op.join(p_main, 'riskscape', 'io', 'io_savaii', 'results', mode, 'windTC*', 'damage_100_TC*.nc'))
pr_savaii_coastTC = glob.glob(op.join(p_main, 'riskscape', 'io', 'io_savaii', 'results', mode, 'coastTC*', 'damage_100_TC*.nc'))

pr_upolu_rainTC = glob.glob(op.join(p_main, 'riskscape', 'io', 'io_upolu', 'results', mode, 'rainTC*', 'damage_100_TC*.nc'))
pr_upolu_windTC = glob.glob(op.join(p_main, 'riskscape', 'io', 'io_upolu', 'results', mode, 'windTC*', 'damage_100_TC*.nc'))
pr_upolu_coastTC = glob.glob(op.join(p_main, 'riskscape', 'io', 'io_upolu', 'results', mode, 'coastTC*', 'damage_100_TC*.nc'))
ids = tcs_ids.sel(n_sim=0).storm.to_dataframe().dropna().storm.values.astype(int)
pr_savaii_rainTC_new = []

for file in pr_savaii_rainTC:
    if int(file.split('damage_100_TC')[1].split('.nc')[0]) in ids:
        pr_savaii_rainTC_new.append(file)
        
pr_upolu_rainTC_new = []

for file in pr_upolu_rainTC:
    if int(file.split('damage_100_TC')[1].split('.nc')[0]) in ids:
        pr_upolu_rainTC_new.append(file)
        

EAD, VaR 95 % & Worst Scenario#

Calculate Risk Statistics

n_years = 80
print('Rain Savaii & Upolu')
EAD_rain_sv, VaR95_rain_sv, Ws_rain_sv = calculate_risk_syn(pr_savaii_rainTC_new, n_years)
EAD_rain_up, VaR95_rain_up, Ws_rain_up = calculate_risk_syn(pr_upolu_rainTC_new, n_years)
print('\nWind Savaii & Upolu')
EAD_wind_sv, VaR95_wind_sv, Ws_wind_sv = calculate_risk_syn(pr_savaii_windTC, n_years)
EAD_wind_up, VaR95_wind_up, Ws_wind_up = calculate_risk_syn(pr_upolu_windTC, n_years)
print('\nCoast Savaii & Upolu')
#EAD_coast_sv, VaR95_coast_sv, Ws_coast_sv = calculate_risk(pr_savaii_coastTC, tcs)
#EAD_coast_up, VaR95_coast_up, Ws_coast_up = calculate_risk(pr_upolu_coastTC, tcs)
Rain Savaii & Upolu
 File 40 / 41
Wind Savaii & Upolu
 File 168 / 169
Coast Savaii & Upolu
EAD_rain = xr.concat([EAD_rain_sv, EAD_rain_up], dim='x').sortby('x')
EAD_wind = xr.concat([EAD_wind_sv, EAD_wind_up], dim='x').sortby('x')

VaR95_rain = xr.concat([VaR95_rain_sv, VaR95_rain_up], dim='x').sortby('x')
VaR95_wind = xr.concat([VaR95_wind_sv, VaR95_wind_up], dim='x').sortby('x')

Ws_rain = xr.concat([Ws_rain_sv, Ws_rain_up], dim='x').sortby('x')
Ws_wind = xr.concat([Ws_wind_sv, Ws_wind_up], dim='x').sortby('x')
#EAD_coast = xr.concat([EAD_coast_sv, EAD_coast_up], dim='x').sortby('x')
EAD_coast, VaR95_coast, Ws_coast = [], [], []
EAD_coast, VaR95_coast, Ws_coast = xr.Dataset(), xr.Dataset(), xr.Dataset()

Plot

mapRk.gridDamageResults(EAD_rain, EAD_wind, EAD_coast, VaR95_rain, VaR95_wind, VaR95_coast, Ws_rain, Ws_wind, Ws_coast, samoa_extent, code_utm, plot_coast=False)
../_images/5S_sim_getRisk_19_0.png

TC-Wind, TC-Rain & TC-Coast damage integration#

EAD_samoa = EAD_rain + EAD_wind #+ EAD_coast
fig = plt.figure(constrained_layout=False, figsize=(25,8))
gs = GridSpec(1, 1, figure=fig)
                 
ax0 = fig.add_subplot(gs[0,0])
ax0 = mapRk.BackGround_1cmaps(fig, ax0, samoa_extent, cmocean.cm.turbid, code_utm, cbar=False, vmin=-2000, vmax=1000, alpha=0.9)
im = EAD_samoa.EAD.where(EAD_samoa.EAD > 0).plot(ax=ax0, x='x', cmap='hot_r', add_colorbar=False, norm=mcolors.LogNorm(), vmin=1, vmax=170000, zorder=5)
cb = fig.colorbar(im, ax=ax0, shrink=0.99, label='Economic Loss [2010 USD $]', format='%d')
ax0.set_title('Aggregated EAD $(TC-Rain + TC-Wind + TC-Coast)$', fontweight='bold')
plt.show()
../_images/5S_sim_getRisk_22_0.png

Qualitative Damage#

ds_damage_1km = EAD_samoa.coarsen(x=10, y=10, boundary='pad').sum()
ds_damage_1km['EAD'] = ds_damage_1km.EAD / 1000
col_dict = {1:"#159A36", 2:"#79C533", 3:"#FFFF0C", 4:"#FEAB0B", 5:"#F80007"}
cm = ListedColormap([col_dict[x] for x in col_dict.keys()])
labels = np.array( ['Minimum', 'Low', 'Moderate', 'High', 'Extreme'])
len_lab = len(labels)
bounds = [0, 10, 50, 500, 1000, 2000]

norm = matplotlib.colors.BoundaryNorm(bounds, len_lab, clip=True)
fmt = matplotlib.ticker.FuncFormatter(lambda x, pos: labels[norm(x)])
fig = plt.figure(constrained_layout=False, figsize=(25,16))
gs = GridSpec(2, 1, figure=fig)
                 
ax0 = fig.add_subplot(gs[0])
ax0 = mapRk.BackGround_1cmaps(fig, ax0, samoa_extent, cmocean.cm.turbid, code_utm, cbar=False, vmin=-2000, vmax=1000, alpha=0.9, source=ctx.providers.OpenStreetMap.Mapnik)
im = ds_damage_1km.EAD.where(ds_damage_1km.EAD > 0).plot(ax=ax0, x='x', cmap='hot_r', add_colorbar=False, norm=mcolors.LogNorm(), vmin=1, vmax=2000, zorder=5, alpha=0.9)
cb = fig.colorbar(im, ax=ax0, shrink=0.9, label='Economic Loss [2010 USD millions $]', format='%d')
ax0.set_title('Expected Annual Damage', fontweight='bold')

ax1 = fig.add_subplot(gs[1])
ax1 = mapRk.BackGround_1cmaps(fig, ax1, samoa_extent, cmocean.cm.turbid, code_utm, cbar=False, vmin=-2000, vmax=1000, alpha=0.9, source=ctx.providers.OpenStreetMap.Mapnik)
im = ds_damage_1km.EAD.where(ds_damage_1km.EAD > 0).plot(x='x', cmap=cm, add_colorbar=False, norm=norm, alpha=0.7, zorder=5)

tickz = np.diff(bounds) / 2 + bounds[:-1]
cb = fig.colorbar(im, ax=ax1, shrink=0.9, format=fmt, ticks=tickz, label='Coastal Risk Level')
ax1.set_title('')

plt.show()
../_images/5S_sim_getRisk_26_0.png