Source code for bluemath_tk.teslakit.numerical_models.swan.storms

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import pandas as pd

from .geo import shoot


[docs] def track_from_parameters( pmin, vmean, delta, gamma, x0, y0, x1, R, date_ini, hours, great_circle=False): ''' Calculates storm track variables from storm track parameters pmin, vmean, delta, gamma - storm track parameters x0, y0 - site coordinates (longitude, latitude) x1 - enter point in computational grid R - radius (ยบ) date_ini - initial date 'yyyy-mm-dd HH:SS' hours - number of hours to generate great_circle - True for using great circle lon,lat calculation ''' RE = 6378.135 # earth radius # generation of storm track xc = x0 + R * np.sin(delta * np.pi/180) # enter point in the smaller radius yc = y0 + R * np.cos(delta * np.pi/180) d = (x1 - xc) / np.sin(gamma * np.pi/180) y1 = yc + d * np.cos(gamma * np.pi/180) # time array for SWAN input time_input = pd.date_range(date_ini, periods=hours, freq='H') # storm track (pd.DataFrame) st = pd.DataFrame(index=time_input, columns=['move', 'vf', 'pn', 'p0', 'lon', 'lat']) st['move'] = gamma st['vf'] = vmean st['pn'] = 1013 st['p0'] = pmin # calculate lon and lat if not great_circle: st['lon'] = x1 - (st['vf']*180/(RE*np.pi)) * np.sin(gamma*np.pi/180) * list(range(len(st))) st['lat'] = y1 - (st['vf']*180/(RE*np.pi)) * np.cos(gamma*np.pi/180) * list(range(len(st))) else: x2 = x1 - (st['vf']*180/(RE*np.pi)) * np.sin(gamma*np.pi/180) * list(range(len(st))) y2 = y1 - (st['vf']*180/(RE*np.pi)) * np.cos(gamma*np.pi/180) * list(range(len(st))) xt, yt = [], [] for i in list(range(0,hours)): glon, glat, baz = shoot(x1, y1, gamma+180, vmean * i) xt.append(glon) yt.append(glat) st['lon'] = xt st['lat'] = yt # add some metadata st.x0 = x0 st.y0 = y0 st.R = R return st