Beispiel #1
0
 def test3(self):
     instance = QGmodel(redirection="none")
     dt = 0.123 | units.hour
     instance.parameters.dt = dt
     instance.evolve_model(2 * dt)
     self.assertEqual(instance.model_time, 2 * dt)
     instance.stop()
Beispiel #2
0
 def test1(self):
     instance = QGmodel()
     instance.evolve_model(1 | units.hour)
     self.assertEquals(instance.get_name_of_current_state(), 'EVOLVED')
     psi = instance.grid.psi
     self.assertEquals(instance.get_name_of_current_state(), 'RUN')
     instance.stop()
Beispiel #3
0
def reference(tend=1. | units.hour, dt=3600. | units.s):

    q = QGmodel(redirection="none")

    q.parameters.dt = dt

    q.evolve_model(tend)

    psi = q.grid[:, :, 0].psi.number

    return psi
Beispiel #4
0
    def test16(self):
        instance = QGmodel()
        dx = instance.parameters.dx
        instance.evolve_model(1 | units.hour)

        x = instance.grid[:, 10, 0].x
        y = instance.grid[:, 10, 0].y

        dpsi1 = instance.grid[:, 10, 0].dpsi_dt
        psi2, dpsi2 = instance.get_psi_state_at_point(0. * x + dx, x, y)
        self.assertAlmostEquals(dpsi1, dpsi2)

        instance.stop()
Beispiel #5
0
 def test0(self):
     instance = QGmodel()
     self.assertEquals(instance.get_name_of_current_state(),
                       'UNINITIALIZED')
     instance.initialize_code()
     self.assertEquals(instance.get_name_of_current_state(), 'INITIALIZED')
     instance.commit_parameters()
     self.assertEquals(instance.get_name_of_current_state(), 'EDIT')
     instance.evolve_model(1 | units.hour)
     self.assertEquals(instance.get_name_of_current_state(), 'EVOLVED')
     psi = instance.grid.psi
     self.assertEquals(instance.get_name_of_current_state(), 'RUN')
     instance.stop()
Beispiel #6
0
    def test5(self):
        instance = QGmodel(redirection="none")
        instance.before_get_parameter()
        dt = instance.parameters.dt
        instance.evolve_model(dt)

        dpsi_dt1 = instance.grid.dpsi_dt
        psi1 = instance.grid.psi
        instance.evolve_model(2 * dt)

        psi2 = instance.grid.psi
        dpsi_dt2 = instance.grid.dpsi_dt

        dpsi_estimate = ((psi2 - psi1) / dt).mean()
        dpsi = 0.5 * (dpsi_dt1 + dpsi_dt2).mean()
        self.assertTrue(abs(dpsi - dpsi_estimate) / dpsi < 0.1)

        instance.stop()
Beispiel #7
0
def interface_bc(tend=1. | units.hour, dt=3600. | units.s, correct=True):

    q = QGmodel(redirection="none")

    q.parameters.dt = dt

    q.parameters.xbound1 = "interface"

    while q.model_time < tend:
        q.evolve_model(q.model_time + dt)
        if correct:
            xb1 = q.boundaries(1).copy()
            xb1.psi[0, 1:-1, 0] = -q.grid.psi[1, :, 0]
            channel = xb1.new_channel_to(q.boundaries(1))
            channel.copy()

    psi = q.grid[:, :, 0].psi.number

    return psi
Beispiel #8
0
def high_level():

    qg = QGmodel(redirection="none")
    qg.initialize_code()

    Nx = 128
    Ny = 128

    qg.parameters.Lx = 1.e6 | units.m
    qg.parameters.Ly = 1.e6 | units.m
    qg.parameters.dx = qg.parameters.Lx / Nx
    qg.parameters.dy = qg.parameters.Ly / Ny
    qg.parameters.ocean_depth = 600 | units.m
    qg.parameters.tau = 0.15 | units.Pa
    qg.parameters.beta0 = 1.6e-11 | (units.m * units.s)**-1

    qg.parameters.dt = 1800 / 10 | units.s

    rho0 = qg.parameters.rho
    beta0 = qg.parameters.beta0
    H = qg.parameters.ocean_depth
    L = qg.parameters.Lx
    T = qg.parameters.tau

    U_dijkstra = 1.6e-2 | units.m / units.s
    U = (T / (beta0 * rho0 * H * L))
    print "actual, target U:", U.in_(units.m / units.s), U_dijkstra

    Reynolds_number = 1.

    A_H = U * L / Reynolds_number

    qg.parameters.A_H = A_H

    timescale = 1 / (beta0 * L)

    print "timescale:", timescale.in_(units.s)
    print qg.parameters

    qg.commit_parameters()

    #  qg.grid.psi=(qg.grid.x/L ) | units.m**2/units.s

    qg.initialize_grid()

    pyplot.ion()
    f = pyplot.figure()
    pyplot.show()

    for i in range(101):
        tend = i * 12. | units.hour

        qg.evolve_model(tend)
        psi = qg.grid.psi[:, :, 0]

        print qg.model_time.in_(units.day), psi.max(), psi.min()

        pyplot.imshow(psi.transpose() / psi.max(),
                      vmin=0,
                      vmax=1,
                      origin="lower")

        pyplot.draw()
    raw_input()
Beispiel #9
0
def semi_domain_test(tend=1. | units.hour, dt=3600. | units.s):

    q1 = QGmodel(redirection="none")
    q1.parameters.dt = dt / 2
    Lx = q1.parameters.Lx.value_in(1000 * units.km)
    q2 = QGmodel(redirection="none")
    q2.parameters.dt = dt / 2
    q2.parameters.Lx /= 2
    q2.parameters.boundary_east = "interface"

    Nx, Ny, Nm = q1.grid.shape

    pyplot.ion()
    f = pyplot.figure(figsize=(12, 5))
    pyplot.show()

    i = 0
    while q1.model_time < tend:
        i = i + 1
        tnow = q1.model_time
        q1.evolve_model(tnow + dt / 2)
        psi = q1.grid[(Nx - 1) / 2:(Nx - 1) / 2 + 2, :, 0].psi
        dpsi_dt = q1.grid[(Nx - 1) / 2:(Nx - 1) / 2 + 2, :, 0].dpsi_dt
        west = q2.boundaries("west").copy()
        west[:, 1:-1, 0].psi = psi
        west[:, 1:-1, 0].dpsi_dt = dpsi_dt
        channel = west.new_channel_to(q2.boundaries("west"))
        channel.copy()
        q1.evolve_model(tnow + dt)
        q2.evolve_model(tnow + dt)

        #  print(q1.grid[(Nx+1)/2,1,0].dpsi_dt)
        #  print(q2.boundaries("west")[0:2,0,0].x)
        if i % 5 == 0:
            psi1_complete = q1.grid.psi.number[:, :, 0]
            psi1 = q1.grid[:(Nx + 1) / 2, :, 0].psi.number
            psi2 = q2.grid[:, :, 0].psi.number

            d = abs(psi2 - psi1)
            print(d.max(), d.mean(), abs(psi1).max())

            f.clf()
            f1 = pyplot.subplot(131)
            f1.imshow(psi1_complete.transpose() / psi1.max(),
                      vmin=0,
                      vmax=1,
                      extent=[0, Lx, 0, Lx],
                      origin="lower")
            f1.set_xlabel("x (x1000 km)")

            f2 = pyplot.subplot(132)
            f2.imshow(psi2.transpose() / psi1.max(),
                      vmin=0,
                      vmax=1,
                      extent=[0, Lx / 2, 0, Lx],
                      origin="lower")
            f2.set_xlabel("x (x1000 km)")

            f3 = pyplot.subplot(133)
            f3.imshow(d.transpose() / psi1.max(),
                      vmin=0,
                      vmax=0.001,
                      extent=[0, Lx / 2, 0, Lx],
                      origin="lower")
            f3.set_xlabel("x (x1000 km)")

            pyplot.draw()
            pyplot.savefig("snapshots/half_domain_test-%6.6i.png" % i)

    raw_input()
Beispiel #10
0
def sample_run(Nx=128,
               Ny=128,
               Reynolds_number=50.,
               wind_sigma=1.,
               dtplot=24. | units.hour,
               nstep=10):

    qg = QGmodel(redirection="none")
    qg.initialize_code()

    L = 1.e6 | units.m

    qg.parameters.Lx = L
    qg.parameters.Ly = L
    qg.parameters.dx = qg.parameters.Lx / Nx
    qg.parameters.dy = qg.parameters.Ly / Ny
    qg.parameters.ocean_depth = 600 | units.m
    qg.parameters.tau = 0.15 | units.Pa
    qg.parameters.beta0 = 1.6e-11 | (units.m * units.s)**-1
    qg.parameters.dt = 900 | units.s

    rho0 = qg.parameters.rho
    beta0 = qg.parameters.beta0
    H = qg.parameters.ocean_depth
    L = qg.parameters.Lx
    T = qg.parameters.tau

    U_dijkstra = 1.6e-2 | units.m / units.s  # mentioned in paper
    U = (T / (beta0 * rho0 * H * L))  # actual derived from parameters
    print("actual, target U:", U.in_(units.m / units.s), U_dijkstra)

    A_H = U * L / Reynolds_number

    qg.parameters.A_H = A_H

    qg.parameters.wind_sigma = wind_sigma

    timescale = 1 / (beta0 * L)

    print("timescale:", timescale.in_(units.s))
    print()
    print(qg.parameters)
    raw_input()

    qg.commit_parameters()

    #  qg.grid.psi=(qg.grid.x/L ) | units.m**2/units.s

    qg.initialize_grid()

    pyplot.ion()
    f = pyplot.figure()
    pyplot.show()

    for i in range(nstep + 1):
        tend = i * dtplot

        qg.evolve_model(tend)
        psi = qg.grid.psi[:, :, 0]

        print(qg.model_time.in_(units.day),(psi.max()/L).in_(units.km/units.hour), \
          (psi.min()/L).in_(units.km/units.hour))

        f.clf()

        extent = [0, L.value_in(units.km), 0, L.value_in(units.km)]
        pyplot.imshow(psi.transpose() / max(psi.max(), -psi.min()),
                      vmin=-1,
                      vmax=1,
                      origin="lower",
                      extent=extent)
        pyplot.xlabel("km")
        pyplot.title(str(qg.model_time.in_(units.day)))

        pyplot.draw()
    raw_input()