def __init__(self, dim, dt, dx, L, D_rho, mu, walls): self.dim = dim self.dt = dt self.dx = dx self.L = L self.D_rho = D_rho self.mu = mu self.walls = walls self.i = 0 self.t = 0.0 nx = int(round((self.L / self.dx))) self.dx = L / nx if self.dim == 1: self.mesh = PeriodicGrid1D(dx=np.array([self.dx]), nx=nx) elif self.dim == 2: self.mesh = PeriodicGrid2D(dx=np.array([self.dx]), dy=np.array([self.dx]), nx=nx, ny=nx) self.L_perturb = self.L eps = 1e-2 x = self.get_x() if self.dim == 1: perturb = eps * np.sin(2.0 * np.pi * x / self.L_perturb) else: X, Y = np.meshgrid(x, x) perturb = eps * np.sin(2.0 * np.pi * X * Y / self.L_perturb ** 2) rho_init = 1.0 + perturb c_init = 1.0 + perturb if self.walls is not None: rho_init *= np.logical_not(self.walls.a) c_init *= np.logical_not(self.walls.a) mask = make_mask(self.mesh, self.walls) self.D_rho_var = fipy.FaceVariable(mesh=self.mesh, value=self.D_rho) self.D_rho_var.setValue(0.0, where=mask) self.D_c_var = fipy.FaceVariable(mesh=self.mesh, value=1.0) self.D_c_var.setValue(0.0, where=mask) else: self.D_rho_var = self.D_rho self.D_c_var = 1.0 self.rho = fipy.CellVariable(mesh=self.mesh, value=rho_init.T.ravel()) self.c = fipy.CellVariable(mesh=self.mesh, value=c_init.T.ravel()) eq_rho = (TransientTerm(var=self.rho) == DiffusionTerm(coeff=self.D_rho_var, var=self.rho) - ConvectionTerm(coeff=mu * self.c.grad, var=self.rho)) eq_c = (TransientTerm(var=self.c) == DiffusionTerm(coeff=self.D_c_var, var=self.c) + self.rho - ImplicitSourceTerm(coeff=1.0, var=self.c)) self.eq = eq_rho & eq_c
D = 1.0 n = 1000 nx = int(round(L / dx)) mesh = PeriodicGrid2D(dx=np.array([dx]), dy=np.array([dx]), nx=nx, ny=nx) phi = fipy.CellVariable(mesh=mesh, value=0.0) maze = bannock.walls.Maze(L, dim=2, dx=dx, d=dx, seed=None) maze_ravel = maze.a.T.ravel() phi0 = np.random.uniform(0.0, 1.0, size=maze_ravel.shape) phi0 *= np.logical_not(maze_ravel) print(phi0) phi.setValue(phi0) mask = make_mask(mesh, maze) mask_D = fipy.FaceVariable(mesh=mesh, value=D) mask_D.setValue(0.0, where=mask) eq = fipy.TransientTerm() == fipy.DiffusionTerm(coeff=mask_D) viewer = fipy.Matplotlib2DViewer(vars=phi, colorbar=None) viewer.plotMesh() for step in range(n): eq.solve(var=phi, dt=dt) viewer.plot() print(step) raw_input()