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
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)
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)
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)
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)
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)
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
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())