Пример #1
0
def initCTCS():
        tic = time.time()
        
        ghosts = [1,1,1,1] # north, east, south, west
        dataShape = (args.ny + ghosts[0]+ghosts[2], 
                                 args.nx + ghosts[1]+ghosts[3])

        eta0 = np.fromfunction(lambda i, j: my_exp(i,j), dataShape, dtype=np.float32)
        u0 = np.zeros((dataShape[0]+0, dataShape[1]+1), dtype=np.float32);
        v0 = np.zeros((dataShape[0]+1, dataShape[1]+0), dtype=np.float32);
        h0 = np.ones(dataShape, dtype=np.float32) * waterHeight;

        toc = time.time()
        print("{:02.4f} s: ".format(toc-tic) + "Generated initial conditions")
                        
        # Initialize simulator
        tic = time.time()
        
        A = 0.1*dx
        kwargs = {'boundary_conditions': boundaryConditions, 'write_netcdf': True, 'comm': MPI.COMM_WORLD}
        if (args.block_width != None):
                kwargs['block_width'] = args.block_width
        if (args.block_height != None):
                kwargs['block_height'] = args.block_height
                
        sim = CTCS.CTCS(gpu_ctx, \
                                        h0, eta0, u0, v0, \
                                        args.nx, args.ny, \
                                        dx, dy, dt, \
                                        g, f, r, A, \
                                        **kwargs)
        toc = time.time()
        print("{:02.4f} s: ".format(toc-tic) + "Created CTCS simulator")
        
        return sim
Пример #2
0
    def test_bathymetry_central(self):
        self.setBoundaryConditions()
        makeBottomTopography(self.h0,
                             self.nx,
                             self.ny,
                             self.dx,
                             self.dy,
                             self.ghosts,
                             intersections=False)
        makeCentralBump(self.eta0, self.nx, self.ny, self.dx, self.dy,
                        self.ghosts)
        self.sim = CTCS.CTCS(self.gpu_ctx, \
                             self.h0, self.eta0, self.u0, self.v0, \
                             self.nx, self.ny, \
                             self.dx, self.dy, self.dt, \
                             self.g, self.f, self.r, self.A, boundary_conditions=self.boundaryConditions)

        t = self.sim.step(self.T)
        eta1, u1, v1 = self.sim.download()
        eta2, u2, v2 = loadResults("CTCS", "wallBC", "central", "bathymetry_")
        self.refEtaRange = self.etaRange
        self.refURange = self.uRange
        self.refVRange = self.vRange

        self.checkResults(eta1, u1, v1, eta2, u2, v2)
Пример #3
0
    def test_periodicEW_central(self):
        self.setBoundaryConditions(4)
        makeCentralBump(self.eta0, self.nx, self.ny, self.dx, self.dy,
                        self.ghosts)
        self.sim = CTCS.CTCS(self.gpu_ctx, \
                             self.h0, self.eta0, self.u0, self.v0, \
                             self.nx, self.ny, \
                             self.dx, self.dy, self.dt, \
                             self.g, self.f, self.r, self.A, boundary_conditions=self.boundaryConditions)

        t = self.sim.step(self.T)
        eta1, u1, v1 = self.sim.download()
        eta2, u2, v2 = loadResults("CTCS", "wallBC", "central")

        self.checkResults(eta1, u1, v1, eta2, u2, v2)
Пример #4
0
    def test_wall_upperCorner(self):
        self.setBoundaryConditions()
        makeUpperCornerBump(self.eta0, self.nx, self.ny, self.dx, self.dy,
                            self.ghosts)
        self.sim = CTCS.CTCS(self.gpu_ctx, \
                             self.h0, self.eta0, self.u0, self.v0, \
                             self.nx, self.ny, \
                             self.dx, self.dy, self.dt, \
                             self.g, self.f, self.r, self.A, boundary_conditions=self.boundaryConditions)

        t = self.sim.step(self.T)
        eta1, u1, v1 = self.sim.download()
        eta2, u2, v2 = loadResults("CTCS", "wallBC", "upperCorner")

        self.checkResults(eta1, u1, v1, eta2, u2, v2)
Пример #5
0
    def test_periodicEW_upperCorner(self):
        self.setBoundaryConditions(4)
        makeUpperCornerBump(self.eta0, self.nx, self.ny, self.dx, self.dy,
                            self.ghosts)
        self.sim = CTCS.CTCS(self.gpu_ctx, \
                             self.h0, self.eta0, self.u0, self.v0, \
                             self.nx, self.ny, \
                             self.dx, self.dy, self.dt, \
                             self.g, self.f, self.r, self.A, boundary_conditions=self.boundaryConditions)

        t = self.sim.step(self.T)
        eta1, u1, v1 = self.sim.download()
        eta2, u2, v2 = loadResults("CTCS", "periodicEW", "upperCorner")
        self.refEtaRange = self.etaRange
        self.refURange = self.uRange
        self.refVRange = self.vRange

        self.checkResults(eta1, u1, v1, eta2, u2, v2)
Пример #6
0
    def test_coriolis_central(self):
        self.setBoundaryConditions()
        makeCentralBump(self.eta0, self.nx, self.ny, self.dx, self.dy,
                        self.ghosts)
        self.f = 0.01
        self.sim = CTCS.CTCS(self.gpu_ctx, \
                             self.h0, self.eta0, self.u0, self.v0, \
                             self.nx, self.ny, \
                             self.dx, self.dy, self.dt, \
                             self.g, self.f, self.r, self.A, boundary_conditions=self.boundaryConditions)

        t = self.sim.step(self.T)
        eta1, u1, v1 = self.sim.download()
        eta2, u2, v2 = loadResults("CTCS", "coriolis", "central")
        self.refEtaRange = self.etaRange
        self.refURange = self.uRange
        self.refVRange = self.vRange

        self.checkResults(eta1, u1, v1, eta2, u2, v2)
Пример #7
0
def initCTCS():
    tic = time.time()

    ghosts = [1, 1, 1, 1]  # north, east, south, west
    dataShape = (args.ny + ghosts[0] + ghosts[2],
                 args.nx + ghosts[1] + ghosts[3])

    eta0 = np.zeros(dataShape, dtype=np.float32, order='C')
    initEtaFD(eta0, ghosts)

    u0 = np.zeros((dataShape[0] + 0, dataShape[1] + 1), dtype=np.float32)
    v0 = np.zeros((dataShape[0] + 1, dataShape[1] + 0), dtype=np.float32)
    h0 = np.ones(dataShape, dtype=np.float32) * waterHeight

    dt = courant_number * dx / (2 * np.sqrt(2) * gravity_wave_speed)
    toc = time.time()
    print("{:02.4f} s: ".format(toc - tic) + "Generated initial conditions")

    # Initialize simulator
    tic = time.time()

    A = 1
    kwargs = {'boundary_conditions': boundaryConditions}
    if (args.block_width != None):
        kwargs['block_width'] = args.block_width
    if (args.block_height != None):
        kwargs['block_height'] = args.block_height

    sim = CTCS.CTCS(gpu_ctx, \
                                    h0, eta0, u0, v0, \
                                    args.nx, args.ny, \
                                    dx, dy, dt, \
                                    g, f, r, A, \
                                    **kwargs)
    toc = time.time()
    print("{:02.4f} s: ".format(toc - tic) + "Created CTCS simulator")

    print_memory_req(sim)

    return sim
Пример #8
0
    def test_periodic_boundary_conditions(self):
        self.setBoundaryConditions(2)
        self.eta0 = np.array(range(self.eta0.size)).reshape(self.eta0.shape)
        self.u0 = np.array(range(self.u0.size)).reshape(self.u0.shape)
        self.v0 = np.array(range(self.v0.size)).reshape(self.v0.shape)
        self.sim = CTCS.CTCS(self.gpu_ctx, \
                             self.h0, self.eta0, self.u0, self.v0, \
                             self.nx, self.ny, \
                             self.dx, self.dy, self.dt, \
                             self.g, self.f, self.r, self.A, boundary_conditions=self.boundaryConditions)
        self.sim._call_all_boundary_conditions()

        eta, u, v = self.sim.download(interior_domain_only=False)

        # Check periodic bc east-west
        self.assertListEqual(eta[:, 0].tolist(), eta[:, self.nx].tolist())
        self.assertListEqual(eta[:, 1].tolist(), eta[:, self.nx + 1].tolist())

        self.assertListEqual(u[:, 0].tolist(), u[:, self.nx].tolist())
        self.assertListEqual(u[:, 1].tolist(), u[:, self.nx + 1].tolist())
        self.assertListEqual(u[:, 2].tolist(), u[:, self.nx + 2].tolist())

        self.assertListEqual(v[:, 0].tolist(), v[:, self.nx].tolist())
        self.assertListEqual(v[:, 1].tolist(), v[:, self.nx + 1].tolist())

        # Check periodic bc north-south
        self.assertListEqual(eta[0, :].tolist(), eta[self.ny, :].tolist())
        self.assertListEqual(eta[1, :].tolist(), eta[self.ny + 1, :].tolist())

        self.assertListEqual(u[0, :].tolist(), u[self.ny, :].tolist())
        self.assertListEqual(u[1, :].tolist(), u[self.ny + 1, :].tolist())

        self.assertListEqual(v[0, :].tolist(), v[self.ny, :].tolist())
        self.assertListEqual(v[1, :].tolist(), v[self.ny + 1, :].tolist())
        self.assertListEqual(v[2, :].tolist(), v[self.ny + 2, :].tolist())

        # Check that we don't take it too far:
        for j in range(self.ny + 2):
            self.assertNotEqual(eta[j, 2].tolist(), eta[j, self.nx].tolist())
            self.assertNotEqual(eta[j, 2].tolist(), eta[j,
                                                        self.nx + 1].tolist())

            self.assertNotEqual(eta[j, 1].tolist(), eta[j,
                                                        self.nx - 1].tolist())
            self.assertNotEqual(eta[j, 0].tolist(), eta[j,
                                                        self.nx - 1].tolist())

            self.assertNotEqual(u[j, 3].tolist(), u[j, self.nx].tolist())
            self.assertNotEqual(u[j, 3].tolist(), u[j, self.nx + 1].tolist())
            self.assertNotEqual(u[:, 3].tolist(), u[:, self.nx + 2].tolist())

            self.assertNotEqual(u[j, 2].tolist(), u[j, self.nx - 1].tolist())
            self.assertNotEqual(u[j, 1].tolist(), u[j, self.nx - 1].tolist())
            self.assertNotEqual(u[j, 0].tolist(), u[j, self.nx - 1].tolist())

        for j in range(self.ny + 3):
            self.assertNotEqual(v[j, 2].tolist(), v[j, self.nx].tolist())
            self.assertNotEqual(v[j, 2].tolist(), v[j, self.nx + 1].tolist())

            self.assertNotEqual(v[j, 1].tolist(), v[j, self.nx - 1].tolist())
            self.assertNotEqual(v[j, 0].tolist(), v[j, self.nx - 1].tolist())

        for i in range(self.nx + 2):
            self.assertNotEqual(eta[2, i].tolist(), eta[self.ny, i].tolist())
            self.assertNotEqual(eta[2, i].tolist(), eta[self.ny + 1,
                                                        i].tolist())

            self.assertNotEqual(eta[1, i].tolist(), eta[self.ny - 1,
                                                        i].tolist())
            self.assertNotEqual(eta[0, i].tolist(), eta[self.ny - 1,
                                                        i].tolist())

            self.assertNotEqual(v[3, i].tolist(), v[self.ny, i].tolist())
            self.assertNotEqual(v[3, i].tolist(), v[self.ny + 1, i].tolist())
            self.assertNotEqual(v[3, i].tolist(), v[self.ny + 2, i].tolist())

            self.assertNotEqual(v[2, i].tolist(), v[self.ny - 1, i].tolist())
            self.assertNotEqual(v[1, i].tolist(), v[self.ny - 1, i].tolist())
            self.assertNotEqual(v[0, i].tolist(), v[self.ny - 1, i].tolist())

        for i in range(self.nx + 3):
            self.assertNotEqual(u[2, i].tolist(), u[self.ny, i].tolist())
            self.assertNotEqual(u[2, i].tolist(), u[self.ny + 1, i].tolist())

            self.assertNotEqual(u[1, i].tolist(), u[self.ny - 1, i].tolist())
            self.assertNotEqual(u[0, i].tolist(), u[self.ny - 1, i].tolist())