def main(): xg, zg = np.meshgrid(np.arange(-2000., 2000., 10), np.arange(-3000., 0., 10.)) N = 2e-3 k = -2.*np.pi/2000. m = -2.*np.pi/2000. om = gw.omega(N, k, m) U = 0.0 # -om/k u_0 = 0.1 phase_0 = 0. # np.pi # for phase_0 in np.linspace(0., 2*np.pi, 10): # # ug = u2D(xg, zg, 0., k, m, om, u_0, U, phase_0) # # plt.figure() # plt.pcolormesh(xg, zg, ug, cmap=plt.get_cmap('bwr')) # plt.colorbar() # plt.title("{:1.2f} rad".format(phase_0)) for t in np.arange(0., 10000., 500.): ug = u2D(xg, zg, t, k, m, om, u_0, U, phase_0) plt.figure() plt.pcolormesh(xg, zg, ug, cmap=plt.get_cmap('bwr')) plt.colorbar() plt.title("{:g} s".format(t))
def drdt(r, t, phi_0, k, l, m, N=2e-3, U=0.3, V=0., Wf=0.1, f=0., phase_0=0.): x = r[0] y = r[1] z = r[2] om = gw.omega(N, k, m, l, f) dxdt = U + gw.u(x, y, z, t, phi_0, k, l, m, om, f=f, U=U, phase_0=phase_0) dydt = V + gw.v(x, y, z, t, phi_0, k, l, m, om, f=f, U=U, phase_0=phase_0) dzdt = Wf + gw.w(x, y, z, t, phi_0, k, l, m, om, N, U=U, phase_0=phase_0) return np.array([dxdt, dydt, dzdt])
def b_model(params, data): phi_0, X, Y, Z, phase_0 = params time, x, y, z, U, V, N, f = data k = 2*np.pi/X l = 2*np.pi/Y m = 2*np.pi/Z om = gw.omega(N, k, m, l, f) b = gw.b(x, y, z, time, phi_0, k, l, m, om, N, U=U, V=V, phase_0=phase_0) return b
def p_model(params, data): phi_0, X, Y, Z, phase_0 = params t, x, y, z, U, V, N, f = data k = 2*np.pi/X l = 2*np.pi/Y m = 2*np.pi/Z om = gw.omega(N, k, m, l, f) p = gw.phi(x, y, z, t, phi_0, k, l, m, om, U=U, V=V, phase_0=phase_0) return p
def v_model(params, data): phi_0, X, Y, Z, phase_0 = params time, x, y, z, U, V, N, f, w_data, u_data, v_data, b_data = data k = 2*np.pi/X l = 2*np.pi/Y m = 2*np.pi/Z om = gw.omega(N, k, m, l, f) v = gw.v(x, y, z, time, phi_0, k, l, m, om, f=f, U=U, V=V, phase_0=phase_0) return v
def w_model(params, data): X, Y, Z, phase_0 = params time, dist, depth, U, V, W, B, N, f = data k = 2*np.pi/X l = 2*np.pi/Y m = 2*np.pi/Z om = gw.omega(N, k, m, l, f) phi_0 = np.max(W)*(N**2 - f**2)*m/(om*(k**2 + l**2 + m**2)) w = gw.w(dist, 0., depth, time, phi_0, k, l, m, om, N, phase_0=phase_0) return w - W
def full_model(params, data): phi_0, X, Y, Z, phase_0 = params time, x, y, z, U, V, N, f, w_data, u_data, v_data, b_data = data k = 2*np.pi/X l = 2*np.pi/Y m = 2*np.pi/Z om = gw.omega(N, k, m, l, f) u = gw.u(x, y, z, time, phi_0, k, l, m, om, f=f, U=U, V=V, phase_0=phase_0) v = gw.v(x, y, z, time, phi_0, k, l, m, om, f=f, U=U, V=V, phase_0=phase_0) w = gw.w(x, y, z, time, phi_0, k, l, m, om, N, U=U, V=V, phase_0=phase_0) b = gw.b(x, y, z, time, phi_0, k, l, m, om, N, U=U, V=V, phase_0=phase_0) return np.hstack((w - w_data, u - u_data, v - v_data, b - b_data))
def w_model(params, pfl, zlim, deg): phi_0, X, Z, phase_0 = params zmin, zmax = zlim nope = np.isnan(pfl.z) | (pfl.z < zmin) | (pfl.z > zmax) t = 60*60*24*(pfl.UTC - np.nanmin(pfl.UTC)) x = 1000.*(pfl.dist_ctd - np.nanmin(pfl.dist_ctd)) k = 2*np.pi/X l = 0. m = 2*np.pi/Z f = gsw.f(pfl.lat_start) N = np.mean(np.sqrt(pfl.N2_ref[~nope])) om = gw.omega(N, k, m, l, f) w = gw.w(x, 0., pfl.z, t, phi_0, k, l, m, om, N, phase_0=phase_0) return w[~nope] - pfl.Ww[~nope]
def u_model(params, pfl, zlim, deg): phi_0, X, Z, phase_0 = params zmin, zmax = zlim nope = np.isnan(pfl.zef) | (pfl.zef < zmin) | (pfl.zef > zmax) t = 60*60*24*(pfl.UTCef - np.nanmin(pfl.UTCef)) x = 1000.*(pfl.dist_ef - np.nanmin(pfl.dist_ef)) k = 2*np.pi/X l = 0. m = 2*np.pi/Z f = gsw.f(pfl.lat_start) N = np.mean(np.sqrt(pfl.N2_ref[~nope])) om = gw.omega(N, k, m, l, f) u = gw.u(x, 0., pfl.zef, t, phi_0, k, l, m, om, phase_0=phase_0) return u[~nope] - utils.nan_detrend(pfl.zef[~nope], pfl.U[~nope], deg)
def model_basic(phi_0, X, Y, Z, phase_0=0., oparams=default_params): Ufunc = oparams['Ufunc'] f = oparams['f'] N = oparams['N'] # Float change in buoyancy with velocity. Wf_pvals = oparams['Wf_pvals'] # Wave parameters k = 2 * np.pi / X l = 2 * np.pi / Y m = 2 * np.pi / Z om = gw.omega(N, k, m, l, f) args = (phi_0, Ufunc, Wf_pvals, k, l, m, om, N, f, phase_0) # Integration parameters. dt = oparams['dt'] t_0 = 0. t_1 = oparams['t_1'] t = np.arange(t_0, t_1, dt) # Initial conditions. x_0 = oparams['x_0'] y_0 = oparams['y_0'] z_0 = oparams['z_0'] r_0 = np.array([x_0, y_0, z_0]) # This integrator calls FORTRAN odepack to solve the problem. r = odeint(drdt, r_0, t, args) uargs = (phi_0, Ufunc(r[:, 2]), k, l, m, om, N, f, phase_0) u = gw.wave_vel(r, t, *uargs) u[:, 0] += Ufunc(r[:, 2]) b = gw.buoy(r, t, *uargs) return t, r, u, b
def model_basic(phi_0, X, Y, Z, phase_0=0., oparams=default_params): Ufunc = oparams['Ufunc'] f = oparams['f'] N = oparams['N'] # Float change in buoyancy with velocity. Wf_pvals = oparams['Wf_pvals'] # Wave parameters k = 2*np.pi/X l = 2*np.pi/Y m = 2*np.pi/Z om = gw.omega(N, k, m, l, f) args = (phi_0, Ufunc, Wf_pvals, k, l, m, om, N, f, phase_0) # Integration parameters. dt = oparams['dt'] t_0 = 0. t_1 = oparams['t_1'] t = np.arange(t_0, t_1, dt) # Initial conditions. x_0 = oparams['x_0'] y_0 = oparams['y_0'] z_0 = oparams['z_0'] r_0 = np.array([x_0, y_0, z_0]) # This integrator calls FORTRAN odepack to solve the problem. r = odeint(drdt, r_0, t, args) uargs = (phi_0, Ufunc(r[:, 2]), k, l, m, om, N, f, phase_0) u = gw.wave_vel(r, t, *uargs) u[:, 0] += Ufunc(r[:, 2]) b = gw.buoy(r, t, *uargs) return t, r, u, b
# ax.yaxis.set_ticks_position('both') # ax.yaxis.set_label_position('right') colors = ['blue', 'green', 'grey'] N = 2.2e-3 f = gsw.f(-57.5) for i, M in enumerate(Ms): phi_0 = M.trace('phi_0')[:] k = np.pi*2./M.trace('X')[:] l = np.pi*2./M.trace('Y')[:] m = np.pi*2./M.trace('Z')[:] print("complete wavelength = {}".format(np.mean(np.pi*2/np.sqrt(k**2 + l**2 + m**2)))) om = gw.omega(N, k, m, l, f) print("om/N = {}".format(np.mean(om/N))) w_0 = gw.W_0(phi_0, m, om, N) Edens = gw.Edens(w_0, k, m, l) Efluxz = gw.Efluxz(w_0, k, m, N, l, f) Mfluxz = gw.Mfluxz(phi_0, k, l, m, om, N) colprops={'color': colors[i]} data = [k, l, m] axs[0].boxplot(data, boxprops=colprops, whiskerprops=colprops, capprops=colprops, medianprops=colprops, showfliers=False, labels=['$k$', '$l$', '$m$']) axs[1].boxplot(om/N, boxprops=colprops, whiskerprops=colprops, capprops=colprops, medianprops=colprops, showfliers=False,
def model_verbose(phi_0, X, Y, Z, phase_0=0., oparams=default_params): """Return loads and loads of info.""" t, r, u, b = model_basic(phi_0, X, Y, Z, phase_0, oparams) Ufunc = oparams['Ufunc'] f = oparams['f'] N = oparams['N'] # Float change in buoyancy with velocity. Wf_pvals = oparams['Wf_pvals'] # Wave parameters w_0 = oparams['w_0'] k = 2 * np.pi / X l = 2 * np.pi / Y m = 2 * np.pi / Z om = gw.omega(N, k, m, l, f) u_0 = gw.U_0(phi_0, k, l, om, f) v_0 = gw.V_0(phi_0, k, l, om, f) w_0 = gw.W_0(phi_0, m, om, N) b_0 = gw.B_0(phi_0, m, om, N) if oparams['print']: print("N = {:1.2E} rad s-1.\n" "om = {:1.2E} rad s-1.\n" "u_0 = {:1.2E} m s-1.\n" "v_0 = {:1.2E} m s-1.\n" "w_0 = {:1.2E} m s-1.\n" "phi_0 = {:1.2E} m2 s-2.\n" "b_0 = {:1.2E} m s-2.\n" "X = {:1.0f} m.\n" "k = {:1.2E} rad m-1.\n" "Y = {:1.0f} m.\n" "l = {:1.2E} rad m-1.\n" "Z = {:1.0f} m.\n" "m = {:1.2E} rad m-1.\n" "".format(N, om, u_0, v_0, w_0, phi_0, b_0, X, k, Y, l, Z, m)) output = utils.Bunch(Ufunc=Ufunc, U=Ufunc(r[:, 2]), f=f, N=N, Wf_pvals=Wf_pvals, w_0=w_0, k=k, l=l, m=m, om=om, phi_0=phi_0, u_0=u_0, v_0=v_0, b_0=b_0, t=t, z_0=oparams['z_0'], r=r, u=u, b=b, oparams=oparams) return output
p = -z.copy() ppos = 10. * np.ones_like(z) #ppos[ppos.size/2:] = 50. # Wave params X = -2000. Y = -2000. Z = -2000. N = 2e-3 phi_0 = 0.03 k = np.pi * 2. / X l = np.pi * 2. / Y m = np.pi * 2. / Z om = gw.omega(N, k, m, l) wave = (k, l, m, om, phi_0, N) w_0 = 0. z_0 = z[0] X_0 = np.array([z_0, w_0]) t_max = 5000. dt = 1. t = np.arange(0., t_max + dt, dt) M = 27.179 p_0 = 2000. k_0 = 16. V_0 = 0.0262
def model_verbose(phi_0, X, Y, Z, phase_0=0., oparams=default_params): """Return loads and loads of info.""" t, r, u, b = model_basic(phi_0, X, Y, Z, phase_0, oparams) Ufunc = oparams['Ufunc'] f = oparams['f'] N = oparams['N'] # Float change in buoyancy with velocity. Wf_pvals = oparams['Wf_pvals'] # Wave parameters w_0 = oparams['w_0'] k = 2*np.pi/X l = 2*np.pi/Y m = 2*np.pi/Z om = gw.omega(N, k, m, l, f) u_0 = gw.U_0(phi_0, k, l, om, f) v_0 = gw.V_0(phi_0, k, l, om, f) w_0 = gw.W_0(phi_0, m, om, N) b_0 = gw.B_0(phi_0, m, om, N) if oparams['print']: print("N = {:1.2E} rad s-1.\n" "om = {:1.2E} rad s-1.\n" "u_0 = {:1.2E} m s-1.\n" "v_0 = {:1.2E} m s-1.\n" "w_0 = {:1.2E} m s-1.\n" "phi_0 = {:1.2E} m2 s-2.\n" "b_0 = {:1.2E} m s-2.\n" "X = {:1.0f} m.\n" "k = {:1.2E} rad m-1.\n" "Y = {:1.0f} m.\n" "l = {:1.2E} rad m-1.\n" "Z = {:1.0f} m.\n" "m = {:1.2E} rad m-1.\n" "".format(N, om, u_0, v_0, w_0, phi_0, b_0, X, k, Y, l, Z, m)) output = utils.Bunch(Ufunc=Ufunc, U=Ufunc(r[:, 2]), f=f, N=N, Wf_pvals=Wf_pvals, w_0=w_0, k=k, l=l, m=m, om=om, phi_0=phi_0, u_0=u_0, v_0=v_0, b_0=b_0, t=t, z_0=oparams['z_0'], r=r, u=u, b=b, oparams=oparams) return output