"""
modulo con funciones que calculan la deformacion a partir del slip utilizando las funciones del modulo dtopotools
"""
from multiprocessing import Pool, Process, cpu_count
import shapefile
import pandas as pd
from openpyxl import load_workbook
from clawpack.geoclaw import dtopotools, topotools
import numpy as np
# A partir de la falla creada y del slip calculado para ella, se crea los objetos dtopo.fault y dtopo.subfault, con los que se calcula la deformacion
[docs]
def okada_solucion_optimized(lons, lats, razon_aspecto, strike, dip, prof, rake, slip, largo_falla, resolucion=1/30., tamano_buffer=2., verbose=False):
# largo de la falla en metros
n_subfallas_filas, n_subfallas_columnas = lats.shape
n_subfallas = n_subfallas_filas * n_subfallas_columnas
ancho_falla = largo_falla / razon_aspecto
largo_subfalla = largo_falla / n_subfallas_filas
ancho_subfalla = ancho_falla / n_subfallas_columnas
lats = lats.ravel()
lons = lons.ravel()
strike = strike.ravel()
rake = rake.ravel()
prof = prof.ravel()
dip = dip.ravel()
slip = slip.ravel()
Falla = dtopotools.Fault()
Falla.subfaults = []
#
for i in range(n_subfallas):
SubFalla = dtopotools.SubFault()
SubFalla.latitude = lats[i]
SubFalla.longitude = lons[i]
SubFalla.strike = strike[i]
SubFalla.rake = rake[i]
SubFalla.depth = prof[i]
SubFalla.dip = dip[i]
SubFalla.slip = slip[i]
SubFalla.length = largo_subfalla
SubFalla.width = ancho_subfalla
SubFalla.coordinate_specification = 'centroid'
Falla.subfaults = np.append(Falla.subfaults, SubFalla)
x, y = Falla.create_dtopo_xy(dx=resolucion, buffer_size=tamano_buffer)
dtopo = Falla.create_dtopography(x, y, times=[1.], verbose=verbose)
# subfallas = np.empty(n_subfallas, dtype=dtopotools.SubFault)
# subfallas.latitude = lats.ravel()
# subfallas.latitude = lons.ravel()
# subfallas.strike = strike.ravel()
# subfallas.rake = rake.ravel()
# subfallas.depth = prof.ravel()
# subfallas.dip = dip.ravel()
# subfallas.slip = slip.ravel()
# subfallas.length = largo_subfalla
# subfallas.width = ancho_subfalla
# subfallas.coordinate_specification = 'centroid'
# Falla = dtopotools.Fault()
# Falla.subfaults = subfallas
x, y = Falla.create_dtopo_xy(dx=resolucion, buffer_size=tamano_buffer)
dtopo = Falla.create_dtopography(x, y, times=[1.], verbose=verbose)
return dtopo
[docs]
def okada_solucion(lons, lats, razon_aspecto, strike, dip, prof, rake, slip, largo_falla, resolucion = 1/30., tamano_buffer = 2., verbose = False ):
"""
Calcula la deformacion provocada por la distribucion de slip generada resolviendo okada
utilizando las herramientas de clawpack dtopotools. Se crea un objeto Falla
generando listas con los atributos de cada subfalla
Entradas:
lons: array con las longitudes de cada subfalla
lats: array con las latitudes de cada subfalla
razon_aspecto: razon de aspecto de la falla (largo/ancho)
strike: array con los strikes de cada subfalla
dip: array con los dips de cada subfalla
prof: array con la profundidad de cada subfalla en metros
rake: array con los rakes de cada subfalla
slip: array con el slip de cada subfalla generado con la metodologia de LeVeque, 2016
largo_falla: largo de la falla en metros
resolucion: resolucion espacial con la que se calculara la deformacion (valor default: 1 minuto)
tamano_buffer: tamano (en grados) de espacio "extra" en los bordes de la falla (valor default: 2 grados)
verbose: booleano para mostrar por terminal el estado de la resolucion de okada. True: muestra mensaje False: no muestra mensaje (valor default: False)
"""
# se crea el objeto falla
Falla = dtopotools.Fault() # instancia Falla de la clase dtopotools.Fault()
# parametros auxiliares para creacion de subfallas
n_subfallas = int( np.size( lats ) ) # cantidad total de subfallas
n_subfallas_filas = int( np.shape( lats )[0] ) # numero de filas (latitudes)
n_subfallas_columnas = int( np.shape( lats )[1] ) # numero de columnas (longitudes)
ancho_falla = largo_falla / razon_aspecto # ancho total de la falla
largo_subfalla = largo_falla / n_subfallas_filas # largo de cada subfalla
ancho_subfalla = ancho_falla / n_subfallas_columnas # ancho de cada subfalla
# creacion de subfallas
Falla.subfaults = [] # inicializacion lista con subfallas, se anadira a esta lista los atributos de cada subfalla
for subfalla in range(int(n_subfallas)):
SubFalla = dtopotools.SubFault() # iniciacion de instancia SubFalla de la clase dtopotools.SubFault. A este objeto se le anadiran los atributos que siguen para crear la falla "Falla"
SubFalla.latitude = np.reshape( lats, ( np.size( lats ),) )[subfalla] # latitud de cada subfalla
SubFalla.longitude = np.reshape( lons,( np.size( lons ),))[subfalla] # longitud de cada subfalla
SubFalla.strike = np.reshape( strike, ( np.size( strike ),))[subfalla] # strike de cada subfalla
SubFalla.rake = np.reshape( rake,( np.size( rake ),))[subfalla] # rake de cada subfalla
SubFalla.depth = np.reshape( prof, ( np.size( prof ),))[subfalla] # profundidad de cada subfalla en metros
SubFalla.dip = np.reshape( dip,( np.size( dip ),))[subfalla] # dip de cada subfalla
SubFalla.slip = np.reshape( slip, ( np.size( slip ),))[subfalla] # slip de cada subfalla
SubFalla.length = (np.ones( np.size( slip )) * largo_subfalla)[subfalla] # largo de cada subfalla en metros
SubFalla.width = (np.ones( np.size( slip )) * ancho_subfalla)[subfalla] # ancho de cada subfalla en metros
SubFalla.coordinate_specification = 'centroid'
Falla.subfaults = np.append(Falla.subfaults, SubFalla)
# se crea la topografia
x,y = Falla.create_dtopo_xy( dx = resolucion, buffer_size = tamano_buffer )
# se calcula la deformacion
dtopo = Falla.create_dtopography(x,y,times=[1.], verbose = verbose ) # deformacion
return dtopo
# crea el objeto falla de dtopotools a partir de los atributos de cada subfalla, para efectos de visualizacion y otros
[docs]
def crea_falla_dtopo(lons, lats, razon_aspecto, strike, dip, prof, rake, slip, largo_falla):
"""
Crea un objeto Falla
generando listas con los atributos de cada subfalla
Entradas:
lons: array con las longitudes de cada subfalla
lats: array con las latitudes de cada subfalla
razon_aspecto: razon de aspecto de la falla (largo/ancho)
strike: array con los strikes de cada subfalla
dip: array con los dips de cada subfalla
prof: array con la profundidad de cada subfalla en metros
rake: array con los rakes de cada subfalla
slip: array con el slip de cada subfalla generado con la metodologia de LeVeque, 2016
largo_falla: largo de la falla en metros
"""
# se crea el objeto falla
Falla = dtopotools.Fault() # instancia Falla de la clase dtopotools.Fault()
# parametros auxiliares para creacion de subfallas
n_subfallas = int( np.size( lats ) ) # cantidad total de subfallas
n_subfallas_filas = int( np.shape( lats )[0] ) # numero de filas (latitudes)
n_subfallas_columnas = int( np.shape( lats )[1] ) # numero de columnas (longitudes)
ancho_falla = largo_falla / razon_aspecto # ancho total de la falla
largo_subfalla = largo_falla / n_subfallas_filas # largo de cada subfalla
ancho_subfalla = ancho_falla / n_subfallas_columnas # ancho de cada subfalla
# creacion de subfallas
Falla.subfaults = [] # inicializacion lista con subfallas, se anadira a esta lista los atributos de cada subfalla
for subfalla in range(int(n_subfallas)):
SubFalla = dtopotools.SubFault() # iniciacion de instancia SubFalla de la clase dtopotools.SubFault. A este objeto se le anadiran los atributos que siguen para crear la falla "Falla"
SubFalla.latitude = np.reshape( lats, ( np.size( lats ),) )[subfalla] # latitud de cada subfalla
SubFalla.longitude = np.reshape( lons,( np.size( lons ),))[subfalla] # longitud de cada subfalla
SubFalla.strike = np.reshape( strike, ( np.size( strike ),))[subfalla] # strike de cada subfalla
SubFalla.rake = np.reshape( rake,( np.size( rake ),))[subfalla] # rake de cada subfalla
SubFalla.depth = np.reshape( prof, ( np.size( prof ),))[subfalla] # profundidad de cada subfalla en metros
SubFalla.dip = np.reshape( dip,( np.size( dip ),))[subfalla] # dip de cada subfalla
SubFalla.slip = np.reshape( slip, ( np.size( slip ),))[subfalla] # slip de cada subfalla
SubFalla.length = (np.ones( np.size( slip )) * largo_subfalla)[subfalla] # largo de cada subfalla en metros
SubFalla.width = (np.ones( np.size( slip )) * ancho_subfalla)[subfalla] # ancho de cada subfalla en metros
SubFalla.coordinate_specification = 'centroid'
Falla.subfaults = np.append(Falla.subfaults, SubFalla)
return Falla
# calcula la magnitud de momento con las herramientas nativas de clawpack
[docs]
def calcula_Mw( lons, lats, razon_aspecto, strike, dip, prof, rake, slip, largo_falla ):
"""
con la funcion nativa de dtopotools .Mw() se calcula la magnitud de momento de la distribucion de slip
Entradas:
lons: array con las longitudes de cada subfalla
lats: array con las latitudes de cada subfalla
razon_aspecto: razon de aspecto de la falla (largo/ancho)
strike: array con los strikes de cada subfalla
dip: array con los dips de cada subfalla
prof: array con la profundidad de cada subfalla en metros
rake: array con los rakes de cada subfalla
slip: array con el slip de cada subfalla generado con la metodologia de LeVeque, 2016
largo_falla: largo de la falla en metros
"""
# se crea el objeto falla
Falla = crea_falla_dtopo( lons, lats, razon_aspecto, strike, dip, prof, rake, slip, largo_falla )
# se calcula su magnitud de momento
Mw = Falla.Mw()
return Mw
# funcion para guardar las salidas de deformacion
[docs]
def guardar_okada( dtopo, nombre_archivo, tipo = 3 ):
"""
Funcion para guardar las salidas del calculo de la deformacion del suelo oceanico
a partir de la distribucion de slip
Entradas:
dtopo: deformacion oceanica calculada con el modelo de okada
nombre_archivo: nombre del archivo de salida
tipo: tipo de data a guardar, por defecto se utiliza dtopo_type = 3
"""
# revisar si nombre_archivo es del tipo de string
if not isinstance(nombre_archivo, basestring):
nombre_archivo = str( nombre_archivo )
else:
nombre_archivo = nombre_archivo
# se guarda el archivo
dtopo.write(nombre_archivo, dtopo_type = tipo)
# funcion para leer las salidas de deformacion
[docs]
def leer_okada( nombre_archivo, directorio = None, tipo = 3 ):
"""
Funcion para leer las salidas del calculo de la deformacion del suelo oceanico obtenidas
con dtopo. Por defecto buscara en el cwd, pero se puede especificar un directorio si se
desea leer un archivo ubicado en otro directorio.
Entradas:
nombre_archivo: nombre del archivo tt3 a leer
directorio: por defecto se trabajara en el directorio actual, se puede especificar otro si se desea
tipo: tipo de archivo dtopo a leer. Por defecto se utilizara en dtopo_type = 3
"""
# se crea el objeto dtopo a llenarse con informacion de la deformacion leida
dtopo = dtopotools.DTopography()
# se crea el nombre del archivo a leerse, dependiendo del directorio desde donde se desee cargar
if directorio == None:
archivo = nombre_archivo
elif isinstance( directorio, basestring ) and not nombre_archivo.startswith("/"):
archivo = directorio + "/" + nombre_archivo
elif isinstance( directorio, basestring ) and nombre_archivo.startswith("/"):
archivo = directorio + nombre_archivo
else:
raise ValueError('Error en nombre de directorio o archivo')
# se lee el archivo
dtopo.read( archivo, dtopo_type = tipo )
return dtopo
# funcion para leer shapefiles con deformacion
# funcion para leer archivos xls de deformacion otorgados por dr. patricio winkler
[docs]
def leer_xls_observaciones_1960( nombre_xls ):
"""
Funcion para leer los archivos xls de datos de observaciones del terremoto y tsunami de 1960
otorgados por el dr. patricio winkler
el formato de estos archivos es, por columna
n sitio , nombre sitio, lat, lon, runup, profundidad de agua, altura de ola, inundacion, cambio de tierra, rango de marea, autor, comentarios
Entradas:
nombre_xls: nombre del archivo con datos
"""
# ruta relativa del archivo
ruta_archivo = "../deformacion/Registros_1960/"
# nombre archivo
nombre_archivo = "Registros-2019-02-17.xlsx"
# se carga el workbook (contiene mas de un sheet el archivo)
wb = load_workbook(ruta_archivo+nombre_archivo, read_only = True)
# nos interesa solo el primer sheet, que contiene los datos importantes
nombre_sheet = wb.sheetnames[0]